[med-svn] [blasr] 01/02: Imported Upstream version 0~20150724+git3ca7fe8

Afif Elghraoui afif-guest at moszumanska.debian.org
Mon Jul 27 09:33:42 UTC 2015


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

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

commit e00b029a9dec71c93f16861ad5cf18a5acef0b2b
Author: Afif Elghraoui <afif at ghraoui.name>
Date:   Sun Jul 26 22:14:55 2015 -0700

    Imported Upstream version 0~20150724+git3ca7fe8
---
 .gitmodules                                        |     3 +
 Blasr.cpp                                          |  4464 ++
 GNUmakefile                                        |    85 +
 LICENSES.txt                                       |    32 +
 MANUAL.md                                          |    84 +
 Makefile                                           |    59 +
 MappingIPC.h                                       |   105 +
 MappingParameters.h                                |   681 +
 MappingSemaphores.h                                |    45 +
 README.md                                          |    52 +
 RegisterBlasrOptions.h                             |   529 +
 RegisterFilterOptions.h                            |    53 +
 blasr_git_common.mk                                |    15 +
 blasr_gitp4.mk                                     |    24 +
 common.mk                                          |   139 +
 configure.py                                       |   204 +
 ctest/affineAlign.t                                |    17 +
 ctest/aggressiveIntervalCut.t                      |    12 +
 ctest/alignScore.t                                 |     9 +
 ctest/bamIn.t                                      |    52 +
 ctest/bamOut.t                                     |    22 +
 ctest/bug25328.t                                   |    13 +
 ctest/bug25741.t                                   |     9 +
 ctest/bug25766.t                                   |    13 +
 ctest/ccsH5.t                                      |    11 +
 ctest/concordant.t                                 |    32 +
 ctest/ecoli.t                                      |    20 +
 ctest/fastMaxInterval.t                            |    12 +
 ctest/filtercriteria.t                             |    30 +
 ctest/fofn.t                                       |    18 +
 ctest/hitpolicy.t                                  |    86 +
 ctest/holeNumbers.t                                |    12 +
 ctest/m0-5.t                                       |    33 +
 ctest/multipart.t                                  |    13 +
 ctest/noSplitSubreads.t                            |    18 +
 ctest/open_fail.t                                  |     8 +
 ctest/samNM.t                                      |    13 +
 ctest/setup.sh                                     |    29 +
 ctest/useccsallBestN1.t                            |    11 +
 ctest/useccsallLargeGenome.t                       |    13 +
 ctest/verbose.t                                    |     9 +
 extrautils/BasH5Simulator.cpp                      |   524 +
 extrautils/BuildSequenceDB.cpp                     |    52 +
 extrautils/BwtToSuffixArray.cpp                    |    33 +
 extrautils/CCSH5ToBam.cpp                          |   135 +
 extrautils/Evolve.cpp                              |   169 +
 extrautils/ExciseRepeats.cpp                       |    69 +
 extrautils/GNUmakefile                             |    45 +
 extrautils/Makefile                                |    78 +
 extrautils/PrintTupleCountTable.cpp                |    65 +
 extrautils/SALS.cpp                                |    40 +
 extrautils/SAModify.cpp                            |    77 +
 extrautils/SWMatcher.cpp                           |   180 +
 extrautils/SimpleShredder.cpp                      |   159 +
 extrautils/StoreQualityByContextFromCmpH5.cpp      |   283 +
 extrautils/SuffixArrayToBWT.cpp                    |    48 +
 extrautils/ctest/alchemy.t                         |    20 +
 extrautils/ctest/bwt2sa.t                          |    21 +
 extrautils/ctest/ccsh5tobam.t                      |    10 +
 extrautils/ctest/cmpH5StoreQualityByContext.t      |    16 +
 extrautils/ctest/printTupleCountTable.t            |    20 +
 extrautils/ctest/sa2bwt.t                          |    19 +
 extrautils/ctest/sals.t                            |    18 +
 extrautils/ctest/samodify.t                        |    19 +
 extrautils/ctest/setup.sh                          |    15 +
 extrautils/ctest/swmatcher.t                       |    20 +
 extrautils/p4.mk                                   |    79 +
 libcpp.makefile                                    |     9 +
 libcpp/.gitignore                                  |     7 +
 libcpp/.travis.yml                                 |    22 +
 libcpp/README.md                                   |    47 +
 libcpp/alignment/MappingMetrics.cpp                |   299 +
 libcpp/alignment/MappingMetrics.hpp                |   133 +
 .../algorithms/alignment/AffineGuidedAlign.hpp     |   589 +
 .../algorithms/alignment/AffineKBandAlign.hpp      |   406 +
 .../algorithms/alignment/AlignmentFormats.hpp      |     6 +
 .../algorithms/alignment/AlignmentUtils.cpp        |    43 +
 .../algorithms/alignment/AlignmentUtils.hpp        |   139 +
 .../algorithms/alignment/AlignmentUtilsImpl.hpp    |   548 +
 .../algorithms/alignment/BaseScoreFunction.cpp     |    11 +
 .../algorithms/alignment/BaseScoreFunction.hpp     |    17 +
 .../alignment/DistanceMatrixScoreFunction.hpp      |    40 +
 .../alignment/DistanceMatrixScoreFunctionImpl.hpp  |    96 +
 .../alignment/algorithms/alignment/ExtendAlign.cpp |    79 +
 .../alignment/algorithms/alignment/ExtendAlign.hpp |   416 +
 .../alignment/algorithms/alignment/FullQVAlign.hpp |   132 +
 .../alignment/algorithms/alignment/GraphPaper.hpp  |    31 +
 .../algorithms/alignment/GraphPaperImpl.hpp        |   175 +
 .../alignment/algorithms/alignment/GuidedAlign.cpp |   226 +
 .../alignment/algorithms/alignment/GuidedAlign.hpp |   600 +
 .../algorithms/alignment/IDSScoreFunction.cpp      |   158 +
 .../algorithms/alignment/IDSScoreFunction.hpp      |   109 +
 .../alignment/algorithms/alignment/KBandAlign.cpp  |    30 +
 .../alignment/algorithms/alignment/KBandAlign.hpp  |   381 +
 .../algorithms/alignment/OneGapAlignment.hpp       |   374 +
 .../alignment/QualityValueScoreFunction.cpp        |    90 +
 .../alignment/QualityValueScoreFunction.hpp        |    56 +
 libcpp/alignment/algorithms/alignment/SDPAlign.hpp |    64 +
 .../algorithms/alignment/SDPAlignImpl.hpp          |   614 +
 libcpp/alignment/algorithms/alignment/SWAlign.hpp  |    17 +
 .../alignment/algorithms/alignment/SWAlignImpl.hpp |   389 +
 .../algorithms/alignment/ScoreMatrices.cpp         |    58 +
 .../algorithms/alignment/ScoreMatrices.hpp         |    18 +
 .../algorithms/alignment/StringToScoreMatrix.cpp   |    26 +
 .../algorithms/alignment/StringToScoreMatrix.hpp   |     9 +
 .../algorithms/alignment/sdp/FragmentSort.hpp      |    19 +
 .../algorithms/alignment/sdp/FragmentSortImpl.hpp  |    16 +
 .../sdp/NonoverlappingSparseDynamicProgramming.h   |   193 +
 .../algorithms/alignment/sdp/SDPColumn.hpp         |    23 +
 .../algorithms/alignment/sdp/SDPFragment.cpp       |    27 +
 .../algorithms/alignment/sdp/SDPFragment.hpp       |   132 +
 .../alignment/algorithms/alignment/sdp/SDPSet.hpp  |    52 +
 .../algorithms/alignment/sdp/SDPSetImpl.hpp        |   113 +
 .../alignment/sdp/SparseDynamicProgramming.cpp     |    18 +
 .../alignment/sdp/SparseDynamicProgramming.hpp     |    37 +
 .../alignment/sdp/SparseDynamicProgrammingImpl.hpp |   266 +
 .../alignment/sdp/VariableLengthSDPFragment.h      |    51 +
 .../alignment/algorithms/anchoring/BWTSearch.cpp   |    85 +
 .../alignment/algorithms/anchoring/BWTSearch.hpp   |    35 +
 .../algorithms/anchoring/BWTSearchImpl.hpp         |    14 +
 .../algorithms/anchoring/BasicEndpoint.hpp         |    50 +
 .../algorithms/anchoring/BasicEndpointImpl.hpp     |    78 +
 .../algorithms/anchoring/ClusterProbability.cpp    |    45 +
 .../algorithms/anchoring/ClusterProbability.hpp    |    13 +
 .../alignment/algorithms/anchoring/Coordinate.cpp  |    12 +
 .../alignment/algorithms/anchoring/Coordinate.hpp  |    45 +
 .../algorithms/anchoring/FindMaxInterval.cpp       |    23 +
 .../algorithms/anchoring/FindMaxInterval.hpp       |   175 +
 .../algorithms/anchoring/FindMaxIntervalImpl.hpp   |   945 +
 .../alignment/algorithms/anchoring/GlobalChain.hpp |    37 +
 .../algorithms/anchoring/GlobalChainImpl.hpp       |   225 +
 .../alignment/algorithms/anchoring/LISPValue.hpp   |    24 +
 .../algorithms/anchoring/LISPValueImpl.hpp         |   165 +
 .../algorithms/anchoring/LISPValueWeightor.hpp     |    52 +
 .../algorithms/anchoring/LISPValueWeightorImpl.hpp |   112 +
 .../algorithms/anchoring/LISQValueWeightor.hpp     |    35 +
 .../algorithms/anchoring/LISSizeWeightor.hpp       |    14 +
 .../algorithms/anchoring/LISSizeWeightorImpl.hpp   |    13 +
 .../anchoring/LongestIncreasingSubsequence.hpp     |    31 +
 .../anchoring/LongestIncreasingSubsequenceImpl.hpp |   135 +
 .../algorithms/anchoring/MapBySuffixArray.hpp      |    44 +
 .../algorithms/anchoring/MapBySuffixArrayImpl.hpp  |   315 +
 .../algorithms/anchoring/PrioritySearchTree.hpp    |    69 +
 .../anchoring/PrioritySearchTreeImpl.hpp           |   296 +
 .../algorithms/anchoring/ScoreAnchors.hpp          |    46 +
 .../algorithms/anchoring/ScoreAnchorsImpl.hpp      |   179 +
 .../algorithms/compare/CompareStrings.hpp          |    81 +
 .../algorithms/sorting/DifferenceCovers.cpp        |    15 +
 .../algorithms/sorting/DifferenceCovers.hpp        |    16 +
 libcpp/alignment/algorithms/sorting/Karkkainen.hpp |   134 +
 .../algorithms/sorting/LightweightSuffixArray.cpp  |   405 +
 .../algorithms/sorting/LightweightSuffixArray.hpp  |   103 +
 .../algorithms/sorting/MultikeyQuicksort.cpp       |   197 +
 .../algorithms/sorting/MultikeyQuicksort.hpp       |    48 +
 libcpp/alignment/algorithms/sorting/qsufsort.cpp   |   302 +
 libcpp/alignment/algorithms/sorting/qsufsort.hpp   |   376 +
 libcpp/alignment/anchoring/AnchorParameters.hpp    |    35 +
 libcpp/alignment/build.mk                          |     1 +
 libcpp/alignment/bwt/BWT.hpp                       |   316 +
 libcpp/alignment/bwt/Occ.hpp                       |   217 +
 libcpp/alignment/bwt/PackedHash.hpp                |   350 +
 libcpp/alignment/bwt/Pos.hpp                       |    47 +
 .../datastructures/alignment/AlignedPair.h         |    19 +
 .../datastructures/alignment/Alignment.cpp         |   512 +
 .../datastructures/alignment/Alignment.hpp         |   184 +
 .../alignment/AlignmentCandidate.cpp               |    26 +
 .../alignment/AlignmentCandidate.hpp               |   370 +
 .../datastructures/alignment/AlignmentContext.cpp  |    35 +
 .../datastructures/alignment/AlignmentContext.hpp  |    32 +
 .../datastructures/alignment/AlignmentGapList.h    |    26 +
 .../datastructures/alignment/AlignmentMap.cpp      |    22 +
 .../datastructures/alignment/AlignmentMap.hpp      |    20 +
 .../datastructures/alignment/AlignmentStats.cpp    |    29 +
 .../datastructures/alignment/AlignmentStats.hpp    |    25 +
 .../datastructures/alignment/ByteAlignment.h       |   347 +
 .../alignment/datastructures/alignment/CmpFile.cpp |     6 +
 .../alignment/datastructures/alignment/CmpFile.hpp |    33 +
 .../alignment/CmpIndexedStringTable.h              |    67 +
 .../datastructures/alignment/CmpReadGroupTable.h   |    22 +
 .../datastructures/alignment/CmpRefSeqTable.h      |    22 +
 .../datastructures/alignment/FilterCriteria.cpp    |   371 +
 .../datastructures/alignment/FilterCriteria.hpp    |   165 +
 libcpp/alignment/datastructures/alignment/Path.h   |    23 +
 .../alignment/SAMToAlignmentCandidateAdapter.cpp   |   461 +
 .../alignment/SAMToAlignmentCandidateAdapter.hpp   |    79 +
 .../alignmentset/AlignmentSetToCmpH5Adapter.hpp    |    84 +
 .../AlignmentSetToCmpH5AdapterImpl.hpp             |   256 +
 .../alignmentset/SAMQVConversion.cpp               |    27 +
 .../alignmentset/SAMQVConversion.hpp               |    15 +
 .../alignmentset/SAMSupplementalQVList.cpp         |    71 +
 .../alignmentset/SAMSupplementalQVList.hpp         |    27 +
 .../datastructures/anchoring/AnchorParameters.cpp  |    44 +
 .../datastructures/anchoring/AnchorParameters.hpp  |    35 +
 .../datastructures/anchoring/ClusterList.cpp       |    75 +
 .../datastructures/anchoring/ClusterList.hpp       |    25 +
 .../datastructures/anchoring/MatchPos.cpp          |    59 +
 .../datastructures/anchoring/MatchPos.hpp          |   192 +
 .../datastructures/anchoring/WeightedInterval.cpp  |   181 +
 .../datastructures/anchoring/WeightedInterval.hpp  |    85 +
 libcpp/alignment/files/BaseSequenceIO.cpp          |    77 +
 libcpp/alignment/files/BaseSequenceIO.hpp          |    26 +
 libcpp/alignment/files/CCSIterator.cpp             |    28 +
 libcpp/alignment/files/CCSIterator.hpp             |    21 +
 libcpp/alignment/files/FragmentCCSIterator.cpp     |   109 +
 libcpp/alignment/files/FragmentCCSIterator.hpp     |    23 +
 libcpp/alignment/files/ReaderAgglomerate.cpp       |   505 +
 libcpp/alignment/files/ReaderAgglomerate.hpp       |   136 +
 libcpp/alignment/files/ReaderAgglomerateImpl.hpp   |    44 +
 libcpp/alignment/format/BAMPrinter.hpp             |    29 +
 libcpp/alignment/format/BAMPrinterImpl.hpp         |   168 +
 .../alignment/format/CompareSequencesPrinter.cpp   |    10 +
 .../alignment/format/CompareSequencesPrinter.hpp   |    21 +
 .../format/CompareSequencesPrinterImpl.hpp         |    77 +
 libcpp/alignment/format/IntervalPrinter.cpp        |    70 +
 libcpp/alignment/format/IntervalPrinter.hpp        |    21 +
 libcpp/alignment/format/SAMHeaderPrinter.cpp       |   432 +
 libcpp/alignment/format/SAMHeaderPrinter.hpp       |   311 +
 libcpp/alignment/format/SAMPrinter.cpp             |   188 +
 libcpp/alignment/format/SAMPrinter.hpp             |    93 +
 libcpp/alignment/format/SAMPrinterImpl.hpp         |   304 +
 libcpp/alignment/format/StickAlignmentPrinter.hpp  |   123 +
 libcpp/alignment/format/SummaryPrinter.cpp         |    26 +
 libcpp/alignment/format/SummaryPrinter.hpp         |    14 +
 libcpp/alignment/format/VulgarPrinter.hpp          |    53 +
 libcpp/alignment/format/XMLPrinter.hpp             |    84 +
 libcpp/alignment/ipc/SharedMemoryAllocator.hpp     |    33 +
 libcpp/alignment/makefile                          |    52 +
 libcpp/alignment/old.Makefile                      |   113 +
 libcpp/alignment/qvs/QualityValueProfile.cpp       |    41 +
 libcpp/alignment/qvs/QualityValueProfile.hpp       |    23 +
 libcpp/alignment/simulator/CDFMap.hpp              |    44 +
 libcpp/alignment/simulator/ContextOutputList.hpp   |   100 +
 libcpp/alignment/simulator/ContextSample.cpp       |    53 +
 libcpp/alignment/simulator/ContextSample.hpp       |    30 +
 libcpp/alignment/simulator/ContextSet.cpp          |    35 +
 libcpp/alignment/simulator/ContextSet.hpp          |    19 +
 libcpp/alignment/simulator/LengthHistogram.cpp     |    58 +
 libcpp/alignment/simulator/LengthHistogram.hpp     |    24 +
 libcpp/alignment/simulator/OutputList.hpp          |    57 +
 libcpp/alignment/simulator/OutputSample.hpp        |    59 +
 libcpp/alignment/simulator/OutputSampleList.hpp    |    33 +
 libcpp/alignment/simulator/OutputSampleListSet.hpp |   123 +
 libcpp/alignment/simulator/QualitySample.cpp       |    77 +
 libcpp/alignment/simulator/QualitySample.hpp       |    28 +
 .../statistics/AnchorDistributionTable.hpp         | 43518 +++++++++++++++++++
 .../statistics/LookupAnchorDistribution.cpp        |    58 +
 .../statistics/LookupAnchorDistribution.hpp        |    10 +
 libcpp/alignment/statistics/StatUtils.cpp          |    45 +
 libcpp/alignment/statistics/StatUtils.hpp          |   165 +
 libcpp/alignment/statistics/StatUtilsImpl.hpp      |    57 +
 .../alignment/statistics/VarianceAccumulator.hpp   |    28 +
 .../statistics/VarianceAccumulatorImpl.hpp         |    60 +
 libcpp/alignment/statistics/cdfs.cpp               |    53 +
 libcpp/alignment/statistics/cdfs.hpp               |   418 +
 libcpp/alignment/statistics/pdfs.cpp               |    36 +
 libcpp/alignment/statistics/pdfs.hpp               |    18 +
 libcpp/alignment/suffixarray/LCPTable.hpp          |   182 +
 libcpp/alignment/suffixarray/SharedSuffixArray.hpp |    83 +
 libcpp/alignment/suffixarray/SuffixArray.hpp       |  1197 +
 libcpp/alignment/suffixarray/SuffixArrayTypes.hpp  |    17 +
 libcpp/alignment/suffixarray/ssort.hpp             |   449 +
 libcpp/alignment/tuples/BaseTuple.cpp              |    53 +
 libcpp/alignment/tuples/BaseTuple.hpp              |    27 +
 libcpp/alignment/tuples/CompressedDNATuple.hpp     |    63 +
 libcpp/alignment/tuples/CountedTuple.h             |    16 +
 libcpp/alignment/tuples/DNATuple.cpp               |    94 +
 libcpp/alignment/tuples/DNATuple.hpp               |   103 +
 libcpp/alignment/tuples/DNATupleImpl.hpp           |   200 +
 libcpp/alignment/tuples/DNATupleList.h             |    53 +
 libcpp/alignment/tuples/HashedTupleList.hpp        |    61 +
 libcpp/alignment/tuples/HashedTupleListImpl.hpp    |   144 +
 libcpp/alignment/tuples/TupleCountTable.hpp        |    33 +
 libcpp/alignment/tuples/TupleCountTableImpl.hpp    |   101 +
 libcpp/alignment/tuples/TupleList.hpp              |    64 +
 libcpp/alignment/tuples/TupleListImpl.hpp          |   134 +
 libcpp/alignment/tuples/TupleMask.h                |    13 +
 libcpp/alignment/tuples/TupleMatching.hpp          |    25 +
 libcpp/alignment/tuples/TupleMatchingImpl.hpp      |   106 +
 libcpp/alignment/tuples/TupleMetrics.cpp           |    16 +
 libcpp/alignment/tuples/TupleMetrics.hpp           |    19 +
 libcpp/alignment/tuples/TupleOperations.h          |     7 +
 libcpp/alignment/tuples/TupleTranslations.h        |     4 +
 libcpp/alignment/tuples/tuple.h                    |    82 +
 libcpp/alignment/utils/FileOfFileNames.cpp         |   102 +
 libcpp/alignment/utils/FileOfFileNames.hpp         |    27 +
 libcpp/alignment/utils/FileUtils.cpp               |    61 +
 libcpp/alignment/utils/FileUtils.hpp               |    27 +
 libcpp/alignment/utils/LogUtils.cpp                |    55 +
 libcpp/alignment/utils/LogUtils.hpp                |    15 +
 libcpp/alignment/utils/PhredUtils.cpp              |    13 +
 libcpp/alignment/utils/PhredUtils.hpp              |     8 +
 libcpp/alignment/utils/RangeUtils.cpp              |   107 +
 libcpp/alignment/utils/RangeUtils.hpp              |    56 +
 libcpp/alignment/utils/RegionUtils.cpp             |   302 +
 libcpp/alignment/utils/RegionUtils.hpp             |   132 +
 libcpp/alignment/utils/RegionUtilsImpl.hpp         |   215 +
 libcpp/alignment/utils/SimpleXMLUtils.hpp          |    99 +
 libcpp/alignment/utils/TimeUtils.cpp               |    20 +
 libcpp/alignment/utils/TimeUtils.hpp               |     7 +
 libcpp/configure.py                                |   268 +
 libcpp/hdf/BufferedHDF2DArray.cpp                  |    79 +
 libcpp/hdf/BufferedHDF2DArray.hpp                  |   158 +
 libcpp/hdf/BufferedHDF2DArrayImpl.hpp              |   379 +
 libcpp/hdf/BufferedHDFArray.cpp                    |    92 +
 libcpp/hdf/BufferedHDFArray.hpp                    |   207 +
 libcpp/hdf/BufferedHDFArrayImpl.hpp                |   435 +
 libcpp/hdf/DatasetCollection.cpp                   |    61 +
 libcpp/hdf/DatasetCollection.hpp                   |    41 +
 libcpp/hdf/DatasetCollectionImpl.hpp               |    29 +
 libcpp/hdf/HDF2DArray.hpp                          |    25 +
 libcpp/hdf/HDFAlnGroup.hpp                         |    50 +
 libcpp/hdf/HDFAlnGroupGroup.cpp                    |    52 +
 libcpp/hdf/HDFAlnGroupGroup.hpp                    |    27 +
 libcpp/hdf/HDFAlnInfoGroup.cpp                     |   102 +
 libcpp/hdf/HDFAlnInfoGroup.hpp                     |    46 +
 libcpp/hdf/HDFArray.hpp                            |    85 +
 libcpp/hdf/HDFAtom.cpp                             |   159 +
 libcpp/hdf/HDFAtom.hpp                             |   176 +
 libcpp/hdf/HDFAttributable.cpp                     |    41 +
 libcpp/hdf/HDFAttributable.hpp                     |    23 +
 libcpp/hdf/HDFBasReader.cpp                        |    46 +
 libcpp/hdf/HDFBasReader.hpp                        |  1178 +
 libcpp/hdf/HDFBasWriter.hpp                        |   390 +
 libcpp/hdf/HDFCCSReader.hpp                        |   257 +
 libcpp/hdf/HDFCmpData.hpp                          |    36 +
 libcpp/hdf/HDFCmpExperimentGroup.cpp               |   193 +
 libcpp/hdf/HDFCmpExperimentGroup.hpp               |    70 +
 libcpp/hdf/HDFCmpFile.hpp                          |   844 +
 libcpp/hdf/HDFCmpReader.hpp                        |   663 +
 libcpp/hdf/HDFCmpRefAlignmentGroup.hpp             |   102 +
 libcpp/hdf/HDFCmpRootGroup.hpp                     |    66 +
 libcpp/hdf/HDFCmpSupportedFields.cpp               |    25 +
 libcpp/hdf/HDFCmpSupportedFields.hpp               |    13 +
 libcpp/hdf/HDFCommonFG.hpp                         |    13 +
 libcpp/hdf/HDFConfig.hpp                           |     7 +
 libcpp/hdf/HDFData.cpp                             |    74 +
 libcpp/hdf/HDFData.hpp                             |    52 +
 libcpp/hdf/HDFFile.cpp                             |    53 +
 libcpp/hdf/HDFFile.hpp                             |    32 +
 libcpp/hdf/HDFFileLogGroup.hpp                     |    55 +
 libcpp/hdf/HDFGroup.cpp                            |    58 +
 libcpp/hdf/HDFGroup.hpp                            |    36 +
 libcpp/hdf/HDFMovieInfoGroup.hpp                   |    79 +
 libcpp/hdf/HDFNewBasReader.cpp                     |    72 +
 libcpp/hdf/HDFNewBasReader.hpp                     |    39 +
 libcpp/hdf/HDFPlsReader.hpp                        |   542 +
 libcpp/hdf/HDFPlsWriter.hpp                        |   195 +
 libcpp/hdf/HDFPulseDataFile.cpp                    |   151 +
 libcpp/hdf/HDFPulseDataFile.hpp                    |    67 +
 libcpp/hdf/HDFRefGroupGroup.hpp                    |    65 +
 libcpp/hdf/HDFRefInfoGroup.hpp                     |    84 +
 libcpp/hdf/HDFRegionTableReader.cpp                |   149 +
 libcpp/hdf/HDFRegionTableReader.hpp                |    47 +
 libcpp/hdf/HDFRegionTableWriter.hpp                |   140 +
 libcpp/hdf/HDFSMRTSequenceReader.hpp               |    71 +
 libcpp/hdf/HDFScanDataReader.cpp                   |   262 +
 libcpp/hdf/HDFScanDataReader.hpp                   |   101 +
 libcpp/hdf/HDFScanDataWriter.cpp                   |   164 +
 libcpp/hdf/HDFScanDataWriter.hpp                   |    71 +
 libcpp/hdf/HDFSentinalFile.hpp                     |    21 +
 libcpp/hdf/HDFUtils.cpp                            |    82 +
 libcpp/hdf/HDFUtils.hpp                            |    44 +
 libcpp/hdf/HDFWriteBuffer.hpp                      |    52 +
 libcpp/hdf/HDFZMWReader.cpp                        |   136 +
 libcpp/hdf/HDFZMWReader.hpp                        |    45 +
 libcpp/hdf/build.mk                                |     1 +
 libcpp/hdf/makefile                                |    28 +
 libcpp/hdf/old.Makefile                            |    94 +
 libcpp/makefile                                    |    32 +
 libcpp/old.Makefile                                |    28 +
 libcpp/pbdata/.gitignore                           |     2 +
 libcpp/pbdata/CCSSequence.cpp                      |    35 +
 libcpp/pbdata/CCSSequence.hpp                      |    43 +
 libcpp/pbdata/ChangeListID.cpp                     |    64 +
 libcpp/pbdata/ChangeListID.hpp                     |    38 +
 libcpp/pbdata/CommandLineParser.cpp                |   846 +
 libcpp/pbdata/CommandLineParser.hpp                |   175 +
 libcpp/pbdata/Compare4BitCompressed.hpp            |    98 +
 libcpp/pbdata/CompressedDNASequence.hpp            |    89 +
 libcpp/pbdata/CompressedSequence.hpp               |   100 +
 libcpp/pbdata/CompressedSequenceImpl.hpp           |   343 +
 libcpp/pbdata/DNASequence.cpp                      |   402 +
 libcpp/pbdata/DNASequence.hpp                      |   183 +
 libcpp/pbdata/Enumerations.h                       |    39 +
 libcpp/pbdata/FASTAReader.cpp                      |   420 +
 libcpp/pbdata/FASTAReader.hpp                      |    80 +
 libcpp/pbdata/FASTASequence.cpp                    |   246 +
 libcpp/pbdata/FASTASequence.hpp                    |    91 +
 libcpp/pbdata/FASTQReader.cpp                      |    89 +
 libcpp/pbdata/FASTQReader.hpp                      |    24 +
 libcpp/pbdata/FASTQSequence.cpp                    |   651 +
 libcpp/pbdata/FASTQSequence.hpp                    |   146 +
 libcpp/pbdata/GFFFile.cpp                          |    39 +
 libcpp/pbdata/GFFFile.hpp                          |    33 +
 libcpp/pbdata/MD5Utils.cpp                         |   464 +
 libcpp/pbdata/MD5Utils.hpp                         |   113 +
 libcpp/pbdata/MD5UtilsImpl.hpp                     |    57 +
 libcpp/pbdata/NucConversion.cpp                    |   409 +
 libcpp/pbdata/NucConversion.hpp                    |    50 +
 libcpp/pbdata/PackedDNASequence.cpp                |   233 +
 libcpp/pbdata/PackedDNASequence.hpp                |    60 +
 libcpp/pbdata/ReverseCompressIndex.cpp             |    40 +
 libcpp/pbdata/ReverseCompressIndex.hpp             |    25 +
 libcpp/pbdata/SMRTSequence.cpp                     |   283 +
 libcpp/pbdata/SMRTSequence.hpp                     |   115 +
 libcpp/pbdata/SeqUtils.hpp                         |    17 +
 libcpp/pbdata/SeqUtilsImpl.hpp                     |    47 +
 libcpp/pbdata/StringUtils.cpp                      |   133 +
 libcpp/pbdata/StringUtils.hpp                      |    71 +
 libcpp/pbdata/Types.h                              |    21 +
 libcpp/pbdata/VectorUtils.hpp                      |    17 +
 libcpp/pbdata/alignment/CmpAlignment.cpp           |   219 +
 libcpp/pbdata/alignment/CmpAlignment.hpp           |   126 +
 libcpp/pbdata/alignment/CmpAlignmentImpl.hpp       |     6 +
 libcpp/pbdata/amos/AfgBasWriter.cpp                |   102 +
 libcpp/pbdata/amos/AfgBasWriter.hpp                |    59 +
 libcpp/pbdata/build.mk                             |     1 +
 libcpp/pbdata/defs.h                               |    19 +
 libcpp/pbdata/loadpulses/MetricField.cpp           |    87 +
 libcpp/pbdata/loadpulses/MetricField.hpp           |   115 +
 .../pbdata/loadpulses/MovieAlnIndexLookupTable.cpp |    54 +
 .../pbdata/loadpulses/MovieAlnIndexLookupTable.hpp |   117 +
 libcpp/pbdata/makefile                             |    40 +
 libcpp/pbdata/matrix/FlatMatrix.hpp                |    98 +
 libcpp/pbdata/matrix/FlatMatrixImpl.hpp            |   192 +
 libcpp/pbdata/matrix/Matrix.hpp                    |    50 +
 libcpp/pbdata/matrix/MatrixImpl.hpp                |   117 +
 libcpp/pbdata/metagenome/FindRandomSequence.hpp    |    70 +
 libcpp/pbdata/metagenome/SequenceIndexDatabase.hpp |    96 +
 .../metagenome/SequenceIndexDatabaseImpl.hpp       |   347 +
 libcpp/pbdata/metagenome/TitleTable.cpp            |   109 +
 libcpp/pbdata/metagenome/TitleTable.hpp            |    39 +
 libcpp/pbdata/mklibconfig.sh                       |    32 +
 libcpp/pbdata/old.Makefile                         |    87 +
 libcpp/pbdata/qvs/QualityTransform.cpp             |    23 +
 libcpp/pbdata/qvs/QualityTransform.hpp             |    26 +
 libcpp/pbdata/qvs/QualityValue.cpp                 |    65 +
 libcpp/pbdata/qvs/QualityValue.hpp                 |    31 +
 libcpp/pbdata/qvs/QualityValueVector.hpp           |    47 +
 libcpp/pbdata/qvs/QualityValueVectorImpl.hpp       |    99 +
 libcpp/pbdata/reads/BaseFile.cpp                   |    82 +
 libcpp/pbdata/reads/BaseFile.hpp                   |    49 +
 libcpp/pbdata/reads/BaseFileImpl.hpp               |    11 +
 libcpp/pbdata/reads/HoleXY.cpp                     |    14 +
 libcpp/pbdata/reads/HoleXY.hpp                     |    14 +
 libcpp/pbdata/reads/PulseBaseCommon.cpp            |    37 +
 libcpp/pbdata/reads/PulseBaseCommon.hpp            |    26 +
 libcpp/pbdata/reads/PulseFile.cpp                  |    76 +
 libcpp/pbdata/reads/PulseFile.hpp                  |    53 +
 libcpp/pbdata/reads/PulseFileImpl.hpp              |    21 +
 libcpp/pbdata/reads/ReadInterval.hpp               |    18 +
 libcpp/pbdata/reads/ReadType.cpp                   |    43 +
 libcpp/pbdata/reads/ReadType.hpp                   |    18 +
 libcpp/pbdata/reads/RegionTable.cpp                |   159 +
 libcpp/pbdata/reads/RegionTable.hpp                |    95 +
 libcpp/pbdata/reads/ScanData.cpp                   |    12 +
 libcpp/pbdata/reads/ScanData.hpp                   |    20 +
 libcpp/pbdata/reads/ZMWGroupEntry.cpp              |     8 +
 libcpp/pbdata/reads/ZMWGroupEntry.hpp              |    17 +
 libcpp/pbdata/saf/AlnGroup.cpp                     |    12 +
 libcpp/pbdata/saf/AlnGroup.hpp                     |    14 +
 libcpp/pbdata/saf/AlnInfo.hpp                      |    17 +
 libcpp/pbdata/saf/MovieInfo.cpp                    |    13 +
 libcpp/pbdata/saf/MovieInfo.hpp                    |    19 +
 libcpp/pbdata/saf/RefGroup.cpp                     |    25 +
 libcpp/pbdata/saf/RefGroup.hpp                     |    21 +
 libcpp/pbdata/saf/RefInfo.cpp                      |    20 +
 libcpp/pbdata/saf/RefInfo.hpp                      |    26 +
 libcpp/pbdata/sam/AlignmentSet.hpp                 |    31 +
 libcpp/pbdata/sam/AlignmentSetImpl.hpp             |    31 +
 libcpp/pbdata/sam/CigarString.h                    |    23 +
 libcpp/pbdata/sam/ReadGroup.cpp                    |    51 +
 libcpp/pbdata/sam/ReadGroup.hpp                    |    40 +
 libcpp/pbdata/sam/ReferenceSequence.cpp            |    47 +
 libcpp/pbdata/sam/ReferenceSequence.hpp            |    72 +
 libcpp/pbdata/sam/SAMAlignment.cpp                 |   199 +
 libcpp/pbdata/sam/SAMAlignment.hpp                 |    97 +
 libcpp/pbdata/sam/SAMFlag.h                        |    48 +
 libcpp/pbdata/sam/SAMHeader.cpp                    |    31 +
 libcpp/pbdata/sam/SAMHeader.hpp                    |    18 +
 libcpp/pbdata/sam/SAMKeywordValuePair.cpp          |    51 +
 libcpp/pbdata/sam/SAMKeywordValuePair.hpp          |    50 +
 libcpp/pbdata/sam/SAMKeywordValuePairImpl.hpp      |    32 +
 libcpp/pbdata/sam/SAMReader.hpp                    |    61 +
 libcpp/pbdata/sam/SAMReaderImpl.hpp                |   197 +
 libcpp/pbdata/utils.hpp                            |    20 +
 libcpp/pbdata/utils/BitUtils.cpp                   |    99 +
 libcpp/pbdata/utils/BitUtils.hpp                   |    14 +
 libcpp/pbdata/utils/SMRTReadUtils.cpp              |    45 +
 libcpp/pbdata/utils/SMRTReadUtils.hpp              |    18 +
 libcpp/pbdata/utils/SMRTTitle.cpp                  |    52 +
 libcpp/pbdata/utils/SMRTTitle.hpp                  |    24 +
 libcpp/pbdata/utilsImpl.hpp                        |    32 +
 libcpp/rules.mk                                    |    17 +
 libcpp/simple.mk                                   |    16 +
 libcpp/unittest/.gitignore                         |     1 +
 libcpp/unittest/Makefile                           |   151 +
 libcpp/unittest/alignment/Makefile                 |    35 +
 .../alignment/AlignmentMap_gtest.cpp               |    63 +
 .../alignment/CmpIndexedStringTable_gtest.cpp      |   143 +
 .../unittest/alignment/files/CCSIterator_gtest.cpp |    66 +
 .../alignment/files/FragmentCCSIterator_gtest.cpp  |   104 +
 .../alignment/files/ReaderAgglomerate_gtest.cpp    |   129 +
 .../alignment/format/SAMHeaderPrinter_gtest.cpp    |   138 +
 .../unittest/alignment/format/SAMPrinter_gtest.cpp |    45 +
 .../unittest/alignment/utils/FileUtils_gtest.cpp   |    54 +
 .../unittest/alignment/utils/RangeUtils_gtest.cpp  |    63 +
 .../unittest/alignment/utils/RegionUtils_gtest.cpp |   236 +
 libcpp/unittest/build.mk                           |    27 +
 libcpp/unittest/common.mk                          |    64 +
 libcpp/unittest/hdf/HDF2DArray_gtest.cpp           |    96 +
 libcpp/unittest/hdf/HDFBasReader_gtest.cpp         |    56 +
 libcpp/unittest/hdf/HDFCCSReader_gtest.cpp         |    68 +
 libcpp/unittest/hdf/HDFPlsReader_gtest.cpp         |    49 +
 libcpp/unittest/hdf/HDFScanDataReader_gtest.cpp    |    52 +
 libcpp/unittest/hdf/HDFScanDataWriter_gtest.cpp    |    36 +
 libcpp/unittest/hdf/HDFUtils_gtest.cpp             |    38 +
 libcpp/unittest/hdf/HDFZMWReader_gtest.cpp         |   125 +
 libcpp/unittest/hdf/Makefile                       |    26 +
 libcpp/unittest/normal.Makefile                    |     9 +
 libcpp/unittest/normal.defines.mk                  |    54 +
 libcpp/unittest/pbdata/CCSSequence_gtest.cpp       |   117 +
 libcpp/unittest/pbdata/ChangeListID_gtest.cpp      |    34 +
 libcpp/unittest/pbdata/DNASequence_gtest.cpp       |   279 +
 libcpp/unittest/pbdata/FASTAReader_gtest.cpp       |    65 +
 libcpp/unittest/pbdata/FASTASequence_gtest.cpp     |   143 +
 libcpp/unittest/pbdata/FASTQReader_gtest.cpp       |    90 +
 libcpp/unittest/pbdata/Makefile                    |    31 +
 libcpp/unittest/pbdata/NucConversion_gtest.cpp     |   105 +
 libcpp/unittest/pbdata/SMRTSequence_gtest.cpp      |    62 +
 libcpp/unittest/pbdata/ScanData_gtest.cpp          |    31 +
 libcpp/unittest/pbdata/SeqUtils_gtest.cpp          |    50 +
 libcpp/unittest/pbdata/StringUtils_gtest.cpp       |    80 +
 libcpp/unittest/pbdata/VectorUtils_gtest.cpp       |    38 +
 libcpp/unittest/pbdata/defs_gtest.cpp              |    44 +
 .../pbdata/metagenome/TitleTable_gtest.cpp         |    32 +
 .../pbdata/qvs/QualityValueVector_gtest.cpp        |    50 +
 libcpp/unittest/pbdata/reads/ReadType_gtest.cpp    |    57 +
 libcpp/unittest/pbdata/saf/AlnGroup_gtest.cpp      |    44 +
 libcpp/unittest/pbdata/saf/MovieInfo_gtest.cpp     |    43 +
 libcpp/unittest/pbdata/saf/RefInfo_gtest.cpp       |    45 +
 libcpp/unittest/pbdata/testdata.h                  |    71 +
 libcpp/unittest/pbdata/utils/SMRTTitle_gtest.cpp   |    28 +
 libcpp/unittest/pbdata/utils_gtest.cpp             |    37 +
 p4.common.mk                                       |   147 +
 p4.fetch.tmpmk                                     |    10 +
 p4.mk                                              |    76 +
 rules.mk                                           |    31 +
 travis.sh                                          |     9 +
 utils/GNUmakefile                                  |    43 +
 utils/LoadPulses.cpp                               |  2643 ++
 utils/Makefile                                     |    64 +
 utils/PulseToFasta.cpp                             |   334 +
 utils/SAWriter.cpp                                 |   231 +
 utils/SDPMatcher.cpp                               |   166 +
 utils/SamFilter.cpp                                |   544 +
 utils/SamToCmpH5.cpp                               |   209 +
 utils/SamToM4.cpp                                  |   222 +
 utils/ToAfg.cpp                                    |   178 +
 utils/ctest/loadPulses.t                           |   193 +
 utils/ctest/loadPulses_fast.t                      |    41 +
 utils/ctest/pls2fasta.t                            |    20 +
 utils/ctest/pls2fasta_fast.t                       |    15 +
 utils/ctest/samFilter.t                            |    95 +
 utils/ctest/samtoh5.t                              |   141 +
 utils/ctest/samtom4.t                              |    44 +
 utils/ctest/sawriter.t                             |    30 +
 utils/ctest/sdpMatcher.t                           |    24 +
 utils/ctest/setup.sh                               |    14 +
 utils/ctest/toAfg.t                                |    70 +
 utils/p4.mk                                        |    65 +
 yli.common.mk                                      |    94 +
 yli.makefile                                       |    80 +
 573 files changed, 110051 insertions(+)

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..0790993
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "libcpp"]
+	path = libcpp
+	url = git://github.com/PacificBiosciences/blasr_libcpp.git
diff --git a/Blasr.cpp b/Blasr.cpp
new file mode 100644
index 0000000..95aee11
--- /dev/null
+++ b/Blasr.cpp
@@ -0,0 +1,4464 @@
+#ifdef __linux__
+#  include <mcheck.h>
+#endif
+#include <string>
+#include <iostream>
+#include <vector>
+#include <set>
+#include <sstream>
+#include <pthread.h>
+#include <stdlib.h>
+#include <time.h>
+#include <signal.h>
+#include <execinfo.h>
+
+#include "MappingIPC.h"
+#include "MappingSemaphores.h"
+#include "RegisterBlasrOptions.h"
+
+#include "CCSSequence.hpp"
+#include "SMRTSequence.hpp"
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+#include "SeqUtils.hpp"
+#include "defs.h"
+#include "utils.hpp"
+
+#include "tuples/DNATuple.hpp"
+#include "tuples/HashedTupleList.hpp"
+#include "algorithms/compare/CompareStrings.hpp"
+#include "algorithms/alignment/AffineKBandAlign.hpp"
+#include "algorithms/alignment/GuidedAlign.hpp"
+#include "algorithms/alignment/AffineGuidedAlign.hpp"
+#include "algorithms/alignment/FullQVAlign.hpp"
+#include "algorithms/alignment/ExtendAlign.hpp"
+#include "algorithms/alignment/OneGapAlignment.hpp"
+#include "algorithms/alignment/AlignmentUtils.hpp"
+#include "algorithms/alignment/QualityValueScoreFunction.hpp" 
+#include "algorithms/alignment/IDSScoreFunction.hpp"
+#include "algorithms/alignment/DistanceMatrixScoreFunction.hpp"
+#include "algorithms/alignment/StringToScoreMatrix.hpp"
+#include "algorithms/alignment/AlignmentFormats.hpp"
+#include "algorithms/anchoring/LISPValue.hpp" 
+#include "algorithms/anchoring/LISPValueWeightor.hpp"
+#include "algorithms/anchoring/LISSizeWeightor.hpp"
+#include "algorithms/anchoring/LISQValueWeightor.hpp"
+#include "algorithms/anchoring/FindMaxInterval.hpp" 
+#include "algorithms/anchoring/MapBySuffixArray.hpp"
+#include "datastructures/anchoring/ClusterList.hpp"
+#include "algorithms/anchoring/ClusterProbability.hpp"
+#include "algorithms/anchoring/BWTSearch.hpp"
+#include "metagenome/SequenceIndexDatabase.hpp"
+#include "metagenome/TitleTable.hpp"
+#include "suffixarray/SharedSuffixArray.hpp"
+#include "suffixarray/SuffixArrayTypes.hpp"
+#include "tuples/TupleCountTable.hpp" 
+#include "datastructures/anchoring/WeightedInterval.hpp" 
+#include "datastructures/anchoring/AnchorParameters.hpp"
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "datastructures/alignment/AlignmentContext.hpp"
+#include "MappingMetrics.hpp"
+#include "reads/ReadInterval.hpp"
+#include "utils/FileOfFileNames.hpp"
+#include "utils/RegionUtils.hpp"
+#include "utils/TimeUtils.hpp" 
+#include "qvs/QualityTransform.hpp"
+#include "files/ReaderAgglomerate.hpp"
+#include "files/CCSIterator.hpp"
+#include "files/FragmentCCSIterator.hpp"
+#include "HDFRegionTableReader.hpp"
+#include "bwt/BWT.hpp" 
+#include "PackedDNASequence.hpp"
+#include "CommandLineParser.hpp"
+#include "qvs/QualityValue.hpp"
+#include "statistics/VarianceAccumulator.hpp" 
+#include "statistics/pdfs.hpp"
+#include "statistics/cdfs.hpp"
+#include "statistics/StatUtils.hpp"
+#include "statistics/LookupAnchorDistribution.hpp"
+#include "format/StickAlignmentPrinter.hpp"
+#include "format/SAMPrinter.hpp"
+#include "format/XMLPrinter.hpp"
+#include "format/CompareSequencesPrinter.hpp"
+#include "format/VulgarPrinter.hpp"
+#include "format/IntervalPrinter.hpp"
+#include "format/SummaryPrinter.hpp"
+#include "format/SAMHeaderPrinter.hpp"
+#include "format/BAMPrinter.hpp"
+
+#define MAX_PHRED_SCORE 254
+#define MAPQV_END_ALIGN_WIGGLE 5
+
+//#define USE_GOOGLE_PROFILER
+
+#ifdef USE_GOOGLE_PROFILER
+#include "gperftools/profiler.h"
+#endif
+
+#ifdef USE_PBBAM
+#include "pbbam/BamWriter.h"
+using namespace PacBio::BAM;
+#else
+#define BamWriter ostream 
+#endif
+using namespace std;
+
+MappingSemaphores semaphores;
+
+/*
+ * Declare global structures that are shared between threads.
+ */
+
+ostream *outFilePtr = NULL;
+BamWriter * bamWriterPtr = NULL;
+//ofstream clOut, nsOut, mcOut;
+
+HDFRegionTableReader *regionTableReader = NULL;
+
+typedef SMRTSequence T_Sequence;
+typedef FASTASequence T_GenomeSequence;
+typedef DNASuffixArray T_SuffixArray;
+typedef DNATuple T_Tuple;
+
+typedef LISPValueWeightor<T_GenomeSequence, DNATuple, vector<ChainedMatchPos> >  PValueWeightor;
+typedef LISSMatchFrequencyPValueWeightor<T_GenomeSequence, DNATuple, vector<ChainedMatchPos> >  MultiplicityPValueWeightor;
+
+ReaderAgglomerate *reader = NULL;
+
+typedef MappingData<T_SuffixArray, T_GenomeSequence, T_Tuple> MappingIPC;
+
+class ClusterInformation {
+public:
+  int maxClusterSize;
+  float meanAnchorBasesPerRead;
+  float sdAnchorBasesPerRead;
+  int score;
+  float pctSimilarity;
+  int readLength;
+  float nStdDev ;
+  int numSignificant;
+  int numForward, numReverse;
+};
+
+
+class ReadAlignments {
+public:
+  /*
+    This class stores the alignments from a read.  A read may be
+    aligned in several different modes:
+    1. Fullread    - Treat the read as a unit from start to end
+    2. Subread     - Align each subread independently
+    3. CCSDeNovo   - Only align the CCS sequence from a read
+    4. CCSAllPass  - Align the de novo ccs sequences and then the
+                     subreads to where the denovo ccs aligned.
+    5. CCSFullPass - Same as allpass, except using only complete
+                     subreads.
+    6. ZmwSubreads - Align subreads of each zmw to where the longest 
+                     subread of the zmw aligned to.
+   
+    The alignments are a raggad array of n sequences; n is 1 for cases 
+    1 and 3, the number of subreads for cases 2 and 4, and the number
+    of full length passes for case 5.
+
+    A ReadAligments class must only have alignments for a single type
+    of read in it.
+
+  */
+
+  vector<vector<T_AlignmentCandidate*> > subreadAlignments;
+  vector<SMRTSequence> subreads;
+  AlignMode alignMode;
+  SMRTSequence read;
+  int GetNAlignedSeq() {
+    return subreadAlignments.size();
+  }
+
+  bool AllSubreadsHaveAlignments() {
+    int i, nAlignedSeq;
+    nAlignedSeq = subreadAlignments.size();
+    for (i = 0; i < nAlignedSeq; i++) {
+      if (subreadAlignments[i].size() == 0) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  void Clear() {
+    int i;
+    int nAlignedSeq;
+    for (i = 0, nAlignedSeq = subreadAlignments.size(); i < nAlignedSeq; i++) {
+      int nAlignments;
+      int a;
+      for (a = 0, nAlignments = subreadAlignments[i].size(); a < nAlignments; a++) {
+        delete subreadAlignments[i][a];
+      }
+      subreadAlignments[i].clear();
+    }
+
+    for (i = 0, nAlignedSeq = subreads.size(); i< nAlignedSeq; i++) {
+      subreads[i].Free();
+    }
+    subreadAlignments.clear();
+    read.Free();
+  }
+
+  void Resize(int nSeq) {
+      subreadAlignments.resize(nSeq);
+      subreads.resize(nSeq);
+  }
+
+  void CheckSeqIndex(int seqIndex) {
+    if ( seqIndex < 0 or seqIndex >= int(subreads.size()) ) {
+      cout << "ERROR, adding a sequence to an unallocated position." 
+           << endl;
+      assert(0);
+    }
+  }
+
+  void SetSequence(int seqIndex, SMRTSequence &seq) {
+    CheckSeqIndex(seqIndex);
+    subreads[seqIndex] = seq;
+  }
+
+  void AddAlignmentForSeq(int seqIndex, T_AlignmentCandidate *alignmentPtr) {
+    CheckSeqIndex(seqIndex);
+    subreadAlignments[seqIndex].push_back(alignmentPtr);
+  }
+
+  void AddAlignmentsForSeq(int seqIndex, vector<T_AlignmentCandidate*> &seqAlignmentPtrs) {
+    CheckSeqIndex(seqIndex);
+    subreadAlignments[seqIndex].insert(subreadAlignments[seqIndex].end(), seqAlignmentPtrs.begin(), seqAlignmentPtrs.end());
+  }
+
+  // Copy all T_AlignmentCandidate objects (to which subreadAlignment[seqIndex]
+  // is pointing) to newly created objects, and then return pointers to the new
+  // objects.
+  vector<T_AlignmentCandidate*> CopySubreadAlignments(int seqIndex) {
+    vector<T_AlignmentCandidate*> ret;
+    for (int i=0; i<int(subreadAlignments[seqIndex].size()); i++) {
+      T_AlignmentCandidate * q = new T_AlignmentCandidate();
+      *q = *(subreadAlignments[seqIndex][i]);
+      ret.push_back(q);
+    }
+    return ret;
+  }
+
+  void Print(ostream &out=cout) { 
+    out << "A ReadAlignments object with " 
+        << subreadAlignments.size()
+        << " groups of subread alignments." << endl;
+        for (int i = 0; i < int(subreadAlignments.size()); i++) {
+            out << "  subreadAlignment group [" << i << "/" 
+                << subreadAlignments.size() << "] has "
+                << subreadAlignments[i].size() << " alignments." << endl;
+            for(int j = 0; j < int(subreadAlignments[i].size()); j++) {
+                out << "    [" << i << "][" << j << "/" 
+                    << subreadAlignments[i].size() << "]" << endl;
+                subreadAlignments[i][j]->Print(out);
+            } 
+        }
+        /* subreads may have been freed or not initialized when 
+             * being printed. 
+        for (int i = 0; i < subreads.size(); i++) {
+            out << "  subread [" << i << "/" << subreads.size()
+                << "]: ";
+            subreads[i].Print(out);
+        } */
+        out << "  read: ";
+        read.Print(out);
+        out << endl << endl;
+    }
+
+  ~ReadAlignments() {
+      read.Free();
+  }
+};
+
+string GetMajorVersion() {
+  return "2.0.0";
+}
+
+const string GetVersion(void) {
+  string perforceVersionString("$Change$");
+  string version = GetMajorVersion();
+  if (perforceVersionString.size() > 12) {
+    version.insert(version.size(), ".");
+    version.insert(version.size(), perforceVersionString, 9, perforceVersionString.size() - 11);
+  }
+  return version;
+}
+
+
+//
+// Define a list of buffers that are meant to grow to high-water
+// marks, and not shrink down past that.   The memory is reused rather
+// than having multiple calls to new.
+//
+class MappingBuffers {
+public:
+  vector<int> hpInsScoreMat, insScoreMat;
+  vector<int> kbandScoreMat;
+  vector<Arrow> hpInsPathMat, insPathMat;
+  vector<Arrow> kbandPathMat;
+  vector<int>   scoreMat;
+  vector<Arrow> pathMat;
+  vector<int>  affineScoreMat;
+  vector<Arrow> affinePathMat;
+  vector<ChainedMatchPos> matchPosList;
+  vector<ChainedMatchPos> rcMatchPosList;
+  vector<BasicEndpoint<ChainedMatchPos> > globalChainEndpointBuffer;
+  vector<Fragment> sdpFragmentSet, sdpPrefixFragmentSet, sdpSuffixFragmentSet;
+  TupleList<PositionDNATuple> sdpCachedTargetTupleList;
+  TupleList<PositionDNATuple> sdpCachedTargetPrefixTupleList;
+  TupleList<PositionDNATuple> sdpCachedTargetSuffixTupleList;
+  std::vector<int> sdpCachedMaxFragmentChain;
+  vector<double> probMat;
+  vector<double> optPathProbMat;
+  vector<float>  lnSubPValueMat;
+  vector<float>  lnInsPValueMat;
+  vector<float>  lnDelPValueMat;
+  vector<float>  lnMatchPValueMat;
+  vector<int>    clusterNumBases;
+  ClusterList    clusterList;
+  ClusterList    revStrandClusterList;
+
+  void Reset() {
+    vector<int>().swap(hpInsScoreMat);
+    vector<int>().swap(insScoreMat);
+    vector<int>().swap(kbandScoreMat);
+    vector<Arrow>().swap(hpInsPathMat);
+    vector<Arrow>().swap(insPathMat);
+    vector<Arrow>().swap(kbandPathMat);
+    vector<int>().swap(scoreMat);
+    vector<Arrow>().swap(pathMat);
+    vector<ChainedMatchPos>().swap(matchPosList);
+    vector<ChainedMatchPos>().swap(rcMatchPosList);
+    vector<BasicEndpoint<ChainedMatchPos> >().swap(globalChainEndpointBuffer);
+    vector<Fragment>().swap(sdpFragmentSet);
+    vector<Fragment>().swap(sdpPrefixFragmentSet);
+    vector<Fragment>().swap(sdpSuffixFragmentSet);
+    sdpCachedTargetTupleList.Reset();
+    sdpCachedTargetPrefixTupleList.Reset();
+    sdpCachedTargetSuffixTupleList.Reset();
+    vector<int>().swap(sdpCachedMaxFragmentChain);
+    vector<double>().swap(probMat);
+    vector<double>().swap(optPathProbMat);
+    vector<float>().swap(lnSubPValueMat);
+    vector<float>().swap(lnInsPValueMat);
+    vector<float>().swap(lnDelPValueMat);
+    vector<float>().swap(lnMatchPValueMat);
+    vector<int>().swap(clusterNumBases);
+  }
+};
+
+
+int CountZero(unsigned char *ptr, int length) {
+  int i;
+  int nZero = 0;
+  for (i = 0; i < length; i++) {
+    if (ptr[i] == 0) { ++nZero; }
+  }
+  return nZero;
+}
+
+
+bool ReadHasMeaningfulQualityValues(FASTQSequence &sequence) {
+  if (sequence.qual.Empty() == true) {
+    return 0;
+  }
+  else {
+    int numZero=0, numNonZero=0;
+    if (sequence.qual.data == NULL) {
+      return false;
+    }
+    numZero = CountZero(sequence.qual.data, sequence.length);
+    numNonZero = sequence.length - numZero;
+    int subNumZero = 0, subNonZero = 0;
+
+    if (sequence.substitutionQV.data == NULL) {
+      return false;
+    }
+    subNumZero = CountZero(sequence.substitutionQV.data, sequence.length);
+    subNonZero = sequence.length - subNumZero;
+
+    if (numZero < 0.5*numNonZero and subNumZero < 0.5 * subNonZero) {
+       return true;
+     }
+    else {
+      return false;
+    }
+  }
+}
+
+
+void StoreRankingStats( vector<T_AlignmentCandidate*> &alignments,
+                        VarianceAccumulator<float> &accumPValue, 
+                        VarianceAccumulator<float> &accumWeight) {
+  int i;
+  for (i = 0; i < int(alignments.size()); i++) {
+    alignments[i]->pvalVariance = accumPValue.GetVariance();
+    alignments[i]->pvalNStdDev  = accumPValue.GetNStdDev(alignments[i]->clusterScore);
+    alignments[i]->weightVariance = accumWeight.GetVariance();
+    alignments[i]->weightNStdDev  = accumWeight.GetNStdDev(alignments[i]->clusterWeight);
+  }
+
+}
+
+
+
+template<typename T_TargetSequence, typename T_QuerySequence, typename TDBSequence>
+void AlignIntervals(T_TargetSequence &genome, T_QuerySequence &read, T_QuerySequence &rcRead,
+                    WeightedIntervalSet &weightedIntervals,
+                    int mutationCostMatrix[][5], 
+                    int ins, int del, int sdpTupleSize,
+                    int useSeqDB, SequenceIndexDatabase<TDBSequence> &seqDB,
+                    vector<T_AlignmentCandidate*> &alignments,
+                    MappingParameters &params,
+                    MappingBuffers &mappingBuffers,
+                    int procId=0) {
+                        
+  vector<T_QuerySequence*> forrev;
+  forrev.resize(2);
+  forrev[Forward] = &read;
+  forrev[Reverse] = &rcRead;
+
+  //
+  // Use an edit distance scoring function instead of IDS.  Although
+  // the IDS should be more accurate, it is more slow, and it is more
+  // important at this stage to have faster alignments than accurate,
+  // since all alignments are rerun using GuidedAlignment later on.
+  //
+  DistanceMatrixScoreFunction<DNASequence, FASTQSequence> distScoreFn(SMRTDistanceMatrix, params.insertion, params.deletion);
+  DistanceMatrixScoreFunction<DNASequence, FASTQSequence> distScoreFn2(SMRTDistanceMatrix, ins, ins);
+  
+  //
+  // Assume there is at least one interval.
+  //
+  if (weightedIntervals.size() == 0) 
+    return;
+
+  WeightedIntervalSet::iterator intvIt = weightedIntervals.begin();
+  int alignmentIndex = 0;
+  
+
+  do {
+
+    T_AlignmentCandidate *alignment = alignments[alignmentIndex];
+    alignment->clusterWeight= (*intvIt).size; // totalAnchorSize == size
+    alignment->clusterScore = (*intvIt).pValue;
+
+    //
+    // Advance references.  Intervals are stored in reverse order, so
+    // go backwards in the list, and alignments are in forward order.
+    // That should probably be changed.
+    //
+    ++alignmentIndex;
+
+    // 
+    // Try aligning the read to the genome.
+    //
+    DNALength matchIntervalStart, matchIntervalEnd;
+    matchIntervalStart = (*intvIt).start;
+    matchIntervalEnd   = (*intvIt).end;
+
+    bool readOverlapsContigStart    = false;
+    bool readOverlapsContigEnd      = false;
+    int  startOverlappedContigIndex = 0;
+    int  endOverlappedContigIndex   = 0;
+    if (params.verbosity > 0) {
+      cout << "aligning interval : " << read.length << " " << (*intvIt).start << " " 
+           << (*intvIt).end  << " " << (*intvIt).qStart << " " << (*intvIt).qEnd
+           << " " << matchIntervalStart << " to " << matchIntervalEnd << " " 
+           << params.approximateMaxInsertionRate << " "  << endl;
+    }
+    assert(matchIntervalEnd >= matchIntervalStart);
+
+    //
+    // If using a sequence database, check to make sure that the
+    // boundaries of the sequence windows do not overlap with 
+    // the boundaries of the reads.  If the beginning is before
+    // the boundary, move the beginning up to the start of the read.
+    // If the end is past the end boundary of the read, similarly move 
+    // the window boundary to the end of the read boundary.
+
+    DNALength tAlignedContigStart = 0;
+    int seqDBIndex = 0;
+
+
+    //
+    // Stretch the alignment interval so that it is close to where
+    // the read actually starts.
+    //
+    DNALength subreadStart = read.subreadStart;
+    DNALength subreadEnd   = read.subreadEnd;
+    if ((*intvIt).GetStrandIndex() == Reverse) {
+      subreadEnd   = read.MakeRCCoordinate(read.subreadStart) + 1;
+      subreadStart = read.MakeRCCoordinate(read.subreadEnd-1);
+    }
+
+    DNALength lengthBeforeFirstMatch = ((*intvIt).qStart - subreadStart) * params.approximateMaxInsertionRate ;
+    DNALength lengthAfterLastMatch   = (subreadEnd - (*intvIt).qEnd) * params.approximateMaxInsertionRate;
+    if (matchIntervalStart < lengthBeforeFirstMatch  or params.doGlobalAlignment) {
+      matchIntervalStart = 0;
+    }
+    else {
+      matchIntervalStart -= lengthBeforeFirstMatch;
+    }
+
+    if (genome.length < matchIntervalEnd + lengthAfterLastMatch or params.doGlobalAlignment) {
+      matchIntervalEnd = genome.length;
+    }
+    else {
+      matchIntervalEnd += lengthAfterLastMatch;
+    }
+
+    DNALength intervalContigStartPos, intervalContigEndPos;
+    if (useSeqDB) {
+      //
+      // The sequence db index is the one where the actual match is
+      // contained. The matchIntervalStart might be before the sequence
+      // index boundary due to the extrapolation of alignment start by
+      // insertion rate.  If this is the case, bump up the
+      // matchIntervalStart to be at the beginning of the boundary. 
+      // Modify bounds similarly for the matchIntervalEnd and the end
+      // of a boundary.
+      //
+      seqDBIndex = seqDB.SearchForIndex((*intvIt).start);
+      intervalContigStartPos = seqDB.seqStartPos[seqDBIndex];
+      if (intervalContigStartPos > matchIntervalStart) {
+        matchIntervalStart = intervalContigStartPos;
+      }
+      intervalContigEndPos = seqDB.seqStartPos[seqDBIndex+1] - 1;
+      if (intervalContigEndPos < matchIntervalEnd) {
+        matchIntervalEnd = intervalContigEndPos;
+      }
+      alignment->tName    = seqDB.GetSpaceDelimitedName(seqDBIndex);
+      alignment->tLength  = intervalContigEndPos - intervalContigStartPos;
+      //
+      // When there are multiple sequences in the database, store the
+      // index of this sequence.  This lets one compare the contigs
+      // that reads are mapped to, for instance.
+      //
+      alignment->tIndex   = seqDBIndex;
+    }
+    else {
+      alignment->tLength     = genome.length;
+      alignment->tName       = genome.GetName();
+      intervalContigStartPos = 0;
+      intervalContigEndPos   = genome.length;
+      //
+      // When there are multiple sequences in the database, store the
+      // index of this sequence.  This lets one compare the contigs
+      // that reads are mapped to, for instance.
+      //
+    }
+    alignment->qName = read.title;
+    //
+    // Look to see if a read overhangs the beginning of a contig.
+    //
+    if (params.verbosity > 2) {
+      cout << "Check for prefix/suffix overlap on interval: " << (*intvIt).qStart << " ?> " << (*intvIt).start - intervalContigStartPos <<endl;
+    }
+    if ( (*intvIt).qStart > (*intvIt).start - intervalContigStartPos) {
+      readOverlapsContigStart = true;
+      startOverlappedContigIndex = seqDBIndex;
+    }
+    
+    // 
+    // Look to see if the read overhangs the end of a contig.
+    //
+    if (params.verbosity > 2) {
+      cout << "Check for suffix/prefix overlap on interval, read overhang: " << read.length - (*intvIt).qEnd << " ?> " << matchIntervalEnd - (*intvIt).end  <<endl;
+    }
+    if (read.length - (*intvIt).qEnd > matchIntervalEnd - (*intvIt).end) {
+      if (params.verbosity > 2) {
+        cout << "read overlaps genome end." << endl;
+      }
+      readOverlapsContigEnd = true;
+      endOverlappedContigIndex = seqDBIndex;
+    }
+    int alignScore;
+    alignScore = 0;
+
+    alignment->tAlignedSeqPos     = matchIntervalStart;
+    alignment->tAlignedSeqLength  = matchIntervalEnd - matchIntervalStart;
+    if ((*intvIt).GetStrandIndex() == Forward) {
+      alignment->tAlignedSeq.Copy(genome, alignment->tAlignedSeqPos, alignment->tAlignedSeqLength);
+      alignment->tStrand = Forward;
+    }
+    else {
+      DNALength rcAlignedSeqPos = genome.MakeRCCoordinate(alignment->tAlignedSeqPos + alignment->tAlignedSeqLength - 1);
+      genome.CopyAsRC(alignment->tAlignedSeq, rcAlignedSeqPos, alignment->tAlignedSeqLength);
+      // Map forward coordinates into reverse complement.
+
+      intervalContigStartPos    = genome.MakeRCCoordinate(intervalContigStartPos) + 1;
+      intervalContigEndPos      = genome.MakeRCCoordinate(intervalContigEndPos - 1);
+      swap(intervalContigStartPos, intervalContigEndPos);
+      alignment->tAlignedSeqPos = rcAlignedSeqPos;
+      alignment->tStrand        = Reverse;
+    }
+
+    // Configure the part of the query that is aligned.  The entire
+    // query should always be aligned.
+    alignment->qAlignedSeqPos    = 0;
+    alignment->qAlignedSeq.ReferenceSubstring(read);
+    alignment->qAlignedSeqLength = alignment->qAlignedSeq.length;
+    alignment->qLength           = read.length;
+    alignment->qStrand           = 0;
+
+    if (params.verbosity > 1) {
+      cout << "aligning read " << endl;
+      static_cast<DNASequence*>(&(alignment->qAlignedSeq))->PrintSeq(cout);
+      cout << endl << "aligning reference" << endl;
+      static_cast<DNASequence*>(&(alignment->tAlignedSeq))->PrintSeq(cout);
+      cout << endl;
+    }
+
+    //
+    // The type of alignment that is performed depends on the mode
+    // blasr is running in.  If it is running in normal mode, local
+    // aligment is performed and guided by SDP alignment.  When
+    // running in overlap mode, the alignments are forced to the ends
+    // of reads.
+    //
+
+    int intervalSize = 0;
+    int m;
+    // 
+    // Check to see if the matches to the genome are sufficiently
+    // dense to allow them to be used instead of having to redo
+    // sdp alignment.  
+    //
+        
+    // First count how much of the read matches the genome exactly.
+    for (m = 0; m < intvIt->matches.size(); m++) { intervalSize += intvIt->matches[m].l;} 
+
+    int subreadLength = forrev[(*intvIt).GetStrandIndex()]->subreadEnd - forrev[(*intvIt).GetStrandIndex()]->subreadStart;
+    if ((1.0*intervalSize) / subreadLength < params.sdpBypassThreshold and !params.emulateNucmer) {
+      //
+      // Not enough of the read maps to the genome, need to use
+      // sdp alignment to define the regions of the read that map.
+      //
+      if (params.refineBetweenAnchorsOnly) {
+
+        //
+        // Run SDP alignment only between the genomic anchors,
+        // including the genomic anchors as part of the alignment.
+        //
+        int m;
+
+        vector<ChainedMatchPos> *matches;
+        vector<ChainedMatchPos> rcMatches;
+        Alignment anchorsOnly;
+        DNASequence tAlignedSeq;
+        FASTQSequence qAlignedSeq;
+        //
+        // The strand bookkeeping is a bit confusing, so hopefully
+        // this will set things straight.
+        //
+        // If the alignment is forward strand, the coordinates of the
+        // blocks are relative to the forward read, starting at 0, not
+        // the subread start.
+        // If the alignment is reverse strand, the coordinates of the
+        // blocks are relative to the reverse strand, starting at the
+        // position of the subread on the reverse strand.
+        // 
+        // The coordinates of the blocks in the genome are always
+        // relative to the forward strand on the genome, starting at
+        // 0.  
+        //
+
+        //
+        // The first step to refining between anchors only is to make
+        // the anchors relative to the tAlignedSeq.
+        
+        matches = (vector<ChainedMatchPos>*) &(*intvIt).matches;
+        tAlignedSeq = alignment->tAlignedSeq;
+        qAlignedSeq = alignment->qAlignedSeq;
+
+        if (alignment->tStrand == 0) {
+            for (m = 0; m < matches->size(); m++) {
+                (*matches)[m].t -= alignment->tAlignedSeqPos;
+                (*matches)[m].q -= alignment->qAlignedSeqPos;
+            }
+        }
+        else  { 
+            //
+            // Flip the entire alignment if it is on the reverse strand.
+            DNALength rcAlignedSeqPos = genome.MakeRCCoordinate(alignment->tAlignedSeqPos + alignment->tAlignedSeqLength - 1);
+            for (m = 0; m < matches->size(); m++) {
+                (*matches)[m].t -= rcAlignedSeqPos;
+                (*matches)[m].q -= alignment->qAlignedSeqPos;
+            }
+
+            alignment->tAlignedSeq.CopyAsRC(tAlignedSeq);
+            rcMatches.resize((*intvIt).matches.size());
+          //
+          // Make the reverse complement of the match list.
+          //
+          
+          // 1. Reverse complement the coordinates.
+          for (m = 0; m < (*intvIt).matches.size(); m++) {
+            int revCompIndex = rcMatches.size() - m - 1;
+            rcMatches[revCompIndex].q = read.MakeRCCoordinate((*intvIt).matches[m].q + (*intvIt).matches[m].l - 1);
+            rcMatches[revCompIndex].t = tAlignedSeq.MakeRCCoordinate((*intvIt).matches[m].t + (*intvIt).matches[m].l - 1);
+            rcMatches[revCompIndex].l = (*intvIt).matches[m].l;
+          }
+          matches = &rcMatches;
+        }
+
+        /*
+          Uncomment to get a dot plot
+        ofstream matchFile;
+        matchFile.open("matches.txt");
+        matchFile << "q t l " << endl;
+        for (m = 0; matches->size() > 0 and m < matches->size() - 1; m++) {
+          matchFile << (*matches)[m].q << " " << (*matches)[m].t << " " << (*matches)[m].l << endl;
+        }
+        */
+        DNASequence tSubSeq;
+        FASTQSequence qSubSeq;
+        for (m = 0; matches->size() > 0 and m < matches->size() - 1; m++) {
+          Block block;
+          block.qPos = (*matches)[m].q;
+          block.tPos = (*matches)[m].t;
+          block.length = (*matches)[m].l;
+         
+          //
+          // Find the lengths of the gaps between anchors.
+          //
+          int tGap, qGap;
+          tGap = (*matches)[m+1].t - ((*matches)[m].t + (*matches)[m].l);
+          qGap = (*matches)[m+1].q - ((*matches)[m].q + (*matches)[m].l);
+          float gapRatio = (1.0*tGap)/qGap;
+
+          if (tGap > 0 and qGap > 0) {
+            DNALength tPos, qPos;
+            tPos = block.tPos + block.length;
+            qPos = block.qPos + block.length;
+            tSubSeq.ReferenceSubstring(tAlignedSeq, tPos, tGap);
+            qSubSeq.ReferenceSubstring(alignment->qAlignedSeq, qPos, qGap);
+            Alignment alignmentInGap;
+            int alignScore;
+
+            /*
+              The following code is experimental code for trying to do
+              something like affine gap alignment in long gaps.  It
+              would eventually be used in cDNA alignment to align
+              between exons, but for now is being tested here by using
+              it to align when there is a big gap between anchors.
+            */
+            if (params.separateGaps == true and 
+                qSubSeq.length > 0 and tSubSeq.length > 0 and 
+                ( (1.0*qSubSeq.length)/tSubSeq.length  < 0.25 )) {
+              alignScore = OneGapAlign(qSubSeq, tSubSeq, distScoreFn, mappingBuffers, alignmentInGap);
+            }
+            else {
+              /*
+                This is the 'normal/default' way to align between
+                gaps.  It is more well tested than OneGapAlign.
+              */
+              alignScore = SDPAlign(qSubSeq, tSubSeq, distScoreFn, params.sdpTupleSize, 
+                                    params.sdpIns, params.sdpDel, params.indelRate*2, 
+                                    alignmentInGap, mappingBuffers, Global, 
+                                    params.detailedSDPAlignment, 
+                                    params.extendFrontAlignment, 
+                                    params.recurseOver,
+                                    params.fastSDP);
+            }
+
+            //
+            // Now, splice the fragment alignment into the current
+            // alignment. 
+            //
+            if (alignmentInGap.blocks.size() > 0) {
+              int b;
+              //
+              // Configure this block to be relative to the beginning
+              // of the aligned substring.  
+              //
+              for (b = 0; b < alignmentInGap.size(); b++) {
+                alignmentInGap.blocks[b].tPos += tPos + alignmentInGap.tPos;
+                alignmentInGap.blocks[b].qPos += qPos + alignmentInGap.qPos;
+                assert(alignmentInGap.blocks[b].tPos < alignment->tAlignedSeq.length);
+                assert(alignmentInGap.blocks[b].qPos < alignment->qAlignedSeq.length);
+              }
+            }
+            // Add the original block
+            alignment->blocks.push_back(block);
+            anchorsOnly.blocks.push_back(block);
+            // Add the blocks for the refined alignment
+            alignment->blocks.insert(alignment->blocks.end(),
+                                     alignmentInGap.blocks.begin(),
+                                     alignmentInGap.blocks.end());
+          }
+        }
+
+        // Add the last block
+        m = (*matches).size() - 1;
+        Block block;
+        block.qPos = (*matches)[m].q;
+        block.tPos = (*matches)[m].t;
+
+        assert(block.tPos <= alignment->tAlignedSeq.length);
+        assert(block.qPos <= alignment->qAlignedSeq.length);
+
+        block.length = (*matches)[m].l;
+        alignment->blocks.push_back(block);        
+        anchorsOnly.blocks.push_back(block);
+
+        //
+        // By convention, blocks start at 0, and the
+        // alignment->tPos,qPos give the start of the alignment.
+        // Modify the block positions so that they are offset by 0.
+        alignment->tPos = alignment->blocks[0].tPos;
+        alignment->qPos = alignment->blocks[0].qPos;
+        int b;
+        int blocksSize = alignment->blocks.size();
+        for (b = 0; b < blocksSize ; b++) {
+          assert(alignment->tPos <= alignment->blocks[b].tPos);
+          assert(alignment->qPos <= alignment->blocks[b].qPos);
+          alignment->blocks[b].tPos -= alignment->tPos;
+          alignment->blocks[b].qPos -= alignment->qPos;
+        }
+        for (b = 0; b < anchorsOnly.blocks.size(); b++) {
+          anchorsOnly.blocks[b].tPos -= alignment->tPos;
+          anchorsOnly.blocks[b].qPos -= alignment->qPos;
+        }
+        anchorsOnly.tPos = alignment->tPos;
+        anchorsOnly.qPos = alignment->qPos;
+        ComputeAlignmentStats(*alignment, alignment->qAlignedSeq.seq, alignment->tAlignedSeq.seq,
+                              distScoreFn);
+
+        tAlignedSeq.Free();
+        qAlignedSeq.Free();
+        tSubSeq.Free();
+        qSubSeq.Free();
+      }
+      else {
+        alignScore = SDPAlign(alignment->qAlignedSeq, alignment->tAlignedSeq, distScoreFn, 
+                              sdpTupleSize, params.sdpIns, params.sdpDel, params.indelRate*3, 
+                              *alignment, mappingBuffers, 
+                              Local, 
+                              params.detailedSDPAlignment, 
+                              params.extendFrontAlignment, 
+                              params.recurseOver,
+                              params.fastSDP);
+        ComputeAlignmentStats(*alignment, alignment->qAlignedSeq.seq, alignment->tAlignedSeq.seq,
+                              distScoreFn);
+      }
+    }
+    else {
+      //
+      // The anchors used to anchor the sequence are sufficient to extend the alignment.
+      //
+      int m;
+      for (m = 0; m < (*intvIt).matches.size(); m++ ){
+        Block block;
+        block.qPos = (*intvIt).matches[m].q - alignment->qAlignedSeqPos;
+        block.tPos = (*intvIt).matches[m].t - alignment->tAlignedSeqPos;
+        block.length = (*intvIt).matches[m].l;
+        alignment->blocks.push_back(block);
+      }
+    }
+
+    //
+    //  The anchors/sdp alignments may leave portions of the read
+    //  unaligned at the beginning and end.  If the parameters
+    //  specify extending alignments, try and align extra bases at
+    //  the beginning and end of alignments.
+    if (params.extendAlignments) {
+
+      //
+      // Modify the alignment so that the start and end of the
+      // alignment strings are at the alignment boundaries.
+      //
+      // Since the query sequence is pointing at a subsequence of the
+      // read (and is always in the forward direction), just reference
+      // a new portion of the read.
+      alignment->qAlignedSeqPos = alignment->qAlignedSeqPos + alignment->qPos;
+      alignment->qAlignedSeqLength = alignment->QEnd();
+      alignment->qAlignedSeq.ReferenceSubstring(read, alignment->qAlignedSeqPos, alignment->qAlignedSeqLength );
+      alignment->qPos = 0; 
+
+      //
+      // Since the target sequence may be on the forward or reverse
+      // strand, a copy of the subsequence is made, and the original
+      // sequence free'd.
+      //
+      DNASequence tSubseq;
+      alignment->tAlignedSeqPos = alignment->tAlignedSeqPos + alignment->tPos;
+      alignment->tAlignedSeqLength = alignment->TEnd();
+      tSubseq.Copy(alignment->tAlignedSeq, alignment->tPos, alignment->tAlignedSeqLength);      
+      alignment->tPos = 0;
+
+      alignment->tAlignedSeq.Free();
+      alignment->tAlignedSeq.TakeOwnership(tSubseq);
+          
+      DNALength maximumExtendLength = 500;
+
+      if (alignment->blocks.size() > 0 ) {
+        int lastAlignedBlock = alignment->blocks.size() - 1;
+        DNALength lastAlignedQPos  = alignment->blocks[lastAlignedBlock].QEnd() + alignment->qPos + alignment->qAlignedSeqPos;
+        DNALength lastAlignedTPos  = alignment->blocks[lastAlignedBlock].TEnd() + alignment->tPos + alignment->tAlignedSeqPos;
+        T_AlignmentCandidate extendedAlignmentForward, extendedAlignmentReverse;
+        int forwardScore, reverseScore;
+
+        SMRTSequence  readSuffix;
+        DNALength     readSuffixLength;
+        DNASequence   genomeSuffix;
+        DNALength     genomeSuffixLength;
+        
+        SMRTSequence   readPrefix;
+        DNALength     readPrefixLength;
+        DNASequence   genomePrefix;
+        DNALength     genomePrefixLength;
+
+        //
+        // Align the entire end of the read if it is short enough.
+        //
+        readSuffixLength = min(read.length - lastAlignedQPos, maximumExtendLength);
+        if (readSuffixLength > 0) {
+          readSuffix.ReferenceSubstring(read, lastAlignedQPos, readSuffixLength);
+        }
+        else {
+          readSuffix.length = 0;
+        }
+        
+        //
+        // Align The entire end of the genome up to the maximum extend length;
+        //
+        genomeSuffixLength = min(intervalContigEndPos - lastAlignedTPos, maximumExtendLength);
+        if (genomeSuffixLength > 0) {
+          if (alignment->tStrand == Forward) {
+            genomeSuffix.Copy(genome, lastAlignedTPos, genomeSuffixLength);
+          }
+          else {
+            static_cast<DNASequence*>(&genome)->CopyAsRC(genomeSuffix, lastAlignedTPos, genomeSuffixLength);
+          }
+        }
+        else {
+          genomeSuffix.length = 0;
+        }
+        forwardScore = 0;
+        if (readSuffix.length > 0 and genomeSuffix.length > 0) {
+          forwardScore = ExtendAlignmentForward(readSuffix, 0,
+                                                genomeSuffix, 0,
+                                                params.extendBandSize, 
+                                                // Reuse buffers to speed up alignment
+                                                mappingBuffers.scoreMat,
+                                                mappingBuffers.pathMat,
+                                                // Do the alignment in the forward direction.
+                                                extendedAlignmentForward,
+                                                distScoreFn,
+                                                1, // don't bother attempting
+                                                // to extend the alignment
+                                                // if one of the sequences
+                                                // is less than 1 base long
+                                                params.maxExtendDropoff);
+        }
+        
+        if ( forwardScore < 0 ) {
+          //
+          // The extended alignment considers the whole genome, but
+          // should be modified to be starting at the end of where 
+          // the original alignment left off.
+          //
+          if (params.verbosity > 0) {
+            cout << "forward extended an alignment of score " << alignment->score << " with score " << forwardScore << " by " << extendedAlignmentForward.blocks.size() << " blocks and length " << extendedAlignmentForward.blocks[extendedAlignmentForward.blocks.size()-1].qPos << endl;
+          }
+          extendedAlignmentForward.tAlignedSeqPos = lastAlignedTPos;
+
+          extendedAlignmentForward.qAlignedSeqPos = lastAlignedQPos;
+
+          genomeSuffix.length = extendedAlignmentForward.tPos + extendedAlignmentForward.TEnd();
+          alignment->tAlignedSeq.Append(genomeSuffix);
+          alignment->qAlignedSeq.length += extendedAlignmentForward.qPos + extendedAlignmentForward.QEnd();
+          assert(alignment->qAlignedSeq.length <= read.length);
+          alignment->AppendAlignment(extendedAlignmentForward);
+        }
+
+        DNALength firstAlignedQPos = alignment->qPos + alignment->qAlignedSeqPos;
+        DNALength firstAlignedTPos = alignment->tPos + alignment->tAlignedSeqPos;
+         
+        readPrefixLength = min(firstAlignedQPos, maximumExtendLength);
+        if (readPrefixLength > 0) {
+          readPrefix.ReferenceSubstring(read, firstAlignedQPos-readPrefixLength, readPrefixLength);
+        }
+        else {
+          readPrefix.length = 0;
+        }
+        
+        genomePrefixLength = min(firstAlignedTPos - intervalContigStartPos, maximumExtendLength);
+        if (genomePrefixLength > 0) {
+          if (alignment->tStrand == 0) {
+            genomePrefix.Copy(genome, firstAlignedTPos - genomePrefixLength, genomePrefixLength);
+          }
+          else {
+            static_cast<DNASequence*>(&genome)->MakeRC(genomePrefix, firstAlignedTPos - genomePrefixLength, genomePrefixLength);
+          }
+        }
+        reverseScore = 0;
+        if (readPrefix.length > 0 and genomePrefix.length > 0) {
+          reverseScore = ExtendAlignmentReverse(readPrefix, readPrefix.length-1,
+                                                genomePrefix, genomePrefixLength - 1,
+                                                params.extendBandSize, //k
+                                                mappingBuffers.scoreMat,
+                                                mappingBuffers.pathMat,
+                                                extendedAlignmentReverse,
+                                                distScoreFn,
+                                                1, // don't bother attempting
+                                                // to extend the alignment
+                                                // if one of the sequences
+                                                // is less than 1 base long
+                                                params.maxExtendDropoff);
+        }
+      
+        if (reverseScore < 0 ) {
+          //
+          // Make alignment->tPos relative to the beginning of the
+          // extended alignment so that when it is appended, the
+          // coordinates match correctly.
+          if (params.verbosity > 0) {
+            cout << "reverse extended an alignment of score " << alignment->score << " with score " << reverseScore << " by " << extendedAlignmentReverse.blocks.size() << " blocks and length " << extendedAlignmentReverse.blocks[extendedAlignmentReverse.blocks.size()-1].qPos << endl;
+          }
+          extendedAlignmentReverse.tAlignedSeqPos = firstAlignedTPos - genomePrefixLength;
+          extendedAlignmentReverse.qAlignedSeqPos = firstAlignedQPos - readPrefixLength;
+          extendedAlignmentReverse.AppendAlignment(*alignment);
+
+          genomePrefix.Append(alignment->tAlignedSeq, genomePrefix.length - alignment->tPos);
+          alignment->tAlignedSeq.Free();
+          alignment->tAlignedSeq.TakeOwnership(genomePrefix);
+          
+          alignment->blocks = extendedAlignmentReverse.blocks;
+          
+          alignment->tAlignedSeqPos = extendedAlignmentReverse.tAlignedSeqPos;
+          alignment->tPos = extendedAlignmentReverse.tPos;
+
+
+          alignment->qAlignedSeqPos     = extendedAlignmentReverse.qAlignedSeqPos; 
+          alignment->qAlignedSeq.length = readPrefix.length + alignment->qAlignedSeq.length;
+          alignment->qPos               = extendedAlignmentReverse.qPos;
+          alignment->qAlignedSeq.seq    = readPrefix.seq;
+          //
+          // Make sure the two ways of accounting for aligned sequence
+          // length are in sync.  This needs to go.
+          //
+          if (alignment->blocks.size() > 0) {
+            int lastBlock = alignment->blocks.size() - 1;
+            alignment->qAlignedSeqLength = alignment->qAlignedSeq.length;
+            alignment->tAlignedSeqLength = alignment->tAlignedSeq.length;
+          }                
+          else {
+            alignment->qAlignedSeqLength = alignment->qAlignedSeq.length = 0;
+            alignment->tAlignedSeqLength = alignment->tAlignedSeq.length = 0;
+          }
+        } // end of if (reverseScore < 0 )
+        readSuffix.Free();
+        readPrefix.Free();
+        genomePrefix.Free();
+        genomeSuffix.Free();
+      }
+      tSubseq.Free();
+    }
+
+    if (params.verbosity > 0) {
+      cout << "interval align score: " << alignScore << endl;
+      StickPrintAlignment(*alignment,
+                          (DNASequence&) alignment->qAlignedSeq,
+                          (DNASequence&) alignment->tAlignedSeq,
+                          cout,
+                          0, alignment->tAlignedSeqPos);
+
+    }
+    ComputeAlignmentStats(*alignment, 
+                          alignment->qAlignedSeq.seq,
+                          alignment->tAlignedSeq.seq, 
+                          distScoreFn2);
+                          //SMRTDistanceMatrix, ins, del );
+
+
+    intvIt++;
+  } while (intvIt != weightedIntervals.end());
+}
+
+
+bool FirstContainsSecond(DNALength aStart, DNALength aEnd, DNALength bStart, DNALength bEnd) {
+  return ((bStart > aStart and bEnd <= aEnd) or
+          (bStart >= aStart and bEnd < aEnd));
+}
+
+template<typename T_Sequence>
+bool CheckForSufficientMatch(T_Sequence &read, vector<T_AlignmentCandidate*> &alignmentPtrs, MappingParameters &params) {
+  if (alignmentPtrs.size() > 0 and alignmentPtrs[0]->score < params.maxScore) {
+    return true;
+  }
+  else {
+    return false;
+  }
+}
+
+void DeleteAlignments(vector<T_AlignmentCandidate*> &alignmentPtrs, int startIndex=0) {
+  int i;
+  for (i = startIndex; i < int(alignmentPtrs.size()); i++ ) {
+    delete alignmentPtrs[i];
+  }
+  alignmentPtrs.resize(0);
+}
+
+int RemoveLowQualitySDPAlignments(int readLength, vector<T_AlignmentCandidate*> &alignmentPtrs, MappingParameters &params) {
+  // Just a hack.  For now, assume there is at least 1 match per 50 bases.
+  int totalBasesMatched = 0;
+  int a;
+  for (a = 0; a < int(alignmentPtrs.size()); a++) {
+    int b;
+    for (b = 0; b < int(alignmentPtrs[a]->blocks.size()); b++) {
+      totalBasesMatched += alignmentPtrs[a]->blocks[b].length;
+    }
+    int expectedMatches = params.sdpTupleSize/50.0 * readLength;
+    if (totalBasesMatched < expectedMatches) {
+      delete alignmentPtrs[a];
+      alignmentPtrs[a] = NULL;
+    }
+  }
+  int packedAlignmentIndex = 0;
+  for (a = 0; a < int(alignmentPtrs.size()); a++) {
+    if (alignmentPtrs[a] != NULL) {
+      alignmentPtrs[packedAlignmentIndex] = alignmentPtrs[a];
+      packedAlignmentIndex++;
+    }
+  }
+  alignmentPtrs.resize(packedAlignmentIndex);
+  return packedAlignmentIndex;
+}
+
+
+template<typename T_Sequence>
+int RemoveLowQualityAlignments(T_Sequence &read, vector<T_AlignmentCandidate*> &alignmentPtrs, MappingParameters &params) {
+  if (params.verbosity > 0) {
+    cout << "checking at least " << alignmentPtrs.size() << " alignments to see if they are accurate." << endl;
+  }
+  UInt i;
+  for (i = 0; i < MIN(params.nCandidates, alignmentPtrs.size()); i++) { 
+    if (params.verbosity > 0) {
+      cout << "Quality check  " << i << " " << alignmentPtrs[i]->score << endl;
+    }
+    if (alignmentPtrs[i]->blocks.size() == 0 or
+        alignmentPtrs[i]->score > params.maxScore) {
+      //
+      // Since the alignments are sorted according to alignment
+      // score, once one of the alignments is too low of a score,
+      // all remaining alignments are also too low, and should be
+      // removed as well.  Do that all at once.
+      //
+      if (alignmentPtrs[i]->blocks.size() == 0 and params.verbosity > 0) {
+        cout << "Removing empty alignment " << alignmentPtrs[i]->qName << endl;
+      }
+      if (params.verbosity  > 0) { 
+        cout << alignmentPtrs[i]->qName << " alignment " << i << " is too low of a score." << alignmentPtrs[i]->score << endl;
+      }
+      int deletedIndex = i;
+      for (; deletedIndex < alignmentPtrs.size(); deletedIndex++) {
+        delete alignmentPtrs[deletedIndex];
+        alignmentPtrs[deletedIndex] = NULL;
+      }
+      alignmentPtrs.erase(i + alignmentPtrs.begin(), alignmentPtrs.end());
+      break;
+    }
+    else {
+      if (params.verbosity > 0) {
+        cout << "Keeping alignment " << i << " " << alignmentPtrs[i]->qPos << " " << alignmentPtrs[i]->qLength
+             << " " << alignmentPtrs[i]->tName << " " << alignmentPtrs[i]->tPos << " " << alignmentPtrs[i]->tLength 
+             << " from score: " << alignmentPtrs[i]->score << endl;
+      }
+    }
+  }
+  return alignmentPtrs.size();
+}
+
+int RemoveOverlappingAlignments(vector<T_AlignmentCandidate*> &alignmentPtrs, MappingParameters &params) {
+  vector<unsigned char> alignmentIsContained;
+  alignmentIsContained.resize(alignmentPtrs.size());
+  std::fill(alignmentIsContained.begin(), alignmentIsContained.end(), false);
+
+  int j;
+  int numContained = 0;
+  int curNotContained = 0;
+    
+  if (alignmentPtrs.size() > 0) {
+    UInt i;
+    for (i = 0; i < alignmentPtrs.size()-1; i++ ){
+      T_AlignmentCandidate *aref = alignmentPtrs[i];
+      if (aref->pctSimilarity < params.minPctSimilarity) {
+        continue;
+      }
+      for (j = i + 1; j < int(alignmentPtrs.size()); j++ ){
+        //
+        // Make sure this alignment isn't already removed.
+        //
+        if (alignmentIsContained[j]) {
+          continue;
+        }
+            
+        //
+        // Only check for containment if the two sequences are from the same contig.
+        //
+        if (alignmentPtrs[i]->tIndex != alignmentPtrs[j]->tIndex) {
+          continue;
+        }
+
+        // 
+        // Check for an alignment that is fully overlapping another 
+        // alignment.
+        if (aref->GenomicTBegin() <= alignmentPtrs[j]->GenomicTBegin() and
+            aref->GenomicTEnd() >= alignmentPtrs[j]->GenomicTEnd() and 
+            alignmentPtrs[i]->tIndex == alignmentPtrs[j]->tIndex) {
+          //
+          // Alignment i is contained in j is only true if it has a worse score.
+          //
+          if (aref->score <= alignmentPtrs[j]->score) {
+            alignmentIsContained[j] = true;
+          }
+          if (params.verbosity >= 2) {
+            cout << "alignment " << i << " is contained in " << j << endl;
+            cout << aref->tAlignedSeqPos << " " <<  alignmentPtrs[j]->tAlignedSeqPos << " "
+                 << aref->tAlignedSeqPos + aref->tAlignedSeqLength << " " 
+                 << alignmentPtrs[j]->tAlignedSeqPos + alignmentPtrs[j]->tAlignedSeqLength << endl;
+          }
+        }
+        else if (alignmentPtrs[j]->GenomicTBegin() <= aref->GenomicTBegin() and
+                 alignmentPtrs[j]->GenomicTEnd()   >= aref->GenomicTEnd() and 
+                 alignmentPtrs[i]->tIndex == alignmentPtrs[j]->tIndex) {
+          if (params.verbosity >= 2) {
+            cout << "ALIGNMENT " << j << " is contained in " << i << endl;
+            cout << alignmentPtrs[j]->tAlignedSeqPos << " " <<  aref->tAlignedSeqPos << " "
+                 << alignmentPtrs[j]->tAlignedSeqPos + alignmentPtrs[j]->tAlignedSeqLength << " " 
+                 <<  aref->tAlignedSeqPos + aref->tAlignedSeqLength << endl;
+          }
+          if (alignmentPtrs[j]->score <= aref->score) {
+            alignmentIsContained[i] = true;
+          }
+        }
+      }
+    }
+    for (i = 0; i < alignmentPtrs.size(); i++) {
+      T_AlignmentCandidate *aref = alignmentPtrs[i];
+      if (alignmentIsContained[i]) {
+        delete alignmentPtrs[i];
+        alignmentPtrs[i] = NULL;
+        numContained++;
+      }
+      else {
+        alignmentPtrs[curNotContained] = aref;
+        ++curNotContained;
+      }
+    }
+    alignmentPtrs.resize(alignmentPtrs.size() - numContained);
+  } 
+  return alignmentPtrs.size();
+}
+
+template<typename T_RefSequence, typename T_Sequence>
+void RefineAlignments(vector<T_Sequence*> &bothQueryStrands,
+                      T_RefSequence &genome,
+                      vector<T_AlignmentCandidate*> &alignmentPtrs, MappingParameters &params, MappingBuffers &mappingBuffers) {
+
+  
+  UInt i;
+  for (i = 0; i < alignmentPtrs.size(); i++ ) {
+    RefineAlignment(bothQueryStrands, genome, *alignmentPtrs[i], params, mappingBuffers);
+  }
+  //
+  // It's possible the alignment references change their order after running
+  // the local alignments.  This is made into a parameter rather than resorting
+  // every time so that the performance gain by resorting may be measured.
+  //
+  if (params.sortRefinedAlignments) {
+    std::sort(alignmentPtrs.begin(), alignmentPtrs.end(), SortAlignmentPointersByScore());
+  }
+}
+    
+
+template<typename T_RefSequence, typename T_Sequence>
+void PairwiseLocalAlign(T_Sequence &qSeq, T_RefSequence &tSeq, 
+                        int k, 
+                        MappingParameters &params, T_AlignmentCandidate &alignment, 
+                        MappingBuffers &mappingBuffers,
+                        AlignmentType alignType=Global) {
+  //
+  // Perform a pairwise alignment between qSeq and tSeq, but choose
+  // the pairwise alignment method based on the parameters.  The
+  // options for pairwise alignment are:
+  //  - Affine KBanded alignment: usually used for sequences with no
+  //                              quality information.
+  //  - KBanded alignment: For sequences with quality information.
+  //                       Gaps are scored with quality values.
+  //  
+  QualityValueScoreFunction<DNASequence, FASTQSequence> scoreFn;
+  scoreFn.del = params.indel;
+  scoreFn.ins = params.indel;
+
+  DistanceMatrixScoreFunction<DNASequence, FASTASequence> distScoreFn2(
+          SMRTDistanceMatrix, params.indel, params.indel);
+
+  IDSScoreFunction<DNASequence, FASTQSequence> idsScoreFn;
+  idsScoreFn.ins = params.insertion;
+  idsScoreFn.del = params.deletion;
+  idsScoreFn.substitutionPrior = params.substitutionPrior;
+  idsScoreFn.globalDeletionPrior = params.globalDeletionPrior;
+  idsScoreFn.InitializeScoreMatrix(SMRTDistanceMatrix);
+
+  int kbandScore;
+  int qvAwareScore;
+  if (params.ignoreQualities || qSeq.qual.Empty() || !ReadHasMeaningfulQualityValues(qSeq) ) {
+
+    kbandScore = AffineKBandAlign(qSeq, tSeq, SMRTDistanceMatrix, 
+                                  params.indel+2, params.indel - 3, // homopolymer insertion open and extend
+                                  params.indel+2, params.indel - 1, // any insertion open and extend
+                                  params.indel, // deletion
+                                  k*1.2,
+                                  mappingBuffers.scoreMat, mappingBuffers.pathMat, 
+                                  mappingBuffers.hpInsScoreMat, mappingBuffers.hpInsPathMat,
+                                  mappingBuffers.insScoreMat, mappingBuffers.insPathMat,
+                                  alignment, Global);
+
+    alignment.score = kbandScore;
+    if (params.verbosity >= 2) {
+      cout << "align score: " << kbandScore << endl;
+    }
+  }
+  else {
+
+       
+    if (qSeq.insertionQV.Empty() == false) {
+      qvAwareScore = KBandAlign(qSeq, tSeq, SMRTDistanceMatrix, 
+                                params.indel+2, // ins
+                                params.indel+2, // del
+                                k,
+                                mappingBuffers.scoreMat, mappingBuffers.pathMat,
+                                alignment, idsScoreFn, alignType);
+      if (params.verbosity >= 2) {
+        cout << "ids score fn score: " << qvAwareScore << endl;
+      }
+    }
+    else {
+      qvAwareScore = KBandAlign(qSeq, tSeq, SMRTDistanceMatrix, 
+                                params.indel+2, // ins
+                                params.indel+2, // del
+                                k,
+                                mappingBuffers.scoreMat, mappingBuffers.pathMat,
+                                alignment, scoreFn, alignType);
+      if (params.verbosity >= 2) {
+        cout << "qv score fn score: " << qvAwareScore << endl;
+      }
+    }
+    alignment.sumQVScore = qvAwareScore;
+    alignment.score = qvAwareScore;
+    alignment.probScore = 0;
+  }
+  // Compute stats and assign a default alignment score using an edit distance.
+  ComputeAlignmentStats(alignment, qSeq.seq, tSeq.seq, distScoreFn2);
+
+  if (params.scoreType == 1) {
+    alignment.score = alignment.sumQVScore;
+  }
+  
+}
+
+template<typename T_RefSequence, typename T_Sequence>
+void RefineAlignment(vector<T_Sequence*> &bothQueryStrands,
+                     T_RefSequence &genome,
+                     T_AlignmentCandidate  &alignmentCandidate, MappingParameters &params,
+                     MappingBuffers &mappingBuffers) {
+
+
+  FASTQSequence qSeq;
+  DNASequence   tSeq;
+  DistanceMatrixScoreFunction<DNASequence, FASTQSequence> distScoreFn(
+          SMRTDistanceMatrix, params.deletion, params.insertion);
+
+  DistanceMatrixScoreFunction<DNASequence, FASTQSequence> distScoreFn2(
+          SMRTDistanceMatrix, params.indel, params.indel);
+
+  QualityValueScoreFunction<DNASequence, FASTQSequence> scoreFn;
+  IDSScoreFunction<DNASequence, FASTQSequence> idsScoreFn;
+  idsScoreFn.InitializeScoreMatrix(SMRTDistanceMatrix);
+  scoreFn.del = params.indel;
+  scoreFn.ins = params.indel;
+  idsScoreFn.ins = params.insertion;
+  idsScoreFn.del = params.deletion;
+  idsScoreFn.affineExtend = params.affineExtend;
+  idsScoreFn.affineOpen = params.affineOpen;
+  idsScoreFn.substitutionPrior = params.substitutionPrior;
+  idsScoreFn.globalDeletionPrior = params.globalDeletionPrior;
+
+  if (params.doGlobalAlignment) {
+    SMRTSequence subread;
+    subread.ReferenceSubstring(*bothQueryStrands[0], 
+                               bothQueryStrands[0]->subreadStart,
+                               (bothQueryStrands[0]->subreadEnd - 
+                                bothQueryStrands[0]->subreadStart));
+
+    int drift = ComputeDrift(alignmentCandidate);
+    T_AlignmentCandidate refinedAlignment;
+
+    KBandAlign(subread, alignmentCandidate.tAlignedSeq, SMRTDistanceMatrix, 
+               params.insertion, params.deletion,
+                              drift,
+                              mappingBuffers.scoreMat, mappingBuffers.pathMat,
+                              refinedAlignment, idsScoreFn, Global);
+    refinedAlignment.RemoveEndGaps();
+    ComputeAlignmentStats(refinedAlignment, 
+                          subread.seq, 
+                          alignmentCandidate.tAlignedSeq.seq, 
+                          distScoreFn2);
+                          //idsScoreFn);
+    
+    alignmentCandidate.blocks = refinedAlignment.blocks;
+    alignmentCandidate.gaps   = refinedAlignment.gaps;
+    alignmentCandidate.tPos   = refinedAlignment.tPos;
+    alignmentCandidate.qPos   = refinedAlignment.qPos + bothQueryStrands[0]->subreadStart;
+    alignmentCandidate.score  = refinedAlignment.score;
+    subread.Free();
+  }
+  else if (params.useGuidedAlign) {
+    T_AlignmentCandidate refinedAlignment;
+    int lastBlock = alignmentCandidate.blocks.size() - 1;
+    
+
+    if (alignmentCandidate.blocks.size() > 0) {
+
+      /*
+       * Refine the alignment without expanding past the current
+       * boundaries of the sequences that are already aligned.
+       */
+
+      //
+      // NOTE** this only makes sense when 
+      // alignmentCandidate.blocks[0].tPos == 0. Otherwise the length
+      // of the sequence is not correct.
+      //
+      tSeq.Copy(alignmentCandidate.tAlignedSeq, 
+                alignmentCandidate.tPos,
+                (alignmentCandidate.blocks[lastBlock].tPos + 
+                 alignmentCandidate.blocks[lastBlock].length -
+                 alignmentCandidate.blocks[0].tPos));
+    
+      //      qSeq.ReferenceSubstring(alignmentCandidate.qAlignedSeq,
+      qSeq.ReferenceSubstring(*bothQueryStrands[0],
+                              alignmentCandidate.qAlignedSeqPos + alignmentCandidate.qPos, 
+                              (alignmentCandidate.blocks[lastBlock].qPos +
+                               alignmentCandidate.blocks[lastBlock].length));
+
+
+      if (!params.ignoreQualities && ReadHasMeaningfulQualityValues(alignmentCandidate.qAlignedSeq)) {
+        if (params.affineAlign) {
+            AffineGuidedAlign(qSeq, tSeq, alignmentCandidate, 
+                            idsScoreFn, params.bandSize,
+                            mappingBuffers, 
+                            refinedAlignment, Global, false);
+        }
+        else {
+            GuidedAlign(qSeq, tSeq, alignmentCandidate, 
+                        idsScoreFn, params.guidedAlignBandSize,
+                        mappingBuffers, 
+                        refinedAlignment, Global, false);
+        }
+      }
+      else {
+        if (params.affineAlign) {
+            AffineGuidedAlign(qSeq, tSeq, alignmentCandidate, 
+                              distScoreFn, params.bandSize,
+                            mappingBuffers, 
+                            refinedAlignment, Global, false);
+        }
+        else {
+        GuidedAlign(qSeq, tSeq, alignmentCandidate, 
+                    distScoreFn, params.guidedAlignBandSize,
+                    mappingBuffers,
+                    refinedAlignment, Global, false);
+        }
+      }
+      ComputeAlignmentStats(refinedAlignment, 
+                            qSeq.seq,
+                            tSeq.seq, 
+                            distScoreFn2, params.affineAlign);
+      //
+      // Copy the refine alignment, which may be a subsequence of the
+      // alignmentCandidate into the alignment candidate.  
+      //
+
+      // First copy the alignment block and gap (the description of
+      // the base by base alignment).
+
+      alignmentCandidate.blocks.clear();
+      alignmentCandidate.blocks = refinedAlignment.blocks;
+
+      alignmentCandidate.CopyStats(refinedAlignment);
+
+      alignmentCandidate.gaps   = refinedAlignment.gaps;
+      alignmentCandidate.score  = refinedAlignment.score;
+      alignmentCandidate.nCells = refinedAlignment.nCells;
+
+      // Next copy the information that describes what interval was
+      // aligned.  Since the reference sequences of the alignment
+      // candidate have been modified, they are reassigned.
+      alignmentCandidate.tAlignedSeq.Free();
+      alignmentCandidate.tAlignedSeq.TakeOwnership(tSeq);
+      alignmentCandidate.ReassignQSequence(qSeq);
+      alignmentCandidate.tAlignedSeqPos    += alignmentCandidate.tPos; 
+      alignmentCandidate.qAlignedSeqPos    += alignmentCandidate.qPos;
+
+      //
+      // tPos and qPos are the positions within the interval where the
+      // alignment begins. The refined alignment has adifferent tPos
+      // and qPos from the alignment candidate.
+      alignmentCandidate.tPos = refinedAlignment.tPos;
+      alignmentCandidate.qPos = refinedAlignment.qPos;
+
+      // The lengths of the newly aligned sequences may differ, update those.
+      alignmentCandidate.tAlignedSeqLength = tSeq.length;
+      alignmentCandidate.qAlignedSeqLength = qSeq.length;
+    }
+  }
+  else {
+
+
+    //
+    // This assumes an SDP alignment has been performed to create 'alignmentCandidate'. 
+  
+    //
+    // Recompute the alignment using a banded smith waterman to
+    // get rid of any spurious effects of usign the seeded gaps.
+    //
+
+    //
+    // The k-banded alignment is over a subsequence of the first
+    // (sparse dynamic programming, SDP) alignment.  The SDP
+    // alignment is over a large window that may contain the
+    // candidate sequence.  The k-band alignment is over a tighter
+    // region.  
+
+    int drift = ComputeDrift(alignmentCandidate);
+          
+    //
+    // Rescore the alignment with a banded alignment that has a
+    // better model of sequencing error.
+    //
+
+    if (alignmentCandidate.blocks.size() == 0 ){ 
+      alignmentCandidate.score = 0;
+      return;
+    }
+    int lastBlock = alignmentCandidate.blocks.size() - 1;
+
+    //
+    // Assign the sequences that are going to be realigned using
+    // banded alignment.  The SDP alignment does not give that great
+    // of a score, but it does do a good job at finding a backbone
+    // alignment that closely defines the sequence that is aligned.
+    // Reassign the subsequences for alignment with a tight bound
+    // around the beginning and ending of each sequence, so that
+    // global banded alignment may be performed.
+    //
+  
+    //
+    // This section needs to be cleaned up substantially.  Right now it
+    // copies a substring from the ref to a temp, then from the temp
+    // back to the ref.  It may be possible to just keep one pointer per
+    // read to the memory that was allocated, then allow the seq
+    // parameter to float around.  The reason for all the copying is
+    // that in case there is a compressed version of the genome the
+    // seqences must be transformed before alignment.
+    //
+
+    if (alignmentCandidate.qIsSubstring) {
+      qSeq.ReferenceSubstring(*bothQueryStrands[0],  // the original sequence
+                              alignmentCandidate.qPos + alignmentCandidate.qAlignedSeqPos, 
+                              alignmentCandidate.blocks[lastBlock].qPos + alignmentCandidate.blocks[lastBlock].length);
+    }
+    else {
+      qSeq.ReferenceSubstring(alignmentCandidate.qAlignedSeq, // the subsequence that the alignment points to
+                              alignmentCandidate.qPos  + alignmentCandidate.qAlignedSeqPos, 
+                              alignmentCandidate.blocks[lastBlock].qPos + alignmentCandidate.blocks[lastBlock].length - alignmentCandidate.blocks[0].qPos);
+    }
+      
+    tSeq.Copy(alignmentCandidate.tAlignedSeq, // the subsequence the alignment points to
+              alignmentCandidate.tPos, // ofset into the subsequence
+              alignmentCandidate.blocks[lastBlock].tPos + alignmentCandidate.blocks[lastBlock].length - alignmentCandidate.blocks[0].tPos);
+
+    T_AlignmentCandidate refinedAlignment;
+
+    //
+    // When the parameter bandSize is 0, set the alignment band size
+    // to the drift off the diagonal, plus a little more for wiggle
+    // room.  When the parameteris nonzero, use that as a fixed band.
+    //
+    int k;
+    if (params.bandSize == 0) {
+      k = abs(drift) * 1.5;
+    }
+    else {
+      k = params.bandSize;
+    }
+    if (params.verbosity > 0) {
+      cout << "drift: " << drift << " qlen: " << alignmentCandidate.qAlignedSeq.length << " tlen: " << alignmentCandidate.tAlignedSeq.length << " k: " << k << endl;
+      cout << "aligning in " << k << " * " << alignmentCandidate.tAlignedSeq.length << " " << k * alignmentCandidate.tAlignedSeq.length << endl;
+    }
+    if (k < 10) {
+      k = 10;
+    }
+
+    alignmentCandidate.tAlignedSeqPos    += alignmentCandidate.tPos; 
+    
+    VectorIndex lastSDPBlock = alignmentCandidate.blocks.size() - 1;
+
+    if (alignmentCandidate.blocks.size() > 0) {
+      DNALength prevLength =  alignmentCandidate.tAlignedSeqLength -= alignmentCandidate.tPos;
+      alignmentCandidate.tAlignedSeqLength = (alignmentCandidate.blocks[lastSDPBlock].tPos 
+                                              + alignmentCandidate.blocks[lastSDPBlock].length 
+                                              - alignmentCandidate.blocks[0].tPos);
+    }
+    else {
+      alignmentCandidate.tAlignedSeqLength = 0;
+    }
+
+    alignmentCandidate.tPos              = 0;
+    alignmentCandidate.qAlignedSeqPos    += alignmentCandidate.qPos;
+
+    if (alignmentCandidate.blocks.size() > 0) {
+      DNALength prevLength =  alignmentCandidate.qAlignedSeqLength -= alignmentCandidate.qPos; 
+      alignmentCandidate.qAlignedSeqLength = (alignmentCandidate.blocks[lastSDPBlock].qPos 
+                                              + alignmentCandidate.blocks[lastSDPBlock].length
+                                              - alignmentCandidate.blocks[0].qPos);
+    }
+    else {
+      alignmentCandidate.qAlignedSeqLength = 0;
+    }
+    alignmentCandidate.qPos                = 0;
+
+    alignmentCandidate.blocks.clear();
+    alignmentCandidate.tAlignedSeq.Free();
+    alignmentCandidate.tAlignedSeq.TakeOwnership(tSeq);
+    alignmentCandidate.ReassignQSequence(qSeq);
+
+    if (params.verbosity >= 2) {
+      cout << "refining target: " << endl;
+      alignmentCandidate.tAlignedSeq.PrintSeq(cout);
+      cout << "refining query: " << endl;
+      static_cast<DNASequence*>(&alignmentCandidate.qAlignedSeq)->PrintSeq(cout);
+      cout << endl;
+    }
+    PairwiseLocalAlign(qSeq, tSeq, k, params, alignmentCandidate, mappingBuffers, Fit);
+  }
+}
+
+void AssignRefContigLocation(T_AlignmentCandidate &alignment, SequenceIndexDatabase<FASTQSequence> &seqdb, DNASequence &genome) {
+    //
+    // If the sequence database is used, the start position of
+    // the alignment is relative to the start of the chromosome,
+    // not the entire index.  Subtract off the start position of
+    // the chromosome to get the true position.
+    //
+  DNALength forwardTPos;
+  int seqDBIndex;
+  if (alignment.tStrand == 0) {
+    forwardTPos = alignment.tAlignedSeqPos;
+    seqDBIndex = seqdb.SearchForIndex(forwardTPos);
+    alignment.tAlignedSeqPos -= seqdb.seqStartPos[seqDBIndex];
+  }
+  else {
+    //
+    // Flip coordinates into forward strand in order to find the boundaries 
+    // of the contig, then reverse them in order to find offset.
+    //
+
+    // Find the reverse complement coordinate of the index of the last aligned base.
+    assert(alignment.tAlignedSeqLength > 0);
+    forwardTPos = genome.MakeRCCoordinate(alignment.tAlignedSeqPos + alignment.tAlignedSeqLength - 1);
+    seqDBIndex  = seqdb.SearchForIndex(forwardTPos);
+
+    
+    //
+    // Find the reverse comlement coordinate of the last base of this
+    // sequence.  This would normally be the start of the next contig
+    // -1 to get the length, but since an 'N' is added between every
+    // pair of sequences, this is -2.
+    //
+    DNALength reverseTOffset;
+    reverseTOffset = genome.MakeRCCoordinate(seqdb.seqStartPos[seqDBIndex+1]-2);
+    alignment.tAlignedSeqPos -= reverseTOffset;
+  }
+}
+
+void AssignRefContigLocations(vector<T_AlignmentCandidate*> &alignmentPtrs, SequenceIndexDatabase<FASTQSequence> &seqdb, DNASequence &genome) {
+  
+  UInt i;
+  for (i = 0; i < alignmentPtrs.size(); i++) {
+    T_AlignmentCandidate *aref = alignmentPtrs[i];
+    AssignRefContigLocation(*aref, seqdb, genome);
+  }
+}
+
+
+template<typename T_RefSequence>
+void AssignGenericRefContigName(vector<T_AlignmentCandidate*> &alignmentPtrs, T_RefSequence &genome) {
+  UInt i;
+  for (i = 0; i < alignmentPtrs.size(); i++) {
+    T_AlignmentCandidate *aref = alignmentPtrs[i];
+    aref->tName = genome.title;
+  }
+}
+
+
+template<typename T_Sequence, typename T_RefSequence, typename T_SuffixArray, typename T_TupleCountTable>
+void MapRead(T_Sequence &read, T_Sequence &readRC, T_RefSequence &genome, 
+             T_SuffixArray &sarray, 
+             BWT &bwt,
+             SeqBoundaryFtr<FASTQSequence> &seqBoundary, 
+             T_TupleCountTable &ct,
+             SequenceIndexDatabase<FASTQSequence> &seqdb,
+             MappingParameters &params,
+             MappingMetrics    &metrics,
+             vector<T_AlignmentCandidate*> &alignmentPtrs, 
+             MappingBuffers &mappingBuffers,
+             MappingIPC *mapData) {
+
+  bool matchFound;
+  WeightedIntervalSet topIntervals(params.nCandidates);
+  int numKeysMatched=0, rcNumKeysMatched=0;
+  int expand = params.minExpand;
+  metrics.clocks.total.Tick();
+  int nTotalCells = 0;
+  int forwardNumBasesMatched = 0, reverseNumBasesMatched = 0;
+  do {
+    matchFound = false;
+    mappingBuffers.matchPosList.clear();
+    mappingBuffers.rcMatchPosList.clear();
+    alignmentPtrs.clear();
+    topIntervals.clear();
+    params.anchorParameters.expand = expand;
+
+    metrics.clocks.mapToGenome.Tick();
+    
+    if (params.useSuffixArray) {
+      params.anchorParameters.lcpBoundsOutPtr = mapData->lcpBoundsOutPtr;
+      numKeysMatched   = 
+        MapReadToGenome(genome, sarray, read,   params.lookupTableLength, mappingBuffers.matchPosList,   
+                        params.anchorParameters);
+      
+      //
+      // Only print values for the read in forward direction (and only
+      // the first read). 
+      //
+      mapData->lcpBoundsOutPtr = NULL;
+      if (!params.forwardOnly) {
+        rcNumKeysMatched = 
+          MapReadToGenome(genome, sarray, readRC, params.lookupTableLength, mappingBuffers.rcMatchPosList, 
+                          params.anchorParameters);
+      }
+    }
+    else if (params.useBwt){ 
+      numKeysMatched   = MapReadToGenome(bwt, read, read.subreadStart, read.subreadEnd, 
+                                         mappingBuffers.matchPosList, params.anchorParameters, forwardNumBasesMatched);
+      if (!params.forwardOnly) {
+        rcNumKeysMatched = MapReadToGenome(bwt, readRC, readRC.subreadStart, readRC.subreadEnd, 
+                                           mappingBuffers.rcMatchPosList, params.anchorParameters, reverseNumBasesMatched); 
+      }
+    }
+
+    //
+    // Look to see if only the anchors are printed.
+    if (params.anchorFileName != "") {
+      int i;
+      if (params.nProc > 1) {
+#ifdef __APPLE__
+        sem_wait(semaphores.writer);
+#else
+        sem_wait(&semaphores.writer);
+#endif
+      }
+      *mapData->anchorFilePtr << read.title << endl;
+      for (i = 0; i < mappingBuffers.matchPosList.size(); i++) {
+        *mapData->anchorFilePtr << mappingBuffers.matchPosList[i] << endl;
+      }
+      *mapData->anchorFilePtr << readRC.title << " (RC) " << endl;
+      for (i = 0; i < mappingBuffers.rcMatchPosList.size(); i++) {
+        *mapData->anchorFilePtr << mappingBuffers.rcMatchPosList[i] << endl;
+      }
+      
+      if (params.nProc > 1) {
+#ifdef __APPLE__
+        sem_post(semaphores.writer);
+#else
+        sem_post(&semaphores.writer);
+#endif
+      }
+    }
+
+    metrics.totalAnchors += mappingBuffers.matchPosList.size() + mappingBuffers.rcMatchPosList.size();
+    metrics.clocks.mapToGenome.Tock();
+
+    metrics.clocks.sortMatchPosList.Tick();
+    SortMatchPosList(mappingBuffers.matchPosList);
+    SortMatchPosList(mappingBuffers.rcMatchPosList);
+    metrics.clocks.sortMatchPosList.Tock();
+
+    PValueWeightor lisPValue(read, genome, ct.tm, &ct);
+    MultiplicityPValueWeightor lisPValueByWeight(genome);
+
+    LISSumOfLogPWeightor<T_GenomeSequence,vector<ChainedMatchPos> > lisPValueByLogSum(genome);
+
+    LISSizeWeightor<vector<ChainedMatchPos> > lisWeightFn;
+    
+    IntervalSearchParameters intervalSearchParameters;
+    intervalSearchParameters.globalChainType = params.globalChainType;
+    intervalSearchParameters.advanceHalf = params.advanceHalf;
+    intervalSearchParameters.warp        = params.warp;
+    intervalSearchParameters.fastMaxInterval = params.fastMaxInterval;
+    intervalSearchParameters.aggressiveIntervalCut = params.aggressiveIntervalCut;
+    intervalSearchParameters.verbosity = params.verbosity;
+
+    //
+    // If specified, only align a band from the anchors.
+    //
+    DNALength squareRefLength = read.length * 1.25 + params.limsAlign;    
+    if (params.limsAlign != 0) {
+      int fi;
+      for (fi = 0; fi < mappingBuffers.matchPosList.size(); fi++) {
+        if (mappingBuffers.matchPosList[fi].t >= squareRefLength) { break; }
+      }
+      if (fi < mappingBuffers.matchPosList.size()) {
+        mappingBuffers.matchPosList.resize(fi);
+      }
+    }
+
+    metrics.clocks.findMaxIncreasingInterval.Tick();
+    
+    //
+    // For now say that something that has a 50% chance of happening
+    // by chance is too high of a p value. This is probably many times
+    // the size.
+    //
+    intervalSearchParameters.maxPValue = log(0.5); 
+    intervalSearchParameters.aboveCategoryPValue = -300;
+    VarianceAccumulator<float> accumPValue;
+    VarianceAccumulator<float> accumWeight;
+    VarianceAccumulator<float> accumNBases;
+
+    mappingBuffers.clusterList.Clear(); 
+    mappingBuffers.revStrandClusterList.Clear();
+
+    //
+    // Remove anchors that are fully encompassed by longer ones.  This
+    // speeds up limstemplate a lot.
+    //
+
+    RemoveOverlappingAnchors(mappingBuffers.matchPosList);
+    RemoveOverlappingAnchors(mappingBuffers.rcMatchPosList);
+
+    if (params.pValueType == 0) {
+      int original = mappingBuffers.matchPosList.size();
+
+      int numMerged = 0;
+      if (params.printDotPlots) {
+        ofstream dotPlotOut;
+        string dotPlotName = string(read.title) + ".anchors";
+        CrucialOpen(dotPlotName, dotPlotOut, std::ios::out);
+        int mp;
+        for (mp = 0; mp < mappingBuffers.matchPosList.size(); mp++ ){
+          dotPlotOut << mappingBuffers.matchPosList[mp].q << " " << mappingBuffers.matchPosList[mp].t << " " << mappingBuffers.matchPosList[mp].l << " " << endl;
+        }
+        dotPlotOut.close();
+      }
+      /*
+        This is an optimization that is being tested out that places a grid over the
+        area where there are anchors, and then finds an increasing maximally weighted
+        path through the grid.  The weight of a cell in the grid is the sum of the
+        number of anchors in it.  All other anchors are to be removed.  This will likely
+        only work for LIMSTemplate sequences, or other sequences with little structural
+        variation.
+         FindBand(mappingBuffers.matchPosList,
+               refCopy, read, 100);
+      */
+      FindMaxIncreasingInterval(Forward,
+                                mappingBuffers.matchPosList,
+                                // allow for indels to stretch out the mapping of the read.
+                                (DNALength) ((read.subreadEnd - read.subreadStart) * (1 + params.indelRate)), params.nCandidates,
+                                seqBoundary,
+                                lisPValue,//lisPValue2,
+                                lisWeightFn,
+                                topIntervals, genome, read, intervalSearchParameters,
+                                &mappingBuffers.globalChainEndpointBuffer, 
+                                mappingBuffers.clusterList,
+                                accumPValue, accumWeight, accumNBases, read.title);
+      // Uncomment when the version of the weight functor needs the sequence.
+      
+      mappingBuffers.clusterList.ResetCoordinates();
+
+      FindMaxIncreasingInterval(Reverse, mappingBuffers.rcMatchPosList,
+                                (DNALength) ((read.subreadEnd - read.subreadStart) * (1 + params.indelRate)), params.nCandidates, 
+                                seqBoundary,
+                                lisPValue,//lisPValue2
+                                lisWeightFn,
+                                topIntervals, genome, readRC, intervalSearchParameters,
+                                &mappingBuffers.globalChainEndpointBuffer,
+                                mappingBuffers.revStrandClusterList,
+                                accumPValue, accumWeight, accumNBases, read.title);
+    }
+    else if (params.pValueType == 1) {
+      FindMaxIncreasingInterval(Forward,
+                                mappingBuffers.matchPosList,
+                                // allow for indels to stretch out the mapping of the read.
+                                (DNALength) ((read.subreadEnd - read.subreadStart) * (1 + params.indelRate)), params.nCandidates,
+                                seqBoundary,
+                                lisPValueByWeight, // different from pvaltype == 2 and 0
+                                lisWeightFn,
+                                topIntervals, genome, read, intervalSearchParameters,
+                                &mappingBuffers.globalChainEndpointBuffer,
+                                mappingBuffers.clusterList,
+                                accumPValue, accumWeight, accumNBases,
+                                read.title);
+
+
+      mappingBuffers.clusterList.ResetCoordinates();      
+      FindMaxIncreasingInterval(Reverse, mappingBuffers.rcMatchPosList,
+                                (DNALength) ((read.subreadEnd - read.subreadStart) * (1 + params.indelRate)), params.nCandidates, 
+                                seqBoundary,
+                                lisPValueByWeight, // different from pvaltype == 2 and 0
+                                lisWeightFn,
+                                topIntervals, genome, readRC, intervalSearchParameters,
+                                &mappingBuffers.globalChainEndpointBuffer,
+                                mappingBuffers.revStrandClusterList,
+                                accumPValue, accumWeight, accumNBases,
+                                read.title);
+    }
+    else if (params.pValueType == 2) {
+      FindMaxIncreasingInterval(Forward,
+                                mappingBuffers.matchPosList,
+                                // allow for indels to stretch out the mapping of the read.
+                                (DNALength) ((read.subreadEnd - read.subreadStart) * (1 + params.indelRate)), params.nCandidates,
+                                seqBoundary,
+                                lisPValueByLogSum, // different from pvaltype == 1 and 0
+                                lisWeightFn,
+                                topIntervals, genome, read, intervalSearchParameters,
+                                &mappingBuffers.globalChainEndpointBuffer,
+                                mappingBuffers.clusterList,
+                                accumPValue, accumWeight, accumNBases,
+                                read.title);
+
+      mappingBuffers.clusterList.ResetCoordinates();      
+      FindMaxIncreasingInterval(Reverse, mappingBuffers.rcMatchPosList,
+                                (DNALength) ((read.subreadEnd - read.subreadStart) * (1 + params.indelRate)), params.nCandidates, 
+                                seqBoundary,
+                                lisPValueByLogSum, // different from pvaltype == 1 and 0
+                                lisWeightFn,
+                                topIntervals, genome, readRC, intervalSearchParameters,
+                                &mappingBuffers.globalChainEndpointBuffer,
+                                mappingBuffers.revStrandClusterList,
+                                accumPValue, accumWeight, accumNBases,
+                                read.title);
+    }
+
+    mappingBuffers.clusterList.numBases.insert(mappingBuffers.clusterList.numBases.end(),
+                                               mappingBuffers.revStrandClusterList.numBases.begin(),
+                                               mappingBuffers.revStrandClusterList.numBases.end());
+
+    mappingBuffers.clusterList.numAnchors.insert(mappingBuffers.clusterList.numAnchors.end(),
+                                                 mappingBuffers.revStrandClusterList.numAnchors.begin(),
+                                                 mappingBuffers.revStrandClusterList.numAnchors.end());
+    
+    metrics.clocks.findMaxIncreasingInterval.Tock();    
+
+    //
+    // Print verbose output.
+    //
+    WeightedIntervalSet::iterator topIntIt, topIntEnd;
+    topIntEnd = topIntervals.end();
+    if (params.verbosity > 0) {
+      int topintind = 0;
+      cout << " intv: index start end qstart qend seq_boundary_start seq_boundary_end pvalue " << endl;
+      for (topIntIt = topIntervals.begin();topIntIt != topIntEnd ; ++topIntIt) {
+        cout << " intv: " << topintind << " " << (*topIntIt).start << " " 
+             << (*topIntIt).end << " " 
+             << (*topIntIt).qStart << " " << (*topIntIt).qEnd << " "
+             << seqBoundary((*topIntIt).start) << " " << seqBoundary((*topIntIt).end) << " "
+             << (*topIntIt).pValue << endl;
+        if (params.verbosity > 2) {
+          int m;
+          for (m = 0; m < (*topIntIt).matches.size(); m++) {
+            cout << " (" << (*topIntIt).matches[m].q << ", " << (*topIntIt).matches[m].t << ", " << (*topIntIt).matches[m].l << ") ";
+          }
+          cout << endl;
+        }
+        ++topintind;
+      }
+    }
+
+    //
+    // Allocate candidate alignments on the stack.  Each interval is aligned.
+    //
+    alignmentPtrs.resize(topIntervals.size());
+    UInt i;
+    for (i = 0; i < alignmentPtrs.size(); i++ ) {
+      alignmentPtrs[i] = new T_AlignmentCandidate;
+    }
+    metrics.clocks.alignIntervals.Tick();
+    AlignIntervals( genome, read, readRC,
+                    topIntervals,
+                    SMRTDistanceMatrix,
+                    params.indel, params.indel, 
+                    params.sdpTupleSize, 
+                    params.useSeqDB, seqdb,
+                    alignmentPtrs,
+                    params,
+                    mappingBuffers,
+                    params.startRead );
+
+    /*    cout << read.title << endl;
+    for (i = 0; i < alignmentPtrs.size(); i++) {
+      cout << alignmentPtrs[i]->clusterScore << " " << alignmentPtrs[i]->score << endl;
+    }
+    */
+    StoreRankingStats(alignmentPtrs, accumPValue, accumWeight);
+
+    std::sort(alignmentPtrs.begin(), alignmentPtrs.end(), SortAlignmentPointersByScore());
+    metrics.clocks.alignIntervals.Tock();
+
+    //
+    // Evalutate the matches that are found for 'good enough'.
+    //
+      
+    matchFound = CheckForSufficientMatch(read, alignmentPtrs, params);
+      
+    //
+    // When no proper alignments are found, the loop will resume.
+    // Delete all alignments because they are bad.
+    // 
+    if (expand < params.maxExpand and matchFound == false) {
+      DeleteAlignments(alignmentPtrs, 0);
+    }
+
+    //
+    // Record some metrics that show how long this took to run per base.
+    //
+
+    if (alignmentPtrs.size() > 0) {
+      metrics.RecordNumAlignedBases(read.length);
+      metrics.RecordNumCells(alignmentPtrs[0]->nCells);
+    }
+
+    if (matchFound == true) {
+      metrics.totalAnchorsForMappedReads += mappingBuffers.matchPosList.size() + mappingBuffers.rcMatchPosList.size();
+    }
+    ++expand;
+  } while ( expand <= params.maxExpand and matchFound == false);
+  metrics.clocks.total.Tock();
+  UInt i;
+  int totalCells = 0;
+  for (i = 0; i< alignmentPtrs.size(); i++) {
+    totalCells += alignmentPtrs[i]->nCells;
+  }
+  metrics.clocks.AddCells(totalCells);
+  int totalBases = 0;
+  for (i = 0; i < alignmentPtrs.size(); i++) {
+    totalBases += alignmentPtrs[i]->qLength;
+  }
+  metrics.clocks.AddBases(totalBases);
+  //
+  //  Some of the alignments are to spurious regions. Delete the
+  //  references that have too small of a score.
+  //
+
+  int effectiveReadLength = 0;
+  for (i = 0; i< read.length; i++) {
+    if (read.seq[i] != 'N') effectiveReadLength++;
+  }
+  if (params.sdpFilterType == 0) {
+    RemoveLowQualityAlignments(read, alignmentPtrs, params);
+  }
+  else if (params.sdpFilterType == 1) {
+    RemoveLowQualitySDPAlignments(effectiveReadLength, alignmentPtrs, params);
+  }
+
+  //
+  // Now remove overlapping alignments.
+  //
+
+  vector<T_Sequence*> bothQueryStrands;
+  bothQueryStrands.resize(2);
+  bothQueryStrands[Forward] = &read;
+  bothQueryStrands[Reverse] = &readRC;
+
+
+  //
+  // Possibly use banded dynamic programming to refine the columns
+  // of an alignment and the alignment score.
+  //
+  if (params.refineAlignments) {
+    RefineAlignments(bothQueryStrands, genome, alignmentPtrs, params, mappingBuffers);
+    RemoveLowQualityAlignments(read,alignmentPtrs,params);
+    RemoveOverlappingAlignments(alignmentPtrs, params);
+  }
+
+  if (params.forPicard) {
+    int a;
+    for (a = 0; a < alignmentPtrs.size(); a++ ) {
+      alignmentPtrs[a]->OrderGapsByType();
+    }
+  }
+  
+  //
+  // Look to see if the number of anchors found for this read match
+  // what is expected given the expected distribution of number of
+  // anchors.  
+  //
+
+  if (alignmentPtrs.size() > 0) {
+    int clusterIndex;
+    //
+    // Compute some stats on the read.  For now this is fixed but will
+    // be updated on the fly soon.
+    //
+    float meanAnchorBasesPerRead, sdAnchorBasesPerRead;
+    float meanAnchorsPerRead, sdAnchorsPerRead;
+
+    int lookupValue;
+    //
+    // If a very short anchor size was used, or very long min match
+    // size there may be no precomputed distributions for it.
+    // Handle this by bounding the min match by the smallest and
+    // largest values for which there are precomputed statistics.
+    
+    int boundedMinWordMatchLength = min(max(params.minMatchLength, anchorMinKValues[0]), anchorMinKValues[1]);
+
+    //
+    // Do a similar bounding for match length and accuracy.
+    //
+    int boundedMatchLength  = min(max((int) alignmentPtrs[0]->qAlignedSeq.length, anchorReadLengths[0]), anchorReadLengths[1]);
+    int boundedPctSimilarity = min(max((int)alignmentPtrs[0]->pctSimilarity, anchorReadAccuracies[0]), anchorReadAccuracies[1]);
+
+    lookupValue = LookupAnchorDistribution(boundedMatchLength, boundedMinWordMatchLength, boundedPctSimilarity,
+                                           meanAnchorsPerRead, sdAnchorsPerRead, meanAnchorBasesPerRead, sdAnchorBasesPerRead);
+    
+    float minExpAnchors = meanAnchorsPerRead -  sdAnchorsPerRead;
+    //
+    // The number of standard deviations is just trial and error. 
+    float minExpAnchorBases = meanAnchorBasesPerRead -  2 * sdAnchorBasesPerRead;
+    if (lookupValue < 0 or minExpAnchorBases < 0) {
+      minExpAnchorBases = 0;
+    }
+    int numSignificantClusters = 0;
+    int totalSignificantClusterSize = 0;
+    int maxClusterSize = 0;
+    int maxClusterIndex = 0;
+    int numAlnAnchorBases, numAlnAnchors, scaledMaxClusterSize;
+    alignmentPtrs[0]->ComputeNumAnchors(boundedMinWordMatchLength, numAlnAnchors, numAlnAnchorBases);
+    int totalAnchorBases = 0;
+    if (numAlnAnchorBases > meanAnchorBasesPerRead + sdAnchorBasesPerRead) {
+      numSignificantClusters = 1;
+    }
+    else {
+      if (alignmentPtrs[0]->score < params.maxScore) {
+        for (clusterIndex = 0; clusterIndex < mappingBuffers.clusterList.numBases.size(); clusterIndex++) {
+          if (mappingBuffers.clusterList.numBases[clusterIndex] > maxClusterSize) {
+            maxClusterSize = mappingBuffers.clusterList.numBases[clusterIndex];
+            maxClusterIndex = clusterIndex;
+          }
+        }        
+        int scaledExpectedClusterSize = maxClusterSize / ((float)numAlnAnchorBases) * minExpAnchorBases;
+        for (clusterIndex = 0; clusterIndex < mappingBuffers.clusterList.numBases.size(); clusterIndex++) {
+          bool isSignificant = false;
+          if (mappingBuffers.clusterList.numBases[clusterIndex] >= scaledExpectedClusterSize) {
+            //          cout << mappingBuffers.clusterList.numBases[clusterIndex] << " " << scaledExpectedClusterSize << " " << meanAnchorBasesPerRead << " " << sdAnchorBasesPerRead << endl;
+            ++numSignificantClusters;
+            totalSignificantClusterSize += meanAnchorBasesPerRead;
+            isSignificant = true;
+          }
+          //
+          // The following output block is useful in debugging mapqv
+          // calculation.   It should be uncommented and examined when
+          // mapqvs do not look correct.
+          //
+          totalAnchorBases +=  mappingBuffers.clusterList.numBases[clusterIndex];
+        }
+      }
+
+      if (lookupValue == 0) {
+        int scaledMaxClusterSize;
+        alignmentPtrs[0]->ComputeNumAnchors(params.minMatchLength, numAlnAnchors, numAlnAnchorBases);
+        scaledMaxClusterSize = (  ((float)numAlnAnchorBases )/ meanAnchorBasesPerRead) * maxClusterSize;
+      }
+    }
+
+    for (i = 0; i < alignmentPtrs.size(); i++) {
+      alignmentPtrs[i]->numSignificantClusters = numSignificantClusters;
+    }
+    if (mapData->clusterFilePtr != NULL and topIntervals.size() > 0 and alignmentPtrs.size() > 0) {
+      WeightedIntervalSet::iterator intvIt = topIntervals.begin();
+      if (params.nProc > 1) {
+#ifdef __APPLE__
+        sem_wait(semaphores.hitCluster); 
+#else
+        sem_wait(&semaphores.hitCluster); 
+#endif
+      }
+
+      *mapData->clusterFilePtr << (*intvIt).size << " " << (*intvIt).pValue << " " << (*intvIt).nAnchors << " " 
+                               << read.length << " " << alignmentPtrs[0]->score << " " << alignmentPtrs[0]->pctSimilarity << " " 
+                               << " " << minExpAnchors << " " << alignmentPtrs[0]->qAlignedSeq.length << endl;
+
+      if (params.nProc > 1) {      
+#ifdef __APPLE__
+        sem_post(semaphores.hitCluster);    
+#else
+        sem_post(&semaphores.hitCluster);    
+#endif
+      }
+    }
+
+  }
+
+
+  //
+  // Assign the query name and strand for each alignment.
+  //
+
+  for (i = 0; i < alignmentPtrs.size(); i++) { 
+    T_AlignmentCandidate *aref = alignmentPtrs[i];
+    //    aref->qStrand = aref->readIndex;
+    if (aref->tStrand == 0) {
+      aref->qName = read.GetName();
+    }
+    else {
+      aref->qName = readRC.GetName();
+    }
+  }
+
+  AssignRefContigLocations(alignmentPtrs, seqdb, genome);
+}
+
+
+void SumMismatches(SMRTSequence &read,
+                   T_AlignmentCandidate &alignment,
+                   int mismatchScore,
+                   int fullIntvStart, int fullIntvEnd,
+                   int &sum) {
+  int alnStart, alnEnd;
+  alignment.GetQIntervalOnForwardStrand(alnStart, alnEnd);
+  int p;
+  sum = 0;
+  if (read.substitutionQV.Empty() == false) {
+    for (p = fullIntvStart; p < alnStart; p++) {
+      sum += read.substitutionQV[p];
+    }
+    for (p = alnEnd; p < fullIntvEnd; p++) {
+      sum += read.substitutionQV[p];
+    }
+  } else {
+      // bug 24363, compute mismatch score when QV is not available.
+      sum += mismatchScore * ((alnStart - fullIntvStart) + (fullIntvEnd - alnEnd));
+  }
+}
+
+int FindMaxLengthAlignment(vector<T_AlignmentCandidate*> alignmentPtrs,
+                           int &maxLengthIndex) {
+  int i;
+  int maxLength = 0;
+  maxLengthIndex = -1;
+
+  for (i = 0; i < int(alignmentPtrs.size()); i++) {
+    int qStart, qEnd;
+    alignmentPtrs[i]->GetQInterval(qStart, qEnd);
+    if (qEnd - qStart > maxLength) {
+      maxLengthIndex = i;
+      maxLength = qEnd - qStart;
+    }
+  }
+  return (maxLength != -1);
+}
+
+bool AlignmentsOverlap(T_AlignmentCandidate &alnA, T_AlignmentCandidate &alnB, float minPercentOverlap) {
+  int alnAStart, alnAEnd, alnBStart, alnBEnd;
+  bool useForwardStrand=true;
+  alnA.GetQInterval(alnAStart, alnAEnd, useForwardStrand);
+  alnB.GetQInterval(alnBStart, alnBEnd, useForwardStrand);
+  // Look if one alignment encompasses the other
+  int ovp = 0;
+  if (alnAStart <= alnBStart and alnAEnd >= alnBEnd) {
+      return true;
+  }
+  else if (alnBStart <= alnAStart and alnBEnd >= alnAEnd) {
+      return true;
+      //ovp = alnAEnd - alnAStart;
+  }
+  else {
+    //
+    // Look to see if the alignments overlap
+    //
+
+    if (alnAEnd >= alnBStart and alnAEnd <= alnBEnd) {
+      ovp = alnAEnd - alnBStart;
+    }
+    else if (alnAStart >= alnBStart and alnAStart <= alnBEnd) {
+      ovp = alnBEnd - alnAStart;
+    }
+  }
+  
+  // float ovpPercent = (2.0*ovp) / ((alnAEnd - alnAStart) + (alnBEnd - alnBStart));
+  float ovpPercent = 0;
+  if (alnAEnd - alnAStart > 0 and alnBEnd - alnBStart > 0) {
+      // overlap percentage: maximum overlap percent in A and B.
+      ovpPercent = max(float(ovp)/float(alnAEnd - alnAStart), 
+                       float(ovp)/float(alnBEnd - alnBStart));
+  }
+
+  // returns true when an overlap is found.
+  return (ovpPercent > minPercentOverlap);
+}
+
+
+void PartitionOverlappingAlignments(vector<T_AlignmentCandidate*> &alignmentPtrs,
+                                    vector<set<int> > &partitions,
+                                    float minOverlap) {
+  if (alignmentPtrs.size() == 0) {
+    partitions.clear();
+    return;
+  }
+
+  set<int>::iterator setIt, setEnd;
+  int i, p;
+  bool overlapFound = false;
+  for (i = 0; i < int(alignmentPtrs.size()); i++) {
+    overlapFound = false;
+    for (p = 0; p < int(partitions.size()) and overlapFound == false; p++) {
+      setEnd = partitions[p].end();
+      for (setIt = partitions[p].begin(); setIt != partitions[p].end() and overlapFound == false; ++setIt) {
+        if (AlignmentsOverlap(*alignmentPtrs[i], *alignmentPtrs[*setIt], minOverlap) or
+            ((alignmentPtrs[i]->QAlignStart() <= alignmentPtrs[*setIt]->QAlignStart()) and
+            (alignmentPtrs[i]->QAlignEnd()  > alignmentPtrs[*setIt]->QAlignEnd()))) {
+          partitions[p].insert(i);
+          overlapFound = true;
+        }
+      }
+    }
+    // 
+    // If this alignment does not overlap any other, create a
+    // partition with it as the first element.
+    //
+    if (overlapFound == false) {
+      partitions.push_back(set<int>());
+      partitions[partitions.size()-1].insert(i);
+    }
+  }
+}
+
+void ScaleMapQVByClusterSize(T_AlignmentCandidate &alignment, MappingParameters &params) {
+  if (alignment.numSignificantClusters > int(params.nCandidates)) {
+    alignment.mapQV = Phred((1-InversePhred(alignment.mapQV))* ((float)params.nCandidates / alignment.numSignificantClusters));
+  }
+  else if (alignment.numSignificantClusters == 0) {
+    alignment.mapQV = 0;
+  }
+}
+
+void StoreMapQVs(SMRTSequence &read,
+                 vector<T_AlignmentCandidate*> &alignmentPtrs, 
+                 MappingParameters &params) {
+  
+  //
+  // Only weight alignments for mapqv against eachother if they are overlapping.
+  //
+  int a;
+  vector<set<int> > partitions; // Each set contains alignments that overlap on the read.
+  DistanceMatrixScoreFunction<DNASequence, FASTQSequence> distScoreFn;
+  distScoreFn.del = params.deletion;
+  distScoreFn.ins = params.insertion;
+  // bug 24363, set affineOpen and affineExtend for distScoreFn
+  distScoreFn.affineOpen = params.affineOpen; 
+  distScoreFn.affineExtend = params.affineExtend;
+  distScoreFn.InitializeScoreMatrix(SMRTLogProbMatrix);
+  IDSScoreFunction<DNASequence, FASTQSequence> idsScoreFn;
+  idsScoreFn.ins = params.insertion;
+  idsScoreFn.del = params.deletion;
+  idsScoreFn.affineExtend = params.affineExtend;
+  idsScoreFn.affineOpen = params.affineOpen;
+  idsScoreFn.substitutionPrior = params.substitutionPrior;
+  idsScoreFn.globalDeletionPrior = params.globalDeletionPrior;
+
+  //
+  // Rescore the alignment so that it uses probabilities. 
+  //
+  for (a = 0; a < int(alignmentPtrs.size()); a++) {
+    if (params.ignoreQualities == false) {
+      // bug 24363, pass -affineAlign to compute correct alignment score.
+      alignmentPtrs[a]->probScore = -ComputeAlignmentScore(*alignmentPtrs[a],
+                                                          alignmentPtrs[a]->qAlignedSeq,
+                                                          alignmentPtrs[a]->tAlignedSeq,
+                                                          idsScoreFn,
+                                                          params.affineAlign) / 10.0;
+    }
+    else {
+      alignmentPtrs[a]->probScore = -ComputeAlignmentScore(*alignmentPtrs[a],
+                                                           alignmentPtrs[a]->qAlignedSeq,
+                                                           alignmentPtrs[a]->tAlignedSeq,
+                                                           distScoreFn,
+                                                           params.affineAlign) / 10.0;
+    }
+  }
+  PartitionOverlappingAlignments(alignmentPtrs, partitions, params.minFractionToBeConsideredOverlapping);
+  
+  int p;
+  set<int>::iterator partIt, partEnd;
+  
+  //
+  // For each partition, store where on the read it begins, and where
+  // it ends. 
+  //
+  vector<int> partitionBeginPos, partitionEndPos;
+  partitionBeginPos.resize(partitions.size());
+  partitionEndPos.resize(partitions.size());
+  fill(partitionBeginPos.begin(), partitionBeginPos.end(), -1);
+  fill(partitionEndPos.begin(), partitionEndPos.end(), -1);
+  vector<char> assigned;
+  assigned.resize( alignmentPtrs.size());
+  fill(assigned.begin(), assigned.end(), false);
+                   
+  for (p = 0; p < int(partitions.size()); p++) {
+    partEnd = partitions[p].end();
+    int alnStart, alnEnd;
+
+    if (partitions[p].size() > 0) {
+      partIt = partitions[p].begin();
+      alignmentPtrs[*partIt]->GetQInterval(alnStart, alnEnd);
+      partitionBeginPos[p] = alnStart; 
+      partitionEndPos[p]   = alnEnd;
+      ++partIt;
+      partEnd = partitions[p].end();
+      for (; partIt != partEnd; ++partIt) {
+        //  Comment out because all reads are now in the forward strand.
+        //  alignmentPtrs[*partIt]->GetQInterval(alnStart, alnEnd, convertToForwardStrand);
+        alignmentPtrs[*partIt]->GetQInterval(alnStart, alnEnd);
+        if (alnEnd - alnStart > partitionEndPos[p] - partitionBeginPos[p]) {
+          partitionBeginPos[p] = alnStart;
+          partitionEndPos[p]   = alnEnd;
+        }
+      }
+    }
+  }
+  
+  //
+  // For each partition, determine the widest parts of the read that
+  // are aligned in the partition.  All alignments will be extended to
+  // the end of the widest parts of the partition.
+  //
+  const static bool convertToForwardStrand = true;
+
+  UInt i; 
+
+  //
+  // For now, just use the alignment score as the probability score.
+  // Although it is possible to use the full forward probability, for
+  // the most part it is pretty much the same as the Vitterbi
+  // probability, but it takes a lot longer to compute.
+  //
+
+  //
+  // Now estimate what the alignment scores would be if they were
+  // extended past the ends of their current alignment.
+  //
+
+  for (p = 0; p < int(partitions.size()); p++) {
+    partEnd = partitions[p].end();
+    int alnStart, alnEnd;
+    for (partIt = partitions[p].begin(); partitions[p].size() > 0 and partIt != partEnd; ++partIt) {
+      int mismatchSum = 0;
+      alignmentPtrs[*partIt]->GetQInterval(alnStart, alnEnd, convertToForwardStrand);
+      if (alnStart - partitionBeginPos[p] > MAPQV_END_ALIGN_WIGGLE or
+          partitionEndPos[p] - alnEnd > MAPQV_END_ALIGN_WIGGLE) {
+          // bug 24363, use updated SumMismatches to compute mismatch score when 
+          // no QV is available.
+        SumMismatches(read, *alignmentPtrs[*partIt], 15,
+                      partitionBeginPos[p], partitionEndPos[p], mismatchSum);
+      }
+      //
+      // Random sequence can be aligned with about 50% similarity due
+      // to optimization, so weight the qv sum 
+      //
+      alignmentPtrs[*partIt]->probScore += -(mismatchSum) * 0.5;
+    }
+  }
+
+  //                                           
+  // Determine mapqv by summing qvscores in partitions
+
+  float mapQVDenominator = 0;
+  for (p = 0; p < int(partitions.size()); p++) {
+    set<int>::iterator nextIt;
+    if (partitions[p].size() == 0) {
+      continue;
+    }
+    int index = *partitions[p].begin();
+
+    mapQVDenominator = alignmentPtrs[index]->probScore;
+
+    if (partitions[p].size() > 1) {
+      partIt  = partitions[p].begin();
+      partEnd = partitions[p].end();
+      ++partIt;
+
+      for (; partIt != partEnd; ++partIt) {
+        index = *partIt;
+        mapQVDenominator = LogSumOfTwo(mapQVDenominator, alignmentPtrs[index]->probScore);
+      }
+    }
+    
+    
+    for (partIt = partitions[p].begin(); 
+         partIt != partitions[p].end(); ++partIt) {
+      //
+      // If only one alignment is found, assume maximum mapqv.
+      //
+      assigned[*partIt] = true;
+      if (partitions[p].size() == 1) {
+        alignmentPtrs[*partIt]->mapQV = MAX_PHRED_SCORE;
+      }
+      
+      //
+      // Look for overflow.
+      //
+      else if (alignmentPtrs[*partIt]->probScore - mapQVDenominator < -20) {
+        alignmentPtrs[*partIt]->mapQV = 0;
+      }
+      else {
+        double log10 = log(10);
+        double sub   = alignmentPtrs[*partIt]->probScore - mapQVDenominator;
+        double expo = exp(log10*sub);
+        double diff = 1.0 - expo;
+        int phredValue;
+        
+        if (expo == 0) {
+          phredValue = 0;
+        }
+        else if (diff == 0) {
+          phredValue = MAX_PHRED_SCORE;
+        }
+        else {
+          phredValue = Phred(diff);
+        }
+        if (phredValue > MAX_PHRED_SCORE) {
+          phredValue = MAX_PHRED_SCORE;
+        }
+        
+        alignmentPtrs[*partIt]->mapQV = phredValue;
+        assigned[*partIt]=true;
+      }
+
+      if (params.scaleMapQVByNumSignificantClusters) {
+        ScaleMapQVByClusterSize(*alignmentPtrs[*partIt], params);
+      }
+    }
+  }
+
+  for (i = 0; i < assigned.size(); i++) {
+    assert(assigned[i]);
+  }
+}
+
+//
+// The full read is not the subread, and does not have masked off characters.
+//
+void PrintAlignment(T_AlignmentCandidate &alignment, SMRTSequence &fullRead, MappingParameters &params, AlignmentContext &alignmentContext, ostream &outFile, BamWriter * bamWriterPtr) {
+    /*
+  if (alignment.score > params.maxScore) {
+		if (params.verbosity > 0) {
+			cout << "Not using " << alignment.qAlignedSeqPos << " " << alignment.tAlignedSeqPos << " because score: " << alignment.score << " is too low (" << params.maxScore  << ")" << endl;
+		}
+    return;
+  }
+  if (alignment.pctSimilarity < params.minPctSimilarity) {
+		if (params.verbosity > 0) {
+			cout << "Not using " << alignment.qAlignedSeqPos << " " << alignment.tAlignedSeqPos << " because identity: " << alignment.pctSimilarity << " is too low (" << params.minPctIdentity  << ")" << endl;
+		}
+    return;
+  }
+  if (alignment.tAlignedSeq.length < params.minAlnLength) {
+        if (params.verbosity > 0) {
+			cout << "Not using " << alignment.qAlignedSeqPos << " " << alignment.tAlignedSeqPos << " because length: " << alignment.tAlignedSeq.length << " is too short (" << params.minAlnLength  << ")" << endl;
+		}
+		return;
+  }*/
+
+  try {
+    int lastBlock = alignment.blocks.size() - 1;
+    if (params.printFormat == StickPrint) {
+      PrintAlignmentStats(alignment, outFile);
+      StickPrintAlignment(alignment,
+                          (DNASequence&) alignment.qAlignedSeq,
+                          (DNASequence&) alignment.tAlignedSeq,
+                          outFile,
+                          alignment.qAlignedSeqPos, alignment.tAlignedSeqPos);
+    }
+    else if (params.printFormat == SAM) {
+      SAMOutput::PrintAlignment(alignment, fullRead, outFile, alignmentContext, params.samQVList, params.clipping, params.cigarUseSeqMatch);
+    }
+    else if (params.printFormat == BAM) {
+#ifdef USE_PBBAM
+      BAMOutput::PrintAlignment(alignment, fullRead, *bamWriterPtr, alignmentContext, params.samQVList, params.clipping, params.cigarUseSeqMatch);
+#else
+      REQUIRE_PBBAM_ERROR();
+#endif
+    }
+    else if (params.printFormat == CompareXML) {
+        XMLOutput::Print(alignment,
+                         (DNASequence&) alignment.qAlignedSeq, (DNASequence&) alignment.tAlignedSeq,
+                         outFile,
+                         alignment.qAlignedSeqPos, alignment.tAlignedSeqPos);
+    }
+    else if (params.printFormat == Vulgar) {
+      PrintAlignmentStats(alignment, outFile);
+      VulgarOutput::Print(alignment, outFile);
+    }
+    else if (params.printFormat == CompareSequencesParsable) {
+        CompareSequencesOutput::Print(alignment, alignment.qAlignedSeq, alignment.tAlignedSeq, outFile);
+    }
+    else if (params.printFormat == Interval) {
+      if (alignment.blocks.size() > 0) {
+        IntervalOutput::Print(alignment, outFile);
+      }
+    }
+    else if (params.printFormat == SummaryPrint) {
+      if (alignment.blocks.size() > 0) {
+        SummaryOutput::Print(alignment, outFile);
+      }
+    }
+  }
+  catch (ostream::failure f) {
+    cout << "ERROR writing to output file. The output drive may be full, or you  " << endl;
+    cout << "may not have proper write permissions." << endl;
+    exit(1);
+  }
+}
+
+vector<T_AlignmentCandidate*>
+SelectAlignmentsToPrint(vector<T_AlignmentCandidate*> alignmentPtrs,
+                        MappingParameters & params,
+                        const int & associatedRandInt) {
+  if (params.placeRandomly) {assert(params.hitPolicy.IsRandombest());}
+
+  if (alignmentPtrs.size() == 0) {return vector<T_AlignmentCandidate*>({});}
+
+  std::sort(alignmentPtrs.begin(), alignmentPtrs.end(), 
+            SortAlignmentPointersByScore());
+
+  // Apply filter criteria and hit policy.
+  // Shallow copy AlignmentCandidate pointers.
+  vector<T_AlignmentCandidate*> filtered;
+  for (auto ptr: alignmentPtrs) {
+      if (params.filterCriteria.Satisfy(ptr)) {
+          filtered.push_back(ptr);
+          if (filtered.size() == params.nBest) break;
+      }
+  }
+
+  return params.hitPolicy.Apply(filtered, false, associatedRandInt);
+}
+
+// Print all alignments in vector<T_AlignmentCandidate*> alignmentPtrs
+void PrintAlignments(vector<T_AlignmentCandidate*> alignmentPtrs,
+                     SMRTSequence &read,
+                     MappingParameters &params, ostream &outFile, 
+                     AlignmentContext alignmentContext,
+                     BamWriter * bamWriterPtr) {
+  if (params.nProc > 1) {
+#ifdef __APPLE__
+    sem_wait(semaphores.writer);
+#else
+    sem_wait(&semaphores.writer);
+#endif
+  }
+  for (int i = 0; i < int(alignmentPtrs.size()); i++) { 
+    T_AlignmentCandidate *aref = alignmentPtrs[i];      
+      
+    if (aref->blocks.size() == 0) {
+
+      //
+      // If the SDP alignment finds nothing, there will be no
+      // blocks.  This may happen if the sdp block size is larger
+      // than the anchor size found with the suffix array.  When no
+      // blocks are found there is no alignment, so zero-out the
+      // score and continue.
+      //
+      aref->score = 0;
+      if (params.verbosity > 0) {
+          cout << "Zero blocks found for " << aref->qName << " " << aref->qAlignedSeqPos << " " << aref->tAlignedSeqPos << endl;
+      }
+      continue;
+    }
+    
+    //
+    // Configure some of the alignment context before printing.
+    //
+    if (i > 0 and params.placeRandomly == false) {
+      alignmentContext.isPrimary = false;
+    }
+    else {
+      alignmentContext.isPrimary = true;
+    }
+
+    if (params.printSAM or params.printBAM) {
+        DistanceMatrixScoreFunction<DNASequence, FASTASequence> editdistScoreFn(EditDistanceMatrix, 1, 1);
+        T_AlignmentCandidate & alignment = *alignmentPtrs[i];
+        alignmentContext.editDist = ComputeAlignmentScore(alignment,
+            alignment.qAlignedSeq, 
+            alignment.tAlignedSeq, 
+            editdistScoreFn);
+    }
+    
+    PrintAlignment(*alignmentPtrs[i], read, params, alignmentContext, outFile, bamWriterPtr);
+  }
+
+  if (params.nProc > 1) {
+#ifdef __APPLE__
+    sem_post(semaphores.writer);
+#else
+    sem_post(&semaphores.writer);
+#endif
+  }
+
+}
+
+template<typename T_Sequence>
+bool GetNextReadThroughSemaphore(ReaderAgglomerate &reader, MappingParameters &params, T_Sequence &read, AlignmentContext &context, int & associatedRandInt) {
+  //
+  // Grab the value of the semaphore for debugging purposes.
+  //
+  // uncomment when needed
+  // int semvalue;
+  // if (params.nProc > 1) {
+  //  sem_getvalue(&semaphores.reader, &semvalue);
+  // }
+
+  //
+  // Wait on a semaphore
+  if (params.nProc > 1) {
+#ifdef __APPLE__
+    sem_wait(semaphores.reader);
+#else
+    sem_wait(&semaphores.reader);
+#endif
+  }
+
+  bool returnValue = true;
+  //
+  // CCS Reads are read differently from other reads.  Do static casting here
+  // of this.
+  //
+  if (reader.GetNext(read, associatedRandInt) == 0) {
+    returnValue = false;
+  }
+
+  //
+  // Set the read group id before releasing the semaphore, since other
+  // threads may change the reader object to a new read group before
+  // sending this alignment out to printing. 
+  context.readGroupId = reader.readGroupId;
+  
+  if (params.nProc > 1) {
+#ifdef __APPLE__
+    sem_post(semaphores.reader);
+#else
+    sem_post(&semaphores.reader);
+#endif
+  }
+  return returnValue;
+}
+
+void AssignMapQV(vector<T_AlignmentCandidate*> &alignmentPtrs) {
+  int i;
+  int mapQV = 1;
+  if (alignmentPtrs.size() > 1 and alignmentPtrs[0]->score == alignmentPtrs[1]->score) {
+    // the top two alignments have the same score, don't consider them as mapped.
+    mapQV = 0;
+  }
+  
+  for (i = 0; i < int(alignmentPtrs.size()); i++) {
+    alignmentPtrs[i]->mapQV = mapQV;
+  }
+}
+
+void PrintAlignmentPtrs(vector <T_AlignmentCandidate*> & alignmentPtrs,
+    ostream & out = cout) {
+    for(int alignmentIndex = 0; 
+        alignmentIndex < int(alignmentPtrs.size());
+        alignmentIndex++) {
+        out << "["<< alignmentIndex << "/" 
+            << alignmentPtrs.size() << "]" << endl;
+        T_AlignmentCandidate *alignment = alignmentPtrs[alignmentIndex];          
+        alignment->Print(out);
+    }
+    out << endl;
+}
+
+// Extend target aligned sequence of the input alignement to both ends
+// by flankSize bases. Update alignment->tAlignedSeqPos, 
+// alignment->tAlignedSeqLength and alignment->tAlignedSeq.
+void FlankTAlignedSeq(T_AlignmentCandidate * alignment,
+                      SequenceIndexDatabase<FASTQSequence> &seqdb,
+                      DNASequence & genome,
+                      int flankSize) {
+  assert(alignment != NULL and alignment->tIsSubstring);
+
+  UInt forwardTPos, newTAlignedSeqPos, newTAlignedSeqLen;
+  // New aligned start position relative to this chromosome, with 
+  // the same direction as alignment->tStrand.
+  newTAlignedSeqPos = UInt((alignment->tAlignedSeqPos > UInt(flankSize))?
+          (alignment->tAlignedSeqPos - flankSize): 0);
+  newTAlignedSeqLen = min(alignment->tAlignedSeqPos + alignment->tAlignedSeqLength +
+          flankSize, alignment->tLength) - newTAlignedSeqPos;
+
+  if (alignment->tStrand ==0) {
+    forwardTPos = newTAlignedSeqPos; 
+  } else {
+    forwardTPos = alignment->tLength - newTAlignedSeqPos - 1;
+  }
+
+  // Find where this chromosome is in the genome.
+  int seqIndex = seqdb.GetIndexOfSeqName(alignment->tName);
+  assert(seqIndex != -1);
+  UInt newGenomePos = seqdb.ChromosomePositionToGenome(seqIndex, forwardTPos);
+
+  if (alignment->tIsSubstring == false) {
+    alignment->tAlignedSeq.Free();
+  }
+  alignment->tAlignedSeqPos = newTAlignedSeqPos;
+  alignment->tAlignedSeqLength = newTAlignedSeqLen;
+  if (alignment->tStrand == 0) {
+    alignment->tAlignedSeq.ReferenceSubstring(genome, newGenomePos, newTAlignedSeqLen);
+  } else {
+    // Copy and then reverse complement.
+    genome.MakeRC(alignment->tAlignedSeq, 
+            newGenomePos + 1 - alignment->tAlignedSeqLength, 
+            alignment->tAlignedSeqLength);
+    alignment->tIsSubstring = false;
+  }
+}
+
+// Align a subread of a SMRT sequence to target sequence of an alignment.
+// Input:
+//   subread         - a subread of a SMRT sequence.
+//   unrolledRead    - the full SMRT sequence.
+//   alignment       - an alignment.
+//   passDirection   - whether or not the subread has the 
+//                     same direction as query of the alignment.
+//                     0 = true, 1 = false. 
+//   subreadInterval - [start, end) interval of the subread in the 
+//                     SMRT read.
+//   subreadIndex    - index of the subread in allReadAlignments.
+//   params          - mapping paramters.
+// Output:
+//   allReadAlignments - where the sequence and alignments of the 
+//                       subread are saved.
+//   threadOut         - an out stream for debugging the current thread. 
+void AlignSubreadToAlignmentTarget(ReadAlignments & allReadAlignments,
+        SMRTSequence & subread, SMRTSequence & unrolledRead,
+        T_AlignmentCandidate * alignment,
+        int passDirection, ReadInterval & subreadInterval,
+        int subreadIndex, 
+        MappingParameters & params, 
+        MappingBuffers & mappingBuffers,
+        ostream & threadOut) {
+  assert(passDirection == 0 or passDirection == 1);
+  //
+  // Determine where in the genome the subread has mapped.
+  //
+  DNASequence alignedForwardRefSequence, alignedReverseRefSequence;
+
+  if (alignment->tStrand == 0) {
+    // This needs to be changed -- copy copies RHS into LHS,
+    // CopyAsRC copies LHS into RHS
+    alignedForwardRefSequence.Copy(alignment->tAlignedSeq);
+    alignment->tAlignedSeq.CopyAsRC(alignedReverseRefSequence);
+  }
+  else {
+    alignment->tAlignedSeq.CopyAsRC(alignedForwardRefSequence);
+    alignedReverseRefSequence.Copy(alignment->tAlignedSeq);
+  }
+
+  IDSScoreFunction<DNASequence, FASTQSequence> idsScoreFn;
+  idsScoreFn.ins  = params.insertion;
+  idsScoreFn.del  = params.deletion;
+  idsScoreFn.InitializeScoreMatrix(SMRTDistanceMatrix);
+  idsScoreFn.globalDeletionPrior = params.globalDeletionPrior;
+  idsScoreFn.substitutionPrior   = params.substitutionPrior;
+
+  DistanceMatrixScoreFunction<DNASequence, FASTQSequence> distScoreFn2(
+          SMRTDistanceMatrix, params.indel, params.indel);
+  //
+  // Determine the strand to align the subread to.
+  //
+  T_AlignmentCandidate exploded;
+  bool sameAlignmentPassDirection = (alignment->tStrand == passDirection);
+  bool computeProbIsFalse = false;
+  DNASequence & alignedRefSequence = (sameAlignmentPassDirection?
+      alignedForwardRefSequence:alignedReverseRefSequence);
+  //
+  // In the original code, parameters: bandSize=10, alignType=Global,
+  // sdpTupleSize=4 (instead of 12, Local and 6) were used when 
+  // alignment & pass have different directions.
+  //
+  int explodedScore = GuidedAlign(subread, alignedRefSequence,
+      idsScoreFn, 12, params.sdpIns, params.sdpDel, 
+      params.indelRate, mappingBuffers, exploded,
+      Local, computeProbIsFalse, 6);
+
+  if (params.verbosity >= 3) {
+    threadOut << "zmw " << unrolledRead.zmwData.holeNumber
+              << ", subreadIndex " << subreadIndex
+              << ", passDirection " << passDirection
+              << ", subreadInterval [" << subreadInterval.start 
+              << ", " << subreadInterval.end << ")" << endl
+              << "StickPrintAlignment subread-reference alignment which has" 
+              << " the " << (sameAlignmentPassDirection?"same":"different")
+              << " direction as the ccs-reference (or the "
+              << "longestSubread-reference) alignment. " << endl
+              << "subread: " << endl;
+    static_cast<DNASequence*>(&subread)->PrintSeq(threadOut);
+    threadOut << endl;
+    threadOut << "alignedRefSeq: " << endl;
+    static_cast<DNASequence*>(&alignedRefSequence)->PrintSeq(threadOut);
+    StickPrintAlignment(exploded, (DNASequence&) subread,
+                        (DNASequence&) alignedRefSequence,
+                        threadOut, exploded.qAlignedSeqPos, 
+                        exploded.tAlignedSeqPos);
+  }
+        
+  if (exploded.blocks.size() > 0) {
+      DistanceMatrixScoreFunction<DNASequence, FASTQSequence> distScoreFn(
+          SMRTDistanceMatrix, params.indel, params.indel);
+    ComputeAlignmentStats(exploded, subread.seq, 
+                          alignedRefSequence.seq, 
+                          distScoreFn2);
+                          //SMRTDistanceMatrix, params.indel, params.indel);
+    if (exploded.score <= params.maxScore) {
+      //
+      // The coordinates of the alignment should be
+      // relative to the reference sequence (the specified chromosome,
+      // not the whole genome). 
+      //
+      exploded.qStrand = 0;
+      exploded.tStrand = sameAlignmentPassDirection?0:1; 
+      exploded.qLength = unrolledRead.length; 
+      exploded.tLength = alignment->tLength;
+      exploded.tAlignedSeq.Copy(alignedRefSequence); 
+      exploded.tAlignedSeqPos = (passDirection == 0)?
+            (alignment->tAlignedSeqPos):
+            (exploded.tLength - alignment->tAlignedSeqPos 
+             - alignment->tAlignedSeqLength);
+      exploded.tAlignedSeqLength = alignment->tAlignedSeqLength;
+
+      exploded.qAlignedSeq.ReferenceSubstring(subread);
+      exploded.qAlignedSeqPos = subreadInterval.start;
+      exploded.qAlignedSeqLength = subreadInterval.end - subreadInterval.start;
+      exploded.mapQV = alignment->mapQV;
+      exploded.tName = alignment->tName;
+      exploded.tIndex = alignment->tIndex;
+
+      stringstream namestrm;
+      namestrm << "/" << subreadInterval.start
+               << "_" << subreadInterval.end;
+      exploded.qName = string(unrolledRead.title) + namestrm.str();
+        
+      //
+      // Don't call AssignRefContigLocation as the coordinates
+      // of the alignment is already relative to the chromosome coordiantes.
+      //
+      // Save this alignment for printing later.
+      //
+      T_AlignmentCandidate *alignmentPtr = new T_AlignmentCandidate;
+      *alignmentPtr = exploded;
+      allReadAlignments.AddAlignmentForSeq(subreadIndex, alignmentPtr);
+    } // End of exploded score <= maxScore.
+    if (params.verbosity >= 3) {
+      threadOut << "exploded score: " << exploded.score << endl
+                << "exploded alignment: "<< endl;
+      exploded.Print(threadOut);
+      threadOut << endl;
+    }
+  } // End of exploded.blocks.size() > 0.
+}
+
+
+// Given a SMRT sequence and a subread interval, make the subread.
+// Input: 
+//   smrtRead         - a SMRT sequence 
+//   subreadInterval  - a subread interval 
+//   params           - mapping parameters
+// Output: 
+//   subreadSequence - the constructed subread
+void MakeSubreadOfInterval(SMRTSequence & subreadSequence,
+    SMRTSequence & smrtRead, ReadInterval & subreadInterval, 
+    MappingParameters & params) {
+    //
+    // subreadMapType is a way of limiting the portion of the read
+    // that is aligned.  The output is similar, but the
+    // computation is slightly different.  The subreadMapType 0
+    // was written first, and just creates a hard mask over the
+    // regions that are not to be aligned.  The subreadMapType is
+    // slightly more formal mode where a new read is pointed to
+    // the subread then aligned.
+    //
+    // subreadMapType of 0 is always used, however eventually it
+    // may be faster to go to 1, just 1 isn't tested thoroughly
+    // yet.
+    //
+    // Note, for proper SAM printing, subreadMaptype of 0 is needed.
+    //
+    int start = subreadInterval.start;
+    int end   = subreadInterval.end;
+        
+    assert(smrtRead.length >= subreadSequence.length);
+    if (params.subreadMapType == 0) {
+      smrtRead.MakeSubreadAsMasked(subreadSequence, start, end); 
+    }
+    else if (params.subreadMapType == 1) {
+      smrtRead.MakeSubreadAsReference(subreadSequence, start, end); 
+    }
+
+    if (!params.preserveReadTitle) {
+      smrtRead.SetSubreadTitle(subreadSequence, 
+                               subreadSequence.subreadStart,
+                               subreadSequence.subreadEnd);
+    }
+    else {
+      subreadSequence.CopyTitle(smrtRead.title);
+    }
+    subreadSequence.zmwData = smrtRead.zmwData;
+}
+
+// Given a SMRT sequence and one of its subreads, make the 
+// reverse complement of the subread in the coordinate of the
+// reverse complement sequence of the SMRT sequence.
+// Input: 
+//   smrtRead          - a SMRT read
+//   subreadSequence   - a subread of smrtRead     
+// Output:
+//   subreadSequenceRC - the reverse complement of the subread
+//                       in the coordinate of the reverse 
+//                       complement of the SMRT read.
+void MakeSubreadRC(SMRTSequence & subreadSequenceRC,
+                   SMRTSequence & subreadSequence,
+                   SMRTSequence & smrtRead) {
+  assert(smrtRead.length >= subreadSequence.length);
+  // Reverse complement sequence of the subread.
+  subreadSequence.MakeRC(subreadSequenceRC);
+  // Update start and end positions of subreadSequenceRC in the 
+  // coordinate of reverse compelement sequence of the SMRT read.
+  subreadSequenceRC.subreadStart = smrtRead.length - subreadSequence.subreadEnd;
+  subreadSequenceRC.subreadEnd   = smrtRead.length - subreadSequence.subreadStart;
+  subreadSequenceRC.zmwData      = smrtRead.zmwData;
+}
+
+// Print all alignments for subreads in allReadAlignments.
+// Input: 
+//   allReadAlignments - contains a set of subreads, each of which
+//                       is associated with a group of alignments.
+//   alignmentContext  - an alignment context of each subread used
+//                       for printing in SAM format.
+//   params            - mapping parameters.
+// Output:
+//   outFilePtr        - where to print alignments for subreads.
+//   unalignedFilePtr  - where to print sequences for unaligned subreads.
+void PrintAllReadAlignments(ReadAlignments & allReadAlignments,
+                            AlignmentContext & alignmentContext,
+                            ostream & outFilePtr,
+                            ostream & unalignedFilePtr,
+                            MappingParameters & params,
+                            BamWriter * bamWriterPtr) {
+  int subreadIndex;
+  int nAlignedSubreads = allReadAlignments.GetNAlignedSeq();
+
+  //
+  // Initialize the alignemnt context with information applicable to SAM output.
+  //
+  alignmentContext.alignMode = allReadAlignments.alignMode;
+  for (subreadIndex = 0; subreadIndex < nAlignedSubreads; subreadIndex++) {
+    if (allReadAlignments.subreadAlignments[subreadIndex].size() > 0) {
+      alignmentContext.numProperlyAlignedSubreads++;
+    }
+  }
+
+  if (alignmentContext.numProperlyAlignedSubreads == int(allReadAlignments.subreadAlignments.size())) {
+      alignmentContext.allSubreadsProperlyAligned = true;
+  }
+  alignmentContext.nSubreads = nAlignedSubreads;
+
+  for (subreadIndex = 0; subreadIndex < nAlignedSubreads; subreadIndex++) {
+    alignmentContext.subreadIndex = subreadIndex;
+    if (subreadIndex < nAlignedSubreads-1 and allReadAlignments.subreadAlignments[subreadIndex+1].size() > 0) {
+      alignmentContext.nextSubreadPos = allReadAlignments.subreadAlignments[subreadIndex+1][0]->QAlignStart();
+      alignmentContext.nextSubreadDir = allReadAlignments.subreadAlignments[subreadIndex+1][0]->qStrand;
+      alignmentContext.rNext = allReadAlignments.subreadAlignments[subreadIndex+1][0]->tName;
+      alignmentContext.hasNextSubreadPos = true;
+    } else {
+      alignmentContext.nextSubreadPos = 0;
+      alignmentContext.nextSubreadDir = 0;
+      alignmentContext.rNext = "";
+      alignmentContext.hasNextSubreadPos = false;
+    }
+      
+    if (allReadAlignments.subreadAlignments[subreadIndex].size() > 0) {
+        PrintAlignments(allReadAlignments.subreadAlignments[subreadIndex], 
+                        allReadAlignments.subreads[subreadIndex], // the source read
+                        // for these alignments
+                        params, outFilePtr,//*mapData->outFilePtr,
+                        alignmentContext, 
+                        bamWriterPtr);
+    } else {
+      //
+      // Print the unaligned sequences.
+      //
+      if (params.printUnaligned == true) {
+        if (params.nProc == 1) {
+          //allReadAlignments.subreads[subreadIndex].PrintSeq(*mapData->unalignedFilePtr);
+          allReadAlignments.subreads[subreadIndex].PrintSeq(unalignedFilePtr);
+        }
+        else {
+#ifdef __APPLE__
+          sem_wait(semaphores.unaligned);
+#else
+          sem_wait(&semaphores.unaligned);
+#endif
+          //allReadAlignments.subreads[subreadIndex].PrintSeq(*mapData->unalignedFilePtr);
+          allReadAlignments.subreads[subreadIndex].PrintSeq(unalignedFilePtr);
+#ifdef __APPLE__
+          sem_post(semaphores.unaligned);
+#else
+          sem_post(&semaphores.unaligned);
+#endif
+        } // End of nproc > 1.
+      } // End of printing  unaligned sequences.
+    } // End of finding no alignments for the subread with subreadIndex.
+  } // End of printing and processing alignmentContext for each subread.
+}
+
+//template<typename T_SuffixArray, typename T_GenomeSequence, typename T_Tuple>
+void MapReads(MappingData<T_SuffixArray, T_GenomeSequence, T_Tuple> *mapData) { 
+  //
+  // Step 1, initialize local pointers to map data 
+  // for programming shorthand.
+  //
+  MappingParameters params = mapData->params;
+
+  DNASuffixArray sarray;
+  TupleCountTable<T_GenomeSequence, DNATuple> ct;
+  SequenceIndexDatabase<FASTQSequence> seqdb;
+  FASTQSequence fastaGenome;
+  T_GenomeSequence    genome;
+  BWT *bwtPtr;
+
+  mapData->ShallowCopySuffixArray(sarray);
+  mapData->ShallowCopyReferenceSequence(genome);
+  mapData->ShallowCopySequenceIndexDatabase(seqdb);
+  mapData->ShallowCopyTupleCountTable(ct);
+  
+  bwtPtr = mapData->bwtPtr;
+  SeqBoundaryFtr<FASTQSequence> seqBoundary(&seqdb);
+
+  VectorIndex i, j;
+  if (params.match != 0) {
+  }    
+
+  int numAligned = 0;
+  
+  SMRTSequence smrtRead, smrtReadRC;
+  SMRTSequence unrolledReadRC;
+  CCSSequence  ccsRead;
+  RegionAnnotation annotation;
+  T_Sequence read;
+  int readIndex = -1;
+  int readsFileIndex;
+  bool readIsCCS = false;
+
+
+  // Print verbose logging to pid.threadid.log for each thread.
+  ofstream threadOut;
+  if (params.verbosity >= 3) {
+    stringstream ss;
+    ss << getpid() << "." << pthread_self();
+    string threadLogFileName = ss.str() + ".log";
+    threadOut.open(threadLogFileName.c_str(), ios::out|ios::app);
+  }
+
+  //
+  // Reuse the following buffers during alignment.  Since these keep
+  // storage contiguous, hopefully this will decrease memory
+  // fragmentation.
+  //
+  MappingBuffers mappingBuffers;
+  while (true) {
+    //
+    // Scan the next read from input.  This may either be a CCS read,
+    // or regular read (though this may be aligned in whole, or by
+    // subread).
+    //
+    AlignmentContext alignmentContext;
+    // Associate each sequence to read in with a determined random int.
+    int associatedRandInt = 0;
+    if (mapData->reader->GetFileType() == HDFCCS ||
+        mapData->reader->GetFileType() == HDFCCSONLY) { 
+      if (GetNextReadThroughSemaphore(*mapData->reader, params, ccsRead, alignmentContext, associatedRandInt) == false) {
+        break;
+      }
+      else {
+        readIsCCS = true;
+        smrtRead.Copy(ccsRead);
+        ccsRead.SetQVScale(params.qvScaleType);
+        ++readIndex;
+        smrtRead.SetQVScale(params.qvScaleType);
+      }
+      assert(ccsRead.zmwData.holeNumber == smrtRead.zmwData.holeNumber and
+             ccsRead.zmwData.holeNumber == ccsRead.unrolledRead.zmwData.holeNumber);
+    } else {
+      if (GetNextReadThroughSemaphore(*mapData->reader, params, smrtRead, alignmentContext, associatedRandInt) == false) {
+        break;
+      }
+      else {
+        ++readIndex;
+        smrtRead.SetQVScale(params.qvScaleType);
+      }
+    }
+
+    //
+    // Only normal (non-CCS) reads should be masked.  Since CCS reads store the raw read, that is masked.
+    //
+    bool readHasGoodRegion = true;
+    if (params.useRegionTable and params.useHQRegionTable) {
+      if (readIsCCS) {
+        readHasGoodRegion = MaskRead(ccsRead.unrolledRead, ccsRead.unrolledRead.zmwData, *mapData->regionTablePtr);       
+      }
+      else {
+        readHasGoodRegion = MaskRead(smrtRead, smrtRead.zmwData, *mapData->regionTablePtr);
+      }
+      //
+      // Store the high quality start and end of this read for masking purposes when printing.
+      //
+      int hqStart, hqEnd;
+      int score;
+      LookupHQRegion(smrtRead.zmwData.holeNumber, *mapData->regionTablePtr, hqStart, hqEnd, score);
+      smrtRead.lowQualityPrefix = hqStart;
+      smrtRead.lowQualitySuffix = smrtRead.length - hqEnd;
+      smrtRead.highQualityRegionScore = score;
+    }
+    else {
+      smrtRead.lowQualityPrefix = 0;
+      smrtRead.lowQualitySuffix = 0;
+    }
+
+    //
+    // Give the opportunity to align a subset of reads.
+    //
+    if ((params.maxReadIndex >= 0 and 
+         smrtRead.zmwData.holeNumber > UInt(params.maxReadIndex))) {
+      if (readIsCCS) {
+        ccsRead.Free();
+      }
+      smrtRead.Free();
+      break;
+    }
+
+    if (readHasGoodRegion == false or 
+        (params.readIndex >= 0 and 
+         smrtRead.zmwData.holeNumber != UInt(params.readIndex)) or
+        (params.holeNumberRangesStr.size() > 0 and
+         not params.holeNumberRanges.contains(smrtRead.zmwData.holeNumber))) {
+      //
+      // Nothing to do with this read. Skip aligning it entirely.
+      //
+      if (readIsCCS) {
+        ccsRead.Free();
+      }
+      smrtRead.Free();
+      // Stop processing once the specified read index is reached.
+      // Eventually this will change to just seek to readIndex, and
+      // just align one read anyway.
+      if ((params.readIndex >= 0 and 
+           smrtRead.zmwData.holeNumber > UInt(params.readIndex)) or
+          (params.holeNumberRangesStr.size() > 0 and 
+           smrtRead.zmwData.holeNumber > params.holeNumberRanges.max())){
+        break;
+      }
+      continue;
+    }
+    
+
+    // 
+    // Discard reads that are too small, or not labeled as having any
+    // useable/good sequence. 
+    //
+    if (smrtRead.length < UInt(params.minReadLength) or readHasGoodRegion == false or 
+        smrtRead.highQualityRegionScore < params.minRawSubreadScore or 
+        (params.maxReadLength != 0 and 
+         smrtRead.length > UInt(params.maxReadLength))) {
+        if (readIsCCS) {
+        ccsRead.Free();
+      }
+      smrtRead.Free();
+      continue;
+    }
+
+    if (smrtRead.qual.Empty() == false and smrtRead.GetAverageQuality() < params.minAvgQual) {
+      if (readIsCCS) {
+        ccsRead.Free();
+      }
+      smrtRead.Free();
+      continue;
+    }
+
+    if (params.verbosity > 1) {
+      cout << "aligning read: " << endl;
+      smrtRead.PrintSeq(cout);
+    }
+
+    smrtRead.MakeRC(smrtReadRC);
+    
+    if (readIsCCS) {
+      ccsRead.unrolledRead.MakeRC(unrolledReadRC);
+    }
+
+    //
+    // When aligning subreads separately, iterate over each subread, and print the alignments for these.
+    //
+
+    ReadAlignments allReadAlignments;
+    allReadAlignments.read = smrtRead;
+
+    if (readIsCCS == false and params.mapSubreadsSeparately) {
+      // (not readIsCCS and not -noSplitSubreads)
+      vector<ReadInterval> subreadIntervals;
+      vector<int>          subreadDirections;
+      vector<ReadInterval> adapterIntervals; 
+      //
+      // Determine endpoints of this subread in the main read.
+      //
+      if (params.useRegionTable == false) {
+        //
+        // When there is no region table, the subread is the entire
+        // read.
+        //
+        ReadInterval wholeRead(0, smrtRead.length);
+        // The set of subread intervals is just the entire read.
+        subreadIntervals.push_back(wholeRead);
+      }
+      else {
+        // 
+        // Grab the subread & adapter intervals from the entire region table to
+        // iterate over.
+        //
+        CollectSubreadIntervals(smrtRead, mapData->regionTablePtr, subreadIntervals, params.byAdapter);
+        CollectAdapterIntervals(smrtRead, mapData->regionTablePtr, adapterIntervals);
+      }
+
+      // The assumption is that neighboring subreads must have the opposite 
+      // directions. So create directions for subread intervals with
+      // interleaved 0s and 1s.
+      CreateDirections(subreadDirections, subreadIntervals.size());
+
+      //
+      // Trim the boundaries of subread intervals so that only high quality
+      // regions are included in the intervals, not N's. Remove intervals
+      // and their corresponding dirctions, if they are shorter than the 
+      // user specified minimum read length or do not intersect with hq 
+      // region at all. Finally, return index of the (left-most) longest
+      // subread in the updated vector.
+      //
+      int longestSubreadIndex = GetHighQualitySubreadsIntervals(
+            subreadIntervals, // a vector of subread intervals.
+            subreadDirections, // a vector of subread directions.
+            smrtRead.lowQualityPrefix, // hq region start pos.
+            smrtRead.length - smrtRead.lowQualitySuffix, // hq end pos.
+            params.minSubreadLength); // minimum read length.
+
+      int bestSubreadIndex = longestSubreadIndex;
+      if (params.concordantTemplate == "longestsubread") {
+          // Use the (left-most) longest full-pass subread as 
+          // template for concordant mapping
+          int longestFullSubreadIndex = GetLongestFullSubreadIndex(
+              subreadIntervals, adapterIntervals);
+          if (longestFullSubreadIndex >= 0) {
+              bestSubreadIndex = longestFullSubreadIndex;
+          }
+      } else if (params.concordantTemplate == "typicalsubread") {
+          // Use the 'typical' full-pass subread as template for
+          // concordant mapping.
+          int typicalFullSubreadIndex = GetTypicalFullSubreadIndex(
+              subreadIntervals, adapterIntervals);
+          if (typicalFullSubreadIndex >= 0) {
+              bestSubreadIndex = typicalFullSubreadIndex;
+          }
+      } else if (params.concordantTemplate == "mediansubread") {
+          // Use the 'median-length' full-pass subread as template for
+          // concordant mapping.
+          int medianFullSubreadIndex = GetMedianLengthFullSubreadIndex(
+              subreadIntervals, adapterIntervals);
+          if (medianFullSubreadIndex >= 0) {
+              bestSubreadIndex = medianFullSubreadIndex;
+          }
+      } else {
+          assert(false);
+      }
+      
+      // Flop all directions if direction of the longest subread is 1.
+      if (bestSubreadIndex >= 0 and 
+          bestSubreadIndex < int(subreadDirections.size()) and
+          subreadDirections[bestSubreadIndex] == 1) {
+        UpdateDirections(subreadDirections, true);
+      }
+
+      int startIndex = 0;
+      int endIndex = subreadIntervals.size();
+
+      if (params.concordant) {
+        // Only the longest subread will be aligned in the first round.
+        startIndex = max(startIndex, bestSubreadIndex);
+        endIndex   = min(endIndex, bestSubreadIndex + 1);
+      }
+
+      //
+      // Make room for alignments.
+      //
+      allReadAlignments.Resize(subreadIntervals.size());
+      allReadAlignments.alignMode = Subread;
+
+      DNALength intvIndex;
+      for (intvIndex = startIndex; intvIndex < endIndex; intvIndex++) {
+        SMRTSequence subreadSequence, subreadSequenceRC;
+        MakeSubreadOfInterval(subreadSequence, smrtRead, 
+                              subreadIntervals[intvIndex], params);
+        MakeSubreadRC(subreadSequenceRC, subreadSequence, smrtRead);
+
+        //
+        // Store the sequence that is being mapped in case no hits are
+        // found, and missing sequences are printed.
+        //
+        allReadAlignments.SetSequence(intvIndex, subreadSequence);
+
+        vector<T_AlignmentCandidate*> alignmentPtrs;
+        mapData->metrics.numReads++;
+
+        assert(subreadSequence.zmwData.holeNumber == smrtRead.zmwData.holeNumber);
+
+        //
+        // Try default and fast parameters to map the read.
+        //
+        MapRead(subreadSequence, subreadSequenceRC, 
+                genome,           // possibly multi fasta file read into one sequence
+                sarray, *bwtPtr,  // The suffix array, and the bwt-fm index structures
+                seqBoundary,      // Boundaries of contigs in the
+                                  // genome, alignments do not span
+                                  // the ends of boundaries.
+                ct,               // Count table to use word frequencies in the genome to weight matches.
+                seqdb,            // Information about the names of
+                                  // chromosomes in the genome, and
+                                  // where their sequences are in the genome.
+                params,           // A huge list of parameters for
+                                  // mapping, only compile/command
+                                  // line values set.
+                mapData->metrics, // Keep track of time/ hit counts,
+                                  // etc.. Not fully developed, but
+                                  // should be.
+                alignmentPtrs,    // Where the results are stored.
+                mappingBuffers,   // A class of buffers for structurs
+                                  // like dyanmic programming
+                                  // matrices, match lists, etc., that are not
+                                  // reallocated between calls to
+                                  // MapRead.  They are cleared though.
+                mapData           // Some values that are shared
+                                  // across threads.
+                );
+
+        //
+        // No alignments were found, sometimes parameters are
+        // specified to try really hard again to find an alignment.
+        // This sets some parameters that use a more sensitive search
+        // at the cost of time.
+        //
+
+        if ((alignmentPtrs.size() == 0 or alignmentPtrs[0]->pctSimilarity < 80) and params.doSensitiveSearch) {
+          MappingParameters sensitiveParams = params;
+          sensitiveParams.SetForSensitivity();
+          MapRead(subreadSequence, subreadSequenceRC, genome, 
+                  sarray, *bwtPtr, 
+                  seqBoundary, ct, seqdb,
+                  sensitiveParams, mapData->metrics, 
+                  alignmentPtrs, mappingBuffers, 
+                  mapData);
+        }
+
+        //
+        // Store the mapping quality values.
+        //
+        if (alignmentPtrs.size() > 0 and 
+            alignmentPtrs[0]->score < params.maxScore and 
+            params.storeMapQV) {
+          StoreMapQVs(subreadSequence, alignmentPtrs, params);
+        }
+
+        // 
+        // Select alignments for this subread.
+        //
+        vector<T_AlignmentCandidate*> selectedAlignmentPtrs =
+        SelectAlignmentsToPrint(alignmentPtrs, params, 
+                                associatedRandInt);
+        allReadAlignments.AddAlignmentsForSeq(intvIndex, selectedAlignmentPtrs);
+
+        //
+        // Move reference from subreadSequence, which will be freed at
+        // the end of this loop to the smrtRead, which exists for the
+        // duration of aligning all subread of the smrtRead.
+        //
+        if (params.subreadMapType == 0) {
+          int a;
+          for (a = 0; a < alignmentPtrs.size(); a++) {
+            if (alignmentPtrs[a]->qStrand == 0) {
+              alignmentPtrs[a]->qAlignedSeq.ReferenceSubstring(smrtRead,
+                                                               alignmentPtrs[a]->qAlignedSeq.seq - subreadSequence.seq,
+                                                               alignmentPtrs[a]->qAlignedSeqLength);
+            }
+            else {
+              alignmentPtrs[a]->qAlignedSeq.ReferenceSubstring(smrtReadRC,
+                                                               alignmentPtrs[a]->qAlignedSeq.seq - subreadSequenceRC.seq, 
+                                                               alignmentPtrs[a]->qAlignedSeqLength);
+            }
+          }
+        }
+        subreadSequence.Free();
+        subreadSequenceRC.Free();
+      } // End of looping over subread intervals within [startIndex, endIndex).
+
+      if (params.verbosity >= 3) 
+          allReadAlignments.Print(threadOut);
+
+      if (params.concordant) {
+        allReadAlignments.read = smrtRead;
+        allReadAlignments.alignMode = ZmwSubreads;
+
+        if (startIndex >= 0 && 
+            startIndex < int(allReadAlignments.subreadAlignments.size())) {
+          vector<T_AlignmentCandidate*> selectedAlignmentPtrs =
+              allReadAlignments.CopySubreadAlignments(startIndex);
+
+          for(int alignmentIndex = 0; alignmentIndex < int(selectedAlignmentPtrs.size()); 
+              alignmentIndex++) {
+            FlankTAlignedSeq(selectedAlignmentPtrs[alignmentIndex], 
+                              seqdb, genome, params.flankSize);
+          }
+
+          for (intvIndex = 0; intvIndex < subreadIntervals.size(); intvIndex++) {
+            if (intvIndex == startIndex) continue; 
+            int passDirection = subreadDirections[intvIndex];
+            int passStartBase = subreadIntervals[intvIndex].start;
+            int passNumBases  = subreadIntervals[intvIndex].end - passStartBase;
+            if (passNumBases <= params.minReadLength) {continue;}
+
+            mapData->metrics.numReads++;
+            SMRTSequence subread;
+            subread.ReferenceSubstring(smrtRead, passStartBase, passNumBases);
+            subread.CopyTitle(smrtRead.title);
+            // The unrolled alignment should be relative to the entire read.
+            if (params.clipping == SAMOutput::subread) {
+                SMRTSequence maskedSubread;
+                MakeSubreadOfInterval(maskedSubread, smrtRead,
+                                      subreadIntervals[intvIndex], params);
+                allReadAlignments.SetSequence(intvIndex, maskedSubread);
+                maskedSubread.Free();
+            } else {
+                allReadAlignments.SetSequence(intvIndex, smrtRead);
+            }
+
+            for (int alnIndex = 0; alnIndex < selectedAlignmentPtrs.size(); alnIndex++) {
+              T_AlignmentCandidate * alignment = selectedAlignmentPtrs[alnIndex];
+              if (alignment->score > params.maxScore) break;
+              AlignSubreadToAlignmentTarget(allReadAlignments, 
+                                            subread,
+                                            smrtRead,
+                                            alignment,
+                                            passDirection, 
+                                            subreadIntervals[intvIndex],
+                                            intvIndex,
+                                            params, mappingBuffers, threadOut);
+              if (params.concordantAlignBothDirections) {
+                AlignSubreadToAlignmentTarget(allReadAlignments, 
+                                              subread, 
+                                              smrtRead, 
+                                              alignment,
+                                              ((passDirection==0)?1:0),
+                                              subreadIntervals[intvIndex], 
+                                              intvIndex,
+                                              params, mappingBuffers, threadOut);
+              }
+            } // End of aligning this subread to each selected alignment.
+            subread.Free();
+          } // End of aligning each subread to where the template subread aligned to. 
+          for(int alignmentIndex = 0; alignmentIndex < selectedAlignmentPtrs.size(); 
+              alignmentIndex++) {
+            if (selectedAlignmentPtrs[alignmentIndex]) 
+              delete selectedAlignmentPtrs[alignmentIndex];
+          }
+        } // End of if startIndex >= 0 and < subreadAlignments.size()
+      } // End of if params.concordant
+    } // End of if (readIsCCS == false and params.mapSubreadsSeparately).
+    else { // if (readIsCCS or (not readIsCCS and -noSplitSubreads) )
+      //
+      // The read must be mapped as a whole, even if it contains subreads.
+      //
+      vector<T_AlignmentCandidate*> alignmentPtrs;
+      mapData->metrics.numReads++;
+      smrtRead.subreadStart   = 0; smrtRead.subreadEnd   = smrtRead.length;
+      smrtReadRC.subreadStart = 0; smrtReadRC.subreadEnd = smrtRead.length;
+
+      MapRead(smrtRead, smrtReadRC, 
+              genome, sarray, *bwtPtr, seqBoundary, ct, seqdb, params, mapData->metrics,
+              alignmentPtrs, mappingBuffers, mapData);
+      
+      //
+      // Store the mapping quality values.
+      //
+      if (alignmentPtrs.size() > 0 and 
+          alignmentPtrs[0]->score < params.maxScore and 
+          params.storeMapQV) {
+        StoreMapQVs(smrtRead, alignmentPtrs, params);
+      }
+
+      // 
+      // Select de novo ccs-reference alignments for subreads to align to.
+      //
+      vector<T_AlignmentCandidate*> selectedAlignmentPtrs =
+      SelectAlignmentsToPrint(alignmentPtrs, params, associatedRandInt);
+
+      //
+      // Just one sequence is aligned.  There is one primary hit, and
+      // all other are secondary.
+      //
+
+      if (readIsCCS == false or params.useCcsOnly) {
+        // if -noSplitSubreads or -useccsdenovo.
+        //
+        // Record some information for proper SAM Annotation.
+        //
+        allReadAlignments.Resize(1);
+        allReadAlignments.AddAlignmentsForSeq(0, selectedAlignmentPtrs);
+        if (params.useCcsOnly) {
+          allReadAlignments.alignMode = CCSDeNovo;
+        }
+        else {
+          allReadAlignments.alignMode = Fullread;
+        }
+        allReadAlignments.SetSequence(0, smrtRead);
+      }
+      else if (readIsCCS) { // if -useccsall or -useccs 
+        // Flank alignment candidates to both ends.
+        for(int alignmentIndex = 0; alignmentIndex < selectedAlignmentPtrs.size(); 
+          alignmentIndex++) {
+          FlankTAlignedSeq(selectedAlignmentPtrs[alignmentIndex],
+                           seqdb, genome, params.flankSize);
+        }
+
+        //
+        // Align the ccs subread to where the denovo sequence mapped (explode).
+        //
+        SMRTSequence readRC;
+        
+        CCSIterator ccsIterator;
+        FragmentCCSIterator fragmentCCSIterator;
+        CCSIterator *subreadIterator;
+        
+        //
+        // Choose a different iterator over subreads depending on the
+        // alignment mode.  When the mode is allpass, include the
+        // framgents that are not necessarily full pass.
+        //
+        if (params.useAllSubreadsInCcs) {
+          // 
+          // Use all subreads even if they are not full pass
+          fragmentCCSIterator.Initialize(&ccsRead, mapData->regionTablePtr);
+          subreadIterator = &fragmentCCSIterator;
+          allReadAlignments.alignMode = CCSAllPass;
+        }
+        else {
+          // Use only full pass reads.
+          ccsIterator.Initialize(&ccsRead);
+          subreadIterator = &ccsIterator;
+          allReadAlignments.alignMode = CCSFullPass;
+        }
+
+        allReadAlignments.Resize(subreadIterator->GetNumPasses());
+          
+        int passDirection, passStartBase, passNumBases;
+        SMRTSequence subread;
+        
+        //
+        // The read was previously set to the smrtRead, which was the
+        // de novo ccs sequence.  Since the alignments of exploded
+        // reads are reported, the unrolled read should be used as the
+        // reference when printing.
+        //
+        allReadAlignments.read = ccsRead.unrolledRead;
+        subreadIterator->Reset();
+        int subreadIndex;
+
+        //
+        // Realign all subreads to selected reference locations.
+        //
+        for (subreadIndex = 0; subreadIndex < subreadIterator->GetNumPasses(); subreadIndex++) {
+          int retval = subreadIterator->GetNext(passDirection, passStartBase, passNumBases);
+          assert(retval == 1);
+          if (passNumBases <= params.minReadLength) { continue; }
+
+          ReadInterval subreadInterval(passStartBase, passStartBase + passNumBases);
+
+          subread.ReferenceSubstring(ccsRead.unrolledRead, passStartBase, passNumBases-1);
+          subread.CopyTitle(ccsRead.title);
+          // The unrolled alignment should be relative to the entire read.
+          allReadAlignments.SetSequence(subreadIndex, ccsRead.unrolledRead);
+
+          int alignmentIndex;
+          //
+          // Align this subread to all the positions that the de novo
+          // sequence has aligned to.
+          //
+          for (alignmentIndex = 0; alignmentIndex < selectedAlignmentPtrs.size(); alignmentIndex++) {
+            T_AlignmentCandidate *alignment = selectedAlignmentPtrs[alignmentIndex];
+            if (alignment->score > params.maxScore) break;
+            AlignSubreadToAlignmentTarget(allReadAlignments,
+                                          subread, ccsRead.unrolledRead, 
+                                          alignment,
+                                          passDirection,
+                                          subreadInterval,
+                                          subreadIndex,
+                                          params, mappingBuffers, threadOut);
+          } // End of aligning this subread to where the de novo ccs has aligned to.
+          subread.Free();
+        } // End of alignining all subreads to where the de novo ccs has aligned to.
+      } // End of if readIsCCS and !params.useCcsOnly 
+
+    } // End of if not (readIsCCS == false and params.mapSubreadsSeparately) 
+
+    PrintAllReadAlignments(allReadAlignments, alignmentContext,
+                           *mapData->outFilePtr, 
+                           *mapData->unalignedFilePtr,
+                           params, 
+                           bamWriterPtr);
+        
+    allReadAlignments.Clear();
+    smrtReadRC.Free();
+    smrtRead.Free();
+
+    if (readIsCCS) {
+      ccsRead.Free();
+      unrolledReadRC.Free();
+    }
+    numAligned++;
+    if(numAligned % 100 == 0) {
+      mappingBuffers.Reset();
+    }
+  } // End of while (true).
+  smrtRead.Free();
+  smrtReadRC.Free();
+  unrolledReadRC.Free();
+  read.Free();
+  ccsRead.Free();
+
+  if (params.nProc > 1) {
+#ifdef __APPLE__
+    sem_wait(semaphores.reader);
+    sem_post(semaphores.reader);
+#else
+    sem_wait(&semaphores.reader);
+    sem_post(&semaphores.reader);
+#endif
+  }
+  if (params.nProc > 1) {
+    pthread_exit(NULL); 
+  }
+  threadOut.close();
+}
+
+float ComputePMatch(float accuracy, int anchorLength) {
+  assert(anchorLength >= 0);
+  if (anchorLength == 0) { 
+    return 0;
+  }
+  else {
+    return pow(accuracy,anchorLength);
+  }
+}
+
+//
+// Assume the number of mismatches in a row follow a geometric distribution.
+//
+void GeometricDistributionSummaryStats(float pSuccess,
+                                       float &mean, float &variance) {
+  mean = 1/pSuccess;
+  variance = (1-pSuccess)/ (pow(pSuccess,2));
+}
+
+int ComputeExpectedWaitingBases(float mean, float variance, float certainty) {
+  float nStdDev;
+  assert(FindQNorm(certainty, nStdDev) != false);
+  return mean + sqrt(variance) * nStdDev;
+}
+
+int main(int argc, char* argv[]) {
+  //
+  // Configure parameters for refining alignments.
+  //
+  MappingParameters params;
+  ReverseCompressIndex index;
+  pid_t parentPID;
+  pid_t *pids;
+  
+  CommandLineParser clp;
+  clp.SetHelp(BlasrHelp(params));
+  clp.SetConciseHelp(BlasrConciseHelp());
+  clp.SetProgramSummary(BlasrSummaryHelp());
+  clp.SetProgramName("blasr");
+  clp.SetVersion(GetVersion());
+
+  // Register Blasr options.
+  RegisterBlasrOptions(clp, params);
+
+  // Parse command line args.
+  clp.ParseCommandLine(argc, argv, params.readsFileNames);
+
+  string commandLine;
+  clp.CommandLineToString(argc, argv, commandLine);
+
+  if (params.printVerboseHelp) {
+    cout << BlasrHelp(params) << endl;
+    exit(0); // Not a failure.
+  }
+  if (params.printDiscussion) {
+    cout << BlasrDiscussion();
+    exit(0); // Not a failure.
+  }
+  if (argc < 3) {
+    cout << BlasrConciseHelp();
+    exit(1); // A failure.
+  }
+  
+  int a, b;
+  for (a = 0; a < 5; a++ ) {
+    for (b = 0; b < 5; b++ ){
+      if (a != b) {
+        SMRTDistanceMatrix[a][b] += params.mismatch;
+      }
+      else {
+        SMRTDistanceMatrix[a][b] += params.match;
+      }
+    }
+  }
+  
+  if (params.scoreMatrixString != "") {
+    if (StringToScoreMatrix(params.scoreMatrixString, SMRTDistanceMatrix) == false) {
+      cout << "ERROR. The string " << endl
+           << params.scoreMatrixString << endl
+           << "is not a valid format.  It should be a quoted, space separated string of " << endl
+           << "integer values.  The matrix: " << endl
+           << "    A  C  G  T  N" << endl
+           << " A  1  2  3  4  5" << endl
+           << " C  6  7  8  9 10" << endl
+           << " G 11 12 13 14 15" << endl
+           << " T 16 17 18 19 20" << endl
+           << " N 21 22 23 24 25" << endl
+           << " should be specified as \"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25\"" << endl;
+      exit(1);
+    }
+  }
+  
+  cerr << "[INFO] " << GetTimestamp() << " [blasr] started." << endl;
+  params.MakeSane();
+
+  //
+  // The random number generator is used for subsampling for debugging
+  // and testing consensus and selecting hits when hit policy is random
+  // or randombest.
+  //
+  if (params.useRandomSeed == true) {
+    InitializeRandomGenerator(params.randomSeed);
+  }
+  else {
+    InitializeRandomGeneratorWithTime();
+  }
+  
+  //
+  // Various aspects of timing are stored here.  However this isn't
+  // quite finished.
+  //
+  MappingMetrics metrics;
+
+  ofstream fullMetricsFile;
+  if (params.fullMetricsFileName != "") {
+    CrucialOpen(params.fullMetricsFileName, fullMetricsFile, std::ios::out);
+    metrics.SetStoreList();
+  }
+
+  //
+  // If reading a separate region table, there is a 1-1 correspondence
+  // between region table and bas file.
+  //
+  if (params.readSeparateRegionTable) {
+    if (FileOfFileNames::IsFOFN(params.regionTableFileName)) {
+      FileOfFileNames::FOFNToList(params.regionTableFileName, params.regionTableFileNames);
+    }
+    else {
+      params.regionTableFileNames.push_back(params.regionTableFileName);
+    }
+  }
+
+  if (params.regionTableFileNames.size() != 0 and 
+      params.regionTableFileNames.size() != params.queryFileNames.size()) {
+    cout << "Error, there are not the same number of region table files as input files." << endl;
+    exit(1);
+  }
+
+  // If reading a separate ccs fofn, there is a 1-1 corresponence 
+  // between ccs fofn and base file.
+  if (params.readSeparateCcsFofn) {
+    if (FileOfFileNames::IsFOFN(params.ccsFofnFileName)) {
+      FileOfFileNames::FOFNToList(params.ccsFofnFileName, params.ccsFofnFileNames);
+    }
+    else {
+      params.ccsFofnFileNames.push_back(params.ccsFofnFileName);
+    }
+  }
+  if (params.ccsFofnFileNames.size() != 0 and 
+      params.ccsFofnFileNames.size() != params.queryFileNames.size()) {
+    cout << "Error, there are not the same number of ccs files as input files." << endl;
+    exit(1);
+  }
+  
+  parentPID = getpid();
+
+  SequenceIndexDatabase<FASTASequence> seqdb;
+  SeqBoundaryFtr<FASTASequence> seqBoundary(&seqdb);
+
+  //
+  // Initialize the sequence index database if it used. If it is not
+  // specified, it is initialized by default when reading a multiFASTA
+  // file.
+  //
+  if (params.useSeqDB) {
+    ifstream seqdbin;
+    CrucialOpen(params.seqDBName, seqdbin);
+    seqdb.ReadDatabase(seqdbin);
+  }
+
+  //
+  // Make sure the reads file exists and can be opened before
+  // trying to read any of the larger data structures.
+  //
+  
+
+  FASTASequence   fastaGenome;
+  T_Sequence      genome;
+  FASTAReader     genomeReader;
+
+  // 
+  // The genome is in normal FASTA, or condensed (lossy homopolymer->unipolymer) 
+  // format.  Both may be read in using a FASTA reader.
+  //
+  if (!genomeReader.Init(params.genomeFileName)) {
+    cout << "Could not open genome file " << params.genomeFileName << endl;
+    exit(1);
+  }
+
+  if (params.printSAM or params.printBAM) {
+    genomeReader.computeMD5 = true;
+  }
+  //
+  // If no sequence title database is supplied, initialize one when
+  // reading in the reference, and consider a seqdb to be present.
+  //
+  if (!params.useSeqDB) {
+    genomeReader.ReadAllSequencesIntoOne(fastaGenome, &seqdb);
+    params.useSeqDB = true;
+  }
+  else {
+    genomeReader.ReadAllSequencesIntoOne(fastaGenome);
+  }
+  genomeReader.Close();
+  //
+  // The genome may have extra spaces in the fasta name. Get rid of those.
+  //
+  VectorIndex t;
+  for (t = 0; t < fastaGenome.titleLength; t++ ){
+    if (fastaGenome.title[t] == ' ') {
+      fastaGenome.titleLength = t;
+      fastaGenome.title[t] = '\0';
+      break;
+    }
+  }
+
+  genome.seq = fastaGenome.seq;
+  genome.length = fastaGenome.length;
+  genome.title = fastaGenome.title;
+  genome.deleteOnExit = false;
+  genome.titleLength = fastaGenome.titleLength;
+  genome.ToUpper();
+
+  DNASuffixArray sarray;
+  TupleCountTable<T_GenomeSequence, DNATuple> ct;
+
+  int listTupleSize;
+  
+  ofstream outFile;
+  outFile.exceptions(ostream::failbit);
+  ofstream unalignedOutFile;
+  BWT bwt;
+
+  if (params.useBwt) {
+    if (bwt.Read(params.bwtFileName) == 0) {
+      cout << "ERROR! Could not read the BWT file. " << params.bwtFileName << endl;
+      exit(1);
+    }
+  }
+  else {
+    if (!params.useSuffixArray) {
+      //
+      // There was no explicit specification of a suffix
+      // array on the command line, so build it on the fly here.
+      //
+      genome.ToThreeBit();
+      vector<int> alphabet;
+      sarray.InitThreeBitDNAAlphabet(alphabet);
+      sarray.LarssonBuildSuffixArray(genome.seq, genome.length, alphabet);
+      if (params.minMatchLength > 0) {
+        if (params.anchorParameters.useLookupTable == true) {
+          if (params.lookupTableLength > params.minMatchLength) {
+            params.lookupTableLength = params.minMatchLength;
+          }
+          sarray.BuildLookupTable(genome.seq, genome.length, params.lookupTableLength);
+        }
+      }
+      genome.ConvertThreeBitToAscii();
+      params.useSuffixArray = 1;
+    }
+    else if (params.useSuffixArray) {
+      if (sarray.Read(params.suffixArrayFileName)) {
+        if (params.minMatchLength != 0) {
+          params.listTupleSize = min(8, params.minMatchLength);
+        }
+        else {
+          params.listTupleSize = sarray.lookupPrefixLength;
+        }
+        if (params.minMatchLength < sarray.lookupPrefixLength) {
+          cerr << "WARNING. The value of -minMatch " << params.minMatchLength << " is less than the smallest searched length of " << sarray.lookupPrefixLength << ".  Setting -minMatch to " << sarray.lookupPrefixLength << "." << endl;
+          params.minMatchLength = sarray.lookupPrefixLength;
+        }
+      }
+      else {
+        cout << "ERROR. " << params.suffixArrayFileName << " is not a valid suffix array. " << endl
+             << " Make sure it is generated with the latest version of sawriter." << endl;
+        exit(1);
+      }
+    }
+  }
+
+  if (params.minMatchLength < sarray.lookupPrefixLength) {
+    cerr << "WARNING. The value of -minMatch " << params.minMatchLength << " is less than the smallest searched length of " << sarray.lookupPrefixLength << ".  Setting -minMatch to " << sarray.lookupPrefixLength << "." << endl;
+    params.minMatchLength = sarray.lookupPrefixLength;
+  }
+
+  //
+  // It is required to have a tuple count table
+  // for estimating the background frequencies
+  // for word matching. 
+  // If one is specified on the command line, simply read
+  // it in.  If not, this is operating under the mode 
+  // that everything is computed from scratch.
+  //
+  long l;
+  TupleMetrics saLookupTupleMetrics;
+  if (params.useCountTable) {
+    ifstream ctIn;
+    CrucialOpen(params.countTableName, ctIn, std::ios::in | std::ios::binary);
+    ct.Read(ctIn);
+    saLookupTupleMetrics = ct.tm;
+
+  } else {
+    saLookupTupleMetrics.Initialize(params.lookupTableLength);
+    ct.InitCountTable(saLookupTupleMetrics);
+    ct.AddSequenceTupleCountsLR(genome);
+  }
+
+  TitleTable titleTable;
+  if (params.useTitleTable) {
+    ofstream titleTableOut;
+    CrucialOpen(params.titleTableName, titleTableOut);
+    //
+    // When using a sequence index database, the title table is simply copied 
+    // from the sequencedb. 
+    //
+    if (params.useSeqDB) {
+      titleTable.Copy(seqdb.names, seqdb.nSeqPos-1);
+      titleTable.ResetTableToIntegers(seqdb.names, seqdb.nameLengths, seqdb.nSeqPos-1);
+    }
+    else {
+      //
+      // No seqdb, so there is just one sequence. Still the user specified a title
+      // table, so just the first sequence in the fasta file should be used. 
+      //
+      titleTable.Copy(&fastaGenome.title, 1);
+      titleTable.ResetTableToIntegers(&genome.title, &genome.titleLength, 1);
+      fastaGenome.titleLength = strlen(genome.title);
+    }
+    titleTable.Write(titleTableOut);
+  }
+  else {
+    if (params.useSeqDB) {
+      //
+      // When using a sequence index database, but not the titleTable,
+      // it is necessary to truncate the titles at the first space to
+      // be compatible with the way other alignment programs interpret
+      // fasta titles.  When printing the title table, there is all
+      // sorts of extra storage space, so the full line is stored.
+      //
+      seqdb.SequenceTitleLinesToNames();
+    }
+  }
+
+  ostream  *outFilePtr = &cout;
+  ofstream outFileStrm;
+  ofstream unalignedFile;
+  ostream *unalignedFilePtr = NULL;
+  ofstream metricsOut, lcpBoundsOut;
+  ofstream anchorFileStrm;
+  ofstream clusterOut, *clusterOutPtr;
+ 
+  if (params.anchorFileName != "") {
+    CrucialOpen(params.anchorFileName, anchorFileStrm, std::ios::out);
+  }
+
+  if (params.clusterFileName != "") {
+    CrucialOpen(params.clusterFileName, clusterOut, std::ios::out);
+    clusterOutPtr = &clusterOut;
+    clusterOut << "total_size p_value n_anchors read_length align_score read_accuracy anchor_probability min_exp_anchors seq_length" << endl;
+  }
+  else {
+    clusterOutPtr = NULL;
+  }
+
+  if (params.outFileName != "") {
+      if (not params.printBAM) {
+        CrucialOpen(params.outFileName, outFileStrm, std::ios::out);
+        outFilePtr = &outFileStrm;
+      } // otherwise, use bamWriter and initialize it later
+  } 
+
+  if (params.printHeader) {
+      switch(params.printFormat) {
+          case(SummaryPrint):
+              SummaryOutput::PrintHeader(*outFilePtr);
+              break;
+          case(Interval):
+              IntervalOutput::PrintHeader(*outFilePtr);
+              break;
+          case(CompareSequencesParsable):
+              CompareSequencesOutput::PrintHeader(*outFilePtr);
+              break;
+      }
+  }
+
+  if (params.printUnaligned == true) {
+    CrucialOpen(params.unalignedFileName, unalignedFile, std::ios::out);
+    unalignedFilePtr = &unalignedFile;
+  }
+  
+  if (params.metricsFileName != "") {
+    CrucialOpen(params.metricsFileName, metricsOut);
+  }
+
+  if (params.lcpBoundsFileName != "") {
+    CrucialOpen(params.lcpBoundsFileName, lcpBoundsOut);
+    //    lcpBoundsOut << "pos depth width lnwidth" << endl;
+  }
+  
+  //
+  // Configure the mapping database.
+  //
+
+  MappingData<T_SuffixArray, T_GenomeSequence, T_Tuple> *mapdb = new MappingData<T_SuffixArray, T_GenomeSequence, T_Tuple>[params.nProc];
+
+  int procIndex;
+  pthread_attr_t *threadAttr = new pthread_attr_t[params.nProc];
+  //  MappingSemaphores semaphores;
+  //
+  // When there are multiple processes running along, sometimes there
+  // are semaphores to worry about.
+  //
+
+  if (params.nProc > 1) {
+    semaphores.InitializeAll();
+  }
+  for (procIndex = 0; procIndex < params.nProc; procIndex++ ){
+    pthread_attr_init(&threadAttr[procIndex]);
+  }
+
+  //
+  // Start the mapping jobs.
+  //
+  int readsFileIndex = 0;
+  if (params.subsample < 1) {
+    InitializeRandomGeneratorWithTime();
+    reader = new ReaderAgglomerate(params.subsample);
+  }
+  else {
+    reader = new ReaderAgglomerate(params.startRead, params.stride);
+  }
+  //  In case the input is fasta, make all bases in upper case.
+  reader->SetToUpper();
+
+  
+  regionTableReader = new HDFRegionTableReader;
+  RegionTable regionTable;
+  //
+  // Store lists of how long it took to map each read.
+  //
+  metrics.clocks.SetStoreList(true);
+  if (params.useCcs) {
+    reader->UseCCS();
+  }
+
+  string commandLineString; // Restore command.
+  clp.CommandLineToString(argc, argv, commandLineString);
+  
+  if (params.printSAM or params.printBAM) {
+      string so = "UNKNOWN"; // sorting order;
+      string version = GetVersion(); //blasr version;
+      SAMHeaderPrinter shp(so, seqdb, 
+              params.queryFileNames, params.queryReadType, 
+              params.samQVList, "BLASR", version, 
+              commandLineString); 
+      string headerString = shp.ToString();// SAM/BAM header
+      if (params.printSAM) {
+          *outFilePtr << headerString;
+      } else if (params.printBAM) {
+#ifdef USE_PBBAM
+      BamHeader header = BamHeader(headerString);
+      // Both file name and SAMHeader are required in order to create a BamWriter.
+      bamWriterPtr = new BamWriter(params.outFileName, header);
+#else
+      REQUIRE_PBBAM_ERROR();
+#endif
+      } 
+  }
+
+  for (readsFileIndex = 0; readsFileIndex < params.queryFileNames.size(); readsFileIndex++ ){ 
+    params.readsFileIndex = readsFileIndex;
+    //
+    // Configure the reader to use the correct read and region
+    // file names.
+    // 
+    reader->SetReadFileName(params.queryFileNames[params.readsFileIndex]);
+
+    //
+    // Initialize using already set file names.
+    //
+    int initReturnValue = reader->Initialize();    
+    if (initReturnValue <= 0) {
+        cerr << "WARNING! Could not open file " << params.queryFileNames[params.readsFileIndex] << endl;
+        continue;
+    }
+
+    // Check whether use ccs only.
+    if (reader->GetFileType() == HDFCCSONLY) {
+       params.useAllSubreadsInCcs = false;
+       params.useCcs = params.useCcsOnly = true;
+    }
+
+    string changeListIdString;
+    reader->hdfBasReader.GetChangeListID(changeListIdString);
+    ChangeListID changeListId(changeListIdString);
+    params.qvScaleType = DetermineQVScaleFromChangeListID(changeListId);
+    if (reader->FileHasZMWInformation() and params.useRegionTable) {
+      if (params.readSeparateRegionTable) {
+        if (regionTableReader->Initialize(params.regionTableFileNames[params.readsFileIndex]) == 0) {
+          cout << "ERROR! Could not read the region table " << params.regionTableFileNames[params.readsFileIndex] <<endl;
+          exit(1);
+        }
+        params.useRegionTable = true;
+      }
+      else {
+        if (reader->HasRegionTable()) {
+          if (regionTableReader->Initialize(params.queryFileNames[params.readsFileIndex]) == 0) {
+            cout << "ERROR! Could not read the region table " << params.queryFileNames[params.readsFileIndex] <<endl;
+            exit(1);
+          }
+          params.useRegionTable = true;
+        }
+        else {
+          params.useRegionTable = false;
+        }
+      }
+    }
+    else {
+      params.useRegionTable = false;
+    }
+
+    //
+    //  Check to see if there is a region table. If there is a separate
+    //  region table, use that (over the region table in the bas
+    // file).  If there is a region table in the bas file, use that,
+    // without having to specify a region table on the command line. 
+    //
+    if (params.useRegionTable) {
+      regionTable.Reset();
+      regionTableReader->ReadTable(regionTable);
+      regionTableReader->Close();
+      regionTable.SortTableByHoleNumber();
+    }
+
+    //
+    // Check to see if there is a separate ccs fofn. If there is a separate
+    // ccs fofn, use that over the one in the bas file. 
+    //
+    //if (params.readSeparateCcsFofn and params.useCcs) {
+    //  if (reader->SetCCS(params.ccsFofnFileNames[params.readsFileIndex]) == 0) {
+    //    cout << "ERROR! Could not read the ccs file " 
+    //         << params.ccsFofnFileNames[params.readsFileIndex] << endl;
+    //    exit(1);
+    //  }
+    // }
+
+    if (reader->GetFileType() != HDFCCS and 
+        reader->GetFileType() != HDFBase and
+        reader->GetFileType() != HDFPulse and
+        params.concordant) {
+        cerr << "WARNING! Option concordant is only enabled when "
+             << "input reads are in PacBio base h5 or pulse h5 format." << endl;
+        params.concordant = false;
+    }
+
+
+#ifdef USE_GOOGLE_PROFILER
+    char *profileFileName = getenv("CPUPROFILE");
+    if (profileFileName != NULL) {
+      ProfilerStart(profileFileName);
+    }
+    else {
+      ProfilerStart("google_profile.txt");
+    }
+#endif
+
+      assert (initReturnValue > 0);
+      if (params.nProc == 1) {
+        mapdb[0].Initialize(&sarray, &genome, &seqdb, &ct, &index, params, reader, &regionTable, 
+                            outFilePtr, unalignedFilePtr, &anchorFileStrm, clusterOutPtr);
+        mapdb[0].bwtPtr = &bwt;
+        if (params.fullMetricsFileName != "") {
+          mapdb[0].metrics.SetStoreList(true);
+        }
+        if (params.lcpBoundsFileName != "") {
+          mapdb[0].lcpBoundsOutPtr = &lcpBoundsOut;
+        }
+        else {
+          mapdb[0].lcpBoundsOutPtr = NULL;
+        }
+
+        MapReads(&mapdb[0]);
+        metrics.Collect(mapdb[0].metrics);
+      }
+      else {
+        pthread_t *threads = new pthread_t[params.nProc];
+        for (procIndex = 0; procIndex < params.nProc; procIndex++ ){ 
+          //
+          // Initialize thread-specific parameters.
+          //
+ 
+          mapdb[procIndex].Initialize(&sarray, &genome, &seqdb, &ct, &index, params, reader, &regionTable, 
+                                      outFilePtr, unalignedFilePtr, &anchorFileStrm, clusterOutPtr);
+          mapdb[procIndex].bwtPtr      = &bwt;
+          if (params.fullMetricsFileName != "") {
+            mapdb[procIndex].metrics.SetStoreList(true);
+          }
+          if (params.lcpBoundsFileName != "") {
+            mapdb[procIndex].lcpBoundsOutPtr = &lcpBoundsOut;
+          }
+          else {
+            mapdb[procIndex].lcpBoundsOutPtr = NULL;
+          }
+
+          if (params.outputByThread) {
+            ofstream *outPtr =new ofstream;
+            mapdb[procIndex].outFilePtr = outPtr;
+            stringstream outNameStream;
+            outNameStream << params.outFileName << "." << procIndex;
+            mapdb[procIndex].params.outFileName = outNameStream.str();
+            CrucialOpen(mapdb[procIndex].params.outFileName, *outPtr, std::ios::out);
+          }
+          pthread_create(&threads[procIndex], &threadAttr[procIndex], (void* (*)(void*))MapReads, &mapdb[procIndex]);
+        }
+        for (procIndex = 0; procIndex < params.nProc; procIndex++) {
+          pthread_join(threads[procIndex], NULL);
+        }
+        for (procIndex = 0; procIndex < params.nProc; procIndex++) {
+          metrics.Collect(mapdb[procIndex].metrics);
+          if (params.outputByThread) {
+            delete mapdb[procIndex].outFilePtr;
+          }
+        }
+        if (threads) {
+            delete threads;
+            threads = NULL;
+        }
+      }
+    reader->Close();
+  }
+  
+  if (!reader) {delete reader; reader = NULL;}
+
+  fastaGenome.Free();
+#ifdef USE_GOOGLE_PROFILER
+  ProfilerStop();
+#endif
+
+  if (mapdb != NULL) {
+    delete[] mapdb;
+  }
+  if (threadAttr != NULL) {
+    delete[] threadAttr;
+  }
+  seqdb.FreeDatabase();
+  if (regionTableReader) {
+    delete regionTableReader;
+  }
+  if (params.metricsFileName != "") {
+    metrics.PrintSummary(metricsOut);
+  }
+  if (params.fullMetricsFileName != "") {
+    metrics.PrintFullList(fullMetricsFile);
+  }
+  if (params.outFileName != "") {
+      if (params.printBAM) {
+#ifdef USE_PBBAM
+          assert(bamWriterPtr);
+          try {
+              bamWriterPtr->TryFlush();
+              delete bamWriterPtr;
+              bamWriterPtr = NULL;
+          } catch (std::exception e) {
+              cout << "Error, could not flush bam records to bam file." << endl;
+              exit(1);
+          }
+#else
+          REQUIRE_PBBAM_ERROR();
+#endif
+      } else {
+          outFileStrm.close();
+      }
+  }
+  cerr << "[INFO] " << GetTimestamp() << " [blasr] ended." << endl;
+  return 0;
+}
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000..2c3dd91
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1,85 @@
+all:
+
+ROOT:=.
+include defines.mk
+include rules.mk
+
+CXXFLAGS += -O3 -g
+CXXOPTS += \
+		   -std=c++0x -pedantic \
+           -Wall -Wuninitialized -Wno-div-by-zero \
+           -MMD -MP -w -fpermissive
+GCXXFLAGS := -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fno-omit-frame-pointer 
+CXXFLAGS += ${CXXOPTS} ${GCXXFLAGS}
+#INC_DIRS:=${LIBBLASR_INCLUDE} ${LIBPBIHDF_INCLUDE} ${LIBPBDATA_INCLUDE} ${PBBAM_INCLUDE} ${HTSLIB_INCLUDE} ${HDF5_INCLUDE} ${ZLIB_INCLUDE}
+#LIB_DIRS:=${LIBBLASR_LIB} ${LIBPBIHDF_LIB} ${LIBPBDATA_LIB} ${PBBAM_LIB} ${HTSLIB_LIB} ${HDF5_LIB} ${ZLIB_LIB}
+#LDLIBS := \
+#	${LIBBLASR_LIBFLAGS} ${LIBPBIHDF_LIBFLAGS} ${LIBPBDATA_LIBFLAGS} \
+#	${PBBAM_LIBFLAGS} ${HTSLIB_LIBFLAGS} ${HDF5_LIBFLAGS} ${ZLIB_LIBFLAGS} \
+#	-ldl -lpthread
+
+# HDF5 needs -ldl, but mobs does not pass it in.
+
+SRCS := $(wildcard *.cpp)
+OBJS := ${SRCS:.cpp=.o}
+DEPS := ${SRCS:.cpp=.d}
+
+LD_LIBRARY_PATH=${HDF5_LIB}:${LIBBLASR_LIB}:${LIBPBIHDF_LIB}:${LIBPBDATA_LIB}
+export LD_LIBRARY_PATH
+
+
+init-submodule:
+	${MAKE} update-submodule
+	${MAKE} build-submodule
+
+update-submodule:
+	git submodule update --init
+
+build-submodule:
+	# DON'T use pbbam which is not on github.
+	cd libcpp && NOPBBAM=true HDF5_LIB=${HDF5_LIB}/libhdf5.so HDF5_INCLUDE=${HDF5_INCLUDE} ./configure.py
+	${MAKE} -C libcpp
+
+submodule-clean:
+	${RM} -r libcpp
+
+# The rules above must be run separately.
+all: blasr makeutils
+#all: makeextrautils #This would require pbbam.
+blasr: ${OBJS}
+	${CXX} -o $@ ${CXXFLAGS} ${CPPFLAGS} -MF"${@:%=%.d}" ${OBJS} ${LDFLAGS} ${LDLIBS}
+	@echo LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
+
+makeutils:
+	${MAKE} -C utils
+makeextrautils:
+	${MAKE} -C extrautils
+
+CTESTS := $(wildcard ctest/*.t)
+SLOW_CTESTS := ctest/bug25328.t ctest/useccsallLargeGenome.t
+
+cramtests: blasr utils
+	cram -v --shell=/bin/bash ${CTESTS}
+	make -C utils cramtests
+
+cramfast: blasr utils
+	cram -v --shell=/bin/bash $(filter-out ${SLOW_CTESTS},${CTESTS})
+	make -C utils cramfast
+
+gtest: blasr
+	# This requires the submodule to be configured with gtest.
+	make -C libcpp gtest
+
+check: gtest cramtests
+
+cleanall: cleanlib clean
+
+cleanlib: libcpp/defines.mk
+	${MAKE} -C libcpp clean
+
+clean: 
+	${RM} blasr ${OBJS} ${DEPS} blasr.d
+	${MAKE} -C utils clean
+	${MAKE} -C extrautils clean
+
+-include ${DEPS}
diff --git a/LICENSES.txt b/LICENSES.txt
new file mode 100644
index 0000000..5360bf2
--- /dev/null
+++ b/LICENSES.txt
@@ -0,0 +1,32 @@
+Copyright (c) 2011-2015, Pacific Biosciences of California, Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of Pacific Biosciences nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE.  THIS SOFTWARE IS PROVIDED BY PACIFIC
+BIOSCIENCES AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL PACIFIC BIOSCIENCES OR ITS CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/MANUAL.md b/MANUAL.md
new file mode 100644
index 0000000..92b96b0
--- /dev/null
+++ b/MANUAL.md
@@ -0,0 +1,84 @@
+##NEWS:Refactored blasr has been online! Try it out!##
+  
+  
+##Installation##
+
+###1. Download source code###
+  In order to download blasr source code from github, 
+  
+  + > git clone git at github.com:PacificBiosciences/blasr.git --recursive
+  
+  To sync your local repo with latest from github blasr master branch
+  
+  + > git pull -u origin master && git submodule update --init --recursive 
+
+###2. Requirements###
+
+  To build BLASR, you must have hdf 1.8.12 or above installed and
+  configured with c++ support (you should have the library
+  libhdf5_cpp.a).  If you are intalling the entire PacBio secondary
+  analysis software suite, appropriate hdf libraries are already
+  distributed and no configuration is necessary.  Otherwise, it is
+  necessary to point two environment variables:
+
+  + **HDF5_INC**, which points to locations of the HDF5 headers
+  (e.g., hdf5.h)
+
+  + **HDF5_LIB**, which points to the HDF5 library (e.g., hdf5*.a,
+  and hdf5*.so)
+  
+  You may edit file blasr_git_common.mk in order sepcify HDF5_INC and HDF5_LIB.
+  Alternatively, you may export them from command line.
+  
+  + > export HDF5_INC=path_to_your_hdf5_include && export HDF5_LIB=path_to_your_hdf5_lib
+
+###3. Build blasr only###
+
+  + > make blasr
+  + > ./blasr
+
+###4. Build the source tree, including other executables###
+
+  + > make
+  + > ls utils  # Frequently used executables will be under utils.
+
+
+##Running BLASR##
+
+  Typing 'blasr -h' or 'blasr -help' on the command line will give you a
+  list of options.  At the least, provide a fasta, fastq, or bas.h5 file,
+  and a genome.
+
+  *Some typical use cases:*
+
+  Align reads from reads.bas.h5 to ecoli_K12 genome, and output in SAM format.
+
+  + > blasr reads.bas.h5  ecoli_K12.fasta -sam
+
+  Same as above, but with soft clipping
+
+  + > blasr reads.bas.h5  ecoli_K12.fasta -sam -clipping soft
+
+  Use multiple threads
+
+  + > blasr reads.bas.h5  ecoli_K12.fasta -sam -clipping soft -out alignments.sam -nproc 16
+
+  Include a larger minimal match, for faster but less sensitive alignments
+
+  + > blasr reads.bas.h5  ecoli_K12.fasta -sam -clipping soft -minMatch 15
+
+  Produce alignments in a pairwise human readable format
+
+  + > blasr reads.bas.h5  ecoli_K12.fasta -m 0
+
+  Use a precomputed suffix array for faster startup
+
+  + > sawriter hg19.fasta.sa hg19.fasta #First precompute the suffix array
+  + > blasr reads.bas.h5 hg19.fasta -sa hg19.fasta.sa
+
+  Use a precomputed BWT-FM index for smaller runtime memory footprint, but slower alignments.
+
+  + > sa2bwt hg19.fasta hg19.fasta.sa hg19.fasta.bwt
+  + > blasr reads.bas.h5 hg19.fasta -bwt hg19.fasta.bwt
+  
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..938351b
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,59 @@
+SHELL=bash -e -E
+
+.PHONY: all pblib makeutils gtest cramtests cramfast check clean cleanall cleanlib
+
+include common.mk
+
+SRCS := $(wildcard *.cpp)
+OBJS := $(SRCS:.cpp=.o)
+DEPS := $(SRCS:.cpp=.d)
+EXE = blasr
+UTILS = utils
+
+all : CXXFLAGS ?= $(DEFAULTCXXFLAG)
+debug : CXXFLAGS ?= $(DEBUGCXXFLAG)
+profile : CXXFLAGS ?= $(PROFILECXXFLAG)
+g: CXXFLAGS += $(GCXXFLAG)
+g: LIBS = $(GLIBS)
+
+
+all debug profile g: $(EXE) makeutils 
+
+$(EXE): $(SRCS) $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $(SRCS) $(LIBDIRS) $(LIBS)
+
+# DON'T use pbbam which is not on github.
+PBINCROOT:=$(abspath libcpp)
+pblib: $(PBINCROOT)/configure.py $(PBINCROOT)/makefile
+	cd $(PBINCROOT) && NOPBBAM=true HDF5_LIB=${HDF5_LIB}/libhdf5.so ./configure.py
+	cd $(PBINCROOT) && ${MAKE}
+
+makeutils:
+	make -C $(UTILS) $(MODE) 
+
+CTESTS := $(wildcard ctest/*.t)
+SLOW_CTESTS := ctest/bug25328.t ctest/useccsallLargeGenome.t
+
+cramtests: $(EXE) $(UTILS) 
+	cram -v --shell=/bin/bash $(CTESTS)
+	make -C $(UTILS) cramtests
+
+cramfast: $(EXE) $(UTILS)
+	cram -v --shell=/bin/bash $(filter-out $(SLOW_CTESTS),$(CTESTS))
+	make -C $(UTILS) cramfast
+
+gtest: $(EXE)
+	make -C $(PBINCROOT) gtest
+
+check: gtest cramtests
+
+cleanall: cleanlib clean
+
+cleanlib: $(PBINCROOT)/Makefile
+	@make -C $(PBINCROOT) cleanall
+
+clean: 
+	@rm -f $(EXE) $(OBJS) $(DEPS) blasr.d
+	@make -C $(UTILS) clean
+
+-include $(DEPS)
diff --git a/MappingIPC.h b/MappingIPC.h
new file mode 100644
index 0000000..acd1789
--- /dev/null
+++ b/MappingIPC.h
@@ -0,0 +1,105 @@
+#ifndef MAPPING_IPC_H_
+#define MAPPING_IPC_H_
+
+#include <pthread.h>
+
+#include "MappingParameters.h"
+
+#include "FASTASequence.hpp"
+#include "FASTQSequence.hpp"
+#include "tuples/TupleList.hpp"
+#include "tuples/DNATuple.hpp"
+#include "tuples/CompressedDNATuple.hpp"
+#include "tuples/TupleCountTable.hpp"
+#include "files/ReaderAgglomerate.hpp"
+#include "MappingMetrics.hpp"
+#include "suffixarray/SuffixArrayTypes.hpp"
+#include "metagenome/SequenceIndexDatabase.hpp"
+#include "reads/RegionTable.hpp"
+#include "bwt/BWT.hpp"
+/*
+ * This structure contains pointers to all required data structures
+ * for mapping reads to a suffix array and evaluating the significance
+ * of the matches.
+ */
+
+template<typename T_SuffixArray, typename T_GenomeSequence, typename T_Tuple>
+class MappingData {
+public:
+    T_SuffixArray        *suffixArrayPtr;
+    BWT                  *bwtPtr;
+    T_GenomeSequence     *referenceSeqPtr;
+    SequenceIndexDatabase<FASTASequence> *seqDBPtr;
+    TupleCountTable<T_GenomeSequence, T_Tuple> *ctabPtr;
+    MappingParameters     params;
+    MappingMetrics        metrics;
+    RegionTable          *regionTablePtr;
+    ReaderAgglomerate    *reader;
+    ostream *outFilePtr;
+    ostream *unalignedFilePtr;
+    ostream *anchorFilePtr;
+    ostream *clusterFilePtr;
+    ostream *lcpBoundsOutPtr;
+
+    // Declare a semaphore for blocking on reading from the same hdhf file.
+
+    void ShallowCopySuffixArray(T_SuffixArray &dest) {
+        dest.index              = suffixArrayPtr->index;
+        dest.length             = suffixArrayPtr->length;
+        dest.target             = suffixArrayPtr->target;
+        dest.startPosTable      = suffixArrayPtr->startPosTable;
+        dest.endPosTable        = suffixArrayPtr->endPosTable;
+        dest.lookupTableLength  = suffixArrayPtr->lookupTableLength;
+        dest.lookupPrefixLength = suffixArrayPtr->lookupPrefixLength;
+        dest.tm                 = suffixArrayPtr->tm;
+        dest.deleteStructures   = false;
+        //		dest.useLCPTable        = suffixArrayPtr->useLCPTable;
+    }
+
+    void ShallowCopySequenceIndexDatabase(SequenceIndexDatabase<FASTQSequence> &dest) {
+        dest.nSeqPos     = seqDBPtr->nSeqPos;
+        dest.seqStartPos = seqDBPtr->seqStartPos;
+        dest.nameLengths = seqDBPtr->nameLengths;
+        dest.names       = seqDBPtr->names;
+        dest.deleteStructures = false;
+    }
+
+    void ShallowCopyTupleCountTable(	TupleCountTable<T_GenomeSequence, T_Tuple> &dest) {
+        dest.countTable       = ctabPtr->countTable;
+        dest.countTableLength = ctabPtr->countTableLength;
+        dest.nTuples          = ctabPtr->nTuples;
+        dest.tm               = ctabPtr->tm;
+        dest.deleteStructures = false;
+    }
+
+    void ShallowCopyReferenceSequence(T_GenomeSequence &refSeq) {
+        refSeq.ShallowCopy(*referenceSeqPtr);
+        refSeq.deleteOnExit = false;
+    }
+
+    void Initialize(T_SuffixArray *saP, T_GenomeSequence *refP, 
+            SequenceIndexDatabase<FASTASequence> *seqDBP,
+            TupleCountTable<T_GenomeSequence, T_Tuple> *ctabP,
+            ReverseCompressIndex *rciP,
+            MappingParameters &paramsP,
+            ReaderAgglomerate *readerP,
+            RegionTable *regionTableP,
+            ostream *outFileP,
+            ostream *unalignedFileP,
+            ostream *anchorFilePtrP, 
+            ostream *clusterFilePtrP=NULL) {
+        suffixArrayPtr     = saP;
+        referenceSeqPtr    = refP;
+        seqDBPtr           = seqDBP;
+        ctabPtr            = ctabP;
+        regionTablePtr     = regionTableP;
+        params             = paramsP;
+        reader             = readerP;
+        outFilePtr         = outFileP;
+        unalignedFilePtr   = unalignedFileP;
+        anchorFilePtr      = anchorFilePtrP;
+        clusterFilePtr= clusterFilePtrP;
+    }
+};
+
+#endif
diff --git a/MappingParameters.h b/MappingParameters.h
new file mode 100644
index 0000000..1e67e96
--- /dev/null
+++ b/MappingParameters.h
@@ -0,0 +1,681 @@
+#ifndef MAPPING_PARAMETERS_H_
+#define MAPPING_PARAMETERS_H_
+
+#define REQUIRE_PBBAM_ERROR() \
+assert("blasr must be compiled with lib pbbam to perform IO on bam." == 0);
+
+#include <vector>
+
+#include "reads/ReadType.hpp"
+#include "utils/FileOfFileNames.hpp"
+#include "utils/RangeUtils.hpp"
+#include "tuples/TupleMetrics.hpp"
+#include "datastructures/anchoring/AnchorParameters.hpp"
+#include "qvs/QualityValue.hpp"
+#include "format/SAMPrinter.hpp"
+#include "algorithms/alignment/AlignmentFormats.hpp"
+#include "files/BaseSequenceIO.hpp"
+#include "datastructures/alignment/FilterCriteria.hpp"
+
+class MappingParameters {
+public:
+    //
+    // Parameters for global substitution, insertion, and deletion priors.
+    //
+    float minFractionToBeConsideredOverlapping;
+    float indelRate;
+    float minRatio;
+    int indel;
+    int idsIndel;
+    int sdpIndel;
+    int sdpIns, sdpDel;
+    int insertion;
+    int deletion;
+    int mismatch;
+    int sdpTupleSize;
+    int match;
+    int showAlign;
+    int refineAlign;
+    bool useScoreCutoff;
+    int maxScore;
+    int argi;
+    int nProc;
+    int globalChainType;
+    int readIndex;
+    SAMOutput::Clipping clipping;
+    string clippingString;
+    QVScale qvScaleType;
+    vector<string> readsFileNames; // = queryFileNames, genomeFileName
+    vector<string> queryFileNames;
+    string genomeFileName; 
+    // Query file type: FASTA/FASTQ/HDF*/PBBAM,
+    // Note that mixed query file types is not allowed.
+    FileType queryFileType; 
+    // Query read type, SUBREAD, CCS or UNKNOWN
+    // Note that mixed read types is not allowed.
+    ReadType::ReadTypeEnum queryReadType; 
+    vector<string> regionTableFileNames;
+    vector<string> ccsFofnFileNames;
+    string tupleListName;
+    string posTableName;
+    string outFileName;
+    string suffixArrayFileName;
+    string bwtFileName;
+    string indexFileName;
+    string anchorFileName;
+    string clusterFileName;
+    VectorIndex nBest;
+    int printWindow;
+    int doCondense;
+    int do4BitComp;
+    int cutoff;
+    int useSuffixArray;
+    int useBwt;
+    int useReverseCompressIndex;
+    int useTupleList;
+    int useSeqDB;
+    string seqDBName;
+    int useCountTable;
+    string countTableName;
+    int minMatchLength;
+    int listTupleSize;
+    int printFormat;
+    int maxExpand, minExpand;
+    int startRead;
+    int stride;
+    int pValueType;
+    float subsample;
+    int sortRefinedAlignments;
+    int verbosity;
+    bool printSAM;
+    bool cigarUseSeqMatch;
+    bool printBAM;
+    bool storeMapQV;
+    bool useRandomSeed;
+    int  randomSeed;
+    bool placeRandomly;
+    bool printHeader;
+    bool samplePaths;
+    bool warp, nowarp;
+    //bool usePrefixLookupTable;
+    bool doSensitiveSearch;
+    bool emulateNucmer;
+    bool refineBetweenAnchorsOnly;
+    bool byAdapter;
+    bool extendDenovoCCSSubreads;
+    TupleMetrics saTupleMetrics;
+    TupleMetrics sdpTupleMetrics;
+    int lookupTableLength;
+    //int branchQualityThreshold;
+    int qualityLowerCaseThreshold;
+    AnchorParameters anchorParameters;
+    int readsFileIndex;
+    //int numBranches;
+    bool storeMetrics;
+    bool ignoreQualities;
+    bool extendFrontAlignment;
+    bool extendAlignments;
+    int  maxExtendDropoff;
+    int  minReadLength;
+    int  maxReadLength;
+    int  minSubreadLength;
+    int  minRawSubreadScore;
+    int  minAvgQual;
+    bool overlap;
+    bool advanceHalf;
+    int advanceExactMatches;
+    float approximateMaxInsertionRate;
+    float minPctSimilarity; // [0, 100]
+    float minPctAccuracy; // [0, 100]
+    bool refineAlignments;
+    int nCandidates;
+    bool doGlobalAlignment;
+    string tempDirectory;
+    bool useTitleTable;
+    string titleTableName;
+    bool readSeparateRegionTable;
+    bool readSeparateCcsFofn;
+    string regionTableFileName;
+    string ccsFofnFileName;
+    //float averageMismatchScore;
+    bool mapSubreadsSeparately;
+    bool concordant;
+    int  flankSize;
+    bool useRegionTable;
+    bool useHQRegionTable;
+    bool printUnaligned;
+    string unalignedFileName;
+    string metricsFileName;
+    string lcpBoundsFileName;
+    string fullMetricsFileName;
+    bool printSubreadTitle;
+    bool useCcs;
+    bool useAllSubreadsInCcs;
+    bool useCcsOnly;
+    bool detailedSDPAlignment, nouseDetailedSDPAlignment;
+    int  chunkSize;
+    int  subreadMapType;
+    int  sdpFilterType;
+    bool useGuidedAlign;
+    int  guidedAlignBandSize;
+    int  bandSize;
+    int  extendBandSize;
+    bool useQVScore;
+    int  scoreType;
+    bool printVerboseHelp;
+    bool printDiscussion;
+    float sdpBypassThreshold;
+    bool computeAlignProbability;
+    float qvMatchWeight;
+    float qvMismatchWeight;
+    float qvInsWeight;
+    float qvDelWeight;
+    float readAccuracyPrior;
+    bool  printVersion;
+    int   substitutionPrior;
+    int   globalDeletionPrior;
+    bool  outputByThread;
+    int   maxReadIndex;
+    int   recurseOver;
+    bool  forPicard;
+    bool  separateGaps;
+    string scoreMatrixString;
+    bool  printDotPlots;
+    bool  preserveReadTitle;
+    bool  forwardOnly;
+    bool  printOnlyBest;
+    bool  affineAlign;
+    int   affineExtend;
+    int   affineOpen;
+    bool  scaleMapQVByNumSignificantClusters;
+    int   limsAlign;
+    string holeNumberRangesStr;
+    Ranges holeNumberRanges;
+    int minAlnLength;
+    bool printSAMQV;
+    vector<string> samQV;
+    SupplementalQVList samQVList;
+    bool fastMaxInterval;
+    bool aggressiveIntervalCut;
+    bool fastSDP;
+    string concordantTemplate; 
+    bool concordantAlignBothDirections;
+    FilterCriteria filterCriteria;
+    string hitPolicyStr;
+    HitPolicy hitPolicy;
+    bool enableHiddenPaths;
+
+    void Init() {
+        readIndex = -1;
+        maxReadIndex = -1;
+        qvMatchWeight = 1.0;
+        qvMismatchWeight = 1.0;
+        qvInsWeight = 1.0;
+        qvDelWeight = 1.0;
+        minFractionToBeConsideredOverlapping = 0.75;
+        minRatio = 0.25;
+        indelRate = 0.3;
+        indel    = 5;
+        insertion = 4; // asymmetric indel parameters
+        deletion  = 5;
+        idsIndel = 15;
+        sdpIndel = 5;
+        sdpIns   = 5;
+        sdpDel   = 10;
+        sdpTupleSize = 11;
+        match = 0;
+        mismatch = 0;
+        showAlign = 1;
+        refineAlign = 1;
+        useScoreCutoff = false;
+        maxScore = -200;
+        argi = 1;
+        nProc = 1;
+        readsFileNames.clear();
+        queryFileNames.clear();
+        genomeFileName = "";
+        queryReadType = ReadType::UNKNOWN;
+        queryFileType = FileType::None;
+        tupleListName = "";
+        posTableName = "";
+        suffixArrayFileName= "";
+        bwtFileName = "";
+        indexFileName = "";
+        anchorFileName = "";
+        outFileName = "";
+        nBest = 10;
+        nCandidates = 10;
+        printWindow = 0;
+        doCondense  = 0;
+        do4BitComp  = 0;
+        pValueType = 0;
+        cutoff = 0;
+        useSuffixArray = 0;
+        useBwt = 0;
+        useReverseCompressIndex = 0;
+        useTupleList = 0;
+        useSeqDB = 0;
+        seqDBName = "";
+        useCountTable = 0;
+        countTableName = "";
+        lookupTableLength = 8;
+        anchorParameters.minMatchLength = minMatchLength = 12;
+        printFormat = SummaryPrint;
+        maxExpand = 0;
+        minExpand = 0;
+        startRead = 0;
+        stride    = 1;
+        subsample = 1.1;
+        listTupleSize = 6;
+        sortRefinedAlignments = 1;
+        anchorParameters.verbosity = verbosity = 0;
+        saTupleMetrics.Initialize(listTupleSize);
+        sdpTupleMetrics.Initialize(sdpTupleSize);
+        qualityLowerCaseThreshold = 0;
+        anchorParameters.branchQualityThreshold = 0;
+        readsFileIndex = 0;
+        printSAM = false;
+        printBAM = false;
+        useRandomSeed = false;
+        randomSeed = 0;
+        placeRandomly = false;
+        samplePaths = false;
+        nowarp = false;
+        storeMapQV = true;
+        warp = true;
+        extendDenovoCCSSubreads = false;
+        storeMetrics = false;
+        ignoreQualities = true;
+        extendFrontAlignment = false;
+        extendAlignments = false;
+        maxExtendDropoff = 10;
+        minReadLength = 50;
+        maxReadLength = 0; // means no max read length
+        minSubreadLength = 0;
+        minRawSubreadScore = -1; // raw subread score in region table should be in range [0, 1000].
+        minAvgQual = 0;
+        overlap = false;
+        advanceHalf = false;
+        refineAlignments = true;
+        anchorParameters.advanceExactMatches = advanceExactMatches = 0;
+        approximateMaxInsertionRate = 1.30;
+        minPctSimilarity = 0;
+        minPctAccuracy = 0;
+        doGlobalAlignment = false;
+        tempDirectory = "";
+        useTitleTable = false;
+        titleTableName  = "";
+        readSeparateRegionTable = false;
+        readSeparateCcsFofn = false;
+        regionTableFileName = "";
+        ccsFofnFileName = "";
+        mapSubreadsSeparately=true;
+        concordant=false;
+        flankSize=40;
+        useRegionTable = true;
+        useHQRegionTable=true;
+        printUnaligned = false;
+        unalignedFileName = "";
+        globalChainType = 0;
+        metricsFileName = "";
+        fullMetricsFileName = "";
+        doSensitiveSearch = false;
+        emulateNucmer = false;
+        refineBetweenAnchorsOnly = false;
+        printSubreadTitle = true;
+        detailedSDPAlignment = true;
+        nouseDetailedSDPAlignment = false;
+        subreadMapType = 0;
+        useCcs     = false;
+        useCcsOnly = false;
+        useAllSubreadsInCcs = false;
+        chunkSize = 10000000;
+        sdpFilterType = 0;
+        anchorParameters.stopMappingOnceUnique = true;
+        useGuidedAlign = true;
+        bandSize = 0;
+        extendBandSize = 10;
+        guidedAlignBandSize = 10;
+        useQVScore = false;
+        printVerboseHelp = false;
+        printDiscussion = false;
+        sdpBypassThreshold = 1000000.0;
+        scoreType = 0;
+        byAdapter = false;
+        qvScaleType = PHRED;
+        printHeader = false;
+        computeAlignProbability = false;    
+        readAccuracyPrior = 0.85;
+        printVersion = false;
+        clipping = SAMOutput::none;
+        clippingString = "";
+        substitutionPrior = 20;
+        globalDeletionPrior = 13;
+        outputByThread = false;
+        recurseOver = 10000;
+        forPicard = false;
+        separateGaps = false;
+        scoreMatrixString = "";
+        printDotPlots = false;
+        preserveReadTitle = false;
+        forwardOnly = false;
+        printOnlyBest = false;
+        affineAlign = false;
+        affineExtend = 0;
+        affineOpen = 10;
+        scaleMapQVByNumSignificantClusters = false;
+        limsAlign = 0;
+        holeNumberRangesStr = "";
+        minAlnLength = 0;
+        printSAMQV = false;
+        cigarUseSeqMatch = false;
+        samQV.clear();
+        samQVList.clear();
+        fastMaxInterval = false;
+        aggressiveIntervalCut = false;
+        fastSDP = false;
+        concordantTemplate = "mediansubread"; // typicalsubread or longestsubread
+        concordantAlignBothDirections = false;
+
+        hitPolicyStr = "all";
+        ResetFilterAndHit();
+        enableHiddenPaths = false; //turn off hidden paths.
+    }
+
+    MappingParameters()
+        : filterCriteria(0, 0, 0, false, Score(0, ScoreSign::NEGATIVE))
+        , hitPolicy("all", ScoreSign::NEGATIVE)
+    {
+        Init();
+    }
+
+    void MakeSane() { 
+        // Expand FOFN
+        FileOfFileNames::ExpandFileNameList(readsFileNames);
+
+        // Must have at least a query and a genome 
+        if (readsFileNames.size() <= 1) {
+            cout << "Error, you must provide at least one reads file and a genome file." <<endl;
+            exit(1);
+        }
+
+        // Separate query reads files and a genome read file
+        // The last reads file is the genome
+        queryFileNames = readsFileNames;
+        queryFileNames.pop_back();
+        genomeFileName = readsFileNames.back();
+  
+        // Check query file type.
+        BaseSequenceIO::DetermineFileTypeByExtension(queryFileNames[0], queryFileType);
+        for (size_t i = 1; i < queryFileNames.size(); i++) {
+            FileType fileType;
+            BaseSequenceIO::DetermineFileTypeByExtension(queryFileNames[i], fileType);
+            if (fileType != queryFileType) {
+                cout << "ERROR, mixed query file types is not allowed." << endl;
+                exit(1);
+            }
+        }
+
+#ifdef __APPLE__
+        nProc = 1;
+        cerr << "WARNING, multi-threading is not yet supported on Apple iOS." << endl;
+#endif
+
+        // -useQuality can not be used in combination with a fasta input
+        if (!ignoreQualities) {
+            if (queryFileType == Fasta) {
+                cout<<"ERROR, you can not use -useQuality option when any of the input reads files are in multi-fasta format."<<endl; 
+                exit(1);
+            }
+        }
+
+        //
+        // Fix all logical incompatibilities with parameters.
+        //
+        if (nowarp) {
+            warp = false;
+        }
+
+        if (nCandidates < nBest) {
+            cerr << "Warning: resetting nCandidates to nBest " << nBest << endl;
+            nCandidates = nBest;
+        }
+
+        if (placeRandomly and hitPolicyStr != "randombest") {
+            cerr << "Warning: placeRepeatsRandomly is deprecated, resetting hit policy to randombest." << endl;
+            hitPolicyStr = "randombest";
+        }
+        if ((hitPolicyStr == "random" or hitPolicyStr == "randombest") and nBest == 1) {
+            cerr << "Warning: When attempting to select equivalently scoring reads at random " << endl
+                << "the bestn parameter should be greater than one." << endl;
+        }
+
+        if (concordant) {
+            if (useCcs) {
+                concordant = false;
+            } else {
+                useRegionTable   = true;
+                useHQRegionTable = true;
+            }
+            if (concordantTemplate != "longestsubread" and concordantTemplate != "typicalsubread" and concordantTemplate != "mediansubread") {
+                cout << "ERROR, unsupported concordantTemplate: " << concordantTemplate << endl;
+                exit(1);
+            }
+        }
+
+        if (sdpFilterType > 1) {
+            cerr << "Warning: using new filter method for SDP alignments.  The parameter is " << endl
+                << "either 0 or 1, but " << sdpFilterType << " was specified." << endl;
+            sdpFilterType = 1;
+        }
+        if (sdpFilterType == 0) {
+            detailedSDPAlignment = true;
+            nouseDetailedSDPAlignment = false;
+        }
+        if (detailedSDPAlignment == false) {
+            sdpFilterType = 1;
+        }
+        if (useGuidedAlign == true and bandSize == 0) {
+            bandSize = 16;
+        }
+        anchorParameters.minMatchLength = minMatchLength;
+        if (suffixArrayFileName != "") {
+            useSuffixArray = true;
+        }
+        if (bwtFileName != "") {
+            useBwt = true;
+        }
+        if (useBwt and useSuffixArray) {
+            cout << "ERROR, sa and bwt must be used independently." << endl;
+            exit(1);
+        }
+        if (countTableName != "") {
+            useCountTable = true;
+        }
+        if (metricsFileName != "" or fullMetricsFileName != "") {
+            storeMetrics = true;
+        }
+        if (useCcsOnly) {
+            useCcs = true;
+        }
+        if (useAllSubreadsInCcs == true) {
+            useCcs = true;
+        }
+        if (titleTableName != "") {
+            useTitleTable = true;
+        }
+        if (unalignedFileName != "") {
+            printUnaligned = true;
+        }
+        if (regionTableFileName != "") {
+            useRegionTable = true;
+            readSeparateRegionTable = true;
+        }
+        if (ccsFofnFileName != "") {
+            readSeparateCcsFofn = true;
+        }
+        if (nouseDetailedSDPAlignment == true) {
+            detailedSDPAlignment = false;
+        }
+        if (nouseDetailedSDPAlignment == false) {
+            detailedSDPAlignment = true;
+        }
+        if (anchorParameters.maxLCPLength != 0 and anchorParameters.maxLCPLength < anchorParameters.minMatchLength) {
+            cerr << "ERROR: maxLCPLength is less than minLCPLength, which will result in no hits." << endl;
+        }
+        if (subsample < 1 and stride > 1) {
+            cout << "ERROR, subsample and stride must be used independently." << endl;
+            exit(1);
+        }
+
+        if (subreadMapType < 0 or subreadMapType > 1) {
+            cout << "Error, subreadImplType must be 0 or 1" << endl;
+            exit(1);
+        }
+
+        if (emulateNucmer) {
+            SetEmulateNucmer();
+        }
+
+        if (randomSeed != 0) {
+            useRandomSeed = true;
+        }
+        if (printSAM) {
+            printFormat = SAM;
+            forPicard = true;
+        }
+        //
+        // Parse the clipping.
+        //
+        if (clippingString == "soft") {
+            clipping = SAMOutput::soft;
+        }
+        else if (clippingString == "hard") {
+            clipping = SAMOutput::hard;
+        }
+        else if (clippingString == "none") {
+            clipping = SAMOutput::none;
+        }
+        else if (clippingString == "subread") {
+            clipping = SAMOutput::subread;
+        }
+        else if (clippingString != "") {
+            cout << "ERROR, clipping should either be soft, hard, or none." << endl;
+            exit(1);
+        }
+
+        if (printBAM) {
+#ifndef USE_PBBAM
+            REQUIRE_PBBAM_ERROR();
+#else
+            cigarUseSeqMatch = true; // ALWAYS true for BAM
+            printFormat = BAM;
+            forPicard = true;
+            printSAM = false;
+            samQVList.SetDefaultQV();
+            printSAMQV = true;
+            if (clipping != SAMOutput::soft) {
+                // Only support two clipping methods: soft or subread.
+                clipping = SAMOutput::subread;
+            }
+            if (queryFileType != PBBAM and not enableHiddenPaths) {
+                // bax|fasta|fastq -> bam paths are turned off by default 
+                cout << "ERROR, could not output alignments in BAM unless input reads are in PacBio BAM files." << endl;
+                exit(1);
+            }
+            if (outFileName == "") {
+                cout << "ERROR, BAM output file must be specified." << endl;
+                exit(1);
+            }
+            if (outputByThread) {
+                cout << "ERROR, could not output alignments by threads in BAM format." << endl;
+                exit(1);
+            }
+#endif
+        }
+
+        if (limsAlign != 0) {
+            mapSubreadsSeparately = false;
+            forwardOnly = true;
+        }
+
+        if (holeNumberRangesStr.size() > 0) {
+            if (not holeNumberRanges.setRanges(holeNumberRangesStr)) {
+                cout << "ERROR, could not parse hole number ranges: " 
+                    << holeNumberRangesStr << "." << endl;
+                exit(1);
+            }
+        }
+
+        if (printSAMQV) {
+            if (samQV.size() == 0) {
+                samQVList.SetDefaultQV();
+            }
+            else {
+                samQVList.UseQV(samQV);
+            }
+        }
+
+        if (minRawSubreadScore > 1000) {
+            cout << "ERROR, minimum raw subread score should be less than 1000." << endl;
+            exit(1);
+        }
+        if (minRawSubreadScore != -1 and byAdapter) {
+            cout << "ERROR, minRawSubreadScore and byAdapter should not be used together." << endl;
+            exit(1);
+        }
+        // Determine query read type
+        queryReadType = DetermineQueryReadType();
+        // Pass verbosity
+        anchorParameters.verbosity = verbosity; 
+
+        // Set filter criteria and hit policy
+        ResetFilterAndHit();
+    }
+    void ResetFilterAndHit(void) {
+        filterCriteria = FilterCriteria(minAlnLength, minPctSimilarity, 
+                                        minPctAccuracy, true, 
+                                        Score(static_cast<float>(maxScore), ScoreSign::NEGATIVE));
+        hitPolicy = HitPolicy(hitPolicyStr, ScoreSign::NEGATIVE);
+    }
+
+    ReadType::ReadTypeEnum DetermineQueryReadType() {
+        if (useCcsOnly or queryFileType == HDFCCSONLY) {
+            return ReadType::CCS;
+        }
+        if (queryFileType == PBBAM) {
+            // Read type in BAM may be CCS, SUBREAD, HQREGION or POLYMERASE.
+            // Determine it later.
+            return ReadType::UNKNOWN;
+        } 
+        if (mapSubreadsSeparately) {
+            return ReadType::SUBREAD;
+        } else {
+            if (useHQRegionTable) {
+                return ReadType::HQREGION;
+            } else {
+                return ReadType::POLYMERASE;
+            }
+        }
+    }
+
+    void SetEmulateNucmer() {
+        anchorParameters.stopMappingOnceUnique = true;
+        anchorParameters.advanceExactMatches   = 30;
+        anchorParameters.maxAnchorsPerPosition = 1;
+        sdpBypassThreshold                     = 0.75;
+        sdpTupleSize                           = 15;
+        anchorParameters.minMatchLength        = 30;
+        useGuidedAlign                         = true;
+        refineAlignments                       = false;
+    }
+
+    void SetForSensitivity() {
+        advanceExactMatches = 0;
+        anchorParameters.numBranches = 1;
+        anchorParameters.maxAnchorsPerPosition = 10000;
+    }
+};
+
+
+#endif
diff --git a/MappingSemaphores.h b/MappingSemaphores.h
new file mode 100644
index 0000000..d7524f6
--- /dev/null
+++ b/MappingSemaphores.h
@@ -0,0 +1,45 @@
+#ifndef ALIGNMENT_MAPPING_SEMAPHORE_H_
+#define ALIGNMENT_MAPPING_SEMAPHORE_H_
+#include <vector>
+#include <pthread.h>
+#include <semaphore.h>
+
+#ifndef __APPLE__
+class MappingSemaphores {
+  public:
+	sem_t reader;
+	sem_t writer;
+	sem_t unaligned;
+	sem_t hitCluster;
+	MappingSemaphores& operator=(MappingSemaphores &rhs) {
+		return *this;
+	}
+
+	void InitializeAll() {
+		sem_init(&reader, 0, 1);
+		sem_init(&writer, 0, 1);
+		sem_init(&unaligned, 0, 1);
+		sem_init(&hitCluster, 0, 1);
+	}
+};
+#else
+class MappingSemaphores {
+  public:
+	sem_t *reader;
+	sem_t *writer;
+	sem_t *unaligned;
+	sem_t *hitCluster;
+	MappingSemaphores& operator=(MappingSemaphores &rhs) {
+		return *this;
+	}
+
+	void InitializeAll() {
+		reader     = sem_open("/reader",     O_CREAT, 0644, 1);
+		writer     = sem_open("/writer",     O_CREAT, 0644, 1);
+		unaligned  = sem_open("/unaligned",  O_CREAT, 0644, 1);
+		hitCluster = sem_open("/hitCluster", O_CREAT, 0644, 1);
+	}
+};
+#endif
+
+#endif
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8bc8e40
--- /dev/null
+++ b/README.md
@@ -0,0 +1,52 @@
+# NEWS: refactored blasr has been put online. Please try it out!
+
+Blasr installation and maual: 
+
+    more Manual.md
+
+To pull this project from git hub to your local system:
+
+    git clone git at github.com:PacificBiosciences/blasr.git blasr --recursive
+
+To sync your code with the latest git code base:
+
+    git pull -u origin master && git submodule update --init --recursive 
+
+To specify HDF5 headers and lib on your system:
+
+    export HDF5_INCLUDE=path_to_your_hdf5_include && export HDF5_LIB=path_to_your_hdf5_lib
+
+To configure:
+
+    ./configure.py --no-pbbam
+
+or with HDF5 directories (and note that `HDF5_LIB` is a *directory* here):
+
+    ./configure.py --no-pbbam HDF5_INCLUDE=... HDF5_LIB=...
+
+To make the 'libcpp' libraries:
+
+    make build-submodule
+
+To make 'blasr' only:
+
+    make blasr
+
+To compile all tools, including blasr, pls2fasta, loadPulses, sawriter:
+
+    make
+
+To test (with **cram** installed):
+
+    #make cramtests
+    make cramfast
+    ## Currently:
+    ## Ran 22 tests, 0 skipped, 4 failed.
+
+To clean all compiled tools and lib:
+
+    make cleanall
+
+To clean compiled tools without cleaning lib:
+
+    make clean
diff --git a/RegisterBlasrOptions.h b/RegisterBlasrOptions.h
new file mode 100644
index 0000000..e1f8fe6
--- /dev/null
+++ b/RegisterBlasrOptions.h
@@ -0,0 +1,529 @@
+/*
+ * ============================================================================
+ *
+ *       Filename:  RegisterOptions.hpp
+ *
+ *    Description:  
+ *
+ *        Version:  1.0
+ *        Created:  04/29/2015 04:48:26 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+
+#include "libconfig.h"
+#include "CommandLineParser.hpp"
+#include "MappingParameters.h"
+#include "RegisterFilterOptions.h"
+#include <sstream>
+using namespace std;
+
+void RegisterBlasrOptions(CommandLineParser & clp, MappingParameters & params) {
+    int  trashbinInt;
+    float trashbinFloat;
+    bool trashbinBool;
+    clp.RegisterStringOption("sa", &params.suffixArrayFileName, "");
+    clp.RegisterStringOption("ctab", &params.countTableName, "" );
+    clp.RegisterStringOption("regionTable", &params.regionTableFileName, "");
+    clp.RegisterStringOption("ccsFofn", &params.ccsFofnFileName, "");
+    clp.RegisterIntOption("bestn", (int*) &params.nBest, "", CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("limsAlign", &params.limsAlign, "", CommandLineParser::PositiveInteger);
+    clp.RegisterFlagOption("printOnlyBest", &params.printOnlyBest, "");
+    clp.RegisterFlagOption("outputByThread", &params.outputByThread, "");
+    clp.RegisterFlagOption("rbao", &params.refineBetweenAnchorsOnly, "");
+    clp.RegisterFlagOption("allowAdjacentIndels", &params.forPicard, "");
+    clp.RegisterFlagOption("onegap", &params.separateGaps, "");
+    clp.RegisterFlagOption("allowAdjacentIndels", &params.forPicard, "");
+    clp.RegisterFlagOption("placeRepeatsRandomly", &params.placeRandomly, "");
+    clp.RegisterIntOption("randomSeed", &params.randomSeed, "", CommandLineParser::Integer);
+    clp.RegisterFlagOption("extend", &params.extendAlignments, "");
+    clp.RegisterIntOption("branchExpand", &params.anchorParameters.branchExpand, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("maxExtendDropoff", &params.maxExtendDropoff, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFlagOption("nucmer", &params.emulateNucmer, "");
+    clp.RegisterIntOption("maxExpand", &params.maxExpand, "", CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("minExpand", &params.minExpand, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterStringOption("seqdb",  &params.seqDBName, "");
+    clp.RegisterStringOption("anchors",  &params.anchorFileName, "");
+    clp.RegisterStringOption("clusters", &params.clusterFileName, "");
+    clp.RegisterFlagOption("samplePaths", (bool*) &params.samplePaths, "");
+    clp.RegisterFlagOption("noStoreMapQV", &params.storeMapQV, "");
+    clp.RegisterFlagOption("nowarp", (bool*) &params.nowarp, "");
+    clp.RegisterFlagOption("noRefineAlign", (bool*) &params.refineAlign, "");
+    clp.RegisterFlagOption("guidedAlign", (bool*)&params.useGuidedAlign, "");
+    clp.RegisterFlagOption("useGuidedAlign", (bool*)&trashbinBool, "");
+    clp.RegisterFlagOption("noUseGuidedAlign", (bool*)&params.useGuidedAlign, "");
+    clp.RegisterFlagOption("header", (bool*)&params.printHeader, "");
+    clp.RegisterIntOption("subreadImplType", &params.subreadMapType, "", CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("bandSize", &params.bandSize, "", CommandLineParser::PositiveInteger);  
+    clp.RegisterIntOption("extendBandSize", &params.extendBandSize, "", CommandLineParser::PositiveInteger);  
+    clp.RegisterIntOption("guidedAlignBandSize", &params.guidedAlignBandSize, "", CommandLineParser::PositiveInteger);  
+    clp.RegisterIntOption("maxAnchorsPerPosition", &params.anchorParameters.maxAnchorsPerPosition, "", CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("stopMappingOnceUnique", (int*) &params.anchorParameters.stopMappingOnceUnique, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterStringOption("out", &params.outFileName, "");
+    clp.RegisterIntOption("match", &params.match, "", CommandLineParser::Integer);
+    clp.RegisterIntOption("mismatch", &params.mismatch, "", CommandLineParser::Integer);
+    clp.RegisterIntOption("minMatch", &params.minMatchLength, "", CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("maxMatch", &params.anchorParameters.maxLCPLength, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("maxLCPLength", &params.anchorParameters.maxLCPLength, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("indel", &params.indel, "", CommandLineParser::Integer);
+    clp.RegisterIntOption("insertion", &params.insertion, "", CommandLineParser::Integer);
+    clp.RegisterIntOption("deletion", &params.deletion, "", CommandLineParser::Integer);
+    clp.RegisterIntOption("idsIndel", &params.idsIndel, "", CommandLineParser::Integer);
+    clp.RegisterIntOption("sdpindel", &params.sdpIndel, "", CommandLineParser::Integer);
+    clp.RegisterIntOption("sdpIns", &params.sdpIns, "", CommandLineParser::Integer);
+    clp.RegisterIntOption("sdpDel", &params.sdpDel, "", CommandLineParser::Integer);
+    clp.RegisterFloatOption("indelRate", &params.indelRate, "", CommandLineParser::NonNegativeFloat);
+    clp.RegisterFloatOption("minRatio", &params.minRatio, "", CommandLineParser::NonNegativeFloat); 
+    clp.RegisterFloatOption("sdpbypass", &params.sdpBypassThreshold, "", CommandLineParser::NonNegativeFloat);
+    clp.RegisterFloatOption("minFrac", &trashbinFloat, "", CommandLineParser::NonNegativeFloat);
+    clp.RegisterIntOption("maxScore", &params.maxScore, "", CommandLineParser::Integer);
+    clp.RegisterStringOption("bwt", &params.bwtFileName, "");
+    clp.RegisterIntOption("m", &params.printFormat, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFlagOption("sam", &params.printSAM, "");
+#ifdef USE_PBBAM
+    clp.RegisterFlagOption("bam", &params.printBAM, "");
+#endif
+    clp.RegisterStringOption("clipping", &params.clippingString, "");
+    clp.RegisterIntOption("sdpTupleSize", &params.sdpTupleSize, "", CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("pvaltype", &params.pValueType, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("start", &params.startRead, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("stride", &params.stride, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFloatOption("subsample", &params.subsample, "", CommandLineParser::PositiveFloat);
+    clp.RegisterIntOption("nproc", &params.nProc, "", CommandLineParser::PositiveInteger);
+    clp.RegisterFlagOption("sortRefinedAlignments",(bool*) &params.sortRefinedAlignments, "");
+    clp.RegisterIntOption("quallc", &params.qualityLowerCaseThreshold, "", CommandLineParser::Integer);
+    clp.RegisterFlagOption("v", (bool*) &params.verbosity, "");
+    clp.RegisterIntOption("V", &params.verbosity, "Specify a level of verbosity.", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("contextAlignLength", &params.anchorParameters.contextAlignLength, "", CommandLineParser::PositiveInteger);
+    clp.RegisterFlagOption("skipLookupTable", &params.anchorParameters.useLookupTable, "");
+    clp.RegisterStringOption("metrics", &params.metricsFileName, "");
+    clp.RegisterStringOption("lcpBounds", &params.lcpBoundsFileName, "");
+    clp.RegisterStringOption("fullMetrics", &params.fullMetricsFileName, "");
+    clp.RegisterIntOption("nbranch", &params.anchorParameters.numBranches, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFlagOption("divideByAdapter", &params.byAdapter, "");
+    clp.RegisterFlagOption("useQuality", &params.ignoreQualities, "");
+    clp.RegisterFlagOption("noFrontAlign", &params.extendFrontAlignment, "");
+    clp.RegisterIntOption("minReadLength", &params.minReadLength, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("maxReadLength", &params.maxReadLength, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("minSubreadLength", &params.minSubreadLength, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("minRawSubreadScore", &params.minRawSubreadScore, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("minAvgQual", &params.minAvgQual, "", CommandLineParser::Integer);
+    clp.RegisterFlagOption("advanceHalf", &params.advanceHalf, "");
+    clp.RegisterIntOption("advanceExactMatches", &params.anchorParameters.advanceExactMatches, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFlagOption("useccs", &params.useCcs, "");
+    clp.RegisterFlagOption("useccsdenovo", &params.useCcsOnly, "");
+    clp.RegisterFlagOption("useccsall", &params.useAllSubreadsInCcs, "");
+    clp.RegisterFlagOption("extendDenovoCCSSubreads", &params.extendDenovoCCSSubreads, "");
+    clp.RegisterFlagOption("noRefineAlignments", &params.refineAlignments, "");
+    clp.RegisterIntOption("nCandidates", &params.nCandidates, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFlagOption("useTemp", (bool*) &params.tempDirectory, "");
+    clp.RegisterFlagOption("noSplitSubreads", &params.mapSubreadsSeparately, "");
+    clp.RegisterFlagOption("concordant", &params.concordant, "");
+    // When -concordant is turned on, blasr first selects a subread (e.g., the median length full-pass subread) 
+    // of a zmw as template, maps the template subread to a reference, then infers directions of all other subreads
+    // of the same zmw based on direction of the template, and finally maps all other subreads to the same
+    // genomic coordinates as the template. When -concordantAlignBothDirections is turned on, blasr will align
+    // all other subreads both forwardly and backwardly, without infering their directions. This is a hidden
+    // diagnostic option only useful for analyzing movies which have lots of un-identified or missed adapters such
+    // that directions of subreads can not be inferred accurately.
+    clp.RegisterFlagOption("concordantAlignBothDirections", &params.concordantAlignBothDirections, "");
+    clp.RegisterIntOption("flankSize", &params.flankSize, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("subreadMapType", &params.subreadMapType, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterStringOption("titleTable", &params.titleTableName, "");
+    clp.RegisterFlagOption("useSensitiveSearch", &params.doSensitiveSearch, "");
+    clp.RegisterFlagOption("ignoreRegions", &params.useRegionTable, "");
+    clp.RegisterFlagOption("ignoreHQRegions", &params.useHQRegionTable, "");
+    clp.RegisterFlagOption("computeAlignProbability", &params.computeAlignProbability, "");
+    clp.RegisterStringOption("unaligned", &params.unalignedFileName, "");
+    clp.RegisterFlagOption("global", &params.doGlobalAlignment, "");
+    clp.RegisterIntOption("globalChainType", &params.globalChainType, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFlagOption("noPrintSubreadTitle", (bool*) &params.printSubreadTitle, "");
+    clp.RegisterIntOption("saLookupTableLength", &params.lookupTableLength, "", CommandLineParser::PositiveInteger);
+    clp.RegisterFlagOption("useDetailedSDP", &params.detailedSDPAlignment, "");
+    clp.RegisterFlagOption("nouseDetailedSDP", &trashbinBool, "");
+    clp.RegisterIntOption("sdpFilterType", &params.sdpFilterType, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("scoreType", &params.scoreType, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFlagOption("h", &params.printVerboseHelp, "");
+    clp.RegisterFlagOption("help", &params.printDiscussion, "");
+    clp.RegisterFloatOption("accuracyPrior",    &params.readAccuracyPrior, "", CommandLineParser::NonNegativeFloat);
+    clp.RegisterIntOption("readIndex", &params.readIndex, "", CommandLineParser::NonNegativeInteger);
+    // holeNumberRangesStr is a string of comma-delimited hole number ranges, such as '1,2,3,10-15'.
+    // Blasr only analyzes reads whose hole numbers are in the specified hole number ranges. 
+    clp.RegisterStringOption("holeNumbers", &params.holeNumberRangesStr, "");
+    clp.RegisterIntOption("maxReadIndex", &params.maxReadIndex, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("substitutionPrior",  &params.substitutionPrior, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("deletionPrior",  &params.globalDeletionPrior, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("recurseOver", &params.recurseOver, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterStringOption("scoreMatrix", &params.scoreMatrixString, "");
+    clp.RegisterFlagOption("printDotPlots", &params.printDotPlots, "");
+    clp.RegisterFlagOption("preserveReadTitle", &params.preserveReadTitle,"");
+    clp.RegisterFlagOption("forwardOnly", &params.forwardOnly,"");
+    clp.RegisterFlagOption("affineAlign", &params.affineAlign, "");
+    clp.RegisterIntOption("affineOpen", &params.affineOpen, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterIntOption("affineExtend", &params.affineExtend, "", CommandLineParser::NonNegativeInteger);
+    clp.RegisterFlagOption("scaleMapQVByNClusters", &params.scaleMapQVByNumSignificantClusters, "", false);
+    clp.RegisterFlagOption("printSAMQV", &params.printSAMQV, "", false);
+    clp.RegisterFlagOption("cigarUseSeqMatch", &params.cigarUseSeqMatch, "");
+    clp.RegisterStringListOption("samQV", &params.samQV, "");
+    clp.RegisterFlagOption("fastMaxInterval", &params.fastMaxInterval, "", false);
+    clp.RegisterFlagOption("aggressiveIntervalCut", &params.aggressiveIntervalCut, "", false);
+    clp.RegisterFlagOption("fastSDP", &params.fastSDP, "", false);
+    clp.RegisterStringOption("concordantTemplate", &params.concordantTemplate, "typicalsubread");
+
+    RegisterFilterOptions(clp, params.minAlnLength, params.minPctSimilarity, params.minPctAccuracy, 
+                          params.hitPolicyStr, trashbinBool=true, trashbinInt, params.maxScore);
+}
+
+const string BlasrHelp(MappingParameters & params) {
+  stringstream helpStream;
+  helpStream << "   Options for blasr " << endl
+             << "   Basic usage: 'blasr reads.{bam|fasta|bax.h5|fofn} genome.fasta [-options] " << endl
+             << " option\tDescription (default_value)." << endl << endl
+             << " Input Files." << endl
+             << "   reads.bam   is a PacBio BAM file of reads." << endl
+             << "               This is the preferred input to blasr because rich quality" << endl
+             << "               value (insertion,deletion, and substitution quality values) information is " << endl
+             << "               maintained.  The extra quality information improves variant detection and mapping"<<endl
+             << "               speed." << endl
+             << "   reads.fasta is a multi-fasta file of reads.  While any fasta file is valid input, " << endl
+             << "   reads.bax.h5|reads.plx.h5 is the old DEPRECATED output format of SMRT reads." << endl
+             << "   input.fofn  File of file names accepted." << endl << endl
+             << "   -sa suffixArrayFile"<< endl
+             << "               Use the suffix array 'sa' for detecting matches" << endl 
+             << "               between the reads and the reference.  The suffix" << endl 
+             << "               array has been prepared by the sawriter program." << endl << endl 
+             << "   -ctab tab "<<endl
+             << "               A table of tuple counts used to estimate match significance.  This is " << endl
+             << "               by the program 'printTupleCountTable'.  While it is quick to generate on " << endl
+             << "               the fly, if there are many invocations of blasr, it is useful to"<<endl
+             << "               precompute the ctab." <<endl << endl
+             << "   -regionTable table (DEPRECATED)" << endl
+             << "               Read in a read-region table in HDF format for masking portions of reads." << endl
+             << "               This may be a single table if there is just one input file, " << endl
+             << "               or a fofn.  When a region table is specified, any region table inside " << endl
+             << "               the reads.plx.h5 or reads.bax.h5 files are ignored."<< endl
+             << endl 
+             << "(DEPRECATED) Options for modifying reads." << endl
+             << "               There is ancilliary information about substrings of reads " << endl
+             << "               that is stored in a 'region table' for each read file.  Because " << endl
+             << "               HDF is used, the region table may be part of the .bax.h5 or .plx.h5 file," << endl
+             << "               or a separate file.  A contiguously read substring from the template " << endl
+             << "               is a subread, and any read may contain multiple subreads. The boundaries " << endl
+             << "               of the subreads may be inferred from the region table either directly or " <<endl
+             << "               by definition of adapter boundaries.  Typically region tables also" << endl
+             << "               contain information for the location of the high and low quality regions of"<<endl
+             << "               reads.  Reads produced by spurrious reads from empty ZMWs have a high"<<endl
+             << "               quality start coordinate equal to high quality end, making no usable read." <<endl
+             << "   -useccs   " << endl
+             << "               Align the circular consensus sequence (ccs), then report alignments" << endl
+             << "               of the ccs subreads to the window that the ccs was mapped to.  Only " << endl
+             << "               alignments of the subreads are reported." << endl  
+             << "   -useccsall"<<endl 
+             << "               Similar to -useccs, except all subreads are aligned, rather than just" << endl
+             << "               the subreads used to call the ccs.  This will include reads that only"<<endl
+             << "               cover part of the template." << endl
+             << "   -useccsdenovo" << endl
+             << "               Align the circular consensus, and report only the alignment of the ccs"<<endl
+             << "               sequence." << endl
+             << "   -noSplitSubreads (false)" <<endl
+             << "               Do not split subreads at adapters.  This is typically only " << endl
+             << "               useful when the genome in an unrolled version of a known template, and " << endl
+             << "               contains template-adapter-reverse_template sequence." << endl
+             << "   -ignoreRegions(false)" << endl
+             << "               Ignore any information in the region table." << endl
+             << "   -ignoreHQRegions (false)Ignore any hq regions in the region table." << endl
+             << endl
+             << " Alignments To Report." << endl
+             << "   -bestn n (10)" <<endl
+             << "               Report the top 'n' alignments." << endl
+             << "   -hitPolicy" << endl
+             << "               " << params.hitPolicy.Help(string(15, ' ')) << endl
+             << "   -placeRepeatsRandomly (false)" << endl
+             << "               DEPRECATED! If true, equivalent to -hitPolicy randombest." << endl
+             << "   -randomSeed (0)" << endl
+             << "               Seed for random number generator. By default (0), use current time as seed. " << endl
+             << "   -noSortRefinedAlignments (false) " << endl
+             << "               Once candidate alignments are generated and scored via sparse dynamic "<< endl
+             << "               programming, they are rescored using local alignment that accounts " << endl
+             << "               for different error profiles." <<endl
+             << "               Resorting based on the local alignment may change the order the hits are returned." << endl
+             << "   -allowAdjacentIndels " << endl
+             << "               When specified, adjacent insertion or deletions are allowed. Otherwise, adjacent " << endl
+             << "               insertion and deletions are merged into one operation.  Using quality values " << endl
+             << "               to guide pairwise alignments may dictate that the higher probability alignment "<<endl
+             << "               contains adjacent insertions or deletions.  Current tools such as GATK do not permit" << endl
+             << "               this and so they are not reported by default." << endl << endl
+             << " Output Formats and Files" << endl
+             << "   -out out (terminal)  " << endl
+             << "               Write output to 'out'." << endl
+#ifdef USE_PBBAM
+             << "   -bam        Write output in PacBio BAM format. This is the preferred output format." << endl
+             << "               Input query reads must be in PacBio BAM format." << endl
+#endif 
+             << "   -sam        Write output in SAM format." << endl
+             << "   -m t           " << endl
+             << "               If not printing SAM, modify the output of the alignment." << endl
+             << "                t=" << StickPrint <<   " Print blast like output with |'s connecting matched nucleotides." << endl 
+             << "                  " << SummaryPrint << " Print only a summary: score and pos." << endl 
+             << "                  " << CompareXML <<   " Print in Compare.xml format." << endl 
+             << "                  " << Vulgar <<       " Print in vulgar format (DEPRECATED)." << endl
+             << "                  " << Interval <<     " Print a longer tabular version of the alignment." << endl 
+             << "                  " << CompareSequencesParsable  << " Print in a machine-parsable format that is read by compareSequences.py." << endl
+             << "   -header" <<endl
+             << "               Print a header as the first line of the output file describing the contents of each column."<<endl
+             << "   -titleTable tab (NULL) " << endl
+             << "               Construct a table of reference sequence titles.  The reference sequences are " << endl
+             << "               enumerated by row, 0,1,...  The reference index is printed in alignment results" << endl
+             << "               rather than the full reference name.  This makes output concise, particularly when" << endl
+             << "               very verbose titles exist in reference names."<< endl
+             << "   -unaligned file" << endl
+             << "               Output reads that are not aligned to 'file'" << endl
+             << "   -clipping [none|hard|subread|soft] (none)" << endl
+             << "               Use no/hard/subread/soft clipping, ONLY for SAM/BAM output."<< endl
+             << "   -printSAMQV (false)" << endl
+             << "               Print quality values to SAM output." << endl
+             << "   -cigarUseSeqMatch (false)" << endl
+             << "               CIGAR strings in SAM/BAM output use '=' and 'X' to represent sequence match and mismatch instead of 'M'." << endl << endl
+             << " Options for anchoring alignment regions. This will have the greatest effect on speed and sensitivity." << endl
+             << "   -minMatch m (12) " << endl
+             << "               Minimum seed length.  Higher minMatch will speed up alignment, " << endl
+             << "               but decrease sensitivity." << endl
+//             << "   -maxExpand M (1)" << endl
+//             << "               Perform no more than M iterations of searches through the suffix " << endl
+//             << "               array for matches. At each iteration, all matches of length LCPi-M" << endl
+//             << "               are found, where LCPi is the length of the longest common prefix " << endl
+//             << "               between the string at i and anywhere in the genome."<<endl
+//             << "               The number of matches grows as M increases, and can become very large with M > 3." << endl
+             << "   -maxMatch l (inf)" << endl
+             << "               Stop mapping a read to the genome when the lcp length reaches l.  " << endl
+             << "               This is useful when the query is part of the reference, for example when " <<endl
+             << "               constructing pairwise alignments for de novo assembly."<<endl
+             << "   -maxLCPLength l (inf)" << endl
+             << "               The same as -maxMatch." << endl
+             << "   -maxAnchorsPerPosition m (10000) " << endl
+             << "               Do not add anchors from a position if it matches to more than 'm' locations in the target." << endl
+//             << "   -advanceHalf (false) " << endl
+//             << "               A trick for speeding up alignments at the cost of sensitivity.  If " << endl
+//             << "               a cluster of anchors of size n, (a1,...,an) is found, normally anchors " << endl
+//             << "               (a2,...an) of size n-1 is also clustered to make sure a1 did not decrease the " << endl
+//             << "               cluster score.  When advanceHalf is specified, clustering begins at a_(n/2)."<<endl<< endl
+             << "   -advanceExactMatches E (0)" << endl
+             << "               Another trick for speeding up alignments with match - E fewer anchors.  Rather than" << endl 
+             << "               finding anchors between the read and the genome at every position in the read, " <<endl
+             << "               when an anchor is found at position i in a read of length L, the next position " << endl
+             << "               in a read to find an anchor is at i+L-E." << endl
+             << "               Use this when alignining already assembled contigs." << endl
+             << "   -nCandidates n (10)" << endl 
+             << "               Keep up to 'n' candidates for the best alignment.  A large value of n will slow mapping" << endl
+             << "               because the slower dynamic programming steps are applied to more clusters of anchors" <<endl
+             << "               which can be a rate limiting step when reads are very long."<<endl
+             << "   -concordant(false)" << endl
+             << "               Map all subreads of a zmw (hole) to where the longest full pass subread of the zmw " << endl
+             << "               aligned to. This requires to use the region table and hq regions." << endl
+             << "               This option only works when reads are in base or pulse h5 format." << endl
+             << "   -concordantTemplate(mediansubread)" << endl
+             << "               Select a full pass subread of a zmw as template for concordant mapping." << endl
+             << "               longestsubread - use the longest full pass subread" << endl
+             << "               mediansubread  - use the median length full pass subread" << endl
+             << "               typicalsubread - use the second longest full pass subread if length of" << endl
+             << "                                the longest full pass subread is an outlier" << endl
+             << "   -fastMaxInterval(false)" << endl
+             << "               Fast search maximum increasing intervals as alignment candidates. The search " << endl
+             << "               is not as exhaustive as the default, but is much faster." << endl
+             << "   -aggressiveIntervalCut(false)" << endl
+             << "               Agreesively filter out non-promising alignment candidates, if there " << endl
+             << "               exists at least one promising candidate. If this option is turned on, " << endl
+             << "               Blasr is likely to ignore short alignments of ALU elements." << endl
+             << "   -fastSDP(false)" << endl
+             << "               Use a fast heuristic algorithm to speed up sparse dynamic programming." << endl
+             << endl
+             << "  Options for Refining Hits." << endl
+//             << "   -indelRate i (0.30)" << endl
+//             << "               The approximate maximum rate to allow drifting from the diagonal." <<endl << endl
+             << "   -sdpTupleSize K (11)" << endl
+             << "               Use matches of length K to speed dynamic programming alignments.  This controls" <<endl
+             << "               accuracy of assigning gaps in pairwise alignments once a mapping has been found,"<<endl
+             << "               rather than mapping sensitivity itself."<<endl
+             << "   -scoreMatrix \"score matrix string\" " << endl
+             << "               Specify an alternative score matrix for scoring fasta reads.  The matrix is " << endl
+             << "               in the format " << endl
+             << "                  ACGTN" << endl
+             << "                A abcde" << endl
+             << "                C fghij" << endl
+             << "                G klmno" << endl
+             << "                T pqrst" << endl
+             << "                N uvwxy" << " . The values a...y should be input as a quoted space separated " << endl
+             << "               string: \"a b c ... y\". Lower scores are better, so matches should be less " << endl
+             << "               than mismatches e.g. a,g,m,s = -5 (match), mismatch = 6. " << endl
+             << "   -affineOpen value (10) " << endl
+             << "               Set the penalty for opening an affine alignment." << endl
+             << "   -affineExtend a (0)" << endl
+             << "               Change affine (extension) gap penalty. Lower value allows more gaps." << endl << endl
+             << " Options for overlap/dynamic programming alignments and pairwise overlap for de novo assembly. " << endl
+             << "   -useQuality (false)" << endl
+             << "               Use substitution/insertion/deletion/merge quality values to score gap and " << endl
+             << "               mismatch penalties in pairwise alignments.  Because the insertion and deletion" << endl
+             << "               rates are much higher than substitution, this will make many alignments " <<endl
+             << "               favor an insertion/deletion over a substitution.  Naive consensus calling methods "<<endl
+             << "               will then often miss substitution polymorphisms. This option should be " << endl
+             << "               used when calling consensus using the Quiver method.  Furthermore, when " << endl
+             << "               not using quality values to score alignments, there will be a lower consensus " << endl
+             << "               accuracy in homolymer regions." << endl
+             << "   -affineAlign (false)" << endl
+             << "               Refine alignment using affine guided align." << endl << endl
+             << " Options for filtering reads and alignments" << endl
+             << "   -minReadLength l(50)" << endl
+             << "               Skip reads that have a full length less than l. Subreads may be shorter." << endl 
+             << "   -minSubreadLength l(0)" << endl
+             << "               Do not align subreads of length less than l." << endl
+             << "   -minRawSubreadScore m(0)" << endl
+             << "               Do not align subreads whose quality score in region table is less than m (quality scores should be in range [0, 1000])." << endl
+             << "   -maxScore m(-200)" << endl //params.filterCriteria.scoreCutoff
+             << "               Maximum score to output (high is bad, negative good)." << endl
+             << "   -minAlnLength" << endl
+             << "               " << params.filterCriteria.MinAlnLengthHelp() << endl
+             << "   -minPctSimilarity" << endl
+             << "               " << params.filterCriteria.MinPctSimilarityHelp() << endl
+             << "   -minPctAccuracy" << endl
+             << "               " << params.filterCriteria.MinPctAccuracyHelp() << endl << endl 
+             << " Options for parallel alignment." << endl
+             << "   -nproc N (1)" << endl
+             << "               Align using N processes.  All large data structures such as the suffix array and " << endl
+             << "               tuple count table are shared."<<endl
+             << "   -start S (0)" << endl
+             << "               Index of the first read to begin aligning. This is useful when multiple instances " << endl
+             << "               are running on the same data, for example when on a multi-rack cluster."<<endl
+             << "   -stride S (1)" << endl
+             << "               Align one read every 'S' reads." << endl << endl
+             << " Options for subsampling reads." << endl
+             << "   -subsample (0)" << endl
+             << "               Proportion of reads to randomly subsample (expressed as a decimal) and align." << endl
+             << "   -holeNumbers LIST " << endl
+             << "               When specified, only align reads whose ZMW hole numbers are in LIST." << endl
+             << "               LIST is a comma-delimited string of ranges, such as '1,2,3,10-13'." << endl
+             << "               This option only works when reads are in bam, bax.h5 or plx.h5 format." << endl
+             << endl 
+//             << " Options for dynamic programming alignments. " << endl << endl
+//             << "   -ignoreQuality" << endl
+//             << "                 Ignore quality values when computing alignments (they still may be used." << endl 
+//             << "                 when mapping)." << endl << endl
+//             << " -v            Print some verbose information." << endl 
+//             << " -V 2          Make verbosity more verbose.  Probably only useful for development." << endl
+             << " -h            Print this help file." << endl << endl
+             << "To cite BLASR, please use: Chaisson M.J., and Tesler G., Mapping " << endl
+             << "single molecule sequencing reads using Basic Local Alignment with " << endl
+             << "Successive Refinement (BLASR): Theory and Application, BMC " << endl
+             << "Bioinformatics 2012, 13:238." << endl 
+             << "Please report any bugs to "
+             << "'https://github.com/PacificBiosciences/blasr/issues'." << endl << endl;
+  return helpStream.str();
+}
+
+const string BlasrConciseHelp(void) {
+    stringstream ss;
+    ss << "blasr - a program to map reads to a genome" << endl
+       << " usage: blasr reads genome " << endl
+       << " Run with -h for a list of commands " << endl
+       << "          -help for verbose discussion of how to run blasr." << endl;
+    return ss.str();
+}
+
+const string BlasrSummaryHelp(void) {
+    stringstream ss;
+    ss << "   Basic usage: 'blasr reads.{bam|fasta|bax.h5|fofn} genome.fasta [-options] " << endl
+       << " [option]\tDescription (default_value)." << endl << endl
+       << " Input Files." << endl
+       << "   reads.bam is the NEW native output format for SMRT reads." 
+          "This is the preferred input to blasr because rich quality"
+          "value (insertion,deletion, and substitution quality values) information is "
+          "maintained.  The extra quality information improves variant detection and mapping"<<
+          "speed." << endl
+       << "   reads.fasta is a multi-fasta file of reads.  While any fasta file is valid input, " 
+          "it is preferable to use bax.h5 or plx.h5 files because they contain "
+          "more rich quality value information." << endl
+       << "   reads.bax.h5|reads.plx.h5 is the OLD (DEPRECATED) output format of "
+          "SMRT reads. " << endl
+       << "   reads.fofn File of file names accepted."
+       << endl << endl;
+  return ss.str();
+}
+
+const string BlasrDiscussion(void) {
+    stringstream ss;
+    ss << "NAME" << endl
+       << "         blasr - Map SMRT Sequences to a reference genome."<< endl << endl
+       << "SYNOPSIS" << endl
+       << "         blasr reads.bam genome.fasta -bam -out out.bam" << endl << endl
+       << "         blasr reads.fasta genome.fasta " << endl << endl
+       << "         blasr reads.fasta genome.fasta -sa genome.fasta.sa" << endl << endl
+       << "         blasr reads.bax.h5 genome.fasta [-sa genome.fasta.sa] " << endl << endl
+       << "         blasr reads.bax.h5 genome.fasta -sa genome.fasta.sa -maxScore -100 -minMatch 15 ... " << endl << endl
+       << "         blasr reads.bax.h5 genome.fasta -sa genome.fasta.sa -nproc 24 -out alignment.out ... " << endl << endl
+       << "DESCRIPTION " << endl
+       << "  blasr is a read mapping program that maps reads to positions " << endl
+       << "  in a genome by clustering short exact matches between the read and" << endl
+       << "  the genome, and scoring clusters using alignment. The matches are" << endl
+       << "  generated by searching all suffixes of a read against the genome" << endl
+       << "  using a suffix array. Global chaining methods are used to score " << endl
+       << "  clusters of matches." << endl << endl
+       << "  The only required inputs to blasr are a file of reads and a" << endl
+       << "  reference genome.  It is exremely useful to have read filtering" << endl
+       << "  information, and mapping runtime may decrease substantially when a" << endl
+       << "  precomputed suffix array index on the reference sequence is" << endl
+       << "  specified." << endl
+       << "  " << endl
+       << "  Although reads may be input in FASTA format, the recommended input is" << endl
+       << "  PacBio BAM files because these contain qualtiy value" << endl
+       << "  information that is used in the alignment and produces higher quality" << endl
+       << "  variant detection." << endl
+       << "  Although alignments can be output in various formats, the recommended " << endl
+       << "  output format is PacBio BAM." << endl
+       << "  Support to bax.h5 and plx.h5 files will be DEPRECATED." << endl
+       << "  Support to region tables for h5 files will be DEPRECATED." << endl
+       //<< "  Read filtering information is contained in the .bax.h5 input files as" << endl
+       //<< "  well as generated by other post-processing programs with analysis of" << endl
+       //<< "  pulse files and read in from a separate .region.h5 file.  The current" << endl
+       //<< "  set of filters that are applied to reads are high quality region" << endl
+       //<< "  filtering, and adapter filtering.  Regions outside high-quality" << endl
+       //<< "  regions are ignored in mapping.  Reads that contain regions annotated" << endl
+       //<< "  as adapter are split into non-adapter (template) regions, and mapped" << endl
+       //<< "  separately." << endl
+       << "  " << endl
+       << "  When suffix array index of a genome is not specified, the suffix array is" << endl
+       << "  built before producing alignment.   This may be prohibitively slow" << endl
+       << "  when the genome is large (e.g. Human).  It is best to precompute the" << endl
+       << "  suffix array of a genome using the program sawriter, and then specify" << endl
+       << "  the suffix array on the command line using -sa genome.fa.sa." << endl
+       << "  " << endl
+       << "  The optional parameters are roughly divided into three categories:" << endl
+       << "  control over anchoring, alignment scoring, and output. " << endl
+       << "  " << endl
+       << "  The default anchoring parameters are optimal for small genomes and" << endl
+       << "  samples with up to 5% divergence from the reference genome.  The main" << endl
+       << "  parameter governing speed and sensitivity is the -minMatch parameter." << endl
+       << "  For human genome alignments, a value of 11 or higher is recommended.  " << endl
+       << "  Several methods may be used to speed up alignments, at the expense of" << endl
+       << "  possibly decreasing sensitivity.  " << endl
+       << "  " << endl
+//       << "  If the genome is highly repetitive or divergent from the read" << endl
+//       << "  sequences, the value of -maxExpand should be increased.  This option" << endl
+//       << "  controls how much the search for anchors is expanded past a simple" << endl
+//       << "  greedy search.  A value for -maxExpand of 1 is sufficent for" << endl
+//       << "  non-repetitive genomes, and values of -maxExpand greater than 5 are" << endl
+//       << "  not recommended." << endl
+//       << "  " << endl
+       << "  Regions that are too repetitive may be ignored during mapping by" << endl
+       << "  limiting the number of positions a read maps to with the" << endl
+       << "  -maxAnchorsPerPosition option.  Values between 500 and 1000 are effective" << endl
+       << "  in the human genome." << endl
+       << "  " << endl
+       << "  For small genomes such as bacterial genomes or BACs, the default parameters " << endl
+       << "  are sufficient for maximal sensitivity and good speed." << endl
+       << endl << endl;
+    return ss.str();
+}
diff --git a/RegisterFilterOptions.h b/RegisterFilterOptions.h
new file mode 100644
index 0000000..de422db
--- /dev/null
+++ b/RegisterFilterOptions.h
@@ -0,0 +1,53 @@
+#include "libconfig.h" 
+#include "CommandLineParser.hpp"
+#include "datastructures/alignment/FilterCriteria.hpp"
+#include <sstream>
+using namespace std;
+
+/// Register options for filtering alignments.
+void RegisterFilterOptions(CommandLineParser & clp, int & minAlnLength,
+                           float & minPctSimilarity, float & minPctAccuracy, 
+                           string & hitPolicyStr, bool & useScoreCutoff,
+                           int & scoreSignInt, int & scoreCutoff) {
+    ScoreSign ss = static_cast<ScoreSign>(scoreSignInt);
+    Score sc(static_cast<float>(scoreCutoff),  ss);
+    FilterCriteria fc(static_cast<DNALength>(minAlnLength), 
+                      minPctSimilarity, minPctAccuracy, 
+                      useScoreCutoff, sc);
+
+    HitPolicy hp("randombest", ScoreSign::NEGATIVE);
+
+    clp.RegisterIntOption("minAlnLength", &minAlnLength, 
+                          fc.MinAlnLengthHelp(),
+                          CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("minAlignLength", &minAlnLength, 
+                          "Alias of -minAlnLength", 
+                          CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("minLength", &minAlnLength, 
+                          "Alias of -minAlnLength", 
+                          CommandLineParser::PositiveInteger);
+
+    clp.RegisterFloatOption("minPctSimilarity", &minPctSimilarity, 
+                            fc.MinPctSimilarityHelp(), 
+                            CommandLineParser::PositiveFloat);
+    clp.RegisterFloatOption("minPctIdentity", &minPctSimilarity, 
+                            "Alias of -minPctSimilarity",
+                            CommandLineParser::PositiveFloat);
+
+    clp.RegisterFloatOption("minPctAccuracy", &minPctAccuracy,
+                            fc.MinPctAccuracyHelp(),
+                            CommandLineParser::PositiveFloat);
+    clp.RegisterFloatOption("minAccuracy", &minPctAccuracy,
+                            "Alias of -minPctAccuracy",
+                            CommandLineParser::PositiveFloat);
+
+    clp.RegisterStringOption("hitPolicy", &hitPolicyStr, hp.Help());
+            
+    clp.RegisterIntOption("scoreSign", &scoreSignInt, 
+                          fc.ScoreSignHelp(),
+                          CommandLineParser::Integer);
+
+    clp.RegisterIntOption("scoreCutoff", &scoreCutoff, 
+                          fc.ScoreCutoffHelp(),
+                          CommandLineParser::Integer);
+}
diff --git a/blasr_git_common.mk b/blasr_git_common.mk
new file mode 100644
index 0000000..5834a55
--- /dev/null
+++ b/blasr_git_common.mk
@@ -0,0 +1,15 @@
+# Set HDF5_INC and HDF5_LIB, the path to hdf5 headers and library.
+#
+# Directory HDF5_INC should contain hdf headers (e.g., 
+# hdf5.h).
+#
+# Directory HDF5_LIB should contain hdf5 libraries (e.g., 
+# libhdf5*.a libhdf5*.so).
+#
+# !! Note HDF5_INC and HDF5_LIB must be absolute paths!
+#############################################################
+
+HDF5_INC?=/home/UNIXHOME/yli/yliWorkspace/software/smrtanalysis/prebuilt.out/hdf5/hdf5-1.8.12/centos-5/include
+HDF5_LIB?=/home/UNIXHOME/yli/yliWorkspace/software/smrtanalysis/prebuilt.out/hdf5/hdf5-1.8.12/centos-5/lib
+ 
+#############################################################
diff --git a/blasr_gitp4.mk b/blasr_gitp4.mk
new file mode 100644
index 0000000..0b05708
--- /dev/null
+++ b/blasr_gitp4.mk
@@ -0,0 +1,24 @@
+SHELL=/bin/bash -e -E
+
+.PHONY: curdir submodules p4togit pullfromgit 
+
+# git p4 operations
+curdir = $(shell pwd)
+
+submodules = libcpp 
+
+p4togit: $(submodules)
+	@for submodule in $(submodules); do \
+		cd $$submodule; echo Rebasing submodule $$submodule; git p4 sync; git p4 rebase; git push -u origin master; cd $(curdir);\
+	done 
+	@for submodule in $(submodules); do \
+		echo Adding submodule $$submodle to blasr; git add $$submodule; \
+	done
+	@git commit -m "Push latest $(submodules) from p4 to github" 
+	@git push -u origin master || echo push failed
+
+# To help users sync all submodules from github to local.
+pullfromgit:
+	@git pull -u origin master
+	@git submodule update --init --recursive
+
diff --git a/common.mk b/common.mk
new file mode 100644
index 0000000..9f2723c
--- /dev/null
+++ b/common.mk
@@ -0,0 +1,139 @@
+OS := $(shell uname)
+
+# Determine where is PBINCROOT, either from github or PacBio SMRTAnalysis package.
+PBINCROOT ?= $(realpath ../../lib/cpp/)
+PREBUILT ?= $(realpath ../../../prebuilt.out)
+THIRD_PARTY_PREFIX ?= $(realpath ..)
+
+#####include $(PBINCROOT)/common.mk
+#####include $(PBINCROOT)/rules.mk
+
+LIBBLASR_INCLUDE  := $(PBINCROOT)/alignment
+LIBPBIHDF_INCLUDE := $(PBINCROOT)/hdf
+LIBPBDATA_INCLUDE := $(PBINCROOT)/pbdata
+PBBAM_INCLUDE     := $(PBBAM)/include
+HTSLIB_INCLUDE    := $(PBBAM)/../htslib/htslib
+HDF5_INCLUDE      := $(HDF5_INC)
+ZLIB_INCLUDE      := $(ZLIB_ROOT)/include
+
+LIBBLASR_LIB  := $(PBINCROOT)/alignment
+LIBPBIHDF_LIB := $(PBINCROOT)/hdf
+LIBPBDATA_LIB := $(PBINCROOT)/pbdata
+PBBAM_LIB     := $(PBBAM)/lib
+HTSLIB_LIB    := $(PBBAM)/../htslib
+HDF5_LIB      := $(HDF5_LIB)
+ZLIB_LIB      := $(ZLIB_ROOT)/lib
+
+
+LIBPBIHDF_CPP_LIBFLAG := -lhdf5_cpp
+LIBPBIHDF_LIBFLAG     := -lhdf5
+
+LIBBLASR_LIBFLAGS  := -lblasr
+LIBPBIHDF_LIBFLAGS := -lpbihdf
+LIBPBDATA_LIBFLAGS := -lpbdata
+PBBAM_LIBFLAGS     := -lpbbam
+HTSLIB_LIBFLAGS    := -lhts
+HDF5_LIBFLAGS      := $(LIBHDF5_CPP_LIBFLAG) $(LIBHDF5_LIBFLAG)
+ZLIB_LIBFLAGS      := -lz
+
+
+INCDIRS = -I$(LIBBLASR_INCLUDE) \
+          -I$(LIBPBIHDF_INCLUDE) \
+          -I$(LIBPBDATA_INCLUDE) \
+          -I$(HDF5_INCLUDE)
+
+LIBDIRS = -L$(LIBBLASR_LIB) \
+          -L$(LIBPBIHDF_LIB) \
+          -L$(LIBPBDATA_LIB) \
+          -L$(HDF5_LIB) 
+
+ifneq ($(ZLIB_ROOT), notfound)
+        # NOTE: The zlib include directory is not needed since we do not
+        #       refer to any zlib include files directly in the blasr source
+        #       code.   But we do need to link to the zlib library (static
+        #       or shared), since htslib depends on it.
+        #          INCDIRS += -I$(ZLIB_INCLUDE)
+	LIBDIRS += -L$(ZLIB_LIB)
+endif
+
+CXXOPTS := -std=c++0x -pedantic \
+           -Wall -Wuninitialized -Wno-div-by-zero \
+           -MMD -MP -w -fpermissive
+
+DEFAULTCXXFLAG := -O3
+DEBUGCXXFLAG := -g -ggdb -fno-inline
+PROFILECXXFLAG := -Os -pg 
+GCXXFLAG := -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fno-omit-frame-pointer 
+
+LIBS := $(LIBBLASR_LIBFLAGS) $(LIBPBIHDF_LIBFLAGS) $(LIBPBDATA_LIBFLAGS)
+PBBAMLIBS :=  $(PBBAM_LIBFLAGS)
+ifneq ($(SHARED_LIB),)
+    PBBAMLIBS += $(HTSLIB_LIBFLAGS)
+else
+    ifneq ($(wildcard "$(HTSLIB_LIB)/libhts.a"),"")
+        PBBAMLIBS += $(HTSLIB_LIB)/libhts.a
+    else
+         PBBAMLIBS += $(HTSLIB_LIBFLAGS)
+    endif
+endif
+
+ifneq ($(SHARED_LIB),)
+    LIBS += $(HDF5_LIBFLAGS)
+else
+    ifneq ($(wildcard "$(HDF5_LIB)/libhdf5_cpp.a"),"")
+        LIBS += $(HDF5_LIB)/libhdf5_cpp.a $(HDF5_LIB)/libhdf5.a
+    else
+        LIBS += $(HDF5_LIBFLAGS)
+    endif
+endif
+
+ifeq ($(origin nopbbam), undefined)
+	INCDIRS += -I$(PBBAM_INCLUDE) \
+			   -I$(HTSLIB_INCLUDE) \
+			   -I$(BOOST_INCLUDE)
+
+
+	LIBDIRS += -L$(PBBAM_LIB) \
+			   -L$(HTSLIB_LIB)
+
+	LIBS += $(PBBAMLIBS) 
+endif
+
+LIBS += $(ZLIB_LIBFLAGS)
+LIBS += -lpthread
+
+# NOTE: libdl is not needed when we are linking with shared libraries, but
+#       is is needed for static linking, since the hdf5 library depends on it
+ifeq ($(SHARED_LIB),)
+    LIBS += -ldl
+endif
+
+ifneq ($(SHARED_LIB),)
+    STATIC :=
+else
+    ifneq ($(OS), Darwin)
+	STATIC := -static
+    else
+	STATIC :=
+    endif
+endif
+
+ifneq ($(OS), Darwin)
+	LIBS += -lrt
+else
+	LIBS += -lsz
+endif
+
+# -lhdf5, -lhdf5_cpp, -lz required for HDF5
+# -lpbbam -lhts for BAM
+# -lpthread for multi-threading
+# -lrt for clock_gettime
+# -ldl for dlopen dlclose 
+
+GLIBS = -Wl --eh-frame-hdr -fno-builtin-malloc -L$(HOME)/lib -ltcmalloc -lunwind -lprofiler $(LIBS)
+
+PBLIB :=
+ifeq ($(NO_SUBMAKES),)
+    PBLIB := pblib
+endif
+
diff --git a/configure.py b/configure.py
new file mode 100755
index 0000000..126c362
--- /dev/null
+++ b/configure.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python
+"""Configure the build.
+
+- Create defines.mk
+"""
+import commands
+import contextlib
+import optparse
+import os
+import sys
+
+#DEFAULTCXXFLAG := -O3
+#DEBUGCXXFLAG := -g -ggdb -fno-inline
+#PROFILECXXFLAG := -Os -pg 
+#GCXXFLAG := -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fno-omit-frame-pointer 
+
+ROOT = '${ROOT}'
+
+def log(msg):
+    sys.stderr.write(msg)
+    sys.stderr.write('\n')
+
+def shell(cmd):
+    log(cmd)
+    status, output = commands.getstatusoutput(cmd)
+    if status:
+        raise Exception('%d <- %r' %(status, cmd))
+    return output
+
+def system(cmd):
+    log(cmd)
+    status = os.system(cmd)
+    if status:
+        raise Exception('%d <- %r' %(status, cmd))
+    return
+
+ at contextlib.contextmanager
+def cd(nwd):
+    cwd = os.getcwd()
+    log('cd %r -> %r' %(cwd, nwd))
+    os.chdir(nwd)
+    yield
+    os.chdir(cwd)
+    log('cd %r <- %r' %(cwd, nwd))
+
+def update_content(fn, content):
+    current_content = open(fn).read() if os.path.exists(fn) else None
+    if content != current_content:
+        log('writing to %r' %fn)
+        log('"""\n' + content + '"""')
+        open(fn, 'w').write(content)
+
+def get_OS_STRING():
+    G_BUILDOS_CMD = """bash -c 'set -e; set -o pipefail; id=$(lsb_release -si | tr "[:upper:]" "[:lower:]"); rel=$(lsb_release -sr); case $id in ubuntu) printf "$id-%04d\n" ${rel/./};; centos) echo "$id-${rel%%.*}";; *) echo "$id-$rel";; esac' 2>/dev/null"""
+    return shell(G_BUILDOS_CMD)
+def get_PREBUILT():
+    cmd = 'cd ../../../../prebuilt.out 2>/dev/null && pwd || echo -n notfound'
+    return shell(cmd)
+def ifenvf(env, key, func):
+    if key in env:
+        return env[key]
+    else:
+        return func()
+def setifenvf(envout, envin, key, func):
+    envout[key] = ifenvf(envin, key, func)
+def setifenv(envout, envin, key, val):
+    envout[key] = envin.get(key, val)
+def setenv(envout, key, val):
+    envout[key] = val
+def update_env_if(envout, envin, keys):
+    for key in keys:
+        if key in envin:
+            envout[key] = envin[key]
+def compose_defs_env(env):
+    # We disallow env overrides for anything with a default from GNU make.
+    nons = ['CXX', 'CC', 'AR'] # 'SHELL'?
+    ovr    = ['%-20s ?= %s' %(k, v) for k,v in env.items() if k not in nons]
+    nonovr = ['%-20s := %s' %(k, v) for k,v in env.items() if k in nons]
+    return '\n'.join(ovr + nonovr + [''])
+def compose_defines_pacbio(envin):
+    """
+    This is used by mobs via buildcntl.sh.
+    """
+    env = dict()
+    setenv(env, 'SHELL', 'bash')
+    #setifenvf(env, envin, 'OS_STRING', get_OS_STRING)
+    #setifenvf(env, envin, 'PREBUILT', get_PREBUILT)
+    nondefaults = set([
+            'CXX',
+            'LIBPBDATA_INCLUDE', 'LIBPBDATA_LIB', 'LIBPBDATA_LIBFLAGS',
+            'LIBPBIHDF_INCLUDE', 'LIBPBIHDF_LIB', 'LIBPBIHDF_LIBFLAGS',
+            'LIBBLASR_INCLUDE', 'LIBBLASR_LIB', 'LIBBLASR_LIBFLAGS',
+            'HDF5_INCLUDE', 'HDF5_LIB', 'HDF5_LIBFLAGS',
+            'PBBAM_INCLUDE', 'PBBAM_LIB', 'PBBAM_LIBFLAGS',
+            'HTSLIB_INCLUDE', 'HTSLIB_LIB', 'HTSLIB_LIBFLAGS',
+            'BOOST_INCLUDE',
+            'ZLIB_LIB', 'ZLIB_LIBFLAGS',
+            'PTHREAD_LIBFLAGS',
+            'DL_LIBFLAGS',
+    ])
+    update_env_if(env, envin, nondefaults)
+    return compose_defs_env(env)
+
+
+def update(content_defines_mk):
+    """ Write these relative to the same directory as *this* file.
+    """
+    thisdir = os.path.dirname(os.path.abspath(__file__))
+    fn_defines_mk = os.path.join(thisdir, 'defines.mk')
+    update_content(fn_defines_mk, content_defines_mk)
+
+def configure_pacbio(envin, shared):
+    content1 = compose_defines_pacbio(envin)
+    if shared:
+        content1 += 'LDLIBS+=-lrt\n'
+    else:
+        content1 += 'LDFLAGS+=-static\n'
+    content1 += 'SUB_CONF_FLAGS+=--shared\n'
+    update(content1)
+
+def set_defs_submodule_defaults(env, nopbbam):
+    subdir = os.path.join(ROOT, 'libcpp')
+    defaults = {
+        'LIBPBDATA_INCLUDE': os.path.join(subdir, 'pbdata'),
+        'LIBBLASR_INCLUDE':  os.path.join(subdir, 'alignment'),
+        #'LIBPBIHDF_INCLUDE': '' if nopbbam else os.path.join(subdir, 'hdf'),
+        'LIBPBDATA_LIB': os.path.join(subdir, 'pbdata'),
+        'LIBBLASR_LIB':  os.path.join(subdir, 'alignment'),
+        #'LIBPBIHDF_LIB': '' if nopbbam else os.path.join(subdir, 'hdf'),
+    }
+    for k in defaults:
+        if k not in env:
+            env[k] = defaults[k]
+
+def set_defs_defaults(env, nopbbam):
+    # OS := $(shell uname)
+    # if Darwin, -lsz (for static builds?)
+    defaults = {
+        'LIBBLASR_INCLUDE':  os.path.join(ROOT, 'libcpp', 'alignment'),
+        'LIBPBDATA_INCLUDE':  os.path.join(ROOT, 'libcpp', 'pbdata'),
+        'LIBPBIHDF_INCLUDE':  os.path.join(ROOT, 'libcpp', 'hdf'),
+        'LIBBLASR_LIB':  os.path.join(ROOT, 'libcpp', 'alignment'),
+        'LIBPBDATA_LIB':  os.path.join(ROOT, 'libcpp', 'pbdata'),
+        'LIBPBIHDF_LIB':  os.path.join(ROOT, 'libcpp', 'hdf'),
+        'LIBBLASR_LIBFLAGS':  '-lblasr',
+        'LIBPBDATA_LIBFLAGS': '-lpbdata',
+        'LIBPBIHDF_LIBFLAGS': '-lpbihdf',
+        'HDF5_LIBFLAGS': '-lhdf5_cpp -lhdf5',
+        'ZLIB_LIBFLAGS': '-lz',
+        'PTHREAD_LIBFLAGS': '-lpthread',
+        'DL_LIBFLAGS': '-ldl', # neeeded by HDF5 always
+        'SHELL': 'bash -xe',
+    }
+    #setifenvf(defaults, env, 'OS_STRING', get_OS_STRING)
+    #setifenvf(defaults, env, 'PREBUILT', get_PREBUILT)
+    pbbam_defaults = {
+        'PBBAM_LIBFLAGS': '-lpbbam',
+        'HTSLIB_LIBFLAGS': '-lhts',
+        'ZLIB_LIBFLAGS': '-lz',
+        'PTHREAD_LIBFLAGS': '-lpthread',
+        'DL_LIBFLAGS': '-ldl', # neeeded by HDF5 always
+    }
+    if not nopbbam:
+        defaults.update(pbbam_defaults)
+    for k in defaults:
+        if k not in env:
+            env[k] = defaults[k]
+
+def get_make_style_env(envin, args):
+    envout = dict()
+    for arg in args:
+        if '=' in arg:
+            k, v = arg.split('=')
+            envout[k] = v
+    envout.update(envin)
+    return envout
+
+def parse_args(args):
+    parser = optparse.OptionParser()
+    parser.add_option('--no-pbbam', action='store_true',
+            help='Avoid compiling anything which would need pbbam.')
+    parser.add_option('--submodules', action='store_true',
+            help='Set variables to use our git-submodules, which must be pulled and built first. (Implies --no-pbbam.)')
+    parser.add_option('--shared', action='store_true',
+            help='Build for dynamic linking.')
+    return parser.parse_args(list(args))
+
+def main(prog, *args):
+    """We are still deciding what env-vars to use, if any.
+    """
+    # Set up an alias, until everything uses one consistently.
+    if 'HDF5_INC' in os.environ and 'HDF5_INCLUDE' not in os.environ:
+        os.environ['HDF5_INCLUDE'] = os.environ['HDF5_INC']
+    conf, makevars = parse_args(args)
+    envin = get_make_style_env(os.environ, makevars)
+    if conf.submodules:
+        set_defs_submodule_defaults(envin, conf.no_pbbam)
+        conf.no_pbbam = True
+    set_defs_defaults(envin, conf.no_pbbam)
+    configure_pacbio(envin, conf.shared)
+
+
+if __name__=="__main__":
+    main(*sys.argv)
diff --git a/ctest/affineAlign.t b/ctest/affineAlign.t
new file mode 100644
index 0000000..caec49d
--- /dev/null
+++ b/ctest/affineAlign.t
@@ -0,0 +1,17 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test affineAlign
+  $ rm -rf $OUTDIR/affineAlign.m0
+  $ $EXEC $DATDIR/affineAlign.fofn $DATDIR/substr_with_ins.fasta -m 0 -out $OUTDIR/affineAlign.m0  -affineAlign  -readIndex 493 -insertion 100 -deletion 100
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/affineAlign.m0 $STDDIR/affineAlign_2014_06_10.m0
+
+  $ rm -rf $OUTDIR/ecoli_affine.m0
+  $ $EXEC $DATDIR/ecoli_affine.fasta $DATDIR/ecoli_reference.fasta -m 0 -out $OUTDIR/ecoli_affine.m0 -affineAlign -insertion 100 -deletion 100
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/ecoli_affine.m0 $STDDIR/ecoli_affine_2014_06_10.m0
+
+# Note that MapQV for -affineAlign has been fixed in 2014 04 18, bug 24363 
diff --git a/ctest/aggressiveIntervalCut.t b/ctest/aggressiveIntervalCut.t
new file mode 100644
index 0000000..571e8fe
--- /dev/null
+++ b/ctest/aggressiveIntervalCut.t
@@ -0,0 +1,12 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test -aggressiveIntervalCut.
+  $ rm -f $TMP1
+  $ BASFILE=/mnt/data3/vol53/2450598/0001/Analysis_Results/m130812_185809_42141_c100533960310000001823079711101380_s1_p0.bas.h5
+  $ REFFA=/mnt/secondary/Smrtpipe/repository/Ecoli_BL21_O26/sequence/Ecoli_BL21_O26.fasta
+  $ $EXEC $BASFILE $REFFA -holeNumbers 1-100 -out $TMP1 -aggressiveIntervalCut
+  [INFO] * [blasr] started. (glob)
+  [INFO] * [blasr] ended. (glob)
+  $ echo $?
+  0
diff --git a/ctest/alignScore.t b/ctest/alignScore.t
new file mode 100644
index 0000000..492f92e
--- /dev/null
+++ b/ctest/alignScore.t
@@ -0,0 +1,9 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test alignment score
+  $ rm -rf $OUTDIR/testscore.m0
+  $ $EXEC $DATDIR/read.fasta  $DATDIR/ref.fasta -minReadLength 1 -m 0 -out $OUTDIR/testscore.m0
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/testscore.m0 $STDDIR/testscore.m0
diff --git a/ctest/bamIn.t b/ctest/bamIn.t
new file mode 100644
index 0000000..d518c35
--- /dev/null
+++ b/ctest/bamIn.t
@@ -0,0 +1,52 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test using bam as input 
+  $ $EXEC $DATDIR/test_bam/tiny_bam.fofn $DATDIR/lambda_ref.fasta -m 4 -out $OUTDIR/tiny_bam_in.m4 
+  [INFO]* (glob)
+  [INFO]* (glob)
+
+Check whether blasr produces identical results taking fasta sequences of the bam as input 
+  $ $EXEC $DATDIR/test_bam/tiny_fasta.fofn $DATDIR/lambda_ref.fasta -m 4 -out $OUTDIR/tiny_fasta_in.m4
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/tiny_bam_in.m4 $OUTDIR/tiny_fasta_in.m4
+
+Test bam in, sam out
+  $ $EXEC $DATDIR/test_bam/tiny_bam.fofn $DATDIR/lambda_ref.fasta -sam -out $OUTDIR/tiny_bam_in.sam -printSAMQV -clipping subread -cigarUseSeqMatch
+  [INFO]* (glob)
+  [INFO]* (glob)
+
+Test bam in, bam out
+  $ $EXEC $DATDIR/test_bam/tiny_bam.fofn $DATDIR/lambda_ref.fasta -bam -out $OUTDIR/tiny_bam_in.bam -clipping subread
+  [INFO]* (glob)
+  [INFO]* (glob)
+
+Check whether sam out and bam out have identical alignments, not checking qvs
+  $ $SAMTOOLS view -h $OUTDIR/tiny_bam_in.bam -o $OUTDIR/tiny_bam_in.bam.sam
+  $ cut -f 2-11 $OUTDIR/tiny_bam_in.bam.sam |sed -n '6,$p' > $TMP1.aln
+  $ cut -f 2-11 $OUTDIR/tiny_bam_in.sam |sed -n '6,$p' > $TMP2.aln
+  $ diff $TMP1.aln $TMP2.aln
+
+Check whether sam out and bam out have identical read groups @RG 
+  $ awk '/^@RG/' $OUTDIR/tiny_bam_in.bam.sam > $TMP1.rg
+  $ awk '/^@RG/' $OUTDIR/tiny_bam_in.sam > $TMP2.rg
+  $ diff $TMP1.rg $TMP2.rg
+
+Compare iq produced with stdout
+  $ sed -n '6,$p' $OUTDIR/tiny_bam_in.bam.sam | awk '{gsub(/\t/,"\n");}1' | awk '/^iq:Z:/' > $TMP1.iq
+  $ sed -n '6,$p' $STDDIR/$UPDATEDATE/tiny_bam_in.bam.sam | awk '{gsub(/\t/,"\n");}1' | awk '/^iq:Z:/' > $TMP2.iq
+  $ diff $TMP1.iq $TMP2.iq
+
+TODO:Check whether sam out and bam out have identical insertion qvs
+Currently QVs in bam are in 'native' orientation, and QVs in sam are in 'genomic' orientation. This needs to be fixed.
+$ sed -n '6,$p' $OUTDIR/tiny_bam_in.sam | awk '{gsub(/\t/,"\n");}1' | awk '/^iq:Z:/' > $TMP2.iq
+
+Test with multiple nproc
+  $ $EXEC $DATDIR/test_bam/two_bam.fofn $DATDIR/lambda_ref.fasta -bam -nproc 15 -out $OUTDIR/two_bam_in.bam 
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ $SAMTOOLS view -h $OUTDIR/two_bam_in.bam -o $OUTDIR/two_bam_in.bam.sam
+
+TODO: test -concordant, when pbbam API to query over ZMWs is available.
+TODO: test bam with ccs reads
diff --git a/ctest/bamOut.t b/ctest/bamOut.t
new file mode 100644
index 0000000..a15b811
--- /dev/null
+++ b/ctest/bamOut.t
@@ -0,0 +1,22 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test generating bam output 
+
+Input is bam, clipping=soft and subread should produce identical results
+  $ $EXEC $DATDIR/test_bam/tiny_bam.fofn $DATDIR/lambda_ref.fasta -bam -out $OUTDIR/tiny_bam_in_soft.bam -clipping soft
+  [INFO]* (glob)
+  [INFO]* (glob)
+
+  $ $EXEC $DATDIR/test_bam/tiny_bam.fofn $DATDIR/lambda_ref.fasta -bam -out $OUTDIR/tiny_bam_in_subread.bam -clipping subread 
+  [INFO]* (glob)
+  [INFO]* (glob)
+
+  $ $SAMTOOLS view $OUTDIR/tiny_bam_in_soft.bam | sed -n '6,$p' > $TMP1.bam_in_soft
+  $ $SAMTOOLS view $OUTDIR/tiny_bam_in_subread.bam | sed -n '6,$p' > $TMP2.bam_in_subread
+  $ diff $TMP1.bam_in_soft $TMP2.bam_in_subread
+
+Test if bam cigar strings are correct
+  $ head -2 $TMP1.bam_in_soft |cut -f 6
+  25=1I28=1I41=1I5=1D6=1X12=1I15=1I2=1I16=1D10=1I11=1I74=1D12=1D7=3I4=1I6=1D1=2D14=1D16=1I8=1D4=1D5=1D20=1I3=1I10=1I37=1I13=1I25=1I15=1I7=1I11=1I3=2I1=1I16=1I6=1I8=1I11=1X1=1I5=1I56=1I17=
+  28=1D7=1I1=1I9=2I12=1I3=1D13=1I15=1I2=1X49=1I19=1I14=1I5=1D17=1D20=1D86=1I21=1I9=1I24=1I6=1I1=1I2=1D11=1D4=1D3=1D31=1D6=1I6=1I9=1I57=2I24=1I26=1I8=1I43=1S
diff --git a/ctest/bug25328.t b/ctest/bug25328.t
new file mode 100644
index 0000000..2127433
--- /dev/null
+++ b/ctest/bug25328.t
@@ -0,0 +1,13 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+bug_25328, unrolled resequencing test 
+  $ INFA=$DATDIR/bug_25328_zmw_38131.fasta
+  $ REF=$DATDIR/All4mers_circular_72x_l50256.fasta
+  $ OUTFA=$OUTDIR/bug_25328.m4
+  $ $EXEC $INFA $REF -bestn 1 -nCandidates 1 -forwardOnly -maxMatch 14 -m 4 -out $OUTFA
+  [INFO]* (glob)
+  [INFO]* (glob)
+
+  $ awk '$7-$6 >= 15000' $OUTFA |wc -l
+  1
diff --git a/ctest/bug25741.t b/ctest/bug25741.t
new file mode 100644
index 0000000..d29829a
--- /dev/null
+++ b/ctest/bug25741.t
@@ -0,0 +1,9 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+bug_25741, if input bas.h5 does not contain mergeQV, blasr with -printSAMQV, -nproc>1 should not write garbage 'mq' values to output.
+  $ $EXEC $DATDIR/bas_wo_mergeQV.fofn $DATDIR/lambda_ref.fasta -printSAMQV -sam -clipping subread -out $OUTDIR/out_printSAMQV.sam -nproc 12 
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ grep 'mq' $OUTDIR/out_printSAMQV.sam |wc -l
+  1
diff --git a/ctest/bug25766.t b/ctest/bug25766.t
new file mode 100644
index 0000000..eaf9e06
--- /dev/null
+++ b/ctest/bug25766.t
@@ -0,0 +1,13 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+bug_25766, added an option -minRawSubreadScore
+  $ BASFILE=$DATDIR/lambda_bax.fofn
+  $ REF=$DATDIR/lambda_ref.fasta
+  $ $EXEC $BASFILE $REF -out $TMP1 -minRawSubreadScore 700 -nproc 18
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ echo $?
+  0
+  $ sort $TMP1 > $TMP2
+  $ diff $TMP2 $STDDIR/bug_25766.m4
diff --git a/ctest/ccsH5.t b/ctest/ccsH5.t
new file mode 100644
index 0000000..b3e0477
--- /dev/null
+++ b/ctest/ccsH5.t
@@ -0,0 +1,11 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test using *.ccs.h5 as input
+# The results should be exactly the same as 
+# blasr $DATDIR/ccsasinput_bas.fofn $DATDIR/ccsasinput.fasta -m 4 -out tmp.m4 -useccsdenovo
+  $ rm -rf $OUTDIR/ccsasinput.m4
+  $ $EXEC $DATDIR/ccsasinput.fofn $DATDIR/ccsasinput.fasta -m 4 -out $OUTDIR/ccsasinput.m4
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/ccsasinput.m4 $STDDIR/ccsasinput_2014_06_10.m4
diff --git a/ctest/concordant.t b/ctest/concordant.t
new file mode 100644
index 0000000..129c9fa
--- /dev/null
+++ b/ctest/concordant.t
@@ -0,0 +1,32 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test -concordant
+  $ rm -rf $OUTDIR/concordant_subset.sam
+  $ $EXEC $DATDIR/ecoli_lp.fofn $DATDIR/ecoli_reference.fasta -concordant -sam -out $OUTDIR/concordant_subset.sam -nproc 12 -holeNumbers 1-10000 -sa $DATDIR/ecoli_reference.sa
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sed -n 6,110864p $OUTDIR/concordant_subset.sam > $OUTDIR/tmp1 
+  $ sort $OUTDIR/tmp1 > $OUTDIR/tmp11
+  $ sed -n 6,110864p $STDDIR/$UPDATEDATE/concordant_subset.sam > $OUTDIR/tmp2
+  $ sort $OUTDIR/tmp2 > $OUTDIR/tmp22
+  $ diff $OUTDIR/tmp11 $OUTDIR/tmp22
+  $ rm -rf $OUTDIR/tmp1 $OUTDIR/tmp2 $OUTDIR/tmp11 $OUTDIR/tmp22
+#2014_05_28  --> changelist 135254, use MAX_BAND_SIZE to contrain GuidedAlign
+#2014_08_21  --> changelist 138516, added YS, YE, ZM tags. 
+#2014_08_28  --> changelist 139176, update SAM MD5 
+#2014_09_12  --> changelist 140410, changed the default value of '-concordantTemplate' from 'longestsubread' to 'typicalsubread'
+#2014_09_17  --> changelist 140573, changed SDPFragment LessThan to make sure blasr compiled with gcc 4.4 and 4.8 can produce identical results. 
+#2014_10_16  --> changelist 141378, changed the default value of '-concordantTemplate' from 'typicalsubread' to 'mediansubread'
+#2015_03_01  --> changelist 146599, reads from the same movie should have unique readGroupId
+#2015_03_28  --> changelist 148101, 148080 updated read group id, 148100 updated TLEN
+#2015_04_09  --> changelist 148796, updated read group id
+#2015_04_25  --> changelist 149721, update CIGAR string, replace M with X=.
+
+Test -concordant FMR1 case (the 'typical subread' is selected as template for concordant mapping)
+  $ FOFN=$DATDIR/FMR1_concordant.fofn
+  $ REF=$DATDIR/FMR1_130CGG.fasta
+  $ $EXEC $FOFN $REF -concordant -out $OUTDIR/FMR1_zmw_37927.m4 -m 4 -holeNumbers 37927
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/FMR1_zmw_37927.m4 $STDDIR/FMR1_zmw_37927.m4
diff --git a/ctest/ecoli.t b/ctest/ecoli.t
new file mode 100644
index 0000000..c6291a2
--- /dev/null
+++ b/ctest/ecoli.t
@@ -0,0 +1,20 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test blasr on ecoli.
+Test blasr with -sam
+
+# The following job takes a very long time to finish, let us use a subset of reads instead
+#See $STDOUT/ecoli_v1.4.sam for 1.4 output.
+# $STDOUT/ecoli_2014_03_28.sam for bug before mapQV for affineAlign/align without QV is fixed.
+  $ rm -rf $OUTDIR/ecoli_subset.sam
+  $ $EXEC $DATDIR/ecoli_subset.fasta $DATDIR/ecoli_reference.fasta -sam -out $OUTDIR/ecoli_subset.sam -nproc 15
+  [INFO]* (glob)
+  [INFO]* (glob)
+
+  $ sed -n '5,$ p' $OUTDIR/ecoli_subset.sam | sort | cut -f 1-11 > $TMP1
+  $ sed -n '5,$ p' $STDDIR/$UPDATEDATE/ecoli_subset.sam | sort | cut -f 1-11 > $TMP2
+  $ diff $TMP1 $TMP2
+  $ rm $TMP1 $TMP2
+# 2015_03_08 --> changelist 148101, 148080 updated read group id; 148100 updated TLEN
+# 2015_04_09 --> changelist 148796, updated read group id
diff --git a/ctest/fastMaxInterval.t b/ctest/fastMaxInterval.t
new file mode 100644
index 0000000..323fab1
--- /dev/null
+++ b/ctest/fastMaxInterval.t
@@ -0,0 +1,12 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test -fastMaxInterval.
+  $ rm -f $TMP1
+  $ BASFILE=/mnt/data3/vol53/2450598/0001/Analysis_Results/m130812_185809_42141_c100533960310000001823079711101380_s1_p0.bas.h5
+  $ REFFA=/mnt/secondary/Smrtpipe/repository/Ecoli_BL21_O26/sequence/Ecoli_BL21_O26.fasta
+  $ $EXEC $BASFILE $REFFA -holeNumbers 1-100 -out $TMP1 -fastMaxInterval
+  [INFO] * [blasr] started. (glob)
+  [INFO] * [blasr] ended. (glob)
+  $ echo $?
+  0
diff --git a/ctest/filtercriteria.t b/ctest/filtercriteria.t
new file mode 100644
index 0000000..9634e9e
--- /dev/null
+++ b/ctest/filtercriteria.t
@@ -0,0 +1,30 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+  $ NAME=test_filtercriteria
+  $ DATDIR=$DATDIR/$NAME
+  $ OUTDIR=$OUTDIR/$NAME
+  $ STDDIR=$STDDIR/$NAME
+  $ mkdir -p $OUTDIR
+
+Test -minPctSimilarity
+  $ I=$DATDIR/tiny_bam.fofn
+  $ R=$DATDIR/lambdaNEB.fa
+  $ O=$OUTDIR/min_pct_similarity_90.m4
+
+  $ $EXEC $I $R -out $O -m 4 -minPctSimilarity 90
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ echo $?
+  0
+  $ awk '$4 < 90 {print}' $O |wc -l |cut -f 1 -d ' ' 
+  0
+
+  $ O=$OUTDIR/min_aln_len_1000.m4
+  $ $EXEC $I $R -out $O -m 4 -minAlnLength 1000
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ echo $?
+  0
+  $ wc -l $O |cut -f 1 -d ' ' 
+  12
diff --git a/ctest/fofn.t b/ctest/fofn.t
new file mode 100644
index 0000000..348b6f7
--- /dev/null
+++ b/ctest/fofn.t
@@ -0,0 +1,18 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test blasr with *.fofn input
+#  $ rm -rf $OUTDIR/lambda_bax.m4 
+#  $ $EXEC $DATDIR/lambda_bax.fofn $DATDIR/lambda_ref.fasta -m 4 -out lambda_bax_tmp.m4 -nproc 15 -minMatch 14
+#  [INFO]* (glob)
+#  [INFO]* (glob)
+#  $ sort lambda_bax_tmp.m4 > $OUTDIR/lambda_bax.m4
+#  $ diff $OUTDIR/lambda_bax.m4 $STDDIR/lambda_bax.m4
+# This test takes a long time, use a subset instad. 
+
+  $ rm -rf $OUTDIR/lambda_bax_subset.m4
+  $ $EXEC $DATDIR/lambda_bax.fofn $DATDIR/lambda_ref.fasta -m 4 -out $OUTDIR/lambda_bax_tmp_subset.m4 -nproc 15 -minMatch 14 -holeNumbers 1-1000 -sa $DATDIR/lambda_ref.sa
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sort $OUTDIR/lambda_bax_tmp_subset.m4 > $OUTDIR/lambda_bax_subset.m4
+  $ diff $OUTDIR/lambda_bax_subset.m4 $STDDIR/lambda_bax_subset.m4
diff --git a/ctest/hitpolicy.t b/ctest/hitpolicy.t
new file mode 100644
index 0000000..062a4ae
--- /dev/null
+++ b/ctest/hitpolicy.t
@@ -0,0 +1,86 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+  $ NAME=test_hitpolicy
+  $ DATDIR=$DATDIR/$NAME
+  $ OUTDIR=$OUTDIR/$NAME
+  $ STDDIR=$STDDIR/$NAME
+  $ mkdir -p $OUTDIR
+
+  $ I=$DATDIR/tiny_bam.fofn
+  $ R=$DATDIR/test_hitpolicy_target.fa
+  $ O=$OUTDIR/hitpolicy_all.m4
+  $ X=$STDDIR/hitpolicy_all.m4
+
+Test hitpolicy all 
+  $ $EXEC $I $R -out $O -m 4 -hitPolicy all
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ echo $?
+  0
+  $ wc -l $O | cut -f 1 -d ' '
+  683
+
+Test hitpolicy allbest 
+  $ O=$OUTDIR/hitpolicy_allbest.m4
+  $ X=$STDDIR/hitpolicy_allbest.m4
+  $ $EXEC $I $R -out $O -m 4 -hitPolicy allbest && sort $O > $TMP1 && mv $TMP1 $O
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ echo $?
+  0
+  $ sort $O > $TMP1 && mv $TMP1 $O
+  $ diff $O $X && echo $?
+  0
+
+Test hitpolicy random
+  $ O=$OUTDIR/hitpolicy_random.m4
+  $ X=$STDDIR/hitpolicy_random.m4
+  $ $EXEC $I $R -out $O -m 4 -hitPolicy random -randomSeed 1
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sort $O > $TMP1 && mv $TMP1 $O
+  $ diff $O $X && echo $?
+  0
+
+Test hitpolicy randombest bam inputs, nproc > 1, fixed seed
+  $ O=$OUTDIR/hitpolicy_randombest_bam_in.m4
+  $ X=$STDDIR/hitpolicy_randombest_bam_in.m4
+  $ $EXEC $I $R -out $O -m 4 -hitPolicy randombest -randomSeed 1 -nproc 10
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sort $O > $TMP1 && mv $TMP1 $O
+  $ diff $O $X && echo $?
+  0
+
+Test hitpolicy randombest bax inputs, nproc > 1, fixed seed
+  $ I=$DATDIR/tiny_bax.fofn
+  $ O=$OUTDIR/hitpolicy_randombest_bax_in.m4
+  $ X=$STDDIR/hitpolicy_randombest_bax_in.m4
+  $ $EXEC $I $R -out $O -m 4 -hitPolicy randombest -randomSeed 1 -nproc 10
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sort $O > $TMP1 && mv $TMP1 $O
+  $ diff $O $X && echo $?
+  0
+
+Test hitpolicy randombest fasta inputs, nproc > 1, fixed seed
+  $ I=$DATDIR/tiny_fasta.fofn
+  $ O=$OUTDIR/hitpolicy_randombest_fasta_in.m4
+  $ X=$STDDIR/hitpolicy_randombest_fasta_in.m4
+  $ $EXEC $I $R -out $O -m 4 -hitPolicy randombest -randomSeed 1 -nproc 10
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sort $O > $TMP1 && mv $TMP1 $O
+  $ diff $O $X && echo $?
+  0
+
+Test hitpolicy leftmost
+  $ O=$OUTDIR/hitpolicy_leftmost.m4
+  $ X=$STDDIR/hitpolicy_leftmost.m4
+  $ $EXEC $I $R -out $O -m 4 -hitPolicy leftmost -nproc 10
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ # target is lambda x 6, leftmost -> only map to the very first x.
+  $ awk '$10 > 48502 {print}' $O |wc -l 
+  0
diff --git a/ctest/holeNumbers.t b/ctest/holeNumbers.t
new file mode 100644
index 0000000..427f31a
--- /dev/null
+++ b/ctest/holeNumbers.t
@@ -0,0 +1,12 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test -holeNumbers
+  $ rm -f $OUTDIR/holeNumbers.m4
+  $ $EXEC $DATDIR/lambda_bax.fofn $DATDIR/lambda_ref.fasta -m 4 -out $OUTDIR/holeNumbers.m4 -holeNumbers 14798,55000-55100 -nproc 8
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sort $OUTDIR/holeNumbers.m4 > $TMP1
+  $ sort $STDDIR/holeNumbers_2014_05_29.m4 > $TMP2
+  $ diff $TMP1 $TMP2
+  $ rm $TMP1 $TMP2
diff --git a/ctest/m0-5.t b/ctest/m0-5.t
new file mode 100644
index 0000000..84182b3
--- /dev/null
+++ b/ctest/m0-5.t
@@ -0,0 +1,33 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test blasr with -m 0 ~ 5 
+  $ rm -rf $OUTDIR/read.m0
+  $ $EXEC $DATDIR/read.fasta  $DATDIR/ref.fasta -m 0 -out $OUTDIR/read.m0
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/read.m0 $STDDIR/read.m0
+
+  $ rm -rf $OUTDIR/read.m1
+  $ $EXEC $DATDIR/read.fasta  $DATDIR/ref.fasta -m 1 -out $OUTDIR/read.m1
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/read.m1 $STDDIR/read_2014_05_29.m1
+
+  $ rm -rf $OUTDIR/read.m2
+  $ $EXEC $DATDIR/read.fasta  $DATDIR/ref.fasta -m 2 -out $OUTDIR/read.m2
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/read.m2 $STDDIR/read.m2
+
+  $ rm -rf $OUTDIR/read.m3
+  $ $EXEC $DATDIR/read.fasta  $DATDIR/ref.fasta -m 3 -out $OUTDIR/read.m3
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/read.m3 $STDDIR/read.m3
+
+  $ rm -rf $OUTDIR/read.m4
+  $ $EXEC $DATDIR/read.fasta  $DATDIR/ref.fasta -m 4 -out $OUTDIR/read.m4
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $OUTDIR/read.m4 $STDDIR/read.m4
diff --git a/ctest/multipart.t b/ctest/multipart.t
new file mode 100644
index 0000000..2cf6e81
--- /dev/null
+++ b/ctest/multipart.t
@@ -0,0 +1,13 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test input.fofn containing a new bas.h5 file. Note that the new bas.h5 file does not 
+contain any /PulseData, instead contains /MultiPart/Parts.
+  $ rm -f $TMP1
+  $ BASFILE=/mnt/data3/vol53/2450598/0001/Analysis_Results/m130812_185809_42141_c100533960310000001823079711101380_s1_p0.bas.h5
+  $ REFFA=/mnt/secondary/Smrtpipe/repository/Ecoli_BL21_O26/sequence/Ecoli_BL21_O26.fasta
+  $ $EXEC $BASFILE $REFFA -holeNumbers 1-100 -out $TMP1
+  [INFO] * [blasr] started. (glob)
+  [INFO] * [blasr] ended. (glob)
+  $ echo $?
+  0
diff --git a/ctest/noSplitSubreads.t b/ctest/noSplitSubreads.t
new file mode 100644
index 0000000..3667cbd
--- /dev/null
+++ b/ctest/noSplitSubreads.t
@@ -0,0 +1,18 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test blasr with -noSplitSubreads 
+#  $ rm -rf $OUTDIR/lambda_bax_noSplitSubreads.m4 
+#  $ $EXEC $DATDIR/lambda_bax.fofn $DATDIR/lambda_ref.fasta -noSplitSubreads -m 4 -out lambda_bax_noSplitSubreads_tmp.m4 -nproc 15
+#  [INFO]* (glob)
+#  [INFO]* (glob)
+#  $ sort lambda_bax_noSplitSubreads_tmp.m4 > $OUTDIR/lambda_bax_noSplitSubreads.m4
+#  $ diff $OUTDIR/lambda_bax_noSplitSubreads.m4 $STDDIR/lambda_bax_noSplitSubreads.m4
+# This test takes a long time, use a subset instad. 
+
+  $ rm -rf $OUTDIR/lambda_bax_noSplitSubreads_subset.m4 
+  $ $EXEC $DATDIR/lambda_bax.fofn $DATDIR/lambda_ref.fasta -noSplitSubreads -m 4 -out $OUTDIR/lambda_bax_noSplitSubreads_tmp_subset.m4 -nproc 15 -holeNumbers 1-1000 -sa $DATDIR/lambda_ref.sa
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sort $OUTDIR/lambda_bax_noSplitSubreads_tmp_subset.m4 > $OUTDIR/lambda_bax_noSplitSubreads_subset.m4
+  $ diff $OUTDIR/lambda_bax_noSplitSubreads_subset.m4 $STDDIR/lambda_bax_noSplitSubreads_subset.m4
diff --git a/ctest/open_fail.t b/ctest/open_fail.t
new file mode 100644
index 0000000..ac7369f
--- /dev/null
+++ b/ctest/open_fail.t
@@ -0,0 +1,8 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+If fail to open an bax/bas.h5 file because of unable to initialize required dataset, give an warning.
+  $ $EXEC $DATDIR/open_fail_no_dyset.fofn $DATDIR/lambda_ref.fasta -m 4
+  [INFO]* (glob)
+  Could not open /mnt/secondary-siv/testdata/BlasrTestData/ctest/data/open_fail_no_dyset.fofn
+  [1]
diff --git a/ctest/samNM.t b/ctest/samNM.t
new file mode 100644
index 0000000..93ae89c
--- /dev/null
+++ b/ctest/samNM.t
@@ -0,0 +1,13 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test Sam out nm tag
+  $ rm -rf $OUTDIR/read.sam
+  $ $EXEC $DATDIR/read.fasta  $DATDIR/ref.fasta -sam -out $OUTDIR/read.sam
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ tail -n+5 $OUTDIR/read.sam |cut -f 21 
+  NM:i:2
+  NM:i:3
+  NM:i:2
+  NM:i:4
diff --git a/ctest/setup.sh b/ctest/setup.sh
new file mode 100755
index 0000000..8d44dc2
--- /dev/null
+++ b/ctest/setup.sh
@@ -0,0 +1,29 @@
+# Set up directories
+CURDIR=$TESTDIR
+REMOTEDIR=/mnt/secondary-siv/testdata/BlasrTestData/ctest
+DATDIR=$REMOTEDIR/data
+OUTDIR=$CURDIR/out
+STDDIR=$REMOTEDIR/stdout
+
+# Set up the executable: blasr.
+EXEC=$TESTDIR/../blasr
+
+# Define tmporary files
+TMP1=$OUTDIR/$$.tmp.out
+TMP2=$OUTDIR/$$.tmp.stdout
+
+# Make OUTDIR
+mkdir -p $OUTDIR
+
+#FIXME: make samtools independent of absolute build path.
+SAMTOOLS=/mnt/secondary/Smrtpipe/builds/Internal_Mainline_Nightly_LastSuccessfulBuild/analysis/bin/samtools
+
+#Update date
+UPDATEDATE=2015_04_27
+
+# 2014_08_21 --> change 138516: added YS, YE, ZM tags
+# 2014_08_28 --> change 139176: Update SAM MD5 
+# 2015_03_28 --> change 148101: 148080 update read group id, 148100 update TLEN. 
+# 2015_04_09 --> change 148796: update read group id
+# 2015_04_25 --> change 149721, update CIGAR string, replace M with X=
+# 2015_04_26 --> change 149749, add opiton -cigarUseSeqMatch (default: false). If -cigarUseSeqMatch is turned on, CIGAR strings use '=' and 'X' to represent sequence match and mismatch instead of 'M'.
diff --git a/ctest/useccsallBestN1.t b/ctest/useccsallBestN1.t
new file mode 100644
index 0000000..37b1305
--- /dev/null
+++ b/ctest/useccsallBestN1.t
@@ -0,0 +1,11 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test -useccsall with bestn = 1
+  $ $EXEC $DATDIR/ccstest.fofn $DATDIR/ccstest_ref.fasta -bestn 1 -useccsall -sam -out $OUTDIR/useccsall.sam -holeNumbers 76772
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ sed -n '9,$ p' $OUTDIR/useccsall.sam > $TMP1
+  $ sed -n '9,$ p' $STDDIR/$UPDATEDATE/useccsall.sam > $TMP2
+  $ diff $TMP1 $TMP2
+  $ rm $TMP1 $TMP2
diff --git a/ctest/useccsallLargeGenome.t b/ctest/useccsallLargeGenome.t
new file mode 100644
index 0000000..5ab7ac1
--- /dev/null
+++ b/ctest/useccsallLargeGenome.t
@@ -0,0 +1,13 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test -useccsall with Large genome.
+  $ BASFILE=/mnt/data3/vol53/2450530/0014/Analysis_Results/m130507_052228_42161_c100519212550000001823079909281305_s1_p0.3.bax.h5
+  $ REFDIR=/mnt/secondary/Smrtpipe/repository/hg19_M_sorted/sequence
+  $ REFFA=$REFDIR/hg19_M_sorted.fasta
+  $ REFSA=$REFDIR/hg19_M_sorted.fasta.sa
+  $ OUTFILE=$OUTDIR/intflow.m4
+  $ $EXEC $BASFILE $REFFA -out $OUTFILE -m 4 -sa $REFSA -holeNumbers 109020
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ diff $STDDIR/intflow_2014_06_10.m4 $OUTFILE
diff --git a/ctest/verbose.t b/ctest/verbose.t
new file mode 100644
index 0000000..19e508a
--- /dev/null
+++ b/ctest/verbose.t
@@ -0,0 +1,9 @@
+Set up
+  $ . $TESTDIR/setup.sh
+
+Test alignment score
+  $ $EXEC $DATDIR/lambda_bax.fofn  $DATDIR/lambda_ref.fasta -holeNumbers 1-200 -V 3 > $TMP1
+  [INFO]* (glob)
+  [INFO]* (glob)
+  $ echo $?
+  0
diff --git a/extrautils/BasH5Simulator.cpp b/extrautils/BasH5Simulator.cpp
new file mode 100644
index 0000000..969f933
--- /dev/null
+++ b/extrautils/BasH5Simulator.cpp
@@ -0,0 +1,524 @@
+#include <string>
+#include <sstream>
+#include <iostream>
+#include "utils.hpp"
+#include "Enumerations.h"
+#include "DNASequence.hpp"
+#include "FASTAReader.hpp"
+#include "CommandLineParser.hpp"
+#include "metagenome/TitleTable.hpp"
+#include "metagenome/FindRandomSequence.hpp"
+#include "statistics/StatUtils.hpp"
+#include "HDFBasWriter.hpp"
+#include "HDFRegionTableWriter.hpp"
+#include "simulator/LengthHistogram.hpp"
+#include "simulator/OutputSampleListSet.hpp"
+#include "simulator/ContextOutputList.hpp"
+
+using namespace std;
+
+void SetHelp(string & str) {
+    stringstream helpStream;
+    helpStream 
+        << "usage: alchemy outputModel [ options ]" << endl
+        << " options: " << endl
+        << "  -genome genome.fasta" << endl
+        << "            Simulate reads from the reference genome 'genome.fasta'." << endl << endl
+        << "  -numBasesPerFile numBasesPerFile" << endl
+        << "            Limit the number of bases per output file to this." << endl << endl
+        << "  -sourceReads filename " << endl
+        << "            When set, simulate reads by reading from 'filename', " << endl
+        << "            rather than simulating from a genome." << endl 
+        << "            The format of the fasta titles should be >read_index|chr|start_pos|end_pos" << endl << endl
+        << "  -lengthModel" << endl
+        << "            Use lengths from the alchemy model, rather than the read length.  This " << endl
+        << "            is used in conjunction with the sourceReadsFile, to modulate the lenghts" << endl
+        << "            of the reads." << endl << endl
+        << "  -fixedLength length " << endl
+        << "            Set simulated read length to a fixed value of 'length', rather than " << endl
+        << "            sampling from a length mode." << endl 
+        << "  -movieName name (\"simulated_movie\")" << endl 
+        << "            Use 'name' for movies rather than m000_000..." << endl << endl
+        << "  -titleTable name" <<endl 
+        << "            Read in the titleTable to assign chromosome indices from " << endl
+        << "            simulated reads." << endl << endl
+        << "  -baseFileName name (\"simulated\")" << endl 
+        << "            Use an alternative name for the output file, rather than 'simulated'" << endl << endl 
+        << "  -nFiles N (1)" << endl
+        << "            The number of files to simulate. " << endl << endl 
+        << "  -meanLength L(0)" << endl
+        << "            When set, scales the length of the average read to L." << endl  << endl 
+        << "  -posMap   filename  " << endl
+        << "            Use this when running alignment through compareSequences.py " << endl
+        << "            and writing to cmp.h5. Specify a map between movie names and " << endl
+        << "            chromosome/positions. " << endl << endl 
+        << "            When set, the simulated positions are not sored in " << endl
+        << "            the bas.h5 files and instead printed to 'filename'" << endl << endl 
+        << "  -printPercentRepeat" << endl
+        << "            Add to the title table a field that has the percent " << endl
+        << "            repeat content of the read shown by lower case in " << endl
+        << "            the reference." << endl << endl;
+    str = helpStream.str();
+}
+
+int main(int argc, char* argv[]) {
+    string refGenomeFileName = "";
+    string lengthModelFileName = "";
+    string outputModelFileName = "";
+    DNALength numBasesPerFile = 0;
+    string sourceReadsFileName = "";
+    string titleTableFileName = "";
+    int numBasH5Files = 1;
+    string basH5BaseFileName = "simulated";
+    string movieName = "m101211_092754_00114_cSIM_s1_p0";
+    bool   doRandGenInit = true;
+    bool   usePosMap     = false;
+    bool   printPercentRepeat = false;
+    string posMapFileName = "";
+    vector<string> movieNames;
+    bool useLengthModel = false;
+    bool useFixedLength = false;
+    ofstream posMapFile;
+    int scaledLength = 0;
+    int fixedLength = 0;
+    int nBasFiles = 1;
+    bool useLengthsModel = true;
+    bool printHelp = false;
+
+    
+  //  Look to see if the refAsReads flag is specified anywhere before
+  //  parsing the command line.
+
+    CommandLineParser clp;
+    string commandLine;
+    string helpString;
+    SetHelp(helpString);
+    vector<string> fns;
+
+    clp.RegisterStringOption("genome", &refGenomeFileName, "");
+    clp.RegisterIntOption("numBasesPerFile", (int*)&numBasesPerFile, "",
+            CommandLineParser::PositiveInteger);
+    clp.RegisterStringOption("sourceReads", &sourceReadsFileName, "");
+    clp.RegisterStringOption("lengthModel", &lengthModelFileName, "");
+    clp.RegisterIntOption("fixedLength", &fixedLength, "",
+            CommandLineParser::PositiveInteger);
+    clp.RegisterFlagOption("lengthModel", &useLengthModel, "");
+    clp.RegisterStringOption("movieName", &movieName, "");
+    clp.RegisterStringOption("titleTable", &titleTableFileName, "");
+    clp.RegisterStringOption("baseFileName", &basH5BaseFileName, "");
+    clp.RegisterIntOption("nFiles", &nBasFiles, "",
+            CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("meanLength", &scaledLength, "",
+            CommandLineParser::PositiveInteger);
+    clp.RegisterStringOption("posMap", &posMapFileName, "");
+    clp.RegisterFlagOption("printPercentRepeat", &printPercentRepeat, "");
+    clp.RegisterFlagOption("h", &printHelp, "");
+
+    clp.SetHelp(helpString);
+    clp.ParseCommandLine(argc, argv, fns);
+    clp.CommandLineToString(argc, argv, commandLine);
+
+    clp.SetProgramName("alchemy");
+
+    outputModelFileName = fns[0];
+    if (argc <= 1 or printHelp or outputModelFileName == "") {
+        cout << helpString << endl;
+        exit(0);
+    }
+
+    if (usePosMap) {
+        CrucialOpen(posMapFileName, posMapFile, std::ios::out);
+    }
+
+    if (sourceReadsFileName == "" and fixedLength == 0) {
+        useLengthModel = true;
+    }
+
+    if (useLengthModel and fixedLength != 0) {
+        cout << "ERROR! You must either use a length model or a fixed length." << endl;
+        exit(1);
+    }
+
+    if (sourceReadsFileName == "" and numBasesPerFile == 0) {
+        cout << "ERROR! You must specify either a set of read to use as " << endl
+             << "original reads for simulation or the total number of bases " << endl
+             << "to simulate in each bas.h5 file." << endl;
+        exit(1);
+    }
+ 
+    if (sourceReadsFileName == "" and refGenomeFileName == "") {
+        cout << "ERROR! You must specify a genome to sample reads from or a set of read "<<endl
+            << "to use as original reads for simulation." << endl;
+        exit(1);
+    }
+
+    if (fixedLength != 0 and refGenomeFileName == "") {
+        cout << "ERROR! You must specify a genome file if using a fixed length." << endl;
+        exit(1);
+    }
+
+    if ((fixedLength != 0 or scaledLength != 0) and sourceReadsFileName != "") {
+        cout << "ERROR! You cannot specify a fixed length nor mean length with a source " << endl
+            << "reads file.  The read lengths are taken from the source reads or the length model." << endl;
+        exit(1);
+    }
+
+    LengthHistogram   lengthHistogram;
+    OutputSampleListSet   outputModel(0);
+    TitleTable titleTable;
+
+    if (doRandGenInit) {
+        InitializeRandomGeneratorWithTime();
+    }
+
+    //
+    // Read models.
+    //
+    if (titleTableFileName != "") {
+        titleTable.Read(titleTableFileName);
+    }
+
+
+    outputModel.Read(outputModelFileName);
+
+    if (useLengthModel) {
+        lengthHistogram.BuildFromAlignmentLengths(outputModel.lengths);
+    }
+
+
+    vector<int> alignmentLengths;
+    int meanAlignmentLength;
+
+
+    if (scaledLength != 0 and useLengthModel) {
+        //
+        // Scale the histogram so that the average length is 'scaledLength'.
+        //
+
+        // 1. Integrate histogram
+        long totalLength = 0;
+        long totalSamples = 0;
+        int hi;
+        for (hi = 0; hi < lengthHistogram.lengthHistogram.cdf.size()-1; hi++) {
+            int ni;
+            ni = lengthHistogram.lengthHistogram.cdf[hi+1] - lengthHistogram.lengthHistogram.cdf[hi];
+            totalLength += ni * lengthHistogram.lengthHistogram.data[hi];
+        }
+        totalSamples = lengthHistogram.lengthHistogram.cdf[lengthHistogram.lengthHistogram.cdf.size()-1];
+
+        float meanSampleLength = totalLength / (1.0*totalSamples);
+        float fractionIncrease = scaledLength / meanSampleLength;
+
+        for (hi = 0; hi < lengthHistogram.lengthHistogram.cdf.size(); hi++) {
+            lengthHistogram.lengthHistogram.data[hi] *= fractionIncrease;
+        }
+    }
+
+    FASTAReader inReader, seqReader;
+    vector<FASTASequence> reference;
+    DNALength refLength = 0;
+    int i;
+    if (refGenomeFileName != "") {
+        inReader.Init(refGenomeFileName);
+        inReader.ReadAllSequences(reference);
+
+        for (i = 0; i < reference.size(); i++) {
+            refLength += reference[i].length;
+        }
+    }
+
+    if (sourceReadsFileName !=  "") {
+        seqReader.Init(sourceReadsFileName);
+    }
+
+    ofstream readsFile;
+
+    //
+    // Create and simulate bas.h5 files.
+    //
+    int baseFileIndex;
+    bool readsRemain = true;
+    for (baseFileIndex = 0; ((sourceReadsFileName == "" and baseFileIndex < nBasFiles)  // case 1 is reads are generated by file
+                or (sourceReadsFileName != "" and readsRemain)); // case 2 is reads are generated by an input file.
+            baseFileIndex++) {
+        //
+        // Prep the base file for writing.
+        //
+        stringstream fileNameStrm, movieNameStrm;
+        //string movieName = "m000000_000000_00000_cSIMULATED_s";
+        movieNameStrm << movieName << baseFileIndex << "_p0";
+        string fullMovieName = movieNameStrm.str();		
+        fileNameStrm  << fullMovieName <<  ".bas.h5";
+
+
+        HDFBasWriter basWriter;
+        HDFRegionTableWriter regionWriter;
+        //
+        // This is mainly used to create the atributes.
+        //
+        RegionTable regionTable;
+        regionTable.CreateDefaultAttributes();
+
+        basWriter.SetPlatform(Springfield);
+        //
+        // Use a fixed set of fields for now.
+        //
+
+        // These are all pulled from the outputModel.
+        basWriter.IncludeField("Basecall");
+        basWriter.IncludeField("QualityValue");
+        basWriter.IncludeField("SubstitutionQV");
+        basWriter.IncludeField("SubstitutionTag");
+        basWriter.IncludeField("InsertionQV");
+        basWriter.IncludeField("DeletionQV");
+        basWriter.IncludeField("DeletionTag");
+        basWriter.IncludeField("WidthInFrames");
+        basWriter.IncludeField("PreBaseFrames");
+        basWriter.IncludeField("PulseIndex");
+
+        vector<unsigned char> qualityValue, substitutionQV, substitutionTag, insertionQV, deletionQV, deletionTag;
+        vector<HalfWord> widthInFrames, preBaseFrames, pulseIndex;
+
+        // Just go from 0 .. hole Number
+        basWriter.IncludeField("HoleNumber");
+        // Fixed to 0.
+        basWriter.IncludeField("HoleXY");
+        if (usePosMap == false) {
+            basWriter.IncludeField("SimulatedSequenceIndex");
+            basWriter.IncludeField("SimulatedCoordinate");
+        }
+        basWriter.SetChangeListID("1.3.0.50.104380");
+
+
+        DNALength numSimulatedBases  = 0;
+        FASTASequence sampleSeq;
+        //sampleSeq.length = readLength;
+        int maxRetry = 10000000;
+        int retryNumber = 0;
+        int numReads = 0;
+        int readLength = 0;
+
+        while (numBasesPerFile == 0 or numSimulatedBases < numBasesPerFile) {
+            DNALength seqIndex, seqPos;
+            if (useLengthModel or fixedLength) {
+                if (useLengthModel) {
+                    lengthHistogram.GetRandomLength(readLength);
+                }
+                else {
+                    readLength = fixedLength;
+                }
+            }
+            if (refGenomeFileName != "") {
+                FindRandomPos(reference, seqIndex, seqPos, readLength + (outputModel.keyLength - 1));
+                sampleSeq.seq    = &reference[seqIndex].seq[seqPos];
+                sampleSeq.length = readLength + (outputModel.keyLength - 1);
+                assert(reference[seqIndex].length >= sampleSeq.length);
+            }
+            else if (sourceReadsFileName != "") {
+                if (seqReader.GetNext(sampleSeq) == false) {
+                    readsRemain = false;
+                    break;
+                }
+                if (sampleSeq.length < outputModel.keyLength) {
+                    continue;
+                }
+                //
+                // Now attempt to parse the position from the fasta title.
+                //
+
+                if (useLengthModel) {
+                    int tryNumber = 0;
+                    readLength = 0;
+                    int maxNTries = 1000;
+                    int tryBuffer[5] = {-1,-1,-1,-1,-1};
+                    while (tryNumber < maxNTries and readLength < outputModel.keyLength) {
+                        lengthHistogram.GetRandomLength(readLength);
+                        readLength = sampleSeq.length = min(sampleSeq.length, (unsigned int) readLength);
+                        tryBuffer[tryNumber%5] = readLength;
+                        tryNumber++;
+                    }
+                    if (tryNumber >= maxNTries) {
+                        cout << "ERROR. Could not generate a read length greater than the " << outputModel.keyLength << " requried " <<endl
+                            << "minimum number of bases using the length model specified in the alchemy." <<endl
+                            << "model.  Something is either wrong with the model or the context length is too large." <<endl;
+                        cout << "The last few tries were: " << tryBuffer[0] << " " << tryBuffer[1] << " " << tryBuffer[2] << " " << tryBuffer[3] << " " << tryBuffer[4] << endl;
+                        exit(1);
+                    }
+                }
+
+                readLength = sampleSeq.length;
+                vector<string> tokens;
+                Splice(sampleSeq.title, "|", tokens);
+                if (tokens.size() == 4) {
+                    seqPos = atoi(tokens[2].c_str());
+                    if (titleTableFileName == "") {
+                        seqIndex = 0;
+                    }
+                    else {
+                        int index;
+                        titleTable.Lookup(tokens[1], index);
+                        seqIndex = index;
+                    }
+                }
+                else {
+                    seqPos   = 0;
+                }
+            }
+
+            //
+            // If this is the first read printed to the base file, initialize it.
+            //
+            if (numSimulatedBases == 0) {
+                basWriter.Initialize(fileNameStrm.str(), movieNameStrm.str(), Springfield);
+                regionWriter.Initialize(basWriter.pulseDataGroup);
+            }
+
+            numSimulatedBases += readLength;
+
+            int p;
+            // create the sample sequence
+            int contextLength = outputModel.keyLength;
+            int contextMiddle = contextLength / 2;
+            string outputString;
+
+            int nDel = 0;
+            int nIns = 0;
+
+            //
+            // Simulate to beyond the sample length.
+            //
+            qualityValue.clear(); 
+            substitutionQV.clear(); 
+            substitutionTag.clear(); 
+            insertionQV.clear(); 
+            deletionQV.clear(); 
+            deletionTag.clear();
+            pulseIndex.clear();
+            widthInFrames.clear();
+            preBaseFrames.clear();
+            assert(sampleSeq.length > contextMiddle + 1);
+            for (p = contextMiddle;
+                    p < sampleSeq.length - contextMiddle - 1; p++) {
+                string refContext;
+                refContext.assign((const char*) &sampleSeq.seq[p-contextMiddle], contextLength);
+
+                string outputContext;
+                int    contextWasFound;
+                OutputSample sample;
+                int i;
+                for (i = 0; i < refContext.size(); i++) { refContext[i] = toupper(refContext[i]);}
+                outputModel.SampleRandomSample(refContext, sample);
+
+                if (sample.type == OutputSample::Deletion ) {
+                    //
+                    // There was a deletion.  Advance in reference, then output
+                    // the base after the deletion.
+                    //
+                    p++;
+                    ++nDel;
+                }
+
+                int cp;
+                //
+                // Add the sampled context, possibly multiple characters because of an insertion.
+                //
+                for (i = 0; i < sample.nucleotides.size(); i++) {
+                    outputString.push_back(sample.nucleotides[i]);
+                    qualityValue.push_back(sample.qualities[i].qv[0]);
+                    deletionQV.push_back(sample.qualities[i].qv[1]);
+                    insertionQV.push_back(sample.qualities[i].qv[2]);
+                    substitutionQV.push_back(sample.qualities[i].qv[3]);
+                    deletionTag.push_back(sample.qualities[i].tags[0]);
+                    substitutionTag.push_back(sample.qualities[i].tags[1]);
+                    pulseIndex.push_back(sample.qualities[i].frameValues[0]);
+                    preBaseFrames.push_back(sample.qualities[i].frameValues[1]);
+                    widthInFrames.push_back(sample.qualities[i].frameValues[2]);
+                }
+                nIns += sample.qualities.size() - 1;
+            }
+            if (outputString.find('N') != outputString.npos or
+                    outputString.find('n') != outputString.npos) {
+                cout << "WARNING!  The sampled string " << endl << outputString << endl
+                    << "should not contain N's, but it seems to.  This is being ignored "<<endl
+                    << "for now so that simulation may continue, but this shouldn't happen"<<endl
+                    << "and is really a bug." << endl;
+                numSimulatedBases -= readLength;
+                continue;
+            }
+            //
+            // Ok, done creating the read, now time to create some quality values!!!!!
+            //
+            SMRTSequence read;
+            read.length = outputString.size();
+            read.Allocate(read.length);
+            memcpy(read.seq, outputString.c_str(), read.length * sizeof(unsigned char));
+            assert(qualityValue.size() == read.length * sizeof(unsigned char));
+            memcpy(read.qual.data, &qualityValue[0], read.length * sizeof(unsigned char));
+            memcpy(read.deletionQV.data, &deletionQV[0], read.length * sizeof(unsigned char));
+            memcpy(read.insertionQV.data, &insertionQV[0], read.length * sizeof(unsigned char));
+            memcpy(read.substitutionQV.data, &substitutionQV[0], read.length * sizeof(unsigned char));
+            memcpy(read.deletionTag, &deletionTag[0], read.length * sizeof(unsigned char));
+            memcpy(read.substitutionTag, &substitutionTag[0], read.length * sizeof(unsigned char));
+            memcpy(read.pulseIndex, &pulseIndex[0], read.length * sizeof(int));
+            memcpy(read.preBaseFrames, &preBaseFrames[0], read.length * sizeof(HalfWord));
+            memcpy(read.widthInFrames, &widthInFrames[0], read.length * sizeof(HalfWord));
+
+            //
+            // The pulse index for now is just fake data.
+            //
+            int i;
+            for (i = 0; i < read.length; i++) {
+                read.pulseIndex[i] = 1;
+            }
+            read.xy[0] = seqIndex;
+            read.xy[1] = seqPos;
+            read.zmwData.holeNumber = numReads;
+
+            basWriter.Write(read);
+            // Record where this was simulated from.
+            if (usePosMap == false) {
+                basWriter.WriteSimulatedCoordinate(seqPos);
+                basWriter.WriteSimulatedSequenceIndex(seqIndex);
+            }
+            else {
+                posMapFile << fullMovieName << "/" << numReads << "/0_" << read.length << " " << seqIndex << " "<< seqPos;
+                if (printPercentRepeat) {
+                    DNALength nRepeat = sampleSeq.GetRepeatContent();
+                    posMapFile << " " << nRepeat*1.0/sampleSeq.length;
+                }
+                posMapFile << endl;
+            }
+            RegionAnnotation region;
+            region.row[0] = read.zmwData.holeNumber;
+            region.row[1] = 1;
+            region.row[2] = 0;
+            region.row[3] = read.length;
+            region.row[4] = 1000; // Should be enough.
+            regionWriter.Write(region);
+            region.row[1] = 2; // Rewrite for hq region encompassing everything.
+            regionWriter.Write(region);      
+            if (sourceReadsFileName != "") {
+                sampleSeq.Free();
+            }
+            read.Free();
+            ++numReads;
+        }
+        regionWriter.Finalize(regionTable.columnNames, 
+                regionTable.regionTypes,
+                regionTable.regionDescriptions,
+                regionTable.regionSources);
+        basWriter.Close();
+        numReads = 0;
+        //
+        // The bas writer should automatically flush on closing.
+        //
+    }
+    if (usePosMap) {
+        posMapFile.close();
+    }
+
+    for (i = 0; i < reference.size(); i++) {
+        reference[i].Free();
+    }
+}
+
diff --git a/extrautils/BuildSequenceDB.cpp b/extrautils/BuildSequenceDB.cpp
new file mode 100644
index 0000000..2532b2c
--- /dev/null
+++ b/extrautils/BuildSequenceDB.cpp
@@ -0,0 +1,52 @@
+#include <string>
+#include "utils.hpp"
+#include "metagenome/SequenceIndexDatabase.hpp"
+#include "CommandLineParser.hpp"
+#include "FASTAReader.hpp"
+#include "utils/FileOfFileNames.hpp"
+
+using namespace std;
+
+int main(int argc, char* argv[]) {
+
+    CommandLineParser clp;
+    string fastaFileName, indexFileName;
+    vector<string> fastaFileNames;
+    vector<string> opts;
+    clp.SetProgramName("bsdb");
+    clp.SetProgramSummary("Build an index database on a file of sequences.\n"
+            " The index is used to map to reads given alignment positions.\n");
+    clp.RegisterStringOption("fasta", &fastaFileName, "A file with sequences to build an index.");
+    clp.RegisterStringOption("index", &indexFileName, "The index file.");
+    clp.RegisterPreviousFlagsAsHidden();
+
+    clp.ParseCommandLine(argc, argv, opts);
+
+    ifstream fastaIn;
+    ofstream indexOut;
+
+    if (FileOfFileNames::IsFOFN(fastaFileName)) {
+        FileOfFileNames::FOFNToList(fastaFileName, fastaFileNames);
+    }
+    else {
+        fastaFileNames.push_back(fastaFileName);
+    }
+
+    CrucialOpen(indexFileName, indexOut, std::ios::out | std::ios::binary);
+    SequenceIndexDatabase<FASTASequence> seqDB;
+
+    int fileNameIndex;
+    for (fileNameIndex = 0; fileNameIndex < fastaFileNames.size(); fileNameIndex++){ 
+        FASTAReader reader;
+        FASTASequence seq;
+        reader.Init(fastaFileNames[fileNameIndex]);
+        int i = 0;
+        while (reader.GetNext(seq)) {
+            seqDB.AddSequence(seq);
+            i++;
+        }
+    }
+    seqDB.Finalize();
+    seqDB.WriteDatabase(indexOut);
+    return 0;
+}
diff --git a/extrautils/BwtToSuffixArray.cpp b/extrautils/BwtToSuffixArray.cpp
new file mode 100644
index 0000000..12df5c4
--- /dev/null
+++ b/extrautils/BwtToSuffixArray.cpp
@@ -0,0 +1,33 @@
+#include "bwt/BWT.hpp"
+#include "suffixarray/SuffixArray.hpp"
+#include "suffixarray/SuffixArrayTypes.hpp"
+
+
+#include <string>
+#include <cstring>
+#include <iostream>
+
+using namespace std;
+
+int main(int argc, char* argv[]) {
+	
+	string bwtFileName, saFileName;
+	if (argc < 3) {
+		cout << "usage: bwt2sa bwtfile safile " << endl;
+		exit(1);
+	}
+	bwtFileName = argv[1];
+	saFileName  = argv[2];
+
+ 	Bwt<PackedDNASequence, FASTASequence> bwt;	
+	DNASuffixArray suffixArray;
+
+	bwt.Read(bwtFileName);
+	suffixArray.AllocateSuffixArray(bwt.bwtSequence.length-1);
+	SAIndex index;
+	for (index = 1; index < bwt.bwtSequence.length+1; index++) {
+		suffixArray.index[index-1] = bwt.Locate(index);
+	}
+	suffixArray.Write(saFileName);
+	
+}
diff --git a/extrautils/CCSH5ToBam.cpp b/extrautils/CCSH5ToBam.cpp
new file mode 100644
index 0000000..7593cc9
--- /dev/null
+++ b/extrautils/CCSH5ToBam.cpp
@@ -0,0 +1,135 @@
+#include "utils/FileOfFileNames.hpp"
+#include "datastructures/alignmentset/SAMSupplementalQVList.hpp"
+#include "format/SAMHeaderPrinter.hpp"
+#include "format/BAMPrinter.hpp"
+#include "pbbam/BamWriter.h"
+#include "CommandLineParser.hpp"
+
+using namespace PacBio::BAM;
+using namespace std;
+
+string DISCLAIM = 
+"THIS TOOL IS CREATED FOR DEVELOPERS USE ONLY AND IT MAY OR MAY NOT "
+"BREAK AT ANY TIME. USE AT YOUR OWN RISK.";
+
+string GetVersion(void) {
+    return "1.0";
+}
+
+void CCSReadToBamRecord(CCSSequence & ccsRead, BamRecord & bamRecord, SupplementalQVList & samQVList) {
+//m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/1650/1920_2155   4   *   0   255 *   *   0   0
+    bamRecord.Impl().Name(ccsRead.GetTitle());
+    bamRecord.Impl().Flag(static_cast<uint32_t>(4));
+    string seqString;
+    seqString.assign((char*)ccsRead.seq, ccsRead.length);
+
+    bamRecord.Impl().SetSequenceAndQualities(seqString, ccsRead.qual.ToString());
+    // bamRecord.Impl().CigarData(Cigar::FromStdString("*"));
+    bamRecord.Impl().Bin(0);
+    bamRecord.Impl().InsertSize(0);
+    bamRecord.Impl().MatePosition(static_cast<PacBio::BAM::Position>(-1));
+    bamRecord.Impl().MateReferenceId(static_cast<int32_t>(-1));
+    bamRecord.Impl().Position(static_cast<PacBio::BAM::Position>(-1));
+    bamRecord.Impl().ReferenceId(static_cast<int32_t>(-1));
+    TagCollection tags;
+    tags["RG"] = ccsRead.GetReadGroupId();
+    tags["np"] = ccsRead.numPasses;
+    tags["zm"] = ccsRead.zmwData.holeNumber;
+    tags["qs"] = 0;
+    tags["qe"] = ccsRead.length;
+
+    samQVList.FormatQVOptionalFields(ccsRead);
+    // Add QVs to BamRecordImpl.
+    string insertionQVs, deletionQVs, substitutionQVs, mergeQVs, substitutionTags, deletionTags;
+    if (ccsRead.GetQVs("InsertionQV", insertionQVs)) {
+        tags["iq"] = insertionQVs;
+    }
+    if (ccsRead.GetQVs("DeletionQV", deletionQVs)) {
+        tags["dq"] = deletionQVs;
+    }
+    if (ccsRead.GetQVs("SubstitutionQV", substitutionQVs)) {
+        tags["sq"] = substitutionQVs;
+    }
+    if (ccsRead.GetQVs("MergeQV", mergeQVs)) {
+        tags["mq"] = mergeQVs;
+    }
+    // substitutionTag is not included by default
+    if (ccsRead.GetQVs("DeletionTag", deletionTags)) {
+        tags["dt"] = deletionTags;
+    }
+    bamRecord.Impl().Tags(tags);
+}
+
+int main(int argc, char* argv[]) {
+    string progName = "ccsh5tobam";
+    CommandLineParser clp;
+    clp.SetHelp("Convert ccs.h5 to bam.\n" + DISCLAIM);
+    clp.SetConciseHelp("ccsh5tobam ccs.h5|fofn out.bam\n" + DISCLAIM);
+    clp.SetProgramName(progName);
+    clp.SetVersion(GetVersion());
+    string fofn, bamOutName;
+    clp.RegisterStringOption("in.ccs.h5", &fofn, "Input ccs.h5|fofn file.", true);
+    clp.RegisterStringOption("out.bam", &bamOutName, "Output bam file.", true);
+    clp.RegisterPreviousFlagsAsHidden();
+    clp.ParseCommandLine(argc, argv);
+
+    //cerr << "[INFO] " << GetTimestamp() << " [" << progName << "] started."  << endl;
+
+    vector<string> ccsFileNames;
+    FileOfFileNames::StoreFileOrFileList(fofn, ccsFileNames);
+
+    string so = "UNKNOWN"; // sorting order;
+    string version = GetVersion(); 
+    string commandLineString;
+    clp.CommandLineToString(argc, argv, commandLineString);
+
+    SupplementalQVList samQVList;
+    samQVList.SetDefaultQV();
+    SequenceIndexDatabase<FASTASequence> seqdb;
+    SAMHeaderPrinter shp(so, seqdb,
+            ccsFileNames, ReadType::ReadTypeEnum::CCS,
+            samQVList, "ccsh52bam", version,
+            commandLineString);
+    string headerString = shp.ToString();// SAM/BAM header
+
+    BamHeader header = BamHeader(headerString);
+    // Both file name and SAMHeader are required in order to create a BamWriter.
+    BamWriter * bamWriterPtr = new BamWriter(bamOutName, header);
+
+    for (string ccsFileName: ccsFileNames) {
+        ReaderAgglomerate reader;
+        reader.SetReadFileName(ccsFileName);
+        reader.SetReadType(ReadType::ReadTypeEnum::CCS);
+
+        // Initialize using already set file names.
+        int initReturnValue = reader.Initialize();
+        if (initReturnValue <= 0) {
+            cerr << "WARNING! Could not open file " << ccsFileName << endl;
+            continue;
+        }
+
+        // Check whether use ccs only.
+        assert (reader.GetFileType() == HDFCCSONLY);
+        int randint = 0;
+        CCSSequence ccsRead;
+        while(reader.GetNext(ccsRead, randint) != 0) {
+            if (ccsRead.length > 0) {
+                BamRecord bamRecord;
+                CCSReadToBamRecord(ccsRead, bamRecord, samQVList);
+                bamWriterPtr->Write(bamRecord);
+            }
+        }
+    }
+
+    try {
+        bamWriterPtr->TryFlush();
+        delete bamWriterPtr;
+        bamWriterPtr = NULL;
+    } catch (std::exception e) {
+        cout << "Error, could not flush bam records to bam file." << endl;
+        exit(1);
+    }
+
+    //cerr << "[INFO] " << GetTimestamp() << " [" << progName << "] ended."  << endl;
+    return 0;
+}
diff --git a/extrautils/Evolve.cpp b/extrautils/Evolve.cpp
new file mode 100644
index 0000000..31bd06b
--- /dev/null
+++ b/extrautils/Evolve.cpp
@@ -0,0 +1,169 @@
+#include <vector>
+#include <sstream>
+#include "utils.hpp"
+#include "FASTAReader.hpp"
+#include "FASTASequence.hpp"
+#include "CommandLineParser.hpp"
+#include "statistics/StatUtils.hpp"
+
+using namespace std;
+/*
+ref000001	.	SNV	9454	9454	0.00	.	.	reference=C;confidence=0;Name=9454C>A;coverage=0;variantseq=A
+ref000001	.	deletion	20223	20223	0.00	.	.	reference=T;length=1;confidence=0;coverage=0;Name=20222delT
+ref000001	.	insertion	35089	35089	0.00	.	.	confidence=0;Name=35089_35090insC;reference=.;length=1;coverage=0;variantseq=C
+*/
+
+char ToLower(char c, bool useToLower) {
+    if (useToLower) {
+        return tolower(c);
+    }
+    else {
+        return toupper(c);
+    }
+}
+
+
+int main(int argc, char* argv[]) {
+    CommandLineParser clp;
+
+    string refGenomeName;
+    string mutGenomeName;
+    string gffFileName;
+    float insRate = 0;
+    float delRate = 0;
+    float mutRate = 0;
+    bool  lower = false;
+    gffFileName = "";
+    clp.RegisterStringOption("refGenome", &refGenomeName, "Reference genome.", true);
+    clp.RegisterStringOption("mutGenome", &mutGenomeName, "Mutated genome.", true);
+    clp.RegisterPreviousFlagsAsHidden();
+    clp.RegisterStringOption("gff", &gffFileName, "GFF file describing the modifications made to the genome.");
+    clp.RegisterFloatOption("i", &insRate, "Insertion rate: (0-1].", 
+            CommandLineParser::NonNegativeFloat, false);
+    clp.RegisterFloatOption("d", &delRate, "Deletion rate: (0-1]", 
+            CommandLineParser::NonNegativeFloat, false);
+    clp.RegisterFloatOption("m", &mutRate, "Mutation rate, even across all nucleotides: (0-1]", 
+            CommandLineParser::NonNegativeFloat, false);
+    clp.RegisterFlagOption("lower", &lower, "Make mutations in lower case", false);
+    vector<string> leftovers;
+    clp.ParseCommandLine(argc, argv, leftovers);
+
+    FASTAReader reader;
+    FASTASequence refGenome;
+
+    reader.Init(refGenomeName);
+    ofstream mutGenomeOut;
+    CrucialOpen(mutGenomeName, mutGenomeOut, std::ios::out);
+    ofstream gffOut;
+    if (gffFileName != "") {
+        CrucialOpen(gffFileName, gffOut, std::ios::out);
+    }
+
+    vector<int> insIndices, delIndices, subIndices;
+    int readIndex = 0;
+    InitializeRandomGeneratorWithTime();
+    while (reader.GetNext(refGenome)) {
+        insIndices.resize(refGenome.length);
+        delIndices.resize(refGenome.length);
+        subIndices.resize(refGenome.length);
+        std::fill(insIndices.begin(), insIndices.end(), false);
+        std::fill(delIndices.begin(), delIndices.end(), false);
+        std::fill(subIndices.begin(), subIndices.end(), 0);
+
+        enum ChangeType { Ins, Del, Mut, None};
+        float changeProb[4];
+        changeProb[Ins] = insRate;
+        changeProb[Del] = changeProb[Ins] + delRate;
+        changeProb[Mut] = changeProb[Del] + mutRate;
+        changeProb[None] = 1;
+
+        if (changeProb[Mut] > 1) {
+            cout << "ERROR! The sum of the error probabilities must be less than 1" << endl;
+            exit(1);
+        }
+        DNALength pos;
+        float randomNumber;
+        int numIns = 0;
+        int numDel = 0;
+        int numMut = 0;
+        for (pos =0 ; pos < refGenome.length; pos++) { 
+            randomNumber = Random();
+            if (randomNumber < changeProb[Ins]) {
+                insIndices[pos] = true;
+                numIns++;
+            }
+            else if (randomNumber < changeProb[Del]) {
+                delIndices[pos] = true;
+                numDel++;
+            }
+            else if (randomNumber < changeProb[Mut]){ 
+                Nucleotide newNuc = TwoBitToAscii[RandomInt(4)];
+                int maxIts = 100000;
+                int it = 0;
+                while (newNuc == refGenome.seq[pos]) {
+                    newNuc = TwoBitToAscii[RandomInt(4)];
+                    if (it == maxIts) {
+                        cout << "ERROR, something is wrong with the random number generation, it took too many tries to generate a new nucleotide" << endl;
+                        exit(1);
+                    }
+                }
+                subIndices[pos] = refGenome[pos];
+                refGenome.seq[pos] = ToLower(newNuc,lower);
+                ++numMut;
+            }
+        }
+        //		cout << readIndex << " m " << numMut << " i " << numIns << " d " << numDel << endl;
+        if (readIndex % 100000 == 0 && readIndex > 0) {
+            cout << readIndex << endl;
+        }
+        // 
+        // Now add the insertions and deletions.
+        //
+        FASTASequence newSequence;
+        DNALength   newPos;
+        if (numIns - numDel + refGenome.length < 0) {
+            cout << "ERROR, the genome has been deleted to nothing." << endl;
+            exit(1);
+        }
+        ResizeSequence(newSequence, refGenome.length + (numIns - numDel));
+        newPos = 0;
+        pos = 0;
+        for (pos = 0; pos < refGenome.length; pos++) {
+            assert(newPos < newSequence.length or delIndices[pos] == true);
+            if (subIndices[pos] != 0 and gffFileName != "") {
+                gffOut << refGenome.GetName() << "	.	SNV	" << newPos << " " << newPos <<" 0.00	.	.	reference=" << (char)subIndices[pos] << ";confidence=10;Name=" << newPos << (char)subIndices[pos] << ">" << refGenome.seq[pos] <<";coverage=10;variantseq=" << refGenome.seq[pos] << endl;
+            }
+
+            if (insIndices[pos] == true) {
+                newSequence.seq[newPos] = ToLower(TwoBitToAscii[RandomInt(4)], lower);
+                newPos++;
+                newSequence.seq[newPos] = refGenome.seq[pos];
+
+                assert(newSequence.seq[newPos] != '1');
+                assert(newSequence.seq[newPos] != 1);
+                if (gffFileName != "") {
+                    gffOut << refGenome.GetName() << "	.	deletion	" << newPos << " " << newPos << " 0.00	.	.	reference=" << newSequence.seq[newPos] << ";length=1;confidence=10;coverage=0;Name="<< newPos << "del" << newSequence.seq[newPos] << endl;
+                }
+                newPos++;
+            }
+            else if (delIndices[pos] == true) {
+                // no-op, skip
+                if (gffFileName != "") {
+                    gffOut << refGenome.GetName() << "	.	insertion	" << newPos << " " << newPos << " 0.00	.	.	confidence=10;Name=" << newPos << "_ins" << refGenome.seq[pos] << ";reference=.;length=1;coverage=0;variantseq=" << refGenome.seq[newPos] << endl;
+                    //ref000001	.	deletion	20223	20223	0.00	.	.	reference=T;length=1;confidence=0;coverage=0;Name=20222delT
+                }
+            }
+            else {
+                newSequence.seq[newPos] = refGenome.seq[pos];
+                newPos++;
+            }
+        }
+        stringstream titlestrm;
+        titlestrm << " mutated ins " << insRate << " del " << delRate << " mut " << mutRate;
+        newSequence.CopyTitle(refGenome.title);
+        newSequence.AppendToTitle(titlestrm.str());
+        newSequence.PrintSeq(mutGenomeOut);
+        newSequence.Free();
+        readIndex++;
+    }
+}
diff --git a/extrautils/ExciseRepeats.cpp b/extrautils/ExciseRepeats.cpp
new file mode 100644
index 0000000..50436dc
--- /dev/null
+++ b/extrautils/ExciseRepeats.cpp
@@ -0,0 +1,69 @@
+#include <sstream>
+#include "FASTAReader.hpp"
+#include "FASTASequence.hpp"
+#include "utils.hpp"
+
+using namespace std;
+
+int main(int argc, char* argv[]) {
+	string seqInName, seqOutName, dotOutName;
+	if (argc < 4) {
+		cout << "usage: exciseRepeats inName repMaskOutFile outName" << endl;
+		exit(1);
+	}
+
+	seqInName = argv[1];
+	dotOutName = argv[2];
+	seqOutName = argv[3];
+	FASTAReader reader;
+	reader.Initialize(seqInName);
+	FASTASequence origSeq;
+	reader.GetNext(origSeq);
+	
+	ifstream dotOutFile;
+	CrucialOpen(dotOutName, dotOutFile);
+	ofstream seqOutFile;
+	ofstream seqOut;
+	CrucialOpen(seqOutName, seqOut, std::ios::out);
+	string dotOutLine;
+	getline(dotOutFile, dotOutLine);
+	getline(dotOutFile, dotOutLine);
+	getline(dotOutFile, dotOutLine);
+	while(getline(dotOutFile, dotOutLine)) {
+		stringstream lineStrm(dotOutLine);
+		int swScore;
+		float pctDiv, pctDel, pctIns;
+		string query;
+		int qPosBegin, qPosEnd;
+		string left;
+		char strand;
+		string matchingRepeat;
+		string repClass;
+		string repPos, repEnd, repLeft;
+		int id;
+		lineStrm >> swScore >> pctDiv >> pctDel >> pctIns >> query >> qPosBegin >> qPosEnd >> left >> strand >> matchingRepeat >> repClass >> repPos >> repEnd >> repLeft >> id;
+		DNALength seqPos;
+		for (seqPos = qPosBegin; seqPos < qPosEnd; seqPos++) {
+			origSeq.seq[seqPos] = 'X';
+		}
+	}
+
+	DNALength seqPos, unexPos;
+	unexPos = 0;
+	for (seqPos = 0; seqPos < origSeq.length; seqPos++) {
+		if (origSeq.seq[seqPos] != 'X') {
+			origSeq.seq[unexPos] = origSeq.seq[seqPos];
+			unexPos++;
+		}
+	}
+	origSeq.length = unexPos;
+
+	origSeq.PrintSeq(seqOut);
+	return 0;
+}
+
+		
+
+	
+					 
+					 
diff --git a/extrautils/GNUmakefile b/extrautils/GNUmakefile
new file mode 100644
index 0000000..5d7da34
--- /dev/null
+++ b/extrautils/GNUmakefile
@@ -0,0 +1,45 @@
+.PHONY=all cramtests
+
+ROOT:=..
+include ${ROOT}/defines.mk
+include ${ROOT}/rules.mk
+
+CXXOPTS := -std=c++0x -pedantic \
+           -Wall -Wuninitialized -Wno-div-by-zero \
+           -MMD -MP -w -fpermissive
+CXXFLAGS += ${CXXOPTS} ${GCXXFLAGS}
+
+EXE = sa2bwt bwt2sa alchemy excrep evolve bsdb simpleShredder swMatcher \
+  samodify sals printTupleCountTable cmpH5StoreQualityByContext ccsh5tobam
+
+LD_LIBRARY_PATH=${HDF5_LIB}:${LIBBLASR_LIB}:${LIBPBIHDF_LIB}:${LIBPBDATA_LIB}
+export LD_LIBRARY_PATH
+
+
+all: ${EXE}
+
+${EXE}:
+	${CXX} -o $@ $< ${CXXFLAGS} ${CPPFLAGS} -MF"${@:%=%.d}" ${STATIC} ${LDFLAGS} ${LDLIBS}
+
+sa2bwt: SuffixArrayToBWT.cpp
+bwt2sa: BwtToSuffixArray.cpp
+alchemy: BasH5Simulator.cpp
+excrep: ExciseRepeats.cpp
+evolve: Evolve.cpp
+bsdb: BuildSequenceDB.cpp
+simpleShredder: SimpleShredder.cpp
+swMatcher: SWMatcher.cpp
+samodify: SAModify.cpp
+sals: SALS.cpp
+printTupleCountTable: PrintTupleCountTable.cpp
+cmpH5StoreQualityByContext: StoreQualityByContextFromCmpH5.cpp
+ccsh5tobam: CCSH5ToBam.cpp
+
+CTESTS := $(wildcard ctest/*.t)
+
+cramtests: ${EXE}
+	cram -v --shell=/bin/bash ${CTESTS}
+
+clean: 
+	@rm -f ${EXE}
+	@rm -f *.d *.o
diff --git a/extrautils/Makefile b/extrautils/Makefile
new file mode 100644
index 0000000..0e05bd5
--- /dev/null
+++ b/extrautils/Makefile
@@ -0,0 +1,78 @@
+SHELL=/bin/bash -e -E
+
+.PHONY=all cramtests
+
+PBINCROOT ?= $(realpath ../../../lib/cpp/)
+PREBUILT ?= $(realpath ../../../../prebuilt.out)
+THIRD_PARTY_PREFIX := $(realpath ../..)
+
+include ../common.mk
+
+all : CXXFLAGS ?= $(DEFAULTCXXFLAG)
+
+debug : CXXFLAGS ?= $(DEBUGCXXFLAG)
+
+profile : CXXFLAGS ?= $(PROFILECXXFLAG)
+
+g: CXXFLAGS += $(GCXXFLAG)
+g: LIBS = $(GLIBS)
+
+exe = sa2bwt bwt2sa alchemy excrep evolve bsdb simpleShredder swMatcher \
+  samodify sals printTupleCountTable cmpH5StoreQualityByContext ccsh5tobam
+
+all debug profile g: $(exe)
+
+sa2bwt: SuffixArrayToBWT.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+bwt2sa: BwtToSuffixArray.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+alchemy: BasH5Simulator.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+excrep: ExciseRepeats.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+evolve: Evolve.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+bsdb: BuildSequenceDB.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+simpleShredder: SimpleShredder.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+swMatcher: SWMatcher.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+samodify: SAModify.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+sals: SALS.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+printTupleCountTable: PrintTupleCountTable.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+cmpH5StoreQualityByContext: StoreQualityByContextFromCmpH5.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+ccsh5tobam: CCSH5ToBam.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+pblib: $(PBINCROOT)/Makefile
+	make -C $(PBINCROOT)
+
+.INTERMEDIATE: $(OBJS)
+
+CTESTS = $(wildcard ctest/*.t)
+cramtests: $(EXE)
+	cram --shell=/bin/bash $(CTESTS)
+
+clean: 
+	@rm -f $(exe)
+	@rm -f $(OBJS) $(DEPS)
+	@rm *.o *.d
+
+-include $(DEPS)
diff --git a/extrautils/PrintTupleCountTable.cpp b/extrautils/PrintTupleCountTable.cpp
new file mode 100644
index 0000000..04d999c
--- /dev/null
+++ b/extrautils/PrintTupleCountTable.cpp
@@ -0,0 +1,65 @@
+#include <string>
+#include <vector>
+#include <iostream>
+#include <fstream>
+
+#include "utils.hpp"
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+#include "CommandLineParser.hpp"
+#include "tuples/DNATuple.hpp"
+#include "tuples/CompressedDNATuple.hpp"
+#include "tuples/TupleMetrics.hpp"
+#include "tuples/TupleCountTable.hpp"
+
+
+#ifdef COMPRESSED
+typedef TupleCountTable<FASTASequence, CompressedDNATuple<FASTASequence> > CountTable;
+#else
+typedef TupleCountTable<FASTASequence, DNATuple> CountTable;
+#endif
+
+int main(int argc, char* argv[]) {
+    CommandLineParser clp;
+    string tableFileName;
+    vector<string> sequenceFiles;
+    TupleMetrics tm;
+    int tupleSize = 8;
+    clp.SetProgramName("printTupleCountTable");
+    clp.SetProgramSummary("Count the number of occurrences of every k-mer in a file.");
+    clp.RegisterStringOption("table", &tableFileName, "Output table name.", true);
+    clp.RegisterIntOption("wordsize", &tupleSize, "Size of words to count", 
+                          CommandLineParser::NonNegativeInteger, false);
+    clp.RegisterStringListOption("reads", &sequenceFiles, "All sequences.", false);
+    clp.RegisterPreviousFlagsAsHidden();
+    vector<string> opts;
+
+    if (argc == 2) {
+        string fastaFileName = argv[1];
+        sequenceFiles.push_back(fastaFileName);
+        tableFileName = fastaFileName + ".ctab";
+    }
+    else {
+        clp.ParseCommandLine(argc, argv, opts);
+    }
+
+    tm.tupleSize = tupleSize;
+    tm.InitializeMask();
+    ofstream tableOut;
+    CrucialOpen(tableFileName, tableOut, std::ios::out| std::ios::binary);
+    CountTable table;
+    table.InitCountTable(tm);
+    int i;
+    FASTASequence seq;
+    for (i = 0; i < sequenceFiles.size(); i++ ){ 
+        FASTAReader reader;
+        reader.Init(sequenceFiles[i]);
+        while (reader.GetNext(seq)) {
+            seq.ToUpper();
+            table.AddSequenceTupleCountsLR(seq);
+        }
+    }	
+    table.Write(tableOut);
+
+    return 0;
+}
diff --git a/extrautils/SALS.cpp b/extrautils/SALS.cpp
new file mode 100644
index 0000000..608fea0
--- /dev/null
+++ b/extrautils/SALS.cpp
@@ -0,0 +1,40 @@
+#include <string>
+#include <iostream>
+#include "utils.hpp"
+#include "suffixarray/SuffixArray.hpp"
+#include "suffixarray/SuffixArrayTypes.hpp"
+
+using namespace std;
+
+int main(int argc, char* argv[]) {
+
+    if (argc <= 1) {
+        cout << "sals checks if a suffix array has lookup table or not." <<endl;
+        cout << "usage sals genome.sa" <<endl;
+        exit(1);
+    }
+
+    string saFileName = argv[1];
+
+    DNASuffixArray sa;
+    if (!sa.LightRead(saFileName)) {
+        cout << "The file is not in a sa format." << endl;
+        exit(1);
+    }
+
+    if (sa.componentList[DNASuffixArray::CompArray]) {
+        cout << " * has a suffix array." << endl;
+    }
+    else {
+        cout << " * does not contain a suffix array." << endl;
+    }
+
+    if (sa.componentList[DNASuffixArray::CompLookupTable]) {
+        cout << " * has a lookup table for word size. " << sa.lookupPrefixLength 
+            << endl;
+    }  
+    else {
+        cout << " * does not have a lookup table." << endl;
+    }
+}
+
diff --git a/extrautils/SAModify.cpp b/extrautils/SAModify.cpp
new file mode 100644
index 0000000..a29966b
--- /dev/null
+++ b/extrautils/SAModify.cpp
@@ -0,0 +1,77 @@
+#include <vector>
+#include <string>
+#include "NucConversion.hpp"
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+#include "suffixarray/SuffixArray.hpp"
+#include "suffixarray/SuffixArrayTypes.hpp"
+#include "suffixarray/ssort.hpp"
+#include "algorithms/sorting/qsufsort.hpp"
+
+
+void PrintUsage() {
+    cout << "samodify changes word size of input suffix array." << endl;
+	cout << "Usage: samodify in.sa genome.fasta out.sa [-blt p]" << endl;
+	cout << "       -blt p  Build a lookup table on prefixes of length 'p' " << endl;
+}
+
+int main(int argc, char* argv[]) {
+
+    if (argc < 4) {
+        PrintUsage();
+        exit(1);
+    }
+    int argi = 1;
+    string saInFile = argv[argi++];
+    string genomeFileName = argv[argi++];
+    string saOutFile = argv[argi++];
+    vector<string> inFiles;
+
+    int doBLT = 0;
+    int doBLCP = 0;
+    int bltPrefixLength = 0;
+    int lcpLength = 0;
+    int parsingOptions = 0;
+
+    while (argi < argc) {
+        if (strcmp(argv[argi], "-blt") == 0) {
+            doBLT = 1;
+            bltPrefixLength = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-blcp") == 0) {
+            doBLCP = 1;
+            lcpLength = atoi(argv[++argi]);
+        }
+        else {
+            PrintUsage();
+            cout << "Bad option: " << argv[argi] << endl;
+            exit(1);
+        }
+        ++argi;
+    }
+
+    //
+    // Read the suffix array to modify.
+    //
+
+    DNASuffixArray  sa;
+    sa.Read(saInFile);
+
+    FASTAReader reader;
+    reader.Initialize(genomeFileName);
+    FASTASequence seq;
+    reader.ReadAllSequencesIntoOne(seq);
+
+
+    if (doBLT) {
+        sa.BuildLookupTable(seq.seq, seq.length, bltPrefixLength);
+    }
+
+    if (doBLCP) {
+        cout << "LCP Table not yet implemented." << endl;
+    }
+
+    sa.Write(saOutFile);
+
+}
+
diff --git a/extrautils/SWMatcher.cpp b/extrautils/SWMatcher.cpp
new file mode 100644
index 0000000..0649adf
--- /dev/null
+++ b/extrautils/SWMatcher.cpp
@@ -0,0 +1,180 @@
+#include <assert.h>
+#include <string>
+#include <iostream>
+#include <vector>
+
+#include "FASTAReader.hpp"
+#include "FASTASequence.hpp"
+#include "algorithms/alignment/AlignmentUtils.hpp"
+#include "algorithms/alignment/DistanceMatrixScoreFunction.hpp"
+#include "algorithms/alignment/IDSScoreFunction.hpp"
+#include "algorithms/alignment/SWAlign.hpp"
+#include "format/StickAlignmentPrinter.hpp"
+
+using namespace std;
+
+int main(int argc, char* argv[]) {
+	if (argc < 3) {
+        cout << "usage: swMatcher query target [-indel i] [-local] [-showalign] " << endl
+             << "       [-type queryfit|overlap|global] [-match m ] [-mismatch m]" << endl
+             << "    or [-local] [-queryfit] [-overlap] [-fixedtarget] [-fixedquery]" << endl
+             << "       [-printmatrix]"<< endl
+             << "   Unless -showalign is specified, output is tabular and in the formt:"<<endl
+             << "   query_length target_length align_score query_start query_end target_start target_end"<<endl;
+		exit(1);
+	}
+
+    string queryName, targetName;
+    queryName = argv[1];
+    targetName = argv[2];
+    int argi = 3;
+    int indelCost = 3;
+    int showAlign = 0;
+    AlignmentType alignType = Global;
+    int match = 0;
+    int mismatch = 0;
+    int fixedTarget = 0;
+    int fixedQuery  = 0;
+    bool printMatrix = false;
+    int insertion = 4;
+    int deletion  = 5;
+    while (argi < argc) {
+        if (strcmp(argv[argi], "-insertion") == 0) {
+            insertion = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-deletion") == 0) {
+            deletion = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-local") == 0) {
+            alignType = Local;
+        }
+        else if (strcmp(argv[argi], "-showalign") == 0) {
+            showAlign = 1;
+        }
+        else if (strcmp(argv[argi], "-fixedtarget") == 0) {
+            fixedTarget = 1;
+        }
+        else if (strcmp(argv[argi], "-fixedquery") == 0) {
+            fixedQuery = 1;
+        }
+        else if (strcmp(argv[argi], "-type") == 0) {
+            ++argi;
+            if (strcmp(argv[argi], "queryfit") == 0) {
+                alignType = QueryFit;
+            }
+            else if (strcmp(argv[argi], "targetfit") == 0) {
+                alignType = TargetFit;
+            }
+            else if (strcmp(argv[argi], "overlap") == 0) {
+                alignType = Overlap;
+            }
+            else if (strcmp(argv[argi], "global") == 0) {
+                alignType = Global;
+            }
+            else if (strcmp(argv[argi], "tpqs") == 0) {
+                alignType = TPrefixQSuffix;
+            }
+            else if (strcmp(argv[argi], "tsqp") == 0 ){ 
+                alignType = TSuffixQPrefix;
+            }
+            else {
+                cout <<" ERROR, aligntype must be one of queryfit, overlap, or global" << endl;
+                exit(1);
+            }
+        }
+        else if(strcmp(argv[argi], "-printmatrix") == 0) {
+            printMatrix = true;
+        }
+        else if (strcmp(argv[argi], "-local") == 0) {
+            alignType = Local;
+        }
+        else if (strcmp(argv[argi], "-queryfit") == 0) {
+            alignType = QueryFit;
+        }
+        else if (strcmp(argv[argi], "-overlap") == 0) {
+            alignType = Overlap;
+        }
+        else if (strcmp(argv[argi], "-match") == 0) {
+            match = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-mismatch") == 0) {
+            mismatch = atoi(argv[++argi]);
+        }
+        ++argi;
+    }
+    DistanceMatrixScoreFunction<FASTASequence, FASTASequence> scoreFn(
+            SMRTDistanceMatrix, insertion, deletion);
+
+    FASTASequence query, target;
+    FASTAReader queryReader, targetReader;
+    queryReader.Init(queryName);
+
+    targetReader.Init(targetName);
+
+    if (fixedTarget) {
+        targetReader.GetNext(target);
+    }
+    if (fixedQuery) {
+        queryReader.GetNext(query);
+    }
+    //
+    // Prepare the target database;
+    //
+
+    //
+    // Prepare the query match set.
+    //
+
+    int seqIndex = 0;
+
+    vector<int> scoreMat;
+    vector<Arrow> pathMat;
+    int alignScore;
+    MatchedAlignment alignment;
+
+    if (match != 0) {
+        int i;
+        for (i = 0; i < 4; i++ ) {
+            LocalAlignLowMutationMatrix[i][i] = match;
+        }
+    }
+
+    int i,j;
+    for (i = 0; i < 5; i++) {
+        for (j = 0; j < 5 ; j++) {
+            if (i == j) continue;
+            SMRTDistanceMatrix[i][j] += 3;
+        }
+    }
+
+    cout << "qlen tlen score" << endl;
+    while ((fixedQuery or queryReader.GetNext(query)) and 
+            (fixedTarget or targetReader.GetNext(target))) {
+        alignment.qName.assign(query.title, query.titleLength);
+        alignment.tName.assign(target.title, target.titleLength);
+        alignment.blocks.clear();
+        alignment.qPos = 0;
+        alignment.tPos = 0;
+        alignment.qStart = 0;
+        alignment.tStart = 0;
+        if (query.length == 0 or target.length == 0)
+            continue;
+
+        alignScore = SWAlign(query, target, scoreMat, pathMat, 
+                alignment, scoreFn, alignType, false, printMatrix);
+
+        cout << query.length << " " << target.length << " " << alignScore << endl;
+        cout << alignment.qPos << " " << alignment.QEnd() 
+            << " " << alignment.tPos << " " << alignment.TEnd() << endl;
+
+        if (showAlign) {
+            ComputeAlignmentStats(alignment, query.seq, target.seq, scoreFn);
+            //SMRTDistanceMatrix, indelCost, indelCost);
+            PrintAlignmentStats(alignment, cout);			
+            StickPrintAlignment(alignment, query, target, cout);
+        }
+        ++seqIndex;
+    }
+
+    return 0;
+}
diff --git a/extrautils/SimpleShredder.cpp b/extrautils/SimpleShredder.cpp
new file mode 100644
index 0000000..321e053
--- /dev/null
+++ b/extrautils/SimpleShredder.cpp
@@ -0,0 +1,159 @@
+#include <string>
+#include <sstream>
+#include "utils.hpp"
+#include "FASTAReader.hpp"
+#include "FASTQSequence.hpp"
+#include "FASTASequence.hpp"
+#include "CommandLineParser.hpp"
+#include "metagenome/FindRandomSequence.hpp"
+#include "statistics/StatUtils.hpp"
+
+using namespace std;
+
+int main(int argc, char* argv[]) {
+    string inFileName, readsFileName;
+    DNALength readLength;
+    float coverage = 0;
+    bool noRandInit = false;
+    int numReads = -1;
+    CommandLineParser clp;
+    int qualityValue = 20;
+    bool printFastq = false;
+    int stratify = 0;
+    string titleType = "pacbio";
+    string fastqType = "illumina"; // or "sanger"
+    clp.RegisterStringOption("inFile", &inFileName, "Reference sequence", 0);
+    clp.RegisterPreviousFlagsAsHidden();
+    clp.RegisterIntOption("readLength", (int*) &readLength, "The length of reads to simulate.  The length is fixed.",
+            CommandLineParser::PositiveInteger, "Length of every read.", 0);
+    clp.RegisterFloatOption("coverage", &coverage, "Total coverage (from which the number of reads is calculated",
+            CommandLineParser::PositiveFloat, 0);
+    clp.RegisterFlagOption("nonRandInit", &noRandInit, "Skip initializing the random number generator with time.");
+    clp.RegisterIntOption("nReads", &numReads, "Total number of reads (from which coverage is calculated)", CommandLineParser::PositiveInteger, 0);
+    clp.RegisterStringOption("readsFile", &readsFileName, "Reads output file", 0);
+    clp.RegisterFlagOption("fastq", &printFastq, "Fake fastq output with constant quality value (20)");
+    clp.RegisterIntOption("quality", &qualityValue, "Value to use for fastq quality", CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("stratify", &stratify, "Sample a read every 'stratify' bases, rather than randomly.", CommandLineParser::PositiveInteger);
+    clp.RegisterStringOption("titleType", &titleType, "Set the name of the title: 'pacbio'|'illumina'");
+    clp.RegisterStringOption("fastqType", &fastqType, "Set the type of fastq: 'illumina'|'sanger'");
+    vector<string> leftovers;
+    clp.ParseCommandLine(argc, argv, leftovers);
+
+    if (!noRandInit) {
+        InitializeRandomGeneratorWithTime();
+    }
+
+    FASTAReader inReader;
+    inReader.Init(inFileName);
+    vector<FASTASequence> reference;
+
+    inReader.ReadAllSequences(reference);
+    ofstream readsFile;
+    if (readsFileName == "") {
+        cout << "ERROR.  You must specify a reads file." << endl;
+        exit(1);
+    }
+    CrucialOpen(readsFileName, readsFile, std::ios::out);
+
+    ofstream sangerFastqFile;
+    if (fastqType == "sanger") {
+        string sangerFastqFileName = readsFileName + ".fastq";
+        CrucialOpen(sangerFastqFileName, sangerFastqFile, std::ios::out);
+    }
+
+    DNALength refLength = 0;
+    int i;
+    for (i = 0; i < reference.size(); i++) {
+        refLength += reference[i].length;
+    }
+    if (numReads == -1 and coverage == 0 and stratify == 0) {
+        cout << "ERROR, you must specify either coverage, nReads, or stratify." << endl;
+        exit(1);
+    }
+    else if (numReads == -1) {
+        numReads = (refLength / readLength) * coverage;
+    }
+
+    if (stratify) {
+        if (!readLength) {
+            cout << "ERROR. If you are using stratification, a read length must be specified." << endl;
+            exit(1);
+        }
+    }
+
+    DNASequence sampleSeq;
+    sampleSeq.length = readLength;
+    int maxRetry = 10000000;
+    int retryNumber = 0;
+    DNALength seqIndex, seqPos;
+    if (stratify) {
+        seqIndex = 0;
+        seqPos   = 0;
+    }
+    DNALength origReadLength = readLength;
+    for (i = 0; stratify or i < numReads; i++) {
+        if (stratify == 0) {
+            FindRandomPos(reference, seqIndex, seqPos, readLength );
+        }
+        else {
+            //
+            // find the next start pos, or bail if done
+            //
+            if (seqPos >= reference[seqIndex].length) {
+                if (seqIndex == reference.size() - 1) {
+                    break;
+                }
+                else {
+                    seqIndex = seqIndex + 1;
+                    seqPos   = 0;
+                    continue;
+                }
+            }
+            readLength = min(reference[seqIndex].length - seqPos, origReadLength);
+        }
+        sampleSeq.seq = &reference[seqIndex].seq[seqPos];
+        int j;
+        int gappedRead = 0;
+        string title;
+        stringstream titleStrm;
+        if (titleType == "pacbio") {
+            titleStrm << i << "|"<< reference[seqIndex].GetName() << "|" << seqPos << "|" << seqPos + readLength;
+        }
+        else if (titleType == "illumina") {
+            titleStrm << "SE_" << i << "_0@" << seqPos << "-"<<seqPos+readLength <<"/1";
+        }
+        else {
+            cout << "ERROR. Bad title type " << titleType << endl;
+            exit(1);
+        }
+        title = titleStrm.str();
+        sampleSeq.length = readLength;
+        if (!printFastq) {
+            readsFile << ">" << title << endl;
+            sampleSeq.PrintSeq(readsFile);
+        }
+        else {
+            FASTQSequence fastqSampleSeq;
+            fastqSampleSeq.CopyTitle(title);
+            fastqSampleSeq.seq = sampleSeq.seq;
+            fastqSampleSeq.length = sampleSeq.length;
+            fastqSampleSeq.qual.data = new unsigned char[sampleSeq.length];
+            fill(fastqSampleSeq.qual.data, fastqSampleSeq.qual.data + sampleSeq.length, qualityValue);
+            if (fastqType == "illumina") {
+                fastqSampleSeq.PrintFastq(readsFile, fastqSampleSeq.length+1);
+            }
+            else {
+                fastqSampleSeq.PrintSeq(readsFile);
+                fastqSampleSeq.PrintQual(sangerFastqFile);
+            }
+            delete[] fastqSampleSeq.qual.data;
+            delete[] fastqSampleSeq.title;
+        }
+
+        if (stratify) {
+            seqPos += readLength;
+        }
+
+    }
+    return 0;
+}
diff --git a/extrautils/StoreQualityByContextFromCmpH5.cpp b/extrautils/StoreQualityByContextFromCmpH5.cpp
new file mode 100644
index 0000000..04d5d79
--- /dev/null
+++ b/extrautils/StoreQualityByContextFromCmpH5.cpp
@@ -0,0 +1,283 @@
+#include "files/ReaderAgglomerate.hpp"
+#include "SMRTSequence.hpp"
+#include "utils/FileOfFileNames.hpp"
+#include "simulator/ContextSet.hpp"
+#include "simulator/OutputSampleListSet.hpp"
+#include "datastructures/alignment/CmpFile.hpp"
+#include "HDFCmpFile.hpp"
+#include "format/StickAlignmentPrinter.hpp"
+
+class ScoredLength {
+public:
+    int score, length;
+    int operator<(const ScoredLength &rhs) const { 
+        return score < rhs.score;
+    }
+    ScoredLength(int s, int l) : score(s), length(l) {}
+    ScoredLength() {}
+};
+
+void PrintUsage() {
+    cout << "cmpH5StoreQualityByContext - grab quality values from cmp.h5 files until minimum requirements for the number of times a context has been sampled are met." << endl;
+    cout << "usage: cmpH5StoreQualityByContext aligned_reads.cmp.h5  output.qbc  [options] " << endl;
+    cout << "options: " << endl
+        << " -contextLength L   The length of the context to sample (default: 5) " << endl 
+        << " -minSamples S(500) Report pass if all contexts are sampled" << endl
+        << "                    at least S times." << endl
+        << " -maxSamples S(1000) Stop sampling a context once it has reached" << endl
+        << "                    S samples." << endl
+        << " -onlyMaxLength" <<endl
+        << "                     Whether or not to store only the length of the" << endl
+        << "                     longest subread as part of the length model." << endl << endl;
+}
+
+int main(int argc, char* argv[]) {
+    string outFileName;
+    int contextLength = 5;
+    int minSamples = 500;
+    int maxSamples = 1000;
+    if (argc < 3) {
+        PrintUsage();
+        exit(1);
+    }
+
+    int argi = 1;
+    string cmpH5FileName;
+    cmpH5FileName = argv[argi++];
+    outFileName   = argv[argi++];
+    int minAverageQual = 0;
+    bool onlyMaxLength = false;
+
+    while (argi < argc) {
+        if (strcmp(argv[argi], "-contextLength") == 0) {
+            contextLength = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-minSamples") == 0) {
+            minSamples = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-maxSamples") == 0) {
+            maxSamples = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-onlyMaxLength") == 0) {
+            onlyMaxLength = true;
+        }
+        else {
+            PrintUsage();
+            cout << "ERROR, bad option: " << argv[argi] << endl;
+            exit(1);
+        }
+        ++argi;
+    }
+    map<string, ScoredLength> maxLengthMap;
+    OutputSampleListSet samples(contextLength);
+    SMRTSequence read;
+
+    ofstream sampleOut;
+    CrucialOpen(outFileName, sampleOut, std::ios::out|std::ios::binary);
+    int fileNameIndex;
+
+    int numContextsReached = 0;
+    int numContexts = 1 << (contextLength*2);
+    ReaderAgglomerate reader;
+    samples.keyLength = contextLength;
+    HDFCmpFile<CmpAlignment> cmpReader;
+    cmpReader.IncludeField("QualityValue");
+    cmpReader.IncludeField("DeletionQV");
+    cmpReader.IncludeField("InsertionQV");
+    cmpReader.IncludeField("SubstitutionQV");
+    cmpReader.IncludeField("SubstitutionTag");
+    cmpReader.IncludeField("DeletionTag");
+    cmpReader.IncludeField("PulseIndex");
+    cmpReader.IncludeField("WidthInFrames");
+    cmpReader.IncludeField("PreBaseFrames");
+
+    if (cmpReader.Initialize(cmpH5FileName, H5F_ACC_RDWR) == 0) {
+        cout << "ERROR, could not open the cmp file." << endl;
+        exit(1);
+    }
+    cout << "Reading cmp file." << endl;
+
+    CmpFile cmpFile;
+
+    cmpReader.ReadAlignmentDescriptions(cmpFile);
+    cmpReader.ReadStructure(cmpFile);
+    cout << "done reading structure."<<endl;
+    int alignmentIndex;
+    int nAlignments = cmpReader.alnInfoGroup.GetNAlignments();
+    vector<int> alignmentToBaseMap;
+
+    for (alignmentIndex = 0; 
+            alignmentIndex < nAlignments and
+            !samples.Sufficient();
+            alignmentIndex++) {
+        //
+        // For ease of use, store the length of the alignment to make another model.
+        //
+
+        ByteAlignment alignmentArray;
+        cmpReader.ReadAlignmentArray(alignmentIndex, alignmentArray);
+        Alignment alignment;
+        ByteAlignmentToAlignment(alignmentArray, alignment);
+        string readSequence, refSequence;
+        readSequence.resize(alignmentArray.size());
+        refSequence.resize(alignmentArray.size());
+        DNASequence readDNA, refDNA;
+
+        ByteAlignmentToQueryString(&alignmentArray[0], alignmentArray.size(), &readSequence[0]);
+        ByteAlignmentToRefString(&alignmentArray[0], alignmentArray.size(), &refSequence[0]);				
+        RemoveGaps(readSequence, readSequence);
+        RemoveGaps(refSequence, refSequence);
+
+        readDNA.seq = (Nucleotide*) readSequence.c_str();
+        readDNA.length = readSequence.size();
+        refDNA.seq = (Nucleotide*) refSequence.c_str();
+        refDNA.length = refSequence.size();
+        CmpAlignment cmpAlignment;
+
+        cmpReader.ImportReadFromCmpH5(alignmentIndex, cmpAlignment, read);
+
+        CreateAlignmentToSequenceMap(alignmentArray, alignmentToBaseMap);
+
+        if (read.length < contextLength) {
+            continue;
+        }
+        int subreadLength = (cmpFile.alnInfo.alignments[alignmentIndex].GetQueryEnd() - 
+                cmpFile.alnInfo.alignments[alignmentIndex].GetQueryStart());
+        if (onlyMaxLength == false) {
+            samples.lengths.push_back(subreadLength);
+        }
+        else {
+            int score = (cmpAlignment.GetNMatch() - 
+                    cmpAlignment.GetNMismatch() - 
+                    cmpAlignment.GetNInsertions() - 
+                    cmpAlignment.GetNDeletions());
+            stringstream nameStrm;
+            nameStrm << cmpAlignment.GetMovieId() << "_" << cmpAlignment.GetHoleNumber();
+            string nameStr = nameStrm.str();
+            if (maxLengthMap.find(nameStr) == maxLengthMap.end()) {
+                maxLengthMap[nameStr] = ScoredLength(score, subreadLength);
+            }
+        }
+
+        int sampleEnd = alignmentArray.size() - contextLength/2;
+        int a;
+        for (a = contextLength/2; a < sampleEnd; a++) {
+
+            // Make sure the context begins on a real nucleotide.
+            while (a < sampleEnd and 
+                    ((RefChar[alignmentArray[a]] == ' '))) {a++;}
+
+            //
+            // Move ab back to an index where there are contextLength/2 non-gap
+            // characters, counted by nb
+            //
+            int ab; //num bases
+            int ae; //alignment end
+            ab = a-1;
+            int nb = 0, ne = 0;
+            while (true) {
+                if (RefChar[alignmentArray[ab]] != ' ') {
+                    nb++;
+                }
+                if (ab == 0 or nb == contextLength/2) break;
+                ab--;
+            }
+
+            //
+            // Advance ae to an index where there are contextLength/2 non-gap
+            // characters, counted by ne.
+            //
+            ae = a + 1;
+            while (ae < alignmentArray.size() and ne < contextLength/ 2) {
+                if (RefChar[alignmentArray[ae]] != ' ') {
+                    ne++;
+                }
+                ae++;
+            }
+
+            //
+            // Make sure there are no edge effects that prevent a context of the correct length from being assigned.
+            //
+            if (nb + ne + 1 != contextLength) {
+                continue;
+            }
+            int ai;
+            string context;
+            for (ai = ab; ai < ae; ai++) {
+                if (RefChar[alignmentArray[ai]] != ' ') {
+                    context.push_back(RefChar[alignmentArray[ai]]);
+                }
+            }
+            assert(context.size() == contextLength);
+            //
+            // Now create the context.
+            //
+            OutputSample sample;
+
+            //
+            // This context is a deletion, create that.
+            //
+            sample.type = OutputSample::Deletion;
+
+            //
+            // This context is either an insertion or substitution
+            //
+            // Look to see if the previous aligned position was an
+            // insertion, and move back as far as the insertion extends.
+            int aq = a-1;
+            int sampleLength;
+
+            if (QueryChar[alignmentArray[a]] == ' ') {
+                sample.type = OutputSample::Deletion;
+                sampleLength = 0;
+            }
+            else if (RefChar[alignmentArray[aq]] == ' ') {
+
+                while (aq > 0 
+                        and RefChar[alignmentArray[aq]] == ' ' 
+                        and QueryChar[alignmentArray[aq]] != ' ') {
+                    aq--;
+                }
+                sample.type = OutputSample::Insertion;
+                sampleLength = a - aq;
+            }
+            else if (QueryChar[alignmentArray[a]] == RefChar[alignmentArray[aq]]) {
+                sample.type = OutputSample::Match;
+                sampleLength = 1;
+            }
+            else {
+                sample.type = OutputSample::Substitution;
+                sampleLength = 1;
+            }
+
+            sample.Resize(sampleLength);
+            if (sampleLength > 0) {
+                int seqPos = alignmentToBaseMap[aq];
+                if (seqPos < read.length) {
+                    sample.CopyFromSeq(read, seqPos, sampleLength);
+                    string nucs;
+                    int n;
+                    for (n = 0; n < sample.nucleotides.size(); n++) { 
+                        char c = sample.nucleotides[n];
+                        assert(c == 'A' or c == 'T' or c == 'G' or c == 'C');
+                        nucs.push_back(sample.nucleotides[n]); 
+                    }
+                }
+            }
+            samples.AppendOutputSample(context, sample);
+        }
+        read.Free();
+    }
+
+    if (onlyMaxLength) {
+        map<string, ScoredLength>::iterator maxScoreIt;
+        for (maxScoreIt = maxLengthMap.begin(); maxScoreIt != maxLengthMap.end(); ++maxScoreIt) {
+            cout << maxScoreIt->second.length << endl;
+            samples.lengths.push_back(maxScoreIt->second.length); 
+        }
+    }
+
+    samples.Write(sampleOut);
+
+    return 0;
+}
diff --git a/extrautils/SuffixArrayToBWT.cpp b/extrautils/SuffixArrayToBWT.cpp
new file mode 100644
index 0000000..6fddecc
--- /dev/null
+++ b/extrautils/SuffixArrayToBWT.cpp
@@ -0,0 +1,48 @@
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+
+#include "suffixarray/SuffixArrayTypes.hpp"
+#include "suffixarray/SuffixArray.hpp"
+#include "bwt/BWT.hpp"
+
+#include <iostream>
+#include <fstream>
+
+
+using namespace std;
+int main(int argc, char* argv[]) {
+	if (argc < 4) {
+		cout << "usage: sa2bwt genomeFileName suffixArray bwt [-debug]" << endl;
+		exit(1);
+	}
+	string genomeFileName      = argv[1];
+	string suffixArrayFileName = argv[2];
+	string bwtFileName         = argv[3];
+	int storeDebugInformation = 0;
+	int argi = 4;
+	while(argi < argc) {
+		if (strcmp(argv[argi], "-debug") == 0) {
+			storeDebugInformation = 1;
+		}
+		++argi;
+	}
+	
+	ofstream bwtOutFile;
+	CrucialOpen(bwtFileName, bwtOutFile, std::ios::out|std::ios::binary);
+	
+	FASTAReader reader;
+	reader.Init(genomeFileName);
+	FASTASequence seq;
+	reader.ReadAllSequencesIntoOne(seq);
+	
+	
+	DNASuffixArray suffixArray;
+	suffixArray.Read(suffixArrayFileName);
+
+	Bwt<PackedDNASequence, FASTASequence> bwt;
+	bwt.InitializeFromSuffixArray(seq, suffixArray.index, storeDebugInformation ); 
+	bwt.Write(bwtOutFile);
+
+	return 0;
+}
+
diff --git a/extrautils/ctest/alchemy.t b/extrautils/ctest/alchemy.t
new file mode 100644
index 0000000..d792e7e
--- /dev/null
+++ b/extrautils/ctest/alchemy.t
@@ -0,0 +1,20 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: alchemy.
+  $ EXEC=$TESTDIR/../alchemy
+
+test_alchemy.cmp.h5 was generated by 
+pbalign.py $DATDIR/test_alchemy_read.fa $DATDIR/test_alchemy_ref.fa test_alchemy.cmp.h5
+
+$ ./cmpH5StoreQualityByContext $DATDIR/test_alchemy.cmp.h5 $OUTDIR/test_alchemy.qbc -contextLength 3
+
+  $ $EXEC $DATDIR/ecoli_out.qbc -genome $DATDIR/ecoli_reference.fasta  -numBasesPerFile 100000 -baseFileName 'this_bas_file' -movieName $OUTDIR/alchemy_
+  $ echo $?
+  0
+
+pls2fasta can be successfully applied to the simulated bas.h5 file.
+$ pls2fasta *.bas.h5 $OUTDIR/test_alchemy_pls2fasta.fa
+[INFO] * [pls2fasta] started. (glob)
+[INFO] * [pls2fasta] ended. (glob)
+
diff --git a/extrautils/ctest/bwt2sa.t b/extrautils/ctest/bwt2sa.t
new file mode 100644
index 0000000..47ddb91
--- /dev/null
+++ b/extrautils/ctest/bwt2sa.t
@@ -0,0 +1,21 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Noticed that pipeline fa->sa->bwt works OK, however fa->sa->bwt->sa 
+does not generate identical suffix array.
+Set up the executable: bwt2sa.
+  $ EXEC=$TESTDIR/../bwt2sa
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ SA=$OUTDIR/ecoli_reference.bwt2sa.sa
+  $ BWT=$DATDIR/ecoli_reference.bwt
+  $ $EXEC $BWT $SA
+  $ echo $?
+  0
+
diff --git a/extrautils/ctest/ccsh5tobam.t b/extrautils/ctest/ccsh5tobam.t
new file mode 100644
index 0000000..5770cca
--- /dev/null
+++ b/extrautils/ctest/ccsh5tobam.t
@@ -0,0 +1,10 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: ccsh5tobam
+  $ EXEC=$TESTDIR/../ccsh5tobam
+  $ SMRTWRAP=/mnt/secondary/Smrtpipe/builds/Internal_Mainline_Nightly_LastSuccessfulBuild/smrtcmds/bin/smrtwrap
+
+  $ $SMRTWRAP python $SCRIPTDIR/test_ccsh5tobam.py $EXEC $DATDIR/test_ccsh5tobam/input.fofn $OUTDIR/test_ccsh5tobam.bam
+  $ echo $?
+  0
diff --git a/extrautils/ctest/cmpH5StoreQualityByContext.t b/extrautils/ctest/cmpH5StoreQualityByContext.t
new file mode 100644
index 0000000..63e0cb3
--- /dev/null
+++ b/extrautils/ctest/cmpH5StoreQualityByContext.t
@@ -0,0 +1,16 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: cmpH5StoreQualityByContext.
+  $ EXEC=$TESTDIR/../cmpH5StoreQualityByContext
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ $EXEC $DATDIR/ecoli_out.cmp.h5 $OUTDIR/ecoli_out.qbc -contextLength 8 -onlyMaxLength -minSamples 600 -maxSamples 1500 > $TMP1
+  $ echo $?
+  0
diff --git a/extrautils/ctest/printTupleCountTable.t b/extrautils/ctest/printTupleCountTable.t
new file mode 100644
index 0000000..2229e1b
--- /dev/null
+++ b/extrautils/ctest/printTupleCountTable.t
@@ -0,0 +1,20 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: printTupleCountTable.
+  $ EXEC=$TESTDIR/../printTupleCountTable
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ $EXEC $OUTDIR/ecoli_tuple.table $DATDIR/ecoli_reference.fasta 
+  $ echo $?
+  0
+
+  $ md5sum $OUTDIR/ecoli_tuple.table |cut -f 1 -d ' '
+  3f1ae70fd009827d6d6e56050341b5df
+
diff --git a/extrautils/ctest/sa2bwt.t b/extrautils/ctest/sa2bwt.t
new file mode 100644
index 0000000..3fbb3a4
--- /dev/null
+++ b/extrautils/ctest/sa2bwt.t
@@ -0,0 +1,19 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: sa2bwt.
+  $ EXEC=$TESTDIR/../sa2bwt
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ FA=$DATDIR/ecoli_reference.fasta
+  $ SA=$DATDIR/ecoli_reference.sa
+  $ BWT=$OUTDIR/ecoli_reference.bwt
+  $ $EXEC $FA $SA $BWT 
+  $ echo $?
+  0
diff --git a/extrautils/ctest/sals.t b/extrautils/ctest/sals.t
new file mode 100644
index 0000000..aef617a
--- /dev/null
+++ b/extrautils/ctest/sals.t
@@ -0,0 +1,18 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: sals.
+  $ EXEC=$TESTDIR/../sals
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ $EXEC $DATDIR/ecoli_reference.sa 
+   * has a suffix array.
+   * has a lookup table for word size. 8
+  $ echo $?
+  0
diff --git a/extrautils/ctest/samodify.t b/extrautils/ctest/samodify.t
new file mode 100644
index 0000000..5b4050a
--- /dev/null
+++ b/extrautils/ctest/samodify.t
@@ -0,0 +1,19 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: samodify.
+  $ EXEC=$TESTDIR/../samodify
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ $EXEC $DATDIR/ecoli_reference.sa $DATDIR/ecoli_reference.fasta $OUTDIR/ecoli_reference_blt13.sa -blt 13 
+  $ echo $?
+  0
+
+  $ md5sum $OUTDIR/ecoli_reference_blt13.sa | cut -f 1 -d ' '
+  ac70eef5a6e03ae8177f27b3aeacc4c5
diff --git a/extrautils/ctest/setup.sh b/extrautils/ctest/setup.sh
new file mode 100755
index 0000000..ab2f01a
--- /dev/null
+++ b/extrautils/ctest/setup.sh
@@ -0,0 +1,15 @@
+# Set up directories
+CURDIR=$TESTDIR
+REMOTEDIR=/mnt/secondary-siv/testdata/BlasrTestData/ctest
+DATDIR=$REMOTEDIR/data
+OUTDIR=$CURDIR/out
+STDDIR=$REMOTEDIR/stdout
+SCRIPTDIR=$REMOTEDIR/scripts/
+
+# Define tmporary files
+TMP1=$OUTDIR/$$.tmp.out
+TMP2=$OUTDIR/$$.tmp.stdout
+
+# Make OUTDIR
+mkdir -p $OUTDIR
+
diff --git a/extrautils/ctest/swmatcher.t b/extrautils/ctest/swmatcher.t
new file mode 100644
index 0000000..162d3ca
--- /dev/null
+++ b/extrautils/ctest/swmatcher.t
@@ -0,0 +1,20 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: swMather.
+  $ EXEC=$TESTDIR/../swMatcher
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ FA=$DATDIR/ecoli_subset.fasta
+  $ $EXEC $FA $FA 10 -local  > $OUTDIR/swmatcher.out
+  $ echo $?
+  0
+  $ diff $OUTDIR/swmatcher.out $STDDIR/swmatcher.stdout
+
+
diff --git a/extrautils/p4.mk b/extrautils/p4.mk
new file mode 100644
index 0000000..7e41029
--- /dev/null
+++ b/extrautils/p4.mk
@@ -0,0 +1,79 @@
+# This p4.mk is only used to make 
+#   //depot/software/smrtanalysis/bioinformatics/tools/blasr
+# on PacBio internal p4 build.
+
+SHELL=/bin/bash -e -E
+
+.PHONY=all cramtests
+
+PBINCROOT ?= $(realpath ../../../lib/cpp/)
+PREBUILT ?= $(realpath ../../../../prebuilt.out)
+THIRD_PARTY_PREFIX := $(realpath ../..)
+
+include ../p4.common.mk
+
+all : CXXFLAGS ?= $(DEFAULTCXXFLAG)
+debug : CXXFLAGS ?= $(DEBUGCXXFLAG)
+profile : CXXFLAGS ?= $(PROFILECXXFLAG)
+g: CXXFLAGS += $(GCXXFLAG)
+g: LIBS = $(GLIBS)
+
+exe = sa2bwt bwt2sa alchemy excrep evolve bsdb simpleShredder swMatcher \
+  samodify sals printTupleCountTable cmpH5StoreQualityByContext ccsh5tobam
+
+all debug profile g: $(exe)
+
+sa2bwt: SuffixArrayToBWT.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+bwt2sa: BwtToSuffixArray.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+alchemy: BasH5Simulator.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+excrep: ExciseRepeats.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+evolve: Evolve.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+bsdb: BuildSequenceDB.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+simpleShredder: SimpleShredder.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+swMatcher: SWMatcher.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+samodify: SAModify.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+sals: SALS.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+printTupleCountTable: PrintTupleCountTable.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+cmpH5StoreQualityByContext: StoreQualityByContextFromCmpH5.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+ccsh5tobam: CCSH5ToBam.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+pblib: 
+	make -C .. -f p4.mk mkliba
+
+.INTERMEDIATE: $(OBJS)
+
+CTESTS = $(wildcard ctest/*.t)
+cramtests: $(EXE)
+	cram --shell=/bin/bash $(CTESTS)
+
+clean: 
+	@rm -f $(exe)
+	@rm -f $(OBJS) $(DEPS)
+	@rm *.o *.d
+
+-include $(DEPS)
diff --git a/libcpp.makefile b/libcpp.makefile
new file mode 100644
index 0000000..d4f9c40
--- /dev/null
+++ b/libcpp.makefile
@@ -0,0 +1,9 @@
+include defines.mk
+
+# Note that, for now, HDF5_LIB is a directory here, and a file in libcpp.
+# I do not know why buildctl has set that up, but we follow the mobs
+# adaptors for now.
+
+pblib: libcpp/configure.py libcpp/makefile
+	cd libcpp && NOPBBAM=true HDF5_LIB=${HDF5_LIB}/libhdf5.so ./configure.py
+	${MAKE} -C libcpp
diff --git a/libcpp/.gitignore b/libcpp/.gitignore
new file mode 100644
index 0000000..d67c0ce
--- /dev/null
+++ b/libcpp/.gitignore
@@ -0,0 +1,7 @@
+*.o
+*.d
+*.a
+*.so
+defines.mk
+/pbdata/libconfig.h
+/hdf/hdf5-1.8.12-headers/
diff --git a/libcpp/.travis.yml b/libcpp/.travis.yml
new file mode 100644
index 0000000..5efbc08
--- /dev/null
+++ b/libcpp/.travis.yml
@@ -0,0 +1,22 @@
+language: cpp
+script: 
+  - NOPBBAM=1 ./configure.py
+  - make -j all
+# - make -j gtest
+compiler:
+  - gcc
+# - clang
+install:
+- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
+addons:
+  apt:
+    sources:
+    - ubuntu-toolchain-r-test
+    packages:
+    - gcc-4.8
+    - g++-4.8
+#   - clang
+#   - libhdf5-serial-1.8.4
+notifications:
+  email: false
+sudo: false
diff --git a/libcpp/README.md b/libcpp/README.md
new file mode 100644
index 0000000..91745bc
--- /dev/null
+++ b/libcpp/README.md
@@ -0,0 +1,47 @@
+[![Build Status](https://travis-ci.org/PacificBiosciences/blasr_libcpp.svg?branch=master)](https://travis-ci.org/PacificBiosciences/blasr_libcpp)
+#What is blasr_libcpp#
+
+**Blasr_libcpp** is a *library* used by **blasr** and other executables such as samtoh5, loadPulses for analyzing PacBio sequences. This library contains three sub-directories, including pbdata, hdf and alignment.
++ pbdata  
+   - contains source code for handling Pacbio sequences and can build lib ```libpbdata```.
++ hdf 
+   - contains source code for handling Pacbio hdf5 files (e.g., *.pls.h5, *.rgn.h5, *.bas.h5) and builds ```libpbhdf```.
++ alignment 
+   - contains source code for aligning Pacbio reads to target sequences used in blasr and builds ```libblasr```.
+
+## Building
+```
+./configure.py
+make -j all
+```
+By default, that will skip pbbam, and it will download HDF5 headers.
+
+## configure.py
+This is a WIP. It generates `defines.mk` based on the environment and command-line flags.
+In theory, it will allow simpler configuration. We might soon have different executables for
+different environments.
+
+It also generates `pbdata/libconfig.h`.
+
+By configuring up-front, we avoid race conditions, and we simplify the makefiles. For extra
+simplicity, we use the same `defines.mk` for all 3 sub-dirs.
+
+## unittest
+There is at least one failing for now, and we cannot run them in Travis without installing HDF5. TODO.
+
+(unittests mostly pass in Jenkins. We will get them into Travis later.)
+
+##Appendix: Dependencies##
+- libpbdata
+   -  does **not** depend on ```libhdf5```
+   -  should build without the ```pbbam``` library *for now*
+
+- libpbihdf
+   -  depends on the ```libpbdata``` and ```libhdf5``` libraries to build
+   
+- alignment
+   -  depends on the ```libpbdata``` library to build
+   -  can build either with or without the ```libpbihdf``` library
+   -  can build either with or without the ```pbbam``` library
+- hts
+   - if you use pbbam, you will need [HTSLib](https://github.com/samtools/htslib)
diff --git a/libcpp/alignment/MappingMetrics.cpp b/libcpp/alignment/MappingMetrics.cpp
new file mode 100644
index 0000000..1a5650e
--- /dev/null
+++ b/libcpp/alignment/MappingMetrics.cpp
@@ -0,0 +1,299 @@
+#include <iomanip>
+#include <unistd.h>
+#include "MappingMetrics.hpp"
+//In order to use clock_gettime in LINUX, add -lrt 
+
+#ifdef __APPLE__
+#pragma weak clock_gettime
+int clock_gettime(clockid_t clk_id, struct timespec *tp) {
+    kern_return_t   ret;
+    clock_serv_t    clk;
+    clock_id_t clk_serv_id;
+    mach_timespec_t tm;
+
+    uint64_t start, end, delta, nano;
+
+    task_basic_info_data_t tinfo;
+    task_thread_times_info_data_t ttinfo;
+    mach_msg_type_number_t tflag;
+
+    int retval = -1;
+    switch (clk_id) {
+        case CLOCK_REALTIME:
+        case CLOCK_MONOTONIC:
+            clk_serv_id = clk_id == CLOCK_REALTIME ? CALENDAR_CLOCK : SYSTEM_CLOCK;
+            if (KERN_SUCCESS == (ret = host_get_clock_service(mach_host_self(), clk_serv_id, &clk))) {
+                if (KERN_SUCCESS == (ret = clock_get_time(clk, &tm))) {
+                    tp->tv_sec  = tm.tv_sec;
+                    tp->tv_nsec = tm.tv_nsec;
+                    retval = 0;
+                }
+            }
+            if (KERN_SUCCESS != ret) {
+                errno = EINVAL;
+                retval = -1;
+            }
+            break;
+        case CLOCK_PROCESS_CPUTIME_ID:
+        case CLOCK_THREAD_CPUTIME_ID:
+            start = mach_absolute_time();
+            if (clk_id == CLOCK_PROCESS_CPUTIME_ID) {
+                getpid();
+            } else {
+                sched_yield();
+            }
+            end = mach_absolute_time();
+            delta = end - start;
+            if (0 == __clock_gettime_inf.denom) {
+                mach_timebase_info(&__clock_gettime_inf);
+            }
+            nano = delta * __clock_gettime_inf.numer / __clock_gettime_inf.denom;
+            tp->tv_sec = nano * 1e-9;  
+            tp->tv_nsec = nano - (tp->tv_sec * 1e9);
+            retval = 0;
+            break;
+        default:
+            errno = EINVAL;
+            retval = -1;
+    }
+    return retval;
+}
+#endif // __APPLE__
+
+Timer::Timer(std::string _header) {
+    keepHistogram = false;
+    keepList      = false;
+    totalElapsedClock = 0;
+    header        = _header;
+    elapsedClockMsec = 0;
+    elapsedTime   = 0.0;
+}
+
+int Timer::ListSize() {
+    return msecList.size();
+}
+
+void Timer::PrintHeader(std::ostream &out) {
+    if (msecList.size() > 0) {
+        out << header << " ";
+    }
+}
+
+void Timer::PrintListValue(std::ostream &out, int index) {
+    if (msecList.size() > 0) {
+        out << msecList[index] << " ";
+    }
+}
+void Timer::Tick() {
+    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &cpuclock[0]);
+}
+
+void Timer::SetStoreElapsedTime(bool value) {
+    keepList = value;
+}
+
+void Timer::SetStoreHistgram(bool value) {
+    keepHistogram = value;
+}
+
+void Timer::Tock() {
+    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &cpuclock[1]);
+    elapsedClockMsec   = (cpuclock[1].tv_nsec - cpuclock[0].tv_nsec)/1000;
+    totalElapsedClock += elapsedClockMsec;
+    elapsedTime  = ((1.0)*elapsedClockMsec);
+    if (keepHistogram) {
+        // keep a histogram in number of milliseconds per operation
+        if (histogram.find(elapsedClockMsec) == histogram.end()) {
+            histogram[elapsedClockMsec] = 1;
+        }
+        else {
+            histogram[elapsedClockMsec]++;
+        }
+    }
+    if (keepList) {
+        msecList.push_back(elapsedClockMsec);
+    }
+}
+
+void Timer::Add(const Timer &rhs) {
+    elapsedClockMsec += rhs.elapsedClockMsec;
+    elapsedTime  += rhs.elapsedTime;
+    totalElapsedClock += rhs.totalElapsedClock;
+    msecList.insert(msecList.end(), rhs.msecList.begin(), rhs.msecList.end());
+}
+
+void Timer::SetHeader(std::string _header) {
+    header = _header;
+}
+
+void MappingClocks::AddCells(int nCells) {
+    nCellsPerSample.push_back(nCells);
+}
+
+void MappingClocks::AddBases(int nBases) {
+    nBasesPerSample.push_back(nBases);
+}
+
+int MappingClocks::GetSize() {
+    return total.ListSize();
+}
+
+MappingClocks::MappingClocks() {
+    total.SetHeader("Total");
+    findAnchors.SetHeader("FindAnchors");
+    mapToGenome.SetHeader("MapToGenome");
+    sortMatchPosList.SetHeader("SortMatchPosList");
+    findMaxIncreasingInterval.SetHeader("FindMaxIncreasingInterval");
+    alignIntervals.SetHeader("AlignIntervals");
+}
+
+void MappingClocks::PrintHeader(std::ostream &out) {
+    total.PrintHeader(out);
+    findAnchors.PrintHeader(out);
+    mapToGenome.PrintHeader(out);
+    sortMatchPosList.PrintHeader(out);
+    findMaxIncreasingInterval.PrintHeader(out);
+    alignIntervals.PrintHeader(out); 
+}
+
+void MappingClocks::PrintList(std::ostream &out, int index) {
+
+    total.PrintListValue(out,index);
+    findAnchors.PrintListValue(out,index);
+    mapToGenome.PrintListValue(out,index);
+    sortMatchPosList.PrintListValue(out,index);
+    findMaxIncreasingInterval.PrintListValue(out,index);
+    alignIntervals.PrintListValue(out,index);
+    if (nCellsPerSample.size() > 0) {
+        out << nCellsPerSample[index] << " ";
+    }
+    if (nBasesPerSample.size() > 0) {
+        out << nBasesPerSample[index] << " ";
+    }
+    out << std::endl;
+}
+
+void MappingClocks::SetStoreList(bool value) {
+    total.SetStoreElapsedTime(value);
+    findAnchors.SetStoreElapsedTime(value);
+    mapToGenome.SetStoreElapsedTime(value);
+    sortMatchPosList.SetStoreElapsedTime(value);
+    findMaxIncreasingInterval.SetStoreElapsedTime(value);
+    alignIntervals.SetStoreElapsedTime(value);
+}
+
+void MappingClocks::AddClockTime(const MappingClocks &rhs) {
+    total.Add(rhs.total);
+    findAnchors.Add(rhs.findAnchors);
+    mapToGenome.Add(rhs.mapToGenome);
+    sortMatchPosList.Add(rhs.sortMatchPosList);
+    findMaxIncreasingInterval.Add(rhs.findMaxIncreasingInterval);
+    alignIntervals.Add(rhs.alignIntervals);
+}
+
+MappingMetrics::MappingMetrics() {
+    numReads = 0;
+    numMappedReads = 0;
+    numMappedBases = 0;
+    anchorsPerRead = 0;
+    totalAnchorsForMappedReads = 0;
+    totalAnchors = 0;
+}
+void MappingMetrics::StoreSDPPoint(int nBases, int nSDPAnchors, int nClock) {
+    sdpBases.push_back(nBases);
+    sdpAnchors.push_back(nSDPAnchors);
+    sdpClock.push_back(nClock);
+}
+
+void MappingMetrics::SetStoreList(bool value) {
+    clocks.SetStoreList(value);
+}
+
+void MappingMetrics::PrintSeconds(std::ostream& out, long sec ){
+    out << sec << " Msec";
+}
+
+void MappingMetrics::PrintFraction(std::ostream &out, float frac) {
+    out << std::setprecision(2) << frac;
+}
+
+void MappingMetrics::RecordNumAlignedBases(int nBases) {
+    mappedBases.push_back(nBases);
+}
+
+void MappingMetrics::RecordNumCells(int nCells) {
+    cellsPerAlignment.push_back(nCells);
+}
+
+void MappingMetrics::Collect(MappingMetrics &rhs) {
+    clocks.AddClockTime(rhs.clocks);
+    totalAnchors += rhs.totalAnchors;
+    numReads += rhs.numReads;
+    numMappedReads += rhs.numMappedReads;
+    totalAnchorsForMappedReads += rhs.totalAnchorsForMappedReads;
+    mappedBases.insert(mappedBases.end(), rhs.mappedBases.begin(), rhs.mappedBases.end());
+    cellsPerAlignment.insert(cellsPerAlignment.end(), rhs.cellsPerAlignment.begin(), rhs.cellsPerAlignment.end());
+}
+
+void MappingMetrics::CollectSDPMetrics(MappingMetrics &rhs) {
+    sdpAnchors.insert(sdpAnchors.end(), rhs.sdpAnchors.begin(), rhs.sdpAnchors.end());
+    sdpBases.insert(sdpBases.end(), rhs.sdpBases.begin(), rhs.sdpBases.end());
+    sdpClock.insert(sdpClock.end(), rhs.sdpClock.begin(), rhs.sdpClock.end());
+}
+
+void MappingMetrics::PrintSDPMetrics(std::ostream &out) {
+    out << "nbases ncells time" << std::endl;
+    int i;
+    for (i = 0; i < sdpAnchors.size(); i++) {
+        out << sdpBases[i] << " " << sdpAnchors[i] << " " << sdpClock[i] << std::endl;
+    }
+}
+
+void MappingMetrics::PrintFullList(std::ostream &out) {
+    // 
+    // Print the full header
+    //
+    clocks.PrintHeader(out);
+    out << " MappedBases Cells " << std::endl;
+    //
+    // Print all values: clocks + bases and cells.
+    //
+    int i;
+    for (i = 0; i < clocks.GetSize(); i++) {
+        clocks.PrintList(out,i);
+        //      out << mappedBases[i] << " " << cellsPerAlignment[i] << endl;
+    }
+}
+
+void MappingMetrics::PrintSummary(std::ostream &out) {
+    out << "Examined " << numReads << std::endl;
+    out << "Mapped   " << numMappedReads << std::endl;
+    out << "Total mapping time\t";
+    PrintSeconds(out, clocks.total.elapsedClockMsec);
+    out << " \t";
+    PrintSeconds(out, (1.0*clocks.total.elapsedClockMsec)/numReads);
+    out << " /read" << std::endl;
+    out << "      find anchors\t";
+    PrintSeconds(out, clocks.mapToGenome.elapsedClockMsec);
+    out << " \t";
+    PrintSeconds(out, (1.0*clocks.mapToGenome.elapsedClockMsec)/numReads);
+    out << std::endl;
+    out << "      sort anchors\t";
+    PrintSeconds(out, clocks.sortMatchPosList.elapsedClockMsec);
+    out << " \t";
+    PrintSeconds(out, (1.0*clocks.sortMatchPosList.elapsedClockMsec)/numReads);
+    out << std::endl;
+    out << " find max interval\t";
+    PrintSeconds(out, clocks.findMaxIncreasingInterval.elapsedClockMsec);
+    out << " \t";
+    PrintSeconds(out, (1.0*clocks.findMaxIncreasingInterval.elapsedClockMsec)/numReads);
+    out << std::endl;
+    out << "Total anchors: " << totalAnchors << std::endl;
+    out << "   Anchors per read: " << (1.0*totalAnchors) / numReads << std::endl;
+    out << "Total mapped: " << totalAnchorsForMappedReads << std::endl;
+    out << "   Anchors per mapped read: " << (1.0*totalAnchorsForMappedReads) / numMappedReads << std::endl;
+}
+
+void MappingMetrics::AddClock(MappingClocks &clocks) {
+    clocks.AddClockTime(clocks);
+}
diff --git a/libcpp/alignment/MappingMetrics.hpp b/libcpp/alignment/MappingMetrics.hpp
new file mode 100644
index 0000000..83bc07c
--- /dev/null
+++ b/libcpp/alignment/MappingMetrics.hpp
@@ -0,0 +1,133 @@
+#ifndef _BLASR_MAPPING_METRICS_HPP_
+#define _BLASR_MAPPING_METRICS_HPP_
+
+#include <iostream>
+#include <time.h>
+#include <map>
+#include <vector>
+//In order to use clock_gettime in LINUX, add -lrt 
+#ifdef __APPLE__
+#include <mach/mach.h>
+#include <mach/clock.h>
+#include <mach/mach_time.h>
+#include <errno.h>
+
+typedef enum {
+    CLOCK_REALTIME,
+    CLOCK_MONOTONIC,
+    CLOCK_PROCESS_CPUTIME_ID,
+    CLOCK_THREAD_CPUTIME_ID
+} clockid_t;
+static mach_timebase_info_data_t __clock_gettime_inf;
+
+int clock_gettime(clockid_t clk_id, struct timespec *tp); 
+#endif // __APPLE__
+
+class Timer {
+public:
+    bool keepHistogram, keepList;
+    timespec cpuclock[2];
+    int elapsedClockMsec;
+    float   elapsedTime;
+    std::map<int,int> histogram;
+    std::vector<int> msecList;
+    long long totalElapsedClock;
+    std::string header;
+
+
+    Timer(std::string _header=""); 
+
+    int ListSize(); 
+
+    void PrintHeader(std::ostream &out); 
+
+    void PrintListValue(std::ostream &out, int index); 
+
+    void Tick(); 
+
+    void SetStoreElapsedTime(bool value); 
+
+    void SetStoreHistgram(bool value); 
+
+    void Tock(); 
+
+    void Add(const Timer &rhs); 
+
+    void SetHeader(std::string _header); 
+
+};
+
+
+class MappingClocks {
+public:
+    Timer total;
+    Timer findAnchors;
+    Timer mapToGenome;
+    Timer sortMatchPosList;
+    Timer findMaxIncreasingInterval;
+    Timer alignIntervals;           
+    std::vector<int> nCellsPerSample;
+    std::vector<int> nBasesPerSample;
+
+    void AddCells(int nCells); 
+
+    void AddBases(int nBases); 
+
+    int  GetSize(); 
+
+    MappingClocks(); 
+
+    void PrintHeader(std::ostream &out); 
+
+    void PrintList(std::ostream &out, int index); 
+
+    void SetStoreList(bool value=true); 
+
+    void AddClockTime(const MappingClocks &rhs); 
+};
+
+
+class MappingMetrics {
+public:
+    MappingClocks clocks;
+    int numReads;
+    int numMappedReads;
+    int numMappedBases;
+    std::vector<int> mappedBases;
+    std::vector<int> cellsPerAlignment;
+    std::vector<int> anchorsPerAlignment;
+    std::vector<int> sdpAnchors, sdpBases, sdpClock;
+    long totalAnchors;
+    int anchorsPerRead;
+    long totalAnchorsForMappedReads;
+
+    MappingMetrics(); 
+
+    void StoreSDPPoint(int nBases, int nSDPAnchors, int nClock); 
+
+    void SetStoreList(bool value=true); 
+
+    void PrintSeconds(std::ostream &out, long sec);
+
+    void PrintFraction(std::ostream &out, float frac); 
+
+    void RecordNumAlignedBases(int nBases); 
+
+    void RecordNumCells(int nCells); 
+
+    void Collect(MappingMetrics &rhs); 
+
+    void CollectSDPMetrics(MappingMetrics &rhs); 
+
+    void PrintSDPMetrics(std::ostream &out); 
+
+    void PrintFullList(std::ostream &out); 
+
+    void PrintSummary(std::ostream &out); 
+
+    void AddClock(MappingClocks &clocks); 
+};
+
+
+
+#endif // _BLASR_MAPPING_METRICS_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/AffineGuidedAlign.hpp b/libcpp/alignment/algorithms/alignment/AffineGuidedAlign.hpp
new file mode 100644
index 0000000..4080489
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/AffineGuidedAlign.hpp
@@ -0,0 +1,589 @@
+#ifndef _BLASR_AFFINE_GUIDE_ALIGNMENT_HPP_
+#define _BLASR_AFFINE_GUIDE_ALIGNMENT_HPP_
+
+#include "GuidedAlign.hpp"
+template<typename QSequence, typename TSequence, typename T_ScoreFn>
+int AffineGuidedAlign(QSequence &origQSeq, TSequence &origTSeq,  Alignment &guideAlignment,
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        Alignment &alignment,
+        std::vector<int>    &scoreMat,
+        std::vector<Arrow>  &pathMat,
+        std::vector<double> &probMat,
+        std::vector<double> &optPathProbMat,
+        std::vector<float>  &lnSubPValueVect,
+        std::vector<float>  &lnInsPValueVect,
+        std::vector<float>  &lnDelPValueVect,
+        std::vector<float>  &lnMatchPValueVect,
+        AlignmentType alignType=Global, 
+        bool computeProb=false) {
+
+    Guide guide;
+    AlignmentToGuide(guideAlignment, guide, bandSize);
+    StoreMatrixOffsets(guide);
+    int guideSize = ComputeMatrixNElem(guide);
+
+    //
+    // Make a copy of the sequences that is guaranteed to be in 3-bit format for faster alignment.
+    // (mabybe eventually reuse the qseq and tseq memory)
+    //
+    QSequence qSeq;
+    TSequence tSeq;
+    qSeq.Assign(origQSeq);
+    tSeq.Assign(origTSeq);
+
+    int matrixNElem = ComputeMatrixNElem(guide);
+    StoreMatrixOffsets(guide);
+
+    /*
+     * The following code is useful to produce images of the dp-matrix.
+     * Make sure the sequenences are less than 5kb each though.
+
+     Matrix<float> probMatrix;
+     probMatrix.Resize(qSeq.length, tSeq.length);
+     probMatrix.Initialize(0);
+     ofstream matrixOut;
+     stringstream matrixOutNameStrm;
+     matrixOutNameStrm << "probMatrix_"<< runIndex << ".dat";
+     matrixOut.open(matrixOutNameStrm.str().c_str());
+     */
+
+    if (computeProb) { 
+        //
+        // Convert phred scale to proper ln for faster manipulation later on.
+        //
+        QVToLogPScale(qSeq.substitutionQV, qSeq.length, lnSubPValueVect);
+        QVToLogPScale(qSeq.insertionQV,    qSeq.length, lnInsPValueVect);
+        QVToLogPScale(qSeq.deletionQV,     qSeq.length, lnDelPValueVect);
+        if (lnMatchPValueVect.size() < qSeq.length) {
+            lnMatchPValueVect.resize(qSeq.length);
+        }
+        //
+        // Normalize probability std::vectors so that the probability of transition from each cell is 1.
+        //
+        int i;
+        for (i = 0; i < qSeq.length; i++) {
+            float subSum  = LogSumOfTwo(lnSubPValueVect[i], QVToLogPScale(scoreFn.substitutionPrior)); // prior on substitution rate
+            float denominator = LogSumOfThree(lnDelPValueVect[i], lnInsPValueVect[i], subSum);
+            lnDelPValueVect[i] = lnDelPValueVect[i] - denominator;
+            lnSubPValueVect[i]   = lnSubPValueVect[i] - denominator;
+            lnInsPValueVect[i]   = lnInsPValueVect[i] - denominator;
+            lnMatchPValueVect[i] = subSum - denominator;
+        }
+
+    }
+
+
+
+    // 
+    // Make sure the alignments can fit in the reused buffers.
+    //
+    std::vector<int>    affineInsScoreMat, affineDelScoreMat;
+    std::vector<Arrow>  affineInsPathMat, affineDelPathMat;
+    affineInsScoreMat.resize(matrixNElem);
+    fill(affineInsScoreMat.begin(), affineInsScoreMat.end(), 0);
+    affineDelScoreMat.resize(matrixNElem);
+    fill(affineDelScoreMat.begin(), affineDelScoreMat.end(), 0);
+    affineInsPathMat.resize(matrixNElem);
+    fill(affineInsPathMat.begin(), affineInsPathMat.end(), NoArrow);
+    affineDelPathMat.resize(matrixNElem);
+    fill(affineDelPathMat.begin(), affineDelPathMat.end(), NoArrow);
+
+
+    if (scoreMat.size() < matrixNElem) {
+        scoreMat.resize(matrixNElem);
+        pathMat.resize(matrixNElem);
+        fill(scoreMat.begin(), scoreMat.end(), 0);
+        fill(pathMat.begin(), pathMat.end(), NoArrow);
+    }
+    if (computeProb) {
+        if (probMat.size() < matrixNElem) {
+            probMat.resize(matrixNElem);
+            optPathProbMat.resize(matrixNElem);
+        }
+    }
+
+    // 
+    // Initialze matrices.  Only initialize up to matrixNElem rather
+    // than matrix.size() because the matrix.size() unnecessary space
+    // may be allocated.
+    //
+
+    std::fill(scoreMat.begin(), scoreMat.begin() + matrixNElem, 0);
+    std::fill(pathMat.begin(), pathMat.begin() + matrixNElem, NoArrow);
+    if (computeProb) {
+        std::fill(probMat.begin(), probMat.begin() + matrixNElem, 0);	
+        std::fill(optPathProbMat.begin(), optPathProbMat.begin() + matrixNElem, 0);
+    }
+    //
+    // Initialize boundary conditions.
+    //
+    int q, t;
+    int bufferIndex;
+    // start alignemnt at the beginning of the guide, and align to the
+    // end of the guide.
+    if (guide.size() == 0) {
+        qSeq.Free();
+        tSeq.Free();
+        return 0;
+    }
+    int qStart = guide[1].q;
+    int tStart = guide[1].t;
+    int qEnd   = guide[guide.size()-1].q+1;
+    int tEnd   = guide[guide.size()-1].t+1;
+
+    GetBufferIndexFunctor GetBufferIndex;
+    GetBufferIndex.seqRowOffset = qStart;
+    GetBufferIndex.guideSize    = guide.size();
+    int indicesAreValid, delIndexIsValid, insIndexIsValid, matchIndexIsValid;
+    bufferIndex = -1;
+    indicesAreValid = GetBufferIndex(guide, qStart-1, tStart-1, bufferIndex);
+    assert(indicesAreValid);
+    scoreMat[bufferIndex] = 0;
+    pathMat[bufferIndex]  = NoArrow;
+    int matchIndex, insIndex, delIndex, curIndex;
+
+    //
+    // Initialize deletion row.
+    //
+    if (computeProb) {
+        probMat[0] = optPathProbMat[0] = 0;
+    }
+    for (t = tStart; t < tStart + guide[0].tPost; t++) {
+        curIndex=-1;
+        indicesAreValid = GetBufferIndex(guide, qStart-1, t, curIndex);
+        if (indicesAreValid == 0 ) {
+            cout << "QSeq" << endl;
+            (static_cast<DNASequence*>(&origQSeq))->PrintSeq(cout);
+            cout << "TSeq" << endl;
+            (static_cast<DNASequence*>(&origTSeq))->PrintSeq(cout);
+            assert(0);
+        }
+        delIndex = -1;
+        delIndexIsValid = GetBufferIndex(guide, qStart-1, t-1, delIndex);
+        if (delIndexIsValid) {
+            if (alignType == Global) {
+                scoreMat[curIndex] = scoreMat[delIndex] + scoreFn.del;
+            }
+            else if (alignType == Local) {
+                scoreMat[curIndex] = 0;
+            }
+            affineDelScoreMat[curIndex] = scoreFn.del;
+            affineDelPathMat[curIndex] = AffineDelOpen;
+            affineInsPathMat[curIndex] = AffineInsOpen;
+            affineInsScoreMat[curIndex] = scoreFn.ins;
+            pathMat[curIndex] = Left;
+            if (computeProb) {
+                if (qSeq.qual.Empty() == false) {
+                    optPathProbMat[curIndex] = probMat[curIndex] = probMat[delIndex] + QVToLogPScale(scoreFn.globalDeletionPrior);
+                }
+            }
+        }
+    }
+
+    // 
+    // Initialize stripe along the top of the grid.
+    //
+    for (q = qStart ; q < qStart + bandSize and q < qEnd; q++) {
+        insIndex = -1;
+        insIndexIsValid = GetBufferIndex(guide, q-1, tStart-1, // diagonal from t-start
+                insIndex);
+        curIndex = -1;
+        indicesAreValid = GetBufferIndex(guide, q, tStart-1, curIndex);
+
+        if (insIndexIsValid and indicesAreValid) {
+            assert(insIndex >= 0);
+            assert(curIndex >= 0);
+            if (alignType == Global) {
+                scoreMat[curIndex] = scoreMat[insIndex] + scoreFn.ins;
+            }
+            else {
+                scoreMat[curIndex] = 0;
+            }
+            affineInsScoreMat[curIndex] = scoreFn.ins;
+            affineInsPathMat[curIndex]  = AffineInsOpen;
+            affineDelScoreMat[curIndex] = scoreFn.del;
+            affineDelPathMat[curIndex] = AffineDelOpen;
+            pathMat[curIndex] = Up;
+        }
+    }
+
+    int matchScore, insScore, delScore, 
+        affineInsOpenScore, affineInsExtScore, 
+        affineDelOpenScore, affineDelExtScore;
+
+    for (q = qStart; q < qEnd; q++) {
+        int qi = q - qStart + 1;
+        int tp = guide[qi].t;
+        curIndex = matchIndex = insIndex = delIndex = -1;
+
+        //
+        // Do some work that will help define when matchIndex and insIndex
+        // may be used.  Once delIndex is computed once, it is valid for
+        // all t positions.
+        //
+        int prevRowTEnd = -1;
+        if ( qi > 0) { 
+            //
+            // Define the boundaries of the column which may access previously
+            // computed cells with a match.
+            //
+            prevRowTEnd = guide[qi-1].t + guide[qi-1].tPost;
+        }    
+
+        for (t = tp - guide[qi].tPre ; t < guide[qi].t + guide[qi].tPost +1; t++) {
+
+            if (q < qStart + bandSize and t == tp - guide[qi].tPre - 1) {
+                // On the boundary condition, don't access the 1st element;
+                t++;
+                continue;
+            }
+            // Make sure the index is not past the end of the sequence.
+            if (t < -1) continue;
+            if (t >= tEnd) continue;
+
+            //
+            // No cells are available to use for insertion cost
+            // computation. 
+            //
+            if (t > prevRowTEnd) {
+                insIndex = -1;
+            }
+            if (t > prevRowTEnd + 1) {
+                matchIndex = -1;
+            }
+
+            //
+            // Find the indices in the buffer.  Since the rows are of
+            // different sizes, one can't just use offsets from the buffer
+            // index. 
+            //
+
+            if (GetBufferIndex(guide, q-1,t-1, matchIndex)) {
+                assert(matchIndex >= 0);
+                matchScore = scoreMat[matchIndex] + scoreFn.Match(tSeq, t, qSeq, q);
+            }
+            else {
+                matchScore = INF_INT;
+            }
+
+            if (GetBufferIndex(guide, q-1, t, insIndex)) {
+                assert(insIndex >= 0);
+                insScore = scoreMat[insIndex] + scoreFn.Insertion(tSeq,(DNALength) t, qSeq, (DNALength)q);
+                affineInsExtScore = affineInsScoreMat[insIndex] + scoreFn.affineExtend; // 0 extension 
+            }
+            else {
+                insScore = INF_INT;
+                affineInsExtScore = INF_INT;
+            }
+            if (GetBufferIndex(guide, q, t-1, delIndex)) {
+                assert(delIndex >= 0);
+                delScore = scoreMat[delIndex] + scoreFn.Deletion(tSeq, (DNALength) t, qSeq, (DNALength)q);
+                affineDelExtScore = affineDelScoreMat[delIndex] + scoreFn.affineExtend;
+            }
+            else {
+                delScore = INF_INT;
+                affineDelExtScore = INF_INT;
+            }
+
+            int minScore = MIN(matchScore, MIN(insScore, MIN(delScore, MIN(affineInsExtScore, affineDelExtScore))));
+            int result   = GetBufferIndex(guide, q, t, curIndex);
+            // This should only loop over valid cells.
+            assert(result);
+            assert(curIndex >= 0);
+            scoreMat[curIndex] = minScore;
+            if (minScore == INF_INT) {
+                pathMat[curIndex] = NoArrow;
+            }
+            else {
+                assert(result == 1);
+                if (minScore == matchScore) {
+                    pathMat[curIndex] = Diagonal;
+                }
+                else if (minScore == delScore) {
+                    pathMat[curIndex] = Left;
+                }
+                else if (minScore == insScore) {
+                    pathMat[curIndex] = Up;
+                }
+                else if (minScore == affineInsExtScore) {
+                    pathMat[curIndex] = AffineInsClose;
+                }
+                else {
+                    assert (minScore == affineDelExtScore) ;
+                    pathMat[curIndex] = AffineDelClose;
+                }
+            }
+
+         //   affineInsOpenScore = scoreMat[curIndex] + scoreFn.ins * 2;
+         //   affineDelOpenScore = scoreMat[curIndex] + scoreFn.del * 2;
+
+      //
+      // Set the penalty to initiate an affine gap here.
+      //
+      affineInsOpenScore = scoreMat[curIndex] + scoreFn.affineOpen;
+      affineDelOpenScore = scoreMat[curIndex] + scoreFn.affineOpen;
+
+            if (affineInsOpenScore == INF_INT and 
+                    affineInsExtScore == INF_INT) {
+                cout << q << " " << t << endl;
+                cout << "All infinity, bad things will happen." << endl;
+                cout << "the score mat here is : " << scoreMat[curIndex] << " and path " << pathMat[curIndex] << endl;
+                assert(0);
+            }
+            if (affineInsOpenScore < affineInsExtScore) {
+                affineInsPathMat[curIndex] = AffineInsOpen;
+                affineInsScoreMat[curIndex] = affineInsOpenScore;
+            }
+            else {
+                affineInsPathMat[curIndex] = AffineInsUp;
+                affineInsScoreMat[curIndex] = affineInsExtScore;
+            }
+
+            if (affineDelOpenScore < affineDelExtScore) {
+                affineDelPathMat[curIndex] = AffineDelOpen;
+                affineDelScoreMat[curIndex] = affineDelOpenScore;
+            }
+            else {
+                affineDelPathMat[curIndex] = AffineDelLeft;
+                affineDelScoreMat[curIndex] = affineDelExtScore;
+            }
+        }
+    }		
+    // Ok, for now just trace back from qend/tend
+    q = qEnd-1;
+    t = tEnd-1;
+    std::vector<Arrow>  optAlignment;
+    int bufferIndexIsValid;
+    int curMatrix = Match;
+    while(q >= qStart or t >= tStart) {
+        bufferIndex = -1;
+        //    cout << "backtrace: " << q << " "<< t << endl;
+        bufferIndexIsValid = GetBufferIndex(guide, q, t, bufferIndex);
+        assert(bufferIndexIsValid);
+        assert(bufferIndex >= 0);
+        Arrow arrow;
+        //    cout << q << " "<< t << " " << curMatrix << " " << arrow << endl;
+        if (curMatrix == Match) {
+            arrow = pathMat[bufferIndex];
+            if (arrow == NoArrow) {
+                tSeq.ToAscii();
+                qSeq.ToAscii();
+                int gi;
+                for (gi = 0; gi < guide.size(); gi++) {
+                    cout << guide[gi].q << " " << guide[gi].t << " " << guide[gi].tPre << " " << guide[gi].tPost << endl;
+                }
+
+                cout << "qseq: "<< endl;
+                (static_cast<DNASequence*>(&qSeq))->PrintSeq(cout);
+                cout << "tseq: "<< endl;
+                (static_cast<DNASequence*>(&tSeq))->PrintSeq(cout);
+                cout << "ERROR, this path has gone awry at " << q << " " << t << " !" << endl;
+                exit(1);
+            }
+
+            if (arrow == Diagonal) {
+                optAlignment.push_back(arrow);
+                q--;
+                t--;
+            }
+            else if (arrow == Up) {
+                optAlignment.push_back(arrow);
+                q--;
+            }
+            else if (arrow == Left) {
+                optAlignment.push_back(arrow);
+                t--;
+            }
+            else if (arrow == AffineInsClose) {
+                optAlignment.push_back(Up);
+                curMatrix = AffineIns;
+                q--;
+            }
+            else if (arrow == AffineDelClose) {
+                t--;
+                optAlignment.push_back(Left);
+                curMatrix = AffineDel;
+            }
+        }
+        else if (curMatrix == AffineIns) {
+            arrow = affineInsPathMat[bufferIndex];
+            if (arrow == AffineInsOpen) {
+                curMatrix = Match;
+            }
+            else if (arrow == AffineInsUp) {
+                q--;
+                optAlignment.push_back(Up);
+            }
+            else {
+                cout << "ERROR!  Reached arrow " << arrow << " at " << q << " " << t << " in affine ins path mat. That is bad." << endl;
+                assert(0);
+            }
+        }
+        else {
+            assert(curMatrix == AffineDel);
+            arrow = affineDelPathMat[bufferIndex];
+            if (arrow == AffineDelOpen) {
+                curMatrix = Match;
+            }
+            else if (arrow == AffineDelLeft) {
+                t--;
+                optAlignment.push_back(Left);
+            }
+            else {
+                cout << "ERROR! Reached arrow " << arrow << " at " << q << " " << t << " in affine del mat. This is also bad." << endl;
+                assert(0);
+            }
+        }
+    }
+
+    alignment.nCells = ComputeMatrixNElem(guide);
+    std::reverse(optAlignment.begin(), optAlignment.end());
+    alignment.qPos = qStart;
+    alignment.tPos = tStart;
+    alignment.ArrowPathToAlignment(optAlignment);
+    //  StickPrintAlignment(alignment, qSeq, tSeq, cout);
+    RemoveAlignmentPrefixGaps(alignment);
+    int lastIndex = 0;
+    tSeq.Free();
+    qSeq.Free();
+    lastIndex = -1;
+    if (GetBufferIndex(guide, qEnd - 1, tEnd - 1, lastIndex)) {
+        alignment.score = scoreMat[lastIndex];
+        return scoreMat[lastIndex];
+    }
+    else {
+        return 0;
+    }
+}
+
+
+template<typename QSequence, typename TSequence, typename T_ScoreFn> //, typename T_BufferCache>
+int AffineGuidedAlign(QSequence &origQSeq, TSequence &origTSeq,
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        int sdpIns, int sdpDel, float sdpIndelRate,
+        Alignment &alignment,
+        AlignmentType alignType=Global,
+        bool computeProb = false,
+        int sdpTupleSize= 8) {
+    Alignment sdpAlignment;
+
+    int alignScore = SDPAlign(origQSeq, origTSeq,
+            scoreFn, sdpTupleSize, 
+            sdpIns, sdpDel, sdpIndelRate,
+            sdpAlignment); //, Local, false, false);
+
+    int b;
+    for (b = 0; b < sdpAlignment.blocks.size(); b++) {
+        sdpAlignment.blocks[b].qPos += sdpAlignment.qPos;
+        sdpAlignment.blocks[b].tPos += sdpAlignment.tPos;
+    }
+    sdpAlignment.tPos = 0;
+    sdpAlignment.qPos = 0;
+
+    return AffineGuidedAlign(origQSeq, origTSeq, sdpAlignment, scoreFn, bandSize, alignment,
+            // fill in optional parameters
+            alignType, computeProb);
+
+}
+
+
+//
+// Use Case: No guide yet exists for this alignment, but using
+// buffers.  Run SDP alignment first, then refine on the guide.
+//
+
+template<typename QSequence, typename TSequence, typename T_ScoreFn, typename T_BufferCache>
+int AffineGuidedAlign(QSequence &origQSeq, TSequence &origTSeq, 
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        int sdpIns, int sdpDel, float sdpIndelRate,
+        T_BufferCache &buffers,
+        Alignment &alignment, 
+        AlignmentType alignType=Global,
+        bool computeProb = false,
+        int sdpTupleSize= 8) {
+
+    Alignment sdpAlignment;
+
+    int alignScore = SDPAlign(origQSeq, origTSeq,
+            scoreFn, sdpTupleSize, 
+            sdpIns, sdpDel, sdpIndelRate,
+            sdpAlignment, buffers, Local, false, false);
+
+    int b;
+    for (b = 0; b < sdpAlignment.blocks.size(); b++) {
+        sdpAlignment.blocks[b].qPos += sdpAlignment.qPos;
+        sdpAlignment.blocks[b].tPos += sdpAlignment.tPos;
+    }
+    sdpAlignment.tPos = 0;
+    sdpAlignment.qPos = 0;
+
+    return AffineGuidedAlign(origQSeq, origTSeq, sdpAlignment, scoreFn, bandSize, buffers, alignment,
+            // fill in optional parameters
+            alignType, computeProb);
+}
+
+//
+// Use case, guide exists, using buffers
+//
+template<typename QSequence, typename TSequence, typename T_ScoreFn, typename T_BufferCache>
+int AffineGuidedAlign(QSequence &origQSeq, TSequence &origTSeq,  Alignment &guideAlignment,
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        T_BufferCache &buffers,
+        Alignment &alignment, 
+        AlignmentType alignType=Global, 
+        bool computeProb=false) {
+    return AffineGuidedAlign(origQSeq, origTSeq, guideAlignment, scoreFn, bandSize, alignment, 
+            buffers.scoreMat,
+            buffers.pathMat,
+            buffers.probMat,
+            buffers.optPathProbMat,
+            buffers.lnSubPValueMat,
+            buffers.lnInsPValueMat,
+            buffers.lnDelPValueMat,
+            buffers.lnMatchPValueMat, alignType, computeProb);
+}
+
+//
+// Missing the use case for guide does not exist, and not using
+// buffers.  This is just a very long function declaration, so it's
+// not worth writing until it is needed.
+//
+
+
+//
+// Use case, guide exists, but not using buffers.                   
+//
+template<typename QSequence, typename TSequence, typename T_ScoreFn>
+int AffineGuidedAlign(QSequence &origQSeq, TSequence &origTSeq,  Alignment &guideAlignment,
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        Alignment &alignment, 
+        AlignmentType alignType=Global, 
+        bool computeProb=false) {
+
+    //  Make synonyms for members of the buffers class for easier typing.
+    std::vector<int>    scoreMat;
+    std::vector<Arrow>  pathMat;
+    std::vector<double> probMat;
+    std::vector<double> optPathProbMat;
+    std::vector<float>  lnSubPValueVect;
+    std::vector<float>  lnInsPValueVect;
+    std::vector<float>  lnDelPValueVect;
+    std::vector<float>  lnMatchPValueVect;
+
+    return AffineGuidedAlign(origQSeq, origTSeq, guideAlignment, scoreFn, bandSize, alignment,
+            scoreMat,
+            pathMat,
+            probMat,
+            optPathProbMat,
+            lnSubPValueVect,
+            lnInsPValueVect,
+            lnDelPValueVect,
+            lnMatchPValueVect, alignType, computeProb);
+}
+
+#endif // _BLASR_AFFINE_GUIDE_ALIGNMENT_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/AffineKBandAlign.hpp b/libcpp/alignment/algorithms/alignment/AffineKBandAlign.hpp
new file mode 100644
index 0000000..82ba5f7
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/AffineKBandAlign.hpp
@@ -0,0 +1,406 @@
+#ifndef _BLASR_AFFINE_KBAND_ALIGN_HPP_
+#define _BLASR_AFFINE_KBAND_ALIGN_HPP_
+
+#include <cassert>
+#include <vector>
+#include <iostream>
+#include "NucConversion.hpp"
+#include "defs.h"
+#include "matrix/FlatMatrix.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "KBandAlign.hpp"
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_Alignment>
+int AffineKBandAlign(T_QuerySequence &pqSeq, T_TargetSequence &ptSeq,
+        int matchMat[5][5], 
+        int hpInsOpen, int hpInsExtend, int insOpen, int insExtend,
+        int del, int k,
+        vector<int> &scoreMat,
+        vector<Arrow> & pathMat,
+        vector<int> &hpInsScoreMat,
+        vector<Arrow> &hpInsPathMat,
+        vector<int> &insScoreMat,
+        vector<Arrow> &insPathMat,
+        T_Alignment &alignment, 
+        AlignmentType alignType) {
+
+    //
+    // Make a copy of the sequences that is guaranteed to be in 3-bit format 
+    // for quick access to the score array.
+    //									
+
+    int INF_SCORE = INF_INT - 1000;
+    T_QuerySequence qSeq;
+    T_TargetSequence tSeq;
+    //	CreateThreeBitSequence(pqSeq, qSeq);
+    //	CreateThreeBitSequence(ptSeq, tSeq);
+    qSeq.seq = pqSeq.seq;
+    qSeq.length= pqSeq.length;
+    tSeq.seq = ptSeq.seq;
+    tSeq.length = ptSeq.length;
+
+
+    DNALength tLen, qLen;
+    SetKBoundedLengths(tSeq.length, qSeq.length, k, tLen, qLen);
+
+    //
+    //
+    // Allow for length up to diagonal + k + 1 for boundary.
+    // 
+    // Allow for width:
+    //   diagonal (1)
+    //   up to k insertions (k)
+    //   up to k deletions  (k)
+    //   boundary on left side of matrix (1)
+    // 
+    //	if (qLen + k > tLen and qLen < tLen) {
+    //		k = tLen - qLen +1;
+    //	}
+    DNALength nCols = 2*k + 1;
+    VectorIndex totalMatSize = (qLen + 1) * nCols;
+
+
+    // 
+    // For now the scoreMat and path mat maintained outside this 
+    // function so that they may have different sizes from the affine
+    // matrices. 
+    //
+
+    if (scoreMat.size() < totalMatSize) {
+        scoreMat.resize(totalMatSize);
+        pathMat.resize(totalMatSize);
+    }
+
+    if (hpInsScoreMat.size() < totalMatSize) {
+        hpInsScoreMat.resize(totalMatSize);
+        hpInsPathMat.resize(totalMatSize);
+        insScoreMat.resize(totalMatSize);
+        insPathMat.resize(totalMatSize);
+    }
+
+    // 
+    // Initialze matrices
+    //
+    std::fill(scoreMat.begin(), scoreMat.begin() + totalMatSize, 0);
+    std::fill(pathMat.begin(), pathMat.begin() + totalMatSize, NoArrow);
+    std::fill(hpInsScoreMat.begin(), hpInsScoreMat.begin() + totalMatSize, 0);
+    std::fill(hpInsPathMat.begin(), hpInsPathMat.begin() + totalMatSize, NoArrow);
+    std::fill(insScoreMat.begin(), insScoreMat.begin() + totalMatSize, 0);
+    std::fill(insPathMat.begin(), insPathMat.begin() + totalMatSize, NoArrow);
+
+    //
+    // Initialize the boundaries of the DP matrix.
+    //
+    int q, t;
+
+    if (alignType != TargetFit) {
+        insScoreMat[rc2index(0, k, nCols)] = 0;
+        insPathMat[rc2index(0, k, nCols)] = AffineInsOpen;
+
+        for (q = 1; q <=k && q < (int) qLen + 1; q++ ){
+            insScoreMat[rc2index(q, k - q, nCols)] = q * insExtend + insOpen;
+            insPathMat[rc2index(q, k-q, nCols)] = AffineInsUp;
+        }
+    }
+    else if (alignType == TargetFit) {
+        // 
+        // Allow free gap penalties at the beginning of the alignment.
+        //
+        insScoreMat[rc2index(0, k, nCols)] = 0;
+        insPathMat[rc2index(0, k, nCols)]  = AffineInsOpen;
+        for (q = 1; q <= k && q < (int) qLen + 1; q++ ){
+            insScoreMat[rc2index(q, k - q, nCols)] = 0;
+            insPathMat[rc2index(q, k-q, nCols)]    = AffineInsUp;
+        }
+    }
+
+
+    //
+    // Assign score for (0,0) position in matrix -- aligning a gap to a gap
+    // which should just be a finished alignment.  There is no cost for
+    // gap-gap alignment.
+    //
+    hpInsScoreMat[rc2index(0,k,nCols)] = 0;
+    hpInsPathMat[rc2index(0,k,nCols)]  = AffineHPInsOpen;
+
+    for (q = 1; q <= k && q < (int) qLen + 1; q++) { 
+        hpInsScoreMat[rc2index(q, k - q, nCols)] = q * hpInsExtend + hpInsOpen;
+        hpInsPathMat[rc2index(q,k-q,nCols)] = AffineHPInsUp;
+    }
+
+    for (t = k+1; t < (int) nCols; t++ ) {
+        hpInsScoreMat[rc2index(0, t, nCols)] = INF_SCORE;//  hpInsOpen + (t - k) * hpInsExtend;//; //INF_SCORE;
+        hpInsPathMat[t] = NoArrow; //AffineHPInsOpen ; //NoArrow;
+        insScoreMat[t] = INF_SCORE; //insOpen + (t - k) * insExtend; //INF_SCORE;
+        insPathMat[t] = NoArrow; //AffineInsOpen; //NoArrow;
+    }
+
+    for (q = 1; q <= k && q < (int) qLen + 1; q++) {
+        scoreMat[rc2index(q, k - q, nCols)] = insScoreMat[rc2index(q,k-q,nCols)];
+        pathMat[rc2index(q, k - q , nCols)] = AffineInsClose;
+    }
+    for (t = 1; t <= (int) k; t++) {
+        scoreMat[rc2index(0, t + k , nCols)] = t * del;
+        pathMat[rc2index(0, t + k , nCols)] = Left;
+    }
+
+
+    //
+    // The recurrence relation here is a slight modification of the
+    // standard affine gap alignment.  Deletions are non-affine.  Insertions
+    // are affine with different scores for homopolymer insertions, and 
+    // an affine score for mixed insertions.
+    //
+
+
+    int matchScore, delScore;
+    int hpInsExtendScore, hpInsOpenScore, insOpenScore, insExtendScore;
+    int minHpInsScore, minInsScore;
+    for (q = 1; q <= (int) qLen; q++) {
+        for (t = q - k; t < (int) q + k + 1; t++) {
+            if (t < 1) {
+                continue;
+            }
+            if ((DNALength) t >  tLen) {
+                break;
+            }
+
+            VectorIndex upper = rc2index(q-1, k + t - q + 1, nCols);
+            VectorIndex curIndex = rc2index(q, k + t - q, nCols);
+
+            if (t < q + k)
+                hpInsOpenScore = scoreMat[upper] + hpInsOpen;
+            else
+                hpInsOpenScore = INF_SCORE;
+
+            //
+            // The homopolymer insertion score is defined only when the previous nucleotide
+            // is the same as the current, in which case the homopolymer insertion score
+            // is used.  If the current and previous nucleotide in the query are different,
+            // the extension is not possible, and the best that can happen is a gap open.
+            //
+            if (q > 1 and qSeq[q-1] == qSeq[q-2]) {
+                if (t < q + k) 
+                    hpInsExtendScore = hpInsScoreMat[upper] + hpInsExtend;
+                else 
+                    hpInsExtendScore = INF_SCORE;
+            }
+            else {
+                hpInsExtendScore = INF_SCORE;
+            }
+
+            //
+            // Since this is only allowing insertions, this grid has only horizontal and 
+            // elevation arrows.
+            //
+
+            if (hpInsOpenScore < hpInsExtendScore) {
+                hpInsPathMat[curIndex] = AffineHPInsOpen;
+                minHpInsScore = hpInsOpenScore;
+            }
+            else {
+                hpInsPathMat[curIndex] = AffineHPInsUp;
+                minHpInsScore = hpInsExtendScore;
+            }
+
+            hpInsScoreMat[curIndex] = minHpInsScore;
+            if (t < q + k) {
+                insOpenScore = scoreMat[upper] + insOpen;
+                insExtendScore = insScoreMat[upper] + insExtend;
+            }
+            else {
+                insOpenScore = INF_SCORE;
+                insExtendScore = INF_SCORE;
+            }
+
+            if (insOpenScore < insExtendScore) {
+                insPathMat[curIndex] = AffineInsOpen;
+                minInsScore = insOpenScore;
+            }
+            else {
+                insPathMat[curIndex] = AffineInsUp;
+                minInsScore = insExtendScore;
+            }
+            insScoreMat[curIndex] = minInsScore;
+
+
+            // On left boundary of k-band. 
+            // do not allow deletions of t.
+            if (t == q - k) {
+                delScore = INF_SCORE;
+            }
+            else {
+                // cur row = q
+                // cur col = t - q 
+                // prev col therefore t - q - 1
+                // and offset from diagonal is k + t - q - 1
+                delScore = scoreMat[rc2index(q, k + t - q - 1, nCols)] + del;
+            }
+
+            // cur row = q
+            // cur col = t - q
+
+            // cur query index = q - 1
+            // cur target index = t - 1
+            // therefore match row (up) = q 
+            //           match col (left, but since up shifted right) = t - q
+            assert(rc2index(q - 1, k + t - q, nCols) < scoreMat.size());
+            assert(t-1 >= 0);
+            assert(q-1 >= 0);
+            matchScore = scoreMat[rc2index(q - 1, k + t - q, nCols)] + matchMat[ThreeBit[qSeq.seq[q-1]]][ThreeBit[tSeq.seq[t-1]]];
+
+            //
+            //  Possibly on right boundary of k-band, in which
+            //  case do not allow insertions from q.
+
+            int minScore = MIN(matchScore, MIN(delScore, MIN(minInsScore, minHpInsScore)));
+            curIndex = rc2index(q, k + t - q, nCols);
+            assert(curIndex < scoreMat.size());
+            scoreMat[curIndex] = minScore;
+            if (minScore == matchScore) {
+                pathMat[curIndex] = Diagonal;
+            }
+            else if (minScore == delScore) {
+                pathMat[curIndex] = Left;
+            }
+            else if (minScore == minInsScore) {
+                pathMat[curIndex] = AffineInsClose;
+            }
+            else {
+                pathMat[curIndex] = AffineHPInsClose;
+            }
+        }
+    }
+    /*
+       std::cout << "tracing back from: " << q << ", " << t << std::endl;
+       std::cout << "match score: " << std::endl;
+       PrintFlatMatrix(&scoreMat[0], qLen + 1, nCols, std::cout);
+       std::cout << " path: " << std::endl;
+       PrintFlatMatrix(pathMat, qLen + 1, nCols, std::cout);
+       std::cout << "hp  score: " << std::endl;
+       PrintFlatMatrix(&hpInsScoreMat[0], qLen + 1, nCols, std::cout);
+       std::cout << "hp  path: " << std::endl;
+       PrintFlatMatrix(hpInsPathMat, qLen + 1, nCols, std::cout);	
+       std::cout << "normal affine ins score: " << std::endl;
+       PrintFlatMatrix(&insScoreMat[0], qLen + 1, nCols, std::cout);
+       std::cout << "normal affine ins path: " << std::endl;
+       PrintFlatMatrix(&insPathMat[0], qLen + 1, nCols, std::cout);
+       */
+    vector<Arrow>  optAlignment;
+    // First find the end position matrix.
+
+    int minScoreTPos, minScore;
+    int minScoreQPos;
+    if (alignType == Global) {
+        q = qLen ;
+        t = k - ((int)qLen - (int)tLen);
+    }
+    else if (alignType == QueryFit) {
+        q = qLen;
+        minScoreTPos = max(q-k,1);
+        DNALength index = rc2index(qLen, k + minScoreTPos - q, nCols);
+        minScore = scoreMat[index];
+        for (t = q - k; t < (int) q + k + 1; t++) {
+            if (t < 1) { continue;}
+            if (t > tLen) { break;}
+            int index = rc2index(qLen,k + t - q,nCols);
+            if (scoreMat[index] < minScore) {
+                minScoreTPos = t;
+                minScore = scoreMat[index ];
+            }
+        }
+        t = k - ((int)qLen - minScoreTPos);
+    }
+    else if (alignType == TargetFit) {
+        t = tLen;
+
+        int qStart = max(0,min((int)qLen, (int)tLen) - max(0, k - max(((int)tLen) - ((int)qLen), 0)));
+        int qEnd = min(qLen, tLen + k) + 1;
+
+        minScoreQPos = qStart;
+        int index = rc2index(minScoreQPos, k - (minScoreQPos - tLen), nCols);
+        minScore = scoreMat[index];
+        for (q = qStart; q < qEnd; q++) {
+            // add to k since this is going up.
+            index = rc2index(q, k + (q - tLen), nCols);
+            if (scoreMat[index] < minScore) {
+                minScoreQPos = q;
+                minScore     = scoreMat[index];
+            }
+        }
+        q = minScoreQPos;
+        t = (k+((int)q-(int)tLen));
+    }
+
+    int optScore = scoreMat[rc2index(q, t, nCols)];
+    Arrow arrow;
+    MatrixLabel curMatrix = Match;
+
+
+    while ((q > 0) or
+            (q == 0 and t > k)) {
+        assert(t < 2*k+1);
+        if (curMatrix == Match) {
+            arrow = pathMat[rc2index(q,t, nCols)];
+            if (arrow == Diagonal) {
+                optAlignment.push_back(arrow);
+                q--;
+            }
+            else if (arrow == Left) {
+                optAlignment.push_back(arrow);
+                t--;
+            }
+            //
+            // The following two conditions change matrices 
+            // without changing coordinates, since the gap close
+            // just changes state without adding to the alignment.
+            //
+            else if (arrow == AffineInsClose) {
+                curMatrix = AffineIns;
+            }
+            else if (arrow == AffineHPInsClose) {
+                curMatrix = AffineHPIns;
+            }
+        }
+        else if (curMatrix == AffineHPIns) {
+            //
+            // The current
+            arrow = hpInsPathMat[rc2index(q,t,nCols)];
+            if (arrow == AffineHPInsOpen) {
+                curMatrix = Match;
+            }
+            else if (arrow != AffineHPInsUp) {
+                std::cout << "ERROR! Affine homopolymer insertion path matrix MUST only have UP or OPEN arrows." << std::endl;
+                assert(0);
+            }
+            optAlignment.push_back(Up);
+            q--;
+            t++;
+        }
+        else if (curMatrix == AffineIns) {
+            arrow = insPathMat[rc2index(q,t,nCols)];
+            if (arrow == AffineInsOpen) {
+                curMatrix = Match;
+            }
+            else if (arrow != AffineInsUp) {
+                std::cout << "ERROR! Affine insertion path matrix MUST only have UP or OPEN arrows."<<std::endl;
+                assert(0);
+            }
+            optAlignment.push_back(Up);
+            q--;
+            t++;
+        }
+        else {
+            std::cout << "ERROR in affine local alignment, matrix is: " << curMatrix << std::endl;
+            assert(0);
+        }
+    }
+    //	qSeq.Free();
+    //	tSeq.Free();
+    std::reverse(optAlignment.begin(), optAlignment.end());
+    alignment.ArrowPathToAlignment(optAlignment);
+    return optScore;
+}
+
+
+#endif // _BLASR_AFFINE_KBAND_ALIGN_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/AlignmentFormats.hpp b/libcpp/alignment/algorithms/alignment/AlignmentFormats.hpp
new file mode 100644
index 0000000..b645b94
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/AlignmentFormats.hpp
@@ -0,0 +1,6 @@
+#ifndef _BLASR_ALIGNMENT_FORMATS_HPP_
+#define _BLASR_ALIGNMENT_FORMATS_HPP_
+
+enum AlignmentPrintFormat { StickPrint, SummaryPrint, CompareXML, Vulgar, Interval, CompareSequencesParsable, SAM, BAM, NOFORMAT};
+
+#endif
diff --git a/libcpp/alignment/algorithms/alignment/AlignmentUtils.cpp b/libcpp/alignment/algorithms/alignment/AlignmentUtils.cpp
new file mode 100644
index 0000000..7912783
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/AlignmentUtils.cpp
@@ -0,0 +1,43 @@
+#include <cassert>
+#include <vector>
+#include <stdint.h>
+#include <iostream>
+#include <ostream>
+#include <cstdlib>
+#include <fstream>
+#include "AlignmentUtils.hpp"
+
+using namespace blasr;
+
+int ComputeAlignmentScore(
+        std::string &queryStr, std::string &textStr,
+        int matchScores[5][5], int ins, int del) { 
+    DistanceMatrixScoreFunction<DNASequence, DNASequence> scoreFn(matchScores, ins, del);
+    return ComputeAlignmentScore(queryStr, textStr, scoreFn);
+}
+
+int GetNumberWidth(unsigned int value) {
+    // 0 has a width of 1.
+    int width = 1;
+    while (value / 10 > 0)  {
+        value = value / 10;
+        ++width;
+    }
+    return width;
+}
+
+int ComputeDrift(Block &cur, Block &next) {
+
+    int tGap  = (next.tPos - cur.TEnd());
+    int qGap = (next.qPos - cur.QEnd());
+
+    int commonGap = 0;
+
+    if (tGap > 0 and qGap > 0) {
+        commonGap = abs(tGap - qGap);
+    }
+    tGap -= commonGap;
+    qGap -= commonGap;
+
+    return tGap - qGap;
+}
diff --git a/libcpp/alignment/algorithms/alignment/AlignmentUtils.hpp b/libcpp/alignment/algorithms/alignment/AlignmentUtils.hpp
new file mode 100644
index 0000000..0daa80f
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/AlignmentUtils.hpp
@@ -0,0 +1,139 @@
+#ifndef _BLASR_ALIGNMENT_UTILS_HPP_
+#define _BLASR_ALIGNMENT_UTILS_HPP_
+
+#include <string>
+#include "DNASequence.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "algorithms/alignment/DistanceMatrixScoreFunction.hpp"
+
+enum AlignmentType { 
+    Local,     // Standard Smith-Waterman
+    Global,    // Standard Needleman-Wuncsh
+    QueryFit,  // No gap penalties from query.  
+    TargetFit, // For when the query engulfs the target.  
+    Overlap,    // No gap penalty at the beginning of
+    // query, nor at the end of text **
+    // not yet implemented for k-band **, 
+    FrontAnchored, // Require the alignment to align
+    // pos 0,0 in the matrix 
+    EndAnchored,   // Require the alignment to align
+    // the pos m,n in the matrix 
+    // Score alignment types solely compute the score
+    // of an alignment and do not store the actual
+    // alignment itself.  This is fast for filtering
+    // potential alignments that may be re-aligned
+    // later to store the actual alignment.
+    Fit,  // No gap penalties at the beginning nor ends of alignments.
+    TSuffixQPrefix, // Same as overlap 
+    TPrefixQSuffix, // so that the order of the alignment does not have to be reversed
+    ScoreGlobal,
+    ScoreLocal,
+    ScoreQueryFit,
+    ScoreTargetFit,
+    ScoreOverlap,
+    ScoreFrontAnchored,
+    ScoreEndAnchored,
+    ScoreTSuffixQPrefix,
+    ScoreTPrefixQSuffix,
+    //
+    // A LocalBoundaries alignment is in-between a
+    // score-only and full-alignment. The full path
+    // matrix is computed, but rather 
+    // than computing an alignment, simply the  
+    // (qStart, qLength), (tStart, tLength)
+    // coordinates of the alignment are returned.  
+    //
+    LocalBoundaries,
+    //
+    // A SignificanceLimited alignment is a banded
+    // alignment that continues alignment until the
+    // score drops below a certain threshold below
+    // the maximum score.
+    //
+    SignificanceLimited
+};
+
+inline
+int ComputeAlignmentScore(
+        std::string& queryStr, std::string& textStr, 
+        int matchScores[5][5], int ins, int del);
+
+template<typename T_ScoreFn>
+inline
+int ComputeAlignmentScore(
+        std::string& queryStr, std::string& textStr, 
+        T_ScoreFn & scoreFn, bool useAffineScore = false);
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_ScoreFn>
+int ComputeAlignmentScore(blasr::Alignment& alignment,
+        T_QuerySequence& query,
+        T_TargetSequence& text,
+        T_ScoreFn& scoreFn,
+        bool useAffinePenalty = false);
+
+template<typename T_QuerySequence, typename T_TargetSequence>
+int ComputeAlignmentScore(blasr::Alignment &alignment,
+        T_QuerySequence &query,
+        T_TargetSequence &text,
+        int matchScores[5][5],
+        int ins,
+        int del);
+
+int GetNumberWidth(unsigned int value); 
+
+template<typename T_Alignment>
+inline void PrintCompareSequencesAlignmentStats(T_Alignment &alignment, std::ostream &out); 
+
+template<typename T_Alignment>
+inline int ReadCompareSequencesAlignmentStats(std::istream &in, T_Alignment &alignment); 
+
+template<typename T_Alignment>
+inline int ReadCompSeqAlignment(std::istream &in, T_Alignment &alignment); 
+
+/*
+ * This should be changed to read any type of alignment, since templates are being
+ * used.
+ */
+inline void ReadCompSeqAlignments(std::string &compSeqAlignmentFileName, std::vector<blasr::CompSeqAlignment> &alignments); 
+
+inline void PrintAlignmentStats(blasr::Alignment &alignment, std::ostream &out); 
+
+template<typename T_QuerySequence, typename T_TargetSequence>
+void  AppendGapCharacters(blasr::Gap &gap, 
+        T_QuerySequence &query, T_TargetSequence &text, 
+        DNALength &q, DNALength &t,
+        char mismatchChar, char gapChar,
+        std::string &textStr, std::string &alignStr, std::string &queryStr); 
+
+template<typename T_Alignment, typename T_QuerySequence, typename T_TargetSequence>
+void CreateAlignmentStrings(T_Alignment &alignment, 
+        T_QuerySequence &query, T_TargetSequence &text, 
+        std::string &textStr, std::string &alignStr, std::string &queryStr, DNALength queryLength=0, DNALength textLength=0); 
+
+template<typename T_Alignment, typename T_ScoreFn>
+void ComputeAlignmentStats(T_Alignment & alignment, Nucleotide* qSeq, Nucleotide * tSeq, T_ScoreFn & scoreFn, bool useAffineScore = false);
+ 
+template<typename T_Alignment>
+void ComputeAlignmentStats(T_Alignment &alignment, Nucleotide* qSeq, Nucleotide *tSeq, int matchMatrix[5][5], int ins, int del); 
+
+template<typename T_Alignment>
+int ComputeDrift(T_Alignment &alignment); 
+
+int ComputeDrift(blasr::Block &cur, blasr::Block &next); 
+
+template<typename T_Alignment>
+void RemoveAlignmentPrefixGaps(T_Alignment &alignment); 
+
+// QVsToCmpH5QVs converts the optional QVs read from a SAM file into something
+// that's ready to be written to the HDFArrays of a cmp.h5 file. This involves
+// two things: First, it needs to be converted from a std::string to a vector
+// of either chars or UChars. Second, it needs to have appropriate gap
+// characters inserted. The location of gaps if found using the byteAlignment.
+template<typename T>
+void QVsToCmpH5QVs(const std::string &fieldName, const std::string &qvs,
+                   const std::vector<unsigned char> &byteAlignment,
+                   bool isTag, std::vector<T> *gappedQVs);
+
+#include "AlignmentUtilsImpl.hpp"
+
+#endif // _BLASR_ALIGNMENT_UTILS_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/AlignmentUtilsImpl.hpp b/libcpp/alignment/algorithms/alignment/AlignmentUtilsImpl.hpp
new file mode 100644
index 0000000..30f434b
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/AlignmentUtilsImpl.hpp
@@ -0,0 +1,548 @@
+#ifndef _BLASR_ALIGNMENT_UTILS_IMPL_HPP_
+#define _BLASR_ALIGNMENT_UTILS_IMPL_HPP_
+
+#include <cassert>
+
+using namespace blasr;
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_ScoreFn>
+int ComputeAlignmentScore(Alignment &alignment,
+    T_QuerySequence &query,
+    T_TargetSequence &text,
+    T_ScoreFn &scoreFn,
+    bool useAffinePenalty) {
+  VectorIndex b, q, t, l, bi, gi;
+  int alignmentScore = 0;
+
+	for (b = 0; b < alignment.blocks.size(); b++ ) {
+		for ((q = alignment.qPos + alignment.blocks[b].qPos,
+					t = alignment.tPos + alignment.blocks[b].tPos,
+					l = 0) ; 
+				 l < alignment.blocks[b].length; q++, t++, l++) {
+			alignmentScore += scoreFn.Match(text, t, query, q);
+		}
+    if (alignment.gaps.size() == alignment.blocks.size() + 1) {
+      for (gi = 0; gi < alignment.gaps[b+1].size(); gi++) {
+        if (alignment.gaps[b+1][gi].seq == Gap::Target) {
+            if (useAffinePenalty) {
+                alignmentScore += scoreFn.affineOpen + alignment.gaps[b+1][gi].length * scoreFn.affineExtend;
+            }
+            else {
+                alignmentScore += alignment.gaps[b+1][gi].length * scoreFn.ins;
+            }
+        }
+        else {
+            if (useAffinePenalty) {
+                alignmentScore += scoreFn.affineOpen + alignment.gaps[b+1][gi].length * scoreFn.affineExtend;
+            }
+            else {
+                alignmentScore += alignment.gaps[b+1][gi].length * scoreFn.del;
+            }
+        }
+      }
+    }
+  }
+  return alignmentScore;
+}
+  
+template<typename T_QuerySequence, typename T_TargetSequence>
+int ComputeAlignmentScore(blasr::Alignment &alignment,
+        T_QuerySequence &query,
+        T_TargetSequence &text,
+        int matchScores[5][5],
+        int ins,
+        int del) {
+    DistanceMatrixScoreFunction<DNASequence, DNASequence> scoreFn(matchScores, ins, del);
+    return ComputeAlignmentScore(alignment, query, text, scoreFn);
+}
+
+template<typename T_ScoreFn>
+int ComputeAlignmentScore(std::string &queryStr, std::string &textStr, T_ScoreFn &scoreFn, 
+        bool useAffineScore) {
+    if (queryStr.size() != textStr.size()) {
+        std::cout << "Computing alignment score using invalid alignment string." << std::endl;
+        std::cout << "Bailing out."<< std::endl;
+        exit(1);
+    }
+    VectorIndex i;
+    int score = 0;
+    int alignStrLen = queryStr.size();
+    for(i = 0; i < alignStrLen; i++) {
+        if (queryStr[i] != '-' and
+            textStr[i] != '-') {
+            score += scoreFn.scoreMatrix[ThreeBit[(int)queryStr[i]]][ThreeBit[(int)textStr[i]]];
+        }
+        else {
+            if (useAffineScore) {
+                //
+                // Compute affine gap scoring.  For now this uses symmetric insertion/deletion penalties. 
+                //
+                int gapEnd = i;
+                while (gapEnd < queryStr.size() and gapEnd < textStr.size() and 
+                        (queryStr[gapEnd] == '-' or textStr[gapEnd] == '-')) {
+                    ++gapEnd;
+                }
+                int gapLength = gapEnd - i;
+                score += scoreFn.affineOpen + gapLength * scoreFn.affineExtend;
+                //
+                // Advance past gap -1, so that at the top of the for loop i
+                // will be at the end of the gap.
+                //
+                i = gapEnd - 1;
+            }
+            else {
+                //
+                // Use non-affine gap scoring.
+                //
+                if (queryStr[i] == '-' and textStr[i] != '-') {
+                    score += scoreFn.del;
+                }
+                else if (queryStr[i] != '-' and textStr[i] == '-') {
+                    score += scoreFn.ins;
+                }
+                else {
+                    score += scoreFn.scoreMatrix[4][4];
+                }
+            }
+        }
+    }
+    return score;
+}
+
+/*
+ * This should be changed to read any type of alignment, since templates are being
+ * used.
+ */
+inline void ReadCompSeqAlignments(std::string &compSeqAlignmentFileName, std::vector<CompSeqAlignment> &alignments) {
+    std::ifstream in;
+    CrucialOpen(compSeqAlignmentFileName, in);
+    CompSeqAlignment alignment;
+    while (ReadCompSeqAlignment(in, alignment)) {
+        alignments.push_back(alignment);
+    }
+}
+
+inline void PrintAlignmentStats(Alignment &alignment, std::ostream &out) {
+    out << "    nMatch: " << alignment.nMatch << std::endl;
+    out << " nMisMatch: " << alignment.nMismatch << std::endl;
+    out << "      nIns: " << alignment.nIns << std::endl;
+    out << "      nDel: " << alignment.nDel << std::endl;
+    out << "      %sim: " << alignment.pctSimilarity << std::endl;
+    out << "     Score: " << alignment.score << std::endl; 
+}
+
+template<typename T_Alignment>
+inline void PrintCompareSequencesAlignmentStats(T_Alignment &alignment, std::ostream &out) {
+    int lastBlock;
+
+    lastBlock = alignment.blocks.size() -1;
+
+    int qLength, tLength;
+    if (lastBlock >= 0) {
+        qLength = (alignment.blocks[lastBlock].qPos 
+                + alignment.blocks[lastBlock].length) ;
+        tLength =  (alignment.blocks[lastBlock].tPos 
+                + alignment.blocks[lastBlock].length);
+    }
+    else {
+        qLength = tLength = 0;
+    }
+
+    //
+    // First print the query 
+    //
+    int alignmentQStart;
+    if (lastBlock >= 0) {
+        alignmentQStart = alignment.qPos + alignment.qAlignedSeqPos;
+    }
+    else {
+        alignmentQStart = alignment.qAlignedSeqPos;
+    }
+    out << alignment.qName
+        << " " << alignment.qLength
+        << " " << alignmentQStart
+        << " " << alignmentQStart + qLength;
+
+    if (alignment.qStrand == 0) {
+        out << " + ";
+    }
+    else {
+        out << " - ";
+    }
+
+    int alignmentTStart;
+    if (lastBlock >= 0) {
+        alignmentTStart = alignment.tPos + alignment.tAlignedSeqPos;
+    }
+    else {
+        alignmentTStart = 0;
+    }
+    out << " " << alignment.tName 
+        << " " << alignment.tLength;
+    if (alignment.tStrand == 0) {
+        out << " " << alignmentTStart
+            << " " << alignmentTStart + tLength;
+        out << " + ";
+    }
+    else {
+        out	<< " " << alignment.tLength - (alignmentTStart + tLength)
+            << " " << alignment.tLength - (alignmentTStart);
+        out << " - ";
+    }
+
+    out << alignment.score 
+        << " " << alignment.nMatch 
+        << " " << alignment.nMismatch
+        << " " << alignment.nIns
+        << " " << alignment.nDel
+        << " " << (int) alignment.mapQV 
+        << " ";
+}
+
+template<typename T_Alignment>
+inline int ReadCompareSequencesAlignmentStats(std::istream &in, T_Alignment &alignment) {
+    int qEnd, tEnd;
+    int qLength, tLength;
+    char qStrand, tStrand;
+    if (!(in >> alignment.qName )) return 0;
+    if (!(in >> qLength)) return 0;
+    if (!(in >> alignment.qPos)) return 0;
+    if (!(in >> qEnd)) return 0;
+    if (!(in >> qStrand)) return 0;
+    if (!(in >> alignment.tName)) return 0;
+    if (!(in >> tLength)) return 0;
+    if (!(in >> alignment.tPos)) return 0;
+    if (!(in >> tEnd)) return 0;
+    if (!(in >> tStrand)) return 0;
+    if (!(in >> alignment.score)) return 0;
+    if (!(in >> alignment.nMatch)) return 0;
+    if (!(in >> alignment.nMismatch)) return 0;
+    if (!(in >> alignment.nIns)) return 0;
+    if (!(in >> alignment.nDel)) return 0;
+    return 1;
+}
+
+
+template<typename T_Alignment>
+inline int ReadCompSeqAlignment(std::istream &in, T_Alignment &alignment) {
+    if (!ReadCompareSequencesAlignmentStats(in, alignment)) return 0;
+    std::string alignStr;
+    if (!(in >> alignment.qString)) return 0;
+    if (!(in >> alignStr)) return 0;
+    if (!(in >> alignment.tString)) return 0;
+    std::string eol;
+    std::getline(in, eol);
+    return 1;
+}
+
+
+template<typename T_QuerySequence, typename T_TargetSequence>
+void  AppendGapCharacters(Gap &gap, 
+        T_QuerySequence &query, T_TargetSequence &text, 
+        DNALength &q, DNALength &t,
+        char mismatchChar, char gapChar,
+        std::string &textStr, std::string &alignStr, std::string &queryStr) {
+    int gp;
+    for (gp = 0; gp < gap.length; gp++) {
+        if (gap.seq == Gap::Query) {
+            textStr.push_back(text[t]);
+            alignStr.push_back(mismatchChar);
+            queryStr.push_back(gapChar);
+            t++;
+        }
+        else if (gap.seq == Gap::Target) {
+            textStr.push_back(gapChar);
+            alignStr.push_back(mismatchChar);
+            queryStr.push_back(query[q]);
+            q++;
+        }
+    }
+}
+
+template<typename T_Alignment, typename T_QuerySequence, typename T_TargetSequence>
+void CreateAlignmentStrings(T_Alignment &alignment, 
+        T_QuerySequence &query, T_TargetSequence &text, 
+        std::string &textStr, std::string &alignStr, std::string &queryStr, 
+        DNALength queryLength, DNALength textLength) {
+    DNALength q = alignment.qPos;
+    DNALength t = alignment.tPos;
+    DNALength qPos, tPos;
+    DNALength  g;
+    char mismatchChar = '*';
+    char matchChar = '|';
+    char gapChar = '-';
+    char gapSeparationChar = ' ';
+    if (alignment.blocks.size() == 0) {
+        textStr = "";
+        alignStr = "";
+        queryStr = "";
+        return;
+    }
+
+    if (alignment.gaps.size() == 0) {
+        //
+        // If there is no gap list, add the gaps as an offset here.
+        //
+        if (alignment.blocks[0].qPos > 0 or
+                alignment.blocks[0].tPos > 0) {
+            // commonGapLen should be the shorter gap.
+            qPos = alignment.blocks[0].qPos;
+            tPos = alignment.blocks[0].tPos;
+            DNALength commonGapLen = qPos;
+            if (commonGapLen > tPos) {
+                commonGapLen = tPos;
+            }
+            for (g = 0; g < commonGapLen; g++ ) {
+                textStr.push_back(text[t]);
+                alignStr.push_back(mismatchChar);
+                queryStr.push_back(query[q]);
+                t++;
+                q++;
+            }
+            tPos -= commonGapLen;
+            qPos -= commonGapLen;
+
+            //
+            // one of tPos or qPos is now 0.
+            // The other represents extra sequence
+            // that should be output before starting the alignment
+            DNALength p;
+            for (p = 0; p < tPos; p++) {
+                textStr.push_back(text[t]);
+                alignStr.push_back(gapSeparationChar);
+                queryStr.push_back(gapChar);
+                t++;
+            }
+            for (p = 0; p < qPos; p++) {
+                textStr.push_back(gapChar);
+                alignStr.push_back(gapSeparationChar);
+                queryStr.push_back(query[q]);
+                q++;
+            }
+        }
+    }
+
+    //
+    // Add gap characters if they are before the beginning of the alignment. 
+    // This shouldn't happen, but for some local alignments, it can.
+    //
+    DNALength b, bl, gi;
+    if (alignment.gaps.size() > 0) {
+        // The first gap is before the first block of characters.
+        DNALength gi;
+        for (gi = 0; gi < alignment.gaps[0].size(); gi++) {
+            AppendGapCharacters(alignment.gaps[0][gi], query, text, q, t, mismatchChar, gapChar, textStr, alignStr, queryStr);
+        }
+    }
+
+    for (b = 0; b < alignment.size() ; b++) {
+        for (bl = 0; bl < alignment.blocks[b].length; bl++ ) {
+            queryStr.push_back(query[q]);
+            textStr.push_back(text[t]);
+            assert(queryLength == 0 or q < queryLength);
+            assert(textLength == 0 or t < textLength);
+            if (TwoBit[query[q]] != 
+                    TwoBit[text[t]])
+                alignStr.push_back(mismatchChar);
+            else
+                alignStr.push_back(matchChar);
+            q++;
+            t++;
+        }
+        //
+        //  There are no gaps to count after the last block, so 
+        //  don't add the gapped characters for this.
+        //
+        if (alignment.blocks.size() == 0)
+            continue;
+        if (b == alignment.blocks.size() - 1) {
+            continue;
+        }
+        if (alignment.gaps.size() > 0) {
+            for (gi = 0; gi < alignment.gaps[b+1].size(); gi++) {
+                AppendGapCharacters(alignment.gaps[b+1][gi], query, text, q, t, gapSeparationChar, gapChar, textStr, alignStr, queryStr);
+            }
+        }
+        else {
+
+
+            DNALength queryGapLen = (alignment.blocks[b+1].qPos - 
+                    alignment.blocks[b].qPos - alignment.blocks[b].length);
+            DNALength textGapLen  = (alignment.blocks[b+1].tPos - 
+                    alignment.blocks[b].tPos - alignment.blocks[b].length);
+
+            if (queryGapLen > 0 or textGapLen > 0) {
+                // commonGapLen should be the shorter gap.
+                DNALength commonGapLen = queryGapLen; 
+                if (queryGapLen > textGapLen) {
+                    commonGapLen = textGapLen;
+                }
+                textGapLen -= commonGapLen;
+                queryGapLen -= commonGapLen;
+
+                for (g = 0; g < queryGapLen; g++, q++ ){
+                    textStr.push_back(gapChar);
+                    alignStr.push_back(gapSeparationChar);
+                    queryStr.push_back(query[q]);
+                }
+                for (g = 0; g < textGapLen; g++, t++ ){
+                    textStr.push_back(text[t]);
+                    alignStr.push_back(gapSeparationChar);
+                    queryStr.push_back(gapChar);
+
+                }
+
+                for (g = 0; g < commonGapLen; g++ ) {
+                    textStr.push_back(text[t]);
+                    alignStr.push_back(gapSeparationChar);
+                    queryStr.push_back(query[q]);
+                    t++;
+                    q++;
+                }
+            }
+        }
+    }
+}
+
+
+template<typename T_Alignment, typename T_ScoreFn>
+void ComputeAlignmentStats(T_Alignment & alignment, Nucleotide* qSeq, Nucleotide * tSeq, T_ScoreFn & scoreFn, bool useAffineScore) {
+    int qp = 0, tp = 0;
+    int nMatch = 0, nMismatch = 0, nIns =0, nDel = 0;
+    float pctSimilarity;
+    std::string textStr, alignStr, queryStr;
+    CreateAlignmentStrings(alignment, qSeq, tSeq, textStr, alignStr, queryStr);
+    int i;
+    int alignLength = textStr.size();
+
+    for (i = 0; i < alignLength; i++ ) {
+        if ((textStr[i] != '-') and (queryStr[i] != '-')) {
+            int ti = (int)textStr[i];
+            int qi = (int)queryStr[i];
+            if (ThreeBit[ti] == ThreeBit[qi]) {
+                nMatch++;
+            }
+            else {
+                nMismatch++;
+            }
+            tp++;
+            qp++;
+        }
+        else if (textStr[i] == '-' and queryStr[i] != '-') {
+            nIns++;
+            qp++;
+        }
+        else if (queryStr[i] == '-' and textStr[i] != '-') {
+            nDel++;
+            tp++;
+        }
+    }
+    if (tp + qp > 0) {
+        if (textStr.size() + queryStr.size() > 0) {
+            pctSimilarity = (nMatch*2.0) / (textStr.size() + queryStr.size()) * 100;
+        }
+        else {
+            pctSimilarity = 0;
+        }
+    }
+    else {
+        pctSimilarity = 0;
+    }
+
+    alignment.score = ComputeAlignmentScore(queryStr, textStr, scoreFn);
+    alignment.nMatch = nMatch;
+    alignment.nMismatch = nMismatch;
+    alignment.nDel = nDel;
+    alignment.nIns = nIns;
+    alignment.pctSimilarity = pctSimilarity;
+}
+
+template<typename T_Alignment>
+void ComputeAlignmentStats(T_Alignment &alignment, Nucleotide* qSeq, Nucleotide *tSeq, int matchMatrix[5][5], int ins, int del) {
+    DistanceMatrixScoreFunction<DNASequence, DNASequence> scoreFn(matchMatrix, ins, del);
+    ComputeAlignmentStats(alignment, qSeq, tSeq, scoreFn);
+}
+
+
+
+template<typename T_Alignment>
+int ComputeDrift(T_Alignment &alignment) {
+    VectorIndex b;
+    int qGap = 0, tGap = 0, commonGap = 0;
+    int drift = 0;
+    int maxDrift = 0;
+    int driftBetweenBlocks;
+    if (alignment.blocks.size() == 0)
+        return 0;
+    for (b = 0; b < alignment.blocks.size() - 1; b++) { 
+        driftBetweenBlocks = ComputeDrift(alignment.blocks[b], alignment.blocks[b+1]);
+        drift += driftBetweenBlocks;
+        if (abs(drift) > maxDrift) 
+            maxDrift = abs(drift);
+    }
+    return maxDrift;
+}
+
+template<typename T_Alignment>
+void RemoveAlignmentPrefixGaps(T_Alignment &alignment) {
+    if (alignment.gaps.size()  == 0) {
+        return;
+    }
+
+    unsigned int g;
+    int tStart = 0, qStart = 0;
+    for (g = 0; g < alignment.gaps[0].size(); g++) {
+        if (alignment.gaps[0][g].seq == Gap::Target) {
+            qStart += alignment.gaps[0][g].length;
+        }
+        else if (alignment.gaps[0][g].seq == Gap::Query) {
+            tStart += alignment.gaps[0][g].length;
+        }
+    }
+    int b;
+    int nBlocks;
+    for (b = 0, nBlocks = alignment.blocks.size(); b < nBlocks; b++) {
+        alignment.blocks[b].qPos -= qStart;
+        alignment.blocks[b].tPos -= tStart;
+    }
+    alignment.gaps[0].clear();
+    alignment.tPos += tStart;
+    alignment.qPos += qStart;
+}
+
+template<typename T>
+void QVsToCmpH5QVs(const std::string &qvs,
+                   const std::vector<unsigned char> &byteAlignment,
+                   bool isTag,
+                   std::vector<T> *gappedQVs) {
+    gappedQVs->clear();
+    
+    unsigned int qv_i = 0;
+    
+    // QVs and tags get different values at gaps in the read
+    char tagGapChar = 'N';
+    UChar qvGapChar = 255; 
+
+    for (int i=0; i<byteAlignment.size(); i++) {
+        if (byteAlignment[i] >> 4 == 0) { //Look at upper bits to get query char
+            if (isTag) {
+                gappedQVs->push_back(tagGapChar);
+            } else {
+                gappedQVs->push_back(qvGapChar);
+            }
+        } else {
+            if (isTag) {
+              //std::cout << "Pushing back " << (T)qvs[qv_i] << " for tag " << qvs[qv_i] << std::endl;
+              gappedQVs->push_back((T)qvs[qv_i]);        
+            } else {
+              //std::cout << "Pushing back " << (T)qvs[qv_i] - FASTQSequence::charToQuality << " for QV " << qvs[qv_i] << std::endl;
+              gappedQVs->push_back((T)qvs[qv_i] - FASTQSequence::charToQuality);
+            }
+              
+            qv_i++;
+        }
+    } 
+
+    assert(gappedQVs->size() == byteAlignment.size());
+}
+#endif
diff --git a/libcpp/alignment/algorithms/alignment/BaseScoreFunction.cpp b/libcpp/alignment/algorithms/alignment/BaseScoreFunction.cpp
new file mode 100644
index 0000000..339b454
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/BaseScoreFunction.cpp
@@ -0,0 +1,11 @@
+#include "BaseScoreFunction.hpp"
+
+BaseScoreFunction::BaseScoreFunction(int insP, int delP, int subPriorP, 
+        int delPriorP, int affineExtensionP, int affineOpenP)  {
+    ins = insP;
+    del = delP;
+    substitutionPrior = subPriorP;
+    globalDeletionPrior = delPriorP;
+    affineExtend = affineExtensionP;
+    affineOpen = affineOpenP;
+}
diff --git a/libcpp/alignment/algorithms/alignment/BaseScoreFunction.hpp b/libcpp/alignment/algorithms/alignment/BaseScoreFunction.hpp
new file mode 100644
index 0000000..1d5c35c
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/BaseScoreFunction.hpp
@@ -0,0 +1,17 @@
+#ifndef _BLASR_BASE_SCORE_FUNCTION_HPP_
+#define _BLASR_BASE_SCORE_FUNCTION_HPP_
+
+class BaseScoreFunction {
+    public:
+        int ins;
+        int del;
+        int substitutionPrior;
+        int globalDeletionPrior;
+        int affineExtend;
+        int affineOpen;
+
+        BaseScoreFunction(int insP = 0, int delP = 0, int subPriorP = 0, 
+            int delPriorP = 0, int affineExtensionP = 0, int affineOpenP = 0); 
+};
+
+#endif // _BLASR_BASE_SCORE_FUNCTION_HPP_`
diff --git a/libcpp/alignment/algorithms/alignment/DistanceMatrixScoreFunction.hpp b/libcpp/alignment/algorithms/alignment/DistanceMatrixScoreFunction.hpp
new file mode 100644
index 0000000..ed932ab
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/DistanceMatrixScoreFunction.hpp
@@ -0,0 +1,40 @@
+#ifndef _BLASR_DISTANCE_MATRIX_SCORE_FUNCTION_HPP_
+#define _BLASR_DISTANCE_MATRIX_SCORE_FUNCTION_HPP_
+
+#include "BaseScoreFunction.hpp"
+#include "ScoreMatrices.hpp"
+
+template<typename T_RefSequence, typename T_QuerySequence>
+class DistanceMatrixScoreFunction : public BaseScoreFunction {
+public:
+    int scoreMatrix[5][5];
+    DistanceMatrixScoreFunction();
+
+    DistanceMatrixScoreFunction(int scoreMatrixP[5][5], int insertionP, int deletionP);
+
+    void InitializeScoreMatrix(int scoreMatrixP[5][5]);
+
+    int Deletion(T_RefSequence &seq, DNALength pos, T_QuerySequence &querySeq, DNALength queryPos); 
+
+    int Insertion(T_RefSequence &seq, DNALength pos, T_QuerySequence &querySeq, DNALength queryPos);
+
+    int Deletion(T_RefSequence &seq, DNALength pos); 
+
+    int Match(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos); 
+
+    //
+    // Define the score function on dereferenced pointers for speed.
+    //
+    int Match(Nucleotide ref, Nucleotide query); 
+
+    int Insertion(T_QuerySequence &seq, DNALength pos); 
+
+    float NormalizedMatch(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos);
+    float NormalizedInsertion(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos);
+    float NormalizedDeletion(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos);
+
+};
+
+#include "DistanceMatrixScoreFunctionImpl.hpp"
+
+#endif // _BLASR_DISTANCE_MATRIX_SCORE_FUNCTION_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/DistanceMatrixScoreFunctionImpl.hpp b/libcpp/alignment/algorithms/alignment/DistanceMatrixScoreFunctionImpl.hpp
new file mode 100644
index 0000000..97bacad
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/DistanceMatrixScoreFunctionImpl.hpp
@@ -0,0 +1,96 @@
+#ifndef _BLASR_DISTANCE_MATRIX_SCORE_FUNCTION_IMPL_HPP_
+#define _BLASR_DISTANCE_MATRIX_SCORE_FUNCTION_IMPL_HPP_
+#include <string>
+#include <iostream>
+#include <stdint.h>
+#include <string>
+#include <cstring>
+#include <ostream>
+#include "Types.h"
+#include "NucConversion.hpp"
+#include "Enumerations.h"
+#include "DNASequence.hpp"
+#include "FASTASequence.hpp"
+#include "FASTQSequence.hpp"
+#include "DistanceMatrixScoreFunction.hpp"
+
+template<typename T_RefSequence, typename T_QuerySequence>
+void DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::InitializeScoreMatrix(int scoreMatrixP[5][5]) {
+    int i, j;
+    for (i = 0; i < 5; i++ ){ 
+        for (j = 0; j < 5; j++ ){
+            scoreMatrix[i][j] = scoreMatrixP[i][j];
+        }
+    }
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::DistanceMatrixScoreFunction() : BaseScoreFunction() {
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::DistanceMatrixScoreFunction(int scoreMatrixP[5][5], int insertionP, int deletionP) : BaseScoreFunction() {
+    InitializeScoreMatrix(scoreMatrixP);
+    ins = insertionP;
+    del = deletionP;
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::Deletion(
+    T_RefSequence &seq, DNALength pos, T_QuerySequence &querySeq, 
+    DNALength queryPos) {
+    return del;
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::Insertion(
+    T_RefSequence &seq, DNALength pos, T_QuerySequence &querySeq, 
+    DNALength queryPos) {
+    return ins;
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::Deletion(
+    T_RefSequence &seq, DNALength pos) {
+    return del;
+}
+
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::Match(
+    T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, 
+    DNALength queryPos) {
+    return scoreMatrix[ThreeBit[ref[refPos]]][ThreeBit[query[queryPos]]];		
+}
+
+//
+// Define the score function on dereferenced pointers for speed.
+//
+template<typename T_RefSequence, typename T_QuerySequence>
+int DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::Match(
+    Nucleotide ref, Nucleotide query) {
+    return scoreMatrix[ThreeBit[ref]][ThreeBit[query]];
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::Insertion(
+    T_QuerySequence &seq, DNALength pos) {
+    return ins;
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+float 
+DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>
+::NormalizedMatch(T_RefSequence &ref, DNALength refPos, 
+    T_QuerySequence &query, DNALength queryPos) {return 0;}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+float DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>
+::NormalizedInsertion(T_RefSequence &ref, DNALength refPos, 
+    T_QuerySequence &query, DNALength queryPos) {return 0;}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+float DistanceMatrixScoreFunction<T_RefSequence,T_QuerySequence>::NormalizedDeletion(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos) {return 0;}
+
+
+#endif // _BLASR_DISTANCE_MATRIX_SCORE_FUNCTION_IMPL_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/ExtendAlign.cpp b/libcpp/alignment/algorithms/alignment/ExtendAlign.cpp
new file mode 100644
index 0000000..1a17664
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/ExtendAlign.cpp
@@ -0,0 +1,79 @@
+#include "ExtendAlign.hpp"
+
+RCToIndex::RCToIndex() {
+    qStart = 0; tStart = 0;
+    band = middleCol = nCols = 0;
+}
+
+int RCToIndex::operator()(int r, int c, int &index) {
+    //
+    // First do some error checking on the row and column to see if it
+    // is within the band.
+    //
+    if (r < qStart) { return 0; }
+    if (c < tStart) { return 0; }
+    r -= qStart;
+    c -= tStart;
+    if (std::abs(r-c) > band) { return 0; } // outside band range.
+    if (c < 0) { return 0; }
+
+    if (middleCol - (r - c) >= nCols) { return  0; }
+    index = (r*nCols) + (middleCol - (r - c));
+    return 1;
+}
+
+int BaseIndex::QNotAtSeqBoundary(int q) {
+    return q != queryAlignLength;
+}
+int BaseIndex::TNotAtSeqBoundary(int t) {
+    return t != refAlignLength;
+}	
+int BaseIndex::QAlignLength() {
+    return queryAlignLength;
+}
+
+int BaseIndex::TAlignLength() {
+    return refAlignLength;
+}
+
+
+int ForwardIndex::QuerySeqPos(int q) {
+    return queryPos + q;
+}
+
+int ForwardIndex::RefSeqPos(int t) {
+    return refPos + t;
+}
+
+int ForwardIndex::GetQueryStartPos(int startQ, int endQ) {
+    return queryPos + startQ + 1;
+}
+
+int ForwardIndex::GetRefStartPos(int startT, int endT) {
+    return refPos + startT + 1;
+}
+
+void ForwardIndex::OrderArrowVector(std::vector<Arrow> &mat) {
+    reverse(mat.begin(), mat.end());
+}
+
+
+int ReverseIndex::QuerySeqPos(int q) {
+    return queryPos - q;
+}
+
+int ReverseIndex::RefSeqPos(int t) {
+    return refPos - t;
+}
+
+int ReverseIndex::GetQueryStartPos(int startQ, int endQ) {
+    return queryPos - (endQ-1);
+}
+
+int ReverseIndex::GetRefStartPos(int startT, int endT) {
+    return refPos - (endT-1);
+}
+
+void ReverseIndex::OrderArrowVector(std::vector<Arrow> &mat) {
+}
+
diff --git a/libcpp/alignment/algorithms/alignment/ExtendAlign.hpp b/libcpp/alignment/algorithms/alignment/ExtendAlign.hpp
new file mode 100644
index 0000000..a5430bc
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/ExtendAlign.hpp
@@ -0,0 +1,416 @@
+#ifndef _BLASR_EXTEND_ALIGN_HPP_
+#define _BLASR_EXTEND_ALIGN_HPP_
+
+#include <vector>
+#include <algorithm>
+#include "defs.h"
+#include "KBandAlign.hpp"
+#include "NucConversion.hpp"
+#include "matrix/FlatMatrix.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+
+class RCToIndex {
+public:
+    int qStart, tStart;
+    int middleCol;
+    int band;
+    int nCols;
+
+    RCToIndex(); 
+
+    int operator()(int r, int c, int &index); 
+};
+
+class BaseIndex {
+public:
+    int queryPos, refPos;
+    int queryAlignLength, refAlignLength;
+
+    int QNotAtSeqBoundary(int q); 
+
+    int TNotAtSeqBoundary(int t); 
+
+    int QAlignLength(); 
+
+    int TAlignLength(); 
+};
+
+class ForwardIndex : public BaseIndex {
+public:
+
+    int QuerySeqPos(int q); 
+
+    int RefSeqPos(int t); 
+
+    int GetQueryStartPos(int startQ, int endQ); 
+
+    int GetRefStartPos(int startT, int endT); 
+
+    void OrderArrowVector(std::vector<Arrow> &mat); 
+};
+
+
+class ReverseIndex : public BaseIndex {
+public:
+
+    int QuerySeqPos(int q); 
+
+    int RefSeqPos(int t); 
+
+    int GetQueryStartPos(int startQ, int endQ); 
+
+    int GetRefStartPos(int startT, int endT); 
+
+    void OrderArrowVector(std::vector<Arrow> &mat); 
+};
+
+template<typename T_Alignment, 
+    typename T_ScoreFn, 
+    typename T_QuerySeq, 
+    typename T_RefSeq, 
+    typename T_Index>
+    int ExtendAlignment(T_QuerySeq &querySeq, int queryPos, 
+            T_RefSeq   &refSeq,   int refPos,
+            int k,
+            std::vector<int>   &scoreMat,
+            std::vector<Arrow> &pathMat,
+            T_Alignment   &alignment,
+            T_ScoreFn     &scoreFn,
+            T_Index  &index,
+            int minExtendNBases=1, // Require that there
+            // are more than one
+            // base to align.
+            int maxNDrops=2 // A drop is a row where
+            // the alignment is
+            // extended without
+            // increasing the alignment
+            // score.  maxnDrops is the
+            // maximum number of times
+            // that one may have before
+            // terminating the alignment
+            // 
+            ) {
+        //
+        // Try extending an alignment in the forward direction as long the
+        // maximum score that is extended is above a threshold above the
+        // initial score.  This dynamically grows the alignment matrices as
+        // the alignment is extended (or the limits of the alignment
+        // matrices since reusable buffers are used).   
+        // 
+
+        int nCols = 2 * k + 1 + 1;  // 2*k is for search space, +1 is for the
+        // middle band, and the last +1 is for the
+        // boundary conditions at the beginning of
+        // the array.
+
+        RCToIndex rcToIndex;
+        rcToIndex.band      = k;
+        rcToIndex.nCols     = nCols;
+        rcToIndex.middleCol = k+2-1;
+
+        if (index.queryAlignLength  < minExtendNBases or
+                index.refAlignLength < minExtendNBases) {
+            //
+            // One of the sequences isn't long enough to even try to extend,
+            // just bail with an empty alignment.
+            //
+            return 0;
+        }
+
+        //
+        // Preallocate arrays to be at least k long.  The full matrix may
+        // not be loaded.
+        //
+        int matSize = nCols * (k+1);
+        if (scoreMat.size() < nCols * (k+1)) {
+            scoreMat.resize(nCols * (k+1));
+            pathMat.resize(nCols * (k+1));
+        }
+
+        //
+        // Initialize boundary conditions.
+        //
+
+        int q, t;
+        // Initialize first column for insertions.
+        int firstIndex;
+        fill(scoreMat.begin(), scoreMat.begin() + matSize, 0);
+        fill(pathMat.begin(), pathMat.begin() + matSize, NoArrow);	
+        rcToIndex(0, 0, firstIndex);
+        scoreMat[firstIndex] = 0;
+        pathMat[firstIndex]  = NoArrow;
+
+        // Initialize insertion penalties.
+        t = 0;
+        int i;
+        int pi;
+        for (q = 1; q <= k and index.QNotAtSeqBoundary(q-1); q++) {
+            bool res = rcToIndex(q, t, i);
+            assert(res);
+            res = rcToIndex(q-1, t, pi);
+            int qSeqPos = index.QuerySeqPos(q-1);
+            scoreMat[i] = scoreMat[pi] + scoreFn.Insertion(querySeq, qSeqPos);
+            pathMat[i]  = Up;
+            //		cout << "initializing insertion gap penalty for " << q << " " << refPos-1 << " "  << i << " " << scoreMat[i] << endl;
+        }
+
+
+        // Initialize the first row for deletions.
+        q = 0;
+
+        for (t = 1; t <= k and index.TNotAtSeqBoundary(t-1); t++) {
+            bool res = rcToIndex(q, t, i);
+            assert(res);
+            int previ;
+            res = rcToIndex(q,t-1,previ);
+
+            int qSeqPos = index.QuerySeqPos(0);
+            scoreMat[i] = scoreMat[previ] + scoreFn.Deletion(querySeq, qSeqPos);
+            pathMat[i]  = Left;
+            //		cout << "initializing deletion gap penalty for " << ((int)queryPos)-1 << " " << t << " " << i << " " << scoreMat[i] << endl;
+        }
+        /*	PrintFlatMatrix(&scoreMat[0], k , nCols, cout);
+            cout << endl;
+            PrintFlatMatrix(&pathMat[0],  k, nCols, cout);
+            cout << endl;
+            */
+        int nDrops = 0;
+        int prevRowMinScore = INF_INT;
+        int globalMinScore = INF_INT;
+        int globalMinScoreQPos = 0;
+        int globalMinScoreTPos = 0;
+
+        int curIndex = -1;
+
+        int maxAlignLength = std::min(index.QAlignLength(), index.TAlignLength()) + maxNDrops;
+
+        for (q = 1; (index.QNotAtSeqBoundary(q-1) and 
+                    nDrops < maxNDrops and
+                    q < maxAlignLength);
+                q++ ) {
+
+            //
+            // Grow the path and score matrices by another row if this has
+            // extended beyond their current capacity.
+            //
+            if ((q+1) * nCols > scoreMat.size()) {
+                scoreMat.resize((q+1)*nCols);
+                pathMat.resize((q+1)*nCols);
+            }
+
+            //
+            // Now score the latest row.
+            //
+            int curRowMinScore = INF_INT;	
+            int diagLength = q;
+
+            int tStart = std::max((int) 1, ((int)diagLength) - k);
+            int tEnd   = std::min((int) (diagLength + k +1), index.TAlignLength() + 1 );
+            int qSeqPos, tSeqPos;
+            for (t = tStart; t < std::min(tEnd, maxAlignLength); t++) {
+                int insIndex, delIndex, matchIndex;
+
+                bool hasInsIndex = false, hasDelIndex = false, hasMatchIndex = false, hasCurIndex = false;
+
+                hasCurIndex   = rcToIndex(q, t, curIndex);
+                assert(hasCurIndex);
+
+                hasDelIndex   = rcToIndex(q, t - 1, delIndex);
+                hasInsIndex   = rcToIndex(q - 1, t, insIndex);
+                hasMatchIndex = rcToIndex(q-1, t-1, matchIndex);
+
+                int insScore, delScore, matchScore;
+                delScore   = INF_INT;
+                insScore   = INF_INT;
+                matchScore = INF_INT;
+                //			cout << "ins index: " << insIndex << " del: " << delIndex << " match index " << matchIndex << endl;
+                qSeqPos = index.QuerySeqPos(q-1); // The offset is to allow for the boundary buffer.
+                tSeqPos = index.RefSeqPos(t-1); // ditto.
+                /*			if (scoreMat[insIndex] == -1) {
+                            cout << "bleh" << endl;
+                            }
+                            if (scoreMat[matchIndex] == -1) {
+                            cout << "bleh" << endl;
+                            }
+                            if (scoreMat[delIndex] == -1) {
+                            cout << "bleh" << endl;
+                            }
+
+                            if (scoreFn.Insertion(refSeq, (DNALength) tSeqPos, querySeq, (DNALength) qSeqPos) == -1) {
+                            cout << "bleh" << endl;
+                            }
+                            if (scoreFn.Deletion(refSeq, (DNALength) tSeqPos, querySeq, (DNALength) qSeqPos) == -1) {
+                            cout << "ugh" << endl;
+                            }
+                            if ( scoreFn.Match(refSeq, (DNALength) tSeqPos, querySeq, (DNALength) qSeqPos) == -1) {
+                            cout <<" gah" << endl;
+                            }*/
+
+                if (hasInsIndex) {
+                    insScore   = scoreMat[insIndex] + scoreFn.Insertion(refSeq, (DNALength) tSeqPos, querySeq, (DNALength) qSeqPos);
+                }
+                if (hasDelIndex) {
+                    delScore   = scoreMat[delIndex] + scoreFn.Deletion(refSeq, (DNALength) tSeqPos, querySeq, (DNALength) qSeqPos);
+                }
+                if (hasMatchIndex) {
+                    matchScore = scoreMat[matchIndex] + scoreFn.Match(refSeq, (DNALength) tSeqPos, querySeq, (DNALength) qSeqPos);
+                }
+                /*			cout << "ins score: " << insScore << "[" << scoreMat[insIndex] << "] del score " << delScore 
+                            << " [" << scoreMat[delIndex] << "] match score " << matchScore 
+                            << " [" << scoreMat[matchIndex] << "] qchar " << (int) querySeq.seq[qSeqPos] << " tchar " << (int) refSeq.seq[tSeqPos] << endl;*/
+                int minScore = std::min(matchScore, delScore);
+                minScore = std::min(minScore, insScore);
+                scoreMat[curIndex] = minScore;
+                //			cout << "extend: " << qSeqPos << " " << tSeqPos << " " << minScore << endl;
+                if (minScore != INF_INT) {
+                    if (minScore == insScore)   { pathMat[curIndex] = Up; }
+                    if (minScore == delScore)   { pathMat[curIndex] = Left; }
+                    if (minScore == matchScore) { pathMat[curIndex] = Diagonal; }
+                }
+                else {
+                    pathMat[curIndex] = NoArrow;
+                }
+
+                assert(pathMat[curIndex] != NoArrow);
+                if (minScore < curRowMinScore) {
+                    curRowMinScore = minScore;
+                }
+                int nRows = q+1;
+                if (minScore < globalMinScore) {
+                    globalMinScore = minScore;
+                    globalMinScoreQPos  = q;
+                    globalMinScoreTPos  = t;
+                }
+
+            }
+
+            if (curRowMinScore > prevRowMinScore) {
+                nDrops++;
+            }
+            prevRowMinScore = curRowMinScore;
+        }
+
+        int nRows = q;
+
+        q = globalMinScoreQPos;
+        t = globalMinScoreTPos;
+        std::vector<Arrow>  optAlignment;
+
+        rcToIndex(q,t,i);
+        //
+        // When the optimal score is on a cell with NoArrow, there is no
+        // good alignment.  Only try and trace an alignment out if the path
+        // starts on a good alignment.
+        //
+        if (pathMat[i] != NoArrow) {
+            while(q > 0 or t > 0) {
+                int res;
+                res = rcToIndex(q, t, i);
+                assert(res != 0);
+                Arrow arrow = pathMat[i];
+
+                optAlignment.push_back(pathMat[i]);
+                if (pathMat[i] == NoArrow) {
+                    assert(pathMat[i] != NoArrow);
+                }
+                if (arrow == Diagonal) {
+                    q--;
+                    t--;
+                }
+                else if (arrow == Left) {
+                    t--;
+                }
+                else if (arrow == Up) {
+                    q--;
+                }
+            }
+        }
+
+        index.OrderArrowVector(optAlignment);
+        alignment.ArrowPathToAlignment(optAlignment);
+        alignment.qPos = index.GetQueryStartPos(q, globalMinScoreQPos);
+        alignment.tPos = index.GetRefStartPos(t, globalMinScoreTPos);
+
+        return globalMinScore;
+    }
+
+template<typename T_Alignment, typename T_ScoreFn, typename T_QuerySeq, typename T_RefSeq>
+int ExtendAlignmentForward(T_QuerySeq &querySeq, int queryPos, 
+        T_RefSeq   &refSeq,   int refPos,
+        int k,
+        std::vector<int>   &scoreMat,
+        std::vector<Arrow> &pathMat,
+        T_Alignment   &alignment,
+        T_ScoreFn     &scoreFn,
+        int minExtendNBases=1, // Require that there
+        // are more than one
+        // base to align.
+        int maxNDrops=2 // A drop is a row where
+        // the alignment is
+        // extended without
+        // increasing the alignment
+        // score.  maxnDrops is the
+        // maximum number of times
+        // that one may have before
+        // terminating the alignment
+        // 
+        ) {
+
+    ForwardIndex forwardIndex;
+    forwardIndex.queryPos = queryPos;
+    forwardIndex.refPos   = refPos;
+    //
+    // The alignment does not include queryPos nor refPos.
+    //
+    forwardIndex.queryAlignLength = querySeq.length - queryPos;
+    forwardIndex.refAlignLength   = refSeq.length - refPos;
+    int alignScore;
+    alignScore= ExtendAlignment(querySeq, queryPos, 
+            refSeq, refPos, 
+            k, 
+            scoreMat, pathMat, 
+            alignment, scoreFn, forwardIndex, minExtendNBases, maxNDrops);
+    alignment.qPos = queryPos;
+    alignment.tPos = refPos;
+    return alignScore;
+}
+
+template<typename T_Alignment, typename T_ScoreFn, typename T_QuerySeq, typename T_RefSeq>
+int ExtendAlignmentReverse(T_QuerySeq &querySeq, int queryPos, 
+        T_RefSeq   &refSeq,   int refPos,
+        int k,
+        std::vector<int>   &scoreMat,
+        std::vector<Arrow> &pathMat,
+        T_Alignment   &alignment,
+        T_ScoreFn     &scoreFn,
+        int minExtendNBases=1, // Require that there
+        // are more than one
+        // base to align.
+        int maxNDrops=2 // A drop is a row where
+        // the alignment is
+        // extended without
+        // increasing the alignment
+        // score.  maxnDrops is the
+        // maximum number of times
+        // that one may have before
+        // terminating the alignment
+        // 
+        ) {
+
+    ReverseIndex reverseIndex;
+    reverseIndex.queryPos = queryPos-1;
+    reverseIndex.refPos   = refPos-1;
+    reverseIndex.queryAlignLength = queryPos;
+    reverseIndex.refAlignLength   = refPos;
+    int alignScore;
+    alignScore = ExtendAlignment(querySeq, queryPos, 
+            refSeq, refPos, 
+            k, 
+            scoreMat, pathMat, 
+            alignment, scoreFn, reverseIndex, minExtendNBases, maxNDrops);
+
+    return alignScore;
+
+}
+
+#endif // _BLASR_EXTEND_ALIGN_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/FullQVAlign.hpp b/libcpp/alignment/algorithms/alignment/FullQVAlign.hpp
new file mode 100644
index 0000000..a49395c
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/FullQVAlign.hpp
@@ -0,0 +1,132 @@
+#ifndef _BLASR_FULL_QV_ALIGN_HPP_
+#define _BLASR_FULL_QV_ALIGN_HPP_
+
+#include "matrix/Matrix.hpp"
+#include "FASTQSequence.hpp"
+#include "FASTASequence.hpp"
+
+template<typename T_Query, typename T_Reference>
+double FullQVAlign(T_Query       &query,
+        T_Reference   &target,
+        Matrix<double> &alignProb) {
+
+    alignProb.Resize(query.length + 1, target.length + 1);
+    alignProb.Initialize(0);
+
+    DNALength q, t;
+
+    if (query.length == 0 or target.length == 0) { return 0; }
+
+    // Initialize boundaries of ins/del/match probability matrices.
+    q = 0;
+    VectorIndex numCols = target.length + 1;
+    VectorIndex numRows = query.length + 1;
+    alignProb[0][0] = 1;
+    for (t = 1; t < numCols; t++ ) {
+        // cannot match to a gap
+        alignProb[0][t] = log(target.GetInsertionQV(t-1)) + alignProb[0][t-1];
+    }	
+
+    for (q = 1; q < numRows; q++) {
+        alignProb[q][0] = log(query.GetInsertionQV(q-1))  + alignProb[q-1][0];
+    }
+
+    // Now compute probability of alignment with the Forward algorithm.
+    for (q = 1; q < numRows; q++) {
+        for (t = 1; t < numCols; t++) {
+            // First compute p_ins[q,t] as transitions from match matrix
+
+            double logMatchedPulseProb  = 0;
+            double logInsertedPulseProb = 0;
+            double logDeletedPulseProb  = 0;
+
+
+            //
+            // Use inefficient coding for now.
+            //
+
+            // Compute match, the bases are either the same, in which case
+            // this is simply the product of the probabilities of the two
+            // matches.  Otherwise, either one of the pulses may be correct,
+            // and the probability is the union of the two cases.
+            // 
+
+            double matchedPulseProb;
+
+            if (query.seq[q-1] == target.seq[t-1]) {
+                matchedPulseProb = (1-query.GetSubstitutionQV(q-1)) * (1-target.GetSubstitutionQV(t-1));
+            }
+            else {
+                matchedPulseProb = (query.GetSubstitutionQV(q-1)/3.0)*(1-target.GetSubstitutionQV(t-1)) +
+                    ((1-query.GetSubstitutionQV(q-1)))*(target.GetSubstitutionQV(t-1)/3.0);
+            }
+
+            matchedPulseProb = exp(alignProb[q-1][t-1])*matchedPulseProb;
+            // 
+            // An insertion in the query can be either a normal extra base
+            // in the query, or a deletion in the reference.
+            //
+            //			logInsertedPulseProb = uery.GetInsertionQV(q-1)) + alignProb[q-1][t];
+
+            double insertedPulseProb = 0;
+            if (target.GetDeletionTag(t-1) != 'N') {
+                //
+                // The target has a pulse that was not strong enough to call a
+                // real incorporation.  For now assume that the weak pulse is
+                // the previous nucleotide in the query.  So the likelihood of
+                // the weak pulse is influenced by the likelihood of the
+                // previous nucleotide in the query. 
+                //
+                // Also, we only consider the previous base to be a missed
+                // weak pulse if the current base is a match. 
+                //
+
+                if (q > 1) {
+                    insertedPulseProb = 
+                        (target.GetPreBaseDeletionQV(t-1, query.seq[q-2]) *target.GetDeletionQV(t-1)
+                         + query.GetInsertionQV(q-1)) 
+                        * exp(alignProb[q-1][t]);
+                }
+                else {
+                    //
+                    // There can be no pre-base deletion tag here (could probably be an assert statement).
+                    //
+                    insertedPulseProb = query.GetInsertionQV(q-1)  * exp(alignProb[q-1][t]);
+                }
+            }
+            else {
+                insertedPulseProb = (query.GetInsertionQV(q-1) + target.GetDeletionQV(t-1))*exp(alignProb[q-1][t]);
+            }
+
+            //
+            // An insertion in the target may be either a normal extra base
+            // in the target, or a deletion in the query.
+            //			logDeletedPulseProb = target.GetInsertionQV(t-1)) + alignProb[q][t-1];
+            double deletedPulseProb = 0;
+            if (query.GetDeletionTag(q-1) != 'N') {
+                if (t > 1) {
+                    deletedPulseProb = (query.GetPreBaseDeletionQV(q-1, target.seq[t-2]) * query.GetDeletionQV(q-1) 
+                            + target.GetInsertionQV(t-1))*exp(alignProb[q][t-1]);
+                }
+                else {
+                    // There was a dropped pulse before this position, but nothing to align it to.  
+                    deletedPulseProb = target.GetInsertionQV(t-1) * exp(alignProb[q][t-1]);
+                }
+            }
+            else {
+                deletedPulseProb =  (target.GetInsertionQV(t-1) + query.GetDeletionQV(q-1)) *exp(alignProb[q][t-1]);
+            }
+
+            // Determine the total probability of reaching this position.
+            /*			cout << "align prob " << q << " " << t << " " <<  logMatchedPulseProb << " " 
+                        <<  logInsertedPulseProb << " " <<  logDeletedPulseProb << endl;*/
+            alignProb[q][t] = log(matchedPulseProb + insertedPulseProb + deletedPulseProb);
+        }
+    }
+    double fullAlignProb = alignProb[numRows-1][numCols-1];
+    alignProb.Free();
+    return fullAlignProb;
+}
+
+
+#endif // _BLASR_FULL_QV_ALIGN_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/GraphPaper.hpp b/libcpp/alignment/algorithms/alignment/GraphPaper.hpp
new file mode 100644
index 0000000..ddd1a4e
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/GraphPaper.hpp
@@ -0,0 +1,31 @@
+#ifndef GRAPH_PAPER_HPP_
+#define GRAPH_PAPER_HPP_
+
+#include "datastructures/alignment/Path.h"
+#include "matrix/FlatMatrix.hpp"
+
+template<typename T_Point>
+bool SetBounds(vector<T_Point> &points, 
+               DNALength &minPos, 
+               DNALength &maxPos, 
+               int axis);
+
+inline int GetIndex(DNALength pos, 
+                    DNALength minPos, 
+                    DNALength maxPos, 
+                    int nBins);
+
+template<typename T_Point>
+int GraphPaper(vector<T_Point> &points, 
+               int nRows, int nCols,
+               FlatMatrix2D<int> &bins,
+               FlatMatrix2D<int> &scoreMat,
+               FlatMatrix2D<Arrow> &pathMat,
+               vector<bool> &onOptPath);
+
+template<typename T_Point>
+void RemoveOffOpt(vector<T_Point> &points, vector<bool> &optPath);
+
+#include "GraphPaperImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/alignment/GraphPaperImpl.hpp b/libcpp/alignment/algorithms/alignment/GraphPaperImpl.hpp
new file mode 100644
index 0000000..c57d5a8
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/GraphPaperImpl.hpp
@@ -0,0 +1,175 @@
+#ifndef GRAPH_PAPER_IMPL_HPP_
+#define GRAPH_PAPER_IMPL_HPP_
+
+template<typename T_Point>
+bool SetBounds(vector<T_Point> &points, DNALength &minPos, DNALength &maxPos, int axis) {
+  int i;
+  DNALength maxRow = 0;
+  if (points.size() == 0) {
+    return false;
+  }
+  else {
+    if (axis == 0) {
+      minPos = maxPos = points[0].GetX();
+    }
+    else {
+      minPos = maxPos = points[0].GetY();
+    }
+  }
+  for (i = 1; i < points.size(); i++) {
+    DNALength curPos;
+    if (axis == 0) {
+      curPos = points[i].GetX();
+    }
+    else {
+      curPos = points[i].GetY();
+    }
+    if (curPos < minPos) {
+      minPos = curPos;
+    }
+    else if (curPos > maxPos) {
+      maxPos = curPos;
+    }
+  }
+}
+
+
+inline int GetIndex(DNALength pos, DNALength minPos, DNALength maxPos, int nBins) {
+  assert(maxPos != minPos);
+  float diff = pos - minPos;
+  float len  = maxPos - minPos;
+  float ratio = diff/len;
+  return   min((DNALength)(nBins-1), 
+               ((DNALength)(ratio * nBins)));
+}
+
+template<typename T_Point>
+int GraphPaper(vector<T_Point> &points, 
+               int nRows, int nCols,
+               FlatMatrix2D<int> &bins,
+               FlatMatrix2D<int> &scoreMat,
+               FlatMatrix2D<Arrow> &pathMat,
+               vector<bool> &onOptPath) {
+
+  bins.Resize(nRows, nCols);
+	bins.Fill(0);
+  scoreMat.Resize(nRows+1, nCols+1);
+  pathMat.Resize(nRows+1, nCols+1);
+  scoreMat.Fill(0);
+  pathMat.Fill(NoArrow);
+  onOptPath.resize(points.size());
+  fill(onOptPath.begin(), onOptPath.end(), false);
+
+  DNALength xMin, xMax, yMin, yMax;
+  SetBounds(points, xMin, xMax, 0); 
+  xMax++; // make half-open interval.
+  SetBounds(points, yMin, yMax, 1); 
+  yMax++; // ditto.
+  
+  //
+  // First set up the grid to optimize over.
+  //
+  int i;
+  for (i = 0; i < points.size(); i++) {
+    int rowIndex = GetIndex(points[i].GetX(), xMin, xMax, nRows);
+    int colIndex = GetIndex(points[i].GetY(), yMin, yMax, nCols);
+    bins[rowIndex][colIndex]+= points[i].length;
+  }
+	
+  //
+  // Now optimize using DP.
+  //
+
+  // First handle boundary strips
+  int r, c;
+  for (r = 1; r < nRows+1; r++) {
+    scoreMat[r][0] = 0;
+    pathMat[r][0]  = Up;
+  }
+  for (c = 1; c < nCols+1; c++) {
+    scoreMat[0][c] = 0;
+    pathMat[0][c]  = Left;
+  }
+  scoreMat[0][0] = 0;
+  for (r = 1; r < nRows + 1; r++) {
+    for (c = 1; c < nCols + 1; c++) {
+      int diagScore, leftScore, upScore;
+      diagScore = scoreMat[r-1][c-1];
+      leftScore = scoreMat[r][c-1];
+      upScore   = scoreMat[r-1][c];
+      
+      int optScore;
+      Arrow optDir;
+      if (diagScore >= leftScore and
+          diagScore >= upScore) {
+        optScore = diagScore;
+        optDir   = Diagonal;
+      }
+      else if (leftScore >= diagScore and 
+               leftScore >= upScore) {
+        optScore = leftScore;
+        optDir   = Left;
+      }
+      else {
+        optScore = upScore;
+        optDir   = Up;
+      }
+      
+      scoreMat[r][c] = optScore + bins[r-1][c-1];
+      pathMat[r][c]   = optDir;
+    }
+  }
+
+  r = nRows; c = nCols;
+  while (r > 0 or c > 0) {
+    Arrow dir = pathMat[r][c];
+    pathMat[r][c] = Star;
+    if (dir == Diagonal) { r--; c--; }
+    else if (dir == Left) { c--; }
+    else if (dir == Up) { r--; }
+    if (r == 0 and c == 0) { break; }
+  }
+
+  //
+  // Now mark inclusion/exclusion from matrix.
+  //
+  int nOpt = 0;
+  for (i = 0; i < points.size(); i++) {
+    int rowIndex = GetIndex(points[i].GetX(), xMin, xMax, nRows);
+    int colIndex = GetIndex(points[i].GetY(), yMin, yMax, nCols);
+    if (pathMat[rowIndex+1][colIndex+1] == Star) {
+      onOptPath[i] = true;
+    }
+    else if (pathMat[rowIndex][colIndex+1] == Star) {
+      onOptPath[i] = true;
+    }
+    else if (rowIndex + 2 < nRows and pathMat[rowIndex+2][colIndex+1] == Star) {
+      onOptPath[i] = true;
+    }
+    else if (pathMat[rowIndex+1][colIndex] == Star) {
+      onOptPath[i] = true;
+    }
+    else if (colIndex < nCols + 2  and pathMat[rowIndex+1][colIndex+2] == Star) {
+      onOptPath[i] = true;
+    }
+    if (onOptPath[i]) {
+      ++nOpt;
+    }
+  }
+  return nOpt;
+}
+
+
+template<typename T_Point>
+void RemoveOffOpt(vector<T_Point> &points, vector<bool> &optPath) {
+  int i, c;
+  for (i = 0, c = 0; i < points.size(); i++) {
+    if (optPath[i]) {
+      points[c] = points[i];
+      c++;
+    }
+  }
+  points.resize(c);
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/alignment/GuidedAlign.cpp b/libcpp/alignment/algorithms/alignment/GuidedAlign.cpp
new file mode 100644
index 0000000..2904720
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/GuidedAlign.cpp
@@ -0,0 +1,226 @@
+#include "GuidedAlign.hpp"
+
+int GuideRow::GetRowLength() {
+    return tPost + tPre + 1;
+}
+		
+int GetBufferIndexFunctor::operator()(Guide &guide, int seqRow, int seqCol, int &index) {
+    //
+    // Whenever a previous index was found, just use the one in the array to the right
+    //
+    int prevIndex = -1;
+    if (index != -1) {
+        index++;
+        return 1;
+    }
+
+    int row, col;
+    row = seqRow + 1 - seqRowOffset;
+    col = seqCol; // use the variable here for standardized naming.
+    if (row < 0 or row > guideSize ) {
+        return 0;
+    }
+    if (col <= guide[row].t and guide[row].t - col <= guide[row].tPre) {
+        index = guide[row].matrixOffset - (guide[row].t - col);
+        assert(prevIndex == -1 or prevIndex == index);
+        return 1;
+    }
+    else if (col > guide[row].t and col - guide[row].t  <= guide[row].tPost) {
+        index = guide[row].matrixOffset + (col - guide[row].t);
+        assert(prevIndex == -1 or prevIndex == index);
+        return 1;
+    }
+    return 0;
+}
+
+int ComputeMatrixNElem(Guide &guide) {
+    int totalSize = 0;
+    int r;
+    for (r = 0; r < guide.size(); r++) {
+        totalSize += guide[r].GetRowLength();
+        //    cout << r << " " << totalSize << endl;
+        assert(guide[r].GetRowLength() >= 0);
+    }
+    return totalSize;
+}
+
+void StoreMatrixOffsets(Guide &guide) {
+    int curMatrixSize = 0;
+    int r;
+    for (r = 0; r < guide.size(); r++) {
+        guide[r].matrixOffset = guide[r].tPre + curMatrixSize;
+        curMatrixSize += guide[r].GetRowLength();
+    }
+}
+
+float QVToLogPScale(char qv) {
+    return qv/-10.0;
+}
+
+void QVToLogPScale(QualityValueVector<QualityValue> &qualVect, int phredVectLength, std::vector<float> &lnVect) {
+    if (phredVectLength > lnVect.size()) {
+        lnVect.resize(phredVectLength);
+    }
+    int i;
+    for (i = 0; i < phredVectLength; i++) {
+        lnVect[i] = qualVect[i]/-10.0; //log(qualVect.ToProbability(i));
+    }
+}
+
+
+int AlignmentToGuide(Alignment &alignment, Guide &guide, int bandSize)  {
+	guide.clear();
+	if (alignment.size() == 0) {
+		// no blocks to make guide, exit.
+		return 0;
+	}
+	
+	int tStart, tEnd, qStart, qEnd;
+	int firstBlock   = 0;
+	int lastBlock    = alignment.size() - 1;
+	
+	tStart = alignment.blocks[firstBlock].tPos;
+	tEnd   = alignment.blocks[lastBlock].TEnd();
+	qStart = alignment.blocks[firstBlock].qPos;
+	qEnd   = alignment.blocks[lastBlock].QEnd();
+
+	int qAlignLength = qEnd - qStart; 
+	
+	// Add one extra block for boundary conditions.
+	guide.resize(qAlignLength+1);
+
+	// Initilize the first (boundary condition) row.
+	guide[0].t     = tStart - 1;
+	guide[0].q     = qStart - 1;
+	int drift = abs(tStart - qStart);	
+	if (drift > bandSize) {
+		guide[0].tPost = drift;
+	}
+	else {
+		guide[0].tPost = bandSize;
+	}
+	guide[0].tPre  = 0;
+
+	// The first row of the guide matches 
+	int q = 0;
+	int t = 0;
+	int guideIndex = 1;
+	int b;
+
+	for (b = 0; b < alignment.blocks.size(); b++) {
+		//
+		// First add the match stored in block b, each block is a
+		// diagonal, so that makes life easy.  
+		//
+		int bp;
+
+		for (bp = 0; bp < alignment.blocks[b].length; bp++) {
+			guide[guideIndex].t     = alignment.blocks[b].tPos + bp;
+			guide[guideIndex].q     = alignment.blocks[b].qPos + bp;
+			// 
+			// This complicated logic is to determine how far back the band
+			// should stretch.  The problem is that if the band stretches
+			// back further than the previous row, it's possible for the
+			// path matrix to go backwards into cells that should not be
+			// touched.  
+			//
+			int tDiff = guide[guideIndex].t - guide[guideIndex-1].t;
+			if (bp == 0) {
+				guide[guideIndex].tPre  = guide[guideIndex].t - 
+					(guide[guideIndex-1].t - guide[guideIndex-1].tPre); 
+				guide[guideIndex].tPost = bandSize + abs(drift);
+			}
+			else {
+				//
+				// Within aligned blocks, align around the band size.
+				//
+				int fullLengthTPre = (guide[guideIndex].t - 
+									  (guide[guideIndex-1].t - 
+									   guide[guideIndex-1].tPre));
+				guide[guideIndex].tPre  = min(bandSize, fullLengthTPre);
+				guide[guideIndex].tPost = min(MAX_BAND_SIZE, bandSize);
+                //if (guide[guideIndex].tPre > 500 or guide[guideIndex].tPost > 500) {
+                //cout << guideIndex << " " << guide[guideIndex].tPre << " " << guide[guideIndex].tPost << endl;
+                //}
+                //assert(guide[guideIndex].tPre >= 0);
+                //assert(guide[guideIndex].tPost >= 0);
+			}
+			guideIndex++;
+		}
+
+		//
+		// Now, widen k around regions where there is drift from the diagonal.
+		//
+
+
+		int diagonalLength;
+		int qGap, tGap;
+
+		if (b < alignment.blocks.size()-1) {
+			qGap = alignment.blocks[b+1].qPos - alignment.blocks[b].QEnd();
+			tGap = alignment.blocks[b+1].tPos - alignment.blocks[b].TEnd();
+			// 
+			// Drift is how far from the diagonal the next block starts at.
+			//
+			drift           = ComputeDrift(alignment.blocks[b], alignment.blocks[b+1]);
+            //drift = min(drift, 100);
+			diagonalLength  = std::min(qGap, tGap);
+			
+			int diagPos;
+			int qPos, tPos;
+			int qEnd, tEnd;
+			
+			qPos = alignment.blocks[b].QEnd();
+			tPos = alignment.blocks[b].TEnd();
+
+			qEnd = alignment.blocks[b+1].qPos;
+			tEnd = alignment.blocks[b+1].tPos;
+
+			for (diagPos = 0; diagPos < diagonalLength; diagPos++, tPos++, qPos++) {
+				guide[guideIndex].t     = tPos;
+				guide[guideIndex].q     = qPos;
+				guide[guideIndex].tPre  = min(MAX_BAND_SIZE, (guide[guideIndex].t - 
+                                   (guide[guideIndex-1].t - guide[guideIndex-1].tPre)));
+				guide[guideIndex].tPost = min(MAX_BAND_SIZE, bandSize + abs(drift));
+/*        if (guide[guideIndex].tPre > 500 or guide[guideIndex].tPost > 500) {
+          cout << guideIndex << " " << guide[guideIndex].tPre << " " << guide[guideIndex].tPost << endl;
+        } */
+				++guideIndex;
+			}
+			
+			//
+			// If the query gap is shorter than target (there is a deletion
+			// of the target),  the guide must be extended down the side of
+			// the gap.  See the figure below.
+			//
+			//  *****
+			//  **  
+			//  * *
+			//  *  *
+			//  *   * // extend down from here.
+		//  *   *
+			//  *   * 
+			//
+
+			while (qPos < qEnd) {
+				guide[guideIndex].t = tPos;
+				guide[guideIndex].q = qPos;
+				// move q down.
+				qPos++;
+				// keep tPos fixed, the guide is straight down here.
+				guide[guideIndex].tPre = min(MAX_BAND_SIZE, guide[guideIndex].t - 
+					(guide[guideIndex-1].t - guide[guideIndex-1].tPre)); //bandSize + abs(drift);
+
+				guide[guideIndex].tPost = min(MAX_BAND_SIZE, bandSize + abs(drift));
+				guideIndex++;
+			}
+		}
+	}
+  //int i;
+  //for (i = 0; i < guide.size(); i++) {
+  //  guide[i].tPre = min(guide[i].tPre, 200);
+  //  guide[i].tPost = min(guide[i].tPost, 200);
+  // }
+  return 1; // signal ok.
+
+}
diff --git a/libcpp/alignment/algorithms/alignment/GuidedAlign.hpp b/libcpp/alignment/algorithms/alignment/GuidedAlign.hpp
new file mode 100644
index 0000000..3296a21
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/GuidedAlign.hpp
@@ -0,0 +1,600 @@
+#ifndef _BLASR_GUIDE_ALIGNMENT_HPP_
+#define _BLASR_GUIDE_ALIGNMENT_HPP_
+
+#include <vector>
+#include <cmath>
+#include <limits.h>
+#include <ostream>
+#include "Types.h"
+#include "defs.h"
+#include "NucConversion.hpp"
+#include "DNASequence.hpp"
+#include "sdp/SDPFragment.hpp"
+#include "matrix/FlatMatrix.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "datastructures/anchoring/MatchPos.hpp"
+#include "matrix/Matrix.hpp"
+#include "tuples/TupleList.hpp"
+#include "tuples/TupleMetrics.hpp"
+#include "tuples/DNATuple.hpp"
+#include "utils/LogUtils.hpp"
+#include "utils/PhredUtils.hpp"
+#include "qvs/QualityValue.hpp"
+#include "qvs/QualityValueVector.hpp"
+#include "AlignmentUtils.hpp"
+#include "DistanceMatrixScoreFunction.hpp"
+#include "algorithms/alignment/SDPAlign.hpp"
+
+#define LOWEST_LOG_VALUE  -700
+
+#define MAX_BAND_SIZE 250
+
+class GuideRow {
+public:
+    int q, t;
+    int tPre, tPost;
+    unsigned int matrixOffset; // Where the center (q) is in the score
+    // and path matrices.
+    int GetRowLength(); 
+};
+
+typedef std::vector<GuideRow> Guide;
+
+class GetBufferIndexFunctor {
+// row + rowSeqOffset - 1 == seqRow
+// so, rowInSeq = -1, rowSeqOffset = 0 -> row = 0
+public:
+    int seqRowOffset;
+    int guideSize;
+    int operator()(Guide &guide, int seqRow, int seqCol, int &index); 
+};
+
+int ComputeMatrixNElem(Guide &guide);
+
+void StoreMatrixOffsets(Guide &guide); 
+
+float QVToLogPScale(char qv);
+
+void QVToLogPScale(QualityValueVector<QualityValue> &qualVect, int phredVectLength, std::vector<float> &lnVect); 
+
+int AlignmentToGuide(blasr::Alignment &alignment, Guide &guide, int bandSize); 
+
+template<typename QSequence, typename TSequence, typename T_ScoreFn>
+int GuidedAlign(QSequence &origQSeq, TSequence &origTSeq,  blasr::Alignment &guideAlignment,
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        blasr::Alignment &alignment,
+        std::vector<int>    &scoreMat,
+        std::vector<Arrow>  &pathMat,
+        std::vector<double> &probMat,
+        std::vector<double> &optPathProbMat,
+        std::vector<float>  &lnSubPValueVect,
+        std::vector<float>  &lnInsPValueVect,
+        std::vector<float>  &lnDelPValueVect,
+        std::vector<float>  &lnMatchPValueVect,
+        AlignmentType alignType=Global, 
+        bool computeProb=false) {
+
+    Guide guide;
+    AlignmentToGuide(guideAlignment, guide, bandSize);
+    StoreMatrixOffsets(guide);
+    ComputeMatrixNElem(guide);
+
+    //
+    // Make a copy of the sequences that is guaranteed to be in 3-bit format for faster alignment.
+    // (mabybe eventually reuse the qseq and tseq memory)
+    //
+    QSequence qSeq;
+    TSequence tSeq;
+    qSeq.Assign(origQSeq);
+    tSeq.Assign(origTSeq);
+
+    unsigned int matrixNElem = ComputeMatrixNElem(guide);
+    assert(matrixNElem >= 0);
+    StoreMatrixOffsets(guide);
+
+    /*
+     * The following code is useful to produce images of the dp-matrix.
+     * Make sure the sequenences are less than 5kb each though.
+
+     Matrix<float> probMatrix;
+     probMatrix.Resize(qSeq.length, tSeq.length);
+     probMatrix.Initialize(0);
+     ofstream matrixOut;
+     stringstream matrixOutNameStrm;
+     matrixOutNameStrm << "probMatrix_"<< runIndex << ".dat";
+     matrixOut.open(matrixOutNameStrm.str().c_str());
+     */
+
+    if (computeProb) { 
+        //
+        // Convert phred scale to proper ln for faster manipulation later on.
+        //
+        QVToLogPScale(qSeq.substitutionQV, qSeq.length, lnSubPValueVect);
+        QVToLogPScale(qSeq.insertionQV,    qSeq.length, lnInsPValueVect);
+        QVToLogPScale(qSeq.deletionQV,     qSeq.length, lnDelPValueVect);
+        if (lnMatchPValueVect.size() < qSeq.length) {
+            lnMatchPValueVect.resize(qSeq.length);
+        }
+        //
+        // Normalize probability vectors so that the probability of transition from each cell is 1.
+        //
+        unsigned int i;
+        for (i = 0; i < qSeq.length; i++) {
+            float subSum  = LogSumOfTwo(lnSubPValueVect[i], QVToLogPScale(scoreFn.substitutionPrior)); // prior on substitution rate
+            float denominator = LogSumOfThree(lnDelPValueVect[i], lnInsPValueVect[i], subSum);
+            lnDelPValueVect[i] = lnDelPValueVect[i] - denominator;
+            lnSubPValueVect[i]   = lnSubPValueVect[i] - denominator;
+            lnInsPValueVect[i]   = lnInsPValueVect[i] - denominator;
+            lnMatchPValueVect[i] = subSum - denominator;
+        }
+
+    }
+
+
+
+    // 
+    // Make sure the alignments can fit in the reused buffers.
+    //
+
+    if (scoreMat.size() < matrixNElem) {
+        scoreMat.resize(matrixNElem);
+        pathMat.resize(matrixNElem);
+        fill(scoreMat.begin(), scoreMat.end(), 0);
+        fill(pathMat.begin(), pathMat.end(), NoArrow);
+    }
+    if (computeProb) {
+        if (probMat.size() < matrixNElem) {
+            probMat.resize(matrixNElem);
+            optPathProbMat.resize(matrixNElem);
+        }
+    }
+
+    // 
+    // Initialze matrices.  Only initialize up to matrixNElem rather
+    // than matrix.size() because the matrix.size() unnecessary space
+    // may be allocated.
+    //
+
+    std::fill(scoreMat.begin(), scoreMat.begin() + matrixNElem, 0);
+    std::fill(pathMat.begin(), pathMat.begin() + matrixNElem, NoArrow);
+    if (computeProb) {
+        std::fill(probMat.begin(), probMat.begin() + matrixNElem, 0);	
+        std::fill(optPathProbMat.begin(), optPathProbMat.begin() + matrixNElem, 0);
+    }
+    //
+    // Initialize boundary conditions.
+    //
+    int q, t;
+    int bufferIndex;
+    // start alignemnt at the beginning of the guide, and align to the
+    // end of the guide.
+    if (guide.size() == 0) {
+        qSeq.Free();
+        tSeq.Free();
+        return 0;
+    }
+    int qStart = guide[1].q;
+    int tStart = guide[1].t;
+    int qEnd   = guide[guide.size()-1].q+1;
+    int tEnd   = guide[guide.size()-1].t+1;
+
+    GetBufferIndexFunctor GetBufferIndex;
+    GetBufferIndex.seqRowOffset = qStart;
+    GetBufferIndex.guideSize    = guide.size();
+    int indicesAreValid, delIndexIsValid, insIndexIsValid;
+    bufferIndex = -1;
+    indicesAreValid = GetBufferIndex(guide, qStart-1, tStart-1, bufferIndex);
+    assert(indicesAreValid);
+    scoreMat[bufferIndex] = 0;
+    pathMat[bufferIndex]  = NoArrow;
+    int matchIndex, insIndex, delIndex, curIndex;
+
+    //
+    // Initialize deletion row.
+    //
+    if (computeProb) {
+        probMat[0] = optPathProbMat[0] = 0;
+    }
+    for (t = tStart; t < tStart + guide[0].tPost; t++) {
+        curIndex=-1;
+        indicesAreValid = GetBufferIndex(guide, qStart-1, t, curIndex);
+        if (indicesAreValid == 0 ) {
+            std::cout << "QSeq" << std::endl;
+            (static_cast<DNASequence*>(&origQSeq))->PrintSeq(std::cout);
+            std::cout << "TSeq" << std::endl;
+            (static_cast<DNASequence*>(&origTSeq))->PrintSeq(std::cout);
+            assert(0);
+        }
+        delIndex = -1;
+        delIndexIsValid = GetBufferIndex(guide, qStart-1, t-1, delIndex);
+
+        if (delIndexIsValid) {
+            if (alignType == Global) {
+                scoreMat[curIndex] = scoreMat[delIndex] + scoreFn.del;
+            }
+            else if (alignType == Local) {
+                scoreMat[curIndex] = 0;
+            }
+            pathMat[curIndex] = Left;
+            if (computeProb) {
+                if (qSeq.qual.Empty() == false) {
+                    optPathProbMat[curIndex] = probMat[curIndex] = probMat[delIndex] + QVToLogPScale(scoreFn.globalDeletionPrior);
+                }
+            }
+        }
+    }
+
+    // 
+    // Initialize stripe along the top of the grid.
+    //
+    for (q = qStart ; q < qStart + bandSize and q < qEnd; q++) {
+        insIndex = -1;
+        insIndexIsValid = GetBufferIndex(guide, q-1, tStart-1, // diagonal from t-start
+                insIndex);
+        curIndex = -1;
+        indicesAreValid = GetBufferIndex(guide, q, tStart-1, curIndex);
+
+        if (insIndexIsValid and indicesAreValid) {
+            assert(insIndex >= 0);
+            assert(curIndex >= 0);
+            if (alignType == Global) {
+                scoreMat[curIndex] = scoreMat[insIndex] + scoreFn.ins;
+            }
+            else {
+                scoreMat[curIndex] = 0;
+            }
+            pathMat[curIndex] = Up;
+            if (computeProb) {
+                if (qSeq.qual.Empty() == false) {
+                    optPathProbMat[curIndex] = probMat[curIndex] = probMat[insIndex] + QVToLogPScale(scoreFn.Insertion(tSeq,(DNALength) 0, qSeq, (DNALength)q));
+                }
+            }
+        }
+    }
+
+    int matchScore, insScore, delScore;
+
+    for (q = qStart; q < qEnd; q++) {
+        int qi = q - qStart + 1;
+        int tp = guide[qi].t;
+        curIndex = matchIndex = insIndex = delIndex = -1;
+
+        //
+        // Do some work that will help define when matchIndex and insIndex
+        // may be used.  Once delIndex is computed once, it is valid for
+        // all t positions.
+        //
+        int prevRowTEnd = -1;
+        if ( qi > 0) { 
+            //
+            // Define the boundaries of the column which may access previously
+            // computed cells with a match.
+            //
+            prevRowTEnd = guide[qi-1].t + guide[qi-1].tPost;
+        }    
+
+        for (t = tp - guide[qi].tPre ; t < guide[qi].t + guide[qi].tPost +1; t++) {
+
+
+            if (q < qStart + bandSize and t == tp - guide[qi].tPre - 1) {
+                // On the boundary condition, don't access the 1st element;
+                t++;
+                continue;
+            }
+            // Make sure the index is not past the end of the sequence.
+            if (t < -1) continue;
+            if (t >= tEnd) continue;
+
+            //
+            // No cells are available to use for insertion cost
+            // computation. 
+            //
+            if (t > prevRowTEnd) {
+                insIndex = -1;
+            }
+            if (t > prevRowTEnd + 1) {
+                matchIndex = -1;
+            }
+
+            //
+            // Find the indices in the buffer.  Since the rows are of
+            // different sizes, one can't just use offsets from the buffer
+            // index. 
+            //
+
+            if (GetBufferIndex(guide, q-1,t-1, matchIndex)) {
+                assert(matchIndex >= 0);
+                matchScore = scoreMat[matchIndex] + scoreFn.Match(tSeq, t, qSeq, q);
+            }
+            else {
+                matchScore = INF_INT;
+            }
+
+            if (GetBufferIndex(guide, q-1, t, insIndex)) {
+                assert(insIndex >= 0);
+                insScore = scoreMat[insIndex] + scoreFn.Insertion(tSeq,(DNALength) t, qSeq, (DNALength)q);
+            }
+            else {
+                insScore = INF_INT;
+            }
+            if (GetBufferIndex(guide, q, t-1, delIndex)) {
+                assert(delIndex >= 0);
+                delScore = scoreMat[delIndex] + scoreFn.Deletion(tSeq, (DNALength) t, qSeq, (DNALength)q);
+            }
+            else {
+                delScore = INF_INT;
+            }
+
+            int minScore = MIN(matchScore, MIN(insScore, delScore));
+            int result   = GetBufferIndex(guide, q, t, curIndex);
+            // This should only loop over valid cells.
+            assert(result);
+            assert(curIndex >= 0);
+            scoreMat[curIndex] = minScore;
+            if (minScore == INF_INT) {
+                pathMat[curIndex] = NoArrow;
+                if (computeProb) {
+                    probMat[curIndex] = 1;
+                    optPathProbMat[curIndex] = 0;
+                }
+            }
+            else {
+                assert(result == 1);
+                if (minScore == matchScore) {
+                    pathMat[curIndex] = Diagonal;
+                }
+                else if (minScore == delScore) {
+                    pathMat[curIndex] = Left;
+                }
+                else {
+                    pathMat[curIndex] = Up;
+                }
+
+                float pMisMatch, pIns, pDel;
+                // Assign these to anything over 1 to signal they are not assigned.
+                pMisMatch = 2;
+                pIns      = 2;
+                pDel      = 2;
+                if (computeProb) {
+                    if (matchScore != INF_INT) {
+                        pMisMatch = QVToLogPScale(scoreFn.NormalizedMatch(tSeq, t, qSeq, q));
+                    }
+                    if (insScore != INF_INT) {
+                        pIns = QVToLogPScale(scoreFn.NormalizedInsertion(tSeq, t, qSeq, q));
+                    }
+                    if (delScore != INF_INT) {
+                        pDel = QVToLogPScale(scoreFn.NormalizedDeletion(tSeq, t, qSeq, q));
+                    }
+
+                    if (qSeq.qual.Empty() == false) {
+                        if (matchScore != INF_INT and delScore != INF_INT and insScore != INF_INT) {
+                            probMat[curIndex] = LogSumOfThree(probMat[matchIndex] + pMisMatch,
+                                    probMat[delIndex] + pDel,
+                                    probMat[insIndex] + pIns);
+                        }
+                        else if (matchScore != INF_INT and delScore != INF_INT) {
+                            probMat[curIndex] = LogSumOfTwo(probMat[matchIndex] + pMisMatch,
+                                    probMat[delIndex] + pDel);
+                        }
+                        else if (matchScore != INF_INT and insScore != INF_INT) {
+                            probMat[curIndex] = LogSumOfTwo(probMat[matchIndex] + pMisMatch,
+                                    probMat[insIndex] + pIns);					
+                        }
+                        else if (insScore != INF_INT and delScore != INF_INT) {
+                            probMat[curIndex] = LogSumOfTwo(probMat[delIndex] + pDel,
+                                    probMat[insIndex] + pIns);
+                        }
+                        else if (matchScore != INF_INT) {
+                            probMat[curIndex] = probMat[matchIndex] + pMisMatch;
+                        }
+                        else if (delScore != INF_INT) {
+                            probMat[curIndex] = probMat[delIndex] + pDel;
+                        }
+                        else if (insScore != INF_INT) {
+                            probMat[curIndex] = probMat[insIndex] + pIns;
+                        }
+                        //
+                        // Not normalizing probabilities, but using value as if it
+                        // was a probability later on, so cap at 0 (= log 1).
+                        //
+                        if (probMat[curIndex] > 0) {
+                            probMat[curIndex] = 0;
+                        }
+                        assert(!std::isnan(probMat[curIndex]));
+                    }
+                }
+            }
+        }
+    }		
+    // Ok, for now just trace back from qend/tend
+    q = qEnd-1;
+    t = tEnd-1;
+    std::vector<Arrow>  optAlignment;
+    int bufferIndexIsValid;
+    while(q >= qStart or t >= tStart) {
+        bufferIndex = -1;
+        bufferIndexIsValid = GetBufferIndex(guide, q, t, bufferIndex);
+        assert(bufferIndexIsValid);
+        assert(bufferIndex >= 0);
+        Arrow arrow;
+        arrow = pathMat[bufferIndex];
+        if (arrow == NoArrow) {
+            tSeq.ToAscii();
+            qSeq.ToAscii();
+            unsigned int gi;
+            for (gi = 0; gi < guide.size(); gi++) {
+                std::cout << guide[gi].q << " " << guide[gi].t << " " << guide[gi].tPre << " " << guide[gi].tPost << std::endl;
+            }
+
+            std::cout << "qseq: "<< std::endl;
+            (static_cast<DNASequence*>(&qSeq))->PrintSeq(std::cout);
+            std::cout << "tseq: "<< std::endl;
+            (static_cast<DNASequence*>(&tSeq))->PrintSeq(std::cout);
+            std::cout << "ERROR, this path has gone awry at " << q << " " << t << " !" << std::endl;
+            exit(1);
+        }
+        optAlignment.push_back(arrow);
+        if (arrow == Diagonal) {
+            q--;
+            t--;
+        }
+        else if (arrow == Up) {
+            q--;
+        }
+        else if (arrow == Left) {
+            t--;
+        }
+    }
+
+    alignment.nCells = ComputeMatrixNElem(guide);
+    std::reverse(optAlignment.begin(), optAlignment.end());
+    alignment.qPos = qStart;
+    alignment.tPos = tStart;
+    alignment.ArrowPathToAlignment(optAlignment);
+    RemoveAlignmentPrefixGaps(alignment);
+    int lastIndex = 0;
+    tSeq.Free();
+    qSeq.Free();
+    lastIndex = -1;
+    if (GetBufferIndex(guide, qEnd - 1, tEnd - 1, lastIndex)) {
+        alignment.score = scoreMat[lastIndex];
+        if (computeProb) {
+            alignment.probScore = probMat[lastIndex];
+        }
+        return scoreMat[lastIndex];
+    }
+    else {
+        return 0;
+    }
+}
+
+template<typename QSequence, typename TSequence, typename T_ScoreFn> //, typename T_BufferCache>
+int GuidedAlign(QSequence &origQSeq, TSequence &origTSeq,
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        int sdpIns, int sdpDel, float sdpIndelRate,
+        blasr::Alignment &alignment,
+        AlignmentType alignType=Global,
+        bool computeProb = false,
+        int sdpTupleSize= 8) {
+    blasr::Alignment sdpAlignment;
+
+    int alignScore = SDPAlign(origQSeq, origTSeq,
+            scoreFn, sdpTupleSize, 
+            sdpIns, sdpDel, sdpIndelRate,
+            sdpAlignment); //, Local, false, false);
+
+    int b;
+    for (b = 0; b < sdpAlignment.blocks.size(); b++) {
+        sdpAlignment.blocks[b].qPos += sdpAlignment.qPos;
+        sdpAlignment.blocks[b].tPos += sdpAlignment.tPos;
+    }
+    sdpAlignment.tPos = 0;
+    sdpAlignment.qPos = 0;
+
+    return GuidedAlign(origQSeq, origTSeq, sdpAlignment, scoreFn, bandSize, alignment,
+            // fill in optional parameters
+            alignType, computeProb);
+
+}
+
+
+//
+// Use Case: No guide yet exists for this alignment, but using
+// buffers.  Run SDP alignment first, then refine on the guide.
+//
+
+template<typename QSequence, typename TSequence, typename T_ScoreFn, typename T_BufferCache>
+int GuidedAlign(QSequence &origQSeq, TSequence &origTSeq, 
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        int sdpIns, int sdpDel, float sdpIndelRate,
+        T_BufferCache &buffers,
+        blasr::Alignment &alignment, 
+        AlignmentType alignType=Global,
+        bool computeProb = false,
+        int sdpTupleSize= 8) {
+
+    blasr::Alignment sdpAlignment;
+
+    int alignScore = SDPAlign(origQSeq, origTSeq,
+            scoreFn, sdpTupleSize, 
+            sdpIns, sdpDel, sdpIndelRate,
+            sdpAlignment, buffers, Local, false, false);
+
+    int b;
+    for (b = 0; b < sdpAlignment.blocks.size(); b++) {
+        sdpAlignment.blocks[b].qPos += sdpAlignment.qPos;
+        sdpAlignment.blocks[b].tPos += sdpAlignment.tPos;
+    }
+    sdpAlignment.tPos = 0;
+    sdpAlignment.qPos = 0;
+
+    return GuidedAlign(origQSeq, origTSeq, sdpAlignment, scoreFn, bandSize, buffers, alignment,
+            // fill in optional parameters
+            alignType, computeProb);
+}
+
+//
+// Use case, guide exists, using buffers
+//
+template<typename QSequence, typename TSequence, typename T_ScoreFn, typename T_BufferCache>
+int GuidedAlign(QSequence &origQSeq, TSequence &origTSeq,  blasr::Alignment &guideAlignment,
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        T_BufferCache &buffers,
+        blasr::Alignment &alignment, 
+        AlignmentType alignType=Global, 
+        bool computeProb=false) {
+    return GuidedAlign(origQSeq, origTSeq, guideAlignment, scoreFn, bandSize, alignment, 
+            buffers.scoreMat,
+            buffers.pathMat,
+            buffers.probMat,
+            buffers.optPathProbMat,
+            buffers.lnSubPValueMat,
+            buffers.lnInsPValueMat,
+            buffers.lnDelPValueMat,
+            buffers.lnMatchPValueMat, alignType, computeProb);
+}
+
+//
+// Missing the use case for guide does not exist, and not using
+// buffers.  This is just a very long function declaration, so it's
+// not worth writing until it is needed.
+//
+
+
+//
+// Use case, guide exists, but not using buffers.                   
+//
+template<typename QSequence, typename TSequence, typename T_ScoreFn>
+int GuidedAlign(QSequence &origQSeq, TSequence &origTSeq,  blasr::Alignment &guideAlignment,
+        T_ScoreFn &scoreFn,
+        int bandSize,
+        blasr::Alignment &alignment, 
+        AlignmentType alignType=Global, 
+        bool computeProb=false) {
+
+    //  Make synonyms for members of the buffers class for easier typing.
+    std::vector<int>    scoreMat;
+    std::vector<Arrow>  pathMat;
+    std::vector<double> probMat;
+    std::vector<double> optPathProbMat;
+    std::vector<float>  lnSubPValueVect;
+    std::vector<float>  lnInsPValueVect;
+    std::vector<float>  lnDelPValueVect;
+    std::vector<float>  lnMatchPValueVect;
+
+    return GuidedAlign(origQSeq, origTSeq, guideAlignment, scoreFn, bandSize, alignment,
+            scoreMat,
+            pathMat,
+            probMat,
+            optPathProbMat,
+            lnSubPValueVect,
+            lnInsPValueVect,
+            lnDelPValueVect,
+            lnMatchPValueVect, alignType, computeProb);
+}
+
+#endif // _BLASR_GUIDE_ALIGNMENT_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/IDSScoreFunction.cpp b/libcpp/alignment/algorithms/alignment/IDSScoreFunction.cpp
new file mode 100644
index 0000000..cc40a5f
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/IDSScoreFunction.cpp
@@ -0,0 +1,158 @@
+#include "IDSScoreFunction.hpp"
+
+float SumAsValidPhred(float v1, float v2, float v3) {
+    float sum = 0;
+    if (v1 > 0) {
+        sum = std::pow(10,v1/-10.0);
+    }
+    if (v2 > 0) {
+        sum += std::pow(10,v2/-10.0);
+    }
+    if (v3 > 0) {
+        sum += std::pow(10,v3/-10.0);
+    }
+    return sum;
+}
+
+template<>
+int IDSScoreFunction<DNASequence,FASTQSequence>::Deletion(DNASequence &ref, DNALength refPos,
+        FASTQSequence &query, DNALength queryPos) {
+
+    if (query.deletionQV.Empty() == false and query.deletionTag != NULL) {
+        if (query.deletionTag[queryPos] == 'N') {
+            return globalDeletionPrior; //query.deletionQV[queryPos] ;
+        }
+        else {
+            if (query.deletionTag[queryPos] == ref.seq[refPos]) {
+                return query.deletionQV[queryPos];
+            }
+            else {
+                return globalDeletionPrior; 
+            }
+        }
+    }
+    else {
+        return del;
+    }
+}
+
+template<>
+int IDSScoreFunction<DNASequence, FASTQSequence>::Deletion(FASTQSequence &query, DNALength queryPos) {
+    return query.deletionQV[queryPos];
+}
+
+
+template<>
+int IDSScoreFunction<DNASequence, DNASequence>::Deletion(DNASequence &query, DNALength pos) {
+    return del; // For now there is no global deletion quality value.
+}
+
+template<>
+int IDSScoreFunction<DNASequence, FASTQSequence>::Insertion(DNASequence &refSeq, DNALength refPos, 
+        FASTQSequence &query, DNALength pos) {
+    return query.insertionQV[pos] ;
+}
+
+template<>
+int IDSScoreFunction<DNASequence, FASTQSequence>::Insertion(FASTQSequence &query, DNALength pos) {
+    return query.insertionQV[pos];
+}
+
+template<>
+int IDSScoreFunction<DNASequence, FASTQSequence>::Match(DNASequence &ref, DNALength refPos, 
+        FASTQSequence &query, DNALength queryPos) {
+
+    if (query.seq[queryPos] == ref.seq[refPos]) {
+        return 0;
+    } else if (query.substitutionTag != NULL) {
+        if (query.substitutionTag[queryPos] == ref.seq[refPos]) {
+            return query.substitutionQV[queryPos];
+        }
+    }
+    return substitutionPrior;
+}
+
+
+template<>
+float IDSScoreFunction<DNASequence, FASTQSequence>::NormalizedMatch(DNASequence &ref, DNALength refPos, 
+        FASTQSequence &query, DNALength queryPos) {
+    /*
+     * Return the match probability normalized such that the probability
+     * of transitioning from refPos, queryPos is 1.
+     */
+
+    float matchScore = Match(ref, refPos, query, queryPos);
+
+    float delScore   = -1;
+    if (refPos > 0) {
+        delScore = Deletion(ref, refPos-1, query, queryPos);
+    }
+
+    float insScore = -1;
+    if (queryPos > 0) {
+        insScore = Insertion(ref, refPos, query, queryPos-1);
+    }
+
+    float sumScore = SumAsValidPhred(matchScore, delScore, insScore);
+    if (sumScore > 0) {
+        float numerator = std::pow(10, matchScore/-10.0);
+        return -10*std::log10( numerator / sumScore);
+    }
+    else {
+        return 0;
+    }
+}
+
+
+
+template<>
+float IDSScoreFunction<DNASequence, FASTQSequence>::NormalizedInsertion(DNASequence &ref, DNALength refPos, 
+        FASTQSequence &query, DNALength queryPos) {
+
+    float insScore = Insertion(ref, refPos, query, queryPos);
+
+    float delScore = -1;
+    float matchScore = -1;  
+    if (refPos < ref.length - 1) {
+        matchScore = Match(ref, refPos + 1, query, queryPos);
+        if (queryPos > 0) {
+            delScore = Deletion(ref, refPos + 1, query, queryPos - 1);
+        }
+    }
+
+    float sum = SumAsValidPhred(insScore, delScore, matchScore);
+    if (sum > 0) {
+        float numerator = std::pow(10,insScore/-10.0);
+        return -10*std::log10( numerator / sum);
+    }
+    else {
+        return 0;
+    }
+}
+
+
+template<>
+float IDSScoreFunction<DNASequence, FASTQSequence>::NormalizedDeletion(DNASequence &ref, DNALength refPos, 
+        FASTQSequence &query, DNALength queryPos) {
+
+    float delScore = Deletion(ref, refPos, query, queryPos);
+
+    float matchScore = -1;
+    float insScore = -1;
+
+    if (queryPos < query.length - 1) {
+        matchScore = Match(ref, refPos, query, queryPos + 1);
+
+        if (refPos > 0) {
+            insScore = Insertion(ref, refPos - 1, query, queryPos + 1);
+        }
+    }
+    float sum = SumAsValidPhred(delScore, matchScore, insScore);
+    if (sum > 0) {
+        float numerator= std::pow(10, delScore/-10.0);
+        return -10*std::log10( numerator / sum);
+    }
+    else {
+        return 0;
+    }
+}
diff --git a/libcpp/alignment/algorithms/alignment/IDSScoreFunction.hpp b/libcpp/alignment/algorithms/alignment/IDSScoreFunction.hpp
new file mode 100644
index 0000000..3b6b5e5
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/IDSScoreFunction.hpp
@@ -0,0 +1,109 @@
+#ifndef _BLASR_IDS_SCORE_FUNCTION_HPP_
+#define _BLASR_IDS_SCORE_FUNCTION_HPP_
+
+#include <string>
+#include <cmath>
+#include "ScoreMatrices.hpp"
+#include "BaseScoreFunction.hpp"
+#include "FASTASequence.hpp"
+#include "FASTQSequence.hpp"
+#include "utils/LogUtils.hpp"
+
+float SumAsValidPhred(float v1, float v2, float v3); 
+
+template<typename T_RefSequence, typename T_QuerySequence>
+class IDSScoreFunction : public BaseScoreFunction {
+    public:
+        int scoreMatrix[5][5];
+
+        IDSScoreFunction(int scoreMatrixP[5][5], int insertionP, int deletionP, int globalInsertionPriorP,
+                int globalDeletionPriorP) : BaseScoreFunction(insertionP, deletionP, globalInsertionPriorP, globalDeletionPriorP) {
+            InitializeScoreMatrix(scoreMatrixP);
+        }
+
+
+        IDSScoreFunction() {
+            substitutionPrior = 20;
+            globalDeletionPrior = 13;
+        }
+
+        void InitializeScoreMatrix(int scoreMatrixP[5][5]) {
+            int i, j;
+            for (i = 0; i < 5; i++ ){ 
+                for (j = 0; j < 5; j++ ){
+                    scoreMatrix[i][j] = scoreMatrixP[i][j];
+                }
+            }
+        }
+
+
+        int Deletion(T_QuerySequence &seq, DNALength pos) {
+            std::cout << "IDS. For now, deletion must be specialized with FASTQ or FASTA Sequences. " << std::endl;
+            exit(1);
+            return 0;
+        }
+        int Deletion(T_RefSequence &refSeq, DNALength refPos, T_QuerySequence &querySeq, DNALength queryPos) {
+            std::cout << "IDS. For now, this function must be specialized with either FASTQ or FASTA sequences"<<std::endl;
+            exit(1);
+        }
+        int Match(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos) {
+            std::cout << "IDS. For now, this function must be specialized with either FASTQ or FASTA sequences" << std::endl;
+            return 0;
+            exit(1);
+        }
+        int Insertion(T_RefSequence &refSeq, DNALength refPos, T_QuerySequence &querySeq, DNALength queryPos) {
+            std::cout << "IDS. For now, this function must be specialized with either FASTQ or FASTA sequences"<<std::endl;
+            exit(1);
+        }	
+        int Insertion(T_QuerySequence &seq, DNALength pos) {
+            std::cout << "IDS. For now, this function must be specialized with either FASTQ or FASTA sequences" << std::endl;
+            return 0;
+            exit(1);
+        }
+
+        float NormalizedMatch(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos);
+        float NormalizedInsertion(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos);
+        float NormalizedDeletion(T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, DNALength queryPos);
+};
+
+/*
+ * Define all specializations for a FASTA reference and FASTQSequence for the query, or FASTA sequence for query.
+ */
+
+template<>
+int IDSScoreFunction<DNASequence,FASTQSequence>::Deletion(DNASequence &ref, 
+        DNALength refPos, FASTQSequence &query, DNALength queryPos); 
+
+template<>
+int IDSScoreFunction<DNASequence, FASTQSequence>::Deletion(FASTQSequence &query, 
+        DNALength queryPos); 
+
+template<>
+int IDSScoreFunction<DNASequence, DNASequence>::Deletion(DNASequence &query, 
+        DNALength pos); 
+
+template<>
+int IDSScoreFunction<DNASequence, FASTQSequence>::Insertion(DNASequence &refSeq, 
+        DNALength refPos, FASTQSequence &query, DNALength pos);
+
+template<>
+int IDSScoreFunction<DNASequence, FASTQSequence>::Insertion(FASTQSequence &query, 
+        DNALength pos); 
+
+template<>
+int IDSScoreFunction<DNASequence, FASTQSequence>::Match(DNASequence &ref, 
+        DNALength refPos, FASTQSequence &query, DNALength queryPos); 
+
+template<>
+float IDSScoreFunction<DNASequence, FASTQSequence>::NormalizedMatch(
+        DNASequence &ref, DNALength refPos, FASTQSequence &query, DNALength queryPos); 
+
+template<>
+float IDSScoreFunction<DNASequence, FASTQSequence>::NormalizedInsertion(
+        DNASequence &ref, DNALength refPos, FASTQSequence &query, DNALength queryPos); 
+
+template<>
+float IDSScoreFunction<DNASequence, FASTQSequence>::NormalizedDeletion(
+        DNASequence &ref, DNALength refPos, FASTQSequence &query, DNALength queryPos); 
+
+#endif // _BLASR_IDS_SCORE_FUNCTION_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/KBandAlign.cpp b/libcpp/alignment/algorithms/alignment/KBandAlign.cpp
new file mode 100644
index 0000000..c25bb92
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/KBandAlign.cpp
@@ -0,0 +1,30 @@
+#include "algorithms/alignment/KBandAlign.hpp"
+
+DefaultGuide::DefaultGuide() {}
+
+int DefaultGuide::operator()(int i) {
+    return i;
+}
+
+void SetKBoundedLengths(DNALength tLength, DNALength qLength, DNALength k, DNALength &tLen, DNALength &qLen) {
+	//
+	// Determine how much of each read to align.   If the query is
+	// shorter than target - k, then it is impossible to align all the
+	// way to the end of the target.  Similar if the query is longer
+	// than the target.
+	//
+	if (tLength < qLength) {
+		tLen = tLength;
+		qLen = MIN(qLength, tLength + k);
+	}
+	else if (qLength < tLength) {
+		qLen = qLength;
+		tLen = MIN(tLength, qLength + k);
+	}
+	else {
+		// They are the same length, the diagonal will definitely fit the two.
+		qLen = qLength;
+		tLen = tLength;
+	}
+}
+
diff --git a/libcpp/alignment/algorithms/alignment/KBandAlign.hpp b/libcpp/alignment/algorithms/alignment/KBandAlign.hpp
new file mode 100644
index 0000000..456c985
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/KBandAlign.hpp
@@ -0,0 +1,381 @@
+#ifndef _BLASR_K_BAND_ALIGN_HPP_
+#define _BLASR_K_BAND_ALIGN_HPP_
+
+#include <algorithm>
+#include <vector>
+#include <limits.h>
+#include "defs.h"
+#include "AlignmentUtils.hpp"
+#include "NucConversion.hpp"
+#include "matrix/FlatMatrix.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "statistics/StatUtils.hpp"
+
+class DefaultGuide {
+ public:
+	DefaultGuide();
+	int operator()(int i);
+};
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_Alignment, typename T_ScoreFn>
+int KBandAlign(T_QuerySequence &pqSeq, T_TargetSequence &ptSeq,
+							 int matchMat[5][5], int ins, int del, DNALength k,
+							 std::vector<int> &scoreMat,
+							 std::vector<Arrow> & pathMat,
+							 T_Alignment &alignment,
+							 T_ScoreFn &scoreFn,
+							 AlignmentType alignType=Global,
+               bool samplePaths=false) {
+	return KBandAlign(pqSeq, ptSeq, matchMat, ins, del, k, scoreMat, pathMat, alignment, alignType, scoreFn, samplePaths);
+}
+
+void SetKBoundedLengths(DNALength tLength, DNALength qLength, DNALength k, DNALength &tLen, DNALength &qLen);
+
+template<typename T_Sequence>
+void CreateThreeBitSequence(T_Sequence &origSeq, T_Sequence &threeBitSeq) {
+	//
+	// Make a copy of the sequences that is guaranteed to be in 3-bit format.
+	// This is 2 bits for A,C,T,and G, and an extra bit to signal masked sequence.
+	//
+
+	ResizeSequence(threeBitSeq, origSeq.length);
+	
+	VectorIndex i;
+	for (i = 0; i < origSeq.length; i++ ) {
+		threeBitSeq.seq[i] = ThreeBit[origSeq.seq[i]];
+	}
+}
+
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_Alignment, typename T_ScoreFn>
+int KBandAlign(T_QuerySequence &qSeq, T_TargetSequence &tSeq,
+							 int matchMat[5][5], int ins, int del, int k,
+							 std::vector<int>   &scoreMat,
+							 std::vector<Arrow> &pathMat,
+							 T_Alignment   &alignment, 
+							 AlignmentType alignType, 
+							 T_ScoreFn &scoreFn, bool samplePaths=false) {
+
+	DNALength qLen, tLen;	
+	SetKBoundedLengths(tSeq.length, qSeq.length, k, tLen, qLen);
+
+	//
+	//
+	// Allow for length up to diaonal + k + 1 for boundary.
+	// 
+	// Allow for width:
+	//   diagonal (1)
+	//   up to k insertions (k)
+	//   up to k deletions  (k)
+	//   boundary on left side of matrix (1)
+	// 
+  DNALength nCols = 2*k + 1;
+	DNALength totalMatSize = (qLen + 1) * nCols;
+	alignment.nCells = totalMatSize;
+	if (scoreMat.size() < totalMatSize) {
+		scoreMat.resize(totalMatSize);
+		pathMat.resize(totalMatSize);
+	}
+
+	// 
+	// Initialze matrices
+	//
+	std::fill(scoreMat.begin(), scoreMat.begin() + totalMatSize, 0);
+	std::fill(pathMat.begin(),  pathMat.begin()  + totalMatSize, NoArrow);
+	
+	//
+	// Initialize the boundaries of the score and path matrices.
+	//
+	int q, t;
+
+	for (q = 1; q <= k && q < qLen + 1; q++) {
+		scoreMat[rc2index(q, k - q, nCols)] = q * ins;
+		pathMat[rc2index(q, k - q , nCols)] = Up;
+	}
+	if (alignType == Global) {
+		for (t = 1; t <= k && t < tLen; t++) {
+			scoreMat[rc2index(0, t + k , nCols)] = t * del;
+			pathMat[rc2index(0, t + k , nCols)] = Left;
+		}
+	}
+	if (alignType == QueryFit or alignType == Fit) {
+		for (t = 1; t <= k & t < tLen; t++) {
+			scoreMat[rc2index(0, t + k , nCols)] = 0;
+			pathMat[rc2index(0, t + k , nCols)] = Left;
+		}
+	}
+	if (alignType == TargetFit or alignType == Fit) {
+		for (q = 1; q <= k & q < qLen; q++) {
+			scoreMat[rc2index(q, 0, nCols)] = 0;
+			pathMat[rc2index(q, 0, nCols)] = Up;
+		}
+	}
+
+	//
+	// Initialize the 0,0 position to be a match.
+	//
+	scoreMat[rc2index(0, k, nCols)] = 0;
+	pathMat[rc2index(0, k, nCols)] = Diagonal;
+
+	int matchScore, insScore, delScore;
+
+	for (q = 1; q <= qLen; q++) {
+		for (t = q - k; t < q + k + 1; t++) {
+			if (t < 1)
+				continue;
+			if (t > tLen)
+				continue;
+
+			// On left boundary of k-band. 
+			// do not allow deletions of t.
+			if (t == q - k) {
+				delScore = INF_INT;
+			}
+			else {
+				// cur row = q
+				// cur col = t - q 
+				// prev col therefore t - q - 1
+				// and offset from diagonal is k + t - q - 1
+				delScore = scoreMat[rc2index(q, k + t - q - 1, nCols)] + scoreFn.Deletion(tSeq, (DNALength) t-1, qSeq, (DNALength)q-1);
+			}
+
+			// cur row = q
+			// cur col = t - q
+			
+			// cur query index = q - 1
+			// cur target index = t - 1
+			// therefore match row (up) = q 
+			//           match col (left, but since up shifted right) = t - q
+			assert(rc2index(q - 1, k + t - q, nCols) < scoreMat.size());
+			assert(t-1 >= 0);
+			assert(q-1 >= 0);
+			int  tmpMatchScore = scoreFn.Match(tSeq, t-1, qSeq, q-1);
+			matchScore = scoreMat[rc2index(q - 1, k + t - q, nCols)] + tmpMatchScore;
+
+			//
+			//  Possibly on right boundary of k-band, in which
+			//  case do not allow insertions from q.
+			if (t == q + k ) {
+				insScore = INF_INT;
+			}
+			else {
+				// cur row = q
+				// cur col = t - q
+				// therefore insertion col = t - q + 1
+				insScore = scoreMat[rc2index(q-1, k + t - q+1, nCols)] + scoreFn.Insertion(tSeq, (DNALength) t-1, qSeq, q-1);
+			}
+		
+			int minScore = MIN(matchScore, MIN(insScore, delScore));
+			int curIndex = rc2index(q, k + t - q, nCols);
+			assert(curIndex < scoreMat.size());
+			scoreMat[curIndex] = minScore;
+      int nEqual = 0;
+      (matchScore == minScore ? nEqual++ : nEqual );
+      (insScore == minScore ? nEqual++ : nEqual );
+      (delScore == minScore ? nEqual++ : nEqual );
+      if (samplePaths == false or nEqual == 1) {
+        if (minScore == matchScore) {
+          pathMat[curIndex] = Diagonal;
+        }
+        else if (minScore == delScore) {
+          pathMat[curIndex] = Left;
+        }
+        else {
+          pathMat[curIndex] = Up;
+        }
+      }
+      else {
+        //
+        // When there are paths of equal score reaching 
+        //
+        if (nEqual == 3) {
+          int v = RandomInt(3);
+          if (v == 0) { pathMat[curIndex] = Diagonal; }
+          else if (v == 1) { pathMat[curIndex] = Left; }
+          else if (v == 2) { pathMat[curIndex] = Up; }
+        }
+        else {
+          assert(nEqual == 2);
+          int v = RandomInt(2);
+          if (matchScore == insScore) {
+            if (v == 0) { pathMat[curIndex] = Diagonal; } else { pathMat[curIndex] = Up; }
+          }
+          else if (matchScore == delScore) {
+            if (v == 0) { pathMat[curIndex] = Diagonal; } else { pathMat[curIndex] = Left; }
+          }
+          else if (delScore == insScore) {
+            if (v == 0) { pathMat[curIndex] = Left; } else { pathMat[curIndex] = Up; }
+          }
+          else {
+            std::cout << "ERROR, counted two values equal to the minimum but cannot find them." << std::endl;
+            assert(0);
+          }
+        }
+        alignment.nSampledPaths++;
+      }
+		}
+	}
+
+	//
+	// Now create the alignment.
+	//
+	
+	q = qLen ;
+	t = k - (qLen - tLen);
+
+	int globalMinScore;
+	int minLastColScoreIndex, minLastRowScoreIndex;
+	globalMinScore = scoreMat[rc2index(q,t,nCols)];
+	int minLastColScore = globalMinScore, minLastRowScore = globalMinScore;
+
+	if (alignType == QueryFit or alignType == Fit) {
+		int q2,t2;
+		q2 = qLen;
+		t2 = k - (qLen - tLen);
+		UInt qi, qend;
+		bool minScoreSet = false;
+		int minScoreIndex;
+		for (t2 = q - k; t2 < q2 + k + 1; t2++) {
+			if (t2 < 1)
+				continue;
+			if (t2 > tLen)
+				continue;
+      //      std::cout << t2 << " " << tLen << " " << " " << scoreMat[rc2index(q2, k+t2-q,nCols)] << " " << minLastRowScore <<std::endl;
+			if (minScoreSet == false or scoreMat[rc2index(q2, k+t2-q,nCols)] < minLastRowScore){ 
+				minScoreSet     = true;
+				minLastRowScore = scoreMat[rc2index(q2,k+t2-q,nCols)];
+				minLastRowScoreIndex   = t2;
+			}
+		}
+		if (minScoreSet) {
+      t2 = k - (q - minLastRowScoreIndex);
+			t = t2; 
+			q = q2;
+		}
+	}
+	if (alignType == TargetFit or alignType == Fit) {
+		//  Fit the target inside the query wh
+		int q2,t2;
+		q2 = qLen;
+		t2 = k - (qLen - tLen);
+		bool minScoreSet = false;
+		for (q2 = qLen; q2 >= tLen - k and q2 > 0; q2--) {
+			int index = rc2index(q2, k+tLen-q2, nCols);
+			if (minScoreSet == false or scoreMat[index] < minLastColScore) {
+				minLastColScore = scoreMat[index];
+				minScoreSet = true;
+				minLastColScoreIndex = q2;
+			}
+		}
+		if (alignType == Fit) {
+			if (minLastColScore < minLastRowScore) {
+				t = t2;
+				q = minLastColScoreIndex;
+			}
+		}
+		else if (alignType == TargetFit) {
+			t = t2;
+			q = minLastColScoreIndex;
+		}
+	}
+
+	std::vector<Arrow>  optAlignment;
+	int optScore = scoreMat[rc2index(q, t, nCols)];
+	Arrow arrow;
+	/*
+	PrintFlatMatrix(&pathMat[0], qLen + 1, nCols, debugOut);
+	std::cout << std::endl;
+  ofstream debugOut;
+  stringstream debugOutName;
+  debugOutName << "kband_" << kbandcounter << ".table";
+  debugOut.open(debugOutName.str().c_str());
+	PrintFlatMatrix(&scoreMat[0], qLen + 1, nCols, debugOut);
+  kbandcounter++;
+  */
+  /*
+	std::cout << std::endl;
+	*/
+	//
+	// Use some logic to deal with unsigned types.  When t > k, t must
+	// also be greater than 0, so it's not worth checking to see if it
+	// hits a boundary.
+	//
+	if (alignType == Global or alignType == QueryFit) {
+		while (q > 0 and (t < k ? (k - t != q) : true)) {
+			arrow = pathMat[rc2index(q,t, nCols)];
+			if (arrow == NoArrow) {
+				break;
+			}
+			optAlignment.push_back(arrow);
+			if (arrow == Diagonal) {
+				q--;
+			}
+			else if (arrow == Up) {
+				q--;
+				t++;
+			}
+			else if (arrow == Left) {
+				t--;
+			}
+		}
+	}
+	else if (alignType == Fit) {
+		while (q > 0 and (t < k ? (k - t != q) : true)  and  ( q <= k ? k - q != t : true) ) {
+			arrow = pathMat[rc2index(q,t, nCols)];
+			if (arrow == NoArrow) {
+				break;
+			}
+			optAlignment.push_back(arrow);
+			if (arrow == Diagonal) {
+				q--;
+			}
+			else if (arrow == Up) {
+				q--;
+				t++;
+			}
+			else if (arrow == Left) {
+				t--;
+			}
+		}
+	}
+	else if (alignType == TargetFit) {
+		while (q > 0 and ( q < k ? k - q != t : true) ) {
+			arrow = pathMat[rc2index(q,t, nCols)];
+			if (arrow == NoArrow) {
+				break;
+			}
+			optAlignment.push_back(arrow);
+			if (arrow == Diagonal) {
+				q--;
+			}
+			else if (arrow == Up) {
+				q--;
+				t++;
+			}
+			else if (arrow == Left) {
+				t--;
+			}
+		}
+	}
+
+	// remove the boundary condition.
+	//optAlignment.pop_back();
+	//	qSeq.Free();
+	//	tSeq.Free();
+	alignment.qPos = q;
+	
+	//
+	// Use a little extra logic to deal with the unsignedness of indices.
+	//
+	if (t < k) {
+		alignment.tPos = (k - t) - q;
+	}
+	else {
+		alignment.tPos = (t - k) - q;
+	}
+	std::reverse(optAlignment.begin(), optAlignment.end());
+	alignment.ArrowPathToAlignment(optAlignment);
+	return optScore;
+}
+
+#endif // _BLASR_K_BAND_ALIGN_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/OneGapAlignment.hpp b/libcpp/alignment/algorithms/alignment/OneGapAlignment.hpp
new file mode 100644
index 0000000..33405e6
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/OneGapAlignment.hpp
@@ -0,0 +1,374 @@
+#ifndef _BLASR_ONEGAP_ALIGNMENT_HPP_
+#define _BLASR_ONEGAP_ALIGNMENT_HPP_
+
+#include <limits.h>
+#include "Types.h"
+#include "FASTQSequence.hpp"
+#include "matrix/FlatMatrix.hpp"
+#include "datastructures/alignment/Path.h"
+#include "datastructures/alignment/Alignment.hpp"
+
+/*
+   Perform gapped alignment that aligns the entire query sequence to
+   leftTarget, rightTarget, or between the two with a gap in between.
+   The gap between leftTarget and rightTarget is an affine gap. 
+   */
+
+template<typename T_QuerySequence, typename T_RefSequence, typename T_ScoreFunction> 
+int OneGapAlign(T_QuerySequence &query, 
+        T_RefSequence &leftTarget, 
+        T_RefSequence &rightTarget, 
+        DNALength   distanceBetweenLeftAndRightTarget,
+        T_ScoreFunction &scoreFn,
+        Alignment   &alignment, 
+        FlatMatrix2D<int> & scoreMat, FlatMatrix2D<Arrow> & pathMat, 
+        FlatMatrix2D<int> &affineScoreMat, FlatMatrix2D<Arrow> &affinePathMat) {
+
+    /*
+       Perform alignment that spans what is effectively two pairs of
+       matrices.  This is implemented as a single matrix, however paths
+       may only transition through the boundary between the two through
+       the affine portion of the matrices.  
+
+       leftTarget    rightTarget
+       affine   |==============|
+       |   x------>x  |
+       |   ^       |  |
+       |===|=======|==|
+       |       |
+       regular  |===|=+||===|=+|
+       |   x  ||   |  |
+       |      ||   v  |
+       |======||======|
+
+
+*/
+
+
+    UInt nQueryRows, nLeftTargetCols, nRightTargetCols;
+    UInt nTargetCols;
+    nQueryRows = query.length + 1;
+    nLeftTargetCols  = leftTarget.length + 1;
+    nRightTargetCols = rightTarget.length;
+    nTargetCols = nLeftTargetCols + nRightTargetCols;
+
+    //
+    // Create the matrices
+    // 
+    affineScoreMat.Grow(nQueryRows,  nTargetCols);
+    affinePathMat.Grow(nQueryRows,  nTargetCols);
+
+    scoreMat.Grow(nQueryRows, nTargetCols);
+    pathMat.Grow(nQueryRows, nTargetCols);
+
+    //
+    // Initialize to undefined for debugging purposes.
+    //
+    affineScoreMat.Initialize(0);
+    affinePathMat.Initialize(NoArrow);
+
+    scoreMat.Initialize(0);
+    pathMat.Initialize(NoArrow);
+
+    // Initialize insertion and deletion strips
+    UInt i, j;
+    scoreMat[0][0] = 0;
+    pathMat[0][0]  = NoArrow;
+    affineScoreMat[0][0] = 0;
+    // always drop down to 0,0 at end of affine gap.
+    affinePathMat[0][0]  = AffineDelOpen;
+    for (i = 1; i < nQueryRows; i++) {
+        scoreMat[i][0] = scoreMat[i-1][0] + scoreFn.ins;
+        pathMat[i][0]  = Up;
+        //
+        // Affine gaps can only start here.
+        //
+        affineScoreMat[i][0] = scoreMat[i][0];
+        affinePathMat[i][0]  = AffineDelOpen; 
+    }
+
+    for (j = 1; j < nTargetCols; j++) {
+        scoreMat[0][j] = scoreMat[0][j-1] + scoreFn.del;
+        pathMat[0][j]  = Left;
+        //
+        // Allow free affine transition across first row.
+        //
+        affineScoreMat[0][j] = 0;
+        affinePathMat[0][j]  = Left;
+    }
+
+
+    //  Now run the alignment.
+    //  i and j index over positions in the query/target sequences, or
+    //  [0,len(seq)).  Since the score mat are of length len(seq) + 1,
+    //  the indices of the score matrices are [1, len(seq) + 1)
+    for (i = 0; i < query.length; i++) {
+
+        //
+        // First align a row of the left target, allowing for transition
+        // up to the big affine gap. No transitions down from affine gap
+        // are allowed.
+        //
+        for (j = 0; j < leftTarget.length; j++) {
+            //
+            // First, assign the non-affine score.
+            //
+            int matchScore, insScore, delScore;
+            // Remember mapping:
+            // scoreMat[i+1][j+1] = position to fill
+            // scoreMat[i+1][j] ==> back one column
+            // scoreMat[i][j+1] ==> up one row.
+            matchScore = scoreMat[i][j]   + scoreFn.Match(leftTarget, j, query, i);
+            insScore   = scoreMat[i][j+1] + scoreFn.Insertion(leftTarget, j, query, i);
+            delScore   = scoreMat[i+1][j] + scoreFn.Deletion(leftTarget, j, query, i);
+
+            int minScore = min(matchScore, min(insScore, delScore));
+            scoreMat[i+1][j+1] = minScore;
+
+
+            // set path.
+            if (matchScore  == minScore) {
+                pathMat[i+1][j+1]  = Diagonal;
+            }
+            else if (insScore == minScore) {
+                pathMat[i+1][j+1]  = Up;
+            }
+            else {
+                assert(delScore == minScore);
+                pathMat[i+1][j+1]  = Left;
+            }
+
+            //
+            // Next, assign the affine score
+            //
+            if (affineScoreMat[i+1][j] < scoreMat[i+1][j+1]) {
+                affineScoreMat[i+1][j+1] = affineScoreMat[i+1][j];
+                affinePathMat[i+1][j+1]  = Left;
+            }
+            else {
+                // Allow free gap open... maybe this will change.
+                affineScoreMat[i+1][j+1] = scoreMat[i+1][j+1]; 
+                affinePathMat[i+1][j+1]  = AffineDelOpen;
+            }
+        }
+
+        //
+        // Now align the right target, allowing a jump over the divide.  
+        //
+        int affineCloseScore;
+        j = 0; 
+        //
+        // A match here may only be preceded by an affine gap close.
+        //
+        int matchScore, delScore, insScore, minScore;
+        matchScore = affineScoreMat[i][leftTarget.length] + scoreFn.Match(rightTarget, j, query, i);
+        //
+        // Cannot have a non-affine deletion here.
+        delScore   = INT_MAX;
+        //
+        // The insertion is a horizontal move, so that is all allowed.
+        //
+        insScore   = scoreFn.Insertion(rightTarget, j, query, i - 1);
+
+
+        minScore = min(matchScore, insScore);
+        UInt targetCol = leftTarget.length;
+
+        assert(scoreMat[i+1][targetCol+1] == 0);
+        assert(pathMat[i+1][targetCol+1] == NoArrow);
+        scoreMat[i+1][targetCol+1] = minScore;      
+
+        if (minScore == matchScore) {
+            pathMat[i+1][targetCol+1]  = AffineLongDelClose;
+        }
+        else {
+            assert(minScore == insScore);
+            pathMat[i+1][targetCol+1]  = Up;
+        }
+
+        //
+        // The affine matrix on the right side can only progress forward.
+        //
+        affineScoreMat[i+1][targetCol+1] = affineScoreMat[i+1][targetCol];
+        affinePathMat[i+1][targetCol+1]  = AffineLongDelLeft;
+
+
+        for (j = 1; j < rightTarget.length; j++) {
+            targetCol = leftTarget.length + j;
+            matchScore = scoreMat[i][targetCol] + scoreFn.Match(rightTarget, j, query, i);
+            insScore   = scoreMat[i][targetCol+1] + scoreFn.Insertion(rightTarget, j, query, i);
+            delScore   = scoreMat[i+1][targetCol] + scoreFn.Deletion(rightTarget, j, query, i);
+            affineCloseScore = affineScoreMat[i][targetCol] + scoreFn.Match(rightTarget, j, query, i);
+
+            minScore = min(matchScore, min(insScore, min(delScore, affineCloseScore)));
+
+            scoreMat[i+1][targetCol+1] = minScore;
+            if (minScore == matchScore) {
+                pathMat[i+1][targetCol+1]  = Diagonal;
+            }
+            else if (minScore == insScore) {
+                pathMat[i+1][targetCol+1] = Up;
+            }
+            else if (minScore == delScore) {
+                pathMat[i+1][targetCol+1] = Left;
+            }
+            else {
+                assert(minScore == affineCloseScore);
+                pathMat[i+1][targetCol+1] = AffineLongDelClose;
+            }
+
+            //
+            // As with before, the affine matrix on the right side can
+            // only progress forward.
+            // 
+            affineScoreMat[i+1][targetCol+1] = affineScoreMat[i+1][targetCol];
+            affinePathMat[i+1][targetCol+1]  = Left;
+        } // done aligning right target
+    } // done aligning full query
+
+    //
+    // Now build the alignment string
+    //
+    i = nQueryRows - 1;
+    j = nTargetCols - 1;
+    vector<Arrow> optAlignment;
+
+    int REGULAR = 0;
+    int AFFINE  = 1;
+
+    int curMatrix = REGULAR;
+    Arrow arrow;
+
+    /*
+       cout << "score " << endl;
+       PrintFlatMatrix(scoreMat.matrix, scoreMat.nRows, scoreMat.nCols, cout, 3);
+       cout << "path " << endl;
+       PrintFlatMatrix(pathMat.matrix, scoreMat.nRows, scoreMat.nCols, cout, 3);
+       cout << "affine score " << endl;
+       PrintFlatMatrix(affineScoreMat.matrix, scoreMat.nRows, scoreMat.nCols, cout, 3);
+       cout << "affine path " << endl;
+       PrintFlatMatrix(affinePathMat.matrix, scoreMat.nRows, scoreMat.nCols, cout, 3);
+       */
+    int optScore = scoreMat[i][j];
+    while (i > 0 or j > 0 or curMatrix == AFFINE) {
+        if (curMatrix == REGULAR) {
+            arrow = pathMat[i][j];
+            if (arrow == Diagonal) {
+                optAlignment.push_back(arrow);
+                i--;
+                j--;
+            }
+            else if (arrow == Left) {
+                optAlignment.push_back(arrow);
+
+                j--;
+            }
+            else if (arrow == Up) {
+                optAlignment.push_back(arrow);
+                i--;
+            }
+            else if (arrow == AffineLongDelClose) {
+                optAlignment.push_back(Left);
+                j--;
+                i--;
+                curMatrix = AFFINE;
+            }
+        }
+        else {
+            // in affine matrix
+            arrow = affinePathMat[i][j];
+            if (arrow == Left or arrow == AffineLongDelLeft) {
+                optAlignment.push_back(arrow);
+                j--;
+            }
+            else if (arrow == AffineDelOpen) {
+                //
+                // no change in i nor j, and this does not result in an
+                // arrow.
+                // Drop down to the regular alignment matrix.
+                //
+                curMatrix = REGULAR;
+            }
+        }
+        assert(arrow != NoArrow);
+        //
+        // Check for wrap around.
+        //
+        assert(i != UINT_MAX);
+        assert(j != UINT_MAX);
+    } // done tracing alignment path.
+    std::reverse(optAlignment.begin(), optAlignment.end());    
+    alignment.LongGapArrowPathToAlignment(optAlignment, distanceBetweenLeftAndRightTarget);
+    return optScore;
+}
+
+//
+// Create a version that does not need reusable mapping buffers.
+//
+
+template<typename T_QuerySequence, typename T_RefSequence, typename T_ScoreFunction>
+int OneGapAlign(T_QuerySequence &query, 
+        T_RefSequence &leftTarget, 
+        T_RefSequence &rightTarget, 
+        DNALength   distanceBetweenLeftAndRightTarget,
+        T_ScoreFunction &scoreFn,
+        Alignment   &alignment) {
+
+    FlatMatrix2D<int>   scoreMat;
+    FlatMatrix2D<int>   affineScoreMat;
+    FlatMatrix2D<Arrow> pathMat;
+    FlatMatrix2D<Arrow> affinePathMat;
+
+
+    return OneGapAlign(query, leftTarget, rightTarget, 
+            distanceBetweenLeftAndRightTarget,
+            scoreFn,
+            alignment,
+            scoreMat, pathMat,
+            affineScoreMat, affinePathMat);
+}
+
+
+template<typename T_QuerySequence, typename T_RefSequence, typename T_ScoreFunction, typename T_BufferList> 
+int OneGapAlign(T_QuerySequence &query, 
+        T_RefSequence   &leftTarget, 
+        T_RefSequence   &rightTarget, 
+        DNALength   distanceBetweenLeftAndRightTarget,
+        T_ScoreFunction &scoreFn,
+        T_BufferList &buffers,
+        Alignment   &alignment) {
+
+    return OneGapAlign(query, leftTarget, rightTarget, distanceBetweenLeftAndRightTarget, alignment,
+            buffers.scoreMat, buffers.pathMat,
+            buffers.affineScoreMat, buffers.affinePathMat);
+
+}
+
+template<typename T_QuerySequence, typename T_RefSequence, typename T_ScoreFunction, typename T_BufferList> 
+int OneGapAlign(T_QuerySequence &query,
+        T_RefSequence   &reference,
+        T_ScoreFunction &scoreFunction,
+        T_BufferList &buffers,
+        Alignment &alignment) {
+
+    T_RefSequence leftReference, rightReference;
+    UInt leftReferenceLength = min(reference.length, query.length);
+    leftReference.ReferenceSubstring(reference, 0, leftReferenceLength);
+
+    UInt rightReferenceLength = min(reference.length - leftReferenceLength, query.length);
+    rightReference.ReferenceSubstring(reference, reference.length - rightReferenceLength, rightReferenceLength);
+
+    DNALength distanceBetweenLeftAndRight = reference.length - rightReferenceLength - leftReferenceLength;
+
+    assert(distanceBetweenLeftAndRight >= 0);
+
+    return OneGapAlign(query, 
+            leftReference, 
+            rightReference, 
+            distanceBetweenLeftAndRight,
+            scoreFunction, alignment);
+}
+
+
+
+#endif // _BLASR_ONEGAP_ALIGNMENT_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/QualityValueScoreFunction.cpp b/libcpp/alignment/algorithms/alignment/QualityValueScoreFunction.cpp
new file mode 100644
index 0000000..c73b49e
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/QualityValueScoreFunction.cpp
@@ -0,0 +1,90 @@
+#include "QualityValueScoreFunction.hpp"
+
+int QualityScoreTypeNotSpecified(const std::string func) {
+    std::cout << func << " must be specialized with FASTQ or "
+              << "FASTA sequencecs." << std::endl;
+    exit(1);
+    return 0;
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int QualityValueScoreFunction<T_RefSequence, T_QuerySequence>::Deletion(
+    T_RefSequence &seq, DNALength refPos, T_QuerySequence &querySeq, 
+    DNALength queryPos) {
+    return QualityScoreTypeNotSpecified("Deletion");
+}
+		
+template<typename T_RefSequence, typename T_QuerySequence>
+int QualityValueScoreFunction<T_RefSequence, T_QuerySequence>::Deletion(
+    T_RefSequence &seq, DNALength pos) {
+    return QualityScoreTypeNotSpecified("Deletion");
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int QualityValueScoreFunction<T_RefSequence, T_QuerySequence>::Match(
+    T_RefSequence &ref, DNALength refPos, T_QuerySequence &query, 
+    DNALength queryPos) {
+    return QualityScoreTypeNotSpecified("Match");
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int QualityValueScoreFunction<T_RefSequence, T_QuerySequence>::Insertion(
+    T_RefSequence &ref, DNALength refPos, T_QuerySequence &seq, 
+    DNALength pos) {
+    return QualityScoreTypeNotSpecified("Insertion");
+}
+
+template<typename T_RefSequence, typename T_QuerySequence>
+int QualityValueScoreFunction<T_RefSequence, T_QuerySequence>::Insertion(
+    T_QuerySequence &seq, DNALength pos) {
+    return QualityScoreTypeNotSpecified("Insertion");
+}
+
+/*
+ * Define all specializations for a FASTA reference and FASTQSequence 
+ * for the query, or FASTA sequence for query.
+ */
+template<>
+int QualityValueScoreFunction<FASTASequence, FASTQSequence>::Deletion(
+    FASTASequence &ref, DNALength pos) {
+    return del; // For now there is no global deletion quality value.
+}
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Deletion(
+    DNASequence &ref, DNALength pos) {
+    return del; // For now there is no global deletion quality value.
+}
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Deletion(
+    DNASequence &seq, DNALength refPos, FASTQSequence &querySeq,
+    DNALength queryPos) {
+    return Deletion(seq, refPos);
+}
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Insertion(
+    FASTQSequence &query, DNALength pos) {
+    // Positive value for quality value penalizes the alignment.
+    return query.qual[pos];
+}
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Insertion(
+    DNASequence &ref, DNALength refPos, FASTQSequence &query, 
+    DNALength pos) {
+    // Positive value for quality value penalizes the alignment.
+    // return query.qual[pos];
+    // return Insertion(query, pos);
+    return ins;
+}
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Match(
+    DNASequence &ref, DNALength refPos, FASTQSequence &query, 
+    DNALength queryPos) {
+    // Positive value for quality value penalizes the alignment.
+    return (QVDistanceMatrix[ThreeBit[query.seq[queryPos]]][ThreeBit[ref.seq[refPos]]]
+            * query.qual[queryPos]);
+}
diff --git a/libcpp/alignment/algorithms/alignment/QualityValueScoreFunction.hpp b/libcpp/alignment/algorithms/alignment/QualityValueScoreFunction.hpp
new file mode 100644
index 0000000..670b42f
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/QualityValueScoreFunction.hpp
@@ -0,0 +1,56 @@
+#ifndef _BLASR_QUALITY_VALUE_SCORE_FUNCTION_HPP_
+#define _BLASR_QUALITY_VALUE_SCORE_FUNCTION_HPP_
+#include "FASTASequence.hpp"
+#include "FASTQSequence.hpp"
+#include "NucConversion.hpp"
+#include "ScoreMatrices.hpp"
+#include "BaseScoreFunction.hpp"
+
+template<typename T_RefSequence, typename T_QuerySequence>
+class QualityValueScoreFunction: public BaseScoreFunction{
+public:
+    int Deletion(T_RefSequence &seq, DNALength refPos, 
+        T_QuerySequence &querySeq, DNALength queryPos);
+    int Deletion(T_RefSequence &seq, DNALength pos);
+
+    int Match(T_RefSequence &ref, DNALength refPos, 
+        T_QuerySequence &query, DNALength queryPos);
+
+    int Insertion(T_RefSequence &ref, DNALength refPos,
+        T_QuerySequence &seq, DNALength pos);
+    int Insertion(T_QuerySequence &seq, DNALength pos);
+};
+
+
+//
+// Define all specializations for a FASTA reference and 
+// FASTQSequence for the query, or FASTA sequence for query.
+//
+template<>
+int QualityValueScoreFunction<FASTASequence, FASTQSequence>::Deletion(
+    FASTASequence &ref, DNALength pos);
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Deletion(
+    DNASequence &ref, DNALength pos);
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Deletion(
+    DNASequence &seq, DNALength refPos, FASTQSequence &querySeq, 
+    DNALength queryPos);
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Insertion(
+    FASTQSequence &query, DNALength pos);
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Insertion(
+    DNASequence &ref, DNALength refPos, FASTQSequence &query, 
+    DNALength pos);
+
+template<>
+int QualityValueScoreFunction<DNASequence, FASTQSequence>::Match(
+    DNASequence &ref, DNALength refPos, FASTQSequence &query, 
+    DNALength queryPos);
+
+#endif
diff --git a/libcpp/alignment/algorithms/alignment/SDPAlign.hpp b/libcpp/alignment/algorithms/alignment/SDPAlign.hpp
new file mode 100644
index 0000000..14c3b23
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/SDPAlign.hpp
@@ -0,0 +1,64 @@
+#ifndef _BLASR_SDP_ALIGN_HPP_
+#define _BLASR_SDP_ALIGN_HPP_
+
+#include "DNASequence.hpp"
+#include "tuples/TupleMatching.hpp"
+#include "sdp/SDPFragment.hpp"
+#include "FASTASequence.hpp"
+#include "FASTQSequence.hpp"
+#include "DistanceMatrixScoreFunction.hpp"
+
+#define SDP_DETAILED_WORD_SIZE 5
+#define SDP_PREFIX_LENGTH 50
+#define SDP_SUFFIX_LENGTH 50
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_ScoreFn>
+int SDPAlign(T_QuerySequence &query, T_TargetSequence &target,
+        T_ScoreFn &scoreFn, int wordSize, 
+        int sdpIns, int sdpDel, float indelRate,
+        blasr::Alignment &alignment, 
+        AlignmentType alignType=Global,
+        bool detailedAlignment=true,
+        bool extendFrontByLocalAlignment=true,
+        DNALength noRecurseUnder=10000,
+        bool fastSDP=true,
+        unsigned int minFragmentsToUseGraphPaper=100000);
+
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_ScoreFn, typename T_BufferCache>
+int SDPAlign(T_QuerySequence &query, T_TargetSequence &target,
+        T_ScoreFn &scoreFn, int wordSize, 
+        int sdpIns, int sdpDel, float indelRate,
+        blasr::Alignment &alignment, 
+        T_BufferCache &buffers,
+        AlignmentType alignType=Global,
+        bool detailedAlignment=true,
+        bool extendFrontByLocalAlignment=true, 
+        DNALength noRecurseUnder=10000,
+        bool fastSDP=true,
+        unsigned int minFragmentsToUseGraphPaper=100000);
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_ScoreFn, typename T_TupleList>
+int SDPAlign(T_QuerySequence &query, T_TargetSequence &target,
+        T_ScoreFn &scoreFn,
+        int wordSize, 
+        int sdpIns, int sdpDel, float indelRate,
+        blasr::Alignment &alignment, 
+        std::vector<Fragment> &fragmentSet,
+        std::vector<Fragment> &prefixFragmentSet,
+        std::vector<Fragment> &suffixFragmentSet,
+        T_TupleList &targetTupleList,
+        T_TupleList &targetPrefixTupleList,
+        T_TupleList &targetSuffixTupleList,
+        std::vector<int> &maxFragmentChain,
+        // A few optinal parameters, should delete that last one.
+        AlignmentType alignType=Global,
+        bool detailedAlignment=true,
+        bool extendFrontByLocalAlignment=true, 
+        DNALength noRecurseUnder=10000,
+        bool fastSDP=true,
+        unsigned int minFragmentsToUseGraphPaper=100000);
+
+#include "SDPAlignImpl.hpp"
+
+#endif // _BLASR_SDP_ALIGN_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/SDPAlignImpl.hpp b/libcpp/alignment/algorithms/alignment/SDPAlignImpl.hpp
new file mode 100644
index 0000000..140b667
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/SDPAlignImpl.hpp
@@ -0,0 +1,614 @@
+#ifndef _BLASR_SDP_ALIGN_IMPL_HPP_
+#define _BLASR_SDP_ALIGN_IMPL_HPP_
+
+#include <cstddef>
+#include <vector>
+#include <math.h>
+#include <cstdlib>
+#include <ostream>
+#include "Types.h"
+#include "defs.h"
+#include "utils.hpp"
+#include "Enumerations.h"
+#include "DNASequence.hpp"
+#include "matrix/FlatMatrix.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "sdp/SDPFragment.hpp"
+#include "GraphPaper.hpp"
+#include "AlignmentUtils.hpp"
+#include "SWAlign.hpp"
+#include "sdp/SparseDynamicProgramming.hpp"
+#include "SDPAlign.hpp"
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_ScoreFn>
+int SDPAlign(T_QuerySequence &query, T_TargetSequence &target,
+        T_ScoreFn &scoreFn, int wordSize, 
+        int sdpIns, int sdpDel, float indelRate,
+        blasr::Alignment &alignment, 
+        AlignmentType alignType,
+        bool detailedAlignment,
+        bool extendFrontByLocalAlignment,
+        DNALength noRecurseUnder,
+        bool fastSDP,
+        unsigned int minFragmentsToUseGraphPaper) {
+    /*
+       Since SDP Align uses a large list of buffers, but none are
+       provided with this mechanism of calling SDPAlign, allocate the
+       buffers on the stack.
+       */
+    std::vector<Fragment> fragmentSet, prefixFragmentSet, suffixFragmentSet;
+    TupleList<PositionDNATuple> targetTupleList;
+    TupleList<PositionDNATuple> targetPrefixTupleList;
+    TupleList<PositionDNATuple> targetSuffixTupleList;
+    std::vector<int> maxFragmentChain;
+
+    return SDPAlign(query, target,
+            scoreFn, wordSize, 
+            sdpIns, sdpDel, indelRate,
+            alignment, 
+            fragmentSet, prefixFragmentSet, suffixFragmentSet, 
+            targetTupleList, targetPrefixTupleList, targetSuffixTupleList,
+            maxFragmentChain,
+            alignType,
+            detailedAlignment,
+            extendFrontByLocalAlignment,
+            noRecurseUnder,
+            minFragmentsToUseGraphPaper);
+}
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_ScoreFn, typename T_BufferCache>
+int SDPAlign(T_QuerySequence &query, T_TargetSequence &target,
+        T_ScoreFn &scoreFn, int wordSize, 
+        int sdpIns, int sdpDel, float indelRate,
+        blasr::Alignment &alignment, 
+        T_BufferCache &buffers,
+        AlignmentType alignType,
+        bool detailedAlignment,
+        bool extendFrontByLocalAlignment, 
+        DNALength noRecurseUnder,
+        bool fastSDP,
+        unsigned int minFragmentsToUseGraphPaper) {
+
+    return SDPAlign(query, target, scoreFn, wordSize, 
+            sdpIns, sdpDel, indelRate,
+            alignment,  
+            buffers.sdpFragmentSet,
+            buffers.sdpPrefixFragmentSet,
+            buffers.sdpSuffixFragmentSet,
+            buffers.sdpCachedTargetTupleList,
+            buffers.sdpCachedTargetPrefixTupleList,
+            buffers.sdpCachedTargetSuffixTupleList,
+            buffers.sdpCachedMaxFragmentChain,
+            alignType, detailedAlignment, 
+            extendFrontByLocalAlignment, noRecurseUnder,
+            fastSDP, minFragmentsToUseGraphPaper);
+}
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_ScoreFn, typename T_TupleList>
+int SDPAlign(T_QuerySequence &query, T_TargetSequence &target,
+        T_ScoreFn &scoreFn,
+        int wordSize, 
+        int sdpIns, int sdpDel, float indelRate,
+        blasr::Alignment &alignment, 
+        std::vector<Fragment> &fragmentSet,
+        std::vector<Fragment> &prefixFragmentSet,
+        std::vector<Fragment> &suffixFragmentSet,
+        T_TupleList &targetTupleList,
+        T_TupleList &targetPrefixTupleList,
+        T_TupleList &targetSuffixTupleList,
+        std::vector<int> &maxFragmentChain,
+        // A few optinal parameters, should delete that last one.
+        AlignmentType alignType,
+        bool detailedAlignment,
+        bool extendFrontByLocalAlignment, 
+        DNALength noRecurseUnder,
+        bool fastSDP,
+        unsigned int minFragmentsToUseGraphPaper) {
+    // minFragmentsToUseGraphPaper: minimum number of fragments to 
+    // use Graph Paper for speed up.
+
+    fragmentSet.clear();
+    prefixFragmentSet.clear();
+    suffixFragmentSet.clear();
+    targetTupleList.clear();
+    targetPrefixTupleList.clear();
+    targetSuffixTupleList.clear();
+    maxFragmentChain.clear();
+
+    //
+    //	Collect a set of matching fragments between query and target.
+    //  Since this function is an inner-loop for alignment, anything to
+    //	speed it up will help.  One way to speed it up is to re-use the
+    //	vectors that contain the sdp matches. 
+    //
+
+    TupleMetrics tm, tmSmall;
+    tm.Initialize(wordSize);
+
+    int smallWordSize = (wordSize < SDP_DETAILED_WORD_SIZE ? wordSize : SDP_DETAILED_WORD_SIZE);
+    tmSmall.Initialize(smallWordSize);
+
+    //
+    // Partition the read into a prefix, middle, and suffix.  The prefix
+    // and suffix are matched using a smaller word size allowing for
+    // higher sensitivity at the ends of reads, which are more likely to
+    // be misaligned.
+    //
+    int prefixLength, middleLength, suffixLength, middlePos, suffixPos; // prefix pos is 0
+    prefixLength = min(target.length, (DNALength) SDP_PREFIX_LENGTH);
+    suffixLength = min(target.length - prefixLength, (DNALength) SDP_SUFFIX_LENGTH);
+    middleLength = target.length - prefixLength - suffixLength;
+
+    DNASequence prefix, middle, suffix;
+    DNASequence qPrefix, qMiddle, qSuffix;
+    DNALength pos = 0;
+    prefix.seq = &target.seq[pos];
+    prefix.length = prefixLength;
+    pos += prefixLength;
+
+    // Align the entire query against the entire target to get alignments 
+    // in the middle.
+    middlePos = 0;
+    middle.seq = &target.seq[0];
+    middle.length = target.length;
+
+    pos += middleLength;
+    suffixPos = pos; // while = prefixLength + middleLength
+    suffix.seq = &target.seq[suffixPos];
+    suffix.length = suffixLength;
+
+    int qPrefixLength, qMiddleLength, qSuffixLength, qMiddlePos, qSuffixPos; // prefix pos is 0
+    qPrefixLength = min(query.length, (DNALength) SDP_PREFIX_LENGTH);
+    qSuffixLength = min(query.length - qPrefixLength, (DNALength) SDP_SUFFIX_LENGTH);
+    qMiddleLength = query.length - qPrefixLength - qSuffixLength;
+
+    pos = 0;
+    qPrefix.seq = &query.seq[pos];
+    qPrefix.length = qPrefixLength;
+
+    // Align the entire query against the entire target to get alignments 
+    // in the middle.
+    qMiddle.seq = &query.seq[0];
+    qMiddle.length = query.length;
+    qMiddlePos = pos += qPrefixLength;
+
+    qSuffixPos = pos += qMiddleLength; // = qPrefixLength + qMiddleLength
+    qSuffix.seq = &query.seq[qSuffixPos];
+    qSuffix.length = qSuffixLength;
+
+	fragmentSet.clear();
+    SequenceToTupleList(prefix, tmSmall, targetPrefixTupleList);
+    SequenceToTupleList(suffix, tmSmall, targetSuffixTupleList);
+    SequenceToTupleList(middle, tm, targetTupleList);
+
+    targetPrefixTupleList.Sort();
+    targetSuffixTupleList.Sort();
+    targetTupleList.Sort();
+
+
+    //
+    // Store in fragmentSet the tuples that match between the target
+    // and query.
+    //
+    StoreMatchingPositions(qPrefix, tmSmall, targetPrefixTupleList, prefixFragmentSet);
+    StoreMatchingPositions(qSuffix, tmSmall, targetSuffixTupleList, suffixFragmentSet);
+    StoreMatchingPositions(qMiddle, tm, targetTupleList, fragmentSet); 
+
+    // 
+    // The method to store matching positions is not weight aware.
+    // Store the weight here.
+    //
+    VectorIndex f;
+
+    for (f = 0; f < suffixFragmentSet.size(); f++) {
+        (suffixFragmentSet)[f].weight = tm.tupleSize;
+        (suffixFragmentSet)[f].length = tmSmall.tupleSize;
+    }
+    for (f = 0; f < prefixFragmentSet.size(); f++) {
+        (prefixFragmentSet)[f].weight = tm.tupleSize;
+        (prefixFragmentSet)[f].length = tmSmall.tupleSize;
+    }
+    for (f = 0; f < fragmentSet.size(); f++) {
+        (fragmentSet)[f].weight = tm.tupleSize;
+        (fragmentSet)[f].length = tm.tupleSize;
+    }
+
+    //
+    // Since different partitions of the read are matched, the locations
+    // of the matches do not have the correct position because of the
+    // offsets.  Fix that here.
+    for (f = 0; f < suffixFragmentSet.size(); f++) {
+        (suffixFragmentSet)[f].x += qSuffixPos;
+        (suffixFragmentSet)[f].y += suffixPos;
+    }
+
+    //
+    // Collect all fragments into one.
+    //
+    fragmentSet.insert(fragmentSet.begin(), prefixFragmentSet.begin(), prefixFragmentSet.end());
+    fragmentSet.insert(fragmentSet.end(), suffixFragmentSet.begin(), suffixFragmentSet.end());
+
+    FlatMatrix2D<int> graphScoreMat;
+    FlatMatrix2D<Arrow> graphPathMat;
+    FlatMatrix2D<int> graphBins;
+    int nOnOpt = fragmentSet.size();
+    if (fragmentSet.size() > minFragmentsToUseGraphPaper and fastSDP) {
+        int nCol = 50;
+        vector<bool> onOptPath(fragmentSet.size(), false);
+        nOnOpt = GraphPaper<Fragment>(fragmentSet, nCol, nCol,
+                                      graphBins, graphScoreMat, 
+                                      graphPathMat, onOptPath);
+        int prev = fragmentSet.size();
+        RemoveOffOpt(fragmentSet, onOptPath);
+    } 
+    graphScoreMat.Clear();
+    graphPathMat.Clear();
+    graphBins.Clear();
+
+    //
+    // Because there are fragments from multiple overlapping regions, remove
+    // any fragments that have the same starting coordinate as a
+    // previous fragment.
+    //
+    std::sort(fragmentSet.begin(), fragmentSet.end(), LexicographicFragmentSort<Fragment>());
+    f = 0;
+    int fCur = 0;
+    while (f + 1 <= fragmentSet.size()) {
+        fragmentSet[fCur] = fragmentSet[f];
+        while (f < fragmentSet.size() and fragmentSet[fCur].x == fragmentSet[f].x and fragmentSet[fCur].y == fragmentSet[f].y) {
+            f++;
+        }
+        fCur++;
+    }
+    fragmentSet.resize(fCur);
+  
+	if (fragmentSet.size() == 0) {
+		//
+		// This requires at least one seeded tuple to begin an alignment.
+		//
+		return 0;
+	}
+
+    //
+    // Find the longest chain of anchors.
+    //
+    SDPLongestCommonSubsequence(query.length, fragmentSet, tm.tupleSize, sdpIns, sdpDel, scoreFn.scoreMatrix[0][0], maxFragmentChain, alignType);
+
+    //
+    // Now turn the max fragment chain into a real alignment.
+    //
+    int startF;
+    blasr::Alignment chainAlignment;
+    alignment.qPos = 0;
+    alignment.tPos = 0;
+    Block block;
+    std::vector<int> fragScoreMat;
+    std::vector<Arrow> fragPathMat;
+
+    //
+    // Patch the sdp fragments into an alignment, possibly breaking the
+    // alignment if the gap between two fragments is too large.
+    //
+    for (f = 0; f < maxFragmentChain.size(); f++ ){ 
+        startF = f;
+        // Condense contiguous stretches.
+        while(f < maxFragmentChain.size()  - 1 and 
+              fragmentSet[maxFragmentChain[f]].x == fragmentSet[maxFragmentChain[f+1]].x - 1 and
+              fragmentSet[maxFragmentChain[f]].y == fragmentSet[maxFragmentChain[f+1]].y - 1) {
+            f++;
+        }
+
+        block.qPos = fragmentSet[maxFragmentChain[startF]].x;
+        block.tPos = fragmentSet[maxFragmentChain[startF]].y;
+
+        // Compute the block length as the difference between the starting
+        // point of the current block and ending point of the last
+        // overlapping block.  This was previously calculated by adding
+        // the number of merged blocks - 1 to the first block length.
+        // When the block lengths are heterogenous, this does not work,
+        // and it would be possible to have a block with a length that
+        // extends past the end of a sequence.  By taking the length as
+        // the difference here, it ensures this will not happen.
+        //
+        block.length = fragmentSet[maxFragmentChain[f]].x + fragmentSet[maxFragmentChain[f]].length - fragmentSet[maxFragmentChain[startF]].x;
+		chainAlignment.blocks.push_back(block);
+	}
+
+	//
+	// It may be possible that in regions of low similarity, spurious matches fit into the LCS.  
+	// Assume that indels cause the matches to diverge from the diagonal on a random walk.  If they 
+	// walk more than 3 standard deviations away from the diagonal, they are probably spurious. 
+	//
+	unsigned int b;
+	chainAlignment.qPos = 0;
+	chainAlignment.tPos = 0;
+
+    for (b = 0; b < chainAlignment.size()-1; b++){ 
+        if (chainAlignment.blocks[b].qPos + chainAlignment.blocks[b].length > chainAlignment.blocks[b+1].qPos) {
+            chainAlignment.blocks[b].length = (chainAlignment.blocks[b+1].qPos - chainAlignment.blocks[b].qPos);
+        }
+        if (chainAlignment.blocks[b].tPos + chainAlignment.blocks[b].length > chainAlignment.blocks[b+1].tPos) {
+            chainAlignment.blocks[b].length = (chainAlignment.blocks[b+1].tPos - chainAlignment.blocks[b].tPos);
+        }
+        // the min indel rate between the two chain blocks is the difference in diagonals between the two sequences.
+        int curDiag, nextDiag, diffDiag;
+        curDiag = chainAlignment.blocks[b].tPos - chainAlignment.blocks[b].qPos;
+        nextDiag = chainAlignment.blocks[b+1].tPos - chainAlignment.blocks[b+1].qPos;
+        diffDiag = std::abs(curDiag - nextDiag);
+
+        //
+        // It is expected that the deviation is at least 1, so discount for this
+        //
+        diffDiag--;
+        // compare the alignment distances.  
+    }
+
+    std::vector<bool> blockIsGood;
+    blockIsGood.resize(chainAlignment.size());
+    fill(blockIsGood.begin(), blockIsGood.end(), true);
+
+    //
+    // The hack that allows anchors of different lengths at the front
+    // and end of alignments (to increase sensitivity at the ends of
+    // sequences) has the side effect that there may be blocks that have
+    // zero length.  This shouldn't happen, so to balance this out
+    // remove blocks that have zero length.
+    //
+    bool badBlock;
+    for (b = 0; b < chainAlignment.size(); b++){ 
+        if (chainAlignment.blocks[b].length == 0) {
+            blockIsGood[b] = false;
+        }
+    }
+    for (b = 1; b < chainAlignment.size()-1; b++){ 
+        // the min indel rate between the two chain blocks is the difference in diagonals between the two sequences.
+        int prevDiag = abs(((int)chainAlignment.blocks[b].tPos -   (int)chainAlignment.blocks[b].qPos)  -
+                ((int)chainAlignment.blocks[b-1].tPos - (int)chainAlignment.blocks[b-1].qPos));
+
+        int prevDist = std::min(chainAlignment.blocks[b].tPos - chainAlignment.blocks[b-1].tPos,
+                chainAlignment.blocks[b].qPos - chainAlignment.blocks[b-1].qPos);
+
+        int nextDiag = abs(((int)chainAlignment.blocks[b+1].tPos - (int)chainAlignment.blocks[b+1].qPos)  -
+                ((int)chainAlignment.blocks[b].tPos -   (int)chainAlignment.blocks[b].qPos));
+
+        int nextDist = std::min(chainAlignment.blocks[b+1].tPos - chainAlignment.blocks[b].tPos,
+                chainAlignment.blocks[b+1].qPos - chainAlignment.blocks[b].qPos);
+
+        if (prevDist * indelRate < prevDiag and nextDist * indelRate < nextDiag) {
+            blockIsGood[b] = false;
+        }
+    }
+
+    for (b = chainAlignment.size(); b > 0; b--) {
+        if (blockIsGood[b-1] == false) {
+            chainAlignment.blocks.erase(chainAlignment.blocks.begin() + b-1);
+        }
+    }
+
+    if (chainAlignment.blocks.size() > 0) {
+        T_QuerySequence  qFragment;
+        T_TargetSequence tFragment;
+        blasr::Alignment fragAlignment;
+        unsigned int fb;
+        if (alignType == Global) {
+            //
+            // For Global alignment, refine the alignment from the beginnings of the
+            // sequences to the start of the first block.
+            //
+            if (chainAlignment.blocks[0].qPos > 0 and
+                chainAlignment.blocks[0].tPos > 0) {
+
+                qFragment.seq = &query.seq[0];
+                qFragment.length = chainAlignment.blocks[0].qPos;
+                tFragment.seq = &target.seq[0];
+                tFragment.length = chainAlignment.blocks[0].tPos;
+                for (fb = 0; fb < alignment.blocks.size(); fb++) {
+                    alignment.blocks.push_back(fragAlignment.blocks[b]);
+                }
+            }
+        }
+        else if (alignType == Local) {
+            // Perform a front-anchored alignment to extend the alignment to
+            // the beginning of the read.
+            if (chainAlignment.blocks[0].qPos > 0 and 
+                    chainAlignment.blocks[0].tPos > 0) {
+                qFragment.seq = (Nucleotide*) &query.seq[0];
+                qFragment.length = chainAlignment.blocks[0].qPos;
+
+                tFragment.seq = (Nucleotide*) &target.seq[0];
+                tFragment.length = chainAlignment.blocks[0].tPos;
+                blasr::Alignment frontAlignment;
+                int frontAlignmentScore;
+                // Currently, there might be some space between the beginning
+                // of the alignment and the beginning of the read.  Run an
+                // EndAnchored alignment that allows free gaps to the start of
+                // where the alignment begins, but normal, ungapped alignment
+                // otherwise. 
+                if (extendFrontByLocalAlignment) {
+                    if (noRecurseUnder == 0 or qFragment.length * tFragment.length < noRecurseUnder) {
+                        frontAlignmentScore  = 
+                            SWAlign(qFragment, tFragment, fragScoreMat, fragPathMat, frontAlignment, scoreFn, EndAnchored);
+                    } else {
+                        // cout << "running recursive sdp alignment. " << endl;
+                        vector<int> recurseFragmentChain;
+                        SDPAlign(qFragment, tFragment, scoreFn,
+                                std::max(wordSize/2, 5),
+                                sdpIns, sdpDel,  indelRate,
+                                frontAlignment,
+                                fragmentSet,
+                                prefixFragmentSet,
+                                suffixFragmentSet,
+                                targetTupleList,
+                                targetPrefixTupleList,
+                                targetSuffixTupleList,
+                                recurseFragmentChain,
+                                alignType, detailedAlignment, 
+                                extendFrontByLocalAlignment, 0);
+                    }
+
+                    unsigned int anchorBlock;
+                    for (anchorBlock = 0; anchorBlock < frontAlignment.blocks.size(); anchorBlock++) {
+                        //
+                        // The front alignment needs to be transformed to the
+                        // coordinate offsets that the chain alignment is in.  This
+                        // is an alignment starting at position 0 in the target and
+                        // query.  Currently, the front alignment is offset into the
+                        // sequences by frontAlignment.[q/t]Pos.
+                        //
+                        frontAlignment.blocks[anchorBlock].tPos += frontAlignment.tPos;
+                        frontAlignment.blocks[anchorBlock].qPos += frontAlignment.qPos;
+                        alignment.blocks.push_back(frontAlignment.blocks[anchorBlock]);
+                    }
+                }
+            }
+        }
+
+		// 
+		// The chain alignment blocks are not complete blocks, so they
+		// must be appended to the true alignment and then patched up.
+		//
+        for (b = 0; b < chainAlignment.size() - 1; b++) {
+            alignment.blocks.push_back(chainAlignment.blocks[b]);
+            int alignScore;
+
+            //
+            // Do a detaied smith-waterman alignment between blocks, if this
+            // is specified.  
+            fragAlignment.Clear();
+            qFragment.Free();
+            qFragment.ReferenceSubstring(query, chainAlignment.blocks[b].qPos + chainAlignment.blocks[b].length);
+            qFragment.length = chainAlignment.blocks[b+1].qPos - 
+                (chainAlignment.blocks[b].qPos + chainAlignment.blocks[b].length);
+
+            tFragment.seq    = &(target.seq[chainAlignment.blocks[b].tPos + chainAlignment.blocks[b].length]);
+            tFragment.length = (chainAlignment.blocks[b+1].tPos - 
+                    (chainAlignment.blocks[b].tPos + chainAlignment.blocks[b].length));
+
+            if (qFragment.length > 0 and 
+                    tFragment.length > 0 and
+                    detailedAlignment == true) {
+
+                if (noRecurseUnder == 0 or qFragment.length * tFragment.length < noRecurseUnder) {
+                    alignScore = SWAlign(qFragment, tFragment, fragScoreMat, fragPathMat, fragAlignment, scoreFn, Global);
+                }
+                else {
+                    //          cout << "running recursive sdp alignment on " << qFragment.length * tFragment.length << endl;
+                    std::vector<int> recurseFragmentChain;
+                    SDPAlign(qFragment, tFragment, scoreFn,
+                            std::max(wordSize/2, 5),
+                            sdpIns, sdpDel,  indelRate,
+                            fragAlignment,
+                            fragmentSet,
+                            prefixFragmentSet,
+                            suffixFragmentSet,
+                            targetTupleList,
+                            targetPrefixTupleList,
+                            targetSuffixTupleList,
+                            recurseFragmentChain,
+                            alignType, detailedAlignment, 0, 0);
+                }
+                fragAlignment.qPos = 0;
+                fragAlignment.tPos = 0;
+
+                int qOffset = chainAlignment.blocks[b].qPos + chainAlignment.blocks[b].length;
+                int tOffset = chainAlignment.blocks[b].tPos + chainAlignment.blocks[b].length;
+
+                for (fb = 0; fb < fragAlignment.blocks.size(); fb++) {
+                    fragAlignment.blocks[fb].qPos += qOffset;
+                    fragAlignment.blocks[fb].tPos += tOffset;
+                    alignment.blocks.push_back(fragAlignment.blocks[fb]);
+                }
+            }
+        }
+        int lastBlock = chainAlignment.blocks.size() - 1;
+        if (alignType == Global or alignType == Local) {
+            if (chainAlignment.size() > 0) {
+                // Add the last block.
+                alignment.blocks.push_back(chainAlignment.blocks[lastBlock]);
+                if (alignType == Global and detailedAlignment == true) {
+                    //
+                    // When doing a global alignment, the sequence from the end of
+                    // the last block of the query should be aligned to the end of 
+                    // the text.
+                    //
+                    qFragment.Free();
+                    qFragment.ReferenceSubstring(query, chainAlignment.blocks[lastBlock].qPos + chainAlignment.blocks[lastBlock].length,
+                            query.length -  
+                            (chainAlignment.blocks[lastBlock].qPos + chainAlignment.blocks[lastBlock].length));
+
+                    tFragment.seq    = &(target.seq[chainAlignment.blocks[lastBlock].tPos + chainAlignment.blocks[lastBlock].length]);
+                    tFragment.length = (target.length - 
+                            (chainAlignment.blocks[lastBlock].tPos + chainAlignment.blocks[lastBlock].length));
+                    if (qFragment.length > 0 and
+                            tFragment.length > 0 ) {
+
+                        if (extendFrontByLocalAlignment) {
+
+                            fragAlignment.Clear();
+                            if (qFragment.length * tFragment.length > 10000) {
+                                //              cout << "Cautin: slow alignment crossing! " << qFragment.length  << " " << tFragment.length << endl;
+                            }
+
+                            if (noRecurseUnder == 0 or qFragment.length * tFragment.length < noRecurseUnder) {
+                                SWAlign(qFragment, tFragment, fragScoreMat, fragPathMat, fragAlignment, scoreFn, EndAnchored);
+                            }
+                            else {
+                                std::vector<int> recurseFragmentChain;
+                                SDPAlign(qFragment, tFragment, scoreFn,
+                                        std::max(wordSize/2, 5),
+                                        sdpIns, sdpDel,  indelRate,
+                                        fragAlignment,
+                                        fragmentSet,
+                                        prefixFragmentSet,
+                                        suffixFragmentSet,
+                                        targetTupleList,
+                                        targetPrefixTupleList,
+                                        targetSuffixTupleList,
+                                        recurseFragmentChain,
+                                        alignType, detailedAlignment, extendFrontByLocalAlignment, 0);
+                            }
+
+
+
+                            int qOffset = chainAlignment.blocks[lastBlock].qPos + chainAlignment.blocks[lastBlock].length;
+                            int tOffset = chainAlignment.blocks[lastBlock].tPos + chainAlignment.blocks[lastBlock].length;
+                            unsigned int fb;
+                            for (fb = 0; fb < fragAlignment.size(); fb++) { 
+                                fragAlignment.blocks[fb].qPos += qOffset;
+                                fragAlignment.blocks[fb].tPos += tOffset;
+                                alignment.blocks.push_back(fragAlignment.blocks[fb]);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if (alignType == Local) {
+        alignment.tPos = alignment.blocks[0].tPos;
+        alignment.qPos = alignment.blocks[0].qPos;
+        VectorIndex b;
+        for (b = 0; b < alignment.blocks.size(); b++) { 
+            alignment.blocks[b].qPos -= alignment.qPos;
+            alignment.blocks[b].tPos -= alignment.tPos;
+        }
+    }
+    int alignmentScore;
+    /*	ofstream queryOut("query.fasta");
+        FASTASequence tmp;
+        ((DNASequence&)tmp).Copy(query);
+        tmp.CopyTitle("query");
+        tmp.PrintSeq(queryOut);
+        queryOut.close();
+        ofstream targetOut("target.fasta");
+        ((DNASequence&)tmp).Copy(target);
+        tmp.CopyTitle("target");
+        tmp.PrintSeq(targetOut);
+        targetOut.close();
+        */
+    alignmentScore = ComputeAlignmentScore(alignment, query, target, scoreFn);
+    return alignmentScore;
+}
+
+#endif //_BLASR_SDP_ALIGN_IMPL_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/SWAlign.hpp b/libcpp/alignment/algorithms/alignment/SWAlign.hpp
new file mode 100644
index 0000000..a92b60b
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/SWAlign.hpp
@@ -0,0 +1,17 @@
+#ifndef _BLASR_SW_ALIGN_HPP_
+#define _BLASR_SW_ALIGN_HPP_
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_Alignment, typename T_ScoreFn>
+int SWAlign(T_QuerySequence &qSeq, T_TargetSequence &tSeq, 
+        std::vector<int> &scoreMat,
+        std::vector<Arrow> &pathMat, 
+        T_Alignment &alignment,
+        T_ScoreFn &scoreFn,
+        AlignmentType alignType = Local,
+        bool trustSequences = false,
+        bool printMatrix = false
+        ); 
+
+#include "SWAlignImpl.hpp"
+
+#endif // _BLASR_SW_ALIGN_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/SWAlignImpl.hpp b/libcpp/alignment/algorithms/alignment/SWAlignImpl.hpp
new file mode 100644
index 0000000..b30ec10
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/SWAlignImpl.hpp
@@ -0,0 +1,389 @@
+#include <algorithm>
+#include <vector>
+#include <stdint.h>
+#include <iostream>
+#include <ostream>
+#include "Types.h"
+#include "defs.h"
+#include "DNASequence.hpp"
+#include "matrix/FlatMatrix.hpp"
+#include "datastructures/alignment/Path.h"
+#include "datastructures/alignment/AlignmentMap.hpp"
+#include "datastructures/alignment/AlignmentStats.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "AlignmentUtils.hpp"
+#include "SWAlign.hpp"
+
+template<typename T_QuerySequence, typename T_TargetSequence, typename T_Alignment, typename T_ScoreFn>
+int SWAlign(T_QuerySequence &qSeq, T_TargetSequence &tSeq, 
+        std::vector<int> &scoreMat,
+        std::vector<Arrow> &pathMat, 
+        T_Alignment &alignment,
+        T_ScoreFn &scoreFn,
+        AlignmentType alignType,
+        bool trustSequences,
+        bool printMatrix
+        ) {
+    VectorIndex nRows = qSeq.length + 1;
+    VectorIndex nCols = tSeq.length + 1;
+
+    VectorIndex totalMatSize = nRows * nCols;
+    if (scoreMat.size() < totalMatSize) {
+        scoreMat.resize(totalMatSize);
+        pathMat.resize(totalMatSize);
+    }
+
+
+    // 
+    // Initialze matrices
+    std::fill(scoreMat.begin(), scoreMat.begin() + totalMatSize, 0);
+    std::fill(pathMat.begin(), pathMat.begin() + totalMatSize, NoArrow);
+
+    //
+    // Initialize boundary conditions.
+    //
+    int r = 0, c = 0;
+    if (alignType == Global or alignType == ScoreGlobal
+            or alignType == FrontAnchored or alignType == ScoreFrontAnchored) {
+        //
+        // Global alignments penalize gaps at the beginning of both
+        // sequences.
+        //
+        for (c = 0; c < (int) tSeq.length + 1; c++ ){
+            scoreMat[rc2index(0, c, tSeq.length + 1)] = scoreFn.del * c;
+            pathMat[rc2index(0, c, tSeq.length + 1)]  = Left;
+        }
+
+        for (r = 0; r < (int) qSeq.length + 1; r++ ){ 
+            scoreMat[rc2index(r,0, tSeq.length + 1)]  = scoreFn.ins * r;
+            pathMat[rc2index(r, 0, tSeq.length + 1)]  = Up;
+        }
+    }
+    else if (alignType == Local or alignType == ScoreLocal or alignType == LocalBoundaries
+            // end anchoring requires free gap penalties at the
+            // beginning of sequences.  
+            or alignType == EndAnchored or alignType == ScoreEndAnchored) {
+        // 
+        // Local alignments may shave off the beginning of either read.
+        // No penalties at the starts of reads.
+        //
+        for (c = 0; c < (int) tSeq.length + 1; c++ ){
+            scoreMat[rc2index(0, c, tSeq.length + 1)] = 0;
+            pathMat[rc2index(0, c, tSeq.length + 1)]  = NoArrow;
+        }
+        for (r = 0; r < (int) qSeq.length + 1; r++ ){ 
+            scoreMat[rc2index(r,0, tSeq.length + 1)]  = 0;
+            pathMat[rc2index(r, 0, tSeq.length + 1)]  = NoArrow;
+        }
+    }
+    else if (alignType == QueryFit or alignType == ScoreQueryFit) {
+        //
+        // Query fit allows free gaps at the beginning and end
+        // of the target sequence.
+        //
+        for (c = 0; c < (int) tSeq.length + 1; c++ ){
+            scoreMat[rc2index(0, c, tSeq.length + 1)] = 0;
+            pathMat[rc2index(0, c, tSeq.length + 1)]  = Left;
+        }
+        for (r = 0; r < (int) qSeq.length + 1; r++ ){ 
+            scoreMat[rc2index(r,0, tSeq.length + 1)]  = scoreFn.ins * r;
+            pathMat[rc2index(r, 0, tSeq.length + 1)]  = Up;
+        }
+    }		
+    else if (alignType == TargetFit or alignType == ScoreTargetFit) {
+        //
+        // Query fit allows free gaps at the beginning and end
+        // of the target sequence.
+        //
+        for (c = 0; c < (int) tSeq.length + 1; c++ ){
+            scoreMat[rc2index(0, c, tSeq.length + 1)] = scoreFn.del * c;
+            pathMat[rc2index(0, c, tSeq.length + 1)]  = Left;
+        }
+        for (r = 0; r < (int) qSeq.length + 1; r++ ){ 
+            scoreMat[rc2index(r,0, tSeq.length + 1)]  = 0;
+            pathMat[rc2index(r, 0, tSeq.length + 1)]  = Up;
+        }
+    }		
+    else if (alignType == Overlap        or alignType == ScoreOverlap or 
+            alignType == TSuffixQPrefix or alignType == ScoreTSuffixQPrefix) {
+        //
+        // Overlap alignments allow a gap at the beginning of the 
+        // query, and at the end of the target.
+        //
+        for (r = 0; r < (int) qSeq.length + 1; r++ ){ 
+            scoreMat[rc2index(r,0, tSeq.length + 1)]  = scoreFn.ins*r;
+            pathMat[rc2index(r, 0, tSeq.length + 1)]  = Up;
+        }
+        for (c = 0; c < (int) tSeq.length + 1; c++ ){
+            scoreMat[rc2index(0, c, tSeq.length + 1)] = 0;
+            pathMat[rc2index(0, c, tSeq.length + 1)]  = Left;
+        }
+    }
+    else if (alignType == TPrefixQSuffix or alignType == ScoreTPrefixQSuffix) {
+        //
+        // Overlap alignments allow a gap at the beginning of the 
+        // query, and at the end of the target.
+        //
+        for (c = 0; c < (int) tSeq.length + 1; c++ ){
+            scoreMat[rc2index(0, c, tSeq.length + 1)] = scoreFn.del * c;
+            pathMat[rc2index(0, c, tSeq.length + 1)]  = Left;
+        }
+        for (r = 0; r < (int) qSeq.length + 1; r++ ){ 
+            scoreMat[rc2index(r,0, tSeq.length + 1)]  = 0;
+            pathMat[rc2index(r, 0, tSeq.length + 1)]  = Up;
+        }
+    }
+
+    pathMat[0] = Diagonal;
+
+    int match, qGap, tGap;
+
+    //
+    // Begin matrix pointers after the 
+    int *matchScorePtr = &scoreMat[0];
+    int *gapQScorePtr  = &scoreMat[1];
+    int *gapTScorePtr  = &scoreMat[tSeq.length + 1 ];
+    int *curScorePtr   = &scoreMat[tSeq.length + 2 ];
+    Arrow *optPathPtr  = &pathMat[tSeq.length + 2];
+    int minScore;
+
+    int localMinScore = 0;
+    int localMinRow = 0;
+    int localMinCol = 0;
+    for (r = 0; r < (int) qSeq.length; r++ ){
+        for (c = 0; c < (int) tSeq.length; c++ ) {
+            //
+            // r+1, c+1 is the current row /col in the score and path mat.
+            //
+
+            //match = matchMat[TwoBit[qSeq.seq[r]]][TwoBit[tSeq.seq[c]]] + *matchScorePtr;
+            //			qGap  = *gapQScorePtr + gap;
+            //			tGap  = *gapTScorePtr + gap;
+            match = scoreFn.Match(tSeq, c, qSeq, r) + scoreMat[rc2index(r,c,nCols)];
+            qGap  = scoreMat[rc2index(r,c+1, nCols)] + scoreFn.Insertion(tSeq, r+1, qSeq, c);
+            tGap  = scoreMat[rc2index(r+1,c, nCols)] + scoreFn.Deletion(tSeq, r, qSeq, c+1);
+            minScore = MIN(match, MIN(qGap, tGap));
+            if (minScore < localMinScore) {
+                localMinScore = minScore;
+                localMinRow = r;
+                localMinCol = c;
+            }
+
+            if (minScore > 0 and 
+                    (alignType == Local or alignType == ScoreLocal or 
+                     alignType == LocalBoundaries or 
+                     alignType == EndAnchored or alignType == ScoreEndAnchored )) {
+                *curScorePtr = 0;
+                *optPathPtr  = NoArrow;
+            }
+            // This staement will get easier when the alignTypes are bitfields.
+            // Not sure why this explicitly checks all conditions.
+            else if (alignType == Local         or alignType == Global or
+                    alignType == QueryFit      or alignType == Overlap or
+                    alignType == TargetFit     or alignType == ScoreTargetFit or 
+                    alignType == ScoreLocal    or alignType == ScoreGlobal or
+                    alignType == ScoreQueryFit or alignType == ScoreOverlap or
+                    alignType == FrontAnchored or alignType == ScoreFrontAnchored or 
+                    alignType == EndAnchored   or alignType == ScoreEndAnchored or
+                    alignType == LocalBoundaries or
+                    alignType == TPrefixQSuffix or alignType == ScoreTPrefixQSuffix or
+                    alignType == TSuffixQPrefix or alignType == ScoreTSuffixQPrefix ) {
+                *curScorePtr = minScore;
+                //		scoreMat[rc2index(r+1,c+1, tl)] = minScore;
+                if (minScore == match) {
+                    *optPathPtr = Diagonal;
+                    //pathMat[rc2index(r+1,c+1,tl)] = Diagonal;
+                }
+                else if (minScore == qGap) {
+                    *optPathPtr = Up;
+                    //pathMat[rc2index(r+1,c+1, tl)] = Up;
+                }
+                else if (minScore == tGap) {
+                    *optPathPtr = Left;
+                    //pathMat[rc2index(r+1,c+1, tl)] = Left;
+                }
+            }
+            ++matchScorePtr;
+            ++gapTScorePtr;
+            ++gapQScorePtr;
+            ++curScorePtr;
+            ++optPathPtr;
+        }
+        // Done processing a row.  
+        // This leaves the pointers starting at the first column in the next row
+        // which is a boundary column. Advance one more.
+        //
+        ++matchScorePtr;
+        ++gapTScorePtr;
+        ++gapQScorePtr;
+        ++curScorePtr;
+        ++optPathPtr;
+    }
+    //
+    // Now trace back in the pairwise alignment.	
+    // 
+
+    // The location of the trace back depends on the type of alignment that is done.
+    int minRow = 0, minCol = 0;
+    if (alignType == Global or alignType == ScoreGlobal or 
+            alignType == EndAnchored or alignType == ScoreEndAnchored ) {
+        // start at bottom right of matrix.
+        r = qSeq.length;
+        c = tSeq.length;
+        minRow = r;
+        minCol = c;
+    }
+    else if (alignType == Local or alignType == ScoreLocal or
+            alignType == FrontAnchored or alignType == ScoreFrontAnchored or 
+            alignType == LocalBoundaries) {
+        // start at cell that gives the highest score.
+        r = localMinRow;
+        c = localMinCol;
+        minRow = r;
+        minCol = c;
+    }
+    else if (alignType == QueryFit       or alignType == Overlap or 
+            alignType == ScoreQueryFit  or alignType == ScoreOverlap) {
+        // Start at the point at the end of the target that gives the highest score, but has the
+        // end query sequence alignment.
+
+        r = nRows-1;
+        int minScore = scoreMat[rc2index(nRows-1, 1, nCols)];
+        minCol   = 1;
+        for (c = 2; c < (int) nCols; c++ ) {
+            if (scoreMat[rc2index(nRows-1, c, nCols)] < minScore) {
+                minScore = scoreMat[rc2index(nRows-1, c, nCols)];
+                minCol = c;
+            }
+        }
+        c = minCol;
+        minRow = nRows - 1;
+    }
+    else if (alignType == TargetFit or alignType == ScoreTargetFit) {
+        // Start at the point at the end of the target that gives the highest score, but has the
+        // end query sequence alignment.
+
+        //
+        // Always trace back from the end of the target.
+        //
+        minCol =  nCols-1;
+        c = nCols-1;
+        r = 0;
+        int minScore = scoreMat[rc2index(1, nCols-1, nCols)];
+        for (r = 2; r < (int) nRows; r++ ) {
+            if (scoreMat[rc2index(r, nCols-1, nCols)] < minScore) {
+                minScore = scoreMat[rc2index(r, nCols-1, nCols)];
+                minRow = r;
+            }
+        }
+        // store where to trace back from in the query.
+        r = minRow;
+    }
+    else if (alignType == TSuffixQPrefix or alignType == ScoreTSuffixQPrefix) {
+        // Start at the point at the end of the target that gives the highest score, but has the
+        // end query sequence alignment.
+        c = nCols - 1;
+        r = 1;
+
+        int minScore = scoreMat[rc2index(1, nCols-1, nCols)];
+        minRow = 1;
+        for (r = 2; r < (int) nRows; r++) {
+            if (scoreMat[rc2index(r, nCols-1, nCols)] < minScore) {
+                minScore = scoreMat[rc2index(r, nCols-1, nCols)];
+                minRow = r;
+            }
+        }
+        r = minRow;
+        minCol = nCols - 1;
+    }
+    else if (alignType == TPrefixQSuffix or alignType == ScoreTPrefixQSuffix) {
+        r = nRows-1;
+        int minScore = scoreMat[rc2index(nRows-1, 1, nCols)];
+        minCol   = 1;
+        for (c = 2; c < (int) nCols; c++ ) {
+            if (scoreMat[rc2index(nRows-1, c, nCols)] < minScore) {
+                minScore = scoreMat[rc2index(nRows-1, c, nCols)];
+                minCol = c;
+            }
+        }
+        c = minCol;
+        minRow = nRows - 1;
+    }
+    /*
+       PrintFlatMatrix(&scoreMat[0], nRows, nCols, cout);
+       PrintFlatMatrix(&pathMat[0], nRows,nCols, cout);
+       */
+    if (alignType != ScoreGlobal and
+            alignType != ScoreLocal and
+            alignType != ScoreQueryFit and
+            alignType != ScoreOverlap and 
+            alignType != ScoreTPrefixQSuffix and
+            alignType != ScoreTSuffixQPrefix) {
+        std::vector<Arrow>  optAlignment;
+        Arrow arrow;
+        while (((alignType == Global   or alignType == FrontAnchored ) and (r > 0 or c > 0)) or // global alignment stops at top corner
+                ((alignType == QueryFit or 
+                  alignType == Overlap or 
+                  alignType == TSuffixQPrefix) and r > 0) or 
+                ((alignType == TPrefixQSuffix) and c > 0) or 
+                (alignType == TargetFit and c > 0) or 
+                // local alignment stops at top corner -or- when new local alignment started.
+                ((alignType == Local    or alignType == EndAnchored or alignType == LocalBoundaries)
+                 and r > 0 and c > 0 and pathMat[r*nCols+c] != NoArrow)
+              ) {
+            arrow = pathMat[rc2index(r, c, nCols)];
+
+            //
+            // When the alignment type is localBoundaries, it is not necessary to store
+            // the actual alignment.  Only the starting positions and lengts will be stored.
+            //
+            if (alignType != LocalBoundaries) {
+                optAlignment.push_back(arrow);
+            }
+            if (arrow == Diagonal) {
+                r--;
+                c--;
+            }
+            else if (arrow == Up) {
+                r--;
+            }
+            else if (arrow == Left) {
+                c--;
+            }
+        }
+        // remove the boundary condition that is added for global alignment.
+        if (alignType == LocalBoundaries and alignType != Local and alignType != EndAnchored and optAlignment.size() > 0) 
+            optAlignment.pop_back();
+        if (optAlignment.size() > 1) 
+            std::reverse(optAlignment.begin(), optAlignment.end());
+        if (optAlignment.size() > 0) 
+            alignment.ArrowPathToAlignment(optAlignment);
+
+        //
+        // If running a local alignment, the alignment does not
+        // explicityly encode the gaps at the beginning and ending of the
+        // alignment.  These are stored in the qPos and tPos fields.
+        //
+        if (alignType == TSuffixQPrefix or alignType == TPrefixQSuffix) {
+            alignment.qPos = r;
+            alignment.tPos = c;
+        }
+        else if (alignType == Local or alignType == EndAnchored or alignType == LocalBoundaries) {
+            alignment.qPos = r;
+            alignment.tPos = c;
+            alignment.qLength = localMinRow - alignment.qPos + 1;
+            alignment.tLength = localMinCol - alignment.tPos + 1;
+        }
+        else if (alignType == QueryFit or alignType == TargetFit) {
+            alignment.qPos = r;
+            alignment.tPos = c;
+        }
+
+    }
+    if (printMatrix) {
+        PrintFlatMatrix( &scoreMat[0], qSeq.length + 1, tSeq.length + 1, std::cout);
+        std::cout << std::endl;
+        PrintFlatMatrix( &pathMat[0], qSeq.length + 1, tSeq.length + 1, std::cout);	
+    }
+    return scoreMat[rc2index(minRow, minCol, nCols)];
+}
diff --git a/libcpp/alignment/algorithms/alignment/ScoreMatrices.cpp b/libcpp/alignment/algorithms/alignment/ScoreMatrices.cpp
new file mode 100644
index 0000000..5aa06cc
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/ScoreMatrices.cpp
@@ -0,0 +1,58 @@
+#include "ScoreMatrices.hpp"
+
+int QVDistanceMatrix[5][5] = {
+	{-1, 1, 1, 1, 1},
+	{1, -1, 1, 1, 1},
+	{1, 1, -1, 1, 1},
+	{1, 1, 1, -1, 1},
+	{1, 1, 1, 1, 1}
+};
+
+int EditDistanceMatrix[5][5] = {
+	{0, 1, 1, 1, 1},
+	{1, 0, 1, 1, 1},
+	{1, 1, 0, 1, 1},
+	{1, 1, 1, 0, 1},
+	{1, 1, 1, 1, 1}
+};
+
+int SMRTDistanceMatrix[5][5] = {
+	{-5, 6, 6, 6, 6},
+	{6, -5, 6, 6, 6},
+	{6, 6, -5, 6, 6},
+	{6, 6, 6, -5, 6},
+	{6, 6, 6, 6,  0}
+};
+
+int SMRTLogProbMatrix[5][5] = {
+  {0, 15, 15, 15, 15},
+  {15, 0, 15, 15, 15},
+  {15, 15, 0, 15, 15},
+  {15, 15, 15, 0, 15},
+  {15, 15, 15, 15, 0},
+};
+
+int LowMutationMatrix[5][5] = {
+	{0, 5, 5, 5, 5},
+	{5, 0, 5, 5, 5},
+	{5, 5, 0, 5, 5},
+	{5, 5, 5, 0, 5},
+	{5, 5, 5,  5, 5}
+};
+
+int LocalAlignLowMutationMatrix[5][5] = {
+	{-2, 5, 5, 5, 5},
+	{5, -2, 5, 5, 5},
+	{5, 5, -2, 5, 5},
+	{5, 5, 5, -2, 5},
+	{5, 5, 5,  5, 5}
+};
+
+int CrossMatchMatrix[5][5] = {
+	{-1, 2, 2, 2, 2},
+	{2, -1, 2, 2, 2},
+	{2, 2, -1, 2, 2},
+	{2, 2, 2, -1, 2},
+	{2, 2, 2,  2, 2}
+};
+
diff --git a/libcpp/alignment/algorithms/alignment/ScoreMatrices.hpp b/libcpp/alignment/algorithms/alignment/ScoreMatrices.hpp
new file mode 100644
index 0000000..e948cf6
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/ScoreMatrices.hpp
@@ -0,0 +1,18 @@
+#ifndef _BLASR_SCORE_MATRICES_HPP_
+#define _BLASR_SCORE_MATRICES_HPP_
+
+extern int QVDistanceMatrix[5][5]; 
+
+extern int EditDistanceMatrix[5][5]; 
+
+extern int SMRTDistanceMatrix[5][5]; 
+
+extern int SMRTLogProbMatrix[5][5]; 
+
+extern int LowMutationMatrix[5][5]; 
+
+extern int LocalAlignLowMutationMatrix[5][5]; 
+
+extern int CrossMatchMatrix[5][5];
+
+#endif // _BLASR_SCORE_MATRICES_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/StringToScoreMatrix.cpp b/libcpp/alignment/algorithms/alignment/StringToScoreMatrix.cpp
new file mode 100644
index 0000000..ea48abe
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/StringToScoreMatrix.cpp
@@ -0,0 +1,26 @@
+#include "StringToScoreMatrix.hpp"
+
+bool StringToScoreMatrix(std::string &str, int matrix[5][5]) {
+    std::stringstream strm(str);
+    std::vector<int> values;
+    while(strm) {
+        int val;
+        if ((strm >> val)) {
+            values.push_back(val);
+        }
+    }
+    if (values.size() != 25) {
+        return 0;
+    }
+    else {
+        int i,j;
+        int index = 0;
+        for (i = 0; i < 5; i++) {
+            for (j = 0; j < 5; j++) {
+                matrix[i][j] = values[index];
+                ++index;
+            }
+        }
+        return true;
+    }
+}
diff --git a/libcpp/alignment/algorithms/alignment/StringToScoreMatrix.hpp b/libcpp/alignment/algorithms/alignment/StringToScoreMatrix.hpp
new file mode 100644
index 0000000..b1f415c
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/StringToScoreMatrix.hpp
@@ -0,0 +1,9 @@
+#ifndef _BLASR_STRING_TO_SCORE_MATRIX_HPP_
+#define _BLASR_STRING_TO_SCORE_MATRIX_HPP_
+
+#include <string>
+#include <sstream>
+#include <vector>
+
+bool StringToScoreMatrix(std::string &str, int matrix[5][5]);
+#endif
diff --git a/libcpp/alignment/algorithms/alignment/sdp/FragmentSort.hpp b/libcpp/alignment/algorithms/alignment/sdp/FragmentSort.hpp
new file mode 100644
index 0000000..f665833
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/FragmentSort.hpp
@@ -0,0 +1,19 @@
+#ifndef _BLASR_FRAGMENT_SORT_HPP_
+#define _BLASR_FRAGMENT_SORT_HPP_
+
+
+template<typename T_Fragment>
+class LexicographicFragmentSort {
+public:
+	int operator()(const T_Fragment &a, const T_Fragment &b) const; 
+};
+
+template<typename T_Fragment>
+class LexicographicFragmentSortByY {
+public:
+	int operator()(const T_Fragment &a, const T_Fragment &b) const;
+};
+
+#include "FragmentSortImpl.hpp"
+
+#endif // _BLASR_FRAGMENT_SORT_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/sdp/FragmentSortImpl.hpp b/libcpp/alignment/algorithms/alignment/sdp/FragmentSortImpl.hpp
new file mode 100644
index 0000000..b9a3aa8
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/FragmentSortImpl.hpp
@@ -0,0 +1,16 @@
+#include "FragmentSort.hpp"
+
+template<typename T_Fragment>
+int 
+LexicographicFragmentSort<T_Fragment>::operator()
+    (const T_Fragment &a, const T_Fragment &b) const {
+    return a.LessThanXY(b);
+}
+
+template<typename T_Fragment>
+int 
+LexicographicFragmentSortByY<T_Fragment>::operator()
+    (const T_Fragment &a, const T_Fragment &b) const {
+    return a.LessThanYX(b);
+}
+
diff --git a/libcpp/alignment/algorithms/alignment/sdp/NonoverlappingSparseDynamicProgramming.h b/libcpp/alignment/algorithms/alignment/sdp/NonoverlappingSparseDynamicProgramming.h
new file mode 100644
index 0000000..148c16d
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/NonoverlappingSparseDynamicProgramming.h
@@ -0,0 +1,193 @@
+#ifndef NONOVERLAPPING_SPARSE_DYNAMIC_PROGRAMMING_H_
+#define NONOVERLAPPING_SPARSE_DYNAMIC_PROGRAMMING_H_
+
+/*
+ *
+ * Compute the subset of fragmentSet of largest weight that is not overlapping.
+ *
+ */
+#include "FragmentSort.h"
+#include "SDPSet.h"
+#include "SDPFragment.h"
+#include "SDPColumn.h"
+#include "../AlignmentUtils.h"
+#include "../../../datastructures/alignment/Alignment.h"
+
+
+template<typename T_Fragment>
+int SDPHeaviestSubsequence(int queryLength,
+													 vector<T_Fragment> &fragmentSet,
+													 int indel, int match,
+													 vector<int> &maxFragmentChain,
+													 AlignmentType alignType=Global) {
+
+	maxFragmentChain.clear();
+
+	if (fragmentSet.size() < 1)
+		return 0;
+		
+	std::sort(fragmentSet.begin(), fragmentSet.end(), LexicographicFragmentSort<T_Fragment>());
+
+	SDPSet<SDPColumn> activeSet;
+
+	int sweepX;
+	int trailRow;
+	int fSweep;
+	int fi;
+	for (fi = 0; fi < fragmentSet.size(); fi++) {
+		fragmentSet[fi].index = fi;
+	}
+
+	sweepX = fragmentSet[0].x;
+
+	fSweep = 0;
+	int maxChainLength = 0;
+	int maxChainFragment = -1;
+	int minFragmentCost, minFragmentIndex;
+	minFragmentCost = INF_INT;
+	minFragmentIndex = -1;
+	for (sweepX = 0; sweepX < queryLength; sweepX++) {
+		//
+		// For each fragment ending in sweepX, attempt to compute its cost
+		// by looking for the best previous match.
+		//
+		int fSweepStart = fSweep;
+		while (fSweep < fragmentSet.size() and 
+					 fragmentSet[fSweep].x == sweepX) {
+
+			//
+			// Compute the cost of every fragment in the sweep.
+			//
+			int cp = INF_INT, cl = INF_INT, ca = INF_INT;
+			SDPColumn curCol, predCol;
+			curCol.col = fragmentSet[fSweep].y;
+			//
+			// Search preceeding fragments.
+			//
+
+			//
+			// Compute the cost of fragment_f
+			int foundPrev = 0;
+			T_Fragment fragStartPoint;
+			fragStartPoint.x = fragmentSet[fSweep].x - fragmentSet[fSweep].GetLength();
+			fragStartPoint.y = fragmentSet[fSweep].y - fragmentSet[fSweep].GetLength();
+			T_Fragment predFrag;
+			
+			int predFragScore;
+			
+			if (activeSet.Predecessor(fragStartPoint, predFrag)) {
+				//
+				// predCol points to the fragment with greatest value less than curCol.
+				// 
+				predFragScore = fragmentSet[predCol.optFragment].cost + 
+					abs((fragmentSet[fSweep].x - fragmentSet[fSweep].y)
+							- (fragmentSet[predCol.optFragment].x - fragmentSet[predCol.optFragment].y)) * indel;
+				foundPrev = 1;
+			}
+
+			//
+			// Now assign the score for the fragment.  When doing a local alignment
+			// start a new chain if the score is not good.
+			
+			if (foundPrev and 
+					(alignType == Global or
+					 (alignType == Local and predFragScore < 0))) {				
+				fragmentSet[fSweep].chainPrev = predCol.optFragment;
+				fragmentSet[fSweep].cost = predFragScore - fragmentSet[fSweep].weight;
+				fragmentSet[fSweep].chainLength = fragmentSet[fragmentSet[fSweep].chainPrev].chainLength + 1;
+			}
+			else {
+				fragmentSet[fSweep].chainPrev = -1;
+				fragmentSet[fSweep].cost = fragmentSet[fSweep].GetLength() * match - fragmentSet[fSweep].weight;
+				fragmentSet[fSweep].chainLength = 1;
+			}
+			
+			if (minFragmentCost > fragmentSet[fSweep].cost) {
+				minFragmentCost  = fragmentSet[fSweep].cost;
+				minFragmentIndex = fSweep;
+				//	maxChainLength = fragmentSet[fSweep].chainLength;
+			}
+			
+			if (fragmentSet[fSweep].chainLength > maxChainLength) {
+				maxChainLength = fragmentSet[fSweep].chainLength;
+				maxChainFragment = fSweep;
+			}
+
+			fSweep++;
+		}
+		
+		//
+		// Each column must contain the highest scoring hit in that column. 
+		//
+		fSweep = fSweepStart;
+		while (fSweep < fragmentSet.size() and
+					 fragmentSet[fSweep].x == sweepX) {
+			//
+			// These elements are removed from the sweep set since they are done being processed.
+			// If they are the lowest cost in the value, update activeSet
+			//
+			SDPColumn col;
+			int storeCol = 0;
+			col.col = fragmentSet[fSweep].y;
+
+			if (activeSet.Member(col)) {
+				if (fragmentSet[col.optFragment].cost < fragmentSet[fSweep].cost) {
+					storeCol = 1;
+				}
+			}
+			else {
+				storeCol = 1;
+			}
+			if (storeCol) {
+				col.col = fragmentSet[fSweep].y;
+				col.optFragment = fSweep;
+				// 
+				// Insert new column or replace col with a more optimal one.
+				//
+				activeSet.Insert(col);
+
+				// 
+				// The invariant structure of the activeSet is that
+				// after inserting a fragment of score S at column col, 
+				// the score of all columns greater than 'col' in col set
+				// must be less than col. 
+				//
+				// To preserve this invariant, when an element is inserted
+				// at 'col', look to columns greater.  As long as any columns
+				// have scores that are greater than col, remove them.
+				// Once a column col_next has been found that has a score less than S
+				// by the structure of the loop invariant, all columns greater than col_next
+				// are guaranteed to have lower score than S, so we can continue searching
+				// through this loop.
+				//
+				// Since fragments are processed at most once, this remains O(M).
+				
+				SDPColumn successorCol = col;
+
+				while (activeSet.Successor(col, successorCol) and
+							 fragmentSet[successorCol.optFragment].cost > fragmentSet[fSweep].cost) {
+					activeSet.Delete(successorCol);
+				}
+			}
+
+			//
+			// Now remove this fragment, it is at the end of the sweep line.
+			//
+			int deleted;
+			deleted = activeSet.Delete(fragmentSet[fSweep]);
+			assert(deleted);
+			++fSweep;
+		}
+	}
+	if (alignType == Local) {
+		maxChainFragment = minFragmentIndex;
+	}
+	while (maxChainFragment != -1) {
+		maxFragmentChain.push_back(maxChainFragment);
+		maxChainFragment = fragmentSet[maxChainFragment].chainPrev;
+	}
+	std::reverse(maxFragmentChain.begin(), maxFragmentChain.end());
+	return maxFragmentChain.size();
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/alignment/sdp/SDPColumn.hpp b/libcpp/alignment/algorithms/alignment/sdp/SDPColumn.hpp
new file mode 100644
index 0000000..6ae674e
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/SDPColumn.hpp
@@ -0,0 +1,23 @@
+#ifndef _BLASR_SDP_COLUMN_HPP_
+#define _BLASR_SDP_COLUMN_HPP_
+
+class SDPColumn {
+ public:
+	int col;
+	int optFragment;
+    SDPColumn() : col(0), optFragment(0) {}
+    int operator<(const SDPColumn & rhs) const {
+        return col < rhs.col;
+    }
+    int operator<(const int y) const {
+        return col < y;
+    }
+    int operator==(const SDPColumn &rhs) const {
+        return col == rhs.col;
+    }
+    int operator>(const SDPColumn &rhs) const {
+        return (!(*this < rhs) && !(*this == rhs));
+    }
+};
+
+#endif // _BLASR_SDP_COLUMN_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/sdp/SDPFragment.cpp b/libcpp/alignment/algorithms/alignment/sdp/SDPFragment.cpp
new file mode 100644
index 0000000..861144e
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/SDPFragment.cpp
@@ -0,0 +1,27 @@
+#include "SDPFragment.hpp"
+
+int Fragment::operator>(const Fragment &f) const {
+    return (!(*this < f) &&  !(*this == f));
+}
+int Fragment::GetLength() {
+    return length;
+}
+void Fragment::SetLength(int _length) {
+    length = _length;
+}
+
+bool Fragment::SetAbove(int a) {
+    above = a;
+    return true;
+}
+
+bool Fragment::GetAbove(int & a) {
+    if (above >= 0) {
+        a = above;
+        return true;
+    } else {
+        a = -1;
+        return false;
+    }
+}
+
diff --git a/libcpp/alignment/algorithms/alignment/sdp/SDPFragment.hpp b/libcpp/alignment/algorithms/alignment/sdp/SDPFragment.hpp
new file mode 100644
index 0000000..23b0e1c
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/SDPFragment.hpp
@@ -0,0 +1,132 @@
+#ifndef _BLASR_SDP_FRAGMENT_HPP_
+#define _BLASR_SDP_FRAGMENT_HPP_
+
+class Fragment {
+public:
+	unsigned int x;
+	unsigned int y;
+	unsigned int weight;
+	unsigned int length;
+	int index;
+	int chainPrev;
+	int cost;
+    int above;
+	unsigned int chainLength;
+
+	inline Fragment(unsigned int px, unsigned int py, int pweight=0); 
+
+	inline Fragment();
+
+	unsigned int GetX() const {return x;}
+
+	unsigned int GetY() const {return y;}
+
+    bool SetAbove(int a);
+    bool GetAbove(int & a);
+
+	inline int LessThanXY(const Fragment &f) const;
+
+	inline int LessThanYX(const Fragment &f) const;
+
+    inline int operator<(const Fragment &f) const;
+
+    inline Fragment& operator=(const Fragment &rhs);
+
+    inline int operator==(const Fragment &f) const;
+
+	int operator>(const Fragment &f) const; 
+
+	int GetLength(); 
+
+	void SetLength(int _length); 
+};
+
+inline Fragment::Fragment(unsigned int px, unsigned int py, int pweight) {
+    x = px;
+    y = py;
+    weight = pweight;
+    length = index = 0;
+    chainPrev = cost = chainLength = 0;
+    above = -1;
+}
+
+//
+// Provide default constructor that will
+// give bad results if members are not properly initialized
+// later on.
+//
+inline Fragment::Fragment() {
+    x = -1;
+    y = -1;
+    weight = length = index = 0;
+    chainPrev = cost = chainLength = 0;
+    above = -1;
+}
+
+inline int Fragment::LessThanXY(const Fragment &f) const {
+    if (x == f.x) {
+        if (y == f.y) {
+            if (length == f.length) return 0;
+            else return length < f.length;
+        } else return y < f.y;
+    } else return x < f.x;
+    /*
+    if (x < f.x)
+        return 1;
+    else if (x == f.x) 
+        return y < f.y;
+    else 
+        return 0;
+    */
+}
+
+inline int Fragment::LessThanYX(const Fragment &f) const {
+    if (y == f.y) {
+        if (x == f.x) {
+            if (length == f.length) return 0;
+            else return length < f.length;
+        } else return x < f.x;
+    } else return y < f.y;
+    /*
+    if (y < f.y)
+        return 1;
+    else if (y == f.y) 
+        return x < f.x;
+    else 
+        return 0; 
+    */
+}
+
+inline Fragment& Fragment::operator=(const Fragment &rhs) {
+    x           = rhs.x;
+    y           = rhs.y;
+    index       = rhs.index;
+    cost        = rhs.cost;
+    weight      = rhs.weight;
+    length      = rhs.length;
+    chainLength = rhs.chainLength;
+    chainPrev   = rhs.chainPrev;
+    above       = rhs.above;
+    return *this;
+}
+
+inline int Fragment::operator==(const Fragment &f) const {
+    return (x == f.x and y == f.y);
+}
+
+inline int Fragment::operator<(const Fragment &f) const {
+    // 
+    // Sort fragments by diagonal:
+    //
+    int diag, fDiag;
+    diag = (y - x);
+    fDiag = f.y - f.x;
+    if (diag < fDiag)
+        return 1;
+    else if (diag == fDiag)
+        return (x < f.x);
+    else
+        return 0;
+}
+
+#endif // _BLASR_SDP_FRAGMENT_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/sdp/SDPSet.hpp b/libcpp/alignment/algorithms/alignment/sdp/SDPSet.hpp
new file mode 100644
index 0000000..866dbfb
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/SDPSet.hpp
@@ -0,0 +1,52 @@
+#ifndef _BLASR_SDP_SET_HPP_
+#define _BLASR_SDP_SET_HPP_
+
+
+/*
+	A SDPSet is a collection of types T that have strict ordering
+	defined.  It supports ways to query for points immediately less or 
+	immediately greater than another value.
+*/
+	
+template<typename T>
+class SDPSet {
+private:
+    typedef std::set<T> Tree;
+    typename SDPSet<T>::Tree tree;
+public:
+    int size();
+
+    /*
+     * Remove a fragment f if it exists.
+     */
+    int Delete(T &f); 
+
+    /*
+     * Insert a fresh copy of f into the set.  If a copy
+     * already exists, replace it with this one.
+     */
+    inline VectorIndex Insert(T &f); 
+
+    /*
+       Returns true if there is a value such that value == f
+     */
+    int Member(T &f); 
+
+    int Min(T &f); 
+
+    /*
+     * Given f, set succ to be the first value greater than f.
+     * Return 1 if such a value exists, 0 otherwise.
+     */
+    int Successor(T &f, T &succ); 
+
+    /*
+     * Given f, set pred to the first value less than f.
+     * Returns 1 if such a value exists, 0 otherwise.
+     */
+    int Predecessor(T &f, T &pred); 
+};
+
+#include "SDPSetImpl.hpp"
+
+#endif // _BLASR_SDP_SET_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/sdp/SDPSetImpl.hpp b/libcpp/alignment/algorithms/alignment/sdp/SDPSetImpl.hpp
new file mode 100644
index 0000000..6dbe709
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/SDPSetImpl.hpp
@@ -0,0 +1,113 @@
+#include <stdint.h>
+#include <set>
+#include "Types.h"
+#include "SDPSet.hpp"
+
+template<typename T>
+int SDPSet<T>::size() {
+    return tree.size();
+}
+
+/*
+ * Remove a fragment f if it exists.
+ */
+template<typename T>
+int SDPSet<T>::Delete(T &f) {
+    typename std::set<T>::iterator it = tree.find(f);
+    if (it != tree.end() and (*it) == f) {
+        tree.erase(f);
+        return 1;
+    }
+    return 0;
+}
+/*
+ * Insert a fresh copy of f into the set.  If a copy
+ * already exists, replace it with this one.
+ */
+template<typename T>
+inline VectorIndex SDPSet<T>::Insert(T &f) {
+    typename SDPSet<T>::Tree::iterator it = tree.find(f);
+    if (it != tree.end())
+        tree.erase(it);
+    tree.insert(f);
+    return tree.size();
+}
+/*
+   Returns true if there is a value such that value == f
+   */
+
+template<typename T>
+int SDPSet<T>::Member(T &f) {
+    typename SDPSet<T>::Tree::iterator it = tree.find(f);
+    if (it != tree.end()) {
+        f = *it;
+        return 1;
+    }
+    return 0;
+}
+
+template<typename T>
+int SDPSet<T>::Min(T &f) {
+    if (tree.size() == 0) {
+        return 0;
+    }
+    else {
+        f = *(tree.begin());
+    }		
+}
+
+/*
+ * Given f, set succ to be the first value greater than f.
+ * Return 1 if such a value exists, 0 otherwise.
+ */
+template<typename T>
+int SDPSet<T>::Successor(T &f, T &succ) {
+
+    //
+    // Set succ to the first value > f, if such a value exists.
+    // 
+    if (tree.size() < 2)  {
+        return 0;
+    }
+    typename Tree::iterator it = tree.upper_bound(f);
+
+    if (it == tree.end())
+        return 0;
+
+    succ = *it;
+    return 1;
+}
+
+/*
+ * Given f, set pred to the first value less than f.
+ * Returns 1 if such a value exists, 0 otherwise.
+ */
+template<typename T>
+int SDPSet<T>::Predecessor(T &f, T &pred) {
+    // 
+    // Set pred equal to the largest value <= f.
+    // Return 1 if such a value exists, 0 otherwise.
+    //
+    if (tree.size() == 0)
+        return 0;
+
+    typename Tree::iterator it = tree.find(f);
+
+    if (it != tree.end()) {
+        pred = *it;
+        return 1;
+    }
+
+    it = tree.lower_bound(f);
+    if (it != tree.begin())
+        --it;
+
+    if (f < *it) {
+        // No elements less than f exist.
+        return 0;
+    }
+    else {
+        pred = *it;
+        return 1;
+    }
+}
diff --git a/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgramming.cpp b/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgramming.cpp
new file mode 100644
index 0000000..9325491
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgramming.cpp
@@ -0,0 +1,18 @@
+#include "SparseDynamicProgramming.hpp"
+
+int IndelPenalty(int x1, int y1, int x2, int y2, int insertion, int deletion) {
+    int drift, driftPenalty;
+    drift = (x1 - y1) - (x2 - y2);
+    if (drift > 0) {
+        driftPenalty = drift * insertion;
+    }
+    else if (drift < 0) {
+        driftPenalty = -drift * deletion;
+    }
+    else {
+        driftPenalty = 0;
+    }
+    return driftPenalty;
+}
+
+
diff --git a/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgramming.hpp b/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgramming.hpp
new file mode 100644
index 0000000..8f42113
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgramming.hpp
@@ -0,0 +1,37 @@
+#ifndef SPARSE_DYNAMIC_PROGRAMMING_H_
+#define SPARSE_DYNAMIC_PROGRAMMING_H_
+
+#include <vector>
+#include <string>
+#include "Types.h"
+#include "defs.h"
+#include "DNASequence.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "algorithms/alignment/AlignmentUtils.hpp"
+
+/*******************************************************************************
+ *  Sparse dynamic programming implementation of Longest Common Subsequence
+ *  
+ *  Implementation of method described in Baker and Giancarlo, Journal of
+ *  Algorithms 42, 231-254, 2002.
+ * 
+ *  5/7/09 -- Modified to incorporate different linear cost functions, and 
+ *  local alignments.
+ *  
+ ******************************************************************************/
+
+int IndelPenalty(int x1, int y1, int x2, int y2, int insertion, int deletion); 
+
+template<typename T_Fragment>
+void StoreAbove(std::vector<T_Fragment> &fragmentSet, DNALength fragmentLength);
+
+template<typename T_Fragment>
+int SDPLongestCommonSubsequence(DNALength queryLength,
+        std::vector<T_Fragment> &fragmentSet, 
+        DNALength fragmentLength,
+        int insertion, int deletion, int match,
+        std::vector<int> &maxFragmentChain, AlignmentType alignType=Global); 
+
+#include "SparseDynamicProgrammingImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgrammingImpl.hpp b/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgrammingImpl.hpp
new file mode 100644
index 0000000..a227c70
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/SparseDynamicProgrammingImpl.hpp
@@ -0,0 +1,266 @@
+#ifndef SPARSE_DYNAMIC_PROGRAMMING_IMPL_HPP_
+#define SPARSE_DYNAMIC_PROGRAMMING_IMPL_HPP_
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <algorithm>
+#include <cassert>
+#include <set>
+#include <limits.h>
+#include <ostream>
+#include "SDPSet.hpp"
+#include "SDPFragment.hpp"
+#include "SDPColumn.hpp"
+#include "FragmentSort.hpp"
+
+template<typename T_Fragment>
+void StoreAbove(std::vector<T_Fragment> &fragmentSet, DNALength fragmentLength) {
+	std::sort(fragmentSet.begin(), fragmentSet.end(), LexicographicFragmentSortByY<T_Fragment>());	
+	int i;
+	for (i = 1; i < fragmentSet.size(); i++) {
+		if (fragmentSet[i-1].x <= fragmentSet[i].x 
+   		    and fragmentSet[i-1].x + fragmentSet[i-1].length > fragmentSet[i].x 
+			and fragmentSet[i-1].y < fragmentSet[i].y) {
+			fragmentSet[i].SetAbove(fragmentSet[i-1].index);
+		}
+	}
+	// Place back in original order.
+	std::sort(fragmentSet.begin(), fragmentSet.end(), LexicographicFragmentSort<T_Fragment>());		
+}
+
+template<typename T_Fragment>
+int SDPLongestCommonSubsequence(DNALength queryLength,
+        std::vector<T_Fragment> &fragmentSet, 
+        DNALength fragmentLength,
+        int insertion, int deletion, int match,
+        std::vector<int> &maxFragmentChain, AlignmentType alignType) {
+
+    maxFragmentChain.clear();
+    if (fragmentSet.size() < 1)
+        return 0;
+
+    std::sort(fragmentSet.begin(), fragmentSet.end(), LexicographicFragmentSort<T_Fragment>());
+
+    SDPSet<Fragment> sweepSet;
+    SDPSet<SDPColumn>   colSet;
+
+    unsigned int sweepRow;
+    unsigned int trailRow;
+    VectorIndex fSweep, fTrail;
+    VectorIndex fi;
+    for (fi = 0; fi < fragmentSet.size(); fi++) {
+        fragmentSet[fi].index = fi;
+    }
+
+    StoreAbove(fragmentSet, fragmentLength);
+    sweepRow = fragmentSet[0].x;
+    Fragment pred, succ;
+    fSweep = 0;
+    fTrail = 0;
+    unsigned int maxChainLength = 0;
+    int maxChainFragment = -1;
+    int minFragmentCost, minFragmentIndex;
+    minFragmentCost = INF_INT;
+    minFragmentIndex = -1;
+    for (; sweepRow < queryLength + fragmentLength; sweepRow++) {
+        //
+        // Add all elements on the sweep row to the sweep set.  Note that when
+        // fSweep is past query.length.
+        int startF = fSweep;
+        int fragmentSetSize = fragmentSet.size();
+        while (fSweep < fragmentSetSize and 
+                fragmentSet[fSweep].x == sweepRow) {
+
+            //
+            // Compute the cost of every fragment in the sweep.
+            //
+            int cp = INF_INT, cl = INF_INT, ca = INF_INT;
+            SDPColumn curCol, predCol;
+            curCol.col = fragmentSet[fSweep].y;
+            //
+            // Search preceeding fragments.
+            //
+            //
+            // Compute the cost of fragment_f
+            int foundPrev = 0;
+            int drift, driftPenalty;
+            if (colSet.Predecessor(curCol, predCol)) {
+                //
+                // predCol points to the fragment with greatest value less than curCol.
+                // 
+                // Baker and Giancarlo LCS cost
+                driftPenalty = IndelPenalty(fragmentSet[fSweep].x, fragmentSet[fSweep].y,
+                                            fragmentSet[predCol.optFragment].x, 
+                                            fragmentSet[predCol.optFragment].y,
+                                            insertion, deletion);
+                cp = fragmentSet[predCol.optFragment].cost + driftPenalty;
+                foundPrev = 1;
+            }
+
+            // Search overlapping fragments.
+            if (sweepSet.Predecessor(fragmentSet[fSweep], pred)) {
+                //
+                //	Baker and Giancarlo LCS cost
+                //  Cost with insertion and deletion penalty.
+                //
+                cl = pred.cost + 
+                     MIN((int)(fragmentLength - (fragmentSet[fSweep].y - pred.y)) * match, 0) + 
+                     IndelPenalty(fragmentSet[fSweep].x, fragmentSet[fSweep].y,
+                                  pred.x, pred.y, insertion, deletion);
+                foundPrev = 1;
+            }
+
+            int aboveIndex;
+            if (fragmentSet[fSweep].GetAbove(aboveIndex)) {
+                //	Baker and Giancarlo LCS cost 
+                ca = fragmentSet[aboveIndex].cost + 
+                      (fragmentLength - (int)(fragmentSet[fSweep].y - fragmentSet[aboveIndex].y)) * match + 
+                      IndelPenalty(fragmentSet[fSweep].x, fragmentSet[fSweep].y, 
+                                  fragmentSet[aboveIndex].x, 
+                                  fragmentSet[aboveIndex].y, 
+                                  insertion, deletion);
+                foundPrev = 1;
+            }
+
+            //
+            // Now compute the minimum of all these.
+            //
+            int minCost;
+            minCost = MIN(cp, MIN(cl, ca));
+
+            //
+            //  If doing a global alignment, chain is always extended.  If local, the chain may not be.
+            // 
+            if (foundPrev and 
+                (alignType == Global or
+                (alignType == Local and minCost < 0))) {
+                fragmentSet[fSweep].cost = minCost - fragmentSet[fSweep].weight;
+                if (minCost == cp) {
+                    fragmentSet[fSweep].chainPrev = predCol.optFragment;
+                }
+                else if (minCost == cl) {
+                    fragmentSet[fSweep].chainPrev = pred.index;
+                }
+                else if (minCost == ca) {
+                    fragmentSet[fSweep].chainPrev = aboveIndex;
+                }
+                assert(fragmentSet[fSweep].chainPrev >= 0 and
+                       fragmentSet[fSweep].chainPrev < (int)fragmentSet.size());
+                fragmentSet[fSweep].chainLength = fragmentSet[fragmentSet[fSweep].chainPrev].chainLength + 1;
+            }
+            else {
+                if (alignType == Global) {
+                    fragmentSet[fSweep].chainPrev = (int) -1;
+                    fragmentSet[fSweep].cost = (fragmentSet[fSweep].x + fragmentSet[fSweep].y) * deletion +
+                                               fragmentLength * match - fragmentSet[fSweep].weight;
+                    fragmentSet[fSweep].chainLength = 1;
+                }
+                else if (alignType == Local) {
+                    fragmentSet[fSweep].chainPrev = (int) -1;
+                    fragmentSet[fSweep].cost = fragmentLength * match - fragmentSet[fSweep].weight;
+                    fragmentSet[fSweep].chainLength = 1;
+                }					
+            }
+
+            if (minFragmentCost > fragmentSet[fSweep].cost) {
+                minFragmentCost = fragmentSet[fSweep].cost;
+                minFragmentIndex = fSweep;
+                //	maxChainLength = fragmentSet[fSweep].chainLength;
+            }
+
+            if (fragmentSet[fSweep].chainLength > maxChainLength) {
+                maxChainLength = fragmentSet[fSweep].chainLength;
+                maxChainFragment = fSweep;
+            }
+
+            // Done computing the optimal score for this fragment.
+            fSweep++;
+        }
+
+        //
+        // Insert all fragments in the sweep set 
+        //
+        fSweep = startF;
+        while (fSweep < fragmentSetSize and 
+                fragmentSet[fSweep].x == sweepRow) {
+            //			cout << "inserting sweep set with index" << fragmentSet[fSweep].index << endl;
+            sweepSet.Insert(fragmentSet[fSweep]);
+            ++fSweep;
+        }
+
+        // Remove elements from the sweep set that are too far back.
+        if (sweepRow >= fragmentLength + 1) {
+            trailRow = sweepRow - fragmentLength - 1;
+            while (fTrail < fragmentSetSize and
+                   fragmentSet[fTrail].x == trailRow) {
+                //
+                // These elements are removed from the sweep set since they are done being processed.
+                // If they are the lowest cost in the value, update colSet
+                //
+                SDPColumn col;
+                int storeCol = 0;
+                col.col = fragmentSet[fTrail].y;
+
+                if (colSet.Member(col)) {
+                    if (fragmentSet[col.optFragment].cost < fragmentSet[fTrail].cost) {
+                        storeCol = 1;
+                    }
+                }
+                else {
+                    storeCol = 1;
+                }
+                if (storeCol) {
+                    col.col = fragmentSet[fTrail].y;
+                    col.optFragment = fTrail;
+                    // 
+                    // Insert new column or replace col with a more optimal one.
+                    //
+                    colSet.Insert(col);
+
+                    // 
+                    // The invariant structure of the colSet is that
+                    // after inserting a fragment of score S at column col, 
+                    // the score of all columns greater than 'col' in col set
+                    // must be less than col. 
+                    //
+                    // To preserve this invariant, when an element is inserted
+                    // at 'col', look to columns greater.  As long as any columns
+                    // have scores that are greater than col, remove them.
+                    // Once a column col_next has been found that has a score less than S
+                    // by the structure of the loop invariant, all columns greater than col_next
+                    // are guaranteed to have lower score than S, so we can continue searching
+                    // through this loop.
+                    //
+                    // Since fragments are processed at most once, this remains O(M).
+
+                    SDPColumn successorCol = col;
+
+                    while (colSet.Successor(col, successorCol) and
+                           fragmentSet[successorCol.optFragment].cost > fragmentSet[fTrail].cost) {
+                        colSet.Delete(successorCol);
+                    }
+                }
+
+                //
+                // Now remove this fragment, it is at the end of the sweep line.
+                //
+                int deleted;
+                deleted = sweepSet.Delete(fragmentSet[fTrail]);
+                assert(deleted);
+
+                ++fTrail;
+            }
+        }
+    }
+    if (alignType == Local) {
+        maxChainFragment = minFragmentIndex;
+    }
+    while (maxChainFragment != -1) {
+        maxFragmentChain.push_back(maxChainFragment);
+        maxChainFragment = fragmentSet[maxChainFragment].chainPrev;
+    }
+    std::reverse(maxFragmentChain.begin(), maxFragmentChain.end());
+    return maxFragmentChain.size();
+}
+
+#endif // __SPARSE_DYNAMIC_PROGRAMMING_IMPL_HPP_
diff --git a/libcpp/alignment/algorithms/alignment/sdp/VariableLengthSDPFragment.h b/libcpp/alignment/algorithms/alignment/sdp/VariableLengthSDPFragment.h
new file mode 100644
index 0000000..618b25e
--- /dev/null
+++ b/libcpp/alignment/algorithms/alignment/sdp/VariableLengthSDPFragment.h
@@ -0,0 +1,51 @@
+#ifndef VARIABLE_LENGTH_SDP_FRAGMENT_H_
+#define VARIABLE_LENGTH_SDP_FRAGMENT_H_
+#include "SDPFragment.h"
+
+class ChainedFragment : public Fragment {
+	int score;
+	ChainedFragment *chainPrev;
+ public:
+    ChainedFragment():Fragment() {
+        score = 0;
+        chainPrev = NULL; 
+    }
+	
+	int SetScore(int _score) {
+		return (score = _score);
+	}
+
+	int GetScore() {
+		return score;
+	}
+	
+	ChainedFragment *SetChainPrev(ChainedFragment *_chainPrev) {
+		return (chainPrev = _chainPrev);
+	}
+
+	ChainedFragment *GetChainPrev() {
+		return chainPrev;
+	}
+	
+	int LessThan(const ChainedFragment &f) const {
+		//
+		// Order fragments by endpoint.
+		//
+		if (x == f.GetX()) {
+			return (y < f.GetY());
+		}
+		else {
+			return x < f.GetX();
+		}
+	}
+
+	int operator<(const ChainedFragment &f) const {
+		// 
+		// Sort fragments by x then y.
+		//
+		return LessThan(f);
+	}
+};
+
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/BWTSearch.cpp b/libcpp/alignment/algorithms/anchoring/BWTSearch.cpp
new file mode 100644
index 0000000..16ea57c
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/BWTSearch.cpp
@@ -0,0 +1,85 @@
+#include "algorithms/anchoring/BWTSearch.hpp"
+
+int MapReadToGenome(BWT & bwt,
+	FASTASequence & seq,
+    DNALength subreadStart, DNALength subreadEnd,
+    std::vector<ChainedMatchPos> &matchPosList,
+	AnchorParameters & params, int &numBasesAnchored, 
+    std::vector<DNALength> & spv, 
+    std::vector<DNALength> & epv) {
+	
+    FASTASequence prefix;
+    numBasesAnchored = 0;
+    if (subreadEnd - subreadStart < params.minMatchLength) {
+        return 0;
+    }
+    else {
+        DNALength p;
+        prefix.seq = seq.seq;
+        for (p = subreadStart + params.minMatchLength; 
+             p < subreadEnd; p++) {
+            // 
+            // Try reusing the vectors between calls - not thread
+            // safe replace function call with one that has access 
+            // to a buffer class.
+            //
+            spv.clear(); epv.clear();
+            prefix.length = p;
+            bwt.Count(prefix, spv, epv);
+
+            DNALength matchLength = spv.size();
+            //
+            // Keep going without subtracting from zero if there 
+            // are no hits.
+            //
+            if (spv.size() == 0) {
+                continue;
+            }
+
+            DNALength i;
+            std::vector<DNALength> matches;
+            while (matchLength >= params.minMatchLength) {
+                i = matchLength - 1;
+
+                if (matchLength > 0 and epv[i] >= spv[i]) {
+                    // 
+                    // Add the positions of the matches here.
+                    //
+                    matches.clear();
+                    if (epv[i] - spv[i] + 1 < params.maxAnchorsPerPosition) {
+                        numBasesAnchored++;
+                        bwt.Locate(spv[i], epv[i], matches);
+                    }
+                    break;
+                }
+                matchLength--;
+            }
+
+            // Convert from genome positions to tuples
+            DNALength m;
+            for (m = 0; m < matches.size(); m++ ) {
+                // This if statement is a workaround for a bug
+                // that is allowing short matches
+                if (matches[m] >= matchLength) {
+                    matchPosList.push_back(ChainedMatchPos(
+                        matches[m] - matchLength, 
+                        p-matchLength, matchLength , 
+                        matches.size()));
+                }
+            }
+        }
+    }
+    return matchPosList.size();
+}
+
+int MapReadToGenome(BWT & bwt,
+	FASTASequence & seq,
+    DNALength start, DNALength end,
+	std::vector<ChainedMatchPos> & matchPosList,
+	AnchorParameters  & params, int &numBasesAnchored) {
+    std::vector<DNALength> spv,epv;  
+
+    return MapReadToGenome(bwt, seq, start, end, matchPosList,
+        params, numBasesAnchored, spv, epv);
+}
+
diff --git a/libcpp/alignment/algorithms/anchoring/BWTSearch.hpp b/libcpp/alignment/algorithms/anchoring/BWTSearch.hpp
new file mode 100644
index 0000000..e3e0366
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/BWTSearch.hpp
@@ -0,0 +1,35 @@
+#ifndef _BLASR_BWT_SEARCH_HPP_
+#define _BLASR_BWT_SEARCH_HPP_
+
+#include <vector>
+#include "FASTASequence.hpp"
+#include "bwt/BWT.hpp"
+#include "datastructures/anchoring/MatchPos.hpp"
+#include "datastructures/anchoring/AnchorParameters.hpp"
+
+int MapReadToGenome(BWT & bwt,
+	FASTASequence & seq,
+    DNALength subreadStart, DNALength subreadEnd,
+    std::vector<ChainedMatchPos> &matchPosList,
+	AnchorParameters & params, int &numBasesAnchored, 
+    std::vector<DNALength> & spv, 
+    std::vector<DNALength> & epv);
+
+
+int MapReadToGenome(BWT & bwt,
+	FASTASequence & seq,
+    DNALength start, DNALength end,
+	std::vector<ChainedMatchPos> & matchPosList,
+	AnchorParameters  & params, int &numBasesAnchored);
+
+
+template<typename T_MappingBuffers>
+int MapReadToGenome(BWT & bwt,
+    FASTASequence & seq,
+    std::vector<ChainedMatchPos> &matchPosList,
+    AnchorParameters & params, int & numBasesAnchored, 
+    T_MappingBuffers & mappingBuffers);
+
+#include "algorithms/anchoring/BWTSearchImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/BWTSearchImpl.hpp b/libcpp/alignment/algorithms/anchoring/BWTSearchImpl.hpp
new file mode 100644
index 0000000..ec71552
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/BWTSearchImpl.hpp
@@ -0,0 +1,14 @@
+#ifndef _BLASR_BWT_SEARCH_IMPL_HPP_
+#define _BLASR_BWT_SEARCH_IMPL_HPP_
+
+template<typename T_MappingBuffers>
+int MapReadToGenome(BWT & bwt,
+    FASTASequence & seq,
+    std::vector<ChainedMatchPos> &matchPosList,
+    AnchorParameters & params, int & numBasesAnchored, 
+    T_MappingBuffers & mappingBuffers) {
+    return MapReadToGenome(bwt, seq, matchPosList, params,
+        numBasesAnchored, mappingBuffers.spv, mappingBuffers.epv);
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/BasicEndpoint.hpp b/libcpp/alignment/algorithms/anchoring/BasicEndpoint.hpp
new file mode 100644
index 0000000..28ffaae
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/BasicEndpoint.hpp
@@ -0,0 +1,50 @@
+#ifndef _BLASR_BASIC_ENDPOINT_HPP_
+#define _BLASR_BASIC_ENDPOINT_HPP_
+
+#include "Types.h"
+#include "algorithms/anchoring/Coordinate.hpp"
+//
+// An endpoint is one of the ends of a fragment, where
+// a fragment is an exact match between two genomes. 
+// So, a fragment is a 2D object that has a position and length,
+// and an endpoint is 1D, where it just has a position.
+// A fragment may be associated with a score that is the score
+// of the fragment in a maximum scoring chain.  When finding a 
+// maximum scoring chain using priority search trees, one must 
+// be able to set the score of a fragment when indexing solely 
+// a point. 
+//
+
+enum WhichEnd {Start, End};
+typedef UInt KeyType;
+
+template<typename T_ScoredFragment>
+class BasicEndpoint {
+private:
+	Coordinate p;
+	WhichEnd side;
+    T_ScoredFragment *fragmentPtr;
+
+public:
+    class LessThan {
+    public:
+        int operator()(const BasicEndpoint<T_ScoredFragment> & lhs, const BasicEndpoint<T_ScoredFragment> & rhs) const {
+            return lhs.p < rhs.p;
+        }
+    };
+    BasicEndpoint();
+	WhichEnd GetSide();
+	void FragmentPtrToStart(T_ScoredFragment* fragment);
+   	void FragmentPtrToEnd(T_ScoredFragment* fragment);
+   	int GetScore();
+	int SetScore(int score);
+   	T_ScoredFragment* SetScoredReference(T_ScoredFragment* _fragmentPtr);
+	int operator<(const BasicEndpoint &rhs) const;
+	KeyType GetKey();
+	T_ScoredFragment* GetFragmentPtr();
+    void SetChainPrev(T_ScoredFragment* prevChainFragment);
+};
+
+#include "algorithms/anchoring/BasicEndpointImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/BasicEndpointImpl.hpp b/libcpp/alignment/algorithms/anchoring/BasicEndpointImpl.hpp
new file mode 100644
index 0000000..dd61377
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/BasicEndpointImpl.hpp
@@ -0,0 +1,78 @@
+#ifndef _BLASR_BASIC_ENDPOINT_IMPL_HPP_
+#define _BLASR_BASIC_ENDPOINT_IMPL_HPP_
+
+#include "algorithms/anchoring/BasicEndpoint.hpp"
+/*
+ An endpoint is one of the ends of a fragment, where
+ a fragment is an exact match between two genomes. 
+ So, a fragment is a 2D object that has a position and length,
+ and an endpoint is 1D, where it just has a position.
+ A fragment may be associated with a score that is the score
+ of the fragment in a maximum scoring chain.  When finding a 
+ maximum scoring chain using priority search trees, one must 
+ be able to set the score of a fragment when indexing solely 
+ a point. 
+*/
+
+template<typename T_ScoredFragment>
+BasicEndpoint<T_ScoredFragment>::
+BasicEndpoint(){}
+
+template<typename T_ScoredFragment>
+WhichEnd BasicEndpoint<T_ScoredFragment>::
+GetSide() {return side;}
+
+template<typename T_ScoredFragment>
+void BasicEndpoint<T_ScoredFragment>::
+FragmentPtrToStart(T_ScoredFragment *fragment) {
+    p.SetX(fragment->GetX());
+    p.SetY(fragment->GetY());
+    side = Start;
+    fragmentPtr = fragment;
+}
+
+template<typename T_ScoredFragment>
+void BasicEndpoint<T_ScoredFragment>::FragmentPtrToEnd(
+    T_ScoredFragment *fragment) {
+    p.SetX(fragment->GetX() + fragment->GetLength());
+    p.SetY(fragment->GetY() + fragment->GetLength());
+    side = End;
+    fragmentPtr = fragment;
+}
+
+template<typename T_ScoredFragment>
+int BasicEndpoint<T_ScoredFragment>::GetScore() {
+    return fragmentPtr->GetScore();
+}
+
+template<typename T_ScoredFragment>
+int BasicEndpoint<T_ScoredFragment>::SetScore(int score) {
+    return (fragmentPtr->SetScore(score));
+}
+
+template<typename T_ScoredFragment>
+T_ScoredFragment* BasicEndpoint<T_ScoredFragment>::
+SetScoredReference(
+    T_ScoredFragment *_fragmentPtr) {
+    return (fragmentPtr = _fragmentPtr);
+}
+
+template<typename T_ScoredFragment>
+int BasicEndpoint<T_ScoredFragment>::
+operator<(const BasicEndpoint &rhs) const {return p < rhs.p;} 
+
+template<typename T_ScoredFragment>
+KeyType BasicEndpoint<T_ScoredFragment>::
+GetKey() {return p.GetY();}
+
+template<typename T_ScoredFragment>
+T_ScoredFragment* BasicEndpoint<T_ScoredFragment>::
+GetFragmentPtr() {return fragmentPtr;}
+
+template<typename T_ScoredFragment>
+void BasicEndpoint<T_ScoredFragment>::
+SetChainPrev(T_ScoredFragment* prevChainFragment) {
+    fragmentPtr->SetChainPrev(prevChainFragment);
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/ClusterProbability.cpp b/libcpp/alignment/algorithms/anchoring/ClusterProbability.cpp
new file mode 100644
index 0000000..0dc61dc
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/ClusterProbability.cpp
@@ -0,0 +1,45 @@
+#include "algorithms/anchoring/ClusterProbability.hpp"
+#include <cassert>
+#include <math.h>
+
+float ComputeAnchorProbability(float pMatch, int minAnchorLength) {
+    assert(minAnchorLength >= 0);
+    assert(pMatch < 1.00001 and pMatch > 0);
+
+    int i;
+    float totalProbability = 0.0;
+    float pMisMatch = 1 - pMatch;
+    for (i = 0; i < minAnchorLength; i++) {
+        totalProbability += pMatch * pMisMatch;
+        pMatch *= pMatch;
+    }
+    return 1 - totalProbability;
+}
+
+
+float ComputeExpectedAnchorLength(float pMatch, int minAnchorLength, 
+        float pAnchor) {
+    int i = 0;
+    for (i = 0; i < minAnchorLength; i++) {
+        pMatch *= pMatch;
+    }
+    float pMismatch = 1 - pMatch;
+    float pValueEpsilon = 0.000000001;
+    float expAnchorLength = 0;
+
+    while(pMatch*pMismatch > pValueEpsilon) {
+        expAnchorLength += i * pMatch*pMismatch/pAnchor;
+        pMatch *= pMatch;
+    }
+    return expAnchorLength;
+}
+
+
+float AnchorBasesPerRead(int readLength, float pAnchor) {
+    return pAnchor * readLength;
+}
+
+float AnchorBasesPerReadSigma(float expAnchorBasesPerRead) {
+    // Assume exponential distribution: 
+    return sqrt(expAnchorBasesPerRead);
+}
diff --git a/libcpp/alignment/algorithms/anchoring/ClusterProbability.hpp b/libcpp/alignment/algorithms/anchoring/ClusterProbability.hpp
new file mode 100644
index 0000000..23d4e4e
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/ClusterProbability.hpp
@@ -0,0 +1,13 @@
+#ifndef _BLASR_CLUSTER_PROBABILITY_HPP_
+#define _BLASR_CLUSTER_PROBABILITY_HPP_
+
+float ComputeAnchorProbability(float pMatch, int minAnchorLength);
+
+float ComputeExpectedAnchorLength(float pMatch, int minAnchorLength, 
+    float pAnchor);
+
+float AnchorBasesPerRead(int readLength, float pAnchor);
+
+float AnchorBasesPerReadSigma(float expAnchorBasesPerRead);
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/Coordinate.cpp b/libcpp/alignment/algorithms/anchoring/Coordinate.cpp
new file mode 100644
index 0000000..9e6f624
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/Coordinate.cpp
@@ -0,0 +1,12 @@
+#include "algorithms/anchoring/Coordinate.hpp"
+
+
+int Coordinate::operator<=(const Coordinate &rhs) const {
+    return (*this < rhs) or (x == rhs.x && y == rhs.y);
+}
+
+int Coordinate::Equals(const Coordinate &rhs) const {
+    return (x == rhs.GetX() and y == rhs.GetY());
+}
+
+
diff --git a/libcpp/alignment/algorithms/anchoring/Coordinate.hpp b/libcpp/alignment/algorithms/anchoring/Coordinate.hpp
new file mode 100644
index 0000000..1e86e29
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/Coordinate.hpp
@@ -0,0 +1,45 @@
+#ifndef _BLASR_COORDINATE_HPP_
+#define _BLASR_COORDINATE_HPP_
+
+#include "Types.h"
+
+class Coordinate {
+private:
+    UInt x;
+    UInt y; 
+public:
+    inline UInt GetX() const; 
+    inline UInt GetY() const;
+    inline UInt SetX(UInt _x);
+    inline UInt SetY(UInt _y);
+    inline int operator<(const Coordinate &rhs) const;
+    int operator<=(const Coordinate &rhs) const;
+    int Equals(const Coordinate &rhs) const;
+    //
+    // Synonym for Equals.
+    //
+    inline int operator==(const Coordinate &rhs) const;
+    inline Coordinate &operator=(const Coordinate &rhs);
+};
+
+inline UInt Coordinate::GetX() const {return x;}
+inline UInt Coordinate::GetY() const {return y;}
+
+inline UInt Coordinate::SetX(UInt _x) {return (x = _x);}
+inline UInt Coordinate::SetY(UInt _y) {return (y = _y);}
+
+inline int  Coordinate::operator<(const Coordinate &rhs) const {
+    if (x == rhs.GetX()) return y < rhs.GetY();
+    else return x < rhs.GetX();
+}
+
+inline int Coordinate::operator==(const Coordinate &rhs) const {
+    return this->Equals(rhs);
+}
+
+inline Coordinate& Coordinate::operator=(const Coordinate &rhs) {
+    this->x = rhs.x;
+    this->y = rhs.y;
+    return *this;
+}
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/FindMaxInterval.cpp b/libcpp/alignment/algorithms/anchoring/FindMaxInterval.cpp
new file mode 100644
index 0000000..cc9ca5b
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/FindMaxInterval.cpp
@@ -0,0 +1,23 @@
+#include "algorithms/anchoring/FindMaxInterval.hpp"
+
+unsigned int NumRemainingBases(DNALength curPos, DNALength intervalLength) {
+  if (curPos > intervalLength) {
+    return 0;
+  }
+  else {
+    return intervalLength - curPos;
+  }
+}
+
+IntervalSearchParameters::IntervalSearchParameters() {
+    advanceHalf         = false;
+    globalChainType     = 0;
+    maxPValue           = log(0.1);
+    aboveCategoryPValue = 0;
+    warp                = true;
+    fastMaxInterval     = false;
+    aggressiveIntervalCut = false;
+    verbosity           = 0;
+    ddPValueThreshold   = -500; 
+}
+
diff --git a/libcpp/alignment/algorithms/anchoring/FindMaxInterval.hpp b/libcpp/alignment/algorithms/anchoring/FindMaxInterval.hpp
new file mode 100644
index 0000000..3f64505
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/FindMaxInterval.hpp
@@ -0,0 +1,175 @@
+#ifndef _BLASR_FIND_MAX_INTERVAL_HPP_
+#define _BLASR_FIND_MAX_INTERVAL_HPP_
+
+#include <semaphore.h>
+#include <math.h>
+#include <fstream>
+#include <iostream>
+#include "algorithms/anchoring/LongestIncreasingSubsequence.hpp"
+#include "algorithms/anchoring/GlobalChain.hpp"
+#include "algorithms/anchoring/BasicEndpoint.hpp"
+#include "datastructures/anchoring/WeightedInterval.hpp"
+#include "datastructures/anchoring/MatchPos.hpp"
+#include "datastructures/anchoring/ClusterList.hpp"
+#include "statistics/VarianceAccumulator.hpp"
+
+unsigned int NumRemainingBases(DNALength curPos, DNALength intervalLength);
+
+class IntervalSearchParameters {
+public:
+    bool  advanceHalf;
+    int   globalChainType;
+    float maxPValue;
+    float aboveCategoryPValue;
+    bool  warp;
+    bool  fastMaxInterval; 
+    bool  aggressiveIntervalCut;
+    int   verbosity;
+    float ddPValueThreshold;
+    IntervalSearchParameters();
+};
+
+
+template<typename T_Sequence, typename T_AnchorList>
+class DefaultWeightFunction {
+public:
+	float operator()(T_Sequence &text, T_Sequence &read, 
+        T_AnchorList matchPosList);
+};
+
+
+template<typename T_Pos>
+class MatchPosQueryOrderFunctor {
+public:
+	int operator()(T_Pos &pos);
+};
+
+
+template<typename T_MatchList>
+void PrintLIS(T_MatchList &matchList, DNALength curPos,  
+    DNALength curGenomePos, DNALength nextGenomePos, DNALength clp, 
+    DNALength cle);
+
+template<typename T_MatchList, typename T_SequenceDB>
+void FilterMatchesAsLIMSTemplateSquare(T_MatchList &matches, 
+    DNALength queryLength, DNALength limsTemplateLength, 
+    T_SequenceDB &seqDB);
+        
+template<typename T_MatchList, typename T_SequenceBoundaryDB>
+void AdvanceIndexToPastInterval(T_MatchList &pos, DNALength nPos,
+    DNALength intervalLength, DNALength contigLength,
+    T_SequenceBoundaryDB &SeqBoundary,
+    DNALength startIndex, DNALength startIntervalBoundary,
+    DNALength &index, DNALength &indexIntervalBoundary);
+
+template<typename T_MatchList>  
+int RemoveZeroLengthAnchors(T_MatchList &matchList);
+
+template<typename T_MatchList>
+int RemoveOverlappingAnchors(T_MatchList &matchList);
+
+template<typename T_MatchList>
+int SumAnchors(T_MatchList &pos, int start, int end);
+
+template<typename T_MatchList,
+         typename T_SequenceBoundaryDB>
+void StoreLargestIntervals(
+    T_MatchList &pos, 
+    // End search for intervals at boundary positions
+    // stored in seqBoundaries
+	T_SequenceBoundaryDB & ContigStartPos,
+	// parameters
+	// How many values to search through for a max set.
+	DNALength intervalLength,  
+	// How many sets to keep track of
+	int minSize,
+	vector<DNALength> &start,
+	vector<DNALength> &end);
+
+template<typename T_MatchList,
+         typename T_PValueFunction, 
+         typename T_WeightFunction,
+         typename T_SequenceBoundaryDB,
+         typename T_ReferenceSequence,
+         typename T_Sequence>
+int FindMaxIncreasingInterval(
+        // Input
+        // readDir is used to indicate if the interval that is being stored is 
+        // in the forward or reverse strand.  This is important later when 
+        // refining alignments so that the correct sequence is aligned back 
+        // to the reference.
+        int readDir, 
+        T_MatchList &pos, 
+        // How many values to search through for a max set.
+        DNALength intervalLength,  
+        // How many sets to keep track of
+        VectorIndex nBest, 
+        // End search for intervals at boundary positions
+        // stored in seqBoundaries
+        T_SequenceBoundaryDB & ContigStartPos,
+        // First rand intervals by their p-value
+        T_PValueFunction &MatchPValueFunction,  
+        // When ranking intervals, sum over weights determined by MatchWeightFunction
+        T_WeightFunction &MatchWeightFunction,  
+        // Output.
+        // The increasing interval coordinates, 
+        // in order by queue weight.
+        WeightedIntervalSet &intervalQueue, 
+        T_ReferenceSequence &reference, 
+        T_Sequence &query,
+        IntervalSearchParameters &params,
+        std::vector<BasicEndpoint<ChainedMatchPos> > *chainEndpointBuffer,
+        ClusterList &clusterList,
+        VarianceAccumulator<float> &accumPValue, 
+        VarianceAccumulator<float> &accumWeight,
+        VarianceAccumulator<float> &accumNumAnchorBases,
+        const char *titlePtr=NULL);
+
+template<typename T_MatchList,
+         typename T_PValueFunction, 
+         typename T_WeightFunction,
+         typename T_SequenceBoundaryDB,
+         typename T_ReferenceSequence,
+         typename T_Sequence>
+int FastFindMaxIncreasingInterval(
+        int readDir, 
+        T_MatchList &pos, 
+        DNALength intervalLength,  
+        VectorIndex nBest, 
+        T_SequenceBoundaryDB & ContigStartPos,
+        T_PValueFunction &MatchPValueFunction,  
+        T_WeightFunction &MatchWeightFunction,  
+        WeightedIntervalSet &intervalQueue, 
+        T_ReferenceSequence &reference, 
+        T_Sequence &query,
+        IntervalSearchParameters &params,
+        std::vector<BasicEndpoint<ChainedMatchPos> > *chainEndpointBuffer,
+        ClusterList &clusterList,
+        VarianceAccumulator<float> &accumPValue, 
+        VarianceAccumulator<float> &accumWeight);
+
+template<typename T_MatchList,
+         typename T_PValueFunction, 
+         typename T_WeightFunction,
+         typename T_SequenceBoundaryDB,
+         typename T_ReferenceSequence,
+         typename T_Sequence>
+int ExhaustiveFindMaxIncreasingInterval(
+        int readDir, 
+        T_MatchList &pos, 
+        DNALength intervalLength,  
+        VectorIndex nBest, 
+        T_SequenceBoundaryDB & ContigStartPos,
+        T_PValueFunction &MatchPValueFunction,  
+        T_WeightFunction &MatchWeightFunction,  
+        WeightedIntervalSet &intervalQueue, 
+        T_ReferenceSequence &reference, 
+        T_Sequence &query,
+        IntervalSearchParameters &params,
+        std::vector<BasicEndpoint<ChainedMatchPos> > *chainEndpointBuffer,
+        ClusterList &clusterList,
+        VarianceAccumulator<float> &accumPValue, 
+        VarianceAccumulator<float> &accumWeight);
+
+#include "algorithms/anchoring/FindMaxIntervalImpl.hpp"
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/FindMaxIntervalImpl.hpp b/libcpp/alignment/algorithms/anchoring/FindMaxIntervalImpl.hpp
new file mode 100644
index 0000000..65b2922
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/FindMaxIntervalImpl.hpp
@@ -0,0 +1,945 @@
+#ifndef _BLASR_FIND_MAX_INTERVAL_IMPL_HPP_
+#define _BLASR_FIND_MAX_INTERVAL_IMPL_HPP_
+
+template<typename T_Sequence, typename T_AnchorList>
+float DefaultWeightFunction<T_Sequence, T_AnchorList>::operator() (
+    T_Sequence &text, T_Sequence &read, T_AnchorList matchPosList) {
+    int i;
+    float weight = 0;
+    for (i = 0; i < matchPosList.size(); i++) {
+        weight += matchPosList[i].weight();
+    }
+    return weight;
+}
+
+template<typename T_Pos>
+int MatchPosQueryOrderFunctor<T_Pos>::operator()(T_Pos &pos) {
+    return pos.q;
+}
+
+template<typename T_MatchList>
+void PrintLIS(T_MatchList &matchList, DNALength curPos, 
+    DNALength curGenomePos, DNALength nextGenomePos, 
+    DNALength clp, DNALength cle) {
+    int i;
+    cout << curPos << " " << curGenomePos << " " 
+        << nextGenomePos << " " << clp << " " << cle << endl;
+    for (i = 0; i < matchList.size(); i++) {
+        cout.width(8);
+        cout << matchList[i].l << " ";
+    }
+    cout << endl;
+    for (i = 0; i < matchList.size(); i++) {
+        cout.width(8);
+        cout << matchList[i].q << " ";
+    }  
+    cout << endl;
+    for (i = 0; i < matchList.size(); i++) {
+        cout.width(8);
+        cout << matchList[i].t << " ";
+    }
+    cout << endl << endl;
+}
+
+
+template<typename T_MatchList, typename T_SequenceDB>
+void FilterMatchesAsLIMSTemplateSquare(T_MatchList &matches, 
+    DNALength queryLength, DNALength limsTemplateLength, 
+    T_SequenceDB &seqDB) {
+    int seqIndex;
+    //
+    // Make sure there is sequence coordinate information.
+    //
+    if (seqDB.nSeqPos == 0) {
+        return;
+    }
+    int matchIndex = 0;
+    for (seqIndex = 1; seqIndex < seqDB.nSeqPos; seqIndex++) {
+        DNALength refLength = seqDB.seqStartPos[seqIndex] - 
+            seqDB.seqStartPos[seqIndex - 1];
+        // account for indel error.
+        refLength = queryLength * 1.15 + limsTemplateLength; 
+
+        //
+        // Flag matches that are beyond the (rough) square with the length
+        // of the query for removal.
+        //
+        while (matchIndex < matches.size() and 
+                matches[matchIndex].t < seqDB.seqStartPos[seqIndex]) {
+            if (matches[matchIndex].t > seqDB.seqStartPos[seqIndex-1] 
+                + refLength) {
+                matches[matchIndex].l = 0;
+            }
+            matchIndex++;
+        }
+        int curMatchIndex = 0;
+        matchIndex = 0;
+        for (matchIndex = 0; matchIndex < matches.size(); matchIndex++) {
+            if (matches[matchIndex].l != 0) {
+                matches[curMatchIndex] = matches[matchIndex];
+                curMatchIndex++;
+            }
+        }
+        matches.resize(curMatchIndex);
+    }
+}
+
+template<typename T_MatchList, typename T_SequenceBoundaryDB>
+void AdvanceIndexToPastInterval(T_MatchList &pos, DNALength nPos,
+    DNALength intervalLength, DNALength contigLength,
+    T_SequenceBoundaryDB &SeqBoundary,
+    DNALength startIndex, DNALength startIntervalBoundary,
+    DNALength &index, DNALength &indexIntervalBoundary) {
+    if (index >= pos.size()) {
+        return;
+    }
+    indexIntervalBoundary = SeqBoundary(pos[index].t);
+    DNALength boundaryIndex = SeqBoundary.GetIndex(pos[index].t);
+    DNALength nextBoundary  = SeqBoundary.GetStartPos(boundaryIndex + 1);
+    while (// index is not past the end of the genome
+            index < nPos and 
+            //
+            // Stop when the index goes too far ahead.
+            //
+            pos[index].t - pos[startIndex].t <= intervalLength and
+            //
+            // Still searching in the current contig.
+            //
+            indexIntervalBoundary == startIntervalBoundary) {
+        index++;
+        if (index < nPos) {
+            indexIntervalBoundary = SeqBoundary(pos[index].t);
+        }
+    }
+}
+
+
+template<typename T_MatchList>  
+int RemoveZeroLengthAnchors(T_MatchList &matchList) {       
+    int origSize = matchList.size();
+    int cur = 0, m;
+    for (m = 0; m < matchList.size(); m++) {
+        if (matchList[m].l > 0) {
+            matchList[cur] = matchList[m];
+            cur++;
+        }
+    }
+    matchList.resize(cur);
+    return origSize - cur;
+}
+
+template<typename T_MatchList>
+int RemoveOverlappingAnchors(T_MatchList &matchList) {       
+  int cur = 0;
+  int m;
+  int n;
+  for (m = matchList.size(); m > 0; m--) {
+    n = m - 1;
+    //
+    // Skip past repeats in the query.
+    while (n > 0 and matchList[n].t == matchList[m].t) {
+      n--;
+    }
+
+    bool mergeFound = false;
+    int ni = n;
+    while (mergeFound == false and 
+           n > 0 and 
+           matchList[n].t == matchList[ni].t) {
+      if (matchList[n].q < matchList[m].q and
+          matchList[n].t < matchList[m].t and
+          matchList[n].l + matchList[n].q >= 
+          matchList[m].l + matchList[m].q and
+          matchList[n].l + matchList[n].t >= 
+          matchList[m].l + matchList[m].t) {
+        matchList[m].l = 0;
+        mergeFound = true;
+      }
+      n--;
+    }
+  }
+  int numRemoved = RemoveZeroLengthAnchors(matchList);
+  return numRemoved;
+}
+
+template<typename T_MatchList>
+int SumAnchors(T_MatchList &pos, int start, int end) {
+    int sum = 0;
+    int i;
+    for (i = start; i < end; i++) {
+        sum += pos[i].l;
+    }
+    return sum;
+}
+
+template<typename T_MatchList,
+         typename T_SequenceBoundaryDB>
+void StoreLargestIntervals(
+    T_MatchList &pos, 
+    // End search for intervals at boundary positions
+    // stored in seqBoundaries
+	T_SequenceBoundaryDB & ContigStartPos,
+	// parameters
+	// How many values to search through for a max set.
+	DNALength intervalLength,  
+	// How many sets to keep track of
+	int minSize,
+	vector<DNALength> &start,
+	vector<DNALength> &end) {
+
+    if (pos.size() == 0) {
+        return;
+    }
+    //
+    // Search for clusters of intervals within the pos array within
+    // pos[cur...next).  The value of 'next' should be the first anchor
+    // outside the possible range to cluster, or the end of the anchor list.
+    VectorIndex cur = 0;
+    VectorIndex nPos = pos.size();
+    VectorIndex next = cur + 1;
+    DNALength curBoundary = 0, nextBoundary = 0;
+    DNALength contigLength = ContigStartPos.Length(pos[cur].t);
+    DNALength endOfCurrentInterval = curBoundary + contigLength;
+
+    curBoundary = ContigStartPos(pos[cur].t);
+    nextBoundary = ContigStartPos(pos[next].t);  
+
+    //
+    // Advance next until the anchor is outside the interval that
+    // statrts at 'cur', and is inside the same contig that the anchor
+    // at cur is in.
+    //
+
+    DNALength curIntervalLength = NumRemainingBases(pos[cur].q, intervalLength);
+
+    AdvanceIndexToPastInterval(pos, nPos, intervalLength, contigLength, ContigStartPos,
+            cur, curBoundary, next, nextBoundary);
+
+    DNALength prevStart = cur, prevEnd = next ;
+    int prevSize = next - cur;
+    DNALength maxStart = cur, maxEnd = next;
+    int maxSize = SumAnchors(pos, cur, next);
+    int curSize = maxSize;
+    bool onFirst = true;
+    if (curSize > minSize) {
+        start.push_back(cur);
+        end.push_back(next);
+    }
+    while ( cur < nPos ) {
+        // 
+        // This interval overlaps with a possible max start
+        //
+
+        if (pos[cur].t >= pos[maxStart].t and maxEnd > 0 and pos[cur].t < pos[maxEnd-1].t) {
+            if (curSize > maxSize) {
+                maxSize = curSize;
+                maxStart = cur;
+                maxEnd   = next;
+            }
+        }
+        else {
+            if (maxSize > minSize) {
+                start.push_back(maxStart);
+                end.push_back(maxEnd);
+            }
+            maxStart = cur;
+            maxEnd   = next;
+            maxSize  = curSize;
+        }
+
+        //
+        // Done scoring current interval.  At this point the range
+        // pos[cur...next) has been searched for a max increasing
+        // interval.  Find a new range that will possibly yield a new
+        // maximum interval.  
+        // There are a few cases to consider:
+        //
+        //
+        // genome  |---+----+------------+------+-----------------------|
+        //  anchors  cur  cur+1        next   next+1
+        //
+        // Case 1.  The range on the target pos[ cur+1 ... next].t is a
+        // valid interval (it is roughly the length of the read).  In this
+        // case increase cur and next by 1, and search this range.
+        //
+        // genome  |---+----+------------+------+-----------------------|
+        //            cur  cur+1        next   next+1
+        // read interval   ====================
+        //
+        // Case 2.  The range on the target pos[cur+1 ... next] is not a
+        // valid interval, and it is much longer than the length of the
+        // read.  This implies that it is impossible to increase the score
+        // of the read by including both 
+        //
+        // genome  |---+----+--------------------------------+-----+---|
+        //            cur  cur+1                             next next+1
+        // read interval   ==================== 
+        //
+        // Advance the interval until it includes the next anchor
+        //
+        // genome  |---+----+------------------+-------------+-----+---|
+        //            cur  cur+1             cur+n          next next+1
+        // read interval                     ==================== 
+        // 
+
+        // First advance pointer in anchor list.  If this advances to the
+        // end, done and no need for further logic checking (break now).
+
+
+        // 
+        // If the next position is not within the same contig as the current,
+        // advance the current to the next since it is impossible to find
+        // any more intervals in the current pos.
+        //
+        bool recountInterval = false;
+        if (curBoundary != nextBoundary) {
+            cur = next;
+            curBoundary = nextBoundary;
+
+            //
+            // Start the search for the first interval in the next contig
+            // just after the current position.
+            //
+            if (next < nPos) {
+                next = cur + 1;
+            }
+        }
+        else {
+
+            //
+            // The next interval is in the same contig as the current interval.
+            // Make sure not to double count the current interval.
+            //
+
+            curSize -= pos[cur].l;
+
+            cur++;
+            if (cur >= nPos)
+                break;
+
+            //
+            // Advance the next to outside this interval.
+            //
+            curSize += pos[next].l;
+            if (pos[next].t - pos[cur].t > intervalLength) {
+                if (maxSize > minSize) {
+                    start.push_back(maxStart);
+                    end.push_back(maxEnd);
+                }
+
+                cur = next;
+                recountInterval = true;
+                maxSize = 0;
+            }
+            next++;
+        }
+
+        if (next > nPos) {
+            //
+            // Searched last interval, done.
+            //
+            break;
+        }
+
+        //
+        // Next has advanced.  Check what contig it is in.
+        //
+        if (next < nPos) {
+            nextBoundary = ContigStartPos(pos[next].t);
+            //
+            // Advance next to the maximum position within this contig that is
+            // just after where the interval starting at cur is, or the first
+            // position in the next contig.
+            //
+            int prevNext = next;
+            AdvanceIndexToPastInterval(pos, nPos, intervalLength, contigLength, ContigStartPos,
+                                       cur, curBoundary, next, nextBoundary);
+            if (prevNext != next or recountInterval) {
+                curSize = SumAnchors(pos, cur, next);
+            }
+        }
+
+        // if next >= nPos, the boundary stays the same.
+
+        //
+        //  When searching multiple contigs, it is important to know the
+        //  boundary of the contig that this anchor is in so that clusters
+        //  do not span multiple contigs.  Find the (right hand side)
+        //  boundary of the current contig.
+        //
+
+        curBoundary = ContigStartPos(pos[cur].t);
+        contigLength  = ContigStartPos.Length(pos[cur].t);
+
+        //
+        // Previously tried to advance half.  This is being removed since
+        // proper heuristics are making it not necessary to use.
+        //
+    }
+    if (curSize > minSize) {
+        start.push_back(maxStart);
+        end.push_back(maxEnd);
+    }
+}
+
+template<typename T_MatchList,
+         typename T_PValueFunction, 
+         typename T_WeightFunction,
+         typename T_SequenceBoundaryDB,
+         typename T_ReferenceSequence,
+         typename T_Sequence>
+int FindMaxIncreasingInterval(
+    // Input
+    // readDir is used to indicate if the interval that is being stored is 
+    // in the forward or reverse strand.  This is important later when 
+    // refining alignments so that the correct sequence is aligned back 
+    // to the reference.
+    int readDir, 
+    T_MatchList &pos, 
+    // How many values to search through for a max set.
+    DNALength intervalLength,  
+    // How many sets to keep track of
+    VectorIndex nBest, 
+    // End search for intervals at boundary positions
+    // stored in seqBoundaries
+    T_SequenceBoundaryDB & ContigStartPos,
+    // First rand intervals by their p-value
+    T_PValueFunction &MatchPValueFunction,  
+    // When ranking intervals, sum over weights determined by 
+    // MatchWeightFunction
+    T_WeightFunction &MatchWeightFunction,  
+    // Output.
+    // The increasing interval coordinates, 
+    // in order by queue weight.
+    WeightedIntervalSet &intervalQueue, 
+    T_ReferenceSequence &reference, 
+    T_Sequence &query,
+    IntervalSearchParameters &params,
+    vector<BasicEndpoint<ChainedMatchPos> > *chainEndpointBuffer,
+    ClusterList &clusterList,
+    VarianceAccumulator<float> &accumPValue, 
+    VarianceAccumulator<float> &accumWeight,
+    VarianceAccumulator<float> &accumNumAnchorBases,
+    const char *titlePtr) {
+
+    int maxLISSize = 0;
+    if (params.fastMaxInterval) {
+        maxLISSize = FastFindMaxIncreasingInterval(
+                readDir, pos, intervalLength,
+                nBest, ContigStartPos, 
+                MatchPValueFunction, MatchWeightFunction,
+                intervalQueue, reference, query,
+                params, chainEndpointBuffer, clusterList,
+                accumPValue, accumWeight);
+    } else {
+        maxLISSize = ExhaustiveFindMaxIncreasingInterval(
+                readDir, pos, intervalLength,
+                nBest, ContigStartPos, 
+                MatchPValueFunction, MatchWeightFunction,
+                intervalQueue, reference, query,
+                params, chainEndpointBuffer, clusterList,
+                accumPValue, accumWeight);
+    }
+
+    if (params.aggressiveIntervalCut and intervalQueue.size() >= 3) {
+        // aggressiveIntervalCut mode: 
+        // only pick up the most promising intervals if we can classify
+        // intervals into 'promising' and 'non-promising' clusters.
+        WeightedIntervalSet::iterator it = intervalQueue.begin();
+        int sz = intervalQueue.size();
+        vector<float> pValues, ddPValues;
+        pValues.resize(sz);
+        ddPValues.resize(sz);
+        float sumPValue = 0;
+        int i = 0;
+        for(; it != intervalQueue.end(); i++,it++) {
+            sumPValue += (*it).pValue;
+            pValues[i] = (*it).pValue;
+        }
+        //We will attemp to divide intervals into two clusters, promising 
+        //and non-promising.
+        float prevSumPValue = pValues[0];
+        // ddPValue[i], where i in [1...n-2] is the difference of 
+        //    (1) (mean pvalue of [0...i-1] minus pvalue[i])
+        // and 
+        //    (2) (pvalue[i] minus mean pvalue of [i+1...n-1])
+        // pValues are all negative, the lower the better.
+        // if ddPValue is negative, interval i is closer to cluster [i+1...n-1],
+        // otherwise, interval i is closer to cluster [0..i-1].
+        it = intervalQueue.begin();
+        it ++; //both it and i should point to the second interval in intervalQueue.
+        for(i = 1; i < sz - 1; i++,it++) {
+            ddPValues[i] = (prevSumPValue / i) +
+                           (sumPValue - prevSumPValue - pValues[i]) / (sz - i - 1) -
+                           2 * pValues[i];
+            if (ddPValues[i] <= params.ddPValueThreshold) {
+                // PValue of interval i is much closer to cluster [i+1...n-1] than
+                // to cluster [0...i-1]. Mean pValue of cluster [0..i-1] 
+                // minus mean pvalue of cluster [i+1...n-1] < 2 * -500
+                break;
+            }
+            prevSumPValue += pValues[i];
+        }
+        if (it != intervalQueue.end()) {
+            // Erase intervals in the non-promising cluster.
+            intervalQueue.erase(it, intervalQueue.end());
+            // Recompute accumPValue, accmWeight, clusterList;
+            accumPValue.Reset();
+            accumWeight.Reset();
+            clusterList.Clear();
+            for(it = intervalQueue.begin(); it != intervalQueue.end(); it++) {
+                accumPValue.Append((*it).pValue);
+                accumWeight.Append((*it).size);
+                clusterList.Store((*it).totalAnchorSize, (*it).start, (*it).end, (*it).nAnchors);
+            }
+        }
+    }
+    return maxLISSize;
+}
+
+template<typename T_MatchList,
+         typename T_PValueFunction, 
+         typename T_WeightFunction,
+         typename T_SequenceBoundaryDB,
+         typename T_ReferenceSequence,
+         typename T_Sequence>
+int FastFindMaxIncreasingInterval(
+        // Input
+        // readDir is used to indicate if the interval that is being stored is in the forward
+        // or reverse strand.  This is important later when refining alignments so that the
+        // correct sequene is aligned back to the reference.
+        int readDir, 
+        T_MatchList &pos, 
+        // How many values to search through for a max set.
+        DNALength intervalLength,  
+        // How many sets to keep track of
+        VectorIndex nBest, 
+        // End search for intervals at boundary positions
+        // stored in seqBoundaries
+        T_SequenceBoundaryDB & ContigStartPos,
+        // First rand intervals by their p-value
+        T_PValueFunction &MatchPValueFunction,  
+        // When ranking intervals, sum over weights determined by MatchWeightFunction
+        T_WeightFunction &MatchWeightFunction,  
+        // Output.
+        // The increasing interval coordinates, 
+        // in order by queue weight.
+        WeightedIntervalSet &intervalQueue, 
+        T_ReferenceSequence &reference, 
+        T_Sequence &query,
+        IntervalSearchParameters &params,
+        vector<BasicEndpoint<ChainedMatchPos> > *chainEndpointBuffer,
+        ClusterList &clusterList,
+        VarianceAccumulator<float> &accumPValue, 
+        VarianceAccumulator<float> &accumWeight) {
+ 
+    WeightedIntervalSet sdpiq;
+    VectorIndex cur = 0;
+    VectorIndex nPos = pos.size();
+    vector<VectorIndex> lisIndices;
+    //
+    // Initialize the first interval.
+    //
+    if (pos.size() == 0) {
+        return 0;
+    }
+
+    int lisSize;
+    float lisWeight;
+    float lisPValue;
+    T_MatchList lis;
+    float neginf = -1.0/0.0;
+    int noOvpLisSize = 0;
+    int noOvpLisNBases = 0;
+
+    //
+    // Search for clusters of intervals within the pos array within
+    // pos[cur...next).  The value of 'next' should be the first anchor
+    // outside the possible range to cluster, or the end of the anchor list.
+
+    VectorIndex next = cur + 1;
+    DNALength curBoundary = 0, nextBoundary = 0;
+    DNALength contigLength = ContigStartPos.Length(pos[cur].t);
+    DNALength endOfCurrentInterval = curBoundary + contigLength;
+
+    vector<UInt> scores, prevOpt;
+    vector<DNALength> start, end;
+
+    StoreLargestIntervals(pos, ContigStartPos, intervalLength, 30, start, end);
+
+    VectorIndex i;
+    VectorIndex posi;
+    int maxLISSize = 0;
+    
+    for (posi = 0; posi < start.size(); posi++) {
+        lis.clear();
+        lisIndices.clear();
+        cur = start[posi];
+        next = end[posi];
+        if (next - cur == 1) {
+            //
+            // Just one match in this interval, don't invoke call to global chain since it is given.
+            //
+            lisSize = 0;
+            lisIndices.push_back(0);
+        }
+        else {
+            //
+            // Find the largest set of increasing intervals that do not overlap.
+            //
+            if (params.globalChainType == 0) {
+                lisSize = GlobalChain<ChainedMatchPos, BasicEndpoint<ChainedMatchPos> >(pos, cur, next, 
+                        lisIndices, chainEndpointBuffer);
+            }
+            else {
+                //
+                //  A different call that allows for indel penalties.
+                //
+                lisSize = RestrictedGlobalChain(&pos[cur],next - cur, 0.1, lisIndices, scores, prevOpt);
+            }
+        }
+
+        // Maybe this should become a function?
+        for (i = 0; i < lisIndices.size(); i++) {
+            lis.push_back(pos[lisIndices[i]+cur]);
+        }
+
+        // 
+        // Compute pvalue of this match.
+        //
+        if (lis.size() > 0) {
+            lisPValue = MatchPValueFunction.ComputePValue(lis, noOvpLisNBases, noOvpLisSize);
+        }
+        else {
+            lisPValue = 0;
+        }
+
+        if (lisSize > maxLISSize) {
+            maxLISSize  = lisSize;
+        }
+
+        //
+        // Insert the interval into the interval queue maintaining only the 
+        // top 'nBest' intervals. 
+        //
+        WeightedIntervalSet::iterator lastIt = intervalQueue.begin();
+        MatchWeight lisWeight = MatchWeightFunction(lis);
+        VectorIndex lisEnd = lis.size() - 1;
+
+        accumPValue.Append(lisPValue);
+        accumWeight.Append(lisWeight);
+
+        if (lisPValue < params.maxPValue and lisSize > 0) {
+            WeightedInterval weightedInterval(lisWeight, noOvpLisSize, noOvpLisNBases, 
+                    lis[0].t, lis[lisEnd].t + lis[lisEnd].GetLength(), 
+                    readDir, lisPValue, 
+                    lis[0].q, lis[lisEnd].q + lis[lisEnd].GetLength(), 
+                    lis);
+            intervalQueue.insert(weightedInterval);
+            if (weightedInterval.isOverlapping == false) {
+                clusterList.Store((float)noOvpLisNBases, lis[0].t, lis[lis.size()-1].t, noOvpLisSize);
+            }
+            if (params.verbosity > 1) {
+                cout << "Weighted Interval to insert:"<< endl << weightedInterval << endl;
+                cout << "Interval Queue:"<< endl << intervalQueue << endl;
+            }
+        }
+    }
+    return maxLISSize;
+}
+
+template<typename T_MatchList,
+         typename T_PValueFunction, 
+         typename T_WeightFunction,
+         typename T_SequenceBoundaryDB,
+         typename T_ReferenceSequence,
+         typename T_Sequence>
+int ExhaustiveFindMaxIncreasingInterval(
+        // Input
+        // readDir is used to indicate if the interval that is being stored is in the forward
+        // or reverse strand.  This is important later when refining alignments so that the
+        // correct sequene is aligned back to the reference.
+        int readDir, 
+        T_MatchList &pos, 
+        // How many values to search through for a max set.
+        DNALength intervalLength,  
+        // How many sets to keep track of
+        VectorIndex nBest, 
+        // End search for intervals at boundary positions
+        // stored in seqBoundaries
+        T_SequenceBoundaryDB & ContigStartPos,
+        // First rand intervals by their p-value
+        T_PValueFunction &MatchPValueFunction,  
+        // When ranking intervals, sum over weights determined by MatchWeightFunction
+        T_WeightFunction &MatchWeightFunction,  
+        // Output.
+        // The increasing interval coordinates, 
+        // in order by queue weight.
+        WeightedIntervalSet &intervalQueue, 
+        T_ReferenceSequence &reference, 
+        T_Sequence &query,
+        IntervalSearchParameters &params,
+        vector<BasicEndpoint<ChainedMatchPos> > *chainEndpointBuffer,
+        ClusterList &clusterList,
+        VarianceAccumulator<float> &accumPValue, 
+        VarianceAccumulator<float> &accumWeight) {
+
+    WeightedIntervalSet sdpiq;
+    VectorIndex cur = 0;
+    VectorIndex nPos = pos.size();
+    //
+    // Initialize the first interval.
+    //
+    if (pos.size() == 0) {
+        return 0;
+    }
+
+    int lisSize;
+    float lisWeight;
+    float lisPValue;
+    T_MatchList lis;
+    float neginf = -1.0/0.0;	
+    int noOvpLisSize = 0;
+    int noOvpLisNBases = 0;
+
+    //
+    // Search for clusters of intervals within the pos array within
+    // pos[cur...next).  The value of 'next' should be the first anchor
+    // outside the possible range to cluster, or the end of the anchor list.
+
+    VectorIndex next = cur + 1;
+    DNALength curBoundary = 0, nextBoundary = 0;
+    DNALength contigLength = ContigStartPos.Length(pos[cur].t);
+    DNALength endOfCurrentInterval = curBoundary + contigLength;
+
+
+    curBoundary = ContigStartPos(pos[cur].t);
+    nextBoundary = ContigStartPos(pos[next].t);  
+    vector<UInt> scores, prevOpt;
+
+    //
+    // Advance next until the anchor is outside the interval that
+    // statrts at 'cur', and is inside the same contig that the anchor
+    // at cur is in.
+    //
+
+    DNALength curIntervalLength = NumRemainingBases(pos[cur].q, intervalLength);
+
+    AdvanceIndexToPastInterval(pos, nPos, intervalLength, contigLength, ContigStartPos,
+    cur, curBoundary, next, nextBoundary);
+
+
+    vector<VectorIndex> lisIndices;
+    VectorIndex i;
+
+    //
+    // Do some preprocessing.  If the number of anchors considered for this hit is 1, 
+    // the global chain is this sole ancor.  Don't bother calling GlobalChain
+    // since it allocates and deallocates extra memory.
+    //
+
+    int maxLISSize = 0;
+
+    //
+    // Search intervals until cur reaches the end of the list of
+    // anchors.
+    //
+    while ( cur < nPos ) {
+        //
+        // Search the local interval for a LIS larger than a previous LIS.
+        //
+        lis.clear();
+        lisIndices.clear();
+
+        if (next - cur == 1) {
+            //
+            // Just one match in this interval, don't invoke call to global chain since it is given.
+            //
+            lisSize = 1;
+            lisIndices.push_back(0);
+        }
+        else {
+            //
+            // Find the largest set of increasing intervals that do not overlap.
+            //
+            if (params.globalChainType == 0) {
+                lisSize = GlobalChain<ChainedMatchPos, BasicEndpoint<ChainedMatchPos> >(pos, cur, next, 
+                        lisIndices, chainEndpointBuffer);
+            }
+            else {
+                //
+                //  A different call that allows for indel penalties.
+                //
+                lisSize = RestrictedGlobalChain(&pos[cur],next - cur, 0.1, lisIndices, scores, prevOpt);
+            }
+        }
+
+        // Maybe this should become a function?
+        for (i = 0; i < lisIndices.size(); i++) {    lis.push_back(pos[lisIndices[i]+cur]); }
+
+
+        // 
+        // Compute pvalue of this match.
+        //
+        lisPValue = MatchPValueFunction.ComputePValue(lis, noOvpLisNBases, noOvpLisSize);
+
+        if (lisSize > maxLISSize) {
+            maxLISSize  = lisSize;
+        }
+
+        //
+        // Insert the interval into the interval queue maintaining only the 
+        // top 'nBest' intervals. 
+        //
+
+        WeightedIntervalSet::iterator lastIt = intervalQueue.begin();
+        MatchWeight lisWeight = MatchWeightFunction(lis);
+        VectorIndex lisEnd = lis.size() - 1;
+
+        accumPValue.Append(lisPValue);
+        accumWeight.Append(lisWeight);
+
+        if (lisPValue < params.maxPValue and lisSize > 0) {
+            WeightedInterval weightedInterval(lisWeight, noOvpLisSize, noOvpLisNBases, 
+                    lis[0].t, lis[lisEnd].t + lis[lisEnd].GetLength(), 
+                    readDir, lisPValue, 
+                    lis[0].q, lis[lisEnd].q + lis[lisEnd].GetLength(), 
+                    lis);
+            intervalQueue.insert(weightedInterval);
+            if (weightedInterval.isOverlapping == false) {
+                clusterList.Store((float)noOvpLisNBases, lis[0].t, lis[lis.size()-1].t, noOvpLisSize);
+            }
+            if (params.verbosity > 1) {
+                cout << "Weighted Interval to insert:"<< endl << weightedInterval << endl;
+                cout << "Interval Queue:"<< endl << intervalQueue << endl;
+            }
+        }
+
+        //
+        // Done scoring current interval.  At this point the range
+        // pos[cur...next) has been searched for a max increasing
+        // interval.  Find a new range that will possibly yield a new
+        // maximum interval.  
+        // There are a few cases to consider:
+        //
+        //
+        //genome  |---+----+------------+------+-----------------------|
+        //  anchors  cur  cur+1        next   next+1
+        //
+        // Case 1.  The range on the target pos[ cur+1 ... next].t is a
+        // valid interval (it is roughly the length of the read).  In this
+        // case increase cur and next by 1, and search this range.
+        //
+        // genome  |---+----+------------+------+-----------------------|
+        //            cur  cur+1        next   next+1
+        // read interval   ====================
+        //
+        // Case 2.  The range on the target pos[cur+1 ... next] is not a
+        // valid interval, and it is much longer than the length of the
+        // read.  This implies that it is impossible to increase the score
+        // of the read by including both 
+        //
+        // genome  |---+----+--------------------------------+-----+---|
+        //            cur  cur+1                             next next+1
+        // read interval   ==================== 
+        //
+        // Advance the interval until it includes the next anchor
+        //
+        // genome  |---+----+------------------+-------------+-----+---|
+        //            cur  cur+1             cur+n          next next+1
+        // read interval                     ==================== 
+        // 
+
+        // First advance pointer in anchor list.  If this advances to the
+        // end, done and no need for further logic checking (break now).
+
+
+        // 
+        // If the next position is not within the same contig as the current,
+        // advance the current to the next since it is impossible to find
+        // any more intervals in the current pos.
+        //
+        if (curBoundary != nextBoundary) {
+            cur = next;
+            curBoundary = nextBoundary;
+
+            //
+            // Start the search for the first interval in the next contig
+            // just after the current position.
+            //
+            if (next < nPos) {
+                next = cur + 1;
+            }
+        }
+        else {
+            cur++;
+            if (cur >= nPos)
+                break;
+
+            //
+            //  Look for need to advance the interval within the same
+            //  contig.  If the start of the next match is well past the
+            //  length of this read, keep moving forward matches until it is
+            //  possible to include the next interval in the matches for
+            //  this read.
+            // 
+            if (params.warp) {
+                while (cur < next and 
+                        next < nPos and 
+                        pos[next].t - pos[cur].t >= intervalLength) {
+                    //
+                    // It is impossible to increase the max interval weight any more
+                    // using pos[cur] when pos[next] is too far away from
+                    // pos[cur].  This is because the same set of anchors are used
+                    // when clustering pos[cur+1] ... pos[next] as
+                    // pos[cur] ... pos[next].  
+                    // Advance cur until pos[cur] is close enough to matter again.
+                    cur++;
+                }
+            }
+            //
+            // Advance the next to outside this interval.
+            next++;
+        }
+
+        if (next > nPos) {
+            //
+            // Searched last interval, done.
+            //
+            break;
+        }
+
+        //
+        // Next has advanced.  Check what contig it is in.
+        //
+        if (next < nPos) {
+            nextBoundary = ContigStartPos(pos[next].t);
+            //
+            // Advance next to the maximum position within this contig that is
+            // just after where the interval starting at cur is, or the first
+            // position in the next contig.
+            //
+            AdvanceIndexToPastInterval(pos, nPos, intervalLength, contigLength, ContigStartPos,
+                    cur, curBoundary, next, nextBoundary);
+        }
+        // if next >= nPos, the boundary stays the same.
+        //
+        //  When searching multiple contigs, it is important to know the
+        //  boundary of the contig that this anchor is in so that clusters
+        //  do not span multiple contigs.  Find the (right hand side)
+        //  boundary of the current contig.
+        //
+
+        curBoundary = ContigStartPos(pos[cur].t);
+        contigLength  = ContigStartPos.Length(pos[cur].t);
+
+        //
+        // Previously tried to advance half.  This is being removed since
+        // proper heuristics are making it not necessary to use.
+        //
+    }
+
+    return  maxLISSize;
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/GlobalChain.hpp b/libcpp/alignment/algorithms/anchoring/GlobalChain.hpp
new file mode 100644
index 0000000..b3565ec
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/GlobalChain.hpp
@@ -0,0 +1,37 @@
+#ifndef _BLASR_GLOBAL_CHAIN_HPP_
+#define _BLASR_GLOBAL_CHAIN_HPP_
+
+#include <vector>
+#include "Types.h"
+#include "DNASequence.hpp"
+#include "algorithms/anchoring/PrioritySearchTree.hpp"
+
+template<typename T_Fragment, typename T_Endpoint>
+void FragmentSetToEndpoints(T_Fragment* fragments, int nFragments, 
+     std::vector<T_Endpoint> &endpoints);
+
+template<typename T_Fragment>
+UInt RestrictedGlobalChain(T_Fragment *fragments, 
+    DNALength nFragments, float maxIndelRate,
+    std::vector<VectorIndex>& optFragmentChainIndices,
+    std::vector<UInt>& scores, std::vector<UInt>& prevOpt);
+
+template<typename T_Fragment, typename T_Endpoint>
+int GlobalChain( T_Fragment *fragments, 
+	DNALength nFragments, 
+    std::vector<VectorIndex> &optFragmentChainIndices,
+	std::vector<T_Endpoint> *bufEndpointsPtr = NULL);
+
+template<typename T_Fragment, typename T_Endpoint>
+int GlobalChain(std::vector<T_Fragment> &fragments, 
+    std::vector<VectorIndex> &optFragmentChainIndices);
+
+template<typename T_Fragment, typename T_Endpoint>
+int GlobalChain(std::vector<T_Fragment> &fragments, 
+    DNALength start, DNALength end, 
+    std::vector<VectorIndex> &optFragmentChainIndices,
+    std::vector<T_Endpoint> *bufEndpointsPtr = NULL);
+
+#include "algorithms/anchoring/GlobalChainImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/GlobalChainImpl.hpp b/libcpp/alignment/algorithms/anchoring/GlobalChainImpl.hpp
new file mode 100644
index 0000000..49c7788
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/GlobalChainImpl.hpp
@@ -0,0 +1,225 @@
+#ifndef _BLASR_GLOBAL_CHAIN_IMPL_HPP_
+#define _BLASR_GLOBAL_CHAIN_IMPL_HPP_
+
+#include <algorithm>
+#include "Types.h"
+#include "DNASequence.hpp"
+#include "algorithms/anchoring/PrioritySearchTree.hpp"
+
+using namespace std;
+
+template<typename T_Fragment,typename T_Endpoint>
+void FragmentSetToEndpoints(T_Fragment* fragments, 
+    int nFragments, std::vector<T_Endpoint>& endpoints) {
+
+	endpoints.resize(nFragments*2);
+	int i;
+	int ep = 0;
+	for (i = 0; i < nFragments; i++) {
+		endpoints[ep].FragmentPtrToStart(&fragments[i]);
+		ep++;
+		endpoints[ep].FragmentPtrToEnd(&fragments[i]);
+		ep++;
+	}
+}
+
+
+template<typename T_Fragment>
+UInt RestrictedGlobalChain(T_Fragment *fragments, 
+    DNALength nFragments, 
+    float maxIndelRate,
+    vector<VectorIndex> &optFragmentChainIndices,
+    vector<UInt> &scores,
+    vector<UInt> &prevOpt) {
+	// assume fragments are sorted by t
+	
+	UInt f1, f2;
+	scores.resize(nFragments);
+	prevOpt.resize(nFragments);
+	std::fill(scores.begin(), scores.end(), 0);
+
+	UInt globalOptScore = 0;
+	UInt globalOptIndex = 0;
+	for (f1 = 0; f1 < nFragments; f1++) {
+		prevOpt[f1] = f1;
+		scores[f1] = 1;
+	}
+	
+	for (f1 = 0; f1 < nFragments - 1; f1++) {
+		UInt maxF1Score = 0;
+		UInt maxF1Prev  = f1;
+		for (f2 = f1+1; f2 < nFragments; f2++ ){ 
+			//
+			//  Check to see if the fragments may be connected within the
+			//  expected indel rate.
+			//
+			if (fragments[f2].GetQ() > fragments[f1].GetQ() + fragments[f1].GetW() 
+                and
+			    fragments[f2].GetT() > fragments[f1].GetT() + fragments[f1].GetW()) {
+				//
+				// Compute drift from diagonal.
+				//
+				UInt tDiff, qDiff;
+				tDiff = fragments[f2].GetT() - (fragments[f1].GetT() + fragments[f1].GetW());
+				qDiff = fragments[f2].GetQ() - (fragments[f1].GetQ() + fragments[f1].GetW());
+				UInt tIns, qIns;
+				tIns = qIns = 0;
+				UInt maxDiff = max(tDiff, qDiff);
+				UInt minDiff = min(tDiff, qDiff);
+				if (maxDiff - minDiff < minDiff*maxIndelRate) {
+					//
+					// The fragment is sufficiently close to the diagonal to
+					// consider it as a chain.  
+					//
+					if (scores[f2] < scores[f1] + 1) {
+						scores[f2] = scores[f1] + 1;
+						prevOpt[f2] = f1;
+						if (scores[f2] > globalOptScore) {
+							globalOptScore = scores[f2];
+							globalOptIndex = f2;
+						}
+					}
+				}
+			}
+		}
+	}
+	UInt index = globalOptIndex;
+	UInt prevIndex;
+	while(index != prevOpt[index]) {
+		optFragmentChainIndices.push_back(index);
+		assert(optFragmentChainIndices.size() < nFragments);
+		prevIndex = index;
+		index = prevOpt[index];
+		// Make sure there was no problem with backtracking.
+		assert(index < nFragments);
+		assert(index <= prevOpt[prevIndex]);
+	}
+	optFragmentChainIndices.push_back(index);
+	std::reverse(optFragmentChainIndices.begin(), optFragmentChainIndices.end());
+	return optFragmentChainIndices.size();
+}
+	
+
+template<typename T_Fragment, typename T_Endpoint>
+int GlobalChain(T_Fragment *fragments, 
+	DNALength nFragments, 
+    vector<VectorIndex> & optFragmentChainIndices,
+    vector<T_Endpoint> * bufEndpointsPtr) {
+
+	//
+	// Initialize the fragment score to be the length of each fragment.
+	//
+	if (nFragments == 0) {
+		return 0;
+	}
+
+	DNALength f;
+	for (f = 0; f < nFragments; f++) { 
+		fragments[f].SetScore(fragments[f].GetLength());
+	}
+
+	//
+	// Add the start/end points of each fragment. This allows separate
+	// scoring of start points and activation of endpoints.
+	//
+	vector<T_Endpoint> endpoints;
+	vector<T_Endpoint> *endpointsPtr;
+	if (bufEndpointsPtr != NULL) {
+		endpointsPtr = bufEndpointsPtr;
+	}
+	else {
+		endpointsPtr = &endpoints;
+	}
+				
+	
+	FragmentSetToEndpoints<T_Fragment, T_Endpoint>(fragments, 
+        nFragments, *endpointsPtr);
+
+	//
+	// The Starting points of all the fragmements are in order, 
+	// but not necessarily all of the end endpoints, so
+	// the list must be resorted.
+	//
+	std::sort(endpointsPtr->begin(), endpointsPtr->end(), 
+        typename T_Endpoint::LessThan());
+	
+	PrioritySearchTree<T_Endpoint> pst;
+
+	pst.CreateTree(*endpointsPtr);
+
+	VectorIndex p;
+	VectorIndex maxScoringEndpoint = 0;
+	bool maxScoringEndpointFound = false;
+	
+	for (p = 0; p < endpointsPtr->size(); p++) {
+		if ((*endpointsPtr)[p].GetSide() == Start) {
+			int maxPointIndex;
+			if (pst.FindIndexOfMaxPoint((*endpointsPtr), (*endpointsPtr)[p].GetKey(), maxPointIndex)) {
+				(*endpointsPtr)[p].SetChainPrev((*endpointsPtr)[maxPointIndex].GetFragmentPtr());
+				(*endpointsPtr)[p].SetScore((*endpointsPtr)[maxPointIndex].GetScore() + (*endpointsPtr)[p].GetScore());
+			}
+			else {
+				(*endpointsPtr)[p].SetChainPrev(NULL);
+			}
+		}	else {
+			assert((*endpointsPtr)[p].GetSide() == End);
+			// 
+			// The score of the fragment should be already set.  So simply activate
+			// it here (make the point be visible in a search).
+			//
+			pst.Activate((*endpointsPtr), p);
+			if (maxScoringEndpointFound == false or
+					(*endpointsPtr)[maxScoringEndpoint].GetScore() < (*endpointsPtr)[p].GetScore()) {
+				maxScoringEndpoint = p;
+				maxScoringEndpointFound = true;
+			}
+		}
+	}
+	
+	// 
+	// Now compute the chain of optimum fragments
+	//
+	T_Fragment *optFragmentPtr;
+	if (maxScoringEndpointFound == false) {
+		// 
+		// Null case, no endpoints have been processed.
+		//
+		return 0;
+	}
+	
+	optFragmentPtr = (*endpointsPtr)[maxScoringEndpoint].GetFragmentPtr();
+	unsigned int numIter = 0;
+	while (optFragmentPtr != NULL) {
+		optFragmentChainIndices.push_back((int) (optFragmentPtr - &fragments[0]));
+		optFragmentPtr = optFragmentPtr->GetChainPrev();
+		// 
+		// Do a sanity check to make sure this loop is finite -- the optimal
+		// fragment chain should never contain more fragments than what are
+		// input.
+		//
+		assert(numIter < nFragments);
+		++numIter;
+	}
+    reverse(optFragmentChainIndices.begin(), optFragmentChainIndices.end());
+	return optFragmentChainIndices.size();
+
+}
+
+
+template<typename T_Fragment, typename T_Endpoint>
+int GlobalChain(vector<T_Fragment> &fragments, 
+    vector<VectorIndex> &optFragmentChainIndices) {
+	return GlobalChain<T_Fragment, T_Endpoint>(&fragments[0], 
+        fragments.size(), optFragmentChainIndices);
+}
+
+template<typename T_Fragment, typename T_Endpoint>
+int GlobalChain(vector<T_Fragment> &fragments, 
+    DNALength start, DNALength end, 
+    vector<VectorIndex> &optFragmentChainIndices,
+    vector<T_Endpoint> *bufEndpointsPtr) {
+	return GlobalChain<T_Fragment, T_Endpoint>(&fragments[start], 
+        end - start, optFragmentChainIndices, bufEndpointsPtr);
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LISPValue.hpp b/libcpp/alignment/algorithms/anchoring/LISPValue.hpp
new file mode 100644
index 0000000..1a0e9ab
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LISPValue.hpp
@@ -0,0 +1,24 @@
+#ifndef _BLASR_LISPVALUE_HPP_
+#define _BLASR_LISPVALUE_HPP_
+
+#include <math.h>
+#include "datastructures/anchoring/MatchPos.hpp"
+#include "tuples/TupleCountTable.hpp"
+#include "algorithms/anchoring/ScoreAnchors.hpp"
+
+template<typename T_MatchPos>
+void StoreNonOverlappingIndices(std::vector<T_MatchPos> &lis, 
+    std::vector<T_MatchPos> &noOvpLis);
+
+template<typename T_TextSequence, 
+         typename T_Sequence,
+         typename T_MatchPos, 
+         typename T_Tuple>
+float ComputeLISPValue(std::vector<T_MatchPos> &lis, 
+    T_TextSequence &text, T_Sequence &read,
+	TupleMetrics &tm, TupleCountTable<T_TextSequence, T_Tuple> &ct,
+    int &lisNBases, int &lisSize );
+
+#include "algorithms/anchoring/LISPValueImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LISPValueImpl.hpp b/libcpp/alignment/algorithms/anchoring/LISPValueImpl.hpp
new file mode 100644
index 0000000..613381c
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LISPValueImpl.hpp
@@ -0,0 +1,165 @@
+#ifndef _BLASR_LISP_VALUE_IMPL_HPP_
+#define _BLASR_LISP_VALUE_IMPL_HPP_
+
+template<typename T_MatchPos>
+void StoreNonOverlappingIndices(std::vector<T_MatchPos> &lis, 
+    std::vector<T_MatchPos> &noOvpLis) {
+	unsigned int i;
+
+	//
+	// Greedily add lis matches according to weight.  A match may be added
+	// as long as it does not overlap with any other matches.
+	//
+ 
+	// do nothing on empty lists
+	if (lis.empty()) return;
+
+	//
+	// First build a list of matches sorted by weight.
+	SortMatchPosListByWeight(lis);
+
+	//
+	// The first match is guaranteed to not overlap.
+	noOvpLis.push_back(lis[0]);
+
+	//
+	// Nothing is overlapping, and everything is sorted when there is 
+	// just one value.
+	if (lis.size() == 1) return;
+
+	//
+	// Next, add matches as long as they do not overlap.
+	for (i = 1; i < lis.size(); i++ ){
+		VectorIndex j;
+		int lts = lis[i].t;
+		int lte = lis[i].t + lis[i].GetLength();
+		int lqs = lis[i].q;
+		int lqe = lis[i].q + lis[i].GetLength();
+
+		int ovpFound = 0;
+		for (j =0; j < noOvpLis.size(); j++ ){
+			int tIntvStart = noOvpLis[j].t;
+			int tIntvEnd   = noOvpLis[j].t + noOvpLis[j].GetLength();
+			int qIntvStart = noOvpLis[j].q;
+			int qIntvEnd   = noOvpLis[j].q + noOvpLis[j].GetLength();
+			if ((lts >= tIntvStart and lts < tIntvEnd) or 
+					(lte >  tIntvStart and lte <= tIntvEnd) or
+					(lqs >= qIntvStart and lqs < qIntvEnd) or
+					(lqe >  qIntvStart and lqe <= qIntvEnd)) {
+				ovpFound = 1;
+				break;
+			}
+		}
+		if (!ovpFound) {
+			noOvpLis.push_back(lis[i]);
+		}
+	}
+	
+	//
+	// Now, the matches are found in order of size, but they need to
+	// be stored in order of text.
+	//
+	SortMatchPosList(noOvpLis);
+
+	//
+	// The match pos list was sorted in order of weight. 
+	// Just in case it causes problems down the line, re-sort it 
+	// according to query pos.
+	//
+	lis = noOvpLis;
+	SortMatchPosList(lis);
+}
+
+
+template<typename T_TextSequence, 
+         typename T_Sequence, 
+         typename T_MatchPos, 
+         typename T_Tuple>
+float ComputeLISPValue(std::vector<T_MatchPos> &lis, 
+    T_TextSequence &text, T_Sequence &read,
+	TupleMetrics &tm, TupleCountTable<T_TextSequence, T_Tuple> &ct,
+    int &lisNBases, int &lisSize ) {
+	//
+	// First, find a subset of the lis that has non-overlapping matches.
+	//
+    int i;
+    lisNBases = 0;
+    for (i = 0; i < lis.size(); i++) {
+        lisNBases += lis[i].l;
+    }
+    lisSize = lis.size();
+
+    float neginf = -1.0/0.0;
+    float inf = 1.0/0.0;
+
+    if (lis.size() == 1) {
+        //
+        // When just one LIS is found, the pvalue of the match is just the
+        // pvalue of getting a single hit with one read, which we estimate
+        // as the pvalue of at least one hit.
+        // 
+        float matchProb;
+        //
+        // Weight the single match based on how frequently it appears in
+        // the genome.
+        if (POneOrMoreMatches<T_TextSequence>(text, lis[0].t, 
+                lis[0].GetLength(), tm, ct, matchProb)) {		
+            return matchProb;
+        }
+        else {
+            // return non-significant match value.
+            return 1;
+        }
+    }
+	else {
+		//
+		// There is more than one non overlapping match.  This evokes a 
+        // totally different probability metric on LIS values.  Rather 
+        // than computing the probability of a single match, compute 
+        // the probability of seeing several matches in a row.
+		//
+		VectorIndex i;
+		float pChain = 0; // In other words, pChain = log(1)
+		// 
+		// prob of chain starts out as prob of first match.
+		//
+		if (POneOrMoreMatches(text, lis[0].t, lis[0].GetLength(),
+                tm, ct, pChain)) {
+			//
+			// Next, for each match, compute the expected probability of
+            // having to wait at most tGap time for a match.  Since this
+            // has screened for anchors that are not overlapping, 
+            // consider the events to be independent, and therefore
+			// the probabilities multiply.
+			//
+			for (i = 1; i < lis.size(); i++ ){ 
+
+				int tupleMatchCount;
+				//
+				// Find out how many times this word appears in the genome.
+				//
+				int approxNumMatches;
+				//
+				// Assume all hits are uniformly distributed across the
+				// genome.  qLambda is the frequency of seeing hit i in the
+				// genome.
+				//
+				float qLambda;
+				int   tGap;
+				int   qGap;
+				qLambda = lis[i].GetMultiplicity() / (1.0*text.length);
+			
+				// Now compute the probability of the chain.  Since the
+				// matches are uniformly distributed across the genome, the
+				// waiting time between matches is exponentially distributed.
+				pChain = pChain + log(qLambda);
+            }
+            return pChain;
+        }
+        else {
+            return 1;
+        }
+    }
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LISPValueWeightor.hpp b/libcpp/alignment/algorithms/anchoring/LISPValueWeightor.hpp
new file mode 100644
index 0000000..85213ff
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LISPValueWeightor.hpp
@@ -0,0 +1,52 @@
+#ifndef _BLASR_LISPVALUE_WEIGHTOR_HPP_
+#define _BLASR_LISPVALUE_WEIGHTOR_HPP_
+
+#include "algorithms/anchoring/LISPValue.hpp"
+#include "tuples/TupleMetrics.hpp"
+
+template<typename T_RefSequence, typename T_MatchList>
+class LISSumOfLogPWeightor {
+public:
+	DNALength genomeLength;
+	LISSumOfLogPWeightor(T_RefSequence &targetGenome);
+    float ComputePValue(T_MatchList &matchList, 
+        int &noOvpLisNBases, int &noOvpLisSize);
+    float operator()(T_MatchList &matchList);
+};
+
+
+template<typename T_RefSequence, typename T_Tuple, typename T_MatchList>
+class LISSMatchFrequencyPValueWeightor {
+public:
+	T_RefSequence target;
+	LISSMatchFrequencyPValueWeightor(T_RefSequence &_target);
+    float ComputePValue(T_MatchList &lis, 
+        int &noOvpLisNBases, int &noOvpLisSize);
+    float operator() (T_MatchList &lis);
+};	
+
+
+template<typename T_RefSequence, typename T_Tuple, typename T_MatchList>
+class LISPValueWeightor {
+public:
+    //
+    // All of these must be initialized prior to 
+    // computing weights (running the functor).
+    //
+    FASTASequence query;
+    T_RefSequence target;
+    TupleMetrics tm;
+    TupleCountTable<T_RefSequence, T_Tuple> *ct;
+
+    LISPValueWeightor(FASTASequence &_query, T_RefSequence &_target, 
+        TupleMetrics _tm, TupleCountTable<T_RefSequence, T_Tuple> *_ct);
+
+    float ComputePValue(T_MatchList &matchList, int &noOvpLisNBases,
+        int &noOvpLisSize);
+
+    float operator()(T_MatchList &matchList);
+};
+
+#include "algorithms/anchoring/LISPValueWeightorImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LISPValueWeightorImpl.hpp b/libcpp/alignment/algorithms/anchoring/LISPValueWeightorImpl.hpp
new file mode 100644
index 0000000..2e06940
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LISPValueWeightorImpl.hpp
@@ -0,0 +1,112 @@
+#ifndef _BLASR_LISPVALUE_WEIGHTOR_IMPL_HPP_
+#define _BLASR_LISPVALUE_WEIGHTOR_IMPL_HPP_
+
+#include "algorithms/anchoring/LISPValue.hpp"
+#include "tuples/TupleMetrics.hpp"
+
+template<typename T_RefSequence, typename T_MatchList>
+LISSumOfLogPWeightor<T_RefSequence, T_MatchList>::LISSumOfLogPWeightor(
+    T_RefSequence &targetGenome) {
+    genomeLength = targetGenome.length;
+}
+
+template<typename T_RefSequence, typename T_MatchList>
+float LISSumOfLogPWeightor<T_RefSequence, T_MatchList>::ComputePValue(
+    T_MatchList &matchList, int &noOvpLisNBases, int &noOvpLisSize) {
+    float pMatch = 0;
+    int i;
+    T_MatchList noOvpLis;
+    StoreNonOverlappingIndices(matchList, noOvpLis);
+    noOvpLisSize = noOvpLis.size();
+    noOvpLisNBases = 0;
+    for (i = 0; i < noOvpLis.size(); i++) {
+        noOvpLisNBases += noOvpLis[i].l;
+    }
+    for (i = 0; i < noOvpLis.size(); i++ ) {	
+        pMatch += -1 * ((int)noOvpLis[i].l);
+        // log(matchList[i].GetMultiplicity() / (1.0*genomeLength));
+    }
+    noOvpLisNBases = 0;
+    for (i = 0; i < matchList.size(); i++) {
+        noOvpLisNBases += matchList[i].l;
+    }
+    return pMatch;
+}
+
+
+template<typename T_RefSequence, typename T_MatchList>
+float LISSumOfLogPWeightor<T_RefSequence, T_MatchList>::operator()(
+    T_MatchList &matchList) {
+    int temp;
+    return ComputePValue(matchList, temp, temp);
+}
+
+
+template<typename T_RefSequence, typename T_Tuple, typename T_MatchList>
+LISSMatchFrequencyPValueWeightor<T_RefSequence, T_Tuple, T_MatchList>::LISSMatchFrequencyPValueWeightor(
+    T_RefSequence &_target) {
+    target.seq    = _target.seq;
+    target.length = _target.length;
+}
+
+
+template<typename T_RefSequence, typename T_Tuple, typename T_MatchList>
+float LISSMatchFrequencyPValueWeightor<T_RefSequence, T_Tuple, T_MatchList>::ComputePValue(
+    T_MatchList &lis, int &noOvpLisNBases, int &noOvpLisSize) {
+    T_MatchList noOvpLis;
+    StoreNonOverlappingIndices(lis, noOvpLis);
+    noOvpLisSize = noOvpLis.size();
+    int i;
+    noOvpLisNBases = 0;
+    for (i = 0; i < noOvpLis.size(); i++) {
+        noOvpLisNBases += noOvpLis[i].l;
+    }
+    if (noOvpLis.size() == 0){
+        return 1;
+    }
+
+    float pMatch = 0;
+    for (i = 0; i < noOvpLis.size(); i++ ) {
+        assert(noOvpLis[i].GetMultiplicity() > 0);
+        pMatch += log((1.0*noOvpLis[i].GetMultiplicity()) / target.length) * noOvpLis[i].l;
+    }
+    return pMatch;
+}
+
+
+template<typename T_RefSequence, typename T_Tuple, typename T_MatchList>
+float LISSMatchFrequencyPValueWeightor<T_RefSequence, T_Tuple, T_MatchList>::operator() (
+    T_MatchList &lis) {
+    int noOvpLisSize = 0;
+    return ComputePValue(lis, noOvpLisSize, noOvpLisSize);
+}
+
+
+template<typename T_RefSequence, typename T_Tuple, typename T_MatchList>
+LISPValueWeightor<T_RefSequence, T_Tuple, T_MatchList>::LISPValueWeightor(
+    FASTASequence &_query, T_RefSequence &_target, TupleMetrics _tm, 
+    TupleCountTable<T_RefSequence, T_Tuple> *_ct) {
+    query.seq     = _query.seq;
+    query.length  = _query.length;
+    target.seq    = _target.seq;
+    target.length = _target.length;
+    ct = _ct;
+    tm = _tm;
+}
+
+
+template<typename T_RefSequence, typename T_Tuple, typename T_MatchList>
+float LISPValueWeightor<T_RefSequence, T_Tuple, T_MatchList>::ComputePValue(
+    T_MatchList &matchList, int &noOvpLisNBases, int &noOvpLisSize) {
+    return ComputeLISPValue(matchList, target, query, tm, *ct, 
+        noOvpLisNBases, noOvpLisSize);    
+}
+
+
+template<typename T_RefSequence, typename T_Tuple, typename T_MatchList>
+float LISPValueWeightor<T_RefSequence, T_Tuple, T_MatchList>::operator()(
+    T_MatchList &matchList){
+    int noOvpLisSize = 0, noOvpLisNBases = 0;
+    return ComputeLISPValue(matchList, target, query, tm, *ct, noOvpLisNBases, noOvpLisSize);    
+}
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LISQValueWeightor.hpp b/libcpp/alignment/algorithms/anchoring/LISQValueWeightor.hpp
new file mode 100644
index 0000000..fd537ca
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LISQValueWeightor.hpp
@@ -0,0 +1,35 @@
+#ifndef _BLASR_LIS_QVALUE_WEIGHTOR_HPP_
+#define _BLASR_LIS_QVALUE_WEIGHTOR_HPP_
+
+#include "qvs/QualityValue.hpp"
+#include "DNASequence.hpp"
+#include "FASTQSequence.hpp"
+
+template<typename T_MatchList, typename T_Sequence>
+class LISQValueWeightor {
+public:
+	T_Sequence *seq;
+	float operator()(const T_MatchList &matchList);
+};
+
+template<typename T_MatchList, typename T_Sequence>
+float LISQValueWeightor<T_MatchList, T_Sequence>::operator() (
+    const T_MatchList &matchList) {
+    float totalQ;
+    DNALength  nBases;
+    VectorIndex i;
+    totalQ = 0.0;
+    nBases = 0;
+    for (i = 0; i < matchList.size(); i++) {
+        DNALength mp;
+        for (mp = matchList[i].q; mp < matchList[i].q + matchList[i].w; mp++) {
+            totalQ += (*seq).qual[mp];
+        }
+        nBases += matchList[i].w;
+    }
+    if (nBases > 0) {
+        return totalQ / nBases;
+    }
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LISSizeWeightor.hpp b/libcpp/alignment/algorithms/anchoring/LISSizeWeightor.hpp
new file mode 100644
index 0000000..fa71bd0
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LISSizeWeightor.hpp
@@ -0,0 +1,14 @@
+#ifndef _BLASR_LIS_SIZE_WEIGHTOR_HPP_
+#define _BLASR_LIS_SIZE_WEIGHTOR_HPP_
+
+#include "Types.h"
+
+template<typename T_MatchList>
+class LISSizeWeightor {
+public:
+	MatchWeight operator()(T_MatchList &matchList);
+};
+
+#include "algorithms/anchoring/LISSizeWeightorImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LISSizeWeightorImpl.hpp b/libcpp/alignment/algorithms/anchoring/LISSizeWeightorImpl.hpp
new file mode 100644
index 0000000..ff778f5
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LISSizeWeightorImpl.hpp
@@ -0,0 +1,13 @@
+#ifndef _BLASR_LISSIZE_WEIGHTOR_IMPL_HPP_
+#define _BLASR_LISSIZE_WEIGHTOR_IMPL_HPP_
+template<typename T_MatchList>
+MatchWeight LISSizeWeightor<T_MatchList>:: operator()(
+    T_MatchList &matchList) {
+    MatchWeight size = 0;
+    VectorIndex i;
+    for (i = 0; i < matchList.size(); i++) {
+        size += matchList[i].GetLength();
+    }
+    return size;
+}
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LongestIncreasingSubsequence.hpp b/libcpp/alignment/algorithms/anchoring/LongestIncreasingSubsequence.hpp
new file mode 100644
index 0000000..ef8c920
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LongestIncreasingSubsequence.hpp
@@ -0,0 +1,31 @@
+#ifndef _BLASR_LONGEST_INCREASING_SUBSEQUENCE_HPP_
+#define _BLASR_LONGEST_INCREASING_SUBSEQUENCE_HPP_
+
+#include <assert.h>
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+using namespace std;
+
+template<typename T>
+class RawValue {
+	int operator()(T &t) {
+		return t;
+	}
+};
+
+template<typename T, typename F_IntValue>
+int BinarySearch(T *x, vector<int> &m, int i, int lenM, F_IntValue IntValue);
+
+template<typename T, typename F_IntValue >
+int LongestIncreasingSubset(T *x, int xLength, vector<int> &subsetIndices, 
+    vector<int> &m, vector<int> &p, F_IntValue IntValue, 
+    int start=0, int end = -1);
+
+template<typename T, typename F_IntValue>
+int LongestIncreasingSubset(T*x, int& xLength, vector<int> &subsetIndices);
+
+#include "algorithms/anchoring/LongestIncreasingSubsequenceImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/LongestIncreasingSubsequenceImpl.hpp b/libcpp/alignment/algorithms/anchoring/LongestIncreasingSubsequenceImpl.hpp
new file mode 100644
index 0000000..acda550
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/LongestIncreasingSubsequenceImpl.hpp
@@ -0,0 +1,135 @@
+#ifndef _BLASR_LONGEST_INCREASING_SUBSEQUENCE_IMPL_HPP_
+#define _BLASR_LONGEST_INCREASING_SUBSEQUENCE_IMPL_HPP_
+
+using namespace std;
+
+template<typename T, typename F_IntValue>
+int BinarySearch(T *x, vector<int> &m, int i, int lenM, F_IntValue IntValue) {
+    //
+    // Binary search for the largest
+    //   j ≤ L such that X[M[j]] < X[i]
+    //   (or set j = 0 if no such value exists)
+    //
+
+    //
+    // In English: Find the longest subsequence ending
+    //   at some value less than X[i].  That
+    //   way, X[i] can increase this subsequence by 1.
+    //
+    int low = 0, high = lenM, cur;
+    cur = (high + low) / 2;
+    assert(cur < m.size());
+
+    while (low < high) {
+        if (high == 1) {
+            assert(cur == 0);
+            return cur;
+        }
+        // The highest value is between cur and high.
+        if (IntValue(x[m[cur]]) < IntValue(x[i])) {
+            low = cur + 1;
+        }
+        else {
+            // x[m[cur]] is above x[i], so the highest valid value is
+            // strictly below cur
+            high = cur;
+        }
+        cur = (low + high) / 2;
+    }
+
+    // cur is either the last spot where x[m[cur]] < x[i], or
+    // the first spot where x[m[cur]] > x[i];
+    // Typically x[m[cur]] must be less than x[i], except on the first
+    // call to this, in which case x[m[cur]] == x[i] == the first element
+    // in the array.
+    if (cur == 0) {
+        return cur;
+    }
+    else {
+        return cur - 1;
+    }
+}
+
+
+template<typename T, typename F_IntValue >
+int LongestIncreasingSubset(T *x, int xLength, vector<int> &subsetIndices, 
+	vector<int> &m, vector<int> &p, F_IntValue IntValue, 
+	int start, int end) {
+
+	//
+	// m[i] is the index of the LIS of length i+1
+	//
+	m.resize(xLength+1);
+	if (xLength == 0)
+		return 0;
+	m[0] = -1;
+	
+	p.resize(xLength);
+	int i;
+
+	int maxM;
+	//  On the first iteration m[0] should be set to 0.
+	int lenM = 1;
+	int mi;
+
+	for (i = 0; i < xLength; i++) { 
+		//
+		// Find the index of the longest increasing subsequence ending 
+        // before x[i]
+		//
+		maxM = BinarySearch<T,F_IntValue>(x, m, i, lenM);
+
+		//
+		// p is the list of back pointers.
+		// Create a reference for where the previous longest increasing 
+		// subsequence that x[i] is part of.
+		//
+
+		p[i] = m[maxM];
+
+		//
+		// If this creates a LIS longer than any previously known one,
+		// add this to maxM.
+		//
+		if (maxM + 1 >= lenM) {
+			assert(maxM+1 < m.size());
+			m[maxM+1] = i;
+			if (maxM + 1>= lenM) {
+				// assume that lenM is never more than 2 greater than maxM.
+				lenM++;
+			}
+		}
+		//
+		// Otherwise, x[i] cannot create a longer LIS, BUT, if 
+		// it is less than the current element that ends a LIS of length maxM,
+        // it bumps that element out from the slot of ending the LIS with 
+        // length maxM.
+		//
+		else if (IntValue(x[i]) < IntValue(x[m[maxM+1]])) {
+			m[maxM+1] = i;
+		}
+	}
+	
+	//
+	// Trace back;
+	//
+	int lisLen = lenM-1;
+	int lisCur = m[lisLen];
+ 	for (i = 0 ; i < lisLen and lisCur != -1; i++) {
+	   subsetIndices.push_back(lisCur);
+	   lisCur = p[lisCur];
+	}
+	std::reverse(subsetIndices.begin(), subsetIndices.end());	
+
+	return lenM - 1;
+}
+
+template<typename T, typename F_IntValue>
+int LongestIncreasingSubset(T*x, int& xLength, vector<int> &subsetIndices) {
+	vector<int> p;
+	vector<int> m;
+	return LongestIncreasingSubset(x, xLength, subsetIndices, m, p);
+}
+
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/MapBySuffixArray.hpp b/libcpp/alignment/algorithms/anchoring/MapBySuffixArray.hpp
new file mode 100644
index 0000000..ce8ac39
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/MapBySuffixArray.hpp
@@ -0,0 +1,44 @@
+#ifndef _BLASR_MAP_BY_SUFFIX_ARRAY_HPP_
+#define _BLASR_MAP_BY_SUFFIX_ARRAY_HPP_
+
+#include <algorithm>
+#include "suffixarray/SuffixArray.hpp"
+#include "datastructures/anchoring/MatchPos.hpp"
+#include "datastructures/anchoring/AnchorParameters.hpp"
+#include "algorithms/alignment/SWAlign.hpp"
+#include "algorithms/alignment/ScoreMatrices.hpp"
+
+/*
+ * Parameters:
+ * Eventually this should be strongly typed, since this is specific to
+ * suffix array searching on DNASequence read/genome types.
+ * reference  - should be of type DNASequence
+ * sa         - shuld be of type SuffixArray
+ * read       - may be of any DNASequence subclass.
+ * tupleSize  - The length of the keyword used to speed up searching.
+ * Out:
+ *   matchLow - The starting point in the suffix array for the LCP
+ *              match for the read at pos p.
+ *   matchHigh -The same array but for the upper bound.
+ *   saMatchLength - The length of the lcp.
+ */
+template<typename T_SuffixArray, 
+         typename T_RefSequence, 
+         typename T_Sequence>
+int LocateAnchorBoundsInSuffixArray(T_RefSequence &reference,
+	T_SuffixArray &sa, T_Sequence &read, unsigned int minPrefixMatchLength,
+	std::vector<DNALength> &matchLow, std::vector<DNALength> &matchHigh,
+	std::vector<DNALength> &matchLength, AnchorParameters &params);
+
+template<typename T_SuffixArray, 
+         typename T_RefSequence, 
+         typename T_Sequence, 
+         typename T_MatchPos>
+int MapReadToGenome(T_RefSequence &reference,
+	T_SuffixArray &sa, T_Sequence &read, 
+	unsigned int minPrefixMatchLength,
+	vector<T_MatchPos> &matchPosList,
+	AnchorParameters &anchorParameters);
+
+#include "algorithms/anchoring/MapBySuffixArrayImpl.hpp"
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/MapBySuffixArrayImpl.hpp b/libcpp/alignment/algorithms/anchoring/MapBySuffixArrayImpl.hpp
new file mode 100644
index 0000000..6cbac02
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/MapBySuffixArrayImpl.hpp
@@ -0,0 +1,315 @@
+#ifndef _BLASR_MAP_BY_SUFFIX_ARRAY_IMPL_HPP_
+#define _BLASR_MAP_BY_SUFFIX_ARRAY_IMPL_HPP_
+#include "defs.h" 
+#include "algorithms/anchoring/MapBySuffixArray.hpp"
+
+/*
+ * Parameters:
+ * Eventually this should be strongly typed, since this is specific to
+ * suffix array searching on DNASequence read/genome types.
+ * reference  - should be of type DNASequence
+ * sa         - shuld be of type SuffixArray
+ * read       - may be of any DNASequence subclass.
+ * tupleSize  - The length of the keyword used to speed up searching.
+ * Out:
+ *   matchLow - The starting point in the suffix array for the LCP
+ *              match for the read at pos p.
+ *   matchHigh -The same array but for the upper bound.
+ *   saMatchLength - The length of the lcp.
+ */
+template<typename T_SuffixArray, 
+         typename T_RefSequence, 
+         typename T_Sequence>
+int LocateAnchorBoundsInSuffixArray(T_RefSequence &reference,
+	T_SuffixArray &sa, T_Sequence &read, unsigned int minPrefixMatchLength,
+	std::vector<DNALength> &matchLow, std::vector<DNALength> &matchHigh,
+	std::vector<DNALength> &matchLength, AnchorParameters &params) {
+
+    //
+    // Make sure there is enough of this read to map.  Since searches
+    // are keyed off of 'minPrefixMatchLength' matches, don't search
+    // anything shorter than that.
+    //
+    if (minPrefixMatchLength > 0 and 
+        read.subreadEnd - read.subreadStart < minPrefixMatchLength) {
+        return 0;
+    }
+
+    DNALength p, m;
+    DNALength alignEnd;
+    DNALength matchEnd = read.subreadEnd - minPrefixMatchLength + 1;
+    DNALength numSearchedPositions = matchEnd - read.subreadStart;
+
+    matchLength.resize(numSearchedPositions);
+    matchLow.resize(numSearchedPositions);
+    matchHigh.resize(numSearchedPositions);
+
+    std::fill(matchLength.begin(), matchLength.end(), 0);
+    std::fill(matchLow.begin(), matchLow.end(), 0);
+    std::fill(matchHigh.begin(), matchHigh.end(), 0);
+    vector<SAIndex> lowMatchBound, highMatchBound;	
+
+    for (m = 0, p = read.subreadStart; p < matchEnd; p++, m++) {
+        DNALength lcpLow, lcpHigh, lcpLength;
+        lowMatchBound.clear(); highMatchBound.clear();
+        lcpLow = 0;
+        lcpHigh = 0;
+        lcpLength = sa.StoreLCPBounds(reference.seq, reference.length, 
+            &read.seq[p], matchEnd - p,
+            params.useLookupTable,
+            params.maxLCPLength,
+            //
+            // Store the positions in the SA
+            // that are searched.
+            //
+            lowMatchBound, highMatchBound, 
+            params.stopMappingOnceUnique);
+
+        //
+        // Possibly print the lcp bounds for debugging
+        //
+        if (params.lcpBoundsOutPtr != NULL) {
+            for (int i = 0; i < lowMatchBound.size(); i++) {
+                *params.lcpBoundsOutPtr << 
+                    (highMatchBound[i] - lowMatchBound[i]);
+                if (i < lowMatchBound.size() - 1) {
+                    *params.lcpBoundsOutPtr << " ";
+                }  
+            }
+            *params.lcpBoundsOutPtr << endl;
+        }
+
+        //
+        // Default to no match.
+        //
+        matchLow[m] = matchHigh[m] = matchLength[m] = 0;
+
+        //
+        // If anything was found in the suffix array:
+        //
+        if (lowMatchBound.size() > 0) {
+            //
+            // First expand the search bounds until at least
+            // one match is found.
+            //
+            int lcpSearchLength = lowMatchBound.size();
+            bool extendedForward = false;
+            while (lcpSearchLength > 0 and 
+                    lowMatchBound[lcpSearchLength - 1] == 
+                    highMatchBound[lcpSearchLength - 1]) {
+                lcpSearchLength--;
+                lcpLength--;
+            }
+            matchLow[m]  = lowMatchBound[lcpSearchLength - 1];
+            matchHigh[m] = highMatchBound[lcpSearchLength - 1];
+            matchLength[m] = minPrefixMatchLength + lcpSearchLength;
+
+            //
+            // Next, apply some heuristics to the anchor generation.
+            //
+            // 1.1 If the suffix array match is unique, try and extend that
+            // match as long as possible to ease global chaining later on.  
+            //
+            // 1.2 If the suffix array match is unique, but cannot be
+            // extended, it probably ends in an error.  Back the search up
+            // by 1.
+            //
+            // 2.1 If the suffix array match is not unique, return the
+            // default matches, or expand the search to include more
+            // matches. 
+            //
+
+            //
+            // Check to see if the match was unique.
+            //
+            if (matchLow[m] + 1 == matchHigh[m]) {
+                //
+                // If the match is unique, extend for as long as possible.
+                //
+                lcpLength = minPrefixMatchLength + lcpSearchLength;
+                long refPos    = sa.index[matchLow[m]] + lcpLength;
+                long queryPos  = p + lcpLength;
+                bool extensionWasPossible = false;
+
+                while (refPos + 1 < reference.length and
+                       queryPos + 1 < read.length and
+                       reference.seq[refPos + 1] == read.seq[queryPos + 1] and 
+                       (params.maxLCPLength == 0 or 
+                        lcpLength < params.maxLCPLength)) {
+                    refPos++;
+                    queryPos++;
+                    lcpLength++;
+                    extensionWasPossible = true;
+                }
+
+                if (extensionWasPossible) {
+                    //
+                    // Was able to extend match far into the genome, store that.
+                    //
+                    matchLength[m] = lcpLength;
+                }
+                else if (extensionWasPossible == false) {
+                    //
+                    // No extension was possible, indicating that this match
+                    // ends at an error.  To be safe, expand search by up to
+                    // 1.
+                    //
+                    if (lcpSearchLength > 1) {
+                        lcpSearchLength = lcpSearchLength - 1;
+                    }
+                    matchLow[m]  = lowMatchBound[lcpSearchLength-1];
+                    matchHigh[m] = highMatchBound[lcpSearchLength-1];
+                    matchLength[m] = minPrefixMatchLength + lcpSearchLength;
+                }
+            }
+            else {
+                //
+                // The match is not unique.  Store a possibly expanded search.
+                // 
+                int numBacktrack = params.expand;
+                if (lcpSearchLength > params.expand) {
+                    lcpSearchLength -= params.expand;
+                }
+                else {
+                    assert(lowMatchBound.size() > 0);
+                    lcpSearchLength = 1;
+                }
+
+                //
+                // There are multiple matches for this position.
+                //
+                matchLow[m]    = lowMatchBound[lcpSearchLength - 1];
+                matchHigh[m]   = highMatchBound[lcpSearchLength - 1];
+                matchLength[m] = minPrefixMatchLength + lcpSearchLength;
+            }
+        }
+        else {
+            //
+            // The match is shorter than what the search is supposed to
+            // expand to.  In order to avoid expanding to before the end
+            // of the match list, do not set any match.
+            //
+            matchLow[m]    = 0;
+            matchHigh[m]   = 0;
+            matchLength[m] = 0;
+        }
+
+        //
+        // Possibly advance a bunch of steps.
+        //
+        if (params.advanceExactMatches) {
+            int tmp = (int)lcpLength - (int)params.expand
+                      - params.advanceExactMatches;
+            int advance = MAX(tmp, 0);
+            p += advance;
+            m += advance;
+        }
+    }
+    return 1;
+}
+
+
+template<typename T_SuffixArray, 
+         typename T_RefSequence, 
+         typename T_Sequence, 
+        typename T_MatchPos>
+int MapReadToGenome(T_RefSequence &reference,
+    T_SuffixArray &sa, T_Sequence &read, 
+    unsigned int minPrefixMatchLength,
+    vector<T_MatchPos> &matchPosList,
+    AnchorParameters &anchorParameters) {
+
+    vector<DNALength> matchLow, matchHigh, matchLength;
+
+    int minMatchLen = anchorParameters.minMatchLength;
+    if (read.subreadEnd - read.subreadStart < minMatchLen) {
+        matchPosList.clear();
+        return 0;
+    }
+
+    LocateAnchorBoundsInSuffixArray(reference, sa, read, 
+        minPrefixMatchLength, matchLow, matchHigh, matchLength,
+        anchorParameters);
+
+    //
+    // Try evaluating some contexts.
+    //
+    DNALength pos;
+    DNALength mappedLength = matchLow.size();
+    assert(matchLow.size() == matchHigh.size());
+
+    DNASequence evalQrySeq, evalRefSeq;
+    vector<Arrow> pathMat;
+    vector<int> scoreMat;
+    Alignment alignment;
+
+    //
+    // Do some filtering on the matches looking for overlapping matches
+    // if there are any.
+    //
+    if (anchorParameters.removeEncompassedMatches) {
+        vector<bool> removed;
+        removed.resize(read.length);
+        std::fill(removed.begin(), removed.end(), false);
+        int i;
+        int nRemoved = 0;
+        for (i = 0; i < read.length-1; i++) {
+            if (matchLength[i] == matchLength[i+1]+1) {
+                removed[i+1] = true;
+            }
+        }
+        for (i = 1; i < matchLength.size(); i++) {
+            if (removed[i]) {
+                matchLength[i] = matchLow[i] = matchHigh[i] = 0;
+            }
+        }
+    }
+    //
+    // Now add 
+    // 
+    DNALength endOfMapping;
+    DNALength trim = MAX(minMatchLen + 1, sa.lookupPrefixLength + 1);
+    if (read.subreadEnd < trim) {
+        endOfMapping = 0;
+    }
+    else {
+        endOfMapping = read.subreadEnd - trim;
+    }
+
+    for (pos = read.subreadStart; pos < endOfMapping; pos++) {	
+        int matchIndex = pos - read.subreadStart;
+        assert(matchIndex < matchHigh.size());
+        if (matchHigh[matchIndex] - matchLow[matchIndex] <= 
+            anchorParameters.maxAnchorsPerPosition) {
+            DNALength mp;
+            for (mp = matchLow[matchIndex]; mp < matchHigh[matchIndex]; mp++) {
+                if (matchLength[matchIndex] < minMatchLen) {
+                    continue;
+                }
+
+                //
+                // By default, add all anchors.
+                //
+                if (matchLength[matchIndex] + pos > read.length) {
+                    //
+                    // When doing branching, it's possible that a deletion
+                    // branch finds an anchor that goes past the end of a
+                    // read.  When that is the case, trim back the anchor
+                    // match since this confuses downstream assertions.
+                    //
+                    matchLength[matchIndex] = read.length - pos;
+                }
+                assert(sa.index[mp] + matchLength[matchIndex] 
+                    <= reference.length);
+
+                matchPosList.push_back(ChainedMatchPos(sa.index[mp], pos,
+                    matchLength[matchIndex], 
+                    matchHigh[matchIndex] - matchLow[matchIndex]));
+            }
+        }
+    }
+
+    return matchPosList.size();
+}		
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/PrioritySearchTree.hpp b/libcpp/alignment/algorithms/anchoring/PrioritySearchTree.hpp
new file mode 100644
index 0000000..e9f4c69
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/PrioritySearchTree.hpp
@@ -0,0 +1,69 @@
+#ifndef _BLASR_PRIORITY_SEARCH_TREE_HPP_
+#define _BLASR_PRIORITY_SEARCH_TREE_HPP_
+
+#include <vector>
+#include "algorithms/anchoring/BasicEndpoint.hpp"
+
+/*
+ * Define a priority search tree on a point that implements 
+ * the following interface:
+ *
+ * int T_point::GetIndex()
+ *    - Return the index of the point in a list of points.
+ * int T_point::GetKey()
+ *    - Return the key value that the points are sorted by (x-value in a 2D query)
+ * int T_point::GetValue()
+ *    - Return the value of a point.
+ * int T_point::SetValue(int value)
+ *    - sets the value of a point.
+ *
+ * This class implements a query FindMax(key), which returns
+ * the index of the point with greatest value of all points with key [0...key).
+ *
+ * 
+ */
+template<typename T_Point>
+class PSTVertex {
+public: 
+    unsigned int leftChildIndex;
+    unsigned int rightChildIndex;
+    unsigned int isALeaf;
+    KeyType medianKey;
+    KeyType maxKey;
+    unsigned int pointIndex;
+    int maxScoreNode;
+    PSTVertex();
+};
+
+template<typename T_Point>
+class PrioritySearchTree {
+private:
+    std::vector<PSTVertex<T_Point> > tree;
+    std::vector<PSTVertex<T_Point> > * treePtr;
+	int GetMedianIndex(int start, int end);
+
+	inline KeyType CreateTree(std::vector<T_Point> &points, 
+        int start, int end, unsigned int &iterativeIndex);
+
+	int FindIndexOfMaxPoint(int curVertexIndex, std::vector<T_Point> &points, 
+        KeyType maxKey, int &maxPointValue, 
+        int &maxPointIndex);
+
+public:
+    PrioritySearchTree();
+
+	void CreateTree(std::vector<T_Point> &points, 
+        std::vector<PSTVertex<T_Point> > *bufTreePtr=NULL);
+
+	int FindPoint(KeyType pointKey, 
+        int curVertexIndex, int &pointVertexIndex);
+
+	void Activate(std::vector<T_Point> &points, int pointIndex);
+
+	int FindIndexOfMaxPoint(std::vector<T_Point> &points, 
+        KeyType maxPointKey, int &maxPointIndex);
+};
+
+#include "algorithms/anchoring/PrioritySearchTreeImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/PrioritySearchTreeImpl.hpp b/libcpp/alignment/algorithms/anchoring/PrioritySearchTreeImpl.hpp
new file mode 100644
index 0000000..baa5b5b
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/PrioritySearchTreeImpl.hpp
@@ -0,0 +1,296 @@
+#ifndef _BLASR_PRIORITY_SEARCH_TREE_IMPL_HPP_
+#define _BLASR_PRIORITY_SEARCH_TREE_IMPL_HPP_
+
+/*
+ * Define a priority search tree on a point that implements 
+ * the following interface:
+ *
+ * int T_point::GetIndex()
+ *    - Return the index of the point in a list of points.
+ * int T_point::GetKey()
+ *    - Return the key value that the points are sorted by (x-value in a 2D query)
+ * int T_point::GetValue()
+ *    - Return the value of a point.
+ * int T_point::SetValue(int value)
+ *    - sets the value of a point.
+ *
+ * This class implements a query FindMax(key), which returns
+ * the index of the point with greatest value of all points with key [0...key).
+ *
+ * 
+ */
+template<typename T_Point>
+PSTVertex<T_Point>::PSTVertex() {
+    isALeaf         = 0;
+    leftChildIndex  = 0;
+    rightChildIndex = 0;
+    maxScoreNode = -1;
+    maxKey = 0;
+    medianKey = 0;
+    pointIndex = 0;
+}
+
+
+template<typename T_Point>
+PrioritySearchTree<T_Point>::PrioritySearchTree() {treePtr = NULL;}
+
+template<typename T_Point>
+int PrioritySearchTree<T_Point>::
+GetMedianIndex(int start, int end) {
+    return (end + start) / 2;
+}
+
+template<typename T_Point>
+inline 
+KeyType PrioritySearchTree<T_Point>::
+CreateTree(std::vector<T_Point> &points, 
+    int start, int end, unsigned int &iterativeIndex) {
+    assert(iterativeIndex < (*treePtr).size());
+
+    //
+    // Look to see if this vertex is the parent of a leaf 
+    // -- when there are only two points below.
+    //
+    int medianIndex    = GetMedianIndex(start, end);
+    int curVertexIndex = iterativeIndex;
+    (*treePtr)[curVertexIndex].medianKey = points[medianIndex].GetKey();
+
+    if (end == start) {
+        // No children for this node, done.
+        (*treePtr)[curVertexIndex].pointIndex = start;
+        return (*treePtr)[curVertexIndex].medianKey;
+    }
+
+    // 
+    // Check to see if the current
+    // node is a leaf node.  No recursion on this node.
+    //
+    if (end - start == 1) {
+        (*treePtr)[curVertexIndex].isALeaf    = 1;
+        (*treePtr)[curVertexIndex].medianKey  = points[start].GetKey();
+        (*treePtr)[curVertexIndex].pointIndex = start;
+        //
+        // Return the key of this vertex.  The parent
+        // will know what to do with it.  If this is
+        // a left child, the parent will use the key to
+        // distinguish what is on the left side of the branches.
+        // If it is the right side of a (*treePtr), it is ignored.
+        //
+        return (*treePtr)[curVertexIndex].medianKey;
+    }
+    else {
+        //
+        // This vertex contains at least two children, so it is not 
+        // a leaf.  Recurse assigning leaves.
+        //
+        (*treePtr)[curVertexIndex].isALeaf = 0;
+        (*treePtr)[curVertexIndex].leftChildIndex = ++iterativeIndex;
+        KeyType leftTreeKey, rightTreeKey;
+        leftTreeKey  = CreateTree(points, start, medianIndex, iterativeIndex);
+
+        //
+        // The leftTreeKey separates the branches BELOW this vertex.
+        //
+        (*treePtr)[curVertexIndex].medianKey = leftTreeKey;
+
+        (*treePtr)[curVertexIndex].rightChildIndex = ++iterativeIndex;
+        rightTreeKey = CreateTree(points, medianIndex, end, iterativeIndex);
+        //
+        // The rightTreeKey will separate the parent's left tree from the right.
+        //
+        (*treePtr)[curVertexIndex].maxKey = rightTreeKey;
+        return rightTreeKey;
+    }
+}
+	
+template<typename T_Point>
+int PrioritySearchTree<T_Point>::
+FindIndexOfMaxPoint(int curVertexIndex, std::vector<T_Point> &points, 
+    KeyType maxKey, int &maxPointValue, 
+    int &maxPointIndex) {
+    //
+    // Attempt to find the leaf vertex beneath this vertex that has 
+    // the largest score, with a key less than max key.
+    //
+    // On return: 
+    //   Return 1 if a value is assigned to maxPointValue, 0 otherwise.
+    //   If a value is assigned to maxPointValue, this sets:
+    //      maxPointValue is the score of the maximum point.
+    //      maxPointIndex the index of the point in 'points' that has
+    //      the maximum score.
+    //   
+
+    //
+    // The vertex at curVertexIndex has a max score node beneath it, 
+    // if it has been initialized.  If the maxScoreNode has a key less 
+    // than the current maxKey, then we know the maximum value is 
+    // contained beneath this vertex, AND that its key is within the 
+    // range in the rage maximum query.
+    // That means that there is no need to continue the search below here.
+    //
+    if ((*treePtr)[curVertexIndex].maxScoreNode == -1) {
+        return 0;
+    }
+    T_Point thisPoint = points[(*treePtr)[curVertexIndex].maxScoreNode];
+    if (thisPoint.GetKey() < maxKey) {
+        if (thisPoint.GetScore() >= maxPointValue) {
+            maxPointValue = thisPoint.GetScore();
+            maxPointIndex = (*treePtr)[curVertexIndex].maxScoreNode;
+            return 1;
+        }
+        else {
+            return 0;
+        }
+    }
+    //
+    // Otherwise, the maximum scoring node beneath this node has a 
+    // key greater than the max key. That means that the search must
+    // continue for the maximum value node with a key less than 'maxKey'.
+    //
+    // The search has two cases:
+    // First, if the median key of this node is greater than the maxKey, 
+    // all keys on the right side of the tree are greater than maxKey,
+    // so do not search there.
+    //
+    // If the median key of this node si less than maxKey, there may 
+    // be a node on the left or right child of the current node with 
+    // a maximum key.  Search both to the left and right.
+    //
+    else {
+        if (!(*treePtr)[curVertexIndex].isALeaf) {
+            if (maxKey <= (*treePtr)[curVertexIndex].medianKey) {
+                return FindIndexOfMaxPoint(
+                        (*treePtr)[curVertexIndex].leftChildIndex,
+                        points, maxKey, maxPointValue, maxPointIndex);
+            }
+            else {
+                int foundValueLeft, foundValueRight;
+                foundValueLeft = FindIndexOfMaxPoint(
+                        (*treePtr)[curVertexIndex].leftChildIndex, 
+                        points, maxKey, maxPointValue, maxPointIndex);
+
+                foundValueRight = FindIndexOfMaxPoint(
+                        (*treePtr)[curVertexIndex].rightChildIndex, 
+                        points, maxKey, maxPointValue, maxPointIndex);
+                return (foundValueLeft or foundValueRight);
+            }
+        }
+        else {
+            // 
+            // The current node is a leaf node, but due to the condition
+            // from before, its key is greater than or equal to the max key, 
+            // therefore its score cannot be used for the maximum score.
+            // Returning 0 here signifies that this search-branch did not 
+            // turn up any candidates for
+            // the maximum scoring node.
+            return 0;
+        }
+    }
+}
+	
+
+template<typename T_Point>
+void PrioritySearchTree<T_Point>::
+CreateTree(std::vector<T_Point> &points, 
+    std::vector< PSTVertex<T_Point> >* bufTreePtr) {
+    //
+    // Precondition: points is sorted according to key.
+    //
+    // 
+    // The tree is a binary tree containing all the points.  The 
+    // perfectly balanced tree is of maximum size points.size()-1,
+    // so go ahead and preallocate that now.
+    //
+    if (bufTreePtr != NULL) {
+        treePtr = bufTreePtr;
+    }
+    else {
+        treePtr = &tree;
+    }
+    treePtr->resize((points.size() * 2) - 1);
+    unsigned int curVertexIndex = 0;
+    CreateTree(points, 0, points.size(), curVertexIndex);
+}
+
+
+//
+// Implement the tree as an array of interior nodes.
+// Since there is already space allocated for the 
+//
+template<typename T_Point>
+int PrioritySearchTree<T_Point>::
+FindPoint(KeyType pointKey, 
+    int curVertexIndex, int &pointVertexIndex) {
+
+    if ((*treePtr)[curVertexIndex].isALeaf) {
+        pointVertexIndex = curVertexIndex;
+        return (*treePtr)[curVertexIndex].medianKey == pointKey;
+    }
+    else {
+        if (pointKey <= (*treePtr)[curVertexIndex].medianKey) {
+            return FindPoint(pointKey, 
+                    (*treePtr)[curVertexIndex].leftChildIndex, 
+                    pointVertexIndex);
+        }
+        else {
+            return FindPoint(pointKey, 
+                    (*treePtr)[curVertexIndex].rightChildIndex, 
+                    pointVertexIndex);
+        }
+    }
+}
+
+
+template<typename T_Point>
+void PrioritySearchTree<T_Point>::
+Activate(std::vector<T_Point> &points, int pointIndex) {
+
+    int pointScore = points[pointIndex].GetScore();
+    // Now, update the pMax scores in the (*treePtr).
+
+    int curVertexIndex = 0;
+    KeyType pointKey = points[pointIndex].GetKey();
+    unsigned int itIndex = 0;
+    while (pointIndex != -1 and
+           (*treePtr)[curVertexIndex].isALeaf == 0) {
+        assert(itIndex < (*treePtr).size());
+        int nodeIndex = (*treePtr)[curVertexIndex].maxScoreNode;
+        if (nodeIndex == -1 or 
+            points[nodeIndex].GetScore() < pointScore) {
+            (*treePtr)[curVertexIndex].maxScoreNode = pointIndex;
+            pointIndex = nodeIndex; 
+        }
+
+        if (pointKey <= (*treePtr)[curVertexIndex].medianKey) {
+            curVertexIndex = (*treePtr)[curVertexIndex].leftChildIndex;
+        }
+        else {
+            curVertexIndex = (*treePtr)[curVertexIndex].rightChildIndex;
+        }
+
+        // Keep track of the number of times this loop is executed... an 
+        // infinite loop will bomb.
+        ++itIndex;
+    }
+}
+
+template<typename T_Point>
+int PrioritySearchTree<T_Point>::
+FindIndexOfMaxPoint(std::vector<T_Point> &points, 
+    KeyType maxPointKey, int &maxPointIndex) {
+
+    // start at the root
+    int curVertexIndex = 0;
+    if ((*treePtr)[curVertexIndex].maxScoreNode == -1) {
+        //
+        // This case can only be hit if none of the points have been
+        // activated. 
+        //
+        return 0;
+    }
+    int maxPointValue = 0;
+    return FindIndexOfMaxPoint(0, points, maxPointKey, 
+            maxPointValue, maxPointIndex);
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/ScoreAnchors.hpp b/libcpp/alignment/algorithms/anchoring/ScoreAnchors.hpp
new file mode 100644
index 0000000..5d11504
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/ScoreAnchors.hpp
@@ -0,0 +1,46 @@
+#ifndef _BLASR_SCORE_ANCHORS_HPP_
+#define _BLASR_SCORE_ANCHORS_HPP_
+
+#include <math.h>
+#include "tuples/TupleCountTable.hpp"
+#include "tuples/DNATuple.hpp"
+#include "tuples/TupleMetrics.hpp"
+#include "statistics/cdfs.hpp"
+#include "statistics/pdfs.hpp"
+
+template<typename TSequence, typename T_Tuple>
+int GetTupleCount(TSequence &seq, DNALength startPos, 
+    TupleMetrics &tm, TupleCountTable<TSequence, T_Tuple> &ct, 
+    int &count);
+
+template<typename TSequence, typename T_Tuple>
+int PMatch(TSequence &seq, DNALength startPos, DNALength length,
+    TupleMetrics &tm, TupleCountTable<TSequence, T_Tuple> &ct,
+	float &pMatch); 
+
+template<typename TSequence, typename T_Tuple>
+int POneOrMoreMatches(TSequence &seq, DNALength startPos, 
+    DNALength length, TupleMetrics &tm, 
+	TupleCountTable<TSequence, T_Tuple> &ct,
+    float &pValue); 
+
+template<typename TSequence, typename T_Tuple>
+int SumRightShiftMarginalTupleCounts(TupleMetrics &tm, 
+    TupleCountTable<TSequence, T_Tuple> &ct, T_Tuple curTuple,
+    int nextNuc, int &nextSeqCount);
+
+template<typename TSequence, typename T_Tuple>
+int ComputeTotalTupleCount(TupleMetrics &tm,
+    TupleCountTable<TSequence, T_Tuple> &ct, TSequence &seq,
+    int start=0, int end=-1);
+
+template<typename TSequence, typename T_Tuple>
+int ComputeAverageTupleCount(TupleMetrics &tm, 
+    TupleCountTable<TSequence, T_Tuple> &ct, TSequence &seq);
+
+inline
+int ComputeExpectedFirstWaitingTime(float lambda);
+
+#include "ScoreAnchorsImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/algorithms/anchoring/ScoreAnchorsImpl.hpp b/libcpp/alignment/algorithms/anchoring/ScoreAnchorsImpl.hpp
new file mode 100644
index 0000000..2debcbf
--- /dev/null
+++ b/libcpp/alignment/algorithms/anchoring/ScoreAnchorsImpl.hpp
@@ -0,0 +1,179 @@
+#ifndef _BLASR_SCORE_ANCHOR_IMPL_HPP_
+#define _BLASR_SCORE_ANCHOR_IMPL_HPP_
+
+template<typename TSequence, typename T_Tuple>
+int GetTupleCount(TSequence &seq, DNALength startPos, 
+    TupleMetrics &tm, TupleCountTable<TSequence, T_Tuple> &ct, 
+    int &count) {
+
+	T_Tuple tuple;
+	if (tuple.FromStringLR(&seq.seq[startPos], tm)) {
+		count = ct.countTable[tuple.ToLongIndex()];
+		return 1;
+	}
+	else {
+		return 0;
+	}
+}
+
+
+template<typename TSequence, typename T_Tuple>
+int PMatch(TSequence &seq, DNALength startPos, DNALength length,
+    TupleMetrics &tm, TupleCountTable<TSequence, T_Tuple> &ct,
+    float &pMatch){ 
+	int tupleCount;
+	T_Tuple tuple, curTuple;
+	//
+	// Compute the probability of a match of length 'length' 
+    // in the genome using a k-th order	Markov model of the genome.
+    // Other than that there is no spatial constraint on a match. 
+    // This means that if the length of seq is k, and that sequence 
+    // of length k exists in the genome, then the probability of a
+    // match is 1. 
+	pMatch = 1;
+	if (GetTupleCount(seq, startPos, tm, ct, tupleCount)) {
+		if (tupleCount == 0) return 0;
+		int i;
+		//
+		// Compute the frequency of the following tuple, and compare this
+		// to the frequencies of all 4 possible tuples that are next.
+		//		
+		curTuple.FromStringLR(&seq.seq[startPos], tm);
+        if (length < tm.tupleSize)  {
+            // the match is shorter than the tuples used to model the
+            // genome sequence composition.  Don't try and compute a p-value 
+            // for it -- assume that you will always find a match of this 
+            // length.
+            //
+            pMatch = 0;
+            return 1;
+        }
+		for (i = 1; i < length - tm.tupleSize; i++) {
+			// 
+			// now add on the log counts for the transitions.
+			//
+            if (tuple.FromStringLR(&seq.seq[i+startPos], tm) == 0) {
+                return 0;
+            }
+            int nextTupleCount = 0;
+			int rightMarCount = SumRightShiftMarginalTupleCounts(tm, ct, 
+                tuple, TwoBit[seq.GetNuc(startPos+i+tm.tupleSize-1)], 
+                nextTupleCount);
+			//
+			// tuple counts are not defined for N's.
+			//
+			if (TwoBit[seq.GetNuc(startPos + i+tm.tupleSize)] > 3) {
+				return 0;
+			}
+			
+			if (nextTupleCount == 0) {
+				//
+				// There is no background distribution available for this
+                // sequence context, therefore no way to evaluate p-value.
+				// 
+				return 0;
+			}
+			pMatch += log((nextTupleCount / (1.0*rightMarCount)));
+			curTuple.tuple = tuple.tuple;
+		}
+		//
+		// Done computing the probability of an extension.  Now compute the probability 
+		// of the match.  There are nMatches of the initial seed.  We assume that each has 
+		// an equal probability of matching.
+		//
+		return 1;
+	}
+	else {
+		return 0;
+	}
+}
+
+
+template<typename TSequence, typename T_Tuple>
+int POneOrMoreMatches(TSequence &seq, DNALength startPos, 
+    DNALength length, TupleMetrics &tm, 
+	TupleCountTable<TSequence, T_Tuple> &ct,
+	float &pValue){ 
+	int nMatches;
+	float pMatch = 1;
+	//
+	// Compute the probability that the sequence matches ANY spot 
+    // in the reference for at least 'length' bases.
+	//
+	PMatch(seq, startPos, length, tm, ct, pMatch);
+	pValue = pMatch;
+	return 1;
+}
+
+
+template<typename TSequence, typename T_Tuple>
+int SumRightShiftMarginalTupleCounts(TupleMetrics &tm, 
+    TupleCountTable<TSequence, T_Tuple> &ct, T_Tuple curTuple, 
+    int nextNuc, int &nextSeqCount) {
+	int totalCount = 0;
+	int rightMarCount = 0;
+	long i;
+	T_Tuple altMask;
+	altMask.tuple = 3L;
+	altMask.tuple = ~altMask.tuple;
+	for (i = 0; i < 4; i++ ) {
+		T_Tuple alt = curTuple;
+		//		next.ShiftLeft(tm, 2);
+		alt.tuple = alt.tuple & altMask.tuple;
+		alt.tuple += i;
+		//		next.Append(i,2L);
+		long countedTuple = alt.ToLongIndex();
+		rightMarCount = ct.countTable[countedTuple];
+		totalCount += rightMarCount;
+		if (i == nextNuc) {
+			nextSeqCount = rightMarCount;
+		}
+	}
+	return totalCount;
+}
+
+
+template<typename TSequence, typename T_Tuple>
+int ComputeTotalTupleCount(TupleMetrics &tm,
+    TupleCountTable<TSequence, T_Tuple> &ct, TSequence &seq, 
+    int start, int end) {
+	if (end == -1) {
+		end = seq.length;
+	}
+	int nTuples = end - tm.tupleSize + 1;
+	if (nTuples == 0 ){
+		return 0;
+	}
+	int totalCount = 0;
+	T_Tuple tuple;
+	int i;
+	for (i = 0; i < nTuples; i++) {
+		tuple.FromStringLR(&seq.seq[i], tm);
+		totalCount += ct.countTable[tuple.ToLongIndex()];
+	}
+	return totalCount;
+}
+	
+
+template<typename TSequence, typename T_Tuple>
+int ComputeAverageTupleCount(TupleMetrics &tm, 
+    TupleCountTable<TSequence, T_Tuple> &ct, TSequence &seq) {
+	int i;
+	int nTuples = seq.length - tm.tupleSize + 1;
+	if (nTuples == 0 ){
+		return 0;
+	}
+	int totalCount = ComputeTotalTupleCount(tm, ct, seq);
+	return totalCount / nTuples;
+}
+
+
+inline
+int ComputeExpectedFirstWaitingTime(float lambda) {
+	// The first waiting time of a Poisson process is 
+	// exponentially distributed. The mean of an exponentially 
+	// distributed variable with parameter lambda is 1/lambda.
+	return (1/lambda);
+}
+
+#endif
diff --git a/libcpp/alignment/algorithms/compare/CompareStrings.hpp b/libcpp/alignment/algorithms/compare/CompareStrings.hpp
new file mode 100644
index 0000000..18170c7
--- /dev/null
+++ b/libcpp/alignment/algorithms/compare/CompareStrings.hpp
@@ -0,0 +1,81 @@
+#ifndef _BLASR_COMPARE_STRINGS_HPP_
+#define _BLASR_COMPARE_STRINGS_HPP_
+
+template<typename T>
+class DefaultCompareStrings {
+public:
+
+    static int Compare(T lhs, T rhs) {
+        return ThreeBit[lhs] - ThreeBit[rhs];
+    }
+
+    static int Compare(T *lhs, T *rhs, int length) {
+        int i;
+        int res;
+        i = 0;
+        T *lhsptr;
+        T *rhsptr;
+        lhsptr = lhs;
+        rhsptr = rhs;
+        char *lhsend = lhs + length;
+        res = 0;
+        while (lhsptr != lhsend and res == 0) {
+            res = ThreeBit[*lhsptr] - ThreeBit[*rhsptr];
+            ++lhsptr;
+            ++rhsptr;
+        }
+        return res;
+    }
+
+    static int Equal(T a, T b) {
+        //
+        // Compare single characters.
+        //
+        return a == b;
+    }
+    static int LessThan(T *a, int aLen, T *b, int bLen) {
+        int minabLen = MIN(aLen, bLen);
+        if (minabLen <= 0)
+            return 0;
+
+        int cmpRes = memcmp((void*) a, (void*) b, minabLen);
+        if (cmpRes < 0) {
+            return 1;
+        }
+        else {
+            return 0;
+        }
+    }
+
+    static int LessThanEqual(T *a, int aLen, T *b, int bLen) {
+        int minabLen = MIN(aLen, bLen);
+        if (minabLen <= 0)
+            return 1;
+        int cmpRes = memcmp((void*) a, (void*)b, minabLen);
+        if (cmpRes <= 0) {
+            return 1;
+        }
+        else {
+            return 0;
+        }
+    }
+
+    static int Equal(T* a, int aLen, T *b, int bLen) {
+        int minabLen = MIN(aLen, bLen);
+        if (minabLen < 0)
+            return 0;
+        if (minabLen == 0)
+            return 1;
+
+        int cmpRes = memcmp((void*) a, (void*)b, minabLen);
+        if (cmpRes == 0 and aLen <= bLen) {
+            return 1;
+        }
+        else {
+            return 0;
+        }
+    }
+};
+
+
+#endif // _BLASR_COMPARE_STRINGS_HPP_
diff --git a/libcpp/alignment/algorithms/sorting/DifferenceCovers.cpp b/libcpp/alignment/algorithms/sorting/DifferenceCovers.cpp
new file mode 100644
index 0000000..09a4be7
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/DifferenceCovers.cpp
@@ -0,0 +1,15 @@
+#include <cstring>
+#include "DifferenceCovers.hpp"
+
+int InitializeDifferenceCover(int diffCoverSize, UInt &diffCoverLength, UInt *&diffCover) {
+	UInt index;
+	for (index = 0; index < N_COVERS; index++) {
+		if (diffCovers[index][0] == diffCoverSize) {
+			diffCoverLength = diffCovers[index][1];
+			diffCover = new UInt[diffCoverLength];
+			memcpy(diffCover, &diffCovers[index][2], sizeof(UInt)*diffCoverLength);
+			return 1;
+		}
+	}
+	return 0;
+}
diff --git a/libcpp/alignment/algorithms/sorting/DifferenceCovers.hpp b/libcpp/alignment/algorithms/sorting/DifferenceCovers.hpp
new file mode 100644
index 0000000..3ed502a
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/DifferenceCovers.hpp
@@ -0,0 +1,16 @@
+#ifndef _BLASR_DIFFERENCE_COVERS_HPP_
+#define _BLASR_DIFFERENCE_COVERS_HPP_
+
+#include "Types.h"
+
+#define N_COVERS 5
+const UInt diffCovers[N_COVERS][60] = {
+	{7,  3,  1, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+	{32, 7,  1, 2, 3, 4, 8,12,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+	{64, 9,  1, 2, 3, 6,15,17,35,43,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+	{111,12, 1, 2, 3, 6,13,28,37,39,45,53,66,94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+	{2281, 58, 0, 1,2,3,4,5,6,7,8,9,19,38,57,76,95,114,133,152,171,190,229,268,307,346,385,424,463,502,541,580,619,658,697,736,775,814,853,892,931,951,971,991,1011,1031,1051,1071,1091,1111,1131,1132,1133,1134,1135,1136,1137,1138,1139, 1140}};
+
+int InitializeDifferenceCover(int diffCoverSize, UInt &diffCoverLength, UInt *&diffCover); 
+
+#endif // _BLASR_DIFFERENCE_COVERS_HPP_
diff --git a/libcpp/alignment/algorithms/sorting/Karkkainen.hpp b/libcpp/alignment/algorithms/sorting/Karkkainen.hpp
new file mode 100644
index 0000000..a02f70a
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/Karkkainen.hpp
@@ -0,0 +1,134 @@
+#ifndef ALGORITHMS_SORTING_KARKKAINEN_HPP_
+#define ALGORITHMS_SORTING_KARKKAINEN_HPP_
+
+#include "DNASequence.hpp"
+
+inline bool 
+leq(DNALength a1, DNALength a2,   DNALength b1, DNALength b2) // lexicographic order
+{
+    return(a1 < b1 || a1 == b1 && a2 <= b2); 
+} // for pairs
+
+inline bool 
+leq(DNALength a1, DNALength a2, DNALength a3,   DNALength b1, DNALength b2, DNALength b3)
+{
+    return(a1 < b1 || a1 == b1 && leq(a2, a3, b2, b3)); 
+} // and triples
+
+// stably sort a[0..n-1] to b[0..n-1] with keys in 0..K from r
+template<typename T_R>
+void radixPass(DNALength* a, DNALength* b, T_R* r, DNALength n, DNALength K)
+{ // count occurrences
+    DNALength* c = new DNALength[K + 1]; // counter array
+    for (DNALength i = 0; i <= K; i++) 
+        c[i] = 0; // reset counters
+
+    for (DNALength i = 0; i < n; i++) 
+        c[r[a[i]]]++; // count occurrences
+
+    for (DNALength i = 0, sum = 0; i <= K; i++) { // exclusive prefix sums
+        DNALength t = c[i]; c[i] = sum; sum += t; 
+    }
+
+    for (DNALength i = 0; i < n; i++) 
+        b[c[r[a[i]]]++] = a[i]; // sort
+
+    delete [] c;
+}
+
+// find the suffix array SA of T[0..n-1] in {1..K}^n
+// require T[n]=T[n+1]=T[n+2]=0, n>=2
+template<typename T_T>
+void KarkkainenBuildSuffixArray(T_T* T, DNALength* SA, DNALength n, int K) 
+{
+    DNALength n0=(n+2)/3, n1=(n+1)/3, n2=n/3, n02=n0+n2;
+    DNALength* R = new DNALength[n02 + 3]; 
+    R[n02] = R[n02+1] = R[n02+2]=0;
+
+    DNALength* SA12 = new DNALength[n02 + 3]; 
+    SA12[n02]=SA12[n02+1]=SA12[n02+2]=0;
+    
+    DNALength* R0   = new DNALength[n0];
+    DNALength* SA0 = new DNALength[n0];
+    
+    //******* Step 0: Construct sample ********
+    // generate positions of mod 1 and mod 2 suffixes
+    // the "+(n0-n1)" adds a dummy mod 1 suffix if n%3 == 1
+    for(DNALength i=0; i < n02+3; i++) {
+        R[i] = 0;
+    }
+
+    for (DNALength i=0, j=0; i < n+(n0-n1); i++) 
+        if (i%3 != 0) 
+            R[j++] = i;
+
+    //******* Step 1: Sort sample suffixes ********
+    // lsb radix sort the mod 1 and mod 2 triples
+    radixPass(R ,   SA12, T+2, n02, K);
+    radixPass(SA12, R,    T+1, n02, K);
+    radixPass(R ,   SA12, T  , n02, K);
+
+    // find lexicographic names of triples and
+    // write them to correct places in R
+    int name = 0, c0 = -1, c1 = -1, c2 = -1;
+    for (DNALength i = 0; i < n02; i++) {
+        if (T[SA12[i]] != c0 || T[SA12[i]+1] != c1 || T[SA12[i]+2] != c2) {
+            name++; c0 = T[SA12[i]]; c1 = T[SA12[i]+1]; c2 = T[SA12[i]+2];
+        }
+        if (SA12[i] % 3 == 1) {
+            R[SA12[i]/3] = name; 
+        } // write to R1
+        else {
+            R[SA12[i]/3 + n0] = name; 
+        } // write to R2
+    }
+
+    // recurse if names are not yet unique
+    if (name < n02) {
+        KarkkainenBuildSuffixArray<DNALength>(R, SA12, n02, name);
+
+        // store unique names in R using the suffix array
+        for (DNALength i = 0; i < n02; i++) 
+            R[SA12[i]] = i + 1;
+    } else {// generate the suffix array of R directly
+        for (DNALength i = 0; i < n02; i++)
+            SA12[R[i] - 1] = i;
+    }
+
+    //******* Step 2: Sort nonsample suffixes ********
+    // stably sort the mod 0 suffixes from SA12 by their first character
+    for (DNALength i=0, j=0; i < n02; i++)
+        if (SA12[i] < n0)
+            R0[j++] = 3*SA12[i];
+    
+    radixPass(R0, SA0, T, n0, K);
+
+    //******* Step 3: Merge ********
+    // merge sorted SA0 suffixes and sorted SA12 suffixes
+    for (DNALength p=0, t=n0-n1, k=0; k < n; k++) {
+
+#define GetI() (SA12[t] < n0 ? SA12[t] * 3 + 1 : (SA12[t] - n0) * 3 + 2)
+
+        DNALength i = GetI(); // pos of current offset 12 suffix
+        DNALength j = SA0[p]; // pos of current offset 0 suffix
+        if (SA12[t] < n0 ? // different compares for mod 1 and mod 2 suffixes
+            leq(T[i],       R[SA12[t] + n0], T[j],        R[j/3]) :
+            leq(T[i],T[i+1],R[SA12[t]-n0+1], T[j],T[j+1],R[j/3+n0])) 
+        { // suffix from SA12 is smaller
+            SA[k] = i; t++;
+            if (t == n02) // done --- only SA0 suffixes left
+                for (k++; p < n0; p++, k++)
+                    SA[k] = SA0[p];
+        } else { // suffix from SA0 is smaller
+            SA[k] = j; p++;
+            if (p == n0) // done --- only SA12 suffixes left
+                for (k++; t < n02; t++, k++) 
+                    SA[k] = GetI();
+        }
+    }
+    delete [] R; 
+    delete [] SA12; 
+    delete [] SA0; 
+    delete [] R0;
+}
+#endif
diff --git a/libcpp/alignment/algorithms/sorting/LightweightSuffixArray.cpp b/libcpp/alignment/algorithms/sorting/LightweightSuffixArray.cpp
new file mode 100644
index 0000000..eb0e607
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/LightweightSuffixArray.cpp
@@ -0,0 +1,405 @@
+#include "LightweightSuffixArray.hpp"
+
+UInt DiffMod(UInt a, UInt b, UInt d) {
+    if (b > a) {
+        return (d - ((b - a) % d))%d;
+    }
+    else {
+        return (a - b) % d;
+    }
+}
+
+void BuildDiffCoverReverseLookup(UInt diffCover[], UInt diffCoverLength,
+        UInt reverseDiffCover[] // of size diffCoverSize
+        ){
+    UInt i;
+    for (i = 0; i < diffCoverLength; i++ ){
+        reverseDiffCover[diffCover[i]] = i;
+    }
+}
+
+UInt DiffCoverFindH(UInt diffCover[], UInt diffCoverLength, UInt diffCoverSize, UInt textSize) {
+    UInt h;
+    for (h = 0; h < diffCoverSize; h++) {
+        UInt rem = textSize % diffCoverSize ;
+        if (rem == 0) return 0;
+        if ((h < diffCoverSize -1 and (diffCover[h] <= rem and rem < diffCover[h+1])) or
+                (h == diffCoverSize-1 and (diffCover[h] <= rem and rem < diffCoverSize))) {
+            return h;
+        }
+    }
+    return h;
+}
+
+
+UInt DiffCoverMu::compute(UInt i, UInt j) {
+    return textSize/diffCoverSize * i + std::min(i,h+1) + j;
+}
+UInt DiffCoverMu::operator()(const UInt k) {
+    //
+    // k is from 0 .. n (size of string)
+    //
+    UInt di = k % diffCoverSize;
+    UInt j  = k / diffCoverSize;
+    UInt i  = diffCoverReverseLookup[di];
+    //		return (textSize/diffCoverSize)*i + min(i,h) + j;
+    //		return (textSize/diffCoverSize)*i + i + j;
+    UInt itemsInBucket; 
+    //		return min(i,h)*(1 + textSize / diffCoverSize) + (i > h ? i - h : 0)*(textSize/diffCoverSize) + j;
+    return (textSize/diffCoverSize) * i + std::min(i,h+1) + j;
+}
+
+DiffCoverMu::DiffCoverMu() {
+    diffCoverLength = diffCoverSize = textSize = h = 0;
+    diffCoverReverseLookup = diffCover = NULL;
+}
+
+DiffCoverMu::~DiffCoverMu() {
+    if (diffCoverReverseLookup !=NULL) 
+        delete[] diffCoverReverseLookup;
+}
+
+void DiffCoverMu::Initialize(UInt diffCoverP[], UInt diffCoverLengthP, UInt diffCoverSizeP, UInt textSizeP) {
+    diffCoverReverseLookup = new UInt[diffCoverSizeP];
+    diffCoverLength = diffCoverLengthP;
+    textSize        = textSizeP;
+    diffCoverSize   = diffCoverSizeP;
+    diffCover       = diffCoverP;
+    UInt i;
+    for (i = 0; i < diffCoverSize; i++ ) {
+        diffCoverReverseLookup[i] = 9999999;
+    }
+    BuildDiffCoverReverseLookup(diffCoverP, diffCoverLength, diffCoverReverseLookup);
+    h               = DiffCoverFindH(diffCoverP, diffCoverLength, diffCoverSize, textSize);
+}
+
+void BuildDiffCoverLookup(UInt diffCover[], UInt diffCoverLength, UInt v, UInt diffCoverLookup[]) {
+    UInt h;
+    // Initialize with sentinal that shows a value has not been set (for small problems);
+    for (h = 0; h < v; h++) {
+        diffCoverLookup[h] = 99999999;
+    }
+    for (h = 0; h < v; h++) {
+        //
+        // For now, fill table via exhaustive search.
+        //
+        UInt hd;
+        for (hd = 0; hd < diffCoverLength; hd++) {
+            UInt dcm = (diffCover[hd] + h ) % v;
+            UInt hdi;
+            for (hdi = 0; hdi < diffCoverLength; hdi++ ){
+                if (dcm == diffCover[hdi])
+                    break;
+            }
+            if (hdi < diffCoverLength) {
+                diffCoverLookup[h] = diffCover[hd];
+                break;
+            }
+        }
+    }
+}
+
+void DiffCoverDelta::Initialize(UInt diffCoverP[], UInt diffCoverLengthP, UInt diffCoverSizeP) {
+    diffCoverLookup = new UInt[diffCoverSizeP];
+    diffCoverSize   = diffCoverSizeP;
+    BuildDiffCoverLookup(diffCoverP, diffCoverLengthP, diffCoverSizeP, diffCoverLookup);
+}
+
+UInt DiffCoverDelta::operator()(UInt i, UInt j) {
+    return DiffMod(diffCoverLookup[DiffMod(j,i,diffCoverSize)],i,diffCoverSize);
+}
+
+DiffCoverDelta::~DiffCoverDelta() {
+    if (diffCoverLookup) {
+        delete [] diffCoverLookup; 
+        diffCoverLookup = NULL;
+    }
+}
+
+
+UInt NCompareSuffices(unsigned char text[], UInt a, UInt b, UInt n) {
+    // not sure how to make lower amortized cost of the comparison.
+    return(strncmp((const char*) &text[a], (const char*)&text[b], n));
+}
+
+UInt ComputeDSetSize(UInt diffCover, UInt diffCoverLength, UInt diffCoverSize, UInt textSize) {
+    UInt div = textSize / diffCoverSize + 1;
+    UInt rem = textSize % diffCoverSize;
+    return div*diffCoverSize + rem;
+}
+
+void ComputeSufVNaming(UInt diffCover[], UInt diffCoverLength, UInt diffCoverN, UInt textSize, UInt lexNaming[], 
+        DiffCoverMu &mu,
+        UInt sufVNaming[]) {
+    UInt nDiffCover = textSize / diffCoverN + 1;
+    UInt cover;
+    UInt d;
+    UInt diffCoverIndex;
+    UInt ln = 0;
+    for (cover = 0; cover < nDiffCover; cover++) {
+        for (d = 0; d < diffCoverLength; d++) {
+            diffCoverIndex = cover * diffCoverN + diffCover[d];
+            sufVNaming[mu(diffCoverIndex)] = lexNaming[ln];
+            ln++;
+        }
+    }
+}
+
+UInt IndexToDiffCoverIndex(UInt index, UInt diffCoverlookup[], UInt diffCoverSize, UInt diffCoverLength ){
+    UInt diff = index / diffCoverSize;
+    UInt offset = index % diffCoverSize;
+    return diff*diffCoverLength + diffCoverlookup[offset];
+}
+
+void DiffCoverComputeLOrder(UInt sufVNaming[], UInt sufVNamingLength, UInt maxVNaming, UInt textLength,
+        DiffCoverMu &mu,
+        UInt lOrder[]) {
+    //
+    // the sufvnaming now contains the 
+    UInt i, di;
+    UInt nDiffCover = textLength / mu.diffCoverSize + 1;
+    UInt dci;
+    for (i = 0; i < sufVNamingLength; i++ ) {
+        lOrder[i] = 0;
+    }
+
+    for (dci = 0; dci < nDiffCover; dci++ ) {
+        for (di = 0; di < mu.diffCoverLength; di++ ){
+            i = dci*mu.diffCoverSize + mu.diffCover[di];
+            if (i >= textLength) {
+                break;
+            }
+            UInt dsetIndex = IndexToDiffCoverIndex(i, mu.diffCoverReverseLookup, mu.diffCoverSize, mu.diffCoverLength);
+            UInt mui = mu(i);
+            lOrder[mui] = sufVNaming[dsetIndex] + 1;
+        }
+    }
+    lOrder[sufVNamingLength] = 0;
+    //
+    // The result of the sufsort function is to store the inverse suffix
+    // array in the first parameter.
+    //
+
+    LarssonSuffixSort<UInt> sufsorter;
+    sufsorter.INDEX_MAX = maxVNaming + 2;
+    sufsorter(lOrder, sufVNaming, sufVNamingLength, maxVNaming+2, 0);
+    for (i = 0; i < sufVNamingLength; i++) {
+        assert(lOrder[i] > 0);
+        lOrder[i]--;
+    }
+}
+
+
+
+/*
+ * Build the lex naming of the v-ordered suffices.  
+ *
+ * Input: textVOrder - the v-ordering of a subset of the text.
+ *        textSize   - the size of the v-order set.
+ *        diffCover  - the diff cover used, and it's length
+ *        diffCoverLength 
+ *        diffCoverSize - the size of the diff cover.
+ * Output: lexNaming: the lex-naming of the v-order suffices.  The
+ *        names are implemented as unsigned integers. 
+ * Returns: the largest value of the lex-ordering.
+ */
+UInt DiffCoverBuildLexNaming( unsigned char text[], UInt textSize,
+        UInt textVOrder[],
+        UInt dSetSize, UInt diffCover[], UInt diffCoverLength, UInt diffCoverSize, 
+        UInt diffCoverLookup[],
+        UInt lexNaming[]) {
+    UInt nCovers = textSize / diffCoverSize + 1;
+    UInt cover = 0;
+    UInt d;
+    UInt vOrder = 0;
+    UInt prevCoverIndex, coverIndex;
+    UInt lexOrder = 0;
+    UInt lexIndex = 0;
+    //
+    // Make sure there is something to do here.
+    //
+    if (dSetSize == 0) 
+        return 0;
+    UInt dcindex;
+    dcindex = IndexToDiffCoverIndex(textVOrder[0], diffCoverLookup, diffCoverSize, diffCoverLength);
+    lexNaming[dcindex] = 0;
+    for (d = 1; d < dSetSize; d++) {
+        if (NCompareSuffices(text, textVOrder[d-1], textVOrder[d], diffCoverSize) != 0) {
+            lexOrder++;
+        }
+        dcindex = IndexToDiffCoverIndex(textVOrder[d], diffCoverLookup, diffCoverSize, diffCoverLength);
+        lexNaming[dcindex]  = lexOrder;
+    }
+    return lexOrder;
+}
+
+int DiffCoverCompareSuffices::operator()(UInt a, UInt b) {
+    UInt aDCIndex, bDCIndex;
+    UInt dab = (*delta)(a,b);
+    aDCIndex = IndexToDiffCoverIndex(a + dab, diffCoverReverseLookup, diffCoverSize, diffCoverLength);
+    bDCIndex = IndexToDiffCoverIndex(b + dab, diffCoverReverseLookup, diffCoverSize, diffCoverLength);
+    return (lOrder[aDCIndex] < lOrder[bDCIndex]);
+}
+
+bool LightweightSuffixSort(unsigned char text[], UInt textLength, UInt *index, int diffCoverSize) {
+    //
+    // index is an array of length textLength that contains all
+    // suffices.
+    //
+
+    //
+    // Phase 0. Compute delta function for difference cover.
+    //
+
+    //  For now, use a very small hard wired diff cover for testing
+    UInt *diffCover;
+    UInt diffCoverLength;
+    if (InitializeDifferenceCover(diffCoverSize, diffCoverLength, diffCover) == 0) {
+        std::cout << "ERROR! There is no difference cover of size " << diffCoverSize << " that is precomputed." << std::endl;
+        exit(1);
+    }
+
+    DiffCoverDelta delta;
+
+    delta.Initialize(diffCover, diffCoverLength, diffCoverSize);
+
+    //
+    // Phase 1. Sort suffices whose starting position modulo v is in D.
+    //
+
+    // The set d is given by 
+    // Step 1.1 v-sort D-sample suffices
+    UInt dIndex = 0; // index in D-sample
+    UInt tIndex = 0; // index in text
+    UInt nDiffCover;
+    nDiffCover = textLength / diffCoverSize + 1;
+    UInt coverIndex;
+    UInt d;
+    bool done = false;
+
+    for (coverIndex = 0; coverIndex < nDiffCover and done == false; coverIndex++) {
+        for (d = 0; d < diffCoverLength and done == false; d++) {
+            tIndex = coverIndex * diffCoverSize + diffCover[d];
+            if (tIndex >= textLength) {
+                done = true;
+                break;
+            }
+            index[dIndex] = tIndex;
+            dIndex++;
+        }
+    }
+    UInt dSetSize = dIndex;
+    std::cerr << "Sorting " << diffCoverSize << "-prefixes of the genome." << std::endl;
+    MediankeyBoundedQuicksort(text, index, dIndex, 0, dSetSize, 0, diffCoverSize);
+    UInt i;
+
+    //
+    // Step 1.2 Compute l^v(i) for all i \in D_n by traversing the
+    // D-sample suffixes in lexicographic order and construct s^\prime
+    // by setting s^\prime[\mu(i)] = l^v(i)
+    //
+    UInt *lexVNaming;
+    lexVNaming = new UInt[dSetSize+1];
+    if (lexVNaming == NULL) {
+        std::cout << "Could not initialize welterweight order structure." << std::endl;
+        exit(1);
+    }
+    DiffCoverMu mu;
+    mu.Initialize(diffCover, diffCoverLength, diffCoverSize, textLength);
+    UInt largestLexName;
+    std::cerr << "Enumerating " << diffCoverSize << "-prefixes." << std::endl;
+    largestLexName = DiffCoverBuildLexNaming(text, textLength,
+            index, dSetSize, diffCover, diffCoverLength, diffCoverSize, 
+            mu.diffCoverReverseLookup, lexVNaming);
+    //
+    // Step 1.3 Compute ISA' of lex-order.
+    //
+
+    UInt *lexOrder;
+    //
+    // lexVNaming is allocated space.  The suffix sorting needs an
+    // auxiliary array.  Since the index is not being used right now,
+    // use that as the extra space.
+    //
+    UInt t;
+    UInt dci,di;	
+    for (dci = 0; dci < nDiffCover; dci++) {
+        for (di = 0 ; di < diffCoverLength; di++) {
+            i = dci*diffCoverSize + diffCover[di];
+            if (i > textLength) {
+                break;
+            }
+            mu.compute(di, dci);
+        }
+    }
+
+    UInt *tmpLexOrder = index; 
+    DiffCoverComputeLOrder(lexVNaming, dSetSize, largestLexName, textLength, mu, tmpLexOrder); 	
+    lexOrder = lexVNaming;
+
+    nDiffCover = textLength / diffCoverSize + 1;
+
+    for (dci = 0; dci < nDiffCover; dci++) {
+        for (di = 0 ; di < diffCoverLength; di++) {
+            i = dci*diffCoverSize + diffCover[di];
+            if (i >= textLength) {
+                break;
+            }
+            UInt lexOrderIndex = mu(i);
+            UInt diffCoverIndex = IndexToDiffCoverIndex(i, mu.diffCoverReverseLookup, diffCoverSize, diffCoverLength);
+            lexOrder[diffCoverIndex] = tmpLexOrder[lexOrderIndex];
+        }
+    }
+
+    //
+    // Phase 2. Construct SA by exploiting the fact that for any i,j\in
+    // [0,n-v], the relative order of the suffixes starting at
+    // i+\delta(,j) and j+\delta(i,j) is already known.
+    //
+    std::cerr << "Sorting suffices." << std::endl;
+    // Step 2.1 v-order suffices using multikey quicksort
+    for (i = 0; i < textLength; i++ ){
+        index[i] = i;
+    }
+    MediankeyBoundedQuicksort(text, index, textLength, 0, textLength, 0, diffCoverSize);
+
+    // Step 2.2. For each group of suffixes that remains unsorted
+    // (shares a prefix of length diffCoverSize, complete the sorting
+    // with a comparison based on the sorting algorithm using
+    // l(i+\delta(i,j)) nad l(j+\delta(i,j)) as keys when comparing
+    // suffixes S_i and S_j.
+    //
+    DiffCoverCompareSuffices lOrderComparator;
+    lOrderComparator.lOrder = lexOrder;
+    lOrderComparator.delta  = δ
+    lOrderComparator.diffCoverSize = diffCoverSize;
+    lOrderComparator.diffCoverLength=diffCoverLength;
+    lOrderComparator.diffCoverReverseLookup = mu.diffCoverReverseLookup;
+    UInt setBegin, setEnd;
+    setBegin = setEnd = 0;
+    std::cerr << "Sorting buckets." << std::endl;
+    int percentDone = 0;
+    int curPercentage = 0;
+    while(setBegin < textLength) {
+        setEnd = setBegin;
+        percentDone = (int)(((1.0*setBegin) / textLength) * 100);
+        if ( percentDone > curPercentage) {
+            std::cerr << " " << percentDone << "% of buckets sorted."  << std::endl;
+            curPercentage = percentDone;
+        }
+        while(setEnd < textLength and
+                NCompareSuffices(text, index[setBegin], index[setEnd], diffCoverSize) == 0) {
+            setEnd++;
+        }
+        std::sort(&index[setBegin], &index[setEnd], lOrderComparator);
+        setBegin = setEnd;
+    }
+
+    // diffCover was allocated in DifferenceCovers.cpp -> 
+    // InitializeDifferenceCover(...). Deallocate it. 
+    if (diffCover) {delete [] diffCover; diffCover = NULL;}
+    if (lexVNaming) {delete [] lexVNaming; lexVNaming = NULL;}
+    return true;
+    // DONE!!!!!
+
+}
diff --git a/libcpp/alignment/algorithms/sorting/LightweightSuffixArray.hpp b/libcpp/alignment/algorithms/sorting/LightweightSuffixArray.hpp
new file mode 100644
index 0000000..e312671
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/LightweightSuffixArray.hpp
@@ -0,0 +1,103 @@
+#ifndef ALGORITHMS_SORTING_LIGHTWEIGHT_SUFFIX_ARRAY_H_
+#define ALGORITHMS_SORTING_LIGHTWEIGHT_SUFFIX_ARRAY_H_
+
+#include <algorithm>
+#include "qsufsort.hpp"
+#include "MultikeyQuicksort.hpp"
+#include "DifferenceCovers.hpp"
+#include "Types.h"
+
+/*
+ * a - b potentially may not fit into a signed type.  Use some logic
+ * to get around that.
+ */
+
+UInt DiffMod(UInt a, UInt b, UInt d); 
+
+void BuildDiffCoverReverseLookup(UInt diffCover[], UInt diffCoverLength,
+        UInt reverseDiffCover[] // of size diffCoverSize
+        );
+
+UInt DiffCoverFindH(UInt diffCover[], UInt diffCoverLength, UInt diffCoverSize, UInt textSize); 
+
+class DiffCoverMu {
+public:
+    UInt *diffCoverReverseLookup;
+    UInt diffCoverLength;
+    UInt diffCoverSize;
+    UInt textSize;
+    UInt h;
+    UInt *diffCover;
+
+    UInt compute(UInt i, UInt j); 
+
+    UInt operator()(const UInt k); 
+
+    DiffCoverMu(); 
+
+    ~DiffCoverMu(); 
+
+    void Initialize(UInt diffCoverP[], UInt diffCoverLengthP, UInt diffCoverSizeP, UInt textSizeP); 
+
+};
+
+void BuildDiffCoverLookup(UInt diffCover[], UInt diffCoverLength, UInt v, UInt diffCoverLookup[]); 
+
+class DiffCoverDelta {
+public:
+    UInt *diffCoverLookup;
+    UInt diffCoverSize;
+
+    void Initialize(UInt diffCoverP[], UInt diffCoverLengthP, UInt diffCoverSizeP); 
+
+    UInt operator()(UInt i, UInt j); 
+
+    ~DiffCoverDelta();
+};
+
+
+
+UInt NCompareSuffices(unsigned char text[], UInt a, UInt b, UInt n); 
+
+UInt ComputeDSetSize(UInt diffCover, UInt diffCoverLength, UInt diffCoverSize, UInt textSize); 
+
+void ComputeSufVNaming(UInt diffCover[], UInt diffCoverLength, UInt diffCoverN, UInt textSize, UInt lexNaming[], 
+        DiffCoverMu &mu,
+        UInt sufVNaming[]); 
+
+UInt IndexToDiffCoverIndex(UInt index, UInt diffCoverlookup[], UInt diffCoverSize, UInt diffCoverLength );
+
+void DiffCoverComputeLOrder(UInt sufVNaming[], UInt sufVNamingLength, UInt maxVNaming, UInt textLength, DiffCoverMu &mu, UInt lOrder[]); 
+
+
+/*
+ * Build the lex naming of the v-ordered suffices.  
+ *
+ * Input: textVOrder - the v-ordering of a subset of the text.
+ *        textSize   - the size of the v-order set.
+ *        diffCover  - the diff cover used, and it's length
+ *        diffCoverLength 
+ *        diffCoverSize - the size of the diff cover.
+ * Output: lexNaming: the lex-naming of the v-order suffices.  The
+ *        names are implemented as unsigned integers. 
+ * Returns: the largest value of the lex-ordering.
+ */
+UInt DiffCoverBuildLexNaming( unsigned char text[], UInt textSize,
+        UInt textVOrder[],
+        UInt dSetSize, UInt diffCover[], UInt diffCoverLength, UInt diffCoverSize, 
+        UInt diffCoverLookup[],
+        UInt lexNaming[]); 
+
+class DiffCoverCompareSuffices {
+public:
+    UInt *lOrder;
+    DiffCoverDelta *delta;
+    UInt diffCoverSize;
+    UInt diffCoverLength;
+    UInt *diffCoverReverseLookup;
+    int operator()(UInt a, UInt b); 
+};
+
+bool LightweightSuffixSort(unsigned char text[], UInt textLength, UInt *index, int diffCoverSize); 
+
+#endif
diff --git a/libcpp/alignment/algorithms/sorting/MultikeyQuicksort.cpp b/libcpp/alignment/algorithms/sorting/MultikeyQuicksort.cpp
new file mode 100644
index 0000000..40936ee
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/MultikeyQuicksort.cpp
@@ -0,0 +1,197 @@
+#include <cassert>
+#include "MultikeyQuicksort.hpp"
+
+void UIntSwap(unsigned int &a, unsigned int &b) {
+    //
+    // There probably is an SSE for this.
+    //
+    unsigned int tmp = a;
+    a = b; b = tmp;
+}
+
+void VecSwap( UInt i, UInt j, UInt n, UInt index[]) {
+    UInt ni;
+    for (ni = 0; ni < n; ni++) {
+        UIntSwap(index[i], index[j]);
+        i++; j++;
+    }
+}
+
+unsigned char ComputeMedianValue(unsigned char text[], UInt index[], int length, 
+        UInt low, UInt high, int offset, UInt maxPossible, UInt *freq ) {
+    /*
+     * Compute the median value of positions at suffix+offset across all
+     * suffices from [low,high).
+     */
+
+    int f;
+    for (f = 0; f< maxPossible+1; f++) {
+        freq[f] = 0;
+    }
+
+    UInt pos;
+    UInt maxValue = 0;
+    int val;
+    //  return text[index[(high+low)/2]+offset];
+    // Compute frequencies of nucleotides (+N), packed into 3-bit representation.
+    for (pos = low; pos < high; pos++) {
+        //		if (index[pos] + offset < length) {
+        //			val = ThreeBit[text[index[pos] + offset]];
+        val = text[index[pos]+offset];
+        if (val > maxValue) {
+            maxValue = val;
+        }
+        freq[val]++;
+        //		}
+    }
+    UInt medianBound = (high - low)/2;
+    int i;
+    int runningTotal = 0;
+
+    for(i =1; i<= maxValue; i++ ){
+        runningTotal = freq[i] + runningTotal;
+        if (runningTotal >= medianBound) {
+            return i;
+        }
+    }
+    return maxValue;
+}
+
+UInt FindFirstOf(unsigned char text[], UInt index[], UInt length, 
+        UInt low, UInt high, int offset, Nucleotide nuc) {
+    UInt p;
+    for (p = low; p < high and text[index[p]+offset] != nuc; p++);
+    return p;
+}
+
+inline
+void SwapIndices(UInt &a, UInt &b) {
+    UInt temp = a;
+    a = b;
+    b = temp;
+}
+
+/*
+   UInt min(UInt a, UInt b) {
+   return (a < b) ? a : b;
+   }
+   */
+void TransformSequenceForSorting(unsigned char text[], UInt textLength, int bound) {
+    UInt i;
+    for (i = 0; i < textLength; i++) {
+        text[i] = ThreeBit[text[i]] + 1;
+    }
+    for (i = textLength; i < textLength+bound;i++) {
+        text[i] = 0;
+    }
+}
+
+void TransformBackSequence(Nucleotide text[], UInt textLength) {
+    UInt i;
+    for (i = 0; i < textLength; i++) {
+        text[i]--;
+        text[i] = ThreeBitToAscii[text[i]];
+    }
+}	
+
+
+/*
+ * depth: the current depth of how much is sorted.
+ * bound: how far to sort.
+ */
+void MediankeyBoundedQuicksort(unsigned char text[], UInt index[], UInt length,
+        UInt low, UInt high, int depth, int bound, UInt maxChar, UInt *freq) {
+
+    if (high - low <= 1) 
+        return;
+    if (depth > bound)
+        return;
+
+    bool deleteFreq = false;
+    if (freq == NULL) {
+        UInt ci;
+        maxChar = 0;
+        for (ci = low; ci < high; ci++) {
+            UInt c = text[index[ci]+depth];
+            if ( c > maxChar) {
+                maxChar = c;
+            }
+        }
+        freq = new UInt[maxChar+1];
+        deleteFreq = true;
+    }
+
+    Nucleotide medianChar = ComputeMedianValue(text, index, length, low, high, depth, maxChar, freq );
+    UInt medianCharPos    = FindFirstOf(text, index, length, low, high, depth, medianChar);
+    UInt medLeft, lastLeft;
+    UInt medRight, lastRight;
+
+    // 
+    // Pack the median characters into the sides of the array.
+    //
+    SwapIndices(index[low], index[medianCharPos]);
+
+    medLeft = lastLeft = low+1;
+    medRight = lastRight = high-1;
+
+    for(;;) {
+        Nucleotide nuc;
+        while(lastLeft <= lastRight and (nuc = text[index[lastLeft]+depth]) <= medianChar) {
+            if (nuc == medianChar) {
+                SwapIndices(index[medLeft], index[lastLeft]);
+                medLeft++;
+            }
+            lastLeft++;
+        }
+
+        while(lastLeft <= lastRight and (nuc = text[index[lastRight]+depth]) >= medianChar) {
+            if (nuc == medianChar) {
+                SwapIndices(index[medRight], index[lastRight]);
+                medRight--;
+            }
+            lastRight--;
+        }
+        if (lastLeft > lastRight) {
+            // done with median sort.
+            break;
+        }
+        //
+        // Otherwise, this ends with an index at the left out of order
+        // from the right
+        assert(text[index[lastLeft]+depth] > text[index[lastRight]+depth]);
+        SwapIndices(index[lastLeft], index[lastRight]);
+    }
+
+    //
+    // Now join the indices of the median charactes in the middle of the
+    // array. 
+    //
+    // move left outside to middle
+    UInt swapLeftLength = std::min(medLeft - low, lastLeft - medLeft);
+    VecSwap(low, lastLeft - swapLeftLength, swapLeftLength, index);
+    // move right outside to middle
+    UInt swapRightLength = std::min(high - medRight - 1, medRight - lastRight);
+    VecSwap(lastRight+1, high-swapRightLength, swapRightLength, index);
+
+    UInt medianStartIndex = low + lastLeft - medLeft;
+    UInt medianEndIndex   = lastRight + (high - medRight);
+
+    // Sort the suffices with keys lower than the median. 
+    // Since these may contain multiple keys that are less than the
+    // median, the same depth is used.
+    MediankeyBoundedQuicksort(text, index, length, 
+            low, 
+            medianStartIndex,
+            depth, bound, maxChar,freq);
+    if (medianEndIndex - medianStartIndex > 1) {
+        MediankeyBoundedQuicksort(text, index, length,
+                medianStartIndex, medianEndIndex, depth+1, bound, maxChar, freq);
+    }
+
+    MediankeyBoundedQuicksort(text, index, length,
+            medianEndIndex,
+            high,
+            depth, bound, maxChar, freq);
+
+    if (deleteFreq) {delete [] freq; freq = NULL;}
+}
diff --git a/libcpp/alignment/algorithms/sorting/MultikeyQuicksort.hpp b/libcpp/alignment/algorithms/sorting/MultikeyQuicksort.hpp
new file mode 100644
index 0000000..c09a10b
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/MultikeyQuicksort.hpp
@@ -0,0 +1,48 @@
+#ifndef _BLASR_MULTIKEY_QUICKSORT_HPP_
+#define _BLASR_MULTIKEY_QUICKSORT_HPP_
+
+/*
+ * This is an implementation of MultiKey Quicksort, or ssort1 from
+ * Bentley and Sedgewick, Fast Algorithms for Sorting and Searching
+ * Strings, Proc. 8th Annual ACM-SIAM Symposium on Discrete Algorithms
+ * (SODA), pages 360-369, January 1997. 
+ *
+ * The implementation here sorts lists of indices into an array of
+ * substrings rather than the substrings themselves (for use in suffix
+ * array generation).  Furthermore, it is made to be sse-alizeable to
+ * speed up sorts on modern architectures. 
+ */
+
+#include <limits.h>
+#include <vector>
+#include <algorithm>
+#include "NucConversion.hpp"
+#include "FASTASequence.hpp"
+#include "Types.h"
+
+typedef unsigned int UInt;
+
+void UIntSwap(unsigned int &a, unsigned int &b); 
+
+void VecSwap( UInt i, UInt j, UInt n, UInt index[]); 
+
+unsigned char ComputeMedianValue(unsigned char text[], UInt index[], int length, 
+        UInt low, UInt high, int offset, UInt maxPossible, UInt *freq ); 
+
+UInt FindFirstOf(unsigned char text[], UInt index[], UInt length, 
+        UInt low, UInt high, int offset, Nucleotide nuc);
+
+void SwapIndices(UInt &a, UInt &b);
+
+void TransformSequenceForSorting(unsigned char text[], UInt textLength, int bound); 
+
+void TransformBackSequence(Nucleotide text[], UInt textLength); 
+
+/*
+ * depth: the current depth of how much is sorted.
+ * bound: how far to sort.
+ */
+void MediankeyBoundedQuicksort(unsigned char text[], UInt index[], UInt length,
+        UInt low, UInt high, int depth, int bound, UInt maxChar= 0, UInt *freq=NULL); 
+
+#endif // _BLASR_MULTIKEY_QUICKSORT_HPP_
diff --git a/libcpp/alignment/algorithms/sorting/qsufsort.cpp b/libcpp/alignment/algorithms/sorting/qsufsort.cpp
new file mode 100644
index 0000000..aa23e85
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/qsufsort.cpp
@@ -0,0 +1,302 @@
+/* qsufsort.c
+   Copyright 1999, N. Jesper Larsson, all rights reserved.
+
+   This file contains an implementation of the algorithm presented in "Faster
+   Suffix Sorting" by N. Jesper Larsson (jesper at cs.lth.se) and Kunihiko
+   Sadakane (sada at is.s.u-tokyo.ac.jp).
+
+   This software may be used freely for any purpose. However, when distributed,
+   the original source must be clearly stated, and, when the source code is
+   distributed, the copyright notice must be retained and any alterations in
+   the code must be clearly marked. No warranty is given regarding the quality
+   of this software.*/
+
+#include <limits.h>
+
+static int *I,                  /* group array, ultimately suffix array.*/
+           *V,                          /* inverse array, ultimately inverse of I.*/
+           r,                           /* number of symbols aggregated by transform.*/
+           h;                           /* length of already-sorted prefixes.*/
+
+#define KEY(p)          (V[*(p)+(h)])
+#define SWAP(p, q)      (tmp=*(p), *(p)=*(q), *(q)=tmp)
+#define MED3(a, b, c)   (KEY(a)<KEY(b) ?                        \
+        (KEY(b)<KEY(c) ? (b) : KEY(a)<KEY(c) ? (c) : (a))       \
+        : (KEY(b)>KEY(c) ? (b) : KEY(a)>KEY(c) ? (c) : (a)))
+
+/* Subroutine for select_sort_split and sort_split. Sets group numbers for a
+   group whose lowest position in I is pl and highest position is pm.*/
+
+static void update_group(int *pl, int *pm)
+{
+    int g;
+
+    g=pm-I;                      /* group number.*/
+    V[*pl]=g;                    /* update group number of first position.*/
+    if (pl==pm)
+        *pl=-1;                   /* one element, sorted group.*/
+    else
+        do                        /* more than one element, unsorted group.*/
+            V[*++pl]=g;            /* update group numbers.*/
+        while (pl<pm);
+}
+
+/* Quadratic sorting method to use for small subarrays. To be able to update
+   group numbers consistently, a variant of selection sorting is used.*/
+
+static void select_sort_split(int *p, int n) {
+    int *pa, *pb, *pi, *pn;
+    int f, v, tmp;
+
+    pa=p;                        /* pa is start of group being picked out.*/
+    pn=p+n-1;                    /* pn is last position of subarray.*/
+    while (pa<pn) {
+        for (pi=pb=pa+1, f=KEY(pa); pi<=pn; ++pi)
+            if ((v=KEY(pi))<f) {
+                f=v;                /* f is smallest key found.*/
+                SWAP(pi, pa);       /* place smallest element at beginning.*/
+                pb=pa+1;            /* pb is position for elements equal to f.*/
+            } else if (v==f) {     /* if equal to smallest key.*/
+                SWAP(pi, pb);       /* place next to other smallest elements.*/
+                ++pb;
+            }
+        update_group(pa, pb-1);   /* update group values for new group.*/
+        pa=pb;                    /* continue sorting rest of the subarray.*/
+    }
+    if (pa==pn) {                /* check if last part is single element.*/
+        V[*pa]=pa-I;
+        *pa=-1;                   /* sorted group.*/
+    }
+}
+
+/* Subroutine for sort_split, algorithm by Bentley & McIlroy.*/
+
+static int choose_pivot(int *p, int n) {
+    int *pl, *pm, *pn;
+    int s;
+
+    pm=p+(n>>1);                 /* small arrays, middle element.*/
+    if (n>7) {
+        pl=p;
+        pn=p+n-1;
+        if (n>40) {               /* big arrays, pseudomedian of 9.*/
+            s=n>>3;
+            pl=MED3(pl, pl+s, pl+s+s);
+            pm=MED3(pm-s, pm, pm+s);
+            pn=MED3(pn-s-s, pn-s, pn);
+        }
+        pm=MED3(pl, pm, pn);      /* midsize arrays, median of 3.*/
+    }
+    return KEY(pm);
+}
+
+/* Sorting routine called for each unsorted group. Sorts the array of integers
+   (suffix numbers) of length n starting at p. The algorithm is a ternary-split
+   quicksort taken from Bentley & McIlroy, "Engineering a Sort Function",
+   Software -- Practice and Experience 23(11), 1249-1265 (November 1993). This
+   function is based on Program 7.*/
+
+static void sort_split(int *p, int n)
+{
+    int *pa, *pb, *pc, *pd, *pl, *pm, *pn;
+    int f, v, s, t, tmp;
+
+    if (n<7) {                   /* multi-selection sort smallest arrays.*/
+        select_sort_split(p, n);
+        return;
+    }
+
+    v=choose_pivot(p, n);
+    pa=pb=p;
+    pc=pd=p+n-1;
+    while (1) {                  /* split-end partition.*/
+        while (pb<=pc && (f=KEY(pb))<=v) {
+            if (f==v) {
+                SWAP(pa, pb);
+                ++pa;
+            }
+            ++pb;
+        }
+        while (pc>=pb && (f=KEY(pc))>=v) {
+            if (f==v) {
+                SWAP(pc, pd);
+                --pd;
+            }
+            --pc;
+        }
+        if (pb>pc)
+            break;
+        SWAP(pb, pc);
+        ++pb;
+        --pc;
+    }
+    pn=p+n;
+    if ((s=pa-p)>(t=pb-pa))
+        s=t;
+    for (pl=p, pm=pb-s; s; --s, ++pl, ++pm)
+        SWAP(pl, pm);
+    if ((s=pd-pc)>(t=pn-pd-1))
+        s=t;
+    for (pl=pb, pm=pn-s; s; --s, ++pl, ++pm)
+        SWAP(pl, pm);
+
+    s=pb-pa;
+    t=pd-pc;
+    if (s>0)
+        sort_split(p, s);
+    update_group(p+s, p+n-t-1);
+    if (t>0)
+        sort_split(p+n-t, t);
+}
+
+/* Bucketsort for first iteration.
+
+Input: x[0...n-1] holds integers in the range 1...k-1, all of which appear
+at least once. x[n] is 0. (This is the corresponding output of transform.) k
+must be at most n+1. p is array of size n+1 whose contents are disregarded.
+
+Output: x is V and p is I after the initial sorting stage of the refined
+suffix sorting algorithm.*/
+
+static void bucketsort(int *x, int *p, int n, int k)
+{
+    int *pi, i, c, d, g;
+
+    for (pi=p; pi<p+k; ++pi)
+        *pi=-1;                   /* mark linked lists empty.*/
+    for (i=0; i<=n; ++i) {
+        x[i]=p[c=x[i]];           /* insert in linked list.*/
+        p[c]=i;
+    }
+    for (pi=p+k-1, i=n; pi>=p; --pi) {
+        d=x[c=*pi];               /* c is position, d is next in list.*/
+        x[c]=g=i;                 /* last position equals group number.*/
+        if (d>=0) {               /* if more than one element in group.*/
+            p[i--]=c;              /* p is permutation for the sorted x.*/
+            do {
+                d=x[c=d];           /* next in linked list.*/
+                x[c]=g;             /* group number in x.*/
+                p[i--]=c;           /* permutation in p.*/
+            } while (d>=0);
+        } else
+            p[i--]=-1;             /* one element, sorted group.*/
+    }
+}
+
+/* Transforms the alphabet of x by attempting to aggregate several symbols into
+   one, while preserving the suffix order of x. The alphabet may also be
+   compacted, so that x on output comprises all integers of the new alphabet
+   with no skipped numbers.
+
+Input: x is an array of size n+1 whose first n elements are positive
+integers in the range l...k-1. p is array of size n+1, used for temporary
+storage. q controls aggregation and compaction by defining the maximum value
+for any symbol during transformation: q must be at least k-l; if q<=n,
+compaction is guaranteed; if k-l>n, compaction is never done; if q is
+INT_MAX, the maximum number of symbols are aggregated into one.
+
+Output: Returns an integer j in the range 1...q representing the size of the
+new alphabet. If j<=n+1, the alphabet is compacted. The global variable r is
+set to the number of old symbols grouped into one. Only x[n] is 0.*/
+
+static int transform(int *x, int *p, int n, int k, int l, int q)
+{
+    int b, c, d, e, i, j, m, s;
+    int *pi, *pj;
+
+    for (s=0, i=k-l; i; i>>=1)
+        ++s;                      /* s is number of bits in old symbol.*/
+    e=INT_MAX>>s;                /* e is for overflow checking.*/
+    for (b=d=r=0; r<n && d<=e && (c=d<<s|(k-l))<=q; ++r) {
+        b=b<<s|(x[r]-l+1);        /* b is start of x in chunk alphabet.*/
+        d=c;                      /* d is max symbol in chunk alphabet.*/
+    }
+    m=(1<<(r-1)*s)-1;            /* m masks off top old symbol from chunk.*/
+    x[n]=l-1;                    /* emulate zero terminator.*/
+    if (d<=n) {                  /* if bucketing possible, compact alphabet.*/
+        for (pi=p; pi<=p+d; ++pi)
+            *pi=0;                 /* zero transformation table.*/
+        for (pi=x+r, c=b; pi<=x+n; ++pi) {
+            p[c]=1;                /* mark used chunk symbol.*/
+            c=(c&m)<<s|(*pi-l+1);  /* shift in next old symbol in chunk.*/
+        }
+        for (i=1; i<r; ++i) {     /* handle last r-1 positions.*/
+            p[c]=1;                /* mark used chunk symbol.*/
+            c=(c&m)<<s;            /* shift in next old symbol in chunk.*/
+        }
+        for (pi=p, j=1; pi<=p+d; ++pi)
+            if (*pi)
+                *pi=j++;            /* j is new alphabet size.*/
+        for (pi=x, pj=x+r, c=b; pj<=x+n; ++pi, ++pj) {
+            *pi=p[c];              /* transform to new alphabet.*/
+            c=(c&m)<<s|(*pj-l+1);  /* shift in next old symbol in chunk.*/
+        }
+        while (pi<x+n) {          /* handle last r-1 positions.*/
+            *pi++=p[c];            /* transform to new alphabet.*/
+            c=(c&m)<<s;            /* shift right-end zero in chunk.*/
+        }
+    } else {                     /* bucketing not possible, don't compact.*/
+        for (pi=x, pj=x+r, c=b; pj<=x+n; ++pi, ++pj) {
+            *pi=c;                 /* transform to new alphabet.*/
+            c=(c&m)<<s|(*pj-l+1);  /* shift in next old symbol in chunk.*/
+        }
+        while (pi<x+n) {          /* handle last r-1 positions.*/
+            *pi++=c;               /* transform to new alphabet.*/
+            c=(c&m)<<s;            /* shift right-end zero in chunk.*/
+        }
+        j=d+1;                    /* new alphabet size.*/
+    }
+    x[n]=0;                      /* end-of-string symbol is zero.*/
+    return j;                    /* return new alphabet size.*/
+}
+
+/* Makes suffix array p of x. x becomes inverse of p. p and x are both of size
+   n+1. Contents of x[0...n-1] are integers in the range l...k-1. Original
+   contents of x[n] is disregarded, the n-th symbol being regarded as
+   end-of-string smaller than all other symbols.*/
+
+void suffixsort(int *x, int *p, int n, int k, int l)
+{
+    int *pi, *pk;
+    int i, j, s, sl;
+
+    V=x;                         /* set global values.*/
+    I=p;
+
+    if (n>=k-l) {                /* if bucketing possible,*/
+        j=transform(V, I, n, k, l, n);
+        bucketsort(V, I, n, j);   /* bucketsort on first r positions.*/
+    } else {
+        transform(V, I, n, k, l, INT_MAX);
+        for (i=0; i<=n; ++i)
+            I[i]=i;                /* initialize I with suffix numbers.*/
+        h=0;
+        sort_split(I, n+1);       /* quicksort on first r positions.*/
+    }
+    h=r;                         /* number of symbols aggregated by transform.*/
+
+    while (*I>=-n) {
+        pi=I;                     /* pi is first position of group.*/
+        sl=0;                     /* sl is negated length of sorted groups.*/
+        do {
+            if ((s=*pi)<0) {
+                pi-=s;              /* skip over sorted group.*/
+                sl+=s;              /* add negated length to sl.*/
+            } else {
+                if (sl) {
+                    *(pi+sl)=sl;     /* combine sorted groups before pi.*/
+                    sl=0;
+                }
+                pk=I+V[s]+1;        /* pk-1 is last position of unsorted group.*/
+                sort_split(pi, pk-pi);
+                pi=pk;              /* next group.*/
+            }
+        } while (pi<=I+n);
+        if (sl)                   /* if the array ends with a sorted group.*/
+            *(pi+sl)=sl;           /* combine sorted groups at end of I.*/
+        h=2*h;                    /* double sorted-depth.*/
+    }
+
+    for (i=0; i<=n; ++i)         /* reconstruct suffix array from inverse.*/
+        I[V[i]]=i;
+}  
diff --git a/libcpp/alignment/algorithms/sorting/qsufsort.hpp b/libcpp/alignment/algorithms/sorting/qsufsort.hpp
new file mode 100644
index 0000000..5525fe4
--- /dev/null
+++ b/libcpp/alignment/algorithms/sorting/qsufsort.hpp
@@ -0,0 +1,376 @@
+#ifndef _BLASR_QSUFSORT_HPP_
+#define _BLASR_QSUFSORT_HPP_
+#include <assert.h>
+
+void suffixsort(int *x, int *p, int n, int k, int l);
+
+
+/* qsufsort.c
+   Copyright 1999, N. Jesper Larsson, all rights reserved.
+
+   This file contains an implementation of the algorithm presented in "Faster
+   Suffix Sorting" by N. Jesper Larsson (jesper at cs.lth.se) and Kunihiko
+   Sadakane (sada at is.s.u-tokyo.ac.jp).
+
+   This software may be used freely for any purpose. However, when distributed,
+   the original source must be clearly stated, and, when the source code is
+   distributed, the copyright notice must be retained and any alterations in
+   the code must be clearly marked. No warranty is given regarding the quality
+   of this software.*/
+
+#include <limits.h>
+
+#define KEY(p)          (V[*(p)+(h)])
+
+
+#define MED3(a, b, c)   (KEY(a)<KEY(b) ?                                \
+        (KEY(b)<KEY(c) ? (b) : KEY(a)<KEY(c) ? (c) : (a)) \
+        : (KEY(b)>KEY(c) ? (b) : KEY(a)>KEY(c) ? (c) : (a)))
+
+/* Subroutine for select_sort_split and sort_split. Sets group numbers for a
+   group whose lowest position in I is pl and highest position is pm.*/
+
+#include <vector>
+#include <algorithm>
+
+template<typename T_Index, long T_Index_MAX=0>
+class LarssonSuffixSort {
+private:
+    T_Index *I;
+    T_Index *V;
+    T_Index r;
+    T_Index h;
+    T_Index SWAPPtr(T_Index *p, T_Index *q) { T_Index tmp=*(p); *(p)=*(q); *(q)=tmp; return *(q);}
+    std::vector<char> boundaries;
+
+public:
+    T_Index INDEX_MAX;
+    LarssonSuffixSort() {
+        INDEX_MAX = T_Index_MAX;
+        r = h = 0;
+        I = V = NULL;
+    }
+    void operator()(T_Index *x, T_Index *p, T_Index n, T_Index k, T_Index l)  {
+        suffixsort(x,p,n,k,l);
+    }
+
+    void update_group(T_Index *pl, T_Index *pm)
+    {
+        int g;
+
+        g=pm-I;                      /* group number.*/
+        V[*pl]=g;                    /* update group number of first position.*/
+        if (pl==pm) {
+            /*MC*/
+            assert(pl -I >= 0);
+            boundaries[pl - I] = 1;
+            //      *pl=-1;                   /* one element, sorted group.*/
+        }
+        else
+            do                        /* more than one element, unsorted group.*/
+                V[*++pl]=g;            /* update group numbers.*/
+            while (pl<pm);
+    }
+
+    /* Quadratic sorting method to use for small subarrays. To be able to update
+       group numbers consistently, a variant of selection sorting is used.*/
+
+    void select_sort_split(T_Index *p, T_Index n) {
+        T_Index *pa, *pb, *pi, *pn;
+        T_Index f, v;
+
+        pa=p;                        /* pa is start of group being picked out.*/
+        pn=p+n-1;                    /* pn is last position of subarray.*/
+        while (pa<pn) {
+            for (pi=pb=pa+1, f=KEY(pa); pi<=pn; ++pi)
+                if ((v=KEY(pi))<f) {
+                    f=v;                /* f is smallest key found.*/
+                    SWAPPtr(pi, pa);       /* place smallest element at beginning.*/
+                    pb=pa+1;            /* pb is position for elements equal to f.*/
+                } else if (v==f) {     /* if equal to smallest key.*/
+                    SWAPPtr(pi, pb);       /* place next to other smallest elements.*/
+                    ++pb;
+                }
+            update_group(pa, pb-1);   /* update group values for new group.*/
+            pa=pb;                    /* continue sorting rest of the subarray.*/
+        }
+        if (pa==pn) {                /* check if last part is single element.*/
+            assert(pa - I >= 0);
+            //			assert(boundaries[pa-I] == 0 );
+            V[*pa]=pa-I;
+            /*MC*/
+            //      *pa=-1;                   /* sorted group.*/
+            boundaries[pa - I] = 1; 
+        }
+    }
+
+    /* Subroutine for sort_split, algorithm by Bentley & McIlroy.*/
+
+    T_Index choose_pivot(T_Index *p, T_Index n) {
+        T_Index *pl, *pm, *pn;
+        T_Index s;
+
+        pm=p+(n>>1);                 /* small arrays, middle element.*/
+        if (n>7) {
+            pl=p;
+            pn=p+n-1;
+            if (n>40) {               /* big arrays, pseudomedian of 9.*/
+                s=n>>3;
+                pl=MED3(pl, pl+s, pl+s+s);
+                pm=MED3(pm-s, pm, pm+s);
+                pn=MED3(pn-s-s, pn-s, pn);
+            }
+            pm=MED3(pl, pm, pn);      /* midsize arrays, median of 3.*/
+        }
+        return KEY(pm);
+    }
+
+    /* Sorting routine called for each unsorted group. Sorts the array of integers
+       (suffix numbers) of length n starting at p. The algorithm is a ternary-split
+       quicksort taken from Bentley & McIlroy, "Engineering a Sort Function",
+       Software -- Practice and Experience 23(11), 1249-1265 (November 1993). This
+       function is based on Program 7.*/
+
+    void sort_split(T_Index *p, T_Index n)
+    {
+        T_Index *pa, *pb, *pc, *pd, *pl, *pm, *pn;
+        T_Index f, v, s, t;
+
+        if (n<7) {                   /* multi-selection sort smallest arrays.*/
+            select_sort_split(p, n);
+            return;
+        }
+
+        v=choose_pivot(p, n);
+        pa=pb=p;
+        pc=pd=p+n-1;
+        while (1) {                  /* split-end partition.*/
+            while (pb<=pc && (f=KEY(pb))<=v) {
+                if (f==v) {
+                    SWAPPtr(pa, pb);
+                    ++pa;
+                }
+                ++pb;
+            }
+            while (pc>=pb && (f=KEY(pc))>=v) {
+                if (f==v) {
+                    SWAPPtr(pc, pd);
+                    --pd;
+                }
+                --pc;
+            }
+            if (pb>pc)
+                break;
+            SWAPPtr(pb, pc);
+            ++pb;
+            --pc;
+        }
+        pn=p+n;
+        if ((s=pa-p)>(t=pb-pa))
+            s=t;
+        for (pl=p, pm=pb-s; s; --s, ++pl, ++pm)
+            SWAPPtr(pl, pm);
+        if ((s=pd-pc)>(t=pn-pd-1))
+            s=t;
+        for (pl=pb, pm=pn-s; s; --s, ++pl, ++pm)
+            SWAPPtr(pl, pm);
+
+        s=pb-pa;
+        t=pd-pc;
+        if (s>0)
+            sort_split(p, s);
+        update_group(p+s, p+n-t-1);
+        if (t>0)
+            sort_split(p+n-t, t);
+    }
+
+    /* Bucketsort for first iteration.
+
+Input: x[0...n-1] holds integers in the range 1...k-1, all of which appear
+at least once. x[n] is 0. (This is the corresponding output of transform.) k
+must be at most n+1. p is array of size n+1 whose contents are disregarded.
+
+Output: x is V and p is I after the initial sorting stage of the refined
+suffix sorting algorithm.
+*/
+
+    void bucketsort(T_Index *x, T_Index *p, T_Index n, T_Index k)
+    {
+        T_Index *pi, i, c, d, g;
+
+        for (pi=p; pi<p+k; ++pi) {
+            //      *pi=-1;                   /* mark linked lists empty.*/
+            assert(pi - p >= 0);
+            assert(pi - p == pi - I);
+            //			boundaries[pi-p] = 0;
+        }
+        int *buckets = new int[k];
+        T_Index *starts  = new T_Index[k];
+        /*MC+1*/
+        for (i = 0; i < k; i++ ){
+            buckets[i] = -1;
+        }
+        /*MC-1*/
+        for (i=0; i<=n; ++i) {
+            /*MC+2*/
+            if (buckets[x[i]] == -1) {
+                starts[x[i]] = i;
+            }
+            x[i]=buckets[c=x[i]];           /* insert in linked list.*/
+            buckets[c]=i;
+            //*x[i]=pi[c=x[i]]
+            p[c] = i;
+            /*MC-2*/
+        }
+        for (pi=p+k-1, i=n; pi>=p; --pi) {
+            d=x[c=*pi];               /* c is position, d is next in list.*/
+            x[c]=g=i;                 /* last position equals group number.*/
+            //			if (d>=0) {               /* if more than one element in group.*/
+            if (c != starts[pi - p]) {
+                p[i--]=c;              /* p is permutation for the sorted x.*/
+                do {
+                    d=x[c=d];           /* next in linked list.*/
+                    x[c]=g;             /* group number in x.*/
+                    p[i--]=c;           /* permutation in p.*/
+                } 
+                while (c != starts[pi - p]);
+                //while (d>=0);
+            } else {
+                /*MC*/
+                boundaries[i--]=true;
+                //        p[i--]=-1;             /* one element, sorted group.*/
+            }
+        }
+        delete[] starts;
+        delete[] buckets;
+    }
+
+        /* Transforms the alphabet of x by attempting to aggregate several symbols into
+           one, while preserving the suffix order of x. The alphabet may also be
+           compacted, so that x on output comprises all integers of the new alphabet
+           with no skipped numbers.
+
+Input: x is an array of size n+1 whose first n elements are positive
+integers in the range l...k-1. p is array of size n+1, used for temporary
+storage. q controls aggregation and compaction by defining the maximum value
+for any symbol during transformation: q must be at least k-l; if q<=n,
+compaction is guaranteed; if k-l>n, compaction is never done; if q is
+INT_MAX, the maximum number of symbols are aggregated into one.
+
+Output: Returns an integer j in the range 1...q representing the size of the
+new alphabet. If j<=n+1, the alphabet is compacted. The global variable r is
+set to the number of old symbols grouped into one. Only x[n] is 0.*/
+
+    T_Index transform(T_Index *x, T_Index *p, T_Index n, T_Index k, T_Index l, T_Index q)
+    {
+        T_Index b, c, d, e, i, j, m, s;
+        T_Index *pi, *pj;
+
+        for (s=0, i=k-l; i; i>>=1)
+            ++s;                      /* s is number of bits in old symbol.*/
+        e=INDEX_MAX>>s;                /* e is for overflow checking.*/
+        for (b=d=r=0; r<n && d<=e && (c=d<<s|(k-l))<=q; ++r) {
+            b=b<<s|(x[r]-l+1);        /* b is start of x in chunk alphabet.*/
+            d=c;                      /* d is max symbol in chunk alphabet.*/
+        }
+        m=(1<<(r-1)*s)-1;            /* m masks off top old symbol from chunk.*/
+        x[n]=l-1;                    /* emulate zero terminator.*/
+        if (d<=n) {                  /* if bucketing possible, compact alphabet.*/
+            for (pi=p; pi<=p+d; ++pi)
+                *pi=0;                 /* zero transformation table.*/
+            for (pi=x+r, c=b; pi<=x+n; ++pi) {
+                p[c]=1;                /* mark used chunk symbol.*/
+                c=(c&m)<<s|(*pi-l+1);  /* shift in next old symbol in chunk.*/
+            }
+            for (i=1; i<r; ++i) {     /* handle last r-1 positions.*/
+                p[c]=1;                /* mark used chunk symbol.*/
+                c=(c&m)<<s;            /* shift in next old symbol in chunk.*/
+            }
+            for (pi=p, j=1; pi<=p+d; ++pi)
+                if (*pi)
+                    *pi=j++;            /* j is new alphabet size.*/
+            for (pi=x, pj=x+r, c=b; pj<=x+n; ++pi, ++pj) {
+                *pi=p[c];              /* transform to new alphabet.*/
+                c=(c&m)<<s|(*pj-l+1);  /* shift in next old symbol in chunk.*/
+            }
+            while (pi<x+n) {          /* handle last r-1 positions.*/
+                *pi++=p[c];            /* transform to new alphabet.*/
+                c=(c&m)<<s;            /* shift right-end zero in chunk.*/
+            }
+        } else {                     /* bucketing not possible, don't compact.*/
+            for (pi=x, pj=x+r, c=b; pj<=x+n; ++pi, ++pj) {
+                *pi=c;                 /* transform to new alphabet.*/
+                c=(c&m)<<s|(*pj-l+1);  /* shift in next old symbol in chunk.*/
+            }
+            while (pi<x+n) {          /* handle last r-1 positions.*/
+                *pi++=c;               /* transform to new alphabet.*/
+                c=(c&m)<<s;            /* shift right-end zero in chunk.*/
+            }
+            j=d+1;                    /* new alphabet size.*/
+        }
+        x[n]=0;                      /* end-of-string symbol is zero.*/
+        return j;                    /* return new alphabet size.*/
+    }
+
+    /* Makes suffix array p of x. x becomes inverse of p. p and x are both of size
+       n+1. Contents of x[0...n-1] are integers in the range l...k-1. Original
+       contents of x[n] is disregarded, the n-th symbol being regarded as
+       end-of-string smaller than all other symbols.*/
+
+    void suffixsort(T_Index *x, T_Index *p, T_Index n, T_Index k, T_Index l)
+    {
+        T_Index *pi, *pk;
+        T_Index i, j, s, sl;
+        boundaries.resize(n+1);
+        fill(boundaries.begin(), boundaries.end(), 0);
+
+        V=x;                         /* set global values.*/
+        I=p;
+
+        if (n>=k-l) {                /* if bucketing possible,*/
+            j=transform(V, I, n, k, l, n);
+            bucketsort(V, I, n, j);   /* bucketsort on first r positions.*/
+        } else {
+            transform(V, I, n, k, l, INDEX_MAX);
+            for (i=0; i<=n; ++i)
+                I[i]=i;                /* initialize I with suffix numbers.*/
+            h=0;
+            sort_split(I, n+1);       /* quicksort on first r positions.*/
+        }
+        h=r;                         /* number of symbols aggregated by transform.*/
+
+        while (*I<=n) {
+            pi=I;                     /* pi is first position of group.*/
+            sl=0;                     /* sl is negated length of sorted groups.*/
+            do {
+                /*MC-3*/
+                //        if ((s=*pi)<0) {
+                s = *pi;
+                if (boundaries[pi - I] == 1) {
+                    //          pi-=s;              /* skip over sorted group.*/
+                    s = 1;
+                    pi+=s;
+                    sl+=s;              /* add negated length to sl.*/
+                } else {
+                    if (sl) {
+                        //            *(pi+sl)=sl;     /* combine sorted groups before pi.*/
+                        assert(boundaries[(pi-sl) - I] == 1);
+                        assert(pi - sl >= I);
+                        *(pi-sl)=sl;     /* combine sorted groups before pi.*/
+                        sl=0;
+                    }
+                    pk=I+V[s]+1;        /* pk-1 is last position of unsorted group.*/
+                    sort_split(pi, pk-pi);
+                    pi=pk;              /* next group.*/
+                }
+            } while (pi<=I+n);
+                if (sl)                   /* if the array ends with a sorted group.*/
+                    *(pi-sl)=sl;           /* combine sorted groups at end of I.*/
+                h=2*h;                    /* double sorted-depth.*/
+            }
+
+            for (i=0; i<=n; ++i)         /* reconstruct suffix array from inverse.*/
+                I[V[i]]=i;
+        }
+    };
+#endif // _BLASR_QSUFSORT_HPP_
diff --git a/libcpp/alignment/anchoring/AnchorParameters.hpp b/libcpp/alignment/anchoring/AnchorParameters.hpp
new file mode 100644
index 0000000..ec7ac62
--- /dev/null
+++ b/libcpp/alignment/anchoring/AnchorParameters.hpp
@@ -0,0 +1,35 @@
+#ifndef _BLASR_ANCHOR_PARAMETERS_HPP_
+#define _BLASR_ANCHOR_PARAMETERS_HPP_
+
+#include <fstream>
+#include <iostream>
+#include "qvs/QualityValue.hpp"
+#include "DNASequence.hpp"
+
+class AnchorParameters {
+public:
+    QualityValue branchQualityThreshold;
+    DNALength minMatchLength;
+    int maxMatchScore;
+    int expand;
+    int contextAlignLength;
+    bool useLookupTable;
+    int numBranches;
+    int maxAnchorsPerPosition;
+    int advanceExactMatches;
+    DNALength maxLCPLength;
+    bool stopMappingOnceUnique;
+    int verbosity;
+    bool removeEncompassedMatches;
+    std::ostream *lcpBoundsOutPtr;
+    int branchExpand;
+
+    AnchorParameters(); 
+
+    AnchorParameters &Assign(const AnchorParameters &rhs); 
+
+    AnchorParameters &operator=(const AnchorParameters &rhs); 
+};
+
+
+#endif // _BLASR_ANCHOR_PARAMETERS_HPP_
diff --git a/libcpp/alignment/build.mk b/libcpp/alignment/build.mk
new file mode 120000
index 0000000..2247f36
--- /dev/null
+++ b/libcpp/alignment/build.mk
@@ -0,0 +1 @@
+makefile
\ No newline at end of file
diff --git a/libcpp/alignment/bwt/BWT.hpp b/libcpp/alignment/bwt/BWT.hpp
new file mode 100644
index 0000000..ef91a3a
--- /dev/null
+++ b/libcpp/alignment/bwt/BWT.hpp
@@ -0,0 +1,316 @@
+#ifndef _BLASR_BWT_HPP_
+#define _BLASR_BWT_HPP_
+
+#include <iostream>
+#include <fstream>
+#include "Occ.hpp"
+#include "Pos.hpp"
+#include "suffixarray/SuffixArray.hpp"
+#include "PackedDNASequence.hpp"
+#include "FASTASequence.hpp"
+
+/*
+ * Define an Occurrence table appropriate for Gb sized genomes.
+ * Probably everything will end up using this.
+ */
+typedef Occ <PackedDNASequence, unsigned int, unsigned short> GbOcc;
+
+/*
+ * Define an Occurrence table appropriate for Mb sized genomes.
+ */
+typedef Occ <PackedDNASequence, unsigned int, unsigned char> MbOcc;
+
+
+class SingleStoragePolicy {
+ public:
+	DNALength *spp, *epp;
+	void Store(DNALength sp, DNALength ep) {
+		*spp = sp;
+		*epp = ep;
+	}
+};
+
+class VectorStoragePolicy {
+public:
+    std::vector<DNALength> *spvp, *epvp;
+	void Store(DNALength sp, DNALength ep) {
+		spvp->push_back(sp);
+		epvp->push_back(ep);
+	}
+};
+
+template<typename T_BWT_Sequence, typename T_DNASequence>
+class Bwt {
+ public:
+	T_BWT_Sequence bwtSequence;
+	GbOcc occ;
+	Pos<T_BWT_Sequence>   pos;
+	static const int CharCountSize = 7;
+	int useDebugData;
+    std::vector<DNALength> saCopy;
+	DNALength charCount[CharCountSize];
+	DNALength firstCharPos;
+	
+
+	void Write(std::string outName) {
+		std::ofstream bwtOut;
+		CrucialOpen(outName, bwtOut, std::ios::binary|std::ios::out);
+		Write(bwtOut);
+	}
+
+	void PrintBWTString(std::ostream &out) {
+		DNALength p;
+		for (p = 0; p < bwtSequence.length; p++) {
+			out << (char) ThreeBitToAscii[bwtSequence[p]];
+			if (p % 50 == 49) out << std::endl;
+		}
+		if(p % 50 != 0) out << std::endl;
+	}
+
+	void Write(std::ostream &bwtOut) {
+		bwtSequence.Write(bwtOut);
+		bwtOut.write((char*)charCount, sizeof(DNALength)*CharCountSize);
+		bwtOut.write((char*)&firstCharPos, sizeof(DNALength));
+		bwtOut.write((char*)&useDebugData, sizeof(useDebugData));
+		if (useDebugData) {
+			bwtOut.write((char*)&saCopy[0], (bwtSequence.length-1) * sizeof(DNALength));
+		}
+		occ.Write(bwtOut);
+		pos.Write(bwtOut);
+	}
+
+	int Read(std::string inName) {
+		std::ifstream bwtIn;
+		DNALength seqStorageSize;
+		CrucialOpen(inName, bwtIn, std::ios::binary|std::ios::in);
+		bwtSequence.Read(bwtIn);
+		bwtIn.read((char*)charCount, sizeof(DNALength)*CharCountSize);
+		bwtIn.read((char*)&firstCharPos, sizeof(DNALength));
+		bwtIn.read((char*)&useDebugData, sizeof(useDebugData));
+		if (useDebugData) {
+			saCopy.resize(bwtSequence.length-1);
+			bwtIn.read((char*)&saCopy[0], (bwtSequence.length-1) * sizeof(DNALength));
+		}
+		occ.Read(bwtIn, useDebugData);
+		pos.Read(bwtIn);
+		occ.InitializeBWT(bwtSequence);
+		return 1;
+	}
+
+	void Print(std::ofstream &out) {
+		bwtSequence.Print(out);
+	}
+
+	DNALength LFBacktrack(DNALength bwtPos) {
+		Nucleotide curNuc = bwtSequence.Get(bwtPos);
+		assert(curNuc < 5);
+		DNALength bwtPrevPos = charCount[curNuc] + occ.Count(curNuc, bwtPos) - 1;
+		return bwtPrevPos;
+	}
+
+	DNALength Locate(DNALength bwtPos) {
+		DNALength seqPos;
+		DNALength offset = 0;
+		while (1) {
+			if (pos.Lookup(bwtPos, seqPos)) {
+				break;
+			}
+			else {
+				DNALength bwtPrevPos;
+				bwtPrevPos = LFBacktrack(bwtPos);
+				if (useDebugData) {
+					assert(saCopy[bwtPos-1] - 1 == saCopy[bwtPrevPos-1]);
+				}
+				bwtPos = bwtPrevPos;
+				assert(bwtPos <= bwtSequence.length);
+				/*
+				 * Boundary condition at the beginning of the bwt string.
+				 */
+				if (bwtPos == firstCharPos) {
+					seqPos = 1;
+					break;
+				}
+			}
+			++offset;
+		}
+		return seqPos + offset;
+	}
+	
+	DNALength Locate(DNALength sp, DNALength ep, std::vector<DNALength> &positions, 
+        int maxCount = 0) {
+		DNALength bwtPos;
+		DNALength seqPos;
+		if (sp <= ep and (maxCount == 0 or ep - sp < maxCount)) {
+			for (bwtPos = sp; bwtPos <= ep; bwtPos++) {
+				if ((seqPos = Locate(bwtPos))) {
+					positions.push_back(seqPos);
+				}
+			}
+		}
+		return ep - sp + 1;
+	}
+
+	DNALength Locate(T_DNASequence &seq, std::vector<DNALength> &positions, 
+        int maxCount =0) {
+		DNALength ep, sp;
+		Count(seq, sp, ep);
+		return Locate(sp, ep, positions);
+	}
+
+	DNALength GetNumCharsLessThan(Nucleotide nuc) {
+		return charCount[nuc];
+	}
+
+
+	void InitializeDNACharacterCount() {
+		//
+		// All counts start at 1 due to implicit encoding of $ character,
+		// where $ is less than all other chars.
+		//
+        std::fill(charCount, &charCount[6], 0);
+
+		DNALength p;
+		Nucleotide nuc;
+		for (p = 0; p < bwtSequence.length; p++) {
+			nuc = bwtSequence[p];
+				/*
+				 * Intentionally omit break commands so that charCount[4]
+				 * contains the counts of all characters 4 and below and so on.
+				 */
+			switch(nuc) {
+		  case 5:
+				//
+				// 5 is out of order here because the '$' is stored after ACGTN
+				// since it is a nonstandard character.
+				//
+				charCount[0]++;
+			case 0: //A
+				charCount[1]++;
+			case 1: //C
+				charCount[2]++;
+			case 2: //G
+				charCount[3]++;
+			case 3: //T
+				charCount[4]++;
+			case 4: //N
+				charCount[5]++;
+			}
+		}
+		// sum
+		charCount[6] = bwtSequence.length;
+	}
+
+	template<typename T_PStoragePolicy>
+	int Count(T_DNASequence &seq, T_PStoragePolicy &StoragePolicy) {
+		
+		/*
+		 * Implement algorithm count directly from the FM-Index paper(s --
+		 * it's shown many times).
+		 */
+		DNALength p = seq.length-1;
+		DNALength sp, ep;
+		Nucleotide c;
+		int i;
+
+		//
+		// Original forumlation is using count offsets starting at 1.
+		//
+		Nucleotide tbn = ThreeBit[seq[p]];
+		sp = charCount[tbn]; // = +1 (from paper) - 1 (0
+		                     // offset not in paper).
+		ep = charCount[tbn +1] - 1;
+		StoragePolicy.Store(sp,ep);
+		while (sp <= ep and p > 0) {
+			c  = ThreeBit[seq[p-1]];    
+			int  cc = charCount[c];
+			sp = cc + occ.Count(c,sp-1) + 1 - 1;
+			ep = cc + occ.Count(c,ep) - 1;
+			StoragePolicy.Store(sp,ep);
+			p--;
+		}
+		return ep - sp + 1;
+	}
+
+	int Count(T_DNASequence &seq, DNALength &sp, DNALength &ep) {
+		/*
+		 * Implement algorithm count directly from the FM-Index paper(s --
+		 * it's shown many times).
+		 */
+		SingleStoragePolicy storagePolicy;
+		storagePolicy.spp = &sp;
+		storagePolicy.epp = &ep;
+		return Count(seq, storagePolicy);
+	}
+	
+	int Count(T_DNASequence &seq, std::vector<DNALength> &spv, 
+        std::vector<DNALength> &epv) {
+		VectorStoragePolicy storagePolicy;
+		storagePolicy.spvp = &spv;
+		storagePolicy.epvp = &epv;
+		return Count(seq, storagePolicy);
+	}
+
+	int Count(T_DNASequence &seq) {
+		DNALength ep, sp;
+		return Count(seq, sp, ep);
+	}
+
+	void InitializeBWTStringFromSuffixArray(T_DNASequence &origSeq, DNALength saIndex[]) {
+		// extra +1 is for $.
+		bwtSequence.Allocate(origSeq.length+1);
+		if (useDebugData) {
+			saCopy.resize(origSeq.length);
+		}
+
+		DNALength p;
+
+		if (origSeq.length == 0) {
+			//
+			// No work to do, but even the null string has the sentinal
+			// appended to it.
+			//
+			bwtSequence.Set(0,ThreeBit[(int)'$']);
+			return;
+		}
+		
+		//
+		// By convention, bwt[0] = T[len(T)-1] because T[len(T)] == '$',
+		// the lexicographic least character in the alphabet.
+		//
+		bwtSequence.Set(0, ThreeBit[origSeq[origSeq.length-1]]);
+		
+		for (p = 1; p < origSeq.length+1; p++) {
+			if (useDebugData) {
+				saCopy[p-1] = saIndex[p-1];
+			}
+			if (saIndex[p-1] > 0) {
+				assert(ThreeBit[origSeq[saIndex[p-1]-1]] != 255);
+				bwtSequence.Set(p, ThreeBit[origSeq[saIndex[p-1]-1]]);
+			}
+			else {
+				//
+				// The 0'th suffix corresponds to the one ending in the
+				// sentinal '$'.  Since this is explicitly encoded, we can
+				// store a value in the bwt for '$'.
+				//
+				firstCharPos = p;
+				bwtSequence.Set(p,ThreeBit[(int)'$']);
+			}
+		}
+	}										
+
+	void InitializeFromSuffixArray(T_DNASequence &dnaSeq, DNALength saIndex[], int buildDebug=0) {
+		useDebugData = buildDebug;
+		InitializeBWTStringFromSuffixArray(dnaSeq, saIndex);
+		InitializeDNACharacterCount();
+
+		// sequence, major, minor bin sizes.
+		occ.Initialize(bwtSequence, 4096, 64, buildDebug);
+		pos.InitializeFromSuffixArray(saIndex, dnaSeq.length);
+	}
+};
+
+typedef	Bwt<PackedDNASequence, FASTASequence> BWT;
+
+
+#endif // _BLASR_BWT_HPP_
diff --git a/libcpp/alignment/bwt/Occ.hpp b/libcpp/alignment/bwt/Occ.hpp
new file mode 100644
index 0000000..0e2640b
--- /dev/null
+++ b/libcpp/alignment/bwt/Occ.hpp
@@ -0,0 +1,217 @@
+#ifndef _BLASR_OCC_HPP_
+#define _BLASR_OCC_HPP_
+
+#include <fstream>
+#include <vector>
+#include <algorithm>
+#include "DNASequence.hpp"
+#include "NucConversion.hpp"
+#include "utils.hpp"
+#include "matrix/Matrix.hpp"
+#include "matrix/FlatMatrix.hpp"
+
+template<typename T_BWTSequence, typename T_Major, typename T_Minor>
+class Occ {
+public:
+    int majorBinSize;
+    int minorBinSize;
+    int hasDebugInformation;
+    FlatMatrix2D<T_Major> major;
+    FlatMatrix2D<T_Minor> minor;
+    FlatMatrix2D<T_Major> full;
+    static const unsigned int AlphabetSize = 5;
+    T_BWTSequence *bwtSeqRef;
+    DNALength numMajorBins, numMinorBins;
+    void PrintBins(std::ostream &out) {
+        out << "numMajor: " << numMajorBins << " numMinor: " << numMinorBins << std::endl;
+        DNALength ma, mi, mii;
+        mi = 0;
+        int i;
+        for (ma = 0; ma < numMajorBins; ma++) {
+            out << "MAJOR: ";
+            for (i = 0; i < 5; i++ ){ out << major[ma][i] << " "; } out << std::endl;
+            for (mii = 0; mii < majorBinSize / minorBinSize  && mi < numMinorBins; mii++, mi++) {
+                out << "       ";
+                for (i = 0;i <5; i++ ){
+                    out << minor[mi][i] << " ";
+                }
+                out << std::endl;
+            }
+        }
+    }
+
+    void  InitializeBWT(T_BWTSequence &bwtSeq) {
+        bwtSeqRef    = &bwtSeq;
+    }
+
+    void Initialize(T_BWTSequence &bwtSeq,
+            int _majorBinSize=4096,
+            int _minorBinSize=64,
+            int _hasDebugInformation=0) {
+        //
+        // This reference is used when counting nucleotides. It assumes
+        // the sequence does not change between initialization and
+        // subsequent calls to count.
+        //
+        bwtSeqRef    = &bwtSeq;
+
+        majorBinSize = _majorBinSize;
+        minorBinSize = _minorBinSize;
+        hasDebugInformation = _hasDebugInformation;
+        InitializeMajorBins(bwtSeq);
+        InitializeMinorBins(bwtSeq);
+        if (hasDebugInformation) {
+            InitializeTestBins(bwtSeq);
+        }
+    }
+
+    void InitializeMajorBins(T_BWTSequence &bwtSeq) {
+        numMajorBins = CeilOfFraction(bwtSeq.length, (DNALength) majorBinSize);
+        major.Allocate(numMajorBins, AlphabetSize);
+        std::vector<DNALength> runningTotal;
+        runningTotal.resize(AlphabetSize);
+        fill(runningTotal.begin(), runningTotal.end(), 0);
+        fill(&major.matrix[0], &major.matrix[numMajorBins*AlphabetSize], 0);
+        DNALength p;
+        DNALength binIndex = 0;
+        for (p = 0; p < bwtSeq.length; p++) {
+            Nucleotide nuc = ThreeBit[bwtSeq[p]];
+            // only handle ACTGN, $==6, so skip counting that.
+            if (nuc > AlphabetSize) continue;
+            if (p % majorBinSize == 0) { //majorBinSize-1) {
+                //				cout << "storing at " << p<< " " << binIndex << std::endl;
+                int n;
+                for (n = 0; n < AlphabetSize; n++ ) {
+                    major[binIndex][n] = runningTotal[n];
+                }
+                binIndex++;
+            }
+            runningTotal[nuc]++;
+        }
+    }
+
+    void InitializeTestBins(T_BWTSequence &bwtSeq) {
+        full.Allocate(bwtSeq.length, AlphabetSize);
+        fill(full.matrix, &full.matrix[bwtSeq.length * AlphabetSize],0);
+        DNALength p;
+        int n;
+        for (p = 0; p < bwtSeq.length; p++) {
+            Nucleotide nuc = ThreeBit[bwtSeq[p]];
+            if (nuc > AlphabetSize) {
+                for (n = 0; n < AlphabetSize; n++ ) {
+                    full[p][n] = full[p-1][n];
+                }
+            }
+            else {
+                full[p][nuc]++;
+                if (p > 0) {
+                    for (n = 0; n < AlphabetSize; n++ ) {
+                        full[p][n] = full[p-1][n] + full[p][n];
+                    }
+                }
+            }
+        }
+    }
+
+    void InitializeMinorBins(T_BWTSequence &bwtSeq) {
+        numMinorBins = CeilOfFraction(bwtSeq.length, (DNALength) minorBinSize);
+        minor.Allocate(numMinorBins, AlphabetSize);
+
+        std::vector<DNALength> majorRunningTotal;
+        majorRunningTotal.resize(AlphabetSize);		
+        std::fill(majorRunningTotal.begin(), majorRunningTotal.end(), 0);
+        std::fill(&minor.matrix[0], &minor.matrix[numMinorBins*AlphabetSize], 0);
+
+        DNALength p;
+        DNALength minorBinIndex = 0;
+        for (p = 0; p < bwtSeq.length; p++ ){
+            Nucleotide nuc = ThreeBit[bwtSeq[p]];
+            if (nuc > AlphabetSize) continue;
+            //
+            //  The minor bins are running totals inside each major
+            //  bin. When the count hits a bin offset, reset the bin
+            //  counter. 
+            //  
+            if (p % majorBinSize == 0) {
+                fill(majorRunningTotal.begin(), majorRunningTotal.end(), 0);				
+            }
+            if (p % minorBinSize == 0) {
+                int n;
+                for (n = 0; n < AlphabetSize; n++ ) {
+                    minor[minorBinIndex][n] = majorRunningTotal[n];
+                }
+                minorBinIndex++;
+            }
+            majorRunningTotal[nuc]++;
+        }
+    }
+
+    int Count(Nucleotide nuc, DNALength p ) {
+        DNALength majorIndex = p / majorBinSize;
+        DNALength minorIndex = p / minorBinSize;
+        DNALength lastBinnedIndex = minorBinSize * (p / minorBinSize);
+        //
+        // This should be sort of O(1), since the last expression should
+        // be made of bit operations that are fast.
+        //
+        Nucleotide smallNuc = ThreeBit[nuc];
+        //assert(smallNuc < 5);
+        DNALength nocc = major[majorIndex][smallNuc] + minor[minorIndex][smallNuc] + bwtSeqRef->CountNuc(lastBinnedIndex, p+1, nuc);
+        //		assert(full.matrix == NULL or full[p][smallNuc] == nocc);
+        return nocc;
+    }
+
+    void Write(std::ostream &out) {
+        out.write((char*) &majorBinSize, sizeof(majorBinSize));
+        out.write((char*) &minorBinSize, sizeof(minorBinSize));
+
+        out.write((char*) &numMajorBins, sizeof(numMajorBins));
+        if (numMajorBins > 0) {
+            out.write((char*) major[0], sizeof(T_Major) * numMajorBins*AlphabetSize);
+        }
+
+        out.write((char*) &numMinorBins, sizeof(numMinorBins));
+        if (numMinorBins > 0) {
+            out.write((char*) minor[0], sizeof(T_Minor) * numMinorBins*AlphabetSize);
+        }
+        if (hasDebugInformation) {
+            DNALength bwtSeqLength = bwtSeqRef->length;
+            out.write((char*)&bwtSeqLength, sizeof(bwtSeqLength));
+            out.write((char*)&full.matrix[0], sizeof(DNALength)* bwtSeqLength * AlphabetSize);
+        }
+    }
+
+    int Read(std::istream &in, int _hasDebugInformation) {
+        hasDebugInformation = _hasDebugInformation;
+        in.read((char*) &majorBinSize, sizeof(majorBinSize));
+        in.read((char*) &minorBinSize, sizeof(minorBinSize));
+        in.read((char*) &numMajorBins, sizeof(numMajorBins));
+        if (numMajorBins > 0) {
+            major.Resize(numMajorBins * AlphabetSize);
+            in.read((char*) major[0], sizeof(T_Major) * numMajorBins * AlphabetSize);
+            major.nRows = numMajorBins;
+            major.nCols = AlphabetSize;
+        }
+        in.read((char*) &numMinorBins, sizeof(numMinorBins));
+        if (numMinorBins > 0) {
+            minor.Resize(numMinorBins * AlphabetSize);
+            in.read((char*) minor[0], sizeof(T_Minor) * numMinorBins*AlphabetSize);
+            minor.nRows = numMinorBins;
+            minor.nCols = AlphabetSize;
+        }
+        if (hasDebugInformation) {
+            DNALength bwtSeqLength;
+            in.read((char*)&bwtSeqLength, sizeof(bwtSeqLength));
+            if (full.matrix) {delete [] full.matrix;}
+            full.matrix = new DNALength[bwtSeqLength *AlphabetSize];
+            full.nRows = bwtSeqLength;
+            full.nCols = AlphabetSize;
+            in.read((char*)&full.matrix[0], sizeof(DNALength)* bwtSeqLength * AlphabetSize);
+        }
+        return 1;
+    }
+
+};
+
+
+#endif // _BLASR_OCC_HPP_
diff --git a/libcpp/alignment/bwt/PackedHash.hpp b/libcpp/alignment/bwt/PackedHash.hpp
new file mode 100644
index 0000000..f1fa540
--- /dev/null
+++ b/libcpp/alignment/bwt/PackedHash.hpp
@@ -0,0 +1,350 @@
+#ifndef _BLASR_PACKED_HASH_HPP_
+#define _BLASR_PACKED_HASH_HPP_
+
+#include <vector>
+#include <map>
+#include <iostream>
+#include <fstream>
+#include <cstring>
+#include "Types.h"
+#include "utils.hpp"
+#include "utils/BitUtils.hpp"
+#include "DNASequence.hpp"
+
+class PackedHash {
+public:
+
+    DNALength tableLength;
+    uint32_t *table;
+    uint64_t *values;
+    std::vector<int> hashLengths;
+    static const uint32_t BinNumBits = 5;
+    static const uint32_t BinSize = 1 <<(BinNumBits);
+    PackedHash() {
+        table = NULL;
+        values = NULL;
+        tableLength = 0;
+    }
+
+    ~PackedHash() {
+        Free();
+    }
+
+    void Free() {
+        // In general convertions between int and pointer is not desired, 
+        // Consequences depending on the implementation, as the resulting 
+        // pointers may incorrectly aligned. See C standard subclause 6.3.2.3.
+        if (tableLength <= 0) {
+            table = NULL;
+            values = NULL;
+            tableLength = 0;
+            hashLengths.clear();
+            return;
+        }
+
+        for(DNALength i = 0; i < tableLength; i++) {
+            int nSetBits = CountBits(table[i]);
+            if (nSetBits >= 3) {
+                //values[i] is a pointer to a list of uint32 integers
+                volatile uintptr_t iptr = values[i];
+                uint32_t * ptr = (uint32_t *)iptr;
+                if (ptr != NULL) {
+                    delete [] ptr;
+                } //otherwise, values[i] is an uint_64.
+            }
+        }
+        if (values) {delete [] values;}
+        if (table) {delete [] table;}
+        table = NULL;
+        values = NULL;
+        tableLength = 0;
+        hashLengths.clear();
+    }
+
+    /*
+     * Create a mask that retains the lower 5 bits (0 .. 31) of a
+     * position so that pos % 32 may be computed by a shift.
+     */
+    static const uint32_t BinModMask = 0x1FU; 
+
+    void Allocate(uint32_t sequenceLength) {
+        Free();
+
+        tableLength = CeilOfFraction(sequenceLength, (DNALength) BinSize);
+        table  = new uint32_t[tableLength];
+        values = new uint64_t[tableLength];
+        std::fill(&table[0], &table[tableLength], 0);
+        std::fill(&values[0], &values[tableLength], 0);
+        hashLengths.resize(tableLength);
+        std::fill(hashLengths.begin(), hashLengths.end(), 0);
+    }
+
+    void PrintBinSummary() {
+        //
+        // Report some stats on the hash.
+        //
+        DNALength p;
+        std::map<int,int> countMap;
+        int card;
+        for (p = 0; p < tableLength; p++ ){ 
+            card = CountBits(table[p]);
+            countMap[card]++;
+        }
+        std::map<int,int>::iterator mapit;
+        for (mapit = countMap.begin(); mapit != countMap.end(); ++mapit) {
+            std::cout << mapit->first << " " << mapit->second << std::endl;
+        }
+    }
+
+    uint32_t LookupBinAtPos(DNALength pos) {
+        /* 
+         * Each bucket contains 32 positions.  Membership is simply when
+         * the bit at pos & BinModMask is set.  There should never be
+         * collisions of multiple positions (from different areas in the
+         * genome) mapping to the same position in a bin.
+         */
+        return table[pos/BinSize] & (1 << (pos & BinModMask));
+    }
+
+    void ValueToList(uint64_t &storage, DNALength newValue, int newValuePos) {
+
+        /*
+         * This is called when one is attempting to add a spot to storage,
+         * but there are already two values stored in it, so storage must
+         * be converted to a pointer, and the values added to a list on
+         * the heap.  The size of the list is necessarily 3 at this point,
+         * because there are two values in storage that must be moved to
+         * the list, and the new value as well. 
+         * The values are copied to the list in sorted order, and sorting
+         * is handled case-by-case since there are only 3 cases.
+         */
+
+        DNALength v0, v1;
+        v0 = ((DNALength)storage);
+        v1 = ((DNALength)(storage >> 32));
+        DNALength *storagePtr = new DNALength[3];
+        storage = (uint64_t) storagePtr;
+
+        //
+        // Only a couple of options, so handle them directly here
+        //
+        if (newValuePos == 0)	{
+            storagePtr[0] = newValue; 
+            storagePtr[1] = v0; storagePtr[2] = v1;
+        }
+        else if (newValuePos == 1) {
+            storagePtr[0] = v0; storagePtr[1] = newValue; storagePtr[2] = v1;
+        }
+        else if (newValuePos == 2) {
+            storagePtr[0] = v0; storagePtr[1] = v1; storagePtr[2] = newValue;
+        }
+        else {
+            assert("ERROR! Somehow expected to only add 3 elements to an array of length 3, but the position of the new value is greater than the length of the array" && 0);
+        }
+    }
+
+    void InsertValueInList(uint64_t &storage, int curStorageLength, DNALength newValue, int newValuePos) {
+        /*
+         * This simply creates a new list with size 1 larger than before,
+         * and inserts the new value into its position that maintains
+         * sorted order in the list.
+         */
+        DNALength *newListPtr = new DNALength[curStorageLength + 1];
+        //
+        // Copy the values from the old list making space for the new
+        // value.
+        // 
+        if (newValuePos > 0) {
+            memcpy(newListPtr, ((DNALength*)storage), newValuePos * sizeof(DNALength));
+        }
+        if (newValuePos < curStorageLength) {
+            memcpy(&newListPtr[newValuePos+1], &((DNALength*)storage)[newValuePos], (curStorageLength - newValuePos)*sizeof(uint32_t));
+        }
+        assert(curStorageLength < 32);
+        newListPtr[newValuePos] = newValue;
+        if (storage){delete[] ((DNALength*)storage);}
+        storage = (uint64_t)newListPtr;
+    }
+
+    void DirectlyStoreValue(uint64_t &storage, int curStorageLength, DNALength value, int valuePos) {
+        /*
+         * In this instance, the value may be copied to either the first
+         * half or the second half of 'storage', without having to turn
+         * storage into a list.  The values must be stored in sorted
+         * order.  If 'storage' is empty, the correct place is at the
+         * beginning of storage.  If there already is a value at the
+         * beginning, it may be necessary to shift the existing value over
+         * to keep everything in sorted order. 
+         */
+
+        if (curStorageLength == 0) {
+            //
+            // Nothing here, just store the value.
+            //
+            storage = value;
+        }
+        else if (valuePos == 0) {
+            //
+            // Place the value at the beginning of the storage.
+            //
+            storage = storage << 32;
+            storage = storage + value;
+        }
+        else {
+            // 
+            // Place the value at the end of storage.
+            //
+            uint64_t longValue = value;
+            longValue = longValue << 32;
+            storage += longValue;
+        }
+    }
+
+    int AddValue(DNALength pos, DNALength value) {
+        //
+        // The bucket is either a values[pos] that can store up to two
+        // values, or it is a pointer to a list of values.  The values are
+        // always in order of their corresponding position in the BWT
+        // string. 
+        // To add a value to this bucket, first check to see if
+        // values[pos] has enough room to simply put it there, otherwise,
+        // either a list already exists and the value must be inserted, or
+        // the values[pos] must be converted to a list, and then the new
+        // value inserted.
+
+        //
+        // First, operate on the assumption that no value gets added
+        // twice.
+        //
+        UInt bin = pos / BinSize;
+        UInt bit = pos & BinModMask;
+        assert((table[bin] & ( 1 << bit)) == 0);
+
+        //
+        // Now, add the pos and determine where it is in the array.
+        //
+        table[bin] = table[bin] + ( 1 << bit);
+
+        //
+        // Mask off everything above this bit.
+        //
+        UInt mask = (UInt)-1;
+        mask >>= (31 - bit);
+        UInt lowerBits = table[bin] & mask;
+        int  rank = CountBits(lowerBits) - 1;
+        int  card = CountBits(table[bin]);
+
+        if (card < 3) {
+            DirectlyStoreValue(values[bin], card-1, value, rank);
+        }
+        else if (card == 3) {
+            ValueToList(values[bin], value, rank);
+        }
+        else {
+            InsertValueInList(values[bin], card-1, value, rank);
+        }
+        return card;
+    }
+
+    int LookupValue(DNALength pos, DNALength &value) {
+
+        /* 
+         * Check to see if there is a value stored for 'pos'.  If so,
+         * store it in value, and return 1 for success.
+         */
+        UInt binIndex = pos/BinSize;
+        UInt bin      = table[binIndex];
+        UInt setBit = bin & (1 << (pos & BinModMask));
+        if (setBit == 0) {
+            return 0;
+        }
+
+        // 
+        // GetSetBitPosition64 returns the position relative to the most
+        // significant bit in a 64-bit word, starting at MSB = 1.  This
+        // should never be less than 32, since it's counting bits in a 32
+        // bit word.  
+        //
+
+        int  bitPos     = GetSetBitPosition32(setBit);
+        UInt bitPosMask = ((UInt)-1) >> (32 - bitPos-1);;
+
+        //
+        // Determine how to interpret the value of this bucket.  It is
+        // either a pointer or two words.  If there are more than two bits
+        // set in this bucket, it is a pointer.  Otherwise, pick the half
+        // of the 64 bit word based on the index in the bucket.
+        //
+        int nSet         = CountBits(bin);
+        int bitRank      = CountBits(bin & bitPosMask) - 1;
+        assert(nSet > 0);
+        if (nSet <= 2) {
+            // return lower 32 bits
+            if (bitRank == 0) {
+                value = ((uint32_t)values[binIndex]);
+                return 1;
+            }
+            else {
+                value = ((uint32_t)(values[binIndex]>>32));
+                return 1;
+            }
+        }
+        else {
+            /*
+             * In this instance, values is a pointer rather than a pair of values.
+             */
+            value = (uint32_t) ((DNALength*)values[binIndex])[bitRank];
+            return 1;
+        }
+        //
+        // This is reached if nothing is stored in value. For now, this
+        // shouldn't be reached, so make sure the program bails here.
+        //
+        assert(0);
+        return 0;
+    }	
+
+    /*
+     * Define binary I/O routines for the packed hash. The sizes of the
+     * tables are constant, but then the values table has some lists.
+     * Those are written past the end of the tables treating the last
+     * half of the file as a heap structure.  They are simlarly read in.
+     *
+     */
+
+    void Write(std::ostream &out) {
+        out.write((char*) &tableLength,sizeof(tableLength));
+        if (tableLength > 0) {
+            out.write((char*) table, tableLength * sizeof(table[0]));
+            out.write((char*) values, tableLength * sizeof(values[0]));
+        }
+        DNALength tablePos;
+        for (tablePos = 0; tablePos < tableLength; tablePos++) {
+            int nSetBits = CountBits(table[tablePos]);
+            if( nSetBits > 2) {
+                out.write((char*)values[tablePos], sizeof(uint32_t)*nSetBits);
+            }
+        }
+    }
+
+    void Read(std::istream &in) {
+        Free();
+        in.read((char*)&tableLength, sizeof(tableLength));
+        if (tableLength > 0) {
+            table  = new uint32_t[tableLength];
+            values = new uint64_t[tableLength];
+            in.read((char*)table, sizeof(uint32_t)*tableLength);
+            in.read((char*)values, sizeof(uint64_t)*tableLength);
+            DNALength tablePos;
+            for (tablePos = 0; tablePos < tableLength; tablePos++) {
+                int nSetBits = CountBits(table[tablePos]);
+                if (nSetBits > 2) {
+                    values[tablePos] = (uint64_t) new uint32_t[nSetBits];
+                    in.read((char*)values[tablePos], nSetBits * sizeof(uint32_t));
+                }
+            }
+        }
+    }
+};
+
+#endif // _BLASR_PACKED_HASH_HPP_
diff --git a/libcpp/alignment/bwt/Pos.hpp b/libcpp/alignment/bwt/Pos.hpp
new file mode 100644
index 0000000..06f6882
--- /dev/null
+++ b/libcpp/alignment/bwt/Pos.hpp
@@ -0,0 +1,47 @@
+#ifndef _BLASR_POS_HPP_
+#define _BLASR_POS_HPP_
+
+#include <fstream>
+#include <vector>
+
+#include "PackedHash.hpp"
+
+#include "DNASequence.hpp"
+#include "Types.h"
+#include "utils/BitUtils.hpp"
+
+template< typename T_BWT_Sequence>
+class Pos {
+public:
+    static const unsigned int stride=8;
+    PackedHash packedHash;
+    std::vector<int> hashCount;
+    std::vector<int> fullPos;
+    int hasDebugInformation;
+    void Write(std::ostream &out) {
+        packedHash.Write(out);
+    }
+
+    void Read(std::istream &in) {
+        packedHash.Read(in);
+    }
+
+    void InitializeFromSuffixArray(DNALength suffixArray[], DNALength suffixArrayLength) {
+        DNALength p;
+        packedHash.Allocate(suffixArrayLength);
+        std::fill(hashCount.begin(), hashCount.end(), 0);
+        for (p = 0; p < suffixArrayLength; p++ ){
+            if (suffixArray[p] % stride==0){
+                packedHash.AddValue(p,suffixArray[p]);
+            }
+        }
+    }
+
+    int Lookup(DNALength bwtPos, DNALength &seqPos) {
+        return packedHash.LookupValue(bwtPos-1, seqPos);
+    }
+
+};
+
+
+#endif // _BLASR_POS_HPP_
diff --git a/libcpp/alignment/datastructures/alignment/AlignedPair.h b/libcpp/alignment/datastructures/alignment/AlignedPair.h
new file mode 100644
index 0000000..588e832
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignedPair.h
@@ -0,0 +1,19 @@
+#ifndef ALIGNED_PAIR_H_
+#define ALIGNED_PAIR_H_
+
+#include <string>
+
+template<typename T_AlignChar=char>
+class AlignedPair {
+ public:
+	int length;
+	T_AlignChar *tAlignmentSeq;
+	T_AlignChar *qAlignmentSeq;
+};
+
+
+inline
+void ReadCompareSequencesAlignment {
+
+}
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/Alignment.cpp b/libcpp/alignment/datastructures/alignment/Alignment.cpp
new file mode 100644
index 0000000..d40aa39
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/Alignment.cpp
@@ -0,0 +1,512 @@
+#include <cassert>
+#include <stdint.h>
+#include <vector>
+#include <string>
+#include <stdlib.h>
+#include <iostream>
+#include <ostream>
+#include <fstream>
+#include "Types.h"
+#include "DNASequence.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+
+using namespace blasr;
+
+Alignment::Alignment() : AlignmentStats() {
+    qName = ""; tName = "";
+    qStrand = tStrand = 0;
+    qPos = tPos = 0;
+    qLength = tLength = 0;
+
+    probability   = 0;
+    nCells        = 0;
+    nSampledPaths = 0;
+    zScore        = 0;
+    score = probScore = sumQVScore = 0;
+    qAlignLength  = tAlignLength = 0;
+}
+
+void Alignment::CopyStats(Alignment &rhs) {
+    AlignmentStats::CopyStats((AlignmentStats) rhs);
+    probability = rhs.probability;
+    probScore   = rhs.probScore;
+    sumQVScore  = rhs.sumQVScore;
+    nCells      = rhs.nCells;
+    nSampledPaths = rhs.nSampledPaths;
+}
+
+void Alignment::Clear() {
+    qName = "";
+    tName = "";
+    blocks.clear();
+    gaps.clear();
+}
+
+Alignment& Alignment::operator=(const Alignment &rhs) {
+    qName = rhs.qName;
+    tName = rhs.tName;
+    qStrand = rhs.qStrand; tStrand = rhs.tStrand;
+    qPos = rhs.qPos; tPos = rhs.tPos;
+    qAlignLength = rhs.qAlignLength; tAlignLength = rhs.tAlignLength;
+    qLength = rhs.qLength;
+    tLength = rhs.tLength;
+    zScore = rhs.zScore;
+    blocks.clear();
+    blocks = rhs.blocks;
+    gaps.clear();
+    gaps   = rhs.gaps;
+    nCells = rhs.nCells;
+    nSampledPaths = rhs.nSampledPaths;
+    AlignmentStats::Assign(rhs);
+    return *this;
+}
+
+
+unsigned int Alignment::size() {
+    return blocks.size();
+}
+
+void Alignment::Assign(Alignment &rhs) {
+    ((AlignmentStats*)this)->Assign(rhs);
+    qPos = rhs.qPos; tPos = rhs.tPos;
+    qAlignLength = rhs.qAlignLength;
+    tAlignLength = rhs.tAlignLength;
+    qLength = rhs.qLength;
+    zScore  = rhs.zScore;
+    qName   = rhs.qName;
+    tName   = rhs.tName;
+    qStrand = rhs.qStrand;
+    tStrand = rhs.tStrand;
+    nCells  = rhs.nCells;
+    std::vector<Block> empty;
+    blocks.swap(empty);
+    blocks.resize(rhs.size());
+    int b;
+    for (b = 0; b < rhs.blocks.size(); b++) {
+        blocks[b].Assign(rhs.blocks[b]);
+    }
+}
+int Alignment::ComputeNumAnchors(int minAnchorSize, int &nAnchors, int &nAnchorBases) {
+    int i;
+    nAnchors = 0;
+    nAnchorBases = 0;
+    for (i = 0; i < blocks.size(); i++) {
+        if (blocks[i].length >= minAnchorSize) {
+            nAnchors++;
+            nAnchorBases += blocks[i].length;
+        }
+    }
+    return nAnchors;
+}
+
+void Alignment::AllocateBlocks(int nBlocks) {
+    blocks.resize(nBlocks);
+}
+
+void Alignment::AppendAlignmentGaps(Alignment &next, bool mergeFirst) {
+    //
+    // append all gaps belonging to ext to the gap list in this 
+    // alignment.  The logic for determining just what the gap should
+    // be between two separate alignments is somewhat complicated, and
+    // should probably be handled outside this function.  The default
+    // to do this is to skip the first gap in the next alignment, and
+    // assume that the code has handled computing the gap stored in
+    // the last gap in this alignment correctly. 
+    //
+    // At your own risk, you can simply merge the first gap in next
+    // with the last gap in the current alignment.
+
+    assert(gaps.size() > 0);
+
+    // Ditto for the next alignment.
+    assert(next.gaps.size() > 0);
+
+    std::vector<GapList>::iterator secondGapIt = next.gaps.begin();
+    if (mergeFirst) {
+        // Merge the gap list in the first gap in next sequence to the
+        // last gap in the current sequence.
+        gaps[gaps.size()-1].insert(gaps[gaps.size()-1].end(), secondGapIt->begin(), secondGapIt->end());
+    }
+    // Append all other gaps to the current one.
+    secondGapIt++;
+    gaps.insert(gaps.end(), secondGapIt, next.gaps.end());
+}
+
+void Alignment::AppendAlignmentBlocks(Alignment &next, int qOffset, int tOffset) {
+    VectorIndex n;
+    Block tempBlock;
+    for (n = 0; n < next.blocks.size(); n++ ) {
+        tempBlock = next.blocks[n];
+        tempBlock.qPos += qOffset;
+        tempBlock.tPos += tOffset;
+        blocks.push_back(tempBlock);
+    }
+}
+
+void Alignment::AppendAlignment(Alignment &next) {
+    int qOffset = next.qPos - qPos;
+    int tOffset = next.tPos - tPos;
+    AppendAlignmentBlocks(next, qOffset, tOffset);
+}
+
+/*
+   Transform the series of operations in an optimal dynamic
+   programming path to a block representation of the alignment.
+
+   Since it is possible to have an adjacent insertion and deletion,
+   the gap blocks are tracked in addition to the match blocks.
+   */
+
+void Alignment::ArrowPathToAlignment(std::vector<Arrow> &optPath) {
+    int q, t;
+    VectorIndex a = 1;
+    q = 0; t = 0;
+    Block b;
+    a = 0;
+    bool beforeFirstBlock = true;
+    while (a < optPath.size()) {
+        //
+        // Allow for there to be a block at the beginning
+        // of the alignment, so process gap characters first.
+        //
+        if (!beforeFirstBlock) {
+            if (optPath[a] == Diagonal) {
+                // Start of a block;
+                b.qPos = q;
+                b.tPos = t;
+                b.length = 0;
+                while(a < optPath.size() and optPath[a] == Diagonal) {
+                    b.length++;
+                    a++;
+                    t++;
+                    q++;
+                }
+                blocks.push_back(b);
+            }
+        }
+        gaps.push_back(GapList());
+        int curGapList = gaps.size() - 1;
+        //
+        // Add gaps as condensed blocks of insertions or deletions.  It
+        // is possible there are multiple stretches of ins/del/ins/del
+        // patterns, so have to loop over all of these.
+        //
+        while (a < optPath.size() and 
+                (optPath[a] == Left or 
+                 optPath[a] == Up)) {
+            if (a < optPath.size() and optPath[a] == Left) {
+                int gapStart = a;
+                while(a < optPath.size() and optPath[a] == Left) {
+                    t++;
+                    a++;
+                }
+                gaps[curGapList].push_back(Gap(Gap::Query, a - gapStart));
+                continue;
+            }
+            else if (a < optPath.size() and optPath[a] == Up) {
+                int gapStart = a;
+                while(a < optPath.size() and optPath[a] == Up) {
+                    q++;
+                    a++;
+                }
+                gaps[curGapList].push_back(Gap(Gap::Target, a - gapStart));
+                continue;
+            }
+        }
+        if (a == optPath.size()) {
+            if (gaps.size() > 0) {
+                gaps[curGapList].clear();
+            }
+        }
+        assert(a == optPath.size() or gaps[curGapList].size() != 0 or beforeFirstBlock == true);
+        beforeFirstBlock = false;
+    }
+}
+
+//
+// samtools / picard do not like the pattern
+// insertion/deletion/insertion (or the opposite).  To get around
+// this, reorder the idi patterns to iid (or did to idd).  This
+// produces the same scoring alignment, however it is reordered so
+// that Picard / samtools accepts the alignments.
+//
+void Alignment::OrderGapsByType() {
+    int g;
+    //
+    // Gaps at the beginning and end of the sequence are hard to deal
+    // with. Just get rid of them. 
+    //
+    RemoveEndGaps();
+    //
+    // Start at 1 since the gaps at the beginning of the sequence are
+    // removed.
+    //
+    for (g = 1; g < gaps.size(); g++ ) {
+        if (gaps[g].size() <= 1) {
+            continue;
+        }
+        Gap queryGap, targetGap;
+        GapList condensedGapList;
+        int gi;
+        targetGap.seq = Gap::Target;
+        queryGap.seq  = Gap::Query;
+        for (gi = 0; gi < gaps[g].size(); gi++) {
+            if (gaps[g][gi].seq == Gap::Target) {
+                targetGap.length += gaps[g][gi].length;
+            }
+            else {
+                queryGap.length += gaps[g][gi].length;
+            }
+        }
+        int nTypes = 0;
+        gaps[g].clear();
+        int matchExtend = 0;
+        if (targetGap.length > queryGap.length) {
+            targetGap.length -= queryGap.length;
+            gaps[g].push_back(targetGap);
+            matchExtend = queryGap.length;
+        }
+        else if (queryGap.length > targetGap.length) {
+            queryGap.length -= targetGap.length;
+            gaps[g].push_back(queryGap);
+            matchExtend = targetGap.length;
+        }
+        else {
+            matchExtend = targetGap.length;
+        }
+
+        if (matchExtend > 0) {
+            assert(g>0);
+            blocks[g-1].length += matchExtend;
+        }
+        //
+        // When targetGap.length == queryGap.length, there is no gap, so
+        // just leave the gap list cleared.
+        //
+    }
+}
+
+//
+// Transform an alignment that has up to one long gap in it to a
+// block based alignment.
+
+void 
+Alignment::LongGapArrowPathToAlignment(
+    std::vector<Arrow> &optPath, DNALength lengthOfLongGap)  {
+
+    DNALength i;
+    int numLongGaps = 0;
+
+    // Input checking.
+    // Only one long gap is allowed per alignment.  Make sure this is
+    // the case on the input.
+    //
+    for (i = 0; i < optPath.size(); i++) {
+        if (optPath[i] == AffineLongDelLeft or
+                optPath[i] == AffineLongDelClose) {
+            numLongGaps++;
+        }
+    }
+
+    if (numLongGaps > 1) {
+        std::cout << "ERROR. Only one long gap per alignment is allowed." 
+                  << std::endl;
+        exit(1);
+    }
+
+    //
+    // First locate the position of the gap.
+    // Also, change the gap to a normal arrow.
+    //
+    DNALength indexOfLongGap; // undefined until one is found
+    bool aLongGapWasFound = false;
+    Arrow longGapArrow; // will hold the type of the long gap
+    int numBlocksBeforeGap = 0;
+    int indexOfLastMatchBeforeGap = 0;
+    // Now locate both the type of type of the arrow, and the 
+    // position 
+    for (i = 0; i < optPath.size(); i++) {
+        //
+        // Count the number of blocks. This will tell us where to insert
+        // the gap.
+        //
+        if ( i > 0 and 
+                optPath[i-1] == Diagonal and 
+                optPath[i] != Diagonal ) {
+            numBlocksBeforeGap++;
+            indexOfLastMatchBeforeGap = i;
+        }
+        //
+        // Look for the gap.
+        //
+        if (optPath[i] == AffineLongDelLeft or
+                optPath[i] == AffineLongDelClose) {
+            aLongGapWasFound = true;
+            longGapArrow = optPath[i];
+            indexOfLongGap = i;
+            optPath[i] = Left;
+            break;
+        }
+    }
+
+    //
+    // Next transform the path into an alignment that lacks the gap. 
+    //
+    ArrowPathToAlignment(optPath);
+
+    //
+    // Finally, insert the gap into the block form of the alignment.
+    //
+
+    if (aLongGapWasFound and numBlocksBeforeGap < blocks.size()) {
+        // Found a gap, add it.
+
+        // First, find which gap corresponds to the long gap.  This is
+        // the hardest step.  First, find how many arrow instructions
+        // there are between the last block and the arrow.
+
+        int numGapChars = indexOfLongGap - indexOfLastMatchBeforeGap + 1;
+        int gi;
+
+        // Define some variables for readability.
+        int indexOfBlockBeforeGap;
+        int gapIndex;
+        gapIndex = numBlocksBeforeGap;
+
+        assert(gapIndex < gaps.size());
+
+        // There must be at least one gap here (the long deletion)
+        assert(gaps[gapIndex].size() > 0);
+
+        int cumulativeGapLength = 0;
+        bool indexOfGapFound = false;
+        for (gi = 0; gi < gaps[gapIndex].size(); gi++) {
+            cumulativeGapLength += gaps[gapIndex][gi].length;
+            if (cumulativeGapLength >= numGapChars) {
+                // Found the gap where the long deletion happened.
+                // Make sure this is on a deletion.
+                assert(gaps[gapIndex][gi].seq == Gap::Query);
+                indexOfGapFound = true;
+                break;
+            }
+        }
+
+        assert(indexOfGapFound == true);
+        //
+        // Found the gap corresponding to the long deletion.
+        // Now, add in the length of the long gap, taking into account
+        // the fact that there is already one base used in the previous
+        // accounting of the gap.
+        gaps[gapIndex][gi].length += lengthOfLongGap - 1;
+
+        // 
+        // Now fix the offsets of the positions of the rest of the
+        // blocks in the sequence.
+        //
+        UInt b;
+        for (b = numBlocksBeforeGap; b < blocks.size(); b++) {
+            blocks[b].tPos += lengthOfLongGap - 1;
+        }
+    }
+}
+
+//
+// The length of the aligned sequence in the query.
+//
+DNALength Alignment::QEnd() {
+    if (blocks.size() > 0) {
+        return blocks[blocks.size()-1].QEnd();
+    }
+    else { return 0; }
+}
+
+//
+// The lenght of the aligned sequence in the target.
+//
+DNALength Alignment::TEnd() {
+    if (blocks.size() > 0) {
+        return blocks[blocks.size()-1].TEnd();
+    }
+    else { return 0; }
+}
+
+DNALength Alignment::GenomicTBegin() {
+    return tPos;
+}
+
+DNALength Alignment::GenomicTEnd() {
+    return tPos + TEnd();
+}
+
+//
+// Some programs do not accept alignments that have gaps at their
+// ends.  This is used to trim gaps at the ends of alignments (even
+// if the structure represents an acceptable alignment).
+//
+
+void Alignment::RemoveEndGaps() {
+    if (gaps.size() > 0 and gaps[0].size() > 0) {
+        int i;
+        for (i = 0; i < gaps[0].size(); i++) {
+            if (gaps[0][i].seq == Gap::Target) {
+                qPos += gaps[0][i].length;
+            }
+            else {
+                tPos += gaps[0][i].length;
+            }
+        }
+        gaps[0].clear();
+    }
+
+    if (gaps.size() > 1 ) {
+        int lastGap = gaps.size() - 1;
+        gaps[lastGap].clear();
+    }
+}
+
+
+MatchedAlignment& MatchedAlignment::Assign(MatchedAlignment &rhs) {
+    ((Alignment*)(this))->Assign(rhs);
+    refIndex = rhs.refIndex;
+    readIndex = rhs.readIndex;
+    tStart   = rhs.tStart;
+    tEnd     = rhs.tEnd;
+    qStart   = rhs.qStart;
+    qEnd     = rhs.qEnd;
+    tChromOffset = rhs.tChromOffset;
+    return *this;
+}
+
+std::ostream& operator<<(std::ostream &out, const Block &b) {
+    out << " q: " << b.qPos << " t: " << b.tPos << " len: " << b.length;
+    return out;
+}
+
+Block& Block::Assign(Block &rhs) {
+    qPos = rhs.qPos;
+    tPos = rhs.tPos;
+    length = rhs.length;
+    return *this;
+}
+
+DNALength Block::QEnd() {
+    return qPos + length;
+}
+
+DNALength Block::TEnd() {
+    return tPos + length;
+}
+
+void Block::Clear() {
+    qPos = tPos =  length = 0;
+}
+
+Gap::Gap() {
+    seq    = Query;
+    length = 0;
+}
+
+Gap::Gap(GapSeq seqP, int lengthP) {
+    seq = seqP;
+    length = lengthP;
+}
diff --git a/libcpp/alignment/datastructures/alignment/Alignment.hpp b/libcpp/alignment/datastructures/alignment/Alignment.hpp
new file mode 100644
index 0000000..a10bbb6
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/Alignment.hpp
@@ -0,0 +1,184 @@
+#ifndef _BLASR_ALIGNMENT_HPP_
+#define _BLASR_ALIGNMENT_HPP_
+
+#include "Path.h"
+#include <vector>
+#include <string>
+#include "DNASequence.hpp"
+#include "datastructures/alignment/AlignmentStats.hpp"
+
+namespace blasr {
+class Block {
+public:
+    //
+    // An alignment is a collection of blocks. The qPos and tPos in a block
+    // is relative to the beginning of the alignment rather than the
+    // target or query.
+    //
+    DNALength qPos, tPos, length;
+    friend std::ostream &operator<<(std::ostream &out, const Block &b);
+
+    Block& Assign(Block &rhs);
+
+    DNALength QEnd(); 
+
+    DNALength TEnd();
+
+    void Clear(); 
+};
+
+class Gap {
+public:
+    enum GapSeq {Query, Target};
+    GapSeq seq;
+    int length;
+    Gap();
+    Gap(GapSeq seqP, int lengthP); 
+};
+
+typedef std::vector<Gap> GapList;
+
+class Alignment : public AlignmentStats {
+public:
+    // the FASTA titles of each sequence
+    std::string qName, tName;
+
+    // Strands represented in the alignment, 0=forward, 1=reverse
+    int qStrand, tStrand;
+
+    // The starting pos in the text and query of the start of the 
+    // alignment, in the window that is matched.
+    DNALength qPos, tPos;
+    DNALength  qAlignLength;
+    DNALength tAlignLength;
+    DNALength qLength;
+    DNALength tLength;
+
+    double probability;
+    float zScore;
+    float probScore;
+    int   sumQVScore; 
+    int   nCells;
+    int   nSampledPaths;
+    std::vector<Block> blocks;
+    std::vector<GapList> gaps;
+
+    Alignment();
+
+    void CopyStats(Alignment &rhs);
+
+    // 
+    // The position in the query is qPos + block[i].qPos
+    // and the position in the text is tPos + block[i].tPos
+    //
+    void Clear();
+
+    Alignment& operator=(const Alignment &rhs);
+
+    unsigned int size(); 
+
+    void Assign(Alignment &rhs);
+
+    int ComputeNumAnchors(int minAnchorSize, int &nAnchors, int &nAnchorBases);
+
+    void AllocateBlocks(int nBlocks); 
+
+    void AppendAlignmentGaps(Alignment &next, bool mergeFirst=false); 
+
+    void AppendAlignmentBlocks(Alignment &next, int qOffset = 0, int tOffset = 0); 
+
+    void AppendAlignment(Alignment &next); 
+
+    /*
+       Transform the series of operations in an optimal dynamic
+       programming path to a block representation of the alignment.
+
+       Since it is possible to have an adjacent insertion and deletion,
+       the gap blocks are tracked in addition to the match blocks.
+       */
+
+    void ArrowPathToAlignment(std::vector<Arrow> &optPath); 
+
+    //
+    // samtools / picard do not like the pattern
+    // insertion/deletion/insertion (or the opposite).  To get around
+    // this, reorder the idi patterns to iid (or did to idd).  This
+    // produces the same scoring alignment, however it is reordered so
+    // that Picard / samtools accepts the alignments.
+    //
+    void OrderGapsByType(); 
+
+    //
+    // Transform an alignment that has up to one long gap in it to a
+    // block based alignment.
+
+    void LongGapArrowPathToAlignment(std::vector<Arrow> &optPath, DNALength lengthOfLongGap); 
+
+    //
+    // The length of the aligned sequence in the query.
+    //
+    DNALength QEnd(); 
+
+    //
+    // The lenght of the aligned sequence in the target.
+    //
+    DNALength TEnd(); 
+
+    DNALength GenomicTBegin(); 
+
+    DNALength GenomicTEnd(); 
+
+    //
+    // Some programs do not accept alignments that have gaps at their
+    // ends.  This is used to trim gaps at the ends of alignments (even
+    // if the structure represents an acceptable alignment).
+    //
+
+    void RemoveEndGaps();
+
+};
+
+//
+// This data structure holds two things: alignments, of course, and in addition
+// the coordinates of sequences that are successively refined in order to produce 
+// the alignment.  This is somewhat tricky when the target genome has been
+// transformed by some noise-reducing function phi(t). 
+//
+// Before aligning a read, it is first mapped to the genome, or transformed 
+// then mapped to the transformed genome.  Because the mapping is inexact, the
+// region a read is mapped to is typically much larger than the read.  
+// The coordinates of the mapped region are stored in tStart and tEnd
+// Alignments are performed in native nucleotide space (not transformed).
+
+// For now, the query is always qStart=0, qEnd = queryLength.
+
+
+//
+// When mapping a read to a set of concatenated chromosomes, each chromosome
+// has an offset into the file.  Therefore though a sequence may be aligned 
+// to a region starting at tStart, the relative offset into the chromosome
+// is tStart - tChromOffset.  This is used when printing the coordinates of a match.
+//
+class MatchedAlignment : public Alignment {
+public: 
+    int refIndex;
+    int readIndex;
+    DNALength tStart, tEnd, qStart, qEnd;
+    int tChromOffset;
+
+    MatchedAlignment &Assign(MatchedAlignment &rhs); 
+};
+
+
+/*
+ *  Create a structure for storing the information output by compare sequences.
+ *  Namely, the two string representations of the alignment.
+ */
+class CompSeqAlignment : public Alignment {
+    public:
+        std::string tString, qString, alignString;
+};
+
+} // namespace blasr
+
+#endif // _BLASR_ALIGNMENT_HPP_
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentCandidate.cpp b/libcpp/alignment/datastructures/alignment/AlignmentCandidate.cpp
new file mode 100644
index 0000000..111cfc9
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentCandidate.cpp
@@ -0,0 +1,26 @@
+#include "AlignmentCandidate.hpp"
+
+int SortAlignmentPointersByScore::operator() (T_AlignmentCandidate *lhs, 
+                                              T_AlignmentCandidate* rhs) {
+    if (lhs->score == rhs->score) {
+        return lhs->tPos + lhs->tAlignedSeqPos < rhs->tPos + rhs->tAlignedSeqPos;
+    }
+    else {
+        return lhs->score < rhs->score;
+    }
+}
+
+int SortAlignmentPointersByMapQV::operator() (T_AlignmentCandidate *lhs,
+                                              T_AlignmentCandidate* rhs) {
+    if (lhs->mapQV == rhs->mapQV) {
+        if (lhs->score == rhs->score) {
+            return lhs->tPos + lhs->tAlignedSeqPos < rhs->tPos + rhs->tAlignedSeqPos;
+        }
+        else {
+            return lhs->score < rhs->score;
+        }
+    }
+    else {
+        return lhs->mapQV > rhs->mapQV;
+    }
+}
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentCandidate.hpp b/libcpp/alignment/datastructures/alignment/AlignmentCandidate.hpp
new file mode 100644
index 0000000..2e27142
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentCandidate.hpp
@@ -0,0 +1,370 @@
+#ifndef _ALIGNMENT_ALIGNMENT_CANDIDATE_HPP_
+#define _ALIGNMENT_ALIGNMENT_CANDIDATE_HPP_
+
+#include "Alignment.hpp"
+#include "DNASequence.hpp"
+#include "FASTQSequence.hpp"
+
+template<typename T_TSequence=FASTASequence, typename T_QSequence=FASTASequence>
+class AlignmentCandidate : public blasr::Alignment {
+
+private:
+    void ReassignSequence(DNASequence &curSeq, bool curIsSubstring,  DNASequence &newSeq) {
+        //
+        // If this sequence is in control of itself (it is not a substring
+        // of anoter sequence), it should be freed here to avoid memory
+        // leaks.
+        //
+        if (curIsSubstring == false) {
+            curSeq.Free();
+        }
+        curSeq.seq = newSeq.seq;
+        curSeq.length = newSeq.length;
+    }
+
+    void ReassignSequence(FASTQSequence &curSeq, bool curIsSubstring, FASTQSequence &newSeq) {
+        //
+        // Free the current sequence with the same rules as above.
+        //
+        if (curIsSubstring == false) {
+            curSeq.Free();
+        }
+        curSeq.ReferenceSubstring(newSeq, 0, newSeq.length);
+    }
+    
+    // TryReadingQVs is a helper function for ReadOptionalQVs. It checks if the
+    // qvs that are supposed to be copied to a member of AlignmentCandidate are
+    // in fact empty. If so, then don't substr or copy anything
+    void TryReadingQVs(const std::string qvs, DNALength start, DNALength length,
+                       std::string *memberQVs) {
+        if (qvs.size() == 0) {
+            memberQVs->clear();
+        } else {
+            *memberQVs = qvs.substr(start, length);
+        }
+    }
+
+
+
+public:
+    T_TSequence tAlignedSeq;
+    T_QSequence qAlignedSeq;
+    std::string insertionQV, deletionQV, mergeQV, substitutionQV, deletionTag, substitutionTag;
+    std::vector<std::string> optionalQVNames;
+    DNALength   tAlignedSeqPos, qAlignedSeqPos;
+    DNALength   tAlignedSeqLength, qAlignedSeqLength;
+    float       pvalVariance, weightVariance, pvalNStdDev, weightNStdDev;
+    int         numSignificantClusters;
+    int readIndex;
+    //
+    // [q/t]IsSubstring refers to whether or not the text or query
+    // sequences are pointers into longer sequences.  If they are,
+    // then reassigning the target/query sequences just means
+    // reassigning the seq and length values.  If not, they occupy their
+    // own space, and should have the same lifetime as the alignment
+    // candidate object.
+    //
+
+    bool tIsSubstring, qIsSubstring;
+    std::string tTitle, qTitle;
+    float clusterScore, clusterWeight;
+    //
+    // For indexing into sequence index databases, tIndex stores which
+    // target this match is from.
+    //
+    int tIndex;
+
+    AlignmentCandidate&operator=(const AlignmentCandidate &rhs)  {
+        tAlignedSeq         = rhs.tAlignedSeq;
+        qAlignedSeq         = rhs.qAlignedSeq;
+        tAlignedSeqPos      = rhs.tAlignedSeqPos;
+        qAlignedSeqPos      = rhs.qAlignedSeqPos;
+        tAlignedSeqLength   = rhs.tAlignedSeqLength;
+        qAlignedSeqLength   = rhs.qAlignedSeqLength;
+        readIndex           = rhs.readIndex;
+        tIndex              = rhs.tIndex;
+        mapQV               = rhs.mapQV;
+        clusterScore        = rhs.clusterScore;
+        clusterWeight       = rhs.clusterWeight;
+        *((Alignment*)this) = ((Alignment&)rhs);
+
+        pvalVariance = rhs.pvalVariance;
+        pvalNStdDev  = rhs.pvalNStdDev;
+        weightVariance=rhs.weightVariance;
+        weightNStdDev= rhs.weightNStdDev;
+
+        insertionQV = rhs.insertionQV;
+        deletionQV = rhs.deletionQV;
+        substitutionQV = rhs.substitutionQV;
+        mergeQV = rhs.mergeQV;
+        substitutionTag = rhs.substitutionTag;
+        deletionTag = rhs.deletionTag;
+
+        return *this;
+    }
+
+    AlignmentCandidate() {
+        /*
+         * The default configuration of an alignment candidate is to have
+         * the t and q sequences be substrings.  This means that the
+         * position of the substrings starts at 0 (no offset into a longer
+         * string).
+         */
+        tIsSubstring      = true;
+        qIsSubstring      = true;
+        tTitle            = "";
+        qTitle            = "";
+        tAlignedSeqPos    = 0;
+        qAlignedSeqPos    = 0;
+        tAlignedSeqLength = 0;
+        qAlignedSeqLength = 0;
+        tIndex            = 0;
+        readIndex         = 0;
+        mapQV             = 50;
+        clusterScore      = 0;
+        clusterWeight     = 0;
+        numSignificantClusters = 0;
+        pvalVariance = pvalNStdDev = 0;
+        weightVariance = weightNStdDev = 0;
+    }
+
+    void Print(std::ostream & out = std::cout) {
+        out << "An AlignmentCandidate object (mapQV " 
+            << mapQV << ", clusterscore " << clusterScore 
+            << ", tTitle: " << tTitle << ", qTitle: " << qTitle 
+            << ")." << std::endl;
+        out << "  query: " << qTitle << ", "  
+            << "qName: " << qName << ","
+            << "qStrand: " << qStrand << ", " 
+            << "qPos: " << qPos << ", "
+            << "qLen: " << qLength << ", "
+            << "qAlignLength: " << qAlignLength << ", "
+            << "qAlignedSeqPos:" << qAlignedSeqPos << ", "
+            << "qAlignedSeqLen:" << qAlignedSeqLength << std::endl
+            << "  target: " << tTitle << ", "  
+            << "tName: " << tName << ","
+            << "tStrand: " << tStrand << ", " 
+            << "tPos: " << tPos << ", "
+            << "tLen: " << tLength << ", "
+            << "tAlignLength: " << tAlignLength << ", "
+            << "tAlignedSeqPos:" << tAlignedSeqPos << ", " 
+            << "tAlignedSeqLen:" << tAlignedSeqLength << std::endl;
+        tAlignedSeq.Print(out);
+    }
+
+    AlignmentCandidate(const AlignmentCandidate &rhs) {
+        *this = rhs;
+    }
+
+    DNALength GenomicTBegin() {
+        return tAlignedSeqPos + tPos;
+    }
+
+    DNALength GenomicTEnd() {
+        return tAlignedSeqPos + tPos + TEnd();
+    }
+
+    void GetQIntervalOnForwardStrand(int &qStart, int &qEnd) {
+        GetQInterval(qStart, qEnd, true);
+    }
+
+    void GetQInterval(int &qStart, int &qEnd, bool useForwardStrand=false) {
+        qStart = qEnd = 0;
+        if (blocks.size() == 0) { return; }
+        qStart = blocks[0].qPos + qAlignedSeqPos;
+        qEnd   = QEnd() + qAlignedSeqPos;
+        if (useForwardStrand and qStrand == 1) {
+            int forQEnd, forQStart;
+            forQStart = qLength - qEnd;
+            forQEnd   = qLength - qStart;
+            qStart    = forQStart;
+            qEnd      = forQEnd;
+        }
+    }
+
+    DNALength QAlignEnd() {
+        return QEnd() + qPos + qAlignedSeqPos;
+    }
+
+    DNALength QAlignStart() {
+        return qPos + qAlignedSeqPos;
+    }
+
+    DNALength TAlignStart() {
+        return tPos + tAlignedSeqPos;
+    }
+
+    // Synonyms for T/QStart 
+    DNALength GetQBasesToStart() {
+        return qPos + qAlignedSeqPos;
+    }
+    DNALength GetTBasesToStart() {
+        return tPos + tAlignedSeqPos;
+    }
+    
+    // ReadOptionalQVs populates the optional QV attributes of
+    // AlignmentCandidate with values read from a vector.  
+    void ReadOptionalQVs(const std::vector<std::string>& optionalQVs,
+                         DNALength start, DNALength length) {
+      TryReadingQVs(optionalQVs[0], start, length, &insertionQV);
+      TryReadingQVs(optionalQVs[1], start, length, &deletionQV);
+      TryReadingQVs(optionalQVs[2], start, length, &substitutionQV);
+      TryReadingQVs(optionalQVs[3], start, length, &mergeQV);
+      TryReadingQVs(optionalQVs[4], start, length, &substitutionTag);
+      TryReadingQVs(optionalQVs[5], start, length, &deletionTag);
+    } 
+    
+    // CopyQVs fills a vector with optional QV attributes.
+    void CopyQVs(std::vector<std::string> *optionalQVs) {  
+      optionalQVNames.clear();
+      optionalQVs->clear();
+      optionalQVs->push_back(insertionQV);
+      optionalQVNames.push_back("InsertionQV");
+      optionalQVs->push_back(deletionQV);
+      optionalQVNames.push_back("DeletionQV");
+      optionalQVs->push_back(substitutionQV);
+      optionalQVNames.push_back("SubstitutionQV");
+      optionalQVs->push_back(mergeQV);
+      optionalQVNames.push_back("MergeQV");
+      optionalQVs->push_back(substitutionTag);
+      optionalQVNames.push_back("SubstitutionTag");
+      optionalQVs->push_back(deletionTag);
+      optionalQVNames.push_back("DeletionTag");
+    }
+
+    void AppendAlignment(AlignmentCandidate &next) {
+
+        //
+        // If the next alignment is empty, just return now.
+        //
+        if (next.blocks.size() == 0) {
+            return;
+        }
+        //
+        // It is necessary to determine how much after the first alignment
+        // the second alignment starts, in order to 
+        assert(GetTBasesToStart() <= next.GetTBasesToStart());
+        assert(GetQBasesToStart() <= next.GetQBasesToStart());
+        assert(GetTBasesToStart() + TEnd() <= next.GetTBasesToStart());
+        assert(GetQBasesToStart() + QEnd() <= next.GetQBasesToStart());
+
+        //
+        // qOffset is the offset of the frame of reference for the 'next'
+        // alignment relative to this one.  If the frame of reference is
+        // the same (qOffset == 0 and tOffset == 0), then the alignment
+        // blocks may simply be appended.  If it is non zero, then the
+        // location in the query or target where the alignment has started
+        // is different, and the values of qPos or tPos need to be
+        // adjusted accordingly.
+
+        DNALength qOffset = next.qPos + next.qAlignedSeqPos - qPos - qAlignedSeqPos;
+        DNALength tOffset = next.tPos + next.tAlignedSeqPos - tPos - tAlignedSeqPos;
+        DNALength origQEnd = QEnd();
+        DNALength origTEnd = TEnd();
+
+        /*    DNALength tGap = next.GetTBasesToStart() + next.blocks[0].tPos - (GetTBasesToStart() + TEnd());
+              DNALength qGap = next.GetQBasesToStart() + next.blocks[0].qPos - (GetQBasesToStart() + QEnd());
+              */
+        DNALength tGap = next.GetTBasesToStart() - (GetTBasesToStart() + TEnd());
+        DNALength qGap = next.GetQBasesToStart() - (GetQBasesToStart() + QEnd());
+
+        //
+
+        if ( gaps.size() > 0 and next.gaps.size() > 0 ) {
+
+            //
+            // Determine the gap between the two alignments in order to assign
+            // the gap between them.
+            DNALength commonGap = 0;
+            DNALength gapDiff = 0;
+
+            if (tGap >= qGap) {
+                gapDiff   = tGap - qGap;
+                commonGap = tGap - gapDiff;
+                tGap      = gapDiff;
+                qGap      = 0;
+            }
+            else {
+                gapDiff   = qGap - tGap;
+                commonGap = qGap - gapDiff;
+                qGap      = gapDiff;
+                tGap      = 0;
+            }
+
+            if (commonGap > 0) {
+                // There is some portion of sequence between the two alignments
+                // that is a common gap. Add a block representing this.
+
+                blasr::Block block;
+                block.qPos = origQEnd;
+                block.tPos = origTEnd;
+                block.length = commonGap;
+                blocks.push_back(block);
+                blasr::GapList emptyGap;
+                gaps.push_back(emptyGap);
+            }
+
+            blasr::GapList endGapList;
+            //
+            // When gapDiff == 0, an empty list is appended.
+            //
+            if (next.gaps.size() > 0) {
+                //
+                // The first gap in the next alignment is already handled by
+                // the gap created with the endGap.  So get rid of the first
+                // gaps. 
+                //        next.gaps[0].resize(0);
+                static const bool mergeFirstGap = true;
+                AppendAlignmentGaps(next);
+            }
+        }
+
+        //
+        // Finally append all the blocks.
+        //
+        AppendAlignmentBlocks(next, qOffset, tOffset);
+
+    }
+
+    void FreeSubsequences() {
+        if (tIsSubstring == false) {
+            tAlignedSeq.Free();
+        }
+        if (qIsSubstring == false) {
+            qAlignedSeq.Free();
+        }
+    }
+
+    void ReassignTSequence(DNASequence &newSeq) {
+        ReassignSequence(tAlignedSeq, tIsSubstring, newSeq);
+    }
+
+    template<typename T_Sequence>
+        void ReassignQSequence(T_Sequence &newSeq) {
+            ReassignSequence(qAlignedSeq, qIsSubstring, newSeq);
+        }
+
+    ~AlignmentCandidate() {
+        qAlignedSeq.Free();
+        tAlignedSeq.Free();
+    }
+};
+//
+// Define a default alignment candidate for aligning quality-sequence
+// to a reference without quality.
+//
+typedef AlignmentCandidate<DNASequence,FASTQSequence> T_AlignmentCandidate;
+
+class SortAlignmentPointersByScore {
+public:
+    /// Sort AlignmentCandidate pointer by score, then by target position.
+    int operator()(T_AlignmentCandidate *lhs, T_AlignmentCandidate* rhs);
+};
+
+class SortAlignmentPointersByMapQV {
+public:
+    /// Sort AlignmentCandidate pointer by mapQV, then by target position.
+    int operator()(T_AlignmentCandidate *lhs, T_AlignmentCandidate* rhs);
+};
+
+#endif // _ALIGNMENT_ALIGNMENT_CANDIDATE_HPP_
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentContext.cpp b/libcpp/alignment/datastructures/alignment/AlignmentContext.cpp
new file mode 100644
index 0000000..913a689
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentContext.cpp
@@ -0,0 +1,35 @@
+#include "AlignmentContext.hpp"
+
+AlignmentContext::AlignmentContext() {
+    isPrimary = true;
+    subreadIndex = 0;
+    isFinal   = true;
+    nextSubreadPos = 0;
+    hasNextSubreadPos = false;
+    numProperlyAlignedSubreads = 0;
+    allSubreadsProperlyAligned = false;
+    nSubreads = 0;
+    nextSubreadDir = 0;
+    rNext = "";
+    readGroupId = "";
+    chipId = "";
+    alignMode = NoAlignMode;
+    editDist = 0;
+}
+
+bool AlignmentContext::IsFirst() {
+    return subreadIndex == 0;
+}
+
+bool AlignmentContext::IsLast() {
+    return subreadIndex == nSubreads-1;
+}
+
+bool AlignmentContext::AllSubreadsAligned() {
+    if (numProperlyAlignedSubreads == nSubreads) {
+        return true;
+    }
+    else {
+        return false;
+    }
+}
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentContext.hpp b/libcpp/alignment/datastructures/alignment/AlignmentContext.hpp
new file mode 100644
index 0000000..69c57ce
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentContext.hpp
@@ -0,0 +1,32 @@
+#ifndef _BLASR_ALIGNMENT_CONTEXT_HPP_
+#define _BLASR_ALIGNMENT_CONTEXT_HPP_
+
+#include <string>
+#include "Enumerations.h"
+
+class AlignmentContext {
+public:
+    bool isPrimary;
+    int  subreadIndex;
+    int  numProperlyAlignedSubreads;
+    bool allSubreadsProperlyAligned;
+    bool isFinal;
+    int  nextSubreadPos;
+    int  nextSubreadDir;
+    bool hasNextSubreadPos;
+    int  nSubreads;
+    std::string rNext;
+    std::string readGroupId;
+    std::string chipId;
+    AlignMode alignMode;
+    int editDist;
+    AlignmentContext(); 
+
+    bool IsFirst(); 
+
+    bool IsLast(); 
+
+    bool AllSubreadsAligned(); 
+};
+
+#endif // _BLASR_ALIGNMENT_CONTEXT_HPP_
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentGapList.h b/libcpp/alignment/datastructures/alignment/AlignmentGapList.h
new file mode 100644
index 0000000..47fb01c
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentGapList.h
@@ -0,0 +1,26 @@
+#ifndef DATASTRUCTURES_ALIGNMENT_GAP_LIST_H_
+#define DATASTRUCTURES_ALIGNMENT_GAP_LIST_H_
+
+#include <vector>
+using namespace std;
+
+
+
+class Gap {
+ public:
+  enum GapSeq {Query, Target};
+  GapSeq seq;
+  int length;
+  Gap() {
+    seq    = Query;
+    length = 0;
+  }
+  Gap(GapSeq seqP, int lengthP) {
+    seq = seqP;
+    length = lengthP;
+  }
+};
+
+typedef vector<Gap> GapList;
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentMap.cpp b/libcpp/alignment/datastructures/alignment/AlignmentMap.cpp
new file mode 100644
index 0000000..7e39d0b
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentMap.cpp
@@ -0,0 +1,22 @@
+#include <vector>
+#include <string> 
+#include "AlignmentMap.hpp"
+
+using namespace std;
+
+void 
+CreateSequenceToAlignmentMap(const string & alignedSequence,
+        vector<int> & baseToAlignmentMap) {
+    baseToAlignmentMap.resize(alignedSequence.size());
+    int alignedPos, unalignedPos;
+    for (alignedPos=0, unalignedPos=0; 
+         alignedPos < alignedSequence.size();
+         alignedPos++) {
+        if (not (alignedSequence[alignedPos] == ' ' or 
+            alignedSequence[alignedPos] == '-')) {
+            baseToAlignmentMap[unalignedPos] = alignedPos;
+            unalignedPos++;
+        }
+    }
+    baseToAlignmentMap.resize(unalignedPos);
+}
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentMap.hpp b/libcpp/alignment/datastructures/alignment/AlignmentMap.hpp
new file mode 100644
index 0000000..57752fc
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentMap.hpp
@@ -0,0 +1,20 @@
+#ifndef _BLASR_ALIGNMENT_MAP_HPP_
+#define _BLASR_ALIGNMENT_MAP_HPP_
+
+#include <vector>
+
+class AlignmentMap {
+ public:
+	int qPos, tPos;
+	std::vector<int> alignPos;
+};
+
+
+// Build a map of positions from (unaligned) bases to an aligned sequence
+void 
+CreateSequenceToAlignmentMap(const std::string & alignedSequence,
+        std::vector<int> & baseToAlignmentMap); 
+
+
+#endif // _BLASR_ALIGNMENT_MAP_HPP_
+
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentStats.cpp b/libcpp/alignment/datastructures/alignment/AlignmentStats.cpp
new file mode 100644
index 0000000..3da5fe5
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentStats.cpp
@@ -0,0 +1,29 @@
+#include "AlignmentStats.hpp"
+
+using namespace blasr;
+
+AlignmentStats::AlignmentStats() {
+    nMatch = nMismatch = nIns = nDel = 0;
+    pctSimilarity = 0.0;
+    mapQV = 0;
+    score = 0;
+}
+
+AlignmentStats& AlignmentStats::Assign(const AlignmentStats &rhs) {
+    nMatch = rhs.nMatch;						  		
+    nMismatch = rhs.nMismatch;				 
+    nIns = rhs.nIns;							  
+    nDel = rhs.nDel;							  
+    pctSimilarity = rhs.pctSimilarity;
+    score = rhs.score;             
+    return *this;
+}
+
+AlignmentStats& AlignmentStats::operator=(const AlignmentStats &rhs) {
+    Assign(rhs);
+    return *this;
+}   
+
+void AlignmentStats::CopyStats(AlignmentStats rhs) {
+    *this = rhs;
+  }
diff --git a/libcpp/alignment/datastructures/alignment/AlignmentStats.hpp b/libcpp/alignment/datastructures/alignment/AlignmentStats.hpp
new file mode 100644
index 0000000..7f52e14
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/AlignmentStats.hpp
@@ -0,0 +1,25 @@
+#ifndef _BLASR_ALIGNMENT_STATS_HPP_
+#define _BLASR_ALIGNMENT_STATS_HPP_
+
+namespace blasr {
+class AlignmentStats {
+public:
+    int nMatch;
+    int nMismatch;
+    int nIns;
+    int nDel;	 
+    float pctSimilarity;
+    int score;             
+    int mapQV;
+    AlignmentStats();
+    
+    AlignmentStats &Assign(const AlignmentStats &rhs);
+
+    AlignmentStats& operator=(const AlignmentStats &rhs); 
+
+    void CopyStats(AlignmentStats rhs); 
+
+};
+}
+
+#endif // _BLASR_ALIGNMENT_STATS_HPP_
diff --git a/libcpp/alignment/datastructures/alignment/ByteAlignment.h b/libcpp/alignment/datastructures/alignment/ByteAlignment.h
new file mode 100644
index 0000000..c5c34c9
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/ByteAlignment.h
@@ -0,0 +1,347 @@
+#ifndef DATASTRUCTURES_ALIGNMENT_BYTE_ALIGNMENT_H_
+#define DATASTRUCTURES_ALIGNMENT_BYTE_ALIGNMENT_H_
+#include <vector>
+#include "algorithms/alignment/AlignmentUtils.hpp"
+#include "DNASequence.hpp"
+
+using namespace std;
+/*
+ * These arrays are for going from the HDF byte alignment format to characters, or
+ * from characters to the upper or lower nybble for translating from character 
+ * alignments to byte alignments.
+ */
+
+typedef vector<unsigned char> ByteAlignment;
+static char QueryChar[256] = {
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', //0	 
+' ', ' ', ' ', ' ', ' ', ' ', 'A', 'A', 'A', 'A', //10	 
+'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', // 20 
+'A', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', // 30 
+'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', ' ', ' ', // 40 
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 50 
+' ', ' ', ' ', ' ', 'G', 'G', 'G', 'G', 'G', 'G', // 60 
+'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', // 70 
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 80 
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 90 
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 100
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 110
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'T', 'T', // 120
+'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', // 130
+'T', 'T', 'T', 'T', ' ', ' ', ' ', ' ', ' ', ' ', // 140
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 150
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 160
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 170
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 180
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 190
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 200
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 210
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 220
+' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 230
+'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', // 240
+'N', 'N', 'N', 'N', 'N', 'N' 										// 250
+};
+
+static char RefChar[256] = {
+' ', 'A', 'C', ' ', 'G', ' ', ' ', ' ', 'T', ' ', 
+' ', ' ', ' ', ' ', ' ', 'N', ' ', 'A', 'C', ' ', 
+'G', ' ', ' ', ' ', 'T', ' ', ' ', ' ', ' ', ' ', 
+' ', 'N', ' ', 'A', 'C', ' ', 'G', ' ', ' ', ' ', 
+'T', ' ', ' ', ' ', ' ', ' ', ' ', 'N', ' ', 'A', 
+'C', ' ', 'G', ' ', ' ', ' ', 'T', ' ', ' ', ' ', 
+' ', ' ', ' ', 'N', ' ', 'A', 'C', ' ', 'G', ' ', 
+' ', ' ', 'T', ' ', ' ', ' ', ' ', ' ', ' ', 'N', 
+' ', 'A', 'C', ' ', 'G', ' ', ' ', ' ', 'T', ' ', 
+' ', ' ', ' ', ' ', ' ', 'N', ' ', 'A', 'C', ' ', 
+'G', ' ', ' ', ' ', 'T', ' ', ' ', ' ', ' ', ' ', 
+' ', 'N', ' ', 'A', 'C', ' ', 'G', ' ', ' ', ' ', 
+'T', ' ', ' ', ' ', ' ', ' ', ' ', 'N', ' ', 'A', 
+'C', ' ', 'G', ' ', ' ', ' ', 'T', ' ', ' ', ' ', 
+' ', ' ', ' ', 'N', ' ', 'A', 'C', ' ', 'G', ' ', 
+' ', ' ', 'T', ' ', ' ', ' ', ' ', ' ', ' ', 'N', 
+' ', 'A', 'C', ' ', 'G', ' ', ' ', ' ', 'T', ' ', 
+' ', ' ', ' ', ' ', ' ', 'N', ' ', 'A', 'C', ' ', 
+'G', ' ', ' ', ' ', 'T', ' ', ' ', ' ', ' ', ' ', 
+' ', 'N', ' ', 'A', 'C', ' ', 'G', ' ', ' ', ' ', 
+'T', ' ', ' ', ' ', ' ', ' ', ' ', 'N', ' ', 'A', 
+'C', ' ', 'G', ' ', ' ', ' ', 'T', ' ', ' ', ' ', 
+' ', ' ', ' ', 'N', ' ', 'A', 'C', ' ', 'G', ' ', 
+' ', ' ', 'T', ' ', ' ', ' ', ' ', ' ', ' ', 'N', 
+' ', 'A', 'C', ' ', 'G', ' ', ' ', ' ', 'T', ' ', 
+' ', ' ', ' ', ' ', ' ', ' '};
+
+
+
+static unsigned char RefAlignmentByte[256] = {0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  1,  0,  2,  0,  0, 
+																							0,  4,  0,  0,  0,  0,  0,  0, 15,  0, 
+																							0,  0,  0,  0,  8,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  1,  0,  2, 
+																							0,  0,  0,  4,  0,  0,  0,  0,  0,  0, 
+																						   15,  0,  0,  0,  0,  0,  8,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																							0,  0,  0,  0,  0,  0};
+	
+
+static unsigned char QueryAlignmentByte[256] = { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  16,  0,  32,  0,  0, 
+																								 0,  64,  0,  0,  0,  0,  0,  0, 240,  0, 
+																								 0,  0,  0,  0,  128,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  16,  0,  32, 
+																								 0,  0,  0,  64,  0,  0,  0,  0,  0,  0, 
+																							   240,  0,  0,  0,  0,  0,  128,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+																								 0,  0,  0,  0,  0,  0};
+
+
+void MakeReverseComplementByteAlignment(const unsigned char *byteAlignment,
+                                        UInt length,
+                                        unsigned char *byteAlignmentRC) {
+  unsigned char q,t;
+  int i;
+  for (i = 0; i < length; i++) {
+    if (QueryChar[byteAlignment[i]] == ' ') { q = ' '; }
+    else { q = ReverseComplementNuc[QueryChar[byteAlignment[i]]]; }
+
+    if (RefChar[byteAlignment[i]] == ' ') { t = ' '; }
+    else { t = ReverseComplementNuc[RefChar[byteAlignment[i]]]; }
+    
+    byteAlignmentRC[length - i - 1] = QueryAlignmentByte[q] + RefAlignmentByte[t];
+  }
+}
+
+
+void ByteAlignmentToQueryString(const unsigned char* byteAlignment,
+																UInt length,
+																char* charAlignment) {
+	int i;
+	for (i = 0; i < length; i++) {
+		charAlignment[i] = QueryChar[byteAlignment[i]];
+	}
+}
+
+
+void ByteAlignmentToRefString(const unsigned char* byteAlignment,
+															UInt length,
+															char* charAlignment) {
+	int i;
+	for (i = 0; i < length; i++) {
+		charAlignment[i] = RefChar[byteAlignment[i]];
+	}
+}
+
+void RemoveGaps(string &gappedStr, string &ungappedStr) {
+	ungappedStr = gappedStr;
+	int i, i2;
+	i = i2 = 0;
+	for (i = 0;  i < ungappedStr.size(); i++ ){
+		if (ungappedStr[i] != ' ') {
+			ungappedStr[i2] = ungappedStr[i];
+			i2++;
+		}
+	}
+	ungappedStr.resize(i2);
+}
+
+
+void GappedStringsToAlignment(string &gappedQuery, string &gappedRef, Alignment &alignment) {
+int qPos = 0, rPos = 0;
+	int i = 0; // position in alignment string
+	while (i < gappedQuery.size()) {
+		while (i < gappedQuery.size() and (gappedQuery[i] == ' ' or gappedRef[i] == ' ')) {
+			if (gappedQuery[i] != ' ') {
+				qPos++;
+			}
+			if (gappedRef[i] != ' ') {
+				rPos++;
+			}
+			i++;
+		}
+		int queryBlockStart, queryBlockEnd, refBlockStart, refBlockEndl;
+		Block b;
+		b.qPos = qPos;
+		b.tPos = rPos;
+		while (i < gappedQuery.size() and gappedQuery[i] != ' ' and gappedRef[i] != ' ') {
+			i++;
+			qPos++;
+			rPos++;
+		}
+		b.length = qPos - b.qPos;
+		alignment.blocks.push_back(b);
+	}
+}
+
+
+void ByteAlignmentToAlignment(vector<unsigned char> &byteAlignment, Alignment &alignment) {
+	string readSequence, refSequence;
+	readSequence.resize(byteAlignment.size());
+	refSequence.resize(byteAlignment.size());
+	
+	ByteAlignmentToQueryString(&byteAlignment[0], byteAlignment.size(), &readSequence[0]);
+	ByteAlignmentToRefString(&byteAlignment[0], byteAlignment.size(), &refSequence[0]);				
+	GappedStringsToAlignment(readSequence, refSequence, alignment);
+}
+
+void AlignmentToByteAlignment(Alignment &alignment, 
+                              DNASequence &querySeq, DNASequence &refSeq,
+                              vector<unsigned char> &byteAlignment) {
+  string refStr, alignStr, queryStr;
+  CreateAlignmentStrings(alignment, querySeq, refSeq, 
+                         refStr, alignStr, queryStr);
+  byteAlignment.resize(refStr.size());
+  int i;
+  for (i = 0; i < refStr.size(); i++) {
+    byteAlignment[i] = RefAlignmentByte[refStr[i]] + QueryAlignmentByte[queryStr[i]];
+  }
+}
+
+bool IsMatch(vector<unsigned char> &byteAlignment, int i) {
+	if (QueryChar[byteAlignment[i]] != ' ' and 
+			RefChar[byteAlignment[i]] != ' ' and 
+			(QueryChar[byteAlignment[i]] == RefChar[byteAlignment[i]])) {
+		return true;
+	}
+	else {
+		return false;
+	}
+}
+
+void CountStats(vector<unsigned char> &byteAlignment, 
+								int &nMatch, int &nMismatch, int &nIns, int &nDel, 
+								int start=0, int end=-1) {
+	int i;
+	if (end == -1) {
+		end = byteAlignment.size();
+	}
+
+	nMatch = nMismatch = nIns = nDel = 0;
+
+	for (i = start; i < end; i++) {
+		if (QueryChar[byteAlignment[i]] == ' ') {
+			nDel++;
+		}
+		else if (RefChar[byteAlignment[i]] == ' ') {
+			nIns++;
+		}
+		else if (RefChar[byteAlignment[i]] != QueryChar[byteAlignment[i]]) {
+			nMismatch++;
+		}
+		else {
+			nMatch++;
+		}
+	}
+}
+
+int CountBasesInReference(vector<unsigned char> &byteAlignment) {
+	int i;
+	int nBases = 0;
+	for (i = 0; i < byteAlignment.size(); i++) {
+		if (RefChar[byteAlignment[i]] != ' ') {
+			nBases++;
+		}
+	}
+	return nBases;
+}
+
+int CountBasesInQuery(vector<unsigned char> &byteAlignment) {
+	int i;
+	int nBases = 0;
+	for (i = 0; i < byteAlignment.size(); i++) {
+		if (QueryChar[byteAlignment[i]] != ' ') {
+			nBases++;
+		}
+	}
+	return nBases;
+}
+
+int CountNMatches(vector<unsigned char> &byteAlignment) {
+	int nMatches = 0;
+	int i;
+	for (i = 0; i < byteAlignment.size(); i++) {
+		if (IsMatch(byteAlignment, i)) {
+			nMatches++;
+		}
+	}
+	return nMatches;
+}
+
+float ComputePacBioAccuracy(vector<unsigned char> &byteAlignment) {
+	int m, mm, i, d;
+	CountStats(byteAlignment, m, mm, d, i);
+	int readLength = CountBasesInQuery(byteAlignment);
+	return 1 - (1.0*mm + d + i)/readLength;
+}
+
+
+float ComputePercentIdentity(vector<unsigned char> &byteAlignment) {
+	int i;
+	int nMatch = CountNMatches(byteAlignment);
+	return (1.0*nMatch) / byteAlignment.size();
+}
+
+void CreateSequenceToAlignmentMap(vector<unsigned char> &byteAlignment, 
+                                  vector<int> &baseToAlignmentMap) {
+  int alignPos, ungappedAlignPos;
+  int alignmentLength = byteAlignment.size();
+  baseToAlignmentMap.resize(alignmentLength);
+  for (ungappedAlignPos = 0, alignPos = 0; 
+       alignPos < alignmentLength; 
+       alignPos++) {
+
+    if (QueryChar[byteAlignment[alignPos]] != ' ') {
+      baseToAlignmentMap[ungappedAlignPos] = alignPos;
+      ++ungappedAlignPos;
+    }
+  }
+  baseToAlignmentMap.resize(ungappedAlignPos);
+}			
+
+void CreateAlignmentToSequenceMap(vector<unsigned char> &byteAlignment, 
+                                  vector<int> &alignmentToBaseMap) {
+  int alignPos, ungappedAlignPos;
+  int alignmentLength = byteAlignment.size();
+  alignmentToBaseMap.resize(alignmentLength);
+  for (ungappedAlignPos = 0, alignPos = 0; 
+       alignPos < alignmentLength; 
+       alignPos++) {
+    if (QueryChar[byteAlignment[alignPos]] != ' ') {
+      alignmentToBaseMap[alignPos] = ungappedAlignPos;
+      ++ungappedAlignPos;
+    }
+  }
+}			
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/CmpFile.cpp b/libcpp/alignment/datastructures/alignment/CmpFile.cpp
new file mode 100644
index 0000000..9270fc9
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/CmpFile.cpp
@@ -0,0 +1,6 @@
+#include "CmpFile.hpp"
+
+void CmpFile::StoreReadType(std::string &readTypeStringP) {
+    readTypeString = readTypeStringP;
+    readType = ReadType::ParseReadType(readTypeString);
+}
diff --git a/libcpp/alignment/datastructures/alignment/CmpFile.hpp b/libcpp/alignment/datastructures/alignment/CmpFile.hpp
new file mode 100644
index 0000000..76682e4
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/CmpFile.hpp
@@ -0,0 +1,33 @@
+#ifndef _BLASR_CMP_FILE_HPP_
+#define _BLASR_CMP_FILE_HPP_
+
+#include "reads/ReadType.hpp"
+#include "datastructures/alignment/CmpIndexedStringTable.h"
+#include "saf/AlnGroup.hpp"
+#include "saf/AlnInfo.hpp"
+#include "saf/RefGroup.hpp"
+#include "saf/RefInfo.hpp"
+#include "saf/MovieInfo.hpp"
+#include "Enumerations.h"
+
+#include <vector>
+
+class CmpFile {
+ public:
+	int lastRow;
+    std::string readTypeString, index, version, commandLine;
+    ReadType::ReadTypeEnum readType;
+
+    void StoreReadType(std::string &readTypeStringP);
+
+    CmpIndexedStringTable readGroupTable, movieNameTable, refSeqTable;
+    vector<string> colNames;
+    PlatformId platformId;
+    AlnGroup  alnGroup;
+    AlnInfo   alnInfo;
+    RefGroup  refGroup;
+    RefInfo   refInfo;
+    MovieInfo movieInfo;
+};
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/CmpIndexedStringTable.h b/libcpp/alignment/datastructures/alignment/CmpIndexedStringTable.h
new file mode 100644
index 0000000..2530a40
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/CmpIndexedStringTable.h
@@ -0,0 +1,67 @@
+#ifndef DATASTRUCTURES_ALIGNMENT_CMP_INDEXED_STRING_TABLE_H_
+#define DATASTRUCTURES_ALIGNMENT_CMP_INDEXED_STRING_TABLE_H_
+
+#include <vector>
+#include <string>
+#include <map>
+using namespace std;
+
+class CmpIndexedStringTable {
+ public:
+
+	void resize(int size) {
+		names.resize(size);
+		ids.resize(size);
+	}
+
+	void StoreArrayIndexMap() {
+		int i;
+		for (i = 0; i < ids.size(); i++) {
+			idToArrayIndex[ids[i]] = i;
+		}
+	}
+
+    //
+    // The terminology of Index here is confusing.
+    // Actually 'Index' is equivalent to 'id'. 
+    // Each id represents index of an indexed string.
+    // That's why an id is called an 'Index' in this function.
+    // GetNameAtIndex returns name of an indexed string, 
+    // whose index is the given value
+    //
+	bool GetNameAtIndex(int index, string &name) {
+		map<int,int>::iterator mapIt;
+		mapIt = idToArrayIndex.find(index);
+		if (mapIt != idToArrayIndex.end()) {
+			name = names[mapIt->second];
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+
+    //
+    // Here 'Id' means indexes of indexed strings, 
+    // 'Index' means index of an 'Id' in ids
+    //
+	bool GetIndexOfId(int id, int &index) {
+		map<int,int>::iterator mapIt;
+		mapIt = idToArrayIndex.find(id);
+		if (mapIt != idToArrayIndex.end()) {
+			index = mapIt->second;
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	vector<int> ids;
+	vector<string> names;
+	map<int,int> idToArrayIndex;
+};
+
+
+
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/CmpReadGroupTable.h b/libcpp/alignment/datastructures/alignment/CmpReadGroupTable.h
new file mode 100644
index 0000000..92a070c
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/CmpReadGroupTable.h
@@ -0,0 +1,22 @@
+#ifndef DATASTRUCTURES_ALIGNMENT_CMP_READ_GROUP_TABLE_H_
+#define DATASTRUCTURES_ALIGNMENT_CMP_READ_GROUP_TABLE_H_
+
+#include <vector>
+#include <string>
+using namespace std;
+
+class CmpReadGroupTable {
+ public:
+	void resize(int size) {
+		readGroupNameIds.resize(size);
+		readGroupNames.resize(size);
+	}
+	vector<int>    readGroupNameIds;
+	vector<string> readGroupNames;
+	int lastRow;
+};
+
+
+
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/CmpRefSeqTable.h b/libcpp/alignment/datastructures/alignment/CmpRefSeqTable.h
new file mode 100644
index 0000000..91caf1b
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/CmpRefSeqTable.h
@@ -0,0 +1,22 @@
+#ifndef DATASTRUCTURES_ALIGNMENT_CMP_REF_SEQ_TABLE_H_
+#define DATASTRUCTURES_ALIGNMENT_CMP_REF_SEQ_TABLE_H_
+
+#include <vector>
+#include <string>
+using namespace std;
+
+class CmpRefSeqTable {
+ public:
+	void resize(int size) {
+		refSeqNameIds.resize(size);
+		refSeqNames.resize(size);
+	}
+	vector<int> refSeqNameIds;
+	vector<string> refSeqNames;
+	int lastRow;
+};
+
+
+
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/FilterCriteria.cpp b/libcpp/alignment/datastructures/alignment/FilterCriteria.cpp
new file mode 100644
index 0000000..16f4bff
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/FilterCriteria.cpp
@@ -0,0 +1,371 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  FilterCriteria.h
+ *
+ *    Description:  Criteria for filtering alignment hits. 
+ *
+ *        Version:  1.0
+ *        Created:  04/14/2015 11:33:00 AM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "FilterCriteria.hpp"
+
+Score::Score(const float & value, const ScoreSign & sign)
+    : _value(value)
+    , _sign(sign)
+{ }
+
+Score::Score(const Score & another) 
+    : _value(another._value)
+    , _sign(another._sign)
+{ }
+
+Score::~Score() { }
+
+float Score::Value() const { return _value; }
+
+ScoreSign Score::Sign() const { return _sign; }
+
+bool Score::operator == (const Score & another) const {
+    return (another.Value() - this->_value < errorunit and 
+            another.Value() - this->_value > -errorunit);
+}
+
+bool Score::BetterThan(const Score & another) const {
+    if (this->_value == another.Value()) return false;
+    if (this->_sign == ScoreSign::POSITIVE) return (this->_value > another.Value());
+    else return (this->_value < another.Value());
+}
+
+bool Score::BetterThanOrEqual(const Score & another) const {
+    return BetterThan(another) or ((*this) == another);
+}
+
+bool Score::WorseThan(const Score & another) const {
+    return (not BetterThanOrEqual(another));
+}
+
+/// -----------------------------------------
+/// HitPolicy 
+/// -----------------------------------------
+HitPolicy::HitPolicy(const std::string & hitPolicyStr, const ScoreSign & sign) {
+    // Create a multiple hit policy.
+    std::string str(hitPolicyStr);
+    std::transform(str.begin(), str.end(), str.begin(), ::toupper);
+
+    if (str == "RANDOM")    { _hit = HitPolicyEnum::RANDOM; }
+    else if (str == "ALL")  { _hit = HitPolicyEnum::ALL; }
+    else if (str == "ALLBEST") { _hit = HitPolicyEnum::ALLBEST; }
+    else if (str == "RANDOMBEST") { _hit = HitPolicyEnum::RANDOMBEST; }
+    else if (str == "LEFTMOST") { _hit = HitPolicyEnum::LEFTMOST; }
+    else {
+        std::cout <<"ERROR, the specified multiple hit policy "
+                  << hitPolicyStr <<" is not supported." << std::endl;
+        exit(1);
+    }
+
+    _sign = sign;
+}
+
+HitPolicy::~HitPolicy(void) { }
+
+ScoreSign HitPolicy::Sign() const {
+    return _sign;
+}
+
+bool HitPolicy::IsRandom() const { return _hit == HitPolicyEnum::RANDOM; }
+
+bool HitPolicy::IsRandombest() const { return _hit == HitPolicyEnum::RANDOMBEST; }
+
+bool HitPolicy::IsAll() const {return _hit == HitPolicyEnum::ALL; }
+
+bool HitPolicy::IsAllbest() const {return _hit == HitPolicyEnum::ALLBEST; }
+
+bool HitPolicy::IsLeftmost() const {return _hit == HitPolicyEnum::LEFTMOST; }
+
+const std::string HitPolicy::ToString() const {
+    switch (_hit) {
+        case (HitPolicyEnum::RANDOM)    : return "random";
+        case (HitPolicyEnum::RANDOMBEST): return "randombest";
+        case (HitPolicyEnum::ALL)       : return "all";
+        case (HitPolicyEnum::ALLBEST)   : return "allbest";
+        case (HitPolicyEnum::LEFTMOST)  : return "leftmost";
+        default: {
+            assert(false);
+        }
+    }
+}
+
+std::ostream & HitPolicy::operator << (std::ostream & os) {
+    return os << this->ToString();
+}
+
+const std::string HitPolicy::Help(const std::string & pad) const{
+    std::stringstream ss;
+    ss << "(" << this->ToString() 
+       << ") Specify a policy to treat multiple hits from "
+       << "[all, allbest, random, randombest, leftmost]\n" << pad
+       << "  all       : report all alignments.\n" << pad
+       << "  allbest   : report all equally top scoring alignments.\n"  << pad
+       << "  random    : report a random alignment.\n" << pad
+       << "  randombest: report a random alignment from multiple "
+       << "equally top scoring alignments.\n" << pad
+       << "  leftmost  : report an alignment which has the best alignment" 
+       << "score and has the smallest mapping coordinate in any reference.";
+    return ss.str();
+}
+
+std::vector<T_AlignmentCandidate*> 
+HitPolicy::Apply(const std::vector<T_AlignmentCandidate*> alnPtrs, 
+                 const bool & createRand,
+                 const int  & passedRand) const {
+    // Shallow copy pointers.
+    if (alnPtrs.empty() or IsAll()) return alnPtrs;
+
+    int rint = createRand?rand():passedRand;
+    if (IsRandom()) {
+        return std::vector<T_AlignmentCandidate*>({alnPtrs[rint%alnPtrs.size()]});
+    }
+
+    std::vector<T_AlignmentCandidate*> ret = alnPtrs;
+    // Sort AlignmentCandidate pointers according to score and target start position.
+    ScoreSign sign = this->Sign();
+    std::sort(ret.begin(), ret.end(), SortAlignmentPointersByScore()); 
+
+    // Get the best alignments whose alignment scores are the best.
+    // Assume that input alignments share the same query name and
+    // are sorted by score and tPos asscendingly: worst, ...., best
+    int bestScore = ret[0]->score;
+    ret.erase(std::remove_if(ret.begin(), ret.end(),
+              [&bestScore](const T_AlignmentCandidate* x)->bool{return x->score != bestScore;}),
+              ret.end());
+
+    if (IsAllbest()) {
+        return ret;
+    } else if (IsRandombest()) {
+        return std::vector<T_AlignmentCandidate*>({ret[rint%ret.size()]});
+    } else if (IsLeftmost()) {
+        return std::vector<T_AlignmentCandidate*>({ret[0]});
+    } else {
+        assert("Unsupported hit policy" == 0);
+    }
+}
+
+/*
+std::vector<AlignmentCandidate<>> HitPolicy::Apply(std::vector<AlignmentCandidate<>> & records) const {
+    if (records.empty() or IsALL()) return;
+    sort(records.begin(), records.end(), compareByQNameScoreTStart);
+    assert(records.size() > 0);
+
+    if (IsRandom) {
+        //records = vector<AlignmentCandidate>({records[
+    }
+}
+*/
+
+#ifdef USE_PBBAM
+bool HitPolicy::compareByQNameScoreTStart(const PacBio::BAM::BamRecord & a, const PacBio::BAM::BamRecord & b) const {
+    assert(a.Impl().HasTag(AS) and b.Impl().HasTag(AS));
+    const int aScore = a.Impl().TagValue(AS).ToInt32();
+    const int bScore = b.Impl().TagValue(AS).ToInt32();
+    if (a.FullName() == b.FullName()) {
+        if (aScore == bScore)
+            return a.ReferenceStart() < b.ReferenceEnd();
+        return Score(aScore, _sign).WorseThan(Score(bScore, _sign));
+    }
+    return (a.FullName() < b.FullName());
+}
+
+bool HitPolicy::compareByScoreTStart(const PacBio::BAM::BamRecord & a, const PacBio::BAM::BamRecord & b) const {
+    assert(a.Impl().HasTag(AS) and b.Impl().HasTag(AS));
+    assert(a.FullName() == b.FullName());
+    const int aScore = a.Impl().TagValue(AS).ToInt32();
+    const int bScore = b.Impl().TagValue(AS).ToInt32();
+    if (aScore == bScore)
+        return a.ReferenceStart() < b.ReferenceEnd();
+    return Score(aScore, _sign).WorseThan(Score(bScore, _sign));
+}
+
+std::vector<PacBio::BAM::BamRecord> 
+HitPolicy::Apply(const std::vector<PacBio::BAM::BamRecord> & records,
+                 const bool & createRand,
+                 const int  & passedRand) const {
+    if (records.empty() or IsAll()) return records;
+
+    int rint = createRand?rand():passedRand;
+    //cout << "FilterCriteria " << ", " << records[0].FullName() << ", " << rint << endl;
+    if (IsRandom()) {
+        return std::vector<PacBio::BAM::BamRecord>({records[rint%records.size()]});
+    }
+
+    std::vector<PacBio::BAM::BamRecord> ret = records;
+    // Sort bam records according to score and target start position.
+    ScoreSign sign = this->Sign();
+    std::sort(ret.begin(), ret.end(), 
+              [&sign](const PacBio::BAM::BamRecord & a, 
+                      const PacBio::BAM::BamRecord & b)->bool {
+                      assert(a.Impl().HasTag(AS) and b.Impl().HasTag(AS));
+                      assert(a.FullName() == b.FullName());
+                      const int aScore = a.Impl().TagValue(AS).ToInt32();
+                      const int bScore = b.Impl().TagValue(AS).ToInt32();
+                      if (aScore == bScore) return a.ReferenceStart() < b.ReferenceEnd();
+                      else return Score(aScore, sign).WorseThan(Score(bScore, sign));
+              });
+
+    // Get the best alignments whose alignment scores are the best.
+    // Assume that input alignments share the same query name and
+    // are sorted by score and tPos asscendingly: worst, ...., best
+    int bestScore = ret[0].Impl().TagValue(AS).ToInt32();
+    ret.erase(std::remove_if(ret.begin(), ret.end(),
+              [&bestScore](const PacBio::BAM::BamRecord & x)->bool{return x.Impl().TagValue(AS).ToInt32() != bestScore;}),
+              ret.end());
+
+    if (IsAllbest()) {
+        return ret;
+    } else if (IsRandombest()) {
+        return std::vector<PacBio::BAM::BamRecord>({ret[rint%ret.size()]});
+    } else if (IsLeftmost()) {
+        return std::vector<PacBio::BAM::BamRecord>({ret[0]});
+    } else {
+        assert("Unsupported hit policy" == 0);
+    }
+}
+#endif
+
+/// -----------------------------------------
+/// FilterCriteria
+/// -----------------------------------------
+FilterCriteria::FilterCriteria(const DNALength & minAlnLength,
+                               const float & minPctSimilarity,
+                               const float & minPctAccuracy,
+                               const bool & useScore,
+                               const Score & score)
+    : _minAlnLength(minAlnLength)
+    , _minPctSimilarity(minPctSimilarity)
+    , _minPctAccuracy(minPctAccuracy)
+    , _useScore(useScore)
+    , _scoreCutoff(score)
+    , _verbose(false)
+{ }
+
+FilterCriteria::~FilterCriteria(void) { }
+
+/*
+const std::string FilterCriteria::Help(const std::string & pad) {
+    return std::string (pad + minAlnLengthHelp() +
+                        pad + minPctSimilarityHelp() +
+                        pad + minPctAccuracyHelp() +
+                        pad + scoreSignHelp() + 
+                        pad + scoreCutoffHelp());
+}*/
+
+const std::string FilterCriteria::MinAlnLengthHelp() {
+    return std::string("(") + std::to_string(_minAlnLength) + ") " +
+           "Report alignments only if their lengths are greater than minAlnLength.";
+}
+
+const std::string FilterCriteria::MinPctSimilarityHelp() {
+    return std::string("(") + std::to_string(static_cast<int>(_minPctSimilarity)) + ") " +
+           "Report alignments only if their percentage similairty is greater than minPctSimilarity.";
+}
+
+const std::string FilterCriteria::MinPctAccuracyHelp() {
+    return std::string("(") + std::to_string(static_cast<int>(_minPctAccuracy)) + ") " + 
+           "Report alignments only if their percentage accuray is greater than minAccuracy.";
+}
+
+const std::string FilterCriteria::ScoreSignHelp() {
+    return "(-1) Whether higher or lower scores are better. -1: lower is better; 1: higher is better.";
+}
+
+const std::string FilterCriteria::ScoreCutoffHelp() {
+    return "(INF) Report alignments only if their scores are no worse than score cut off.";
+}
+
+bool FilterCriteria::MakeSane(std::string & errMsg) const{
+    if (_minPctSimilarity > 100 or _minPctSimilarity < 0) {
+        errMsg = "ERROR, minimum similarity not in [0, 100].";
+        return false;
+    }
+    if (_minPctAccuracy > 100 or _minPctAccuracy < 0) {
+        errMsg = "ERROR, minimum accuracy not in [0, 100].";
+        return false;
+    }
+    return true;
+}
+
+void FilterCriteria::Verbose(bool verbose) { _verbose = verbose; }
+
+/*
+template<typename T_TSequence, typename T_QSequence>
+bool FilterCriteria::Satisfy(AlignmentCandidate<T_TSequence, T_QSequence> & a) const;
+//bool FilterCriteria::Satisfy(AlignmentCandidate<> & a) const {
+    float pctAccuracy = 100 * a.nMatch / static_cast<float>(a.nMismatch
+                        + a.nMatch + a.nIns + a.nDel);
+    Score s(a.score, _scoreCutoff.Sign());
+    return Satisfy(a.qAlignedSeqLength, a.pctSimilarity, pctAccuracy, s);
+}
+*/
+
+bool FilterCriteria::Satisfy(const DNALength & alnLength, 
+                             const float & pctSimilarity, 
+                             const float & pctAccuracy,
+                             const Score & score) const {
+    if (alnLength < _minAlnLength) {
+        if (_verbose > 0) 
+            std::cout << "Alignment length " << alnLength << " is too short." << std::endl;
+        return false;
+    } 
+    if (pctSimilarity < _minPctSimilarity) {
+        if (_verbose > 0) 
+            std::cout << "Percentage similarity " << pctSimilarity << " is too low." << std::endl;
+        return false;
+    }
+    if (pctAccuracy < _minPctAccuracy) {
+        if (_verbose > 0)
+            std::cout << "Percentage accuracy " << pctAccuracy << " is too low." << std::endl;
+        return false;
+    }
+    if (_useScore and not score.BetterThanOrEqual(_scoreCutoff)) {
+        if (_verbose) 
+            std::cout << "Alignment score " << score.Value() << " worse than cut off." << std::endl;
+        return false;
+    }
+
+    return true;
+}
+
+#ifdef USE_PBBAM
+bool FilterCriteria::Satisfy(const PacBio::BAM::BamRecord & record) const {
+    assert(record.IsMapped() and record.Impl().HasTag(AS));
+    DNALength alnLength = static_cast<DNALength>(record.Sequence(PacBio::BAM::Orientation::NATIVE, true, true).size());
+    PacBio::BAM::Cigar cigar = record.CigarData();
+
+    uint32_t nMatch = 0, nMismatch = 0, nIns = 0, nDel = 0;
+    for(auto op: cigar) {
+        uint32_t n = op.Length();
+        switch (op.Type()) {
+            case PacBio::BAM::CigarOperationType::SEQUENCE_MATCH: nMatch += n; break;
+            case PacBio::BAM::CigarOperationType::SEQUENCE_MISMATCH: nMismatch += n; break;
+            case PacBio::BAM::CigarOperationType::ALIGNMENT_MATCH: nMismatch += n; break;
+            case PacBio::BAM::CigarOperationType::INSERTION: nIns += n; break;
+            case PacBio::BAM::CigarOperationType::DELETION: nDel += n; break;
+            default: break;
+        }
+    }
+    //TODO: Use = X instead of M in blasr.
+
+    float pctSimilarity = 100 * nMatch / static_cast<float>(alnLength);
+    float pctAccuracy = 100 * nMatch / static_cast<float>(nMismatch + nMatch + nIns + nDel);
+    Score s(static_cast<float>(record.Impl().TagValue("AS").ToInt32()), ScoreSign::NEGATIVE);
+    return Satisfy(alnLength, pctSimilarity, pctAccuracy, s);
+}
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/FilterCriteria.hpp b/libcpp/alignment/datastructures/alignment/FilterCriteria.hpp
new file mode 100644
index 0000000..778e659
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/FilterCriteria.hpp
@@ -0,0 +1,165 @@
+#ifndef _BLASR_FILTER_CRITERIA_HPP_
+#define _BLASR_FILTER_CRITERIA_HPP_
+#include <string>
+#include <iostream>
+#include <vector>
+#include <algorithm> // transform
+#include <ctype.h>   // toupper
+#include "AlignmentCandidate.hpp"
+
+
+/// POSITIVE - larger score value is better.
+/// NEGATIVE - smaller score value is better.
+enum class ScoreSign {NEGATIVE=-1, POSITIVE=1};
+static const std::string AS = "AS";
+
+class Score {
+public:
+    Score(const float & value, const ScoreSign & sign);
+    Score(const Score & another);
+    ~Score();
+
+    /// \returns float score value in [0, 100]
+    float Value() const;
+
+    /// \returns score sign, NEGATIVE or POSITIVE
+    ScoreSign Sign() const;
+
+    bool operator == (const Score & another) const;
+
+    /// \returns true if this score value is better than another's.
+    bool BetterThan(const Score & another) const;
+
+    /// \returns true if this score value is better than or equal to another's.
+    bool BetterThanOrEqual(const Score & another) const; 
+
+    /// \returns true if this score value is worse than another's.
+    bool WorseThan(const Score & another) const;
+
+private:
+    float _value;
+    ScoreSign _sign;
+    static constexpr float errorunit = 1e-6;
+};
+
+class HitPolicy {
+    /// \name Hit Policy
+    /// \{
+public:
+
+    /// \note Constructor
+    HitPolicy(const std::string & hitPolicyStr, const ScoreSign & sign);
+    ~HitPolicy(void);
+
+    const std::string ToString() const;
+    std::ostream & operator << (std::ostream & os);
+
+    /// \returns score sign, NEGATIVE or POSITIVE
+    ScoreSign Sign() const;
+
+    /// \returns a help string describing hit policies.
+    const std::string Help(const std::string & pad = "") const;
+
+    /// \returns true if HitPolicy is RANDOM.
+    bool IsRandom() const;
+
+    /// \returns true if HitPolicy is RANDOMBEST.
+    bool IsRandombest() const;
+
+    /// \returns true if HitPolicy is ALL.
+    bool IsAll() const;
+
+    /// \returns true if HitPolicy is ALLBEST.
+    bool IsAllbest() const;
+
+    /// \returns true if HitPolicy is LEFTMOST.
+    bool IsLeftmost() const;
+
+    /// Apply hit policy on a list of AlignmentCandidate pointers.
+    /// \returns apply hit policy and return alignment candidate pointers.
+    /// \params createRand, call rand() to generate a random number 
+    ///         or use the random number passed from caller.
+    /// \params passedRand, random int passed from caller
+    std::vector<T_AlignmentCandidate*> 
+    Apply(const std::vector<T_AlignmentCandidate*> alnPtrs, 
+          const bool & createRand = true,
+          const int  & passedRand = 0) const;
+
+    //std::vector<AlignmentCandidate<>> & 
+    //Apply(std::vector<AlignmentCandidate<>> & records) const;
+
+#ifdef USE_PBBAM
+    /// Compare aligned bamRecords by query names, scores and target positions.
+    bool compareByQNameScoreTStart(const PacBio::BAM::BamRecord & a, 
+                                   const PacBio::BAM::BamRecord & b) const;
+
+    /// Compare aligned bamRecords by scores and target positions.
+    /// \note BamRecords must share the same query name.
+    bool compareByScoreTStart(const PacBio::BAM::BamRecord & a, 
+                              const PacBio::BAM::BamRecord & b) const;
+
+    std::vector<PacBio::BAM::BamRecord> 
+    Apply(const std::vector<PacBio::BAM::BamRecord> & records,
+          const bool & createRand = true,
+          const int  & passedRand = 0) const;
+#endif
+
+private:
+    enum class HitPolicyEnum{RANDOM, ALL, ALLBEST, RANDOMBEST, LEFTMOST};
+    HitPolicyEnum _hit;
+    ScoreSign _sign;
+    /// \}
+};
+
+class FilterCriteria {
+    /// \name FilterCriteria
+    /// \{
+public:
+    FilterCriteria(const DNALength & minAlnLength,
+                   const float & minPctSimilarity,
+                   const float & minPctAccuracy,
+                   const bool & useScore,
+                   const Score & score); 
+    ~FilterCriteria(void);
+    bool MakeSane(std::string & errMsg) const;
+    void Verbose(bool verbose);
+
+    template<typename T_TSequence, typename T_QSequence>
+    bool Satisfy(AlignmentCandidate<T_TSequence, T_QSequence> * a) const;
+
+#ifdef USE_PBBAM
+    bool Satisfy(const PacBio::BAM::BamRecord & record) const;
+#endif
+
+public:
+    /// \retuns a string describing criteria for filtering alignments.
+    // const std::string Help(const std::string & pad = "");
+    const std::string MinAlnLengthHelp();
+    const std::string MinPctSimilarityHelp();
+    const std::string MinPctAccuracyHelp();
+    const std::string ScoreSignHelp();
+    const std::string ScoreCutoffHelp();
+
+private:
+    DNALength _minAlnLength;
+    float _minPctSimilarity;
+    float _minPctAccuracy;
+    bool _useScore;
+    Score _scoreCutoff;
+    bool _verbose;
+
+    bool Satisfy(const DNALength & alnLength, 
+                 const float & pctSimilarity, 
+                 const float & pctAccuracy,
+                 const Score & score) const;
+    /// \}
+};
+
+template<typename T_TSequence, typename T_QSequence>
+bool FilterCriteria::Satisfy(AlignmentCandidate<T_TSequence, T_QSequence> * a) const {
+    float pctAccuracy = 100 * a->nMatch / static_cast<float>(a->nMismatch
+            + a->nMatch + a->nIns + a->nDel);
+    Score s(a->score, _scoreCutoff.Sign());
+    return Satisfy(a->qAlignedSeqLength, a->pctSimilarity, pctAccuracy, s);
+}
+#endif //_BLASR_FILTER_CRITERIA_HPP_
diff --git a/libcpp/alignment/datastructures/alignment/Path.h b/libcpp/alignment/datastructures/alignment/Path.h
new file mode 100644
index 0000000..a71b605
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/Path.h
@@ -0,0 +1,23 @@
+#ifndef _BLASR_PATH_H_
+#define _BLASR_PATH_H_
+
+enum Arrow { Diagonal, Up, Left, 
+    AffineInsUp, AffineInsOpen, AffineInsClose,
+    AffineDelLeft, AffineDelOpen, AffineDelClose,
+    AffineHPInsUp, AffineHPInsOpen, AffineHPInsClose,
+    NoArrow,
+    DiagonalXYZ,
+    InsertX,InsertY,InsertZ, // imply diagonal yz/xz/xy
+    DiagonalXY, DiagonalYZ, DiagonalXZ,  // imply insertion of Z/X/Y,
+    //
+    // These are used to denote an affine gap has been closed
+    // from a different matrix.  This is used in OneGap alignment.
+    // 
+    AffineLongDelLeft, AffineLongDelClose, 
+    AffineLongIns, AffineLongInsClose,
+    Star
+};
+
+enum MatrixLabel {Match, AffineHPIns, AffineIns, AffineDel, AffineHPDel};
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignment/SAMToAlignmentCandidateAdapter.cpp b/libcpp/alignment/datastructures/alignment/SAMToAlignmentCandidateAdapter.cpp
new file mode 100644
index 0000000..32de362
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/SAMToAlignmentCandidateAdapter.cpp
@@ -0,0 +1,461 @@
+#include <algorithm>
+#include "utils/SMRTTitle.hpp"
+#include "SAMToAlignmentCandidateAdapter.hpp"
+
+void InitializeCandidateFromSAM(SAMAlignment &sam,
+                                AlignmentCandidate<> &candidate) {
+  candidate.qName = sam.qName;
+  candidate.tName = sam.rName;
+  candidate.tPos  = sam.pos;
+  candidate.mapQV = sam.mapQV;
+}
+
+int ProcessGap(std::vector<int> &lengths, std::vector<char> &ops, 
+               int &opIndex, int opEnd, blasr::GapList &gaps, 
+               int &qAdvance, int &tAdvance) {
+  //
+  // Default is no gap.
+  //
+  qAdvance = tAdvance = 0;
+  gaps.clear();
+  if (opIndex >= lengths.size()) {
+    return opIndex;
+  }
+
+  //
+  // Look to see if the suffix of operations stars with a gap.
+  //
+  if (ops[opIndex] != 'I' and
+      ops[opIndex] != 'D') {
+    return opIndex;
+  }
+
+  while (opIndex < opEnd and (ops[opIndex] == 'I' or ops[opIndex] == 'D')) {
+    if (ops[opIndex] == 'I') {
+      gaps.push_back(blasr::Gap(blasr::Gap::Target, lengths[opIndex]));
+      qAdvance += lengths[opIndex];
+    }
+    else {
+      assert(ops[opIndex] == 'D');
+      gaps.push_back(blasr::Gap(blasr::Gap::Query, lengths[opIndex]));
+      tAdvance += lengths[opIndex];
+    }
+    opIndex++;
+  }
+  return opIndex;
+}
+
+int AdvancePastClipping(std::vector<int> &lengths,
+                        std::vector<char> &ops,
+                        int &opIndex,
+                        int &numSoftClipped) {
+  int numClipped = 0;
+  numSoftClipped = 0;
+  while (opIndex < lengths.size() and IsClipping(ops[opIndex])) {
+    numClipped += lengths[opIndex];
+    if (ops[opIndex] == 'S') {
+      numSoftClipped+= lengths[opIndex];
+    }
+
+    ++opIndex;
+  }
+  return numClipped;
+}
+
+int AdvancePastSkipped(std::vector<int> &lengths,
+                       std::vector<char> &ops,
+                       int &opIndex) {
+  int numSkipped = 0;
+  while (opIndex < lengths.size() and IsSkipped(ops[opIndex])) {
+    numSkipped += lengths[opIndex];
+    opIndex++;
+  }
+  return numSkipped;
+}
+
+int ProcessMatch(std::vector<int> &lengths, std::vector<char> &ops,
+                  int &opIndex, int opEnd) {
+
+  //
+  // Make sure this starts on some sort of blockn
+  //
+
+  int blockLength = 0;
+  while (opIndex < opEnd and (IsAssignChar(ops[opIndex]))) {
+    blockLength += lengths[opIndex];
+    opIndex++;
+  }
+  return blockLength;
+}
+
+void CIGAROpsToBlocks(std::vector<int> &lengths, std::vector<char> &ops,
+                      int cigarStart,
+                      int cigarEnd,
+                      AlignmentCandidate<> &aln) {
+  cigarStart = 0;
+  cigarEnd   = lengths.size();
+  CIGAROpsToBlocks(lengths, ops, cigarStart, cigarEnd, aln);
+}
+
+int AdvancePosToAlignmentEnd(std::vector<char> &ops, int &pos) {
+  int start = pos;
+  while (pos < ops.size() and ops[pos] != 'N' and !IsClipping(ops[pos])) {
+    pos++;
+  }
+  return pos - start;
+}
+
+int GetAlignedQueryLengthByCIGARSum(std::vector<char> &ops, std::vector<int> &lengths) {
+  int i;
+  for (i = 0; i < ops.size(); i++) {
+    if (ops[i] != 'S' && ops[i] != 'H') {
+      break;
+    }
+  }
+  int queryLength = 0;
+  for (; i < ops.size() && ops[i] != 'S' && ops[i] != 'H'; i++) {
+    if (IsAssignChar(ops[i]) or ops[i] == 'I' or ops[i] == 'N') {
+      queryLength += lengths[i];
+    }
+  }
+  return queryLength;
+}
+
+int GetAlignedReferenceLengthByCIGARSum(std::vector<char> &ops, std::vector<int> &lengths) {
+  int i;
+  for (i = 0; i < ops.size(); i++) {
+    if (ops[i] != 'S' && ops[i] != 'H') {
+      break;
+    }
+  }
+  int refLength = 0;
+  for (; i < ops.size() && ops[i] != 'S' && ops[i] != 'H'; i++) {
+    if (IsAssignChar(ops[i]) or ops[i] == 'D' or ops[i] == 'N') {
+      refLength += lengths[i];
+    }
+  }
+  return refLength;
+}
+
+void CIGAROpsToBlocks(std::vector<int> &lengths, std::vector<char> &ops,
+                      int &cigarPos,
+                      int &cigarEnd,
+                      int &qPos, int &tPos,
+                      AlignmentCandidate<> &aln) {
+
+  int gapIndex = 0;
+  DNALength qStart = qPos, tStart = tPos;
+  assert(cigarPos >= cigarEnd or !IsClipping(ops[cigarPos]));
+
+  //
+  // Advance past any skipped portion.
+  //
+  int numSkipped = AdvancePastSkipped(lengths, ops, cigarPos);
+  tPos += numSkipped;
+
+  //
+  // Process the gaps before the first match.
+  //
+
+  //
+  // If there is nothing left, just bail.
+  blasr::GapList gap;
+
+  cigarEnd = cigarPos;
+  AdvancePosToAlignmentEnd(ops, cigarEnd);
+  if (cigarPos >= cigarEnd) {
+    return;
+  }
+  
+  // 
+  // Process any gap that the aligner produces before the first match
+  // begins.
+  //
+  int qAdvance, tAdvance;
+  ProcessGap(lengths, ops, cigarPos, cigarEnd, gap, qAdvance, tAdvance);
+  aln.gaps.push_back(gap);
+  qPos += qAdvance;
+  tPos += tAdvance;
+  //
+  // Now add gaps.
+  //
+  while(cigarPos < cigarEnd) {
+    //
+    // The next operation must be a match.
+    //
+    int matchLength = ProcessMatch(lengths, ops, cigarPos, cigarEnd);
+    blasr::Block b;
+    b.qPos = qPos - qStart;
+    b.tPos = tPos - tStart;
+    b.length = matchLength;
+    aln.blocks.push_back(b);
+    qPos += b.length;
+    tPos += b.length;
+
+    ProcessGap(lengths, ops, cigarPos, cigarEnd, gap, qAdvance, tAdvance);
+    aln.gaps.push_back(gap);
+    tPos += tAdvance;
+    qPos += qAdvance;
+  }
+  
+}
+
+void SAMAlignmentsToCandidates(SAMAlignment &sam,
+                               std::vector<FASTASequence> &referenceSequences,
+                               std::map<std::string,int> & refNameToRefListIndex,
+                               std::vector<AlignmentCandidate<> > &candidates, 
+                               bool parseSmrtTitle,
+                               bool keepRefAsForward,
+                               bool copyQVs) {
+  //
+  // First determine how many alignments there are from CIGAR string.
+  //
+  std::vector<int> lengths;
+  std::vector<char> ops;
+  sam.cigar.Vectorize(lengths, ops);
+
+  DNASequence querySeq;
+  // For now just reference the query sequence.
+  querySeq.deleteOnExit = false;
+  querySeq.seq = (Nucleotide*) sam.seq.c_str();
+  querySeq.length = sam.seq.size();
+
+  DNALength samTEnd = 0;
+  DNALength samTStart = sam.pos - 1;
+
+  std::vector<std::string> optionalQVs;
+  if (copyQVs) {
+      sam.CopyQVs(&optionalQVs);    
+  }
+  if (keepRefAsForward == false and IsReverseComplement(sam.flag)) {
+    ReverseAlignmentOperations(lengths, ops);
+    DNASequence rcQuerySeq;
+    querySeq.CopyAsRC(rcQuerySeq);
+    //
+    // Zero out the query seq so that the string memory is not
+    // deleted.
+    //
+    querySeq.seq = NULL;
+    querySeq.length = 0;
+    querySeq = rcQuerySeq;
+    rcQuerySeq.Free();
+    samTEnd = GetAlignedReferenceLengthByCIGARSum(ops, lengths);
+    
+    // We also need to reverse any optional QVs
+    if (copyQVs) {
+      for(int i=0; i<optionalQVs.size(); i++) {
+        std::reverse(optionalQVs[i].begin(), optionalQVs[i].end());
+      }
+    }
+  }
+
+
+  int i;
+  int offset = 0;
+  if (ops.size() == 0) {
+    return;
+  }
+  bool alignmentStarted = false;
+  bool onFirstMatch = true;
+  int  curAlignment;
+  
+  //
+  // Advance past any clipping.  This advances in both query and
+  // reference position.
+  //
+  int cigarPos = 0;
+  int qPos = 0; 
+  int tPos = 0;
+
+  DNALength queryPosOffset = 0;
+  if (parseSmrtTitle) {
+    //
+    // The aligned sequence is really a subread of a full
+    // sequence. The position of the aligments start at 0, the
+    // beginning of the query sequence, but in the sam file, they
+    // may appear as subreads, and are offset from the start of the
+    // subread.  By convention, the subread coordinates are embedded
+    // in the title of the query, if it is a smrtTitle. 
+    // Two types of smrtTitle are supported:
+    // movie/zmw/start_end
+    // movie/zmw/start_end/start2_end2
+    SMRTTitle stitle = SMRTTitle(sam.qName);
+
+    if (not stitle.isSMRTTitle) {
+      std::cout << "ERROR. Could not parse title " << sam.qName << std::endl;
+      exit(1);
+    }
+    queryPosOffset = stitle.start;
+  }
+  else if (sam.xs) {
+    queryPosOffset += sam.xs - 1;
+  }
+
+
+  while (cigarPos < lengths.size()) {
+    int numClipped;
+    //
+    // Sequence clipping becomes offsets into the q/t alignedSeqPos
+    //
+
+
+    int numSoftClipped;
+    numClipped = AdvancePastClipping(lengths, ops, cigarPos, numSoftClipped);
+
+    //
+    // End loop now.
+    //
+    if (cigarPos >= lengths.size()) {
+      break;
+    }
+    qPos += numSoftClipped;
+
+    //
+    // Skipped sequences are just advances in the tPos.
+    //
+    int numSkipped = AdvancePastSkipped(lengths, ops, cigarPos);
+    tPos += numSkipped;
+
+    if (cigarPos >= lengths.size()) {
+      break;
+    }
+
+
+    AlignmentCandidate<> alignment;
+    //
+    // The aligned sequence must start at a match therefore the tpos
+    // and qpos are 0.
+    //
+    alignment.qPos = 0;
+    alignment.tPos = 0;
+
+    // qAlignStart is the start of the alignment relative to the sequence in the SAM file.
+    DNALength qAlignStart = qPos;
+    // tAlignStart is the start of the alignment in the genome.
+    DNALength tAlignStart = tPos;
+    
+    int cigarEnd = cigarPos;
+    AdvancePosToAlignmentEnd(ops, cigarEnd);
+
+    CIGAROpsToBlocks(lengths, ops,          
+                     cigarPos, cigarEnd,
+                     qPos, tPos,
+                     alignment);
+
+
+    DNALength queryLengthSum = GetAlignedQueryLengthByCIGARSum(ops, lengths);
+    DNALength refLengthSum   = GetAlignedReferenceLengthByCIGARSum(ops, lengths);
+    alignment.qAlignedSeqLength = qPos - qAlignStart;
+    alignment.tAlignedSeqLength = tPos - tAlignStart;
+
+    //
+    // Assign candidate sequences.
+    //
+    // First, the query sequence is straight from the SAM line.
+    ((DNASequence*)&alignment.qAlignedSeq)->Copy(querySeq, qAlignStart, alignment.qAlignedSeqLength);
+    if (copyQVs) {
+      alignment.ReadOptionalQVs(optionalQVs, qAlignStart, alignment.qAlignedSeqLength);
+    }
+    
+    // The SAM Alignments a
+    alignment.qStrand = IsReverseComplement(sam.flag);
+    alignment.tStrand = 0;
+    alignment.mapQV   = sam.mapQV;
+
+    //
+    // Assign the offsets into the original sequence where the
+    // subsequence starts.
+    //
+
+    alignment.qAlignedSeqPos = queryPosOffset + qAlignStart;    
+    alignment.tAlignedSeqPos = samTStart + tAlignStart;
+    
+    if (sam.rName == "*") {
+      //
+      // No reference, do not add the alignment to the list of
+      // candidates.
+      //
+      continue;
+    }
+    else {
+      int refIndex;
+      int s = refNameToRefListIndex.size();
+      if (refNameToRefListIndex.find(sam.rName) == refNameToRefListIndex.end()) {
+        std::cout <<" ERROR.  SAM Reference " << sam.rName << " is not found in the list of reference contigs." << std::endl;
+        exit(1);
+      }
+      
+      refIndex = refNameToRefListIndex[sam.rName];
+     
+      alignment.tLength = referenceSequences[refIndex].length;
+      alignment.qLength = sam.seq.size(); 
+      alignment.qName = sam.qName;
+      alignment.tName = sam.rName;
+
+
+      if (keepRefAsForward == false and alignment.qStrand == 1) {
+
+        //
+        // Now that the reference sequence has been copied, if it is
+        // on the reverse strand, make the reverse complement for
+        // proper printing.
+        //
+        alignment.tAlignedSeqPos = samTStart + (samTEnd - tAlignStart - alignment.tAlignedSeqLength);
+		if (alignment.tAlignedSeqLength > referenceSequences[refIndex].length ||
+			alignment.tAlignedSeqPos    > referenceSequences[refIndex].length ||
+			alignment.tAlignedSeqLength + alignment.tAlignedSeqPos > referenceSequences[refIndex].length + 2) {
+            //alignment.tAlignedSeqPos is 1 based and unsigned.
+			std::cout << "WARNING. The mapping of read " << alignment.qName  
+				 << " to reference "      << alignment.tName 
+                 << " is out of bounds."  << std::endl
+                 << "         StartPos (" << alignment.tAlignedSeqPos  
+                 << ") + AlnLength (" << alignment.tAlignedSeqLength 
+                 << ") > RefLength (" << referenceSequences[refIndex].length
+                 << ") + 2 "          << std::endl;
+            continue;
+		}
+        ((DNASequence*)&alignment.tAlignedSeq)->Copy(referenceSequences[refIndex], alignment.tAlignedSeqPos, alignment.tAlignedSeqLength);             
+        alignment.tAlignedSeq.ReverseComplementSelf();
+        // either ref or read is defined as being in the forward
+        // orientation.  Here, since refAsForward is false, the read
+        // is forward.  Since the read is forward, the aligned
+        // sequences are stored as the reverse complement of the read
+        // and the references.
+        //
+        alignment.tStrand = 1;
+        alignment.qStrand = 0;
+      }
+      else {
+        if (alignment.tAlignedSeqLength > referenceSequences[refIndex].length ||
+			alignment.tAlignedSeqPos    > referenceSequences[refIndex].length ||
+			alignment.tAlignedSeqLength + alignment.tAlignedSeqPos > referenceSequences[refIndex].length + 2) {
+            //alignment.tAlignedSeqPos is 1 based and unsigned. 
+			std::cout << "WARNING. The mapping of read " << alignment.qName  
+				 << " to reference "      << alignment.tName 
+                 << " is out of bounds."  << std::endl
+                 << "         StartPos (" << alignment.tAlignedSeqPos  
+                 << ") + AlnLength (" << alignment.tAlignedSeqLength 
+                 << ") > RefLength (" << referenceSequences[refIndex].length
+                 << ") + 2 "          << std::endl;
+            continue;
+		}
+        ((DNASequence*)&alignment.tAlignedSeq)->Copy(referenceSequences[refIndex], 
+                                                     alignment.tAlignedSeqPos, 
+                                                     alignment.tAlignedSeqLength);
+      }
+    }
+
+    if (alignment.blocks.size() > 0) {
+      candidates.push_back(alignment);
+    }
+  }
+  if (candidates.size() > 0 and keepRefAsForward == false and candidates[0].tStrand == 1) {
+    std::reverse(candidates.begin(), candidates.end());
+  }
+  querySeq.Free();
+}
+
+void ReverseAlignmentOperations(std::vector<int> &lengths, std::vector<char> &ops) {
+  reverse(lengths.begin(), lengths.end());
+  reverse(ops.begin(), ops.end());
+}
diff --git a/libcpp/alignment/datastructures/alignment/SAMToAlignmentCandidateAdapter.hpp b/libcpp/alignment/datastructures/alignment/SAMToAlignmentCandidateAdapter.hpp
new file mode 100644
index 0000000..344aa60
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignment/SAMToAlignmentCandidateAdapter.hpp
@@ -0,0 +1,79 @@
+#ifndef _BLASR_SAM_TO_ALIGNMENT_CANDIDATE_ADAPTER_HPP_
+#define _BLASR_SAM_TO_ALIGNMENT_CANDIDATE_ADAPTER_HPP_
+
+#include <map>
+
+#include "sam/SAMAlignment.hpp"
+#include "sam/SAMFlag.h"
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+
+void InitializeCandidateFromSAM(SAMAlignment &sam,
+                                AlignmentCandidate<> &candidate);
+
+//
+// Change a list of gap operations into a gap structure between
+// blocks. 
+//
+int ProcessGap(std::vector<int> &lengths, std::vector<char> &ops, 
+               int &opIndex, int opEnd, blasr::GapList &gaps, 
+               int &qAdvance, int &tAdvance);
+
+inline bool IsClipping(char c) {
+  return (c == 'S' or c == 'H');
+}
+
+inline int IsSkipped(char c) {
+  return c == 'N';
+}
+//
+//
+// Returns true if the corresponding characters are assigned to each
+// other in the alignment.  This is either a match or a mismatch.
+//
+
+inline bool IsAssignChar(char c) {
+  return (c == 'M' or c == 'X' or c == '=');
+}
+
+int AdvancePastClipping(std::vector<int> &lengths,
+                        std::vector<char> &ops,
+                        int &opIndex,
+                        int &numSoftClipped);
+
+int AdvancePastSkipped(std::vector<int> &lengths,
+                       std::vector<char> &ops,
+                       int &opIndex);
+
+
+
+int ProcessMatch(std::vector<int> &lengths, std::vector<char> &ops,
+                 int &opIndex, int opEnd);
+                 
+
+void CIGAROpsToBlocks(std::vector<int> &lengths, std::vector<char> &ops,
+                      int cigarStart,
+                      int cigarEnd,
+                      AlignmentCandidate<> &aln);
+  
+int AdvancePosToAlignmentEnd(std::vector<char> &ops, int &pos);
+
+int GetAlignedQueryLengthByCIGARSum(std::vector<char> &ops, std::vector<int> &lengths);
+
+int GetAlignedReferenceLengthByCIGARSum(std::vector<char> &ops, std::vector<int> &lengths);
+
+void CIGAROpsToBlocks(std::vector<int> &lengths, std::vector<char> &ops,
+                      int &cigarPos,
+                      int &cigarEnd,
+                      int &qPos, int &tPos,
+                      AlignmentCandidate<> &aln);
+
+void ReverseAlignmentOperations(std::vector<int> &lengths, std::vector<char> &ops);
+
+void SAMAlignmentsToCandidates(SAMAlignment &sam,
+                               std::vector<FASTASequence> &referenceSequences,
+                               std::map<std::string,int> & refNameToRefListIndex,
+                               std::vector<AlignmentCandidate<> > &candidates, 
+                               bool parseSmrtTitle = false,
+                               bool keepRefAsForward = true,
+                               bool copyQVs = false);
+#endif
diff --git a/libcpp/alignment/datastructures/alignmentset/AlignmentSetToCmpH5Adapter.hpp b/libcpp/alignment/datastructures/alignmentset/AlignmentSetToCmpH5Adapter.hpp
new file mode 100644
index 0000000..9884edc
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignmentset/AlignmentSetToCmpH5Adapter.hpp
@@ -0,0 +1,84 @@
+#ifndef _BLASR_ALIGNMENT_SET_TO_CMPH5_ADAPTER_HPP_
+#define _BLASR_ALIGNMENT_SET_TO_CMPH5_ADAPTER_HPP_
+
+#include "utils/SMRTReadUtils.hpp"
+#include "HDFCmpFile.hpp"
+#include "sam/AlignmentSet.hpp"
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "datastructures/alignment/ByteAlignment.h"
+#include "algorithms/alignment/DistanceMatrixScoreFunction.hpp"
+
+class RefGroupNameId {
+ public:
+  std::string name;
+  unsigned int id;
+  RefGroupNameId() {
+    id = 0;
+    name = "";
+  }
+
+  RefGroupNameId(std::string n, unsigned int i) {
+    name = n; id = i;
+  }
+
+  RefGroupNameId(const RefGroupNameId &rhs) {
+    name = rhs.name;
+    id   = rhs.id;
+  }
+};
+
+// number of zmws per SMRTCell for springfield: 163482
+const unsigned int numZMWsPerMovieSpringField = 163482; 
+
+template<typename T_CmpFile>
+class AlignmentSetToCmpH5Adapter {
+public:
+  // Map reference name to reference group (/RefGroup) name and ID.
+  std::map<std::string, RefGroupNameId> refNameToRefGroupNameandId;
+  std::map<std::string, unsigned int> knownMovies;
+  std::map<std::string, unsigned int> knownPaths;
+  unsigned int numAlignments;
+  std::map<std::string, int> refNameToRefInfoIndex;
+ 
+  void Initialize() {
+      numAlignments = 0;
+  }
+
+  template<typename T_Reference>
+  void StoreReferenceInfo(std::vector<T_Reference> &references,
+                          T_CmpFile &cmpFile);
+
+  unsigned int StoreMovieInfo(std::string movieName, T_CmpFile &cmpFile);
+
+
+  // Given a reference name, find whether there exists a refGroup 
+  // (e.g. /ref000001) associated with it. 
+  // If not, create a refGroup and update refNameToRefGroupNameandId. 
+  // Finally, return its associated refGroup ID.
+  unsigned int StoreRefGroup(std::string refName, T_CmpFile & cmpFile);
+
+  unsigned int StorePath(std::string & path, T_CmpFile &cmpFile);
+
+  void RemoveGapsAtEndOfAlignment(AlignmentCandidate<> &alignment);
+
+  void StoreAlignmentCandidate(AlignmentCandidate<> &alignment, 
+                               int alnSegment,
+                               T_CmpFile &cmpFile,
+                               int moleculeNumber = -1,
+                               bool copyQVs=false);
+
+  void StoreAlignmentCandidateList(std::vector<AlignmentCandidate<> > &alignments,
+                                   T_CmpFile &cmpFile,
+                                   int moleculeNumber=-1,
+                                   bool copyQVs=false);
+
+  void StoreAlignmentCandidate(AlignmentCandidate<> alignment, 
+                               T_CmpFile &cmpFile) {
+    StoreAlignmentCandidate(alignment, 0, cmpFile);
+  }
+
+};
+
+#include "AlignmentSetToCmpH5AdapterImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignmentset/AlignmentSetToCmpH5AdapterImpl.hpp b/libcpp/alignment/datastructures/alignmentset/AlignmentSetToCmpH5AdapterImpl.hpp
new file mode 100644
index 0000000..6604930
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignmentset/AlignmentSetToCmpH5AdapterImpl.hpp
@@ -0,0 +1,256 @@
+#ifndef _BLASR_ALIGNMENT_SET_TO_CMPH5_ADAPTER_IMPL_HPP_
+#define _BLASR_ALIGNMENT_SET_TO_CMPH5_ADAPTER_IMPL_HPP_
+
+#include "AlignmentSetToCmpH5AdapterImpl.hpp"
+
+template<typename T_CmpFile>
+unsigned int AlignmentSetToCmpH5Adapter<T_CmpFile>::StoreMovieInfo(
+        std::string movieName, T_CmpFile &cmpFile) {
+
+  std::map<std::string, unsigned int>::iterator mapIt;
+  mapIt = knownMovies.find(movieName);
+  if (mapIt != knownMovies.end()) {
+      return mapIt->second;
+  }
+  else {
+      unsigned int id = cmpFile.movieInfoGroup.AddMovie(movieName);
+      knownMovies[movieName] = id;
+      return id;
+  }
+}
+
+template<typename T_CmpFile>
+template<typename T_Reference>
+void AlignmentSetToCmpH5Adapter<T_CmpFile>::StoreReferenceInfo(
+    std::vector<T_Reference> &references, T_CmpFile &cmpFile) {
+  for (int r = 0; r < references.size(); r++) {
+    std::string sequenceName, md5;
+    sequenceName = references[r].GetSequenceName();
+    md5 = references[r].GetMD5();
+    unsigned int length = references[r].GetLength();
+
+    // Add this reference to /RefInfo. 
+    // Don't create /ref0000x and register it in /RefGroup at this point, 
+    // because this reference may not map to any alignments at all. 
+    cmpFile.AddRefInfo(sequenceName, length, md5);
+
+    // Update refNameToRefInfoIndex
+    if (refNameToRefInfoIndex.find(sequenceName) != refNameToRefInfoIndex.end()) {
+      cout << "ERROR. Reference name " << sequenceName 
+            << " is not unique." << endl;
+      exit(1);
+    }
+    refNameToRefInfoIndex[sequenceName] = r;
+  }
+}
+
+template<typename T_CmpFile>
+unsigned int AlignmentSetToCmpH5Adapter<T_CmpFile>::StoreRefGroup(
+        std::string refName, T_CmpFile & cmpFile) {
+  // Find out whether there is a refGroup associated with refName.
+  std::map<std::string, RefGroupNameId>::iterator mapIt;
+  mapIt = refNameToRefGroupNameandId.find(refName);
+  if (mapIt != refNameToRefGroupNameandId.end()) {
+    // An existing refGroup is associated with this refName. 
+    return mapIt->second.id;
+  } else {
+    // No refGroup is associated with refName, create one.
+    int refInfoIndex = refNameToRefInfoIndex[refName];
+    unsigned int refInfoId = refInfoIndex + 1;
+
+    std::string refGroupName;
+    unsigned int refGroupId = cmpFile.AddRefGroup(refName, refInfoId, refGroupName);  
+
+    // Update refNameToRefGroupNameandId.
+    refNameToRefGroupNameandId[refName] = RefGroupNameId(refGroupName, refGroupId);
+    return refGroupId;
+  }
+}
+
+template<typename T_CmpFile>
+unsigned int AlignmentSetToCmpH5Adapter<T_CmpFile>::StorePath(
+      std::string & path, T_CmpFile &cmpFile) {
+  if (knownPaths.find(path) != knownPaths.end()) {
+    return knownPaths[path];
+  }
+  else {
+    unsigned int id = cmpFile.alnGroupGroup.AddPath(path);
+    knownPaths[path] = id;
+    return id;
+  }
+}
+
+template<typename T_CmpFile>
+void AlignmentSetToCmpH5Adapter<T_CmpFile>::RemoveGapsAtEndOfAlignment(AlignmentCandidate<> &alignment) {
+  int numEndDel = 0, numEndIns = 0;
+  if (alignment.gaps.size() > 0) {
+    int lastGap = alignment.gaps.size() - 1;
+    int g;
+    for (g = 0; g < alignment.gaps[lastGap].size(); g++) {
+      if (alignment.gaps[lastGap][g].seq == Gap::Target) {
+        numEndIns += alignment.gaps[lastGap][g].length;
+      }
+      else if (alignment.gaps[lastGap][g].seq == Gap::Query) {
+        numEndDel += alignment.gaps[lastGap][g].length;
+      }
+    }
+  }
+  alignment.qAlignedSeqLength -= numEndIns;
+  alignment.tAlignedSeqLength -= numEndDel;
+}
+
+template<typename T_CmpFile>
+void AlignmentSetToCmpH5Adapter<T_CmpFile>::StoreAlignmentCandidate(
+    AlignmentCandidate<> &alignment, 
+    int alnSegment,
+    T_CmpFile &cmpFile,
+    int moleculeNumber,
+    bool copyQVs) {
+  //
+  // Find out where the movie is going to get stored.
+  //
+  std::string movieName;
+  int holeNumber = 0;
+  bool nameParsedProperly;
+  
+  nameParsedProperly = ParsePBIReadName(alignment.qName, movieName, holeNumber);
+  if (!nameParsedProperly) {
+    std::cout <<"ERROR. Attempting to store a read with name " 
+          << alignment.qName << " that does not " << std::endl
+          << "appear to be a PacBio read." << std::endl;
+    exit(1);
+  }
+
+  unsigned int movieId = StoreMovieInfo(movieName, cmpFile);
+
+  // Check whether the reference is in /RefInfo.
+  std::map<std::string, int>::iterator mapIt;
+  mapIt = refNameToRefInfoIndex.find(alignment.tName);
+  if (mapIt == refNameToRefInfoIndex.end()) {
+    std::cout << "ERROR. The reference name " << alignment.tName 
+          << " was not found in the list of references." << std::endl;
+    std::cout << "Perhaps a different reference file was aligned to than " << std::endl
+          << "what was provided for SAM conversion. " << std::endl;
+    exit(1);
+  } 
+
+  // Store refGroup
+  unsigned int refGroupId = StoreRefGroup(alignment.tName, cmpFile);
+  std::string refGroupName = refNameToRefGroupNameandId[alignment.tName].name; 
+  assert(refGroupId  == refNameToRefGroupNameandId[alignment.tName].id);
+
+  if (cmpFile.refGroupIdToArrayIndex.find(refGroupId) == cmpFile.refGroupIdToArrayIndex.end()) {
+    std::cout << "ERROR. The reference ID is not indexed. " 
+          << "This is an internal inconsistency." << std::endl;
+    exit(1);
+  }
+
+  int    refGroupIndex= cmpFile.refGroupIdToArrayIndex[refGroupId];
+  assert(refGroupIndex + 1 == refGroupId);
+
+  std::string path = "/" + refGroupName + "/" + movieName;
+  unsigned int pathId = StorePath(path, cmpFile);
+  int pathIndex = pathId - 1;
+
+  vector<unsigned int> alnIndex;
+  alnIndex.resize(22);
+
+  RemoveGapsAtEndOfAlignment(alignment);
+
+  /*
+    * Store the alignment string
+    */
+  vector<unsigned char> byteAlignment;
+  AlignmentToByteAlignment(alignment, 
+                            alignment.qAlignedSeq, alignment.tAlignedSeq,
+                            byteAlignment);
+
+  unsigned int offsetBegin, offsetEnd;
+  cmpFile.StoreAlnArray(byteAlignment, alignment.tName, movieName, offsetBegin, offsetEnd);
+  // Copy QVs into cmp.h5
+  if (copyQVs) {
+    std::vector<std::string> optionalQVs;
+    alignment.CopyQVs(&optionalQVs);
+    for (int qv_i=0; qv_i<optionalQVs.size(); qv_i++) {
+      std::string *qvName = &alignment.optionalQVNames[qv_i];
+      std::string *qvString = &optionalQVs[qv_i];
+      
+      // If the qvString is empty, then the alignment is missing the quality
+      // value
+      if (qvString->size() == 0) {
+        continue;
+      }
+
+      unsigned int qvOffsetBegin, qvOffsetEnd;
+      if (qvName->compare(qvName->size() - 3, 3, "Tag") == 0) {
+        std::vector<char> qvVector;
+        QVsToCmpH5QVs(*qvString, byteAlignment, true, &qvVector);
+        cmpFile.StoreTags(qvVector, alignment.tName, *qvName,
+                          movieName, &qvOffsetBegin, &qvOffsetEnd);
+      } else {
+        std::vector<UChar> qvVector;
+        QVsToCmpH5QVs(*qvString, byteAlignment, false, &qvVector);
+        cmpFile.StoreQVs(qvVector, alignment.tName, *qvName,
+                         movieName, &qvOffsetBegin, &qvOffsetEnd);
+      }
+      assert(qvOffsetBegin == offsetBegin);
+      assert(qvOffsetEnd == offsetEnd);
+    }
+  }
+
+  numAlignments++;
+
+  DistanceMatrixScoreFunction<DNASequence, DNASequence> distScoreFn;
+  //distScoreFn does not matter since the score is not stored.
+  ComputeAlignmentStats(alignment, alignment.qAlignedSeq.seq, alignment.tAlignedSeq.seq, distScoreFn);
+
+  /*
+    The current AlnIndex column names:
+    (0): "AlnID", "AlnGroupID", "MovieID", "RefGroupID", "tStart",
+    (5): "tEnd", "RCRefStrand", "HoleNumber", "SetNumber",
+    (9): "StrobeNumber", "MoleculeID", "rStart", "rEnd", "MapQV", "nM",
+    (15): "nMM", "nIns", "nDel", "Offset_begin", "Offset_end",
+    (20): "nBackRead", "nReadOverlap"
+  */
+  if (moleculeNumber == -1) {
+    moleculeNumber =  numZMWsPerMovieSpringField * (movieId - 1) + holeNumber;
+  }
+  alnIndex[0]  = numAlignments;  // AlnId
+  alnIndex[1]  = pathId;        // AlnGroupID
+  alnIndex[2]  = movieId;    // MovieID
+  alnIndex[3]  = refGroupId; // RefGroupID
+  alnIndex[4]  = alignment.tAlignedSeqPos; // tStart
+  alnIndex[5]  = alignment.tAlignedSeqPos +  alignment.tAlignedSeqLength; // tEnd
+  alnIndex[6]  = alignment.tStrand; // RCRefStrand
+  alnIndex[7]  = holeNumber;
+  alnIndex[8]  = 0; // SET NUMBER -- parse later!!!!
+  alnIndex[9]  = alnSegment; // strobenumber
+  alnIndex[10] = moleculeNumber;
+  alnIndex[11] = alignment.qAlignedSeqPos; 
+  alnIndex[12] = alignment.qAlignedSeqPos + alignment.qAlignedSeqLength;
+  alnIndex[13] = alignment.mapQV;
+  alnIndex[14] = alignment.nMatch;
+  alnIndex[15] = alignment.nMismatch;
+  alnIndex[16] = alignment.nIns;
+  alnIndex[17] = alignment.nDel;
+  alnIndex[18] = offsetBegin;
+  alnIndex[19] = offsetEnd;
+  alnIndex[20] = 0;
+  alnIndex[21] = 0;
+  cmpFile.alnInfoGroup.WriteAlnIndex(alnIndex);
+}
+
+template<typename T_CmpFile>
+void AlignmentSetToCmpH5Adapter<T_CmpFile>::StoreAlignmentCandidateList(
+    std::vector<AlignmentCandidate<> > &alignments,
+    T_CmpFile &cmpFile,
+    int moleculeNumber,
+    bool copyQVs) {
+  
+  int a;
+  for (a = 0; a < alignments.size(); a++) {
+    StoreAlignmentCandidate(alignments[a], a, cmpFile, moleculeNumber, copyQVs);
+  }
+}
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignmentset/SAMQVConversion.cpp b/libcpp/alignment/datastructures/alignmentset/SAMQVConversion.cpp
new file mode 100644
index 0000000..05e867d
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignmentset/SAMQVConversion.cpp
@@ -0,0 +1,27 @@
+#include <cstddef>
+#include <assert.h>
+#include "FASTQSequence.hpp"
+#include "SAMQVConversion.hpp"
+
+void QualityVectorToPrintable(unsigned char *data, int length) {
+	if (data == NULL) {
+		return;
+	}
+	for (int i = 0; i < length; i++) {
+		data[i] = (((unsigned char)data[i]) == MAX_STORED_QUALITY) ? MAX_PRINTED_QUALITY : (unsigned char)data[i];
+		data[i] = (((unsigned char)data[i]) == SENTINAL) ? MAP_SENTINAL : (unsigned char)data[i];
+		assert(data[i] != 255);
+	}
+}
+
+void QualityStringToStored(unsigned char *data, int length) {
+	if (data == NULL) {
+		return;
+	}
+	for (int i = 0; i < length; i++) {
+		data[i] = data[i] - FASTQSequence::charToQuality;
+		data[i] = ((unsigned char)data[i]) == MAX_PRINTED_QUALITY ? MAX_STORED_QUALITY : (unsigned char)data[i];
+		data[i] = ((unsigned char)data[i]) == MAP_SENTINAL ? SENTINAL : (unsigned char)data[i];
+	}
+}
+
diff --git a/libcpp/alignment/datastructures/alignmentset/SAMQVConversion.hpp b/libcpp/alignment/datastructures/alignmentset/SAMQVConversion.hpp
new file mode 100644
index 0000000..1a8312f
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignmentset/SAMQVConversion.hpp
@@ -0,0 +1,15 @@
+#ifndef _BLASR_SAMQVConversion_HPP_
+#define _BLASR_SAMQVConversion_HPP_
+
+
+#define MAX_PRINTED_QUALITY 93
+#define MAX_STORED_QUALITY 100
+#define SENTINAL 255
+#define MAP_SENTINAL 93
+
+
+void QualityVectorToPrintable(unsigned char *data, int length);
+
+void QualityStringToStored(unsigned char *data, int length) ;
+
+#endif
diff --git a/libcpp/alignment/datastructures/alignmentset/SAMSupplementalQVList.cpp b/libcpp/alignment/datastructures/alignmentset/SAMSupplementalQVList.cpp
new file mode 100644
index 0000000..2f0558e
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignmentset/SAMSupplementalQVList.cpp
@@ -0,0 +1,71 @@
+#include "SAMSupplementalQVList.hpp"
+
+const char* SupplementalQVList::qvNames[] = {"InsertionQV", "DeletionQV", "SubstitutionQV", "MergeQV", "SubstitutionTag", "DeletionTag"};
+const char* SupplementalQVList::qvTags[] = {"iq", "dq", "sq", "mq", "st", "dt"};
+
+// Only the first 4 tags are quality values.
+int SupplementalQVList::nqvTags = 4;
+int SupplementalQVList::nTags = 6;
+
+int SupplementalQVList::UseQV(std::vector<std::string> &qvList) {
+    int i;
+    useqv = 0;
+    for (i = 0; i < qvList.size(); i++) {
+        int j;
+        for (j = 0; j < nTags; j++) {
+            if (qvList[i] == qvNames[j]) {
+                useqv |= 1 << j;
+                break;
+            }
+        }
+        if (j == nTags) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+void SupplementalQVList::FormatQVOptionalFields(SMRTSequence &alignedSubsequence) {
+    int i;
+    for (i = 0; i < nqvTags; i++) {
+        if (alignedSubsequence.GetQVPointerByIndex(i+1)->data == NULL) {
+            // mask off this quality value since it does not exist
+            useqv = useqv & ~(1 << i);
+        }
+    }
+    for (i = 0; i < nqvTags; i++) {
+        if (useqv & (1 << i)) {
+            QualityVectorToPrintable(alignedSubsequence.GetQVPointerByIndex(i+1)->data, alignedSubsequence.length);
+        }
+    }
+}
+	
+void SupplementalQVList::PrintQVOptionalFields(SMRTSequence &alignedSubsequence, std::ostream &out) {
+    int i = 0;
+    for (i = 0; i < nqvTags; i++) {
+        if (alignedSubsequence.GetQVPointerByIndex(i+1)->data == NULL) {
+            // mask off this quality value since it does not exist
+            useqv = useqv & ~(1 << i);
+        }
+    }
+    for (i = 0; i < nTags; i++) {
+        if (alignedSubsequence.GetQVPointerByIndex(i+1) != NULL and (useqv & (1 << i)) ) {
+            out << "\t" << qvTags[i] << ":Z:";
+            alignedSubsequence.PrintAsciiRichQuality(out, i + 1, 0);
+        }
+    }
+    if (alignedSubsequence.substitutionTag != NULL and (useqv & SubstitutionTag)) {
+        out << "\t" << qvTags[I_SubstitutionTag-1] << ":Z:";
+        alignedSubsequence.PrintAsciiRichQuality(out, I_SubstitutionTag, 0);
+    }
+    if (alignedSubsequence.deletionTag != NULL and (useqv & DeletionTag)) {
+        out << "\t" << qvTags[I_DeletionTag-1] << ":Z:";
+        alignedSubsequence.PrintAsciiRichQuality(out, I_DeletionTag, 0);
+    }
+}
+
+void SupplementalQVList::clear() {
+    for (int j = 0; j < nTags; j++) {
+        useqv &= 0 << j;
+    }
+}
diff --git a/libcpp/alignment/datastructures/alignmentset/SAMSupplementalQVList.hpp b/libcpp/alignment/datastructures/alignmentset/SAMSupplementalQVList.hpp
new file mode 100644
index 0000000..1ea8baa
--- /dev/null
+++ b/libcpp/alignment/datastructures/alignmentset/SAMSupplementalQVList.hpp
@@ -0,0 +1,27 @@
+#ifndef _BLASR_SAMSUPPLEMENTALQVLIST_HPP_
+#define _BLASR_SAMSUPPLEMENTALQVLIST_HPP_
+#include "SMRTSequence.hpp"
+#include "SAMQVConversion.hpp"
+
+class SupplementalQVList {
+public:
+	//enum QVList {InsertionQV=0x1, DeletionQV=0x2, SubstitutionQV=0x4, MergeQV=0x8, SubstitutionTag=0x10, DeletionTag=0x20};
+	//enum QVIndex {I_InsertionQV=1,I_DeletionQV=2,I_SubstitutionQV=3,I_MergeQV=4,I_SubstitutionTag=5,I_DeletionTag=6};
+    //defined in FASTQSequence.
+	unsigned int useqv;
+	void SetDefaultQV() {
+		useqv = InsertionQV | DeletionQV | SubstitutionQV | MergeQV | DeletionTag;
+	}
+	static const char* qvTags[];
+	static const char* qvNames[];
+	static int nqvTags;
+	static int nTags;
+
+	int UseQV(std::vector<std::string> &qvList);
+   	void FormatQVOptionalFields(SMRTSequence &alignedSubsequence);
+    	
+	void PrintQVOptionalFields(SMRTSequence &alignedSubsequence, std::ostream &out);
+    void clear();
+};
+
+#endif
diff --git a/libcpp/alignment/datastructures/anchoring/AnchorParameters.cpp b/libcpp/alignment/datastructures/anchoring/AnchorParameters.cpp
new file mode 100644
index 0000000..8b435b9
--- /dev/null
+++ b/libcpp/alignment/datastructures/anchoring/AnchorParameters.cpp
@@ -0,0 +1,44 @@
+#include "AnchorParameters.hpp"
+
+AnchorParameters::AnchorParameters() {
+    branchQualityThreshold = 0;
+    minMatchLength         = 0;
+    maxMatchScore          = 0;
+    expand                 = 0;
+    contextAlignLength     = 0;
+    useLookupTable         = true;
+    numBranches            = 0;
+    maxAnchorsPerPosition  = 1000;
+    advanceExactMatches    = 0;
+    maxLCPLength           = 0; // 0 Defaults to full lcp length
+    stopMappingOnceUnique  = false;
+    removeEncompassedMatches=false;
+    verbosity              = 0;
+    lcpBoundsOutPtr        = NULL;
+    branchExpand           = 0;
+}
+
+AnchorParameters &AnchorParameters::Assign(const AnchorParameters &rhs) {
+    //
+    // Manually handle assignment in case there is some deep copy
+    // that is necessary eventually.
+    //
+    branchQualityThreshold = rhs.branchQualityThreshold;
+    minMatchLength         = rhs.minMatchLength;
+    maxMatchScore          = rhs.maxMatchScore;
+    expand                 = rhs.expand;
+    contextAlignLength     = rhs.contextAlignLength;
+    numBranches            = rhs.numBranches;
+    maxAnchorsPerPosition  = rhs.maxAnchorsPerPosition;
+    advanceExactMatches    = rhs.advanceExactMatches;
+    maxLCPLength           = rhs.maxLCPLength;
+    stopMappingOnceUnique  = rhs.stopMappingOnceUnique;
+    verbosity              = rhs.verbosity;
+    removeEncompassedMatches= rhs.removeEncompassedMatches;
+    branchExpand           = rhs.branchExpand;
+    return *this;
+}
+
+AnchorParameters &AnchorParameters::operator=(const AnchorParameters &rhs) {
+    return this->Assign(rhs);
+}
diff --git a/libcpp/alignment/datastructures/anchoring/AnchorParameters.hpp b/libcpp/alignment/datastructures/anchoring/AnchorParameters.hpp
new file mode 100644
index 0000000..8ca5474
--- /dev/null
+++ b/libcpp/alignment/datastructures/anchoring/AnchorParameters.hpp
@@ -0,0 +1,35 @@
+#ifndef _BLASR_ANCHOR_PARAMETERS_HPP_
+#define _BLASR_ANCHOR_PARAMETERS_HPP_
+
+#include <fstream>
+#include <iostream>
+#include "qvs/QualityValue.hpp"
+#include "DNASequence.hpp"
+
+class AnchorParameters {
+public:
+    QualityValue branchQualityThreshold;
+    int minMatchLength;
+    int maxMatchScore;
+    int expand;
+    int contextAlignLength;
+    bool useLookupTable;
+    int numBranches;
+    int maxAnchorsPerPosition;
+    int advanceExactMatches;
+    int maxLCPLength;
+    bool stopMappingOnceUnique;
+    int verbosity;
+    bool removeEncompassedMatches;
+    std::ostream *lcpBoundsOutPtr;
+    int branchExpand;
+
+    AnchorParameters(); 
+
+    AnchorParameters &Assign(const AnchorParameters &rhs);
+
+    AnchorParameters &operator=(const AnchorParameters &rhs); 
+};
+
+
+#endif // _BLASR_ANCHOR_PARAMETERS_HPP_
diff --git a/libcpp/alignment/datastructures/anchoring/ClusterList.cpp b/libcpp/alignment/datastructures/anchoring/ClusterList.cpp
new file mode 100644
index 0000000..f562ed6
--- /dev/null
+++ b/libcpp/alignment/datastructures/anchoring/ClusterList.cpp
@@ -0,0 +1,75 @@
+#include "datastructures/anchoring/ClusterList.hpp"
+
+ClusterList::ClusterList() {
+    lowerSizeLimit = 20;
+    lowerSizeLimitNumAnchors = 1;
+    curp = cure = 0;
+    onContigStart = true;
+    curIndex = 0;
+}
+
+void ClusterList::Clear() {
+    onContigStart = true;
+    numBases.clear();
+    startPos.clear();
+    numAnchors.clear();
+}
+
+bool ClusterList::Store(int n, DNALength p, DNALength e, int b) {
+    bool intervalIsEclipsed = true;
+    bool intervalEclipses   = false;
+    if (onContigStart == true) {
+        curp = p;
+        cure = e;
+        intervalIsEclipsed = false;      
+    }
+    else {
+        if (curp <= p and cure >= e) {
+            intervalIsEclipsed = true;
+        }
+        else {
+            if (p <= curp and e >= cure) {
+                intervalEclipses = true;
+            }
+            intervalIsEclipsed = false;
+        }
+    }
+    if (intervalIsEclipsed == false) {
+        //
+        // The current interval is unique: it does not eclipse any 
+        // other intervals and is not eclipsed by any.
+        //
+        if (n >= lowerSizeLimit) {
+            if (intervalEclipses == false or onContigStart) {
+                numBases.push_back(n);
+                startPos.push_back(p);
+                numAnchors.push_back(b);
+                onContigStart = false;
+                //
+                // Record where the last interval is.  Since ther intervals
+                // are sorted by position, only need to compare against the
+                // current interval to make sure they are not overlapping
+                // other intervals.
+                //
+                curp = p; cure = e;
+            }
+            else {
+                //
+                // The new interval eclipses the last one added.
+                //
+                if (n > numBases[numBases.size()-1]) {
+                    numBases[numBases.size()-1] = n;
+                    startPos[startPos.size()-1] = p;
+                    numAnchors[numAnchors.size()-1] = b;
+                    curp = p; cure = e;
+                }
+            }
+        }
+    }
+    return !intervalIsEclipsed;
+}
+
+void ClusterList::ResetCoordinates() {
+    onContigStart = true;
+}
+
diff --git a/libcpp/alignment/datastructures/anchoring/ClusterList.hpp b/libcpp/alignment/datastructures/anchoring/ClusterList.hpp
new file mode 100644
index 0000000..055446f
--- /dev/null
+++ b/libcpp/alignment/datastructures/anchoring/ClusterList.hpp
@@ -0,0 +1,25 @@
+#ifndef _BLASR_CLUSTER_LIST_HPP_
+#define _BLASR_CLUSTER_LIST_HPP_
+
+#include <vector>
+#include "DNASequence.hpp"
+
+class ClusterList {
+public:
+    std::vector<int> numBases;
+    std::vector<int> numAnchors;
+    std::vector<unsigned int> startPos;
+    std::vector<int> indices;
+    int lowerSizeLimit;
+    int lowerSizeLimitNumAnchors;
+    DNALength curp, cure; // cur - p, and cur - e.
+    int curIndex;
+    bool onContigStart;
+
+    ClusterList();
+    void Clear();
+    bool Store(int n, DNALength p, DNALength e, int b);
+    void ResetCoordinates();
+};
+
+#endif
diff --git a/libcpp/alignment/datastructures/anchoring/MatchPos.cpp b/libcpp/alignment/datastructures/anchoring/MatchPos.cpp
new file mode 100644
index 0000000..e6d7ec3
--- /dev/null
+++ b/libcpp/alignment/datastructures/anchoring/MatchPos.cpp
@@ -0,0 +1,59 @@
+#include "MatchPos.hpp"
+
+
+MatchPos::MatchPos(const MatchPos &rhs) {
+    (*this) = rhs;
+}
+
+int MatchPos::GetMultiplicity() const {
+    return m;
+}
+
+MatchWeight MatchPos::GetWeight() const {
+    if (m > 0) {
+        return (1.0*l)/m;
+    } else {
+        return 0;
+    }
+}
+
+UInt MatchPos::GetT() {
+    return t;
+}
+
+UInt MatchPos::GetQ() {
+    return (UInt) q;
+}
+
+UInt MatchPos::GetW() {
+    return w;
+}
+
+std::ostream& operator<<(std::ostream & out, MatchPos &p) {
+    out << p.q << "\t" << p.t <<"\t"<< p.l << "\t"<< p.m;
+    return out;
+}
+
+
+ChainedMatchPos::ChainedMatchPos(DNALength pt, DNALength pq, DNALength pl, int pm) : MatchPos(pt, pq, pl, pm) {
+    score = 0; 
+    chainPrev = NULL;
+}
+
+ChainedMatchPos::ChainedMatchPos() : MatchPos() {
+    score = 0;
+    chainPrev = NULL;
+}
+
+int ChainedMatchPos::SetScore(int _score) {
+    return (score = _score);
+}
+
+ChainedMatchPos* ChainedMatchPos::SetChainPrev(ChainedMatchPos *_chainPrev) {
+    return (chainPrev = _chainPrev);
+}
+
+std::ostream& operator<<(std::ostream & out, ChainedMatchPos &p) {
+    out << p.q << "\t" << p.t <<"\t"<< p.l << "\t"<< p.m;
+    return out;
+}
diff --git a/libcpp/alignment/datastructures/anchoring/MatchPos.hpp b/libcpp/alignment/datastructures/anchoring/MatchPos.hpp
new file mode 100644
index 0000000..513b3d2
--- /dev/null
+++ b/libcpp/alignment/datastructures/anchoring/MatchPos.hpp
@@ -0,0 +1,192 @@
+#ifndef _BLASR_MATCH_POS_HPP_
+#define _BLASR_MATCH_POS_HPP_
+
+#include <vector>
+#include <algorithm>
+#include <ostream>
+#include "Types.h"
+#include "DNASequence.hpp"
+
+class MatchPos {
+public:
+    DNALength t, q;
+    MatchWeight w;
+    DNALength l;
+    int m; // multiplicity
+
+    inline MatchPos(DNALength pt, DNALength pq, DNALength pl, int pm = 0); 
+
+    MatchPos (const MatchPos &rhs); 
+
+    inline MatchWeight Size(); 
+
+    inline MatchPos(); 
+
+    inline MatchPos& operator=(const MatchPos &rhs); 
+
+    inline DNALength GetLength() const; 
+    
+    int GetMultiplicity() const; 
+    
+    MatchWeight GetWeight() const; 
+
+    inline DNALength GetX() const; 
+    
+    inline DNALength GetY() const; 
+    
+    UInt GetT(); 
+
+    UInt GetQ(); 
+
+    UInt GetW(); 
+
+    friend std::ostream& operator<<(std::ostream & out, MatchPos &p); 
+};
+
+inline MatchPos::MatchPos(DNALength pt, DNALength pq, DNALength pl, int pm) :
+    t(pt), q(pq), l(pl), m(pm), w(0){ }
+
+inline MatchPos::MatchPos() {
+    t = q = -1;
+    l = 0;
+    w = 0;
+    m = 0;
+}
+
+inline MatchWeight MatchPos::Size() {
+    return l;
+}
+
+inline MatchPos& MatchPos::operator=(const MatchPos &rhs) {
+    t = rhs.t; q = rhs.q; w = rhs.w;
+    l = rhs.l;
+    m = rhs.m;
+    return *this;
+}
+
+inline DNALength MatchPos::GetLength() const {
+    return l;
+}
+
+inline DNALength MatchPos::GetX() const {
+    return q;
+}
+
+inline DNALength MatchPos::GetY() const {
+    return t;
+}
+
+
+class ChainedMatchPos : public MatchPos {
+private:
+    int score;
+    ChainedMatchPos *chainPrev;
+
+public:
+    ChainedMatchPos(DNALength pt, DNALength pq, DNALength pl, int pm);
+
+    ChainedMatchPos();
+
+    inline ChainedMatchPos(const ChainedMatchPos &rhs); 
+
+    inline int GetScore();
+
+    int SetScore(int _score); 
+
+    ChainedMatchPos* SetChainPrev(ChainedMatchPos *_chainPrev); 
+
+    inline ChainedMatchPos* GetChainPrev();
+
+    inline ChainedMatchPos &operator=(const ChainedMatchPos &rhs); 
+
+    friend std::ostream& operator<<(std::ostream & out, ChainedMatchPos &p); 
+
+};
+
+inline ChainedMatchPos::ChainedMatchPos(const ChainedMatchPos &rhs) {
+    (*this) = rhs;
+}
+
+inline ChainedMatchPos* ChainedMatchPos::GetChainPrev() {
+    return chainPrev;
+}
+
+inline int ChainedMatchPos::GetScore() {
+    return score;
+}
+
+inline ChainedMatchPos &ChainedMatchPos::operator=(const ChainedMatchPos &rhs) {
+    ((MatchPos&)(*this)) = ((MatchPos&)rhs);
+    return *this;
+}
+
+
+template<typename T_MatchPos>
+class CompareMatchPos {
+    public:
+        int operator()(const T_MatchPos &lhs, const T_MatchPos &rhs) const {
+            if (lhs.t < rhs.t) 
+                return 1;
+            else if (lhs.t > rhs.t)
+                return 0;
+            else { 
+                return lhs.q < rhs.q;
+            }
+        }
+};
+
+typedef std::vector<MatchPos> MatchPosList;
+
+template<typename T_MatchPos>
+class CompareMatchPosByWeight {
+    public:
+        int operator()(const T_MatchPos &a, const T_MatchPos &b) const {
+            return a.l < b.l;
+        }
+};
+
+template<typename T_MatchPos>
+class CompareMatchPosIndexByWeight {
+    public:
+        std::vector<T_MatchPos> *list;
+        int operator()(const int i, const int j) const {
+            return ((*list)[i].w > (*list)[j].w);
+        }
+};
+
+
+template<typename T_MatchPos>
+class CompareMatchPosIndexByTextPos {
+    public:
+        std::vector<T_MatchPos> *list;
+        int operator()(const int i, const int j) const {
+            return (*list)[i].t < (*list)[j].t;
+        }
+};
+
+
+template<typename T_MatchPos>
+void SortMatchPosList(std::vector<T_MatchPos> &mpl) {
+    std::sort(mpl.begin(), mpl.end(), CompareMatchPos<T_MatchPos>());
+}
+
+template<typename T_MatchPos>
+void SortMatchPosListByWeight(std::vector<T_MatchPos> &mpl) {
+    std::sort(mpl.begin(), mpl.end(), CompareMatchPosByWeight<T_MatchPos>());
+}
+
+template<typename T_MatchPos>
+void SortMatchPosIndexListByWeight(std::vector<T_MatchPos> &mpl, std::vector<int> &indices) {
+    CompareMatchPosIndexByWeight<T_MatchPos> cmp;
+    cmp.list = &mpl;
+    std::sort(indices.begin(), indices.end(), cmp);
+}
+
+template<typename T_MatchPos>
+void SortMatchPosIndexListByTextPos(std::vector<T_MatchPos> &mpl, std::vector<int> &indices) {
+    CompareMatchPosIndexByTextPos<T_MatchPos> cmp;
+    cmp.list = &mpl;
+    std::sort(indices.begin(), indices.end(), cmp);
+}
+
+#endif  // _BLASR_MATCH_POS_HPP_
diff --git a/libcpp/alignment/datastructures/anchoring/WeightedInterval.cpp b/libcpp/alignment/datastructures/anchoring/WeightedInterval.cpp
new file mode 100644
index 0000000..173eb89
--- /dev/null
+++ b/libcpp/alignment/datastructures/anchoring/WeightedInterval.cpp
@@ -0,0 +1,181 @@
+#include "datastructures/anchoring/WeightedInterval.hpp"
+
+WeightedInterval::WeightedInterval(){}
+
+void WeightedInterval::Init(int _size, int _start, int _end, 
+    int _readIndex, float _pValue) {
+    size      = _size; 
+    start     = _start; 
+    end       = _end; 
+    readIndex = _readIndex;
+    pValue    = _pValue;
+    qStart = 0;
+    qEnd   = 0;
+    nAnchors = 0;
+    totalAnchorSize = 0;
+    pValueVariance = 0;
+    pValueNStdDev = 0;
+    sizeVariance = 0;
+    sizeNStdDev = 0;
+}
+
+WeightedInterval::WeightedInterval(int _size, int _start, int _end, 
+    int _readIndex, float _pValue) {
+    Init(_size, _start, _end, _readIndex, _pValue);
+}
+
+WeightedInterval::WeightedInterval(int _size, int _start, int _end, 
+    int _readIndex, float _pValue, int _qStart, int _qEnd){
+    Init(_size, _start, _end, _readIndex, _pValue);
+    qStart    = _qStart;
+    qEnd      = _qEnd;
+}
+
+WeightedInterval::WeightedInterval(int _size, unsigned int _nAnchors, 
+    unsigned int _totalAnchorSize, int _start, int _end, int _readIndex, 
+    float _pValue, int _qStart, int _qEnd, 
+    std::vector<ChainedMatchPos> &_matches) {
+
+    Init(_size, _start, _end, _readIndex, _pValue);
+    qStart    = _qStart;
+    qEnd      = _qEnd;
+    matches   = _matches;
+    nAnchors  = _nAnchors;
+    totalAnchorSize = _totalAnchorSize;
+}
+
+float WeightedInterval::PValue() const {
+    return pValue;
+}
+
+int WeightedInterval::Size() const {
+    return size;
+}
+
+int WeightedInterval::GetStrandIndex() const {
+    return readIndex;
+}
+
+void WeightedInterval::SetPValueVariance(float v) {
+    pValueVariance = v;
+}
+
+void WeightedInterval::SetPValueNStdDev(float v) {
+    pValueNStdDev = v;
+}
+
+void WeightedInterval::SetSizeVariance(float v) {
+    sizeVariance = v;
+}
+
+void WeightedInterval::SetSizeNStdDev(float v) {
+    sizeNStdDev = v;
+}
+
+int WeightedInterval::operator<(const WeightedInterval &intv) const {
+    if (size == intv.size) {
+        return start > intv.start;
+    }
+    else {
+        return size < intv.size;
+    }
+}
+
+int WeightedInterval::operator==(const WeightedInterval &intv) const {
+    return size == intv.size;
+}
+
+// Functions of class CompareWeightedIntervalByPValue
+int CompareWeightedIntervalByPValue::operator()(const WeightedInterval &a,
+    const WeightedInterval &b) const {
+    if (a.PValue() != b.PValue()) {
+        return a.PValue() < b.PValue();
+    }
+    else {
+        return a.start < b.start;
+    }
+}
+
+// Functions of class WeightedIntervalSet
+WeightedIntervalSet::WeightedIntervalSet() {
+    maxSize = 0;
+}
+
+WeightedIntervalSet::WeightedIntervalSet(int maxSizeP): maxSize(maxSizeP) {
+} 
+
+bool WeightedIntervalSet::insert(WeightedInterval &intv) {
+    intv.isOverlapping = false;
+
+    //
+    // Make sure this interval is not contained inside any other
+    // weighted intervals.  
+    //
+    WeightedIntervalSet::iterator it = (*this).begin();
+    WeightedIntervalSet::iterator endit = (*this).end();
+    bool isContained = false;
+    while (it != endit and isContained == false) {
+        if (intv.qStart >= (*it).qStart and intv.qEnd <= (*it).qEnd and
+            intv.start  >= (*it).start and intv.end <= (*it).end and 
+            intv.readIndex == (*it).readIndex and
+            intv.pValue >= (*it).pValue) {
+            //
+            // This already overlaps an existing interval, don't bother
+            // trying to add it.
+            //
+            isContained = true;
+            intv.isOverlapping = true;
+        } else if((*it).start >= intv.start and 
+                  (*it).end <= intv.end and
+                  (*it).qStart >= intv.qStart and 
+                  (*it).qEnd <= intv.qEnd and
+                  (*it).readIndex == intv.readIndex and
+                  (*it).pValue >= intv.pValue) {
+            WeightedIntervalSet::iterator next = it;
+            ++next;
+            this->erase(it);
+            it = next;
+        } else {
+            ++it;
+        }
+    }
+
+    //
+    // Take a peek to see if this interval is too low of a score to
+    // bother attempting to add at all. 
+    //
+    if (size() >= maxSize and maxSize > 0) {
+        WeightedIntervalSet::iterator last = (*this).end();
+        last--;
+
+        if (last->pValue < intv.pValue) {
+            return false;
+        }
+    }
+
+    if (isContained == false) {
+        bool addInsert = false;
+        if (size() == 0) {
+            addInsert = true;
+        }
+        else {
+            it = end();
+            --it;
+            if (size() < maxSize or (*it).pValue > intv.pValue) {
+                addInsert = true;
+                //
+                // Keep the size of the stack the same if it is at the limit.
+                //
+                if (maxSize != 0 and size() >= maxSize and size() > 0) { 
+                    erase(it);
+                }
+            }
+        }
+        if (addInsert) {
+            ((T_WeightedIntervalMultiSet*)this)->insert(intv);
+        }
+        return true;
+    }
+    return false;
+}
+
diff --git a/libcpp/alignment/datastructures/anchoring/WeightedInterval.hpp b/libcpp/alignment/datastructures/anchoring/WeightedInterval.hpp
new file mode 100644
index 0000000..052da90
--- /dev/null
+++ b/libcpp/alignment/datastructures/anchoring/WeightedInterval.hpp
@@ -0,0 +1,85 @@
+#ifndef _BLASR_WEIGHTED_INTERVAL_HPP_
+#define _BLASR_WEIGHTED_INTERVAL_HPP_
+
+#include <vector>
+#include <set>
+#include "DNASequence.hpp"
+#include "datastructures/anchoring/MatchPos.hpp" 
+
+class WeightedInterval {
+public:
+    DNALength size; // not necessarily end - start + 1
+    DNALength start;
+    DNALength end;
+    DNALength qStart, qEnd;
+    int readIndex;
+    float pValue;
+    std::vector<int> positions;
+    std::vector<ChainedMatchPos> matches;
+    float pValueVariance, pValueNStdDev;
+    float sizeVariance, sizeNStdDev;
+    int nAnchors;
+    int totalAnchorSize;
+    bool isOverlapping;
+
+    WeightedInterval();
+
+    WeightedInterval(int _size, int _start, int _end, 
+        int _readIndex, float _pValue =0.0);
+
+    WeightedInterval(int _size, int _start, int _end, 
+        int _readIndex, float _pValue, int _qStart, int _qEnd);
+
+    WeightedInterval(int _size, unsigned int _nAnchors, 
+        unsigned int _totalAnchorSize, int _start, int _end, 
+        int _readIndex, float _pValue, int _qStart, int _qEnd, 
+        std::vector<ChainedMatchPos> &_matches);
+
+    void Init(int _size, int _start, int _end, 
+        int _readIndex, float _pValue);
+
+    int GetStrandIndex() const;
+    void SetPValueVariance(float v);
+    void SetPValueNStdDev(float v);
+    void SetSizeVariance(float v);
+    void SetSizeNStdDev(float v);
+    int operator<(const WeightedInterval &intv) const;
+    int operator==(const WeightedInterval &intv) const;
+
+    friend std::ostream & operator << (std::ostream & out, WeightedInterval & wi) {
+        out << wi.size << " " << wi.start << " " << wi.end
+            << " " << wi.qStart << " " << wi.qEnd << " " << wi.readIndex
+            << " " << wi.pValue ;
+        return out;
+    }
+
+    float PValue() const;
+    int Size() const;
+};
+
+class CompareWeightedIntervalByPValue {
+public:
+    int operator()(const WeightedInterval& a, const WeightedInterval& b) const;
+};
+
+typedef std::vector<WeightedInterval> WeightedIntervalVector;
+
+typedef std::multiset<WeightedInterval, CompareWeightedIntervalByPValue> 
+T_WeightedIntervalMultiSet;
+
+class WeightedIntervalSet: public T_WeightedIntervalMultiSet {
+public:
+    int maxSize;
+    WeightedIntervalSet();
+    WeightedIntervalSet(int maxSizeP);
+    bool insert(WeightedInterval &intv);
+    friend std::ostream & operator << (std::ostream & out, WeightedIntervalSet & wis) {
+        WeightedIntervalSet::iterator it;
+        for (it = wis.begin(); it != wis.end(); it++) {
+            out << *((WeightedInterval*)&(*it)) << std::endl;
+        }
+        return out;
+    }
+};
+
+#endif
diff --git a/libcpp/alignment/files/BaseSequenceIO.cpp b/libcpp/alignment/files/BaseSequenceIO.cpp
new file mode 100644
index 0000000..ec39903
--- /dev/null
+++ b/libcpp/alignment/files/BaseSequenceIO.cpp
@@ -0,0 +1,77 @@
+#include <cstdlib>
+#include "BaseSequenceIO.hpp"
+
+using namespace std;
+
+void BaseSequenceIO::SetFiles(FileType &pFileType, std::string &pFileName) {
+    fileType = pFileType;
+    fileName = pFileName;
+}
+
+FileType BaseSequenceIO::GetFileType() {
+    return fileType;
+}
+
+int BaseSequenceIO::DetermineFileTypeByExtension(string &fileName, 
+    FileType &type, bool exitOnFailure) {
+
+    string::size_type dotPos = fileName.rfind(".");
+    if (dotPos != string::npos) {
+        string extension;
+        extension.assign(fileName, dotPos+1, fileName.size() - (dotPos+1));
+        if (extension == "fasta" or
+                extension == "fa" or
+                extension == "fas" or
+                extension == "fsta" or
+                extension == "screen"
+           ) {
+            type = Fasta;
+            return 1;
+        }
+        else if (extension == "h5") {
+            dotPos = fileName.rfind(".", dotPos-1); 
+            extension.assign(fileName, dotPos+1, fileName.size() - (dotPos + 1));
+            if (extension == "pls.h5" or extension == "plx.h5" ) {
+                type = HDFPulse;
+                return 1;
+            }
+            else if (extension == "bas.h5" or extension == "bax.h5") {
+                type = HDFBase;
+                return 1;
+            }
+            else if (extension == "ccs.h5") {
+                type = HDFCCSONLY;
+                return 1;
+            }
+            else {
+                type = None;
+                return 0;
+            }
+        }
+        else if (extension == "fastq" or
+                extension == "fq") {
+            type = Fastq;
+            return 1;
+        }
+        else if (extension == "4bit" or
+                extension == "fourbit") {
+            type = Fourbit;
+            assert("Four bit reading is not yet implemented for the reader agglomerate!" == 0);
+            return 1;
+        }
+        else if (extension == "bam") {
+            type = PBBAM;
+            return 1;
+        }
+        else {
+            type = None;
+            if (exitOnFailure) {
+                cout << "ERROR, file type '." << extension << "' is not understood to be one of pls.h5, fasta, fastq, nor bam. " << endl;
+                exit(1);
+            }
+            return 0;
+        }
+        return 0;
+    }
+    return 0;
+}
diff --git a/libcpp/alignment/files/BaseSequenceIO.hpp b/libcpp/alignment/files/BaseSequenceIO.hpp
new file mode 100644
index 0000000..1b187d2
--- /dev/null
+++ b/libcpp/alignment/files/BaseSequenceIO.hpp
@@ -0,0 +1,26 @@
+#ifndef _BLASR_DATA_FILE_TYPE_HPP_
+#define _BLASR_DATA_FILE_TYPE_HPP_
+
+#include <string>
+#include <iostream>
+#include <cassert>
+#include "Enumerations.h"
+
+class BaseSequenceIO {
+
+protected:
+
+    FileType fileType;
+    std::string fileName;
+
+public:
+
+    void SetFiles(FileType &pFileType, std::string &pFileName); 
+
+    FileType GetFileType(); 
+
+    static int DetermineFileTypeByExtension(std::string &fileName, FileType &type, 
+        bool exitOnFailure=true); 
+};	
+
+#endif // _BLASR_DATA_FILE_TYPE_HPP_
diff --git a/libcpp/alignment/files/CCSIterator.cpp b/libcpp/alignment/files/CCSIterator.cpp
new file mode 100644
index 0000000..7edf650
--- /dev/null
+++ b/libcpp/alignment/files/CCSIterator.cpp
@@ -0,0 +1,28 @@
+#include "files/CCSIterator.hpp"
+
+void CCSIterator::Initialize(CCSSequence *_seqPtr) {
+    seqPtr = _seqPtr;
+    curPass = 0;
+    numPasses = seqPtr->passDirection.size();
+}
+
+int CCSIterator::GetNext(int &direction, int &startBase, int &numBases) {
+    if (curPass >= numPasses) {
+        return 0;
+    }
+    else {
+        direction = seqPtr->passDirection[curPass];
+        startBase = seqPtr->passStartBase[curPass];
+        numBases  = seqPtr->passNumBases[curPass];
+        ++curPass;
+        return 1;
+    }
+}
+
+void CCSIterator::Reset() {
+    curPass = 0;
+}
+
+int CCSIterator::GetNumPasses() {
+    return numPasses;
+}
diff --git a/libcpp/alignment/files/CCSIterator.hpp b/libcpp/alignment/files/CCSIterator.hpp
new file mode 100644
index 0000000..6f97641
--- /dev/null
+++ b/libcpp/alignment/files/CCSIterator.hpp
@@ -0,0 +1,21 @@
+#ifndef _BLASR_BASE_CCS_ITERATOR_HPP_
+#define _BLASR_BASE_CCS_ITERATOR_HPP_
+
+#include "CCSSequence.hpp"
+
+class CCSIterator {
+public:
+    CCSSequence *seqPtr;
+    int curPass;
+    int numPasses;
+  
+	virtual void Initialize(CCSSequence *_seqPtr);
+
+	virtual int GetNext(int &direction, int &startBase, int &numBases);
+
+   	void Reset();
+
+    int GetNumPasses();
+};
+
+#endif
diff --git a/libcpp/alignment/files/FragmentCCSIterator.cpp b/libcpp/alignment/files/FragmentCCSIterator.cpp
new file mode 100644
index 0000000..d02876c
--- /dev/null
+++ b/libcpp/alignment/files/FragmentCCSIterator.cpp
@@ -0,0 +1,109 @@
+#include "files/FragmentCCSIterator.hpp"
+
+
+void FragmentCCSIterator::
+Initialize(CCSSequence *_seqPtr, RegionTable *_regionTablePtr) {
+    seqPtr         = _seqPtr;
+    regionTablePtr = _regionTablePtr;
+    curPass = 0;
+    numPasses = 0;
+    subreadIntervals.clear();
+    readIntervalDirection.clear();
+
+    int hqRegionStart, hqRegionEnd, hqRegionScore;
+    hqRegionStart = hqRegionEnd = hqRegionScore = 0;
+
+    bool hasHQRegion = LookupHQRegion(seqPtr->zmwData.holeNumber, 
+        *regionTablePtr, hqRegionStart, hqRegionEnd, hqRegionScore);
+
+    if (not hasHQRegion) {
+        return; // Don't bother if there is no HQ region.
+    }
+
+    //
+    // Since this iterator covers all passes, and not just those
+    // included in the ccs, the the regions need to be loaded.
+    //
+    CollectSubreadIntervals(*seqPtr, regionTablePtr, subreadIntervals);
+    if (subreadIntervals.size() == 0) { return;}
+
+    readIntervalDirection.resize(subreadIntervals.size());
+    fill(readIntervalDirection.begin(), readIntervalDirection.end(), 2);
+
+    //
+    // Assign the read interval directions based on the pass direction
+    // for the pass that has a similar start position.  This allows
+    // some wiggle although in practice they coordinates of the pass
+    // start base and the template should always match up. 
+    //
+    int i, j;
+    for (i = 0; i < subreadIntervals.size(); i++) {
+        for (j = 0; j < seqPtr->passStartBase.size(); j++) {
+            if (abs( ((int)subreadIntervals[i].start)  - 
+                     ((int)seqPtr->passStartBase[j]) ) < 10) {
+                readIntervalDirection[i] = seqPtr->passDirection[j];
+                break;
+            }
+        }
+    }
+
+    int firstAssignedSubread = 0;
+    while (firstAssignedSubread < subreadIntervals.size() and 
+           readIntervalDirection[firstAssignedSubread] == 2) { 
+        firstAssignedSubread++; 
+    }
+
+    if (firstAssignedSubread == subreadIntervals.size()) {
+        // None of the subread has been assigned a direction, guess.
+        firstAssignedSubread = 0;
+        readIntervalDirection[0] = 0;
+    }
+
+    // Assign directions to intervals to the left of the first assigned.
+    if (firstAssignedSubread < subreadIntervals.size() and 
+        subreadIntervals.size() > 0) {
+        int curSubreadDir = readIntervalDirection[firstAssignedSubread];
+        assert(curSubreadDir == 0 or curSubreadDir == 1);
+        for (i = firstAssignedSubread - 1; i >= 0; i--) {
+            curSubreadDir = (curSubreadDir==0)?1:0;
+            readIntervalDirection[i] = curSubreadDir;
+        }
+    }
+
+    // Assign directions to intervals which are to the right of the first 
+    // assigned and whose direction is unknown.
+    for (i = firstAssignedSubread + 1; i < subreadIntervals.size(); i++) {
+        int & di = readIntervalDirection[i];
+        int   dp = readIntervalDirection[i-1]; 
+        if (di != 0 and di != 1) {
+            di = (dp==0)?1:0; 
+        }
+    }
+
+    //
+    // So far, subreadIntervals have been sorted and each assigned 
+    // a passDirection. But since all or part of a subreadInterval 
+    // may not be in the HQ region, we need to trim low quality regions 
+    // from subreads, remove subreads which do not have any high quality 
+    // regions from subreadIntervals and their corresponding pass directions 
+    // from readIntervalDirection. 
+    //
+    GetHighQualitySubreadsIntervals(subreadIntervals, 
+            readIntervalDirection,
+            hqRegionStart, hqRegionEnd);
+    // Update number of passes. 
+    numPasses = subreadIntervals.size();
+}
+
+int FragmentCCSIterator::
+GetNext(int &direction, int &startBase, int &numBases) {
+    if (curPass >= subreadIntervals.size()) {
+        return 0;
+    }
+    direction = int(readIntervalDirection[curPass]);
+    startBase = int(subreadIntervals[curPass].start);
+    numBases  = int(subreadIntervals[curPass].end - subreadIntervals[curPass].start);
+    ++curPass;
+    return 1;
+}
+
diff --git a/libcpp/alignment/files/FragmentCCSIterator.hpp b/libcpp/alignment/files/FragmentCCSIterator.hpp
new file mode 100644
index 0000000..620491f
--- /dev/null
+++ b/libcpp/alignment/files/FragmentCCSIterator.hpp
@@ -0,0 +1,23 @@
+#ifndef _BLASR_FRAGMENT_CCS_ITERATOR_HPP_
+#define _BLASR_FRAGMENT_CCS_ITERATOR_HPP_
+
+#include <vector>
+#include "reads/RegionTable.hpp"
+#include "utils/RegionUtils.hpp"
+#include "files/CCSIterator.hpp"
+
+
+class FragmentCCSIterator : public CCSIterator {
+public:
+    RegionTable *regionTablePtr;
+    std::vector<ReadInterval> subreadIntervals;
+    std::vector<int> readIntervalDirection;
+
+    virtual 
+    void Initialize(CCSSequence *_seqPtr, RegionTable *_regionTablePtr);
+
+    virtual 
+    int GetNext(int & direction, int & startBase, int & numBases);
+};
+
+#endif
diff --git a/libcpp/alignment/files/ReaderAgglomerate.cpp b/libcpp/alignment/files/ReaderAgglomerate.cpp
new file mode 100644
index 0000000..ff04a08
--- /dev/null
+++ b/libcpp/alignment/files/ReaderAgglomerate.cpp
@@ -0,0 +1,505 @@
+#include "files/ReaderAgglomerate.hpp"
+
+void ReaderAgglomerate::SetToUpper() {
+    fastaReader.SetToUpper();
+}
+
+void ReaderAgglomerate::InitializeParameters() {
+    start  = 0;
+    stride = 1;
+    subsample = 1.1;
+    readQuality = 1;
+    useRegionTable = true;
+    ignoreCCS = true;
+    readType = ReadType::SUBREAD;
+#ifdef USE_PBBAM
+    bamFilePtr = NULL;
+    entireFileQueryPtr = NULL;
+#endif
+}
+
+ReaderAgglomerate::ReaderAgglomerate() {
+    InitializeParameters();
+}
+
+ReaderAgglomerate::ReaderAgglomerate(float _subsample) {
+    this->InitializeParameters();
+    subsample = _subsample;
+}
+
+ReaderAgglomerate::ReaderAgglomerate(int _stride) {
+    this->InitializeParameters();
+    stride = _stride;
+}
+
+ReaderAgglomerate::ReaderAgglomerate(int _start, int _stride) {
+    this->InitializeParameters();
+    start  = _start;
+    stride = _stride;
+}
+
+void ReaderAgglomerate::GetMovieName(string &movieName) {
+    if (fileType == Fasta || fileType == Fastq) {
+        movieName = fileName;
+    }
+    else if (fileType == HDFPulse || fileType == HDFBase) {
+        movieName = hdfBasReader.GetMovieName();
+    } 
+    else if (fileType == HDFCCS || fileType == HDFCCSONLY) {
+        movieName = hdfCcsReader.GetMovieName();
+    }
+    else if (fileType == PBBAM) {
+#ifdef USE_PBBAM
+        assert("Reading movie name from BAM using ReaderAgglomerate is not supported." == 0);
+#endif 
+    }
+}
+
+void ReaderAgglomerate::GetChemistryTriple(string & bindingKit, 
+        string & sequencingKit, string & baseCallerVersion) {
+    if (fileType == HDFPulse || fileType == HDFBase) {
+        hdfBasReader.GetChemistryTriple(bindingKit, sequencingKit, baseCallerVersion);
+    }
+    else if (fileType == HDFCCS || fileType == HDFCCSONLY) {
+        hdfCcsReader.GetChemistryTriple(bindingKit, sequencingKit, baseCallerVersion);
+    }
+    else if (fileType == PBBAM) {
+#ifdef USE_PBBAM
+        assert("Reading chemistry triple from BAM using ReaderAgglomerate is not supported." == 0);
+#endif
+    } else {
+        sequencingKit = bindingKit = baseCallerVersion = "";
+    }
+}
+
+void ReaderAgglomerate::SetReadType(const ReadType::ReadTypeEnum & readType_) {
+    readType = readType_;
+}
+
+ReadType::ReadTypeEnum ReaderAgglomerate::GetReadType() {
+    return readType;
+}
+
+bool ReaderAgglomerate::FileHasZMWInformation() {
+    return (fileType == HDFPulse || fileType == HDFBase || 
+            fileType == HDFCCS || fileType == HDFCCSONLY);
+}
+
+void ReaderAgglomerate::SkipReadQuality() {
+    readQuality = 0;
+}
+
+void ReaderAgglomerate::IgnoreCCS() {
+    ignoreCCS = true;
+}
+  
+void ReaderAgglomerate::UseCCS() {
+    ignoreCCS = false;
+    hdfBasReader.SetReadBasesFromCCS();
+}
+
+int ReaderAgglomerate::Initialize(string &pFileName) {
+    if (DetermineFileTypeByExtension(pFileName, fileType)) {
+        fileName = pFileName;
+        return Initialize();
+    }
+    return false;
+}
+
+bool ReaderAgglomerate::SetReadFileName(string &pFileName) {
+    if (DetermineFileTypeByExtension(pFileName, fileType)) {
+        fileName = pFileName;
+        return true;
+    }
+    else {
+        return false;
+    }
+}
+
+int ReaderAgglomerate::Initialize(FileType &pFileType, string &pFileName) {
+    SetFiles(pFileType, pFileName);
+    return Initialize();
+}
+
+#define UNREACHABLE() \
+    cout << "ERROR! Hit unreachable code in " << __FILE__ << ':' << __LINE__ << endl; \
+    assert(0)
+
+bool ReaderAgglomerate::HasRegionTable() {
+    switch(fileType) {
+        case PBBAM:
+        case Fasta:
+        case Fastq:
+            return false;
+            break;
+        case HDFPulse:
+        case HDFBase:
+            return hdfBasReader.HasRegionTable();
+            break;
+        case HDFCCSONLY:
+        case HDFCCS:
+            return hdfCcsReader.HasRegionTable();
+            break;
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+    return false;
+}
+
+#ifdef USE_PBBAM
+
+#define GET_NEXT_FROM_BAM() \
+    numRecords = (bamIterator == entireFileQueryPtr->end())?0:1;\
+    if (numRecords != 0) {seq.Copy(*bamIterator); bamIterator++;} 
+
+#define RESET_PBBAM_PTRS() \
+    if (bamFilePtr != NULL) {delete bamFilePtr; bamFilePtr = NULL;} \
+    if (entireFileQueryPtr != NULL) {delete entireFileQueryPtr; entireFileQueryPtr = NULL;}
+
+#endif
+
+int ReaderAgglomerate::Initialize() {
+    int init = 1;
+    switch(fileType) {
+        case Fasta:
+            init = fastaReader.Init(fileName);
+            break;
+        case Fastq:
+            init = fastqReader.Init(fileName);
+            break;
+        case HDFCCSONLY:
+            ignoreCCS = false;
+            hdfCcsReader.SetReadBasesFromCCS();
+            hdfCcsReader.InitializeDefaultIncludedFields();
+            init = hdfCcsReader.Initialize(fileName);
+            if (init == 0) return 0;
+            break;
+        case HDFPulse:
+        case HDFBase:
+            //
+            // Here one needs to test and see if the hdf file contains ccs.
+            // If this is the case, then the file type is HDFCCS.
+            if (hdfCcsReader.BasFileHasCCS(fileName) and !ignoreCCS) {
+                fileType = HDFCCS;
+                hdfCcsReader.InitializeDefaultIncludedFields();
+                init = hdfCcsReader.Initialize(fileName);
+                if (init == 0) return 0;
+            }
+            else {
+                hdfBasReader.InitializeDefaultIncludedFields();
+                init = hdfBasReader.Initialize(fileName);
+                //
+                // This code is added so that meaningful names are printed 
+                // when running on simulated data that contains the coordinate
+                // information.
+                if (init == 0) return 0;
+            }
+            break;
+        case PBBAM: 
+#ifdef USE_PBBAM
+            RESET_PBBAM_PTRS();
+            try {
+                bamFilePtr = new PacBio::BAM::BamFile(fileName);
+            } catch (std::exception e) {
+                cout << "ERROR! Failed to open " << fileName 
+                     << ": " << e.what() << endl;
+                return 0;
+            }
+            entireFileQueryPtr = new PacBio::BAM::EntireFileQuery(*bamFilePtr);
+            bamIterator = entireFileQueryPtr->begin();
+            break;
+#endif
+        case HDFCCS:
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+    readGroupId = "";
+    if (init == 0 || (start > 0 && Advance(start) == 0) ){
+        return 0;
+    };
+    if (fileType != PBBAM) {
+        // All reads from a non-PBBAM file must have the same read group id. 
+        // Reads from a PABBAM file may come from different read groups.
+        // We have sync reader.readGroupId and SMRTSequence.readGroupId everytime
+        // GetNext() is called.
+        string movieName; GetMovieName(movieName);
+        readGroupId = MakeReadGroupId(movieName, readType);
+    }
+    return 1;
+}
+
+ReaderAgglomerate & ReaderAgglomerate::operator=(ReaderAgglomerate &rhs) {
+    fileType     = rhs.fileType;
+    fileName = rhs.fileName;
+    return *this;
+}
+
+bool ReaderAgglomerate::Subsample(float rate) {
+    bool retVal = true;
+    while( (rand() % 100 + 1) > (rate * 100) and (retVal = Advance(1)));
+    return retVal;
+}
+
+int ReaderAgglomerate::GetNext(FASTASequence &seq) {
+    int numRecords = 0;
+    if (Subsample(subsample) == 0) {
+        return 0;
+    }
+    switch(fileType) {
+        case Fasta:
+            numRecords = fastaReader.GetNext(seq);
+            break;
+        case Fastq:
+            numRecords = fastqReader.GetNext(seq);
+            break;
+        case HDFPulse:
+        case HDFBase:
+            numRecords = hdfBasReader.GetNext(seq);
+            break;
+        case HDFCCSONLY:
+        case HDFCCS:
+            cout << "ERROR! Reading CCS into a structure that cannot handle it." << endl;
+            assert(0);
+            break;
+        case PBBAM:
+#ifdef USE_PBBAM
+            GET_NEXT_FROM_BAM();
+            break;
+#endif
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+    seq.CleanupOnFree();
+    return numRecords;
+}
+
+int ReaderAgglomerate::GetNext(FASTQSequence &seq) {
+    int numRecords = 0;
+    if (Subsample(subsample) == 0) {
+        return 0;
+    }
+    switch(fileType) {
+        case Fasta:
+            numRecords = fastaReader.GetNext(seq);
+            break;
+        case Fastq:
+            numRecords = fastqReader.GetNext(seq);
+            break;
+        case HDFPulse:
+        case HDFBase:
+            numRecords = hdfBasReader.GetNext(seq);
+            break;
+        case PBBAM:
+#ifdef USE_PBBAM
+            GET_NEXT_FROM_BAM();
+            break;
+#endif
+        case HDFCCSONLY:
+        case HDFCCS:
+            cout << "ERROR! Reading CCS into a structure that cannot handle it." << endl;
+            assert(0);
+            break;
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+    if (stride > 1)
+        Advance(stride-1);
+    return numRecords;
+}
+
+int ReaderAgglomerate::GetNext(SMRTSequence &seq) {
+    int numRecords = 0;
+
+    if (Subsample(subsample) == 0) {
+        return 0;
+    }
+    switch(fileType) {
+        case Fasta:
+            numRecords = fastaReader.GetNext(seq);
+            break;
+        case Fastq:
+            numRecords = fastqReader.GetNext(seq);
+            break;
+        case HDFPulse:
+        case HDFBase:
+            numRecords = hdfBasReader.GetNext(seq);
+            break;
+        case HDFCCSONLY:
+            cout << "ERROR! Reading CCS into a structure that cannot handle it." << endl;
+            assert(0);
+            break;
+        case HDFCCS:
+            assert(ignoreCCS == false);
+            assert(hdfBasReader.readBasesFromCCS == true);
+            numRecords = hdfBasReader.GetNext(seq);
+            break;
+        case PBBAM:
+#ifdef USE_PBBAM
+            GET_NEXT_FROM_BAM();
+            break;
+#endif
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+    // A sequence read from a Non-BAM files does not have read group id 
+    // and should be empty, use this->readGroupId instead. Otherwise, 
+    // read group id should be loaded from BamRecord to SMRTSequence, 
+    // update this->readGroupId accordingly.
+    if (fileType != PBBAM) seq.SetReadGroupId(readGroupId);
+    else readGroupId = seq.GetReadGroupId();
+
+    if (stride > 1)
+        Advance(stride-1);
+    return numRecords;
+}
+
+int ReaderAgglomerate::GetNextBases(SMRTSequence &seq, bool readQVs) {
+    int numRecords = 0;
+
+    if (Subsample(subsample) == 0) {
+        return 0;
+    }
+    switch(fileType) {
+        case Fasta:
+            cout << "ERROR! Can not GetNextBases from a Fasta File." << endl;
+            assert(0);
+            break;
+        case Fastq:
+            cout << "ERROR! Can not GetNextBases from a Fastq File." << endl;
+            assert(0);
+            break;
+        case HDFPulse:
+        case HDFBase:
+            numRecords = hdfBasReader.GetNextBases(seq, readQVs);
+            break;
+        case HDFCCSONLY:
+            cout << "ERROR! Reading CCS into a structure that cannot handle it." << endl;
+            assert(0);
+            break;
+        case HDFCCS:
+            cout << "ERROR! Can not GetNextBases from a CCS File." << endl;
+            assert(0);
+            break;
+        case PBBAM:
+#ifdef USE_PBBAM
+            cout << "ERROR! Can not GetNextBases from a BAM File." << endl;
+#endif
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+
+    if (fileType != PBBAM) seq.SetReadGroupId(readGroupId);
+    else readGroupId = seq.GetReadGroupId();
+
+    if (stride > 1)
+        Advance(stride-1);
+    return numRecords;
+}
+
+int ReaderAgglomerate::GetNext(CCSSequence &seq) {
+    int numRecords = 0;
+    if (Subsample(subsample) == 0) {
+        return 0;
+    }
+
+    switch(fileType) {
+        case Fasta:
+            // This just reads in the fasta sequence as if it were a ccs sequence
+            numRecords = fastaReader.GetNext(seq);
+            seq.subreadStart = 0;
+            seq.subreadEnd   = 0;
+            break;
+        case Fastq:
+            numRecords = fastqReader.GetNext(seq);
+            seq.subreadStart = 0;
+            seq.subreadEnd   = 0;
+            break;
+        case HDFPulse:
+        case HDFBase:
+            numRecords = hdfBasReader.GetNext(seq);
+            break;
+        case HDFCCSONLY:
+        case HDFCCS:
+            numRecords = hdfCcsReader.GetNext(seq);
+            break;
+        case PBBAM:
+#ifdef USE_PBBAM
+            cout << "ERROR! Could not read BamRecord as CCSSequence" << endl;
+#endif
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+
+    if (fileType != PBBAM) seq.SetReadGroupId(readGroupId);
+    else readGroupId = seq.GetReadGroupId();
+
+    if (stride > 1)
+        Advance(stride-1);
+    return numRecords;
+}
+
+
+int ReaderAgglomerate::Advance(int nSteps) {
+    int i;
+    switch(fileType) {
+        case Fasta:
+            return fastaReader.Advance(nSteps);
+        case HDFPulse:
+        case HDFBase:
+            return hdfBasReader.Advance(nSteps);
+        case HDFCCSONLY:
+        case HDFCCS:
+            return hdfCcsReader.Advance(nSteps);
+        case Fastq:
+            return fastqReader.Advance(nSteps);
+        case PBBAM:
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+    return false;
+}
+
+void ReaderAgglomerate::Close() {
+    switch(fileType) {
+        case Fasta:
+            fastaReader.Close();
+            break;
+        case Fastq:
+            fastqReader.Close();
+            break;
+        case HDFPulse:
+        case HDFBase:
+            hdfBasReader.Close();
+            break;
+        case HDFCCSONLY:
+        case HDFCCS:
+            hdfCcsReader.Close();
+            break;
+        case PBBAM:
+#ifdef USE_PBBAM
+            RESET_PBBAM_PTRS();
+            break;
+#endif
+        case Fourbit:
+        case None:
+            UNREACHABLE();
+            break;
+    }
+}
+
diff --git a/libcpp/alignment/files/ReaderAgglomerate.hpp b/libcpp/alignment/files/ReaderAgglomerate.hpp
new file mode 100644
index 0000000..0955498
--- /dev/null
+++ b/libcpp/alignment/files/ReaderAgglomerate.hpp
@@ -0,0 +1,136 @@
+#ifndef _BLASR_READER_AGGLOMERATE_HPP_
+#define _BLASR_READER_AGGLOMERATE_HPP_
+
+#include <cstdlib>
+
+#include "Enumerations.h"
+#include "reads/ReadType.hpp"
+#include "files/BaseSequenceIO.hpp"
+
+#include "FASTAReader.hpp"
+#include "FASTQReader.hpp"
+#include "CCSSequence.hpp"
+#include "SMRTSequence.hpp"
+#include "StringUtils.hpp"
+
+#include "HDFBasReader.hpp"
+#include "HDFCCSReader.hpp"
+
+#ifdef USE_PBBAM
+#include "pbbam/BamFile.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/BamRecord.h"
+#endif
+
+class ReaderAgglomerate : public BaseSequenceIO {
+  FASTAReader fastaReader;
+  FASTQReader fastqReader;
+  int readQuality;
+  int stride;
+  int start;
+  float subsample;
+  bool useRegionTable;
+  bool ignoreCCS;
+  ReadType::ReadTypeEnum readType;
+
+public:
+  //
+  // Create interfaces for reading hdf 
+  //
+  T_HDFBasReader<SMRTSequence>  hdfBasReader;
+  HDFCCSReader<CCSSequence>     hdfCcsReader;
+  vector<SMRTSequence>          readBuffer;
+  vector<CCSSequence>           ccsBuffer;
+  string readGroupId;
+
+public:
+  void SetToUpper();
+
+  void InitializeParameters();
+  ReaderAgglomerate();
+
+  ReaderAgglomerate(float _subsample);
+
+  ReaderAgglomerate(int _stride);
+
+  ReaderAgglomerate(int _start, int _stride);
+
+  void GetMovieName(string &movieName);
+
+  /// Get BindingKit, SequencingKit and Base Caller Version from h5.
+  ///
+  /// /param [out] sequencingKit - sequencingKit from 
+  /// /ScanData/RunInfo/SequencingKit.
+  ///
+  /// /param [out] bindingKit - BindingKit from 
+  /// /ScanData/RunInfo/BindingKit.
+  ///
+  /// /param [out] baseCallerVersion - Base Caller Version
+  /// from /PulseData/BaseCalls/ChangeListID.
+  ///
+  void GetChemistryTriple(string & bindingKit, 
+                          string & sequencingKit, 
+                          string & baseCallerVersion);
+ 
+  bool FileHasZMWInformation();
+
+  void SkipReadQuality();
+
+  void IgnoreCCS();
+
+  void UseCCS();
+
+  int Initialize(string &pFileName);
+
+  bool SetReadFileName(string &pFileName);
+
+  int Initialize(FileType &pFileType, string &pFileName);
+
+  bool HasRegionTable();
+
+  int Initialize();
+
+  ReaderAgglomerate &operator=(ReaderAgglomerate &rhs);
+
+  bool Subsample(float rate);
+
+  // Set read type to SUBREAD, CCS, or UNKNOWN.
+  void SetReadType(const ReadType::ReadTypeEnum & readType_);
+  
+  // returns read type, SUBREAD, CCS, or UNKNOWN
+  ReadType::ReadTypeEnum GetReadType();
+
+public:
+  int GetNext(FASTASequence &seq);
+  int GetNext(FASTQSequence &seq);
+  int GetNext(SMRTSequence &seq);
+  int GetNext(CCSSequence &seq);
+
+  template<typename T_Sequence>
+      int GetNext(T_Sequence & seq, int & randNum);
+
+  int GetNextBases(SMRTSequence & seq, bool readQVs);
+
+  int Advance(int nSteps);
+
+  void Close();
+
+#ifdef USE_PBBAM
+public:
+  // Define reader to fetch sequences from bam.
+  PacBio::BAM::BamFile * bamFilePtr;
+  PacBio::BAM::EntireFileQuery * entireFileQueryPtr;
+  PacBio::BAM::EntireFileQuery::iterator bamIterator;
+#endif
+};
+
+
+template<typename T_Sequence>
+int ReadChunkByNReads(ReaderAgglomerate &reader, vector<T_Sequence> &reads, int maxNReads);
+
+template<typename T_Sequence>
+int ReadChunkBySize (ReaderAgglomerate &reader, vector<T_Sequence> &reads, int maxMemorySize);
+
+#include "files/ReaderAgglomerateImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/files/ReaderAgglomerateImpl.hpp b/libcpp/alignment/files/ReaderAgglomerateImpl.hpp
new file mode 100644
index 0000000..c50fafa
--- /dev/null
+++ b/libcpp/alignment/files/ReaderAgglomerateImpl.hpp
@@ -0,0 +1,44 @@
+#ifndef _BLASR_READER_AGGLOMERATE_IMPL_HPP_
+#define _BLASR_READER_AGGLOMERATE_IMPL_HPP_
+
+template<typename T_Sequence>
+int ReaderAgglomerate::GetNext(T_Sequence & seq, int & randNum) {
+    randNum = rand();
+    return GetNext(seq);
+}
+
+template<typename T_Sequence>
+int ReadChunkByNReads(ReaderAgglomerate &reader, vector<T_Sequence> &reads, int maxNReads) {
+    T_Sequence seq;
+    int nReads = 0;
+    while(nReads < maxNReads) {
+        if (reader.GetNext(seq)) {
+            reads.push_back(seq);
+            ++nReads;
+        }
+        else {
+            break;
+        }
+    }
+    return nReads;
+}
+
+template<typename T_Sequence>
+int ReadChunkBySize (ReaderAgglomerate &reader, vector<T_Sequence> &reads, int maxMemorySize) {
+    T_Sequence seq;
+    int nReads = 0;
+    int totalStorage = 0;
+    while (totalStorage < maxMemorySize) {
+        if (reader.GetNext(seq)) {
+            reads.push_back(seq);
+            totalStorage += seq.GetStorageSize();
+            nReads++;
+        }
+        else {
+            break;
+        }
+    }
+    return nReads;
+}
+
+#endif
diff --git a/libcpp/alignment/format/BAMPrinter.hpp b/libcpp/alignment/format/BAMPrinter.hpp
new file mode 100644
index 0000000..db70308
--- /dev/null
+++ b/libcpp/alignment/format/BAMPrinter.hpp
@@ -0,0 +1,29 @@
+#ifndef _BLASR_FORMAT_BAMPRINTER_HPP_
+#define _BLASR_FORMAT_BAMPRINTER_HPP_ 
+
+#ifdef USE_PBBAM
+#include <sstream>
+#include <stdint.h>
+#include "format/SAMPrinter.hpp"
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamWriter.h"
+
+template<typename T_Sequence>
+void AlignmentToBamRecord(T_AlignmentCandidate & alignment, 
+        T_Sequence & read, PacBio::BAM::BamRecord & bamRecord, 
+        AlignmentContext & context, SupplementalQVList & qvList,
+        Clipping clipping, bool cigarUseSeqMatch);
+
+namespace BAMOutput {
+
+template<typename T_Sequence>
+void PrintAlignment(T_AlignmentCandidate &alignment, T_Sequence &read,
+        PacBio::BAM::BamWriter &bamWriter, AlignmentContext &context, 
+        SupplementalQVList & qvList, Clipping clipping, 
+        bool cigarUseSeqMatch=false);
+}
+
+#include "BAMPrinterImpl.hpp"
+
+#endif
+#endif
diff --git a/libcpp/alignment/format/BAMPrinterImpl.hpp b/libcpp/alignment/format/BAMPrinterImpl.hpp
new file mode 100644
index 0000000..9dd66c6
--- /dev/null
+++ b/libcpp/alignment/format/BAMPrinterImpl.hpp
@@ -0,0 +1,168 @@
+#ifndef _BLASR_BAM_PRINTER_IMPL_HPP_
+#define _BLASR_BAM_PRINTER_IMPL_HPP_
+
+#ifdef USE_PBBAM
+
+#include <algorithm>
+#include "utils/SMRTTitle.hpp"
+using namespace BAMOutput;
+using namespace std;
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamFile.h"
+
+template<typename T_Sequence>
+void AlignmentToBamRecord(T_AlignmentCandidate & alignment, 
+        T_Sequence & read, PacBio::BAM::BamRecord & bamRecord,
+        AlignmentContext & context, SupplementalQVList & qvList,
+        Clipping clipping, bool cigarUseSeqMatch) {
+    assert(clipping == SAMOutput::soft or clipping == SAMOutput::subread);
+
+    // Build from scratch if input reads are not from pbbam files.
+    // Otherwise, use API provided by pbbam to make alignments from bamRecords.
+ 
+    bool buildFromScratch = false;
+    if (dynamic_cast<SMRTSequence*>(&read) == NULL) {
+        //not SMRTSequence 
+        buildFromScratch = true;
+    } else { //is SMRTSequence, but not copied from bam.
+        if (not read.copiedFromBam) {
+            buildFromScratch = true;
+        }
+    }
+
+    // build cigar string.
+    string cigarString;
+    T_Sequence alignedSequence;
+    DNALength prefixSoftClip = 0, suffixSoftClip = 0;
+    DNALength prefixHardClip = 0, suffixHardClip = 0;
+    CreateCIGARString(alignment, read, cigarString, clipping,
+                      prefixSoftClip, suffixSoftClip, 
+                      prefixHardClip, suffixHardClip,
+                      cigarUseSeqMatch);
+    SetAlignedSequence(alignment, read, alignedSequence, clipping);
+    PacBio::BAM::Cigar cigar = PacBio::BAM::Cigar::FromStdString(cigarString);
+ 
+    // build flag
+    uint16_t flag;
+    BuildFlag(alignment, context, flag);
+
+    // Get sequence string.
+    string seqString;
+    seqString.assign((char*)alignedSequence.seq, alignedSequence.length);
+
+    // Get alignment starting position on reference sequence forward strand.
+    PacBio::BAM::Position pos = 0;
+    PacBio::BAM::Strand strand;
+    if (alignment.tStrand == 0) {
+        pos = static_cast<PacBio::BAM::Position>(alignment.TAlignStart());
+        strand = PacBio::BAM::Strand::FORWARD;
+    } else {
+        pos = static_cast<PacBio::BAM::Position>(alignment.tLength - (alignment.TAlignStart() + alignment.TEnd()));
+        strand = PacBio::BAM::Strand::REVERSE;
+    }
+
+    if (buildFromScratch) {
+        SMRTTitle smrtTitle(alignment.qName);
+        if (smrtTitle.isSMRTTitle) {
+            bamRecord.Impl().Name(smrtTitle.ToString());
+        } else {
+            cout << "ERROR, can not convert non-pacbio reads to pbbam record." << endl;
+            exit(-1);
+        }
+        bamRecord.Impl().SetSequenceAndQualities(seqString, alignedSequence.qual.ToString());
+        bamRecord.Impl().CigarData(cigar);
+        bamRecord.Impl().Bin(0);
+        bamRecord.Impl().InsertSize(0);
+        bamRecord.Impl().MapQuality(static_cast<uint8_t>(alignment.mapQV));
+        bamRecord.Impl().MatePosition(static_cast<PacBio::BAM::Position>(-1));
+        bamRecord.Impl().MateReferenceId(static_cast<int32_t>(-1));
+        bamRecord.Impl().Position(pos);
+        bamRecord.Impl().ReferenceId(static_cast<int32_t>(alignment.tIndex));
+
+        if (strand == PacBio::BAM::Strand::REVERSE) {
+            bamRecord.Impl().SetReverseStrand(true);
+        }
+
+        // Add tags required for bax->bam.
+        PacBio::BAM::TagCollection tags;
+        tags["RG"] = context.readGroupId;
+        if (dynamic_cast<CCSSequence*>(&read) == NULL) { // subread
+            tags["qs"] = read.subreadStart;
+            tags["qe"] = read.subreadEnd;
+            /// Number of passes for a subread should always be 1.
+            tags["np"] = 1;
+        } else { // ccs read
+            /// Number of passes for ccs reads.
+            tags["np"] = (static_cast<CCSSequence*>(&read))->numPasses;
+        }
+        tags["zm"] = read.zmwData.holeNumber;
+
+        // Build QV tags.
+        // Skip tags not define in BAM specification 3.0. 
+        // including XL, XT, XQ, XS, XE, YS, YE.
+        //
+        // Write out optional quality values.  If qvlist does not
+        // have any qv's signaled to print, this is a no-op.
+        //
+        // First transform characters that are too large to printable ones.
+        qvList.FormatQVOptionalFields(alignedSequence);
+
+        // Add QVs to BamRecordImpl.
+        string insertionQVs, deletionQVs, substitutionQVs, mergeQVs, substitutionTags, deletionTags;
+        bool alnReverse = (alignment.tStrand == 1); // reverse-complement alignment
+        // If this is a reverse-complement alignment, bases and QVs of 
+        // alignedSequence are reverse(-complement) of the sequence read
+        // from bax.h5 file. With PB BAM specification 3.0, QVs will be stored 
+        // in BAM Record, therefore, reverse orders of QVs before add QV tags. 
+        if (alignedSequence.GetQVs("InsertionQV", insertionQVs, alnReverse)) { 
+            tags["iq"] = insertionQVs;
+        }
+        if (alignedSequence.GetQVs("DeletionQV", deletionQVs, alnReverse)) {
+            tags["dq"] = deletionQVs;
+        } 
+        if (alignedSequence.GetQVs("SubstitutionQV", substitutionQVs, alnReverse)) {
+            tags["sq"] = substitutionQVs;
+        } 
+        if (alignedSequence.GetQVs("MergeQV", mergeQVs, alnReverse)) {
+            tags["mq"] = mergeQVs;
+        }
+        // substitutionTag is not included by default
+        if (alignedSequence.GetQVs("DeletionTag", deletionTags, alnReverse)) {
+            tags["dt"] = deletionTags;
+        }
+        bamRecord.Impl().Tags(tags);
+    } else {
+        // The following code can be used to hard-clip reads, if needed. 
+        // PacBio::BAM::Position clipStart = read.bamRecord.QueryStart() + alignment.QAlignStart();
+        // PacBio::BAM::Position clipEnd = read.bamRecord.QueryStart() + alignment.QAlignEnd();
+        // bamRecord = PacBio::BAM::BamRecord::Clipped(read.bamRecord, 
+        //                PacBio::BAM::ClipType::CLIP_TO_QUERY,
+        //                clipStart, clipEnd).
+        bamRecord = PacBio::BAM::BamRecord::Mapped(read.bamRecord,
+                        static_cast<int32_t>(alignment.tIndex),
+                        static_cast<PacBio::BAM::Position>(pos),
+                        strand, cigar, 
+                        static_cast<uint8_t>(alignment.mapQV));
+    }
+
+    // Add tags common for bax->bam and bam->bam.
+    bamRecord.Impl().AddTag("AS", alignment.score);
+    bamRecord.Impl().AddTag("NM", context.editDist);
+
+    // Set Flag 
+    bamRecord.Impl().Flag(static_cast<uint32_t>(flag));
+
+}
+
+template<typename T_Sequence>
+void BAMOutput::PrintAlignment(T_AlignmentCandidate &alignment, T_Sequence &read,
+        PacBio::BAM::BamWriter &bamWriter, AlignmentContext &context, 
+        SupplementalQVList & qvList, Clipping clipping, bool cigarUseSeqMatch) {
+
+    PacBio::BAM::BamRecord bamRecord;
+    AlignmentToBamRecord(alignment, read, bamRecord, context, qvList, clipping, cigarUseSeqMatch);
+    bamWriter.Write(bamRecord);
+}
+#endif
+
+#endif
diff --git a/libcpp/alignment/format/CompareSequencesPrinter.cpp b/libcpp/alignment/format/CompareSequencesPrinter.cpp
new file mode 100644
index 0000000..581664a
--- /dev/null
+++ b/libcpp/alignment/format/CompareSequencesPrinter.cpp
@@ -0,0 +1,10 @@
+#include "CompareSequencesPrinter.hpp"
+
+void CompareSequencesOutput::PrintHeader(std::ostream &out) {
+  out << "qName qLength qStart qEnd qStrand "
+      << "tName tLength tStart tEnd tStrand "
+      << "score numMatch numMismatch numIns numDel "
+      << "mapQV qAlignedSeq matchPattern tAlignedSeq"
+      << std::endl;
+}
+
diff --git a/libcpp/alignment/format/CompareSequencesPrinter.hpp b/libcpp/alignment/format/CompareSequencesPrinter.hpp
new file mode 100644
index 0000000..bd5fe34
--- /dev/null
+++ b/libcpp/alignment/format/CompareSequencesPrinter.hpp
@@ -0,0 +1,21 @@
+#ifndef _BLASR_COMPARE_SEQUENCES_PRINTER_HPP_
+#define _BLASR_COMPARE_SEQUENCES_PRINTER_HPP_
+
+#include <fstream>
+#include <iostream>
+#include "algorithms/alignment/AlignmentUtils.hpp"
+
+namespace CompareSequencesOutput{
+
+void PrintHeader(std::ostream &out);
+
+template<typename T_Alignment, typename T_QuerySequence, typename T_TargetSequence>
+void Print(T_Alignment &alignment, 
+    T_QuerySequence &qseq, T_TargetSequence &tseq, 
+    std::ostream &out, bool refForward=true);
+
+}
+
+#include "CompareSequencesPrinterImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/format/CompareSequencesPrinterImpl.hpp b/libcpp/alignment/format/CompareSequencesPrinterImpl.hpp
new file mode 100644
index 0000000..e285780
--- /dev/null
+++ b/libcpp/alignment/format/CompareSequencesPrinterImpl.hpp
@@ -0,0 +1,77 @@
+#ifndef _BLASR_COMPARE_SEQUENCES_PRINTER_IMPL_HPP_
+#define _BLASR_COMPARE_SEQUENCES_PRINTER_IMPL_HPP_
+
+template<typename T_Alignment, typename T_QuerySequence, typename T_TargetSequence>
+void CompareSequencesOutput::Print(T_Alignment &alignment, 
+    T_QuerySequence &qseq, T_TargetSequence &tseq, 
+    std::ostream &out, bool refForward) {
+
+	std::string queryStr, alignStr, textStr;
+	CreateAlignmentStrings(alignment, qseq, tseq, textStr, alignStr, queryStr);
+
+	if (refForward == false) {
+		if (alignment.qStrand == 1 and alignment.tStrand == 0) {
+			DNALength alignedSeqToEnd = 0;
+			//			DNALength alignedTSeqToEnd = 0;
+			if (alignment.blocks.size() > 0) {
+				// First compute the offset of the reverse of the substring that was aligned.
+				
+				alignedSeqToEnd = alignment.qLength - (alignment.qAlignedSeqPos + alignment.qAlignedSeq.length);
+				DNALength alignEndToSubstrEnd = alignment.qAlignedSeq.length - (alignment.qPos + alignment.blocks[alignment.blocks.size()-1].qPos + alignment.blocks[alignment.blocks.size()-1].length);
+				alignment.qPos = alignEndToSubstrEnd;
+			}
+			alignment.qAlignedSeqPos = alignedSeqToEnd;
+			alignment.qStrand = 0;
+			alignment.tStrand = 1;
+							
+		}	
+	}
+	
+	PrintCompareSequencesAlignmentStats(alignment, out);
+	// change the spaces in the align string to *s for easy parsing of alignment
+	VectorIndex i;
+	for (i = 0; i < alignStr.size(); i++ ) { 
+		if (alignStr[i] == ' ') alignStr[i] = '*';
+	}
+
+	if (refForward == false and alignment.tStrand == 1) {
+		//
+		// Build reverse complement strings.
+		//
+        std::string queryStrRC, alignStrRC, textStrRC;
+		queryStrRC.resize(queryStr.size());
+		alignStrRC.resize(alignStr.size());
+		textStrRC.resize(alignStr.size());
+		
+		DNALength pos;
+		DNALength alignStringLength = alignStr.size();
+		for (pos = 0; pos < alignStringLength; pos++ ) {
+			if (queryStr[pos] != '-') {
+				queryStrRC[alignStringLength-pos-1] = ReverseComplementNuc[queryStr[pos]];
+			}
+			else {
+				queryStrRC[alignStringLength-pos-1] = '-';
+			}
+			alignStrRC[alignStringLength-pos-1] = alignStr[pos];
+			
+			if (textStr[pos] != '-') {
+				textStrRC[alignStringLength-pos-1] = ReverseComplementNuc[textStr[pos]];
+			}
+			else {
+				textStrRC[alignStringLength-pos-1] = '-';
+			}
+		}
+		queryStr = queryStrRC;
+		alignStr = alignStrRC;
+		textStr  = textStrRC;
+	}
+					
+    // Headers of m5 format are: 
+    // qName qSeqLength qStart qEnd qStrand 
+    // tName tSeqLength tStart tEnd tStrand
+    // score numMatch numMismatch numIns numDel
+    // mapQV qAlignedSeq matchPattern tAlignedSeq
+	out << queryStr << " " << alignStr << " " << textStr << std::endl;
+}
+
+#endif
diff --git a/libcpp/alignment/format/IntervalPrinter.cpp b/libcpp/alignment/format/IntervalPrinter.cpp
new file mode 100644
index 0000000..e9cd328
--- /dev/null
+++ b/libcpp/alignment/format/IntervalPrinter.cpp
@@ -0,0 +1,70 @@
+#include "IntervalPrinter.hpp"
+
+void IntervalOutput::Print(T_AlignmentCandidate &alignment, 
+    std::ostream &outFile) {
+
+    int mapQV = alignment.mapQV;
+    int lastBlock = alignment.blocks.size()-1;
+    if (lastBlock < 0) return;
+
+    outFile << alignment.qName << " " << alignment.tName << " " 
+            << alignment.score << " " 
+            << alignment.pctSimilarity << " " 
+            << alignment.qStrand << " " 
+            << alignment.QAlignStart() << " "
+            << alignment.QAlignEnd() << " "
+            << alignment.qLength << " "
+            << alignment.tStrand << " "
+            << alignment.TAlignStart() << " "
+            << (alignment.tAlignedSeqPos + alignment.tPos
+                + alignment.blocks[lastBlock].tPos 
+                + alignment.blocks[lastBlock].length) << " "
+            << alignment.tLength << " " 
+            << mapQV << std::endl;
+    //Remove the last four fields from m4 format.
+    //<< " " << alignment.nCells << " " << alignment.clusterScore 
+    //<< " " << alignment.probScore << " " 
+    //<< alignment.numSignificantClusters 
+} 
+
+// Print an alignment from a sam file in Interval (m 4) format.
+void IntervalOutput::PrintFromSAM(AlignmentCandidate<> &alignment, 
+    std::ostream &outFile) {
+
+    int mapQV = alignment.mapQV;
+    int lastBlock = alignment.blocks.size()-1;
+    if (lastBlock < 0) return;
+
+    outFile << alignment.qName << " " 
+            << alignment.tName << " " 
+            << alignment.score << " " 
+            << alignment.pctSimilarity << " " 
+            << alignment.qStrand << " " 
+            << alignment.QAlignStart() << " "
+            << alignment.QAlignEnd() << " "
+            << alignment.qLength << " "
+            << alignment.tStrand << " ";
+
+    DNALength tS = alignment.TAlignStart(); 
+    DNALength tE = alignment.tAlignedSeqPos + alignment.tPos
+                    + alignment.blocks[lastBlock].tPos 
+                    + alignment.blocks[lastBlock].length;
+
+    if (alignment.tStrand == 1) {
+        // Since the alignment is from a SAM file and the reference 
+        // is reverse, compute tS and tE in the coordinate of the reverse
+        // complementary sequence
+        DNALength tmp = tS;
+        tS = alignment.tLength - tE;
+        tE = alignment.tLength - tmp;
+    }
+    outFile << tS << " " << tE << " " << alignment.tLength << " " 
+            << mapQV << std::endl;
+}
+
+void IntervalOutput::PrintHeader(std::ostream &out) {
+    out << "qName tName score percentSimilarity qStrand " 
+        << "qStart qEnd qLength tStrand tStart tEnd tLength mapQV" 
+        << std::endl;
+    //ncells clusterScore probscore numSigClusters" << endl;
+}
diff --git a/libcpp/alignment/format/IntervalPrinter.hpp b/libcpp/alignment/format/IntervalPrinter.hpp
new file mode 100644
index 0000000..a1efdfc
--- /dev/null
+++ b/libcpp/alignment/format/IntervalPrinter.hpp
@@ -0,0 +1,21 @@
+#ifndef _BLASR_INTERVAL_ALIGNMENT_PRINTER_HPP_
+#define _BLASR_INTERVAL_ALIGNMENT_PRINTER_HPP_
+
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "FASTQSequence.hpp"
+
+namespace IntervalOutput{
+
+void Print(T_AlignmentCandidate &alignment, 
+    std::ostream &outFile);
+
+// Print an alignment from a sam file in Interval (m 4) format.
+void PrintFromSAM(AlignmentCandidate<> &alignment, 
+    std::ostream &outFile);
+
+void PrintHeader(std::ostream &out);
+
+}
+
+
+#endif
diff --git a/libcpp/alignment/format/SAMHeaderPrinter.cpp b/libcpp/alignment/format/SAMHeaderPrinter.cpp
new file mode 100644
index 0000000..c5c8eca
--- /dev/null
+++ b/libcpp/alignment/format/SAMHeaderPrinter.cpp
@@ -0,0 +1,432 @@
+#include "format/SAMHeaderPrinter.hpp"
+
+const std::string SAMVERSION("1.5");
+const std::string PBBAMVERSION("3.0b7");
+const std::string PACBIOPL("PACBIO");
+
+std::vector<SAMHeaderItem> MakeSAMHeaderItems(const std::string & fromString){
+    std::vector<SAMHeaderItem> items;
+
+    std::vector<std::string> vs;
+    Splice(fromString, ";", vs);
+    std::vector<std::string>::iterator it;
+    for (it = vs.begin(); it != vs.end(); it++) {
+        items.push_back(SAMHeaderItem(*it));
+    }
+    return items;
+}
+
+// SAMHeaderItem
+SAMHeaderItem::SAMHeaderItem(const std::string & fromString) {
+    std::size_t pos = fromString.find("=");
+    if (pos != std::string::npos) {
+        _key = fromString.substr(0, pos);
+        _val = fromString.substr(pos + 1);
+    }
+}
+
+std::string SAMHeaderItem::ToString() {
+    std::stringstream ss;
+    if (_key != "") ss << _key << "=" << _val;
+    return ss.str();
+}
+
+// SAMHeaderTag
+SAMHeaderTag::SAMHeaderTag(const std::string & fromString) {
+    size_t pos = fromString.find(":");
+    if (pos != string::npos) {
+        _tagName = fromString.substr(0, pos);
+        string tagValue = fromString.substr(pos + 1);
+        if (tagValue.find("=") != std::string::npos) {
+            AddItems(tagValue);
+        } else {
+            _tagValue = tagValue;
+        }
+    } else {
+        cout << "Unable to parse SAM/BAM header" << fromString << endl;
+        exit(1);
+    }
+}
+
+std::string SAMHeaderTag::ToString() {
+    std::stringstream ss;
+    if (_tagName != "") {
+        ss << _tagName << ":";
+        if (_tagValue != "") {
+            ss << _tagValue;
+        } else {
+            std::vector<SAMHeaderItem>::iterator it;
+            for(it = _tagItems.begin(); it != _tagItems.end(); it++) {
+                if (it != _tagItems.begin() and (*it).ToString() != "") {
+                    ss << ";";
+                }
+                ss << (*it).ToString();
+            }
+        }
+    }
+    return ss.str();
+}
+
+std::string SAMHeaderTag::TagName() const {
+    return _tagName;
+}
+
+void SAMHeaderTag::AddItem(SAMHeaderItem & item) {
+    _tagItems.push_back(item);
+}
+
+void SAMHeaderTag::AddItem(const std::string & fromString) {
+    _tagItems.push_back(SAMHeaderItem(fromString));
+}
+
+void SAMHeaderTag::AddItems(const std::string & fromString) {
+    // SAM Header Items: key=value;key=value
+    std::vector<SAMHeaderItem> items = MakeSAMHeaderItems(fromString);
+    _tagItems.insert(_tagItems.begin(), items.begin(), items.end());
+}
+
+// SAMHeaderGroup
+SAMHeaderGroup::SAMHeaderGroup(const std::string & fromString) {
+    if (fromString == "" || fromString[0] != '@') return;
+    std::vector<std::string> vs;
+    Splice(fromString.substr(1), "\t", vs);
+    if (vs.size() >= 1) {
+        std::vector<std::string>::iterator it = vs.begin();
+        _groupName = (*it);
+        it++;
+        for(; it != vs.end(); it++) {
+            _tags.push_back(SAMHeaderTag(*it));
+        }
+    }
+}
+
+std::string SAMHeaderGroup::ToString() {
+    std::stringstream ss;
+    ss << "@" << _groupName;
+    SAMHeaderTags::iterator it;
+    for (it = _tags.begin(); it != _tags.end(); it++) {
+        ss << "\t" << (*it).ToString();
+    }
+    return ss.str();
+}
+
+std::ostream & operator << (std::ostream& os, SAMHeaderGroup & g) {
+    return os << g.ToString();
+}
+
+/// returns true if this SAMHeaderGroup contains a tag tagName.
+bool SAMHeaderGroup::HasTag(std::string tagName) {
+    for(SAMHeaderTags::iterator it = _tags.begin(); it != _tags.end(); it++) {
+        if ((*it).TagName() == tagName) {
+            return true;
+        } 
+    }
+    return false;
+}
+
+/// returns value of a tag if it exists, otherwise, return an empty string. 
+std::string SAMHeaderGroup::Tag(const std::string & tagName) {
+    for(SAMHeaderTags::iterator it = _tags.begin(); it != _tags.end(); it++) {
+        if ((*it).TagName() == tagName) {
+            return (*it).ToString();
+        }
+    }
+    return "";
+}
+
+// SAMHeaderGroupWithID
+std::string SAMHeaderGroupWithID::ID() const {return _id;}
+
+SAMHeaderGroupWithID::SAMHeaderGroupWithID(const std::string & fromString)
+: SAMHeaderGroup(fromString) {
+    assert (HasTag("ID"));
+    if (not HasTag("ID")) {
+        assert("ERROR! SAM Header read/program group must has ID tag." == 0);
+    }
+    _id = Tag("ID");
+}
+
+// SAMHeaderRG
+SAMHeaderRG::SAMHeaderRG(const std::string & id, const std::string & pl, 
+            const std::string & pu, const std::vector<SAMHeaderItem> & dsItems) {
+    _groupName = "RG";
+    _id = id;
+    _tags.push_back(SAMHeaderTag("ID", id));
+    _tags.push_back(SAMHeaderTag("PU", pu));
+    _tags.push_back(SAMHeaderTag("PL", pl));
+    _tags.push_back(SAMHeaderTag("DS", dsItems));
+}
+
+SAMHeaderRG::SAMHeaderRG(const std::string & fromString)
+:SAMHeaderGroupWithID(fromString) {
+    if (_groupName != "RG") {
+        assert("ERROR! SAM Header read group should start with @RG" == 0);
+    }
+}
+
+// SAMHeaderPG
+SAMHeaderPG::SAMHeaderPG(const std::string & id, const std::string & progName, 
+        const std::string & progVersion, const std::string & commandLine) {
+    _groupName = "PG";
+    _id = id;
+    _tags.push_back(SAMHeaderTag("ID", id));
+    _tags.push_back(SAMHeaderTag("PN", progName));
+    _tags.push_back(SAMHeaderTag("VN", progVersion));
+    _tags.push_back(SAMHeaderTag("CL", commandLine));
+}
+
+SAMHeaderPG::SAMHeaderPG(const std::string & fromString)
+: SAMHeaderGroupWithID(fromString) {
+    if (_groupName != "PG") {
+        assert("ERROR! SAM Header program group must start with @PG" == 0);
+    }
+}
+
+// SAMHeaderSQ
+SAMHeaderSQ::SAMHeaderSQ(const std::string & sn, const DNALength & ln, const std::string & md5)
+: SAMHeaderSQ(sn, std::to_string(ln), md5) {}
+
+SAMHeaderSQ::SAMHeaderSQ(const std::string & sn, const string & ln, const std::string & md5)
+: SAMHeaderGroup() {
+    _groupName = "SQ";
+    _tags.push_back(SAMHeaderTag("SN", sn));
+    _tags.push_back(SAMHeaderTag("LN", ln));
+    _tags.push_back(SAMHeaderTag("M5", md5));
+}
+
+SAMHeaderSQ::SAMHeaderSQ(const std::string & fromString)
+: SAMHeaderGroup(fromString) {
+    if (_groupName != "SQ") {
+        assert("ERROR! SAM Header soring order must start with @SO" == 0);
+    }
+}
+
+// SAMHeaderPrinter
+std::string SAMHeaderPrinter::ToString() {
+    std::stringstream ss;
+    ss << _hd.ToString()
+        << _sqs.ToString()
+        << _rgs.ToString() 
+        << _pgs.ToString()
+        << _cos.ToString();
+        return ss.str();
+}
+/*
+/// Add a SAM Header @RG entry, including the following tags:
+/// ID (identifier), PL (platform), PU (platform unit), 
+/// DS (description, which may have many items)
+SAMHeaderPrinter & SAMHeaderPrinter::AddRG(std::string & id, std::string & pl, std::string & pu, std::string & ds) {
+    _rgs.Add(SAMHeaderRG(id, pl, pu, ds));
+    return *this;
+}*/
+
+/// Add a SAM Header @RG entry from string, which may contain arbitary tags.
+SAMHeaderPrinter & SAMHeaderPrinter::AddRG(const std::string & fromString) {
+    _rgs.Add(SAMHeaderRG(fromString)); 
+    return *this;
+}
+
+/// Add a SAM Header @PG entry, including the following tags:
+/// ID, progName, progVersion, commandLine. @PG must have unique ID.
+SAMHeaderPrinter & SAMHeaderPrinter::AddPG(std::string & id, std::string & progName, std::string & progVersion, std::string & commandLine) {
+    _pgs.Add(SAMHeaderPG(id, progName, progVersion, commandLine));
+    return *this;
+}
+
+/// Add a SAM Header @PG entry from string, which may contain arbitary tags.
+SAMHeaderPrinter & SAMHeaderPrinter::AddPG(const std::string & fromString) {
+    _pgs.Add(SAMHeaderPG(fromString));
+    return *this;
+}
+
+/// Add a SAM Header @CO entry from string.
+SAMHeaderPrinter & SAMHeaderPrinter::AddCO(const std::string & fromString) {
+    _cos.Add(fromString);
+    return *this;
+}
+
+/// \returns SAMHeaderGroup @HD
+SAMHeaderGroup SAMHeaderPrinter::MakeHD(const std::string & sortingOrder) {
+    std::stringstream ss;
+    ss << "@HD" << "\t" 
+        << "VN:" << SAMVERSION << "\t" 
+        << "SO:" << sortingOrder << "\t"
+        << "pb:" << PBBAMVERSION << std::endl;
+    return SAMHeaderGroup(ss.str());
+}
+
+/// \returns SAMHeaderSQs, SAM Header @SQ groups
+SAMHeaderSQs SAMHeaderPrinter::MakeSQs(SequenceIndexDatabase<FASTASequence> & seqdb) {
+    SAMHeaderSQs sqs;
+    for (int i = 0; i < seqdb.nSeqPos-1; i++) {
+        std::string md5 = "";
+        if (seqdb.md5.size() == seqdb.nSeqPos - 1) {
+            md5 = seqdb.md5[i];
+        }
+        string seqName;
+        seqdb.GetName(i, seqName);
+        sqs.Add(SAMHeaderSQ(seqName, seqdb.GetLengthOfSeq(i), md5));
+    }
+    return sqs;
+}
+
+SAMHeaderPrinter::SAMHeaderPrinter(const std::string & sortingOrder,
+        SequenceIndexDatabase<FASTASequence> & seqdb,
+        const std::vector<std::string> & readsFiles,
+        const ReadType::ReadTypeEnum & readType,
+        const SupplementalQVList & samQVs,
+        const std::string & progName, 
+        const std::string & progVersion,
+        const std::string & commandLine)  
+    :_sortingOrder(sortingOrder), _readsFiles(readsFiles), _seqdb(seqdb) {
+    if (readsFiles.size() == 0) {
+        assert("Must specify input reads files" == 0);
+    }
+    // all read types supported, no check needed.
+
+    // Determine fileType based on extension of the first read file.
+    std::string rf = readsFiles[0];
+    BaseSequenceIO::DetermineFileTypeByExtension(rf, fileType);
+
+    // Make @HD, @SQ, @RG 
+    _hd  = MakeHD(sortingOrder);
+    _sqs = MakeSQs(seqdb);
+    _rgs = MakeRGs(readsFiles, readType, samQVs);
+
+    // Make PGs and COs 
+    _pgs = MakePGs(readsFiles, progName, progVersion, commandLine);
+    _cos = MakeCOs(readsFiles);
+}
+
+/// \param[in] readsFiles - incoming reads files in BAM or other formats
+/// \param[in] readType - read type, must be either SUBREAD or CCS or UNKNOWN
+/// \param[in] samQVs - SupplementalQVList, an object that handles which 
+///                      QVs to print in SAM/BAM file.
+SAMHeaderRGs SAMHeaderPrinter::MakeRGs(const std::vector<std::string> & readsFiles,
+        const ReadType::ReadTypeEnum & readType,
+        const SupplementalQVList & samQVs) {
+    SAMHeaderRGs rgs;
+
+    if (fileType != PBBAM) {
+        ReaderAgglomerate * reader = new ReaderAgglomerate();
+        std::vector<std::string>::const_iterator rfit;
+        for(rfit = readsFiles.begin(); rfit != readsFiles.end(); rfit++) {
+            std::string rf(*rfit);
+            reader->SetReadFileName(rf);
+            reader->SetReadType(readType);
+            reader->Initialize();
+
+            // Get movie name from ReaderAgglomerate
+            std::string movieName;
+            reader->GetMovieName(movieName);
+
+            string bindingKit, sequencingKit, baseCallerVersion;
+            reader->GetChemistryTriple(bindingKit, sequencingKit, baseCallerVersion);
+            reader->Close();
+
+            std::vector<SAMHeaderItem> dsItems;
+            dsItems.push_back(SAMHeaderItem("READTYPE", ReadType::ToString(readType)));
+            dsItems.push_back(SAMHeaderItem("BINDINGKIT", bindingKit));
+            dsItems.push_back(SAMHeaderItem("SEQUENCINGKIT", sequencingKit));
+            dsItems.push_back(SAMHeaderItem("BASECALLERVERSION", baseCallerVersion));
+
+            // Add QVs, e.g., InsertionQV=iq;DeletionQV=dq;...
+            if (samQVs.useqv) {
+                for (int i = 0; i < samQVs.nTags; i++) {
+                    if (samQVs.useqv & (1 << i)) {
+                        dsItems.push_back(SAMHeaderItem(samQVs.qvNames[i], samQVs.qvTags[i]));
+                    }
+                }
+            }
+            rgs.Add(SAMHeaderRG(reader->readGroupId, PACBIOPL, movieName, dsItems));
+        }
+        delete reader;
+    } else {
+#ifdef USE_PBBAM
+        // TODO: use Derek's API to merge bamHeaders from different files when 
+        // it is in place. Use the following code for now. 
+        std::vector<std::string>::const_iterator rfit;
+        for(rfit = readsFiles.begin(); rfit != readsFiles.end(); rfit++) {
+            try {
+                PacBio::BAM::BamFile bamFile(*rfit);
+                PacBio::BAM::BamHeader header = bamFile.Header();
+                // Get read groups from bam header.
+                std::vector<PacBio::BAM::ReadGroupInfo> vrgs = header.ReadGroups();
+                std::vector<PacBio::BAM::ReadGroupInfo>::iterator rgit;
+                for (rgit = vrgs.begin(); rgit != vrgs.end(); rgit++) {
+                    rgs.Add(SAMHeaderRG((*rgit).ToSam()));
+                }
+            } catch (std::exception e) {
+                cout << "ERROR, unable to open bam file " << (*rfit) << endl;
+                exit(1);
+            }
+        }
+#else
+        REQUEST_PBBAM_ERROR();
+#endif
+    }
+    return rgs;
+}
+
+
+SAMHeaderPGs SAMHeaderPrinter::MakePGs(const std::vector<std::string> & readsFiles, 
+        const std::string & progName, const std::string & progVersion, 
+        const std::string & commandLine) {
+    SAMHeaderPGs pgs;
+
+    // program id, unique identifier for @PG lines;
+    int prog_id = 1;
+
+    if (fileType != PBBAM) {
+        // Reads files are not in BAM format, no other @PG lines.
+    } else {
+#ifdef USE_PBBAM
+        // Reads files are in BAM format, keep all @PG lines from Bam files.
+        // TODO: use Derek's API to merge bamHeaders from different files when 
+        // it is in place. Use the following code for now. 
+        std::vector<std::string>::const_iterator rfit;
+        for(rfit = readsFiles.begin(); rfit != readsFiles.end(); rfit++) {
+            PacBio::BAM::BamFile bamFile(*rfit);
+            PacBio::BAM::BamHeader bamHeader = bamFile.Header();
+            std::vector<PacBio::BAM::ProgramInfo> progs = bamHeader.Programs();
+            std::vector<PacBio::BAM::ProgramInfo>::iterator it;
+            for (it = progs.begin(); it != progs.end(); it++) {
+                pgs.Add(SAMHeaderPG((*it).ToSam()));
+                prog_id++; // Increase prog_id;
+            }
+        }
+#else
+        REQUEST_PBBAM_ERROR();
+#endif
+    }
+
+    pgs.Add(SAMHeaderPG(std::to_string(prog_id), progName, progVersion, commandLine));
+    return pgs;
+}
+
+SAMHeaderCOs SAMHeaderPrinter::MakeCOs(const std::vector<std::string> & readsFiles) {
+    SAMHeaderCOs cos;
+
+    if (fileType == PBBAM) {
+#ifdef USE_PBBAM
+        // Reads files are in BAM format, keep all @CO lines from Bam files.
+        std::vector<std::string>::const_iterator rfit;
+        for(rfit = readsFiles.begin(); rfit != readsFiles.end(); rfit++) {
+            PacBio::BAM::BamFile bamFile(*rfit);
+            PacBio::BAM::BamHeader bamHeader = bamFile.Header();
+            cos.Append(bamHeader.Comments());
+        }
+#else
+        REQUEST_PBBAM_ERROR();
+#endif
+    } // reads files are not in BAM format, no comments.
+    return cos;
+}
+
+#ifdef USE_PBBAM
+PacBio::BAM::BamHeader SAMHeaderPrinter::ToBamHeader() {
+    std::string headerStr = ToString();
+    return PacBio::BAM::BamHeader(headerStr);
+}
+#endif
+
diff --git a/libcpp/alignment/format/SAMHeaderPrinter.hpp b/libcpp/alignment/format/SAMHeaderPrinter.hpp
new file mode 100644
index 0000000..0b95da1
--- /dev/null
+++ b/libcpp/alignment/format/SAMHeaderPrinter.hpp
@@ -0,0 +1,311 @@
+#ifndef _BLASR_FILE_SAM_HEADER_PRINTER_
+#define _BLASR_FILE_SAM_HEADER_PRINTER_
+
+#include <string>
+#include <vector>
+#include <set>
+#include <iostream>
+#include <sstream>
+#include "Types.h"
+#include "Enumerations.h"
+#include "StringUtils.hpp"
+#include "files/BaseSequenceIO.hpp"
+#include "files/ReaderAgglomerate.hpp"
+#include "datastructures/alignmentset/SAMSupplementalQVList.hpp"
+
+/// This is a simple implementation for generating SAM Headers. 
+/// It is provided such that libblasr can compile with and without
+/// linking to lib PBBAM.
+/// * When compiled without linking to lib PBBAM, blasr should be 
+///   able to produce SAM output.
+/// * When compiled with lib PBBAM, blasr should be able to produce
+///   SAM and BAM output. If input is one or more than one BAM files,
+///   @PG and @CO info will be kept.
+
+#define REQUEST_PBBAM_ERROR() \
+    assert("libblasr must be compiled with lib PBBAM to consume bam files." == 0)
+
+class SAMHeaderItem {
+/// SAM Header Item: key=value
+public:
+    SAMHeaderItem(const std::string & key, const std::string & val)
+    :_key(key), _val(val) {}
+
+    SAMHeaderItem(const std::string & fromString);
+
+    std::string ToString();
+
+private:
+    std::string _key;
+    std::string _val;
+};
+
+std::vector<SAMHeaderItem> MakeSAMHeaderItems(const std::string & fromString);
+
+class SAMHeaderTag {
+public:
+    SAMHeaderTag() {} 
+
+    /// ID:12345
+    SAMHeaderTag(const std::string & tagName, const std::string & tagValue)
+    :_tagName(tagName), _tagValue(tagValue) {}
+
+    /// DS:READTYPE=SUBREAD;BINDKINGKIT=123456
+    SAMHeaderTag(const std::string & tagName, const std::vector<SAMHeaderItem> & tagItems)
+    :_tagName(tagName), _tagItems(tagItems) {}
+
+    SAMHeaderTag(const std::string & fromString);
+
+public:
+    std::string ToString();
+
+    std::string TagName() const;
+
+    void AddItem(SAMHeaderItem & item); 
+
+    void AddItem(const std::string & fromString);
+
+    void AddItems(const std::string & fromString);
+
+private:
+    std::string _tagName;
+    std::string _tagValue;
+    std::vector<SAMHeaderItem> _tagItems;
+};
+
+typedef std::vector<SAMHeaderTag> SAMHeaderTags;
+
+class SAMHeaderGroup {
+public:
+    SAMHeaderGroup() {}
+
+    SAMHeaderGroup(const std::string & groupName, const SAMHeaderTags & tags)
+    :_groupName(groupName), _tags(tags) {}
+
+    SAMHeaderGroup(const std::string & fromString); 
+
+    std::string ToString();
+
+    /// returns true if this SAMHeaderGroup contains a tag tagName.
+    bool HasTag(std::string tagName);
+
+    /// returns value of a tag if it exists, otherwise, return an empty string. 
+    std::string Tag(const std::string & tagName);
+
+protected:
+    std::string _groupName;
+
+    SAMHeaderTags _tags; 
+};
+
+class SAMHeaderGroupWithID : public SAMHeaderGroup {
+public:
+    SAMHeaderGroupWithID() {}
+
+    SAMHeaderGroupWithID(const std::string & fromString); 
+
+    std::string ID() const;
+
+protected:
+    std::string _id;
+};
+
+std::ostream & operator << (std::ostream& os, SAMHeaderGroup & g);
+
+class SAMHeaderRG : public SAMHeaderGroupWithID {
+    /// SAM Header @RG entry, containing ID, PL, PU, DS tags.
+    /// ID: Read group Id Tag, which must be unique for read groups.
+    /// PL: PacBio platform Tag, e.g., PacBio.
+    /// PU: PacBio platform unit Tag, e.g., m1473.....p0
+    /// DS: Description Items for this @RG entry, including READTYPE, BINDKINGKIT, 
+    ///     SEQUENCEKIT, BASECALLERVERSION. 
+    /// The following is an example: 
+    /// @RG ID:abcdefgh PL:PacBio   PU:m1473...p0   DS:READTYPE=SUBREAD;BINDINGKIT=123456;SEQUENCINGKIT=123456;BASECALLERVERSION=2.3
+public:
+    SAMHeaderRG(const std::string & id, const std::string & pl, const std::string & pu, const std::vector<SAMHeaderItem> & dsItems);
+
+    SAMHeaderRG(const std::string & fromString);
+};
+
+class SAMHeaderPG: public SAMHeaderGroupWithID {
+public:
+    SAMHeaderPG(const std::string & id, const std::string & progName, const std::string & progVersion, const std::string & commandLine);
+
+    SAMHeaderPG(const std::string & fromString);
+};
+
+class SAMHeaderSQ:  public SAMHeaderGroup {
+public:
+    SAMHeaderSQ(const std::string & sn, const DNALength & ln, const std::string & md5);
+
+    SAMHeaderSQ(const std::string & sn, const string & ln, const std::string & md5);
+
+    SAMHeaderSQ(const std::string & fromString);
+};
+
+template <class T>
+class SAMHeaderGroups {
+public:
+    SAMHeaderGroups() {}
+
+    // Add a SAM Header group regardless
+    void Add(const T & group);
+   
+    void Append(const std::vector<T> & groups);
+
+    std::string ToString();
+   
+protected:
+    std::vector<T> _groups;
+};
+
+template <class T>
+class SAMHeaderGroupsWithID : public SAMHeaderGroups<T> {
+public:
+    SAMHeaderGroupsWithID(): SAMHeaderGroups<T>() {}
+
+    /// Add a SAM Header group with unique ID if it does not exist.
+    void Add(const T & g) ;
+
+    /// Check whether a group already exists or not.
+    /// \returns true if g.ID() already exists in _groups, otherwise false.
+    bool Contain(const T & g);
+};
+
+typedef SAMHeaderGroupsWithID<SAMHeaderRG> SAMHeaderRGs;
+// FIXME: @PG groups should have unique IDs according to SAM spec v1.5,
+// However, PacBio tools such as blasr and bax2bam use prog name as prog id.
+typedef SAMHeaderGroups<SAMHeaderPG> SAMHeaderPGs;
+typedef SAMHeaderGroups<SAMHeaderSQ> SAMHeaderSQs;
+typedef SAMHeaderGroups<std::string> SAMHeaderCOs;
+
+class SAMHeaderPrinter {
+public:
+    /// SAMHeaderPrinter constructor  
+    /// \param[in] sortingOrder - sorting order of alignments. 
+    /// \param[in] seqdb - database of target sequences.
+    /// \param[in] readsFiles - input reads files, file format
+    /// can be FASTA, FASTQ, BAS.H5, BAX.H5, BAM.
+    /// \param[in] samQVs - samQVs that will be printed.
+    /// \param[in] readType - read type, must be either SUBREAD or CCS or UNKNOWN
+    /// \param[in] progName - program which calls SMAHeaderPrinter
+    /// \param[in] progVersion - program version. 
+    /// \param[in] commandLine - command line to call program. 
+    SAMHeaderPrinter(const std::string & sortingOrder,
+                     SequenceIndexDatabase<FASTASequence> & seqdb,
+                     const std::vector<std::string> & readsFiles,
+                     const ReadType::ReadTypeEnum & readType,
+                     const SupplementalQVList & samQVs,
+                     const std::string & progName, 
+                     const std::string & progVersion,
+                     const std::string & commandLine);
+
+    /// \returns SAM header in string.
+    std::string ToString();
+        
+public:
+#ifdef USE_PBBAM
+    /// Converts this SAMHeader to PacBio::BAM::BamHeader, must be compiled with pbbam
+    /// \returns a PacBio::BAM::BamHeader. 
+    PacBio::BAM::BamHeader ToBamHeader();
+#endif
+
+    /// Add a SAM Header @RG entry, including the following tags:
+    /// ID (identifier), PL (platform), PU (platform unit), 
+    /// DS (description, which may have many items)
+    SAMHeaderPrinter & AddRG(std::string & id, std::string & pl, std::string & pu, std::string & ds);
+
+    /// Add a SAM Header @RG entry from string, which may contain arbitary tags.
+    SAMHeaderPrinter & AddRG(const std::string & fromString);
+   
+    /// Add a SAM Header @PG entry, including the following tags:
+    /// ID, progName, progVersion, commandLine. @PG must have unique ID.
+    SAMHeaderPrinter & AddPG(std::string & id, std::string & progName, std::string & progVersion, std::string & commandLine);
+
+    /// Add a SAM Header @PG entry from string, which may contain arbitary tags.
+    SAMHeaderPrinter & AddPG(const std::string & fromString);
+
+    /// Add a SAM Header @CO entry from string.
+    SAMHeaderPrinter & AddCO(const std::string & fromString);
+
+private:
+    const std::string & _sortingOrder;
+    const std::vector<std::string> & _readsFiles;
+    SequenceIndexDatabase<FASTASequence> & _seqdb;
+    FileType fileType;
+
+    SAMHeaderGroup _hd; //@HD VN:? SO:? pb:?
+    SAMHeaderSQs _sqs;  //@SQ SN:? LN:? M5:?
+    SAMHeaderRGs _rgs;  //@RG ID:? PU:? PL:? DS:key=val;key=val;key=val
+    SAMHeaderPGs _pgs;  //@PG VN:? CL:?
+    SAMHeaderCOs _cos;  //@CO
+
+private:
+    /// \returns SAMHeaderGroup @HD
+    static SAMHeaderGroup MakeHD(const std::string & sortingOrder);
+
+    /// \returns SAMHeaderSQs, SAM Header @SQ groups
+    SAMHeaderSQs MakeSQs(SequenceIndexDatabase<FASTASequence> & seqdb);
+
+    /// \returns SAMHeaderRGs @RG groups
+    /// \param[in] readsFiles - incoming reads files in BAM or other formats
+    /// \param[in] readType - read type, must be either SUBREAD or CCS or UNKNOWN
+    /// \param[in] samQVs - SupplementalQVList, an object that handles which 
+    ///                      QVs to print in SAM/BAM file.
+    SAMHeaderRGs MakeRGs(const std::vector<std::string> & readsFiles,
+        const ReadType::ReadTypeEnum & readType,
+        const SupplementalQVList & samQVs); 
+
+    /// \returns SAMHeaderPGs @PG groups
+    /// \param[in] readsFiles - incoming reads files in BAM or other formats
+    /// \param[in] progName - program which calls SMAHeaderPrinter
+    /// \param[in] progVersion - program version. 
+    /// \param[in] commandLine - command line to call program. 
+    SAMHeaderPGs MakePGs(const std::vector<std::string> & readsFiles, 
+        const std::string & progName, const std::string & progVersion, 
+        const std::string & commandLine);
+
+    /// \returns SAMHeaderPGs @CO groups
+    /// \param[in] readsFiles - incoming reads files in BAM or other formats
+    SAMHeaderCOs MakeCOs(const std::vector<std::string> & readsFiles); 
+};
+
+// template<class T> SAMHeaderGroups
+template<class T>
+void SAMHeaderGroups<T>::Add(const T & group) {
+    this->_groups.push_back(group);
+}
+
+template<class T>
+void SAMHeaderGroups<T>::Append(const std::vector<T> & groups) {
+    for(int i = 0; i < groups.size(); i++) {
+        this->Add(groups[i]);
+    }
+}
+
+template<class T>
+std::string SAMHeaderGroups<T>::ToString() {
+    std::stringstream ss;
+    for (int i = 0; i < this->_groups.size(); i++) {
+        ss << this->_groups[i] << std::endl;
+    }
+    return ss.str();
+}
+
+// template<class T> SAMHeaderGroupsWithID
+template <class T>
+void SAMHeaderGroupsWithID<T>::Add(const T & g) {
+    if (not this->Contain(g)) {this->_groups.push_back(g);}
+}
+
+template <class T>
+bool SAMHeaderGroupsWithID<T>::Contain(const T & g) {
+    typename std::vector<T>::iterator it;
+    for(it = this->_groups.begin(); it < this->_groups.end(); it++) {
+        if ((*it).ID() == g.ID()) {
+            return true;
+        }
+    }
+    return false;
+}
+#endif
diff --git a/libcpp/alignment/format/SAMPrinter.cpp b/libcpp/alignment/format/SAMPrinter.cpp
new file mode 100644
index 0000000..c44c40a
--- /dev/null
+++ b/libcpp/alignment/format/SAMPrinter.cpp
@@ -0,0 +1,188 @@
+#include "SAMPrinter.hpp"
+#include <algorithm> //reverse
+
+using namespace SAMOutput; 
+
+void SAMOutput::BuildFlag(T_AlignmentCandidate &alignment, AlignmentContext &context, uint16_t &flag) {
+
+    /*
+     *  Much of the flags are commented out for now since they do not
+     *  generate PICARD compliant SAM.  This needs to be worked out. 
+     */
+
+
+    //
+    // Without supporting strobe, assume 1 segment per template.
+    flag = 0;
+    /*
+       if (context.nSubreads > 1) {
+       flag |= MULTI_SEGMENTS;
+       }*/
+
+    //    if (context.AllSubreadsAligned() and context.nSubreads > 1) {
+    //      flag |= ALL_SEGMENTS_ALIGNED;
+    //    }
+
+    if (alignment.tStrand == 1) {
+        flag |= SEQ_REVERSED;
+    }
+    /*
+       if (context.hasNextSubreadPos == false and context.nSubreads > 1) {
+       flag |= NEXT_SEGMENT_UNMAPPED;
+       }
+       if (context.nextSubreadDir == 1) {
+       flag |= SEQ_NEXT_REVERSED;
+       }
+       if (context.IsFirst() and context.nSubreads > 1) {
+       flag |= FIRST_SEGMENT;
+       }
+       */
+       else if (context.nSubreads > 1) {
+           /*
+            * Remember, if you're not first, you're last.
+            */
+           //      flag |= LAST_SEGMENT;
+       }
+       if (context.isPrimary == false) {
+           flag |= SECONDARY_ALIGNMENT;
+       }
+}
+
+void SAMOutput::CreateDNAString(DNASequence &seq, 
+        DNASequence &clippedSeq,
+        //
+        // Trimming is used for both hard non-clipping
+        // so it is called trim instead of clip.
+        //
+        int trimFront,
+        int trimEnd) {
+    assert(seq.length - trimEnd >= trimFront);
+
+    clippedSeq.seq    = &seq.seq[trimFront];
+    clippedSeq.length = seq.length - trimEnd - trimFront;
+}
+
+void SAMOutput::AddGaps(T_AlignmentCandidate &alignment, int gapIndex,
+        std::vector<int> &opSize, std::vector<char> &opChar) {
+    int g;
+    for (g = 0; g < alignment.gaps[gapIndex].size(); g++) {
+        if (alignment.gaps[gapIndex][g].seq == blasr::Gap::Query) {
+            opSize.push_back(alignment.gaps[gapIndex][g].length);
+            opChar.push_back('D');
+        }
+        else if (alignment.gaps[gapIndex][g].seq == blasr::Gap::Target) {
+            opSize.push_back(alignment.gaps[gapIndex][g].length);
+            opChar.push_back('I');
+        }
+    }
+}
+
+void SAMOutput::AddMatchBlockCigarOps(DNASequence & qSeq, DNASequence & tSeq, 
+        blasr::Block & b, DNALength & qSeqPos, DNALength & tSeqPos,
+        std::vector<int> & opSize, std::vector<char> & opChar) {
+    DNALength qPos = qSeqPos + b.qPos, tPos = tSeqPos + b.tPos, n = 0;
+    bool started = false, prevSeqMatch = false;
+    for(DNALength i = 0; i < b.length; i++) {
+        bool curSeqMatch = (qSeq[qPos + i] == tSeq[tPos + i]);
+        if (started) {
+            if (curSeqMatch == prevSeqMatch) opSize[opSize.size()-1]++;
+            else {
+                opSize.push_back(1);
+                opChar.push_back(curSeqMatch?'=':'X');
+            }
+        } else {
+            started = true;
+            opSize.push_back(1);
+            opChar.push_back(curSeqMatch?'=':'X');
+        }
+        prevSeqMatch = curSeqMatch;
+    }
+}
+
+void SAMOutput::CreateNoClippingCigarOps(T_AlignmentCandidate &alignment, 
+        std::vector<int> &opSize, std::vector<char> &opChar, bool cigarUseSeqMatch) {
+    //
+    // Create the cigar string for the aligned region of a read,
+    // excluding the clipping.
+    //
+    int b;
+    // Each block creates a match NM (N=block.length)
+    int nBlocks = alignment.blocks.size();
+    int nGaps   = alignment.gaps.size();
+    opSize.clear();
+    opChar.clear();
+    //
+    // Add gaps at the beginning of the alignment.
+    //
+    if (nGaps > 0) {
+        AddGaps(alignment, 0, opSize, opChar);
+    }
+    for (b = 0; b < nBlocks; b++) {
+        //
+        // Determine the gap before printing the match, since it is
+        // possible that the qurey and target are gapped at the same
+        // time, which merges into a mismatch.
+        //
+        int qGap=0, tGap=0, commonGap=0;
+        int matchLength = alignment.blocks[b].length;
+        if (nGaps == 0) {
+            if (b + 1 < nBlocks) {
+                qGap = alignment.blocks[b+1].qPos - alignment.blocks[b].qPos - alignment.blocks[b].length;
+                tGap = alignment.blocks[b+1].tPos - alignment.blocks[b].tPos - alignment.blocks[b].length;
+                int commonGap;
+                commonGap = abs(qGap - tGap);
+                qGap -= commonGap;
+                tGap -= commonGap;
+                matchLength += commonGap;
+                if (cigarUseSeqMatch) {
+                    AddMatchBlockCigarOps(alignment.qAlignedSeq, 
+                                          alignment.tAlignedSeq, 
+                                          alignment.blocks[b], 
+                                          alignment.qPos, alignment.tPos,
+                                          opSize, opChar);
+                } else {
+                    opSize.push_back(matchLength);
+                    opChar.push_back('M');
+                }
+                assert((qGap > 0 and tGap == 0) or (qGap == 0 and tGap > 0));
+                if (qGap > 0) {
+                    opSize.push_back(qGap);
+                    opChar.push_back('I');
+                }
+                if (tGap > 0) {
+                    opSize.push_back(tGap);
+                    opChar.push_back('D');
+                }
+            }
+        }
+        else {
+            if (cigarUseSeqMatch) {
+                AddMatchBlockCigarOps(alignment.qAlignedSeq, 
+                                      alignment.tAlignedSeq, 
+                                      alignment.blocks[b], 
+                                      alignment.qPos, alignment.tPos,
+                                      opSize, opChar);
+            } else {
+                opSize.push_back(matchLength);
+                opChar.push_back('M');
+            }
+            int gapIndex = b+1;
+            AddGaps(alignment, gapIndex, opSize, opChar);
+        }
+    }
+    if (alignment.tStrand == 1) {
+        std::reverse(opSize.begin(), opSize.end());
+        std::reverse(opChar.begin(), opChar.end());
+    }
+}
+
+void SAMOutput::CigarOpsToString(std::vector<int> &opSize, std::vector<char> &opChar, 
+        std::string &cigarString) {
+    std::stringstream sstrm;
+    int i, nElem;
+    for (i = 0, nElem = opSize.size(); i < nElem; i++) {
+        sstrm << opSize[i] << opChar[i];
+    }
+    cigarString = sstrm.str();
+}
+
diff --git a/libcpp/alignment/format/SAMPrinter.hpp b/libcpp/alignment/format/SAMPrinter.hpp
new file mode 100644
index 0000000..c47f8ec
--- /dev/null
+++ b/libcpp/alignment/format/SAMPrinter.hpp
@@ -0,0 +1,93 @@
+#ifndef _BLASR_FORMAT_SAMPRINTER_HPP_
+#define _BLASR_FORMAT_SAMPRINTER_HPP_ 
+
+#include <sstream>
+#include <stdint.h>
+#include "SMRTSequence.hpp"
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "datastructures/alignment/AlignmentContext.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "datastructures/alignmentset/SAMSupplementalQVList.hpp"
+
+
+#define MULTI_SEGMENTS 0x1
+#define ALL_SEGMENTS_ALIGNED 0x2
+#define SEGMENT_UNMAPPED 0x4
+#define NEXT_SEGMENT_UNMAPPED 0x8
+#define SEQ_REVERSED 0x10
+#define SEQ_NEXT_REVERSED 0x20
+#define FIRST_SEGMENT 0x40
+#define LAST_SEGMENT 0x80
+#define SECONDARY_ALIGNMENT 0x100
+#define NO_PASS_QUALITY 0x200
+#define PCR_OR_OPTICAL_DUPLICATE 0x400
+
+namespace SAMOutput {
+
+enum Clipping {hard, soft, subread, none};
+
+void BuildFlag(T_AlignmentCandidate &alignment, AlignmentContext &context, uint16_t &flag); 
+
+//
+// Trimming is used for both hard non-clipping
+// so it is called trim instead of clip.
+//
+void CreateDNAString(DNASequence &seq, DNASequence &clippedSeq, 
+    int trimFront=0, int trimEnd=0); 
+
+void AddGaps(T_AlignmentCandidate &alignment, int gapIndex,
+        std::vector<int> &opSize, std::vector<char> &opChar); 
+
+// Add sequence match/mismatch CIGAR string Ops for block b.
+void AddMatchBlockCigarOps(DNASequence & qSeq, DNASequence & tSeq, blasr::Block & b,
+        DNALength & qSeqPos, DNALength & tSeqPos,
+        std::vector<int> & opSize, std::vector<char> & opChar);
+
+// If cigarUseSeqMatch is true, cigar string uses '=' and 'X' 
+// instead of 'M' to represent sequence match and mismatch;
+void CreateNoClippingCigarOps(T_AlignmentCandidate &alignment, 
+        std::vector<int> &opSize, std::vector<char> &opChar,
+        bool cigarUseSeqMatch = false); 
+//
+// 
+// The aligned sequence is either the sequence from the first
+// aligned base to the last (hard and no clipping), or first high
+// quality base to the last high quality base (soft clipping).
+//
+template<typename T_Sequence>
+void SetAlignedSequence(T_AlignmentCandidate &alignment, T_Sequence &read,
+    T_Sequence &alignedSeq, Clipping clipping = none); 
+
+template<typename T_Sequence>
+void SetSoftClip(T_AlignmentCandidate &alignment, T_Sequence &read, 
+    DNALength hardClipPrefix, DNALength hardClipSuffix,
+    DNALength &softClipPrefix, DNALength &softClipSuffix); 
+
+template<typename T_Sequence>
+void SetHardClip(T_AlignmentCandidate &alignment, T_Sequence &read, 
+    DNALength &prefixClip, DNALength &suffixClip); 
+
+void CigarOpsToString(std::vector<int> &opSize, std::vector<char> &opChar, 
+        std::string &cigarString);
+
+//
+// Straight forward: create the cigar string allowing some clipping
+// The read is provided to give length and hq information.
+//
+template<typename T_Sequence>
+void CreateCIGARString(T_AlignmentCandidate &alignment, T_Sequence &read,
+        std::string &cigarString, Clipping clipping, 
+        DNALength &prefixSoftClip, DNALength &suffixSoftClip,
+        DNALength &prefixHardClip, DNALength &suffixHardClip,
+        bool cigarUseSeqMatch = false); 
+
+template<typename T_Sequence>
+void PrintAlignment(T_AlignmentCandidate &alignment, T_Sequence &read,
+        std::ostream &samFile, AlignmentContext &context, 
+        SupplementalQVList & qvList, Clipping clipping = none,
+        bool cigarUseSeqMatch = false); 
+}
+
+#include "SAMPrinterImpl.hpp"
+#endif // _BLASR_FORMAT_SAMPRINTER_HPP_
diff --git a/libcpp/alignment/format/SAMPrinterImpl.hpp b/libcpp/alignment/format/SAMPrinterImpl.hpp
new file mode 100644
index 0000000..f83d1a9
--- /dev/null
+++ b/libcpp/alignment/format/SAMPrinterImpl.hpp
@@ -0,0 +1,304 @@
+#include <algorithm> //max
+#include <utility> //swap
+#include <assert.h> //assert
+
+using namespace SAMOutput; 
+
+
+template<typename T_Sequence>
+void SAMOutput::SetAlignedSequence(T_AlignmentCandidate &alignment, T_Sequence &read,
+        T_Sequence &alignedSeq,
+        Clipping clipping) {
+    //
+    // In both no, and hard clipping, the dna sequence that is output
+    // solely corresponds to the aligned sequence.
+    //
+    DNALength clippedReadLength = 0;
+    DNALength clippedStartPos   = 0;
+
+    if (clipping == none or clipping == hard) {
+        DNALength qStart = alignment.QAlignStart();
+        DNALength qEnd   = alignment.QAlignEnd();
+        clippedReadLength = qEnd - qStart;
+        clippedStartPos   = qStart;
+    }
+    else if (clipping == soft) {
+        clippedReadLength = read.length - read.lowQualityPrefix - read.lowQualitySuffix;
+        clippedStartPos = read.lowQualityPrefix;
+    }
+    else if (clipping == subread) {
+        clippedReadLength = read.subreadEnd - read.subreadStart;
+        clippedStartPos = read.subreadStart;
+    }
+    else {
+        std::cout <<" ERROR! The clipping must be none, hard, subread, or soft when setting the aligned sequence." << std::endl;
+        assert(0);
+    }
+
+    //
+    // Set the aligned sequence according to the clipping boundaries.
+    //
+    if (alignment.tStrand == 0) {
+        alignedSeq.ReferenceSubstring(read, clippedStartPos, clippedReadLength);
+    }
+    else {
+        T_Sequence subSeq;
+        subSeq.ReferenceSubstring(read, clippedStartPos, clippedReadLength);
+        subSeq.MakeRC(alignedSeq);
+        assert(alignedSeq.deleteOnExit);
+    }
+}
+
+template<typename T_Sequence>
+void SAMOutput::SetSoftClip(T_AlignmentCandidate &alignment,
+        T_Sequence &read,
+        DNALength hardClipPrefix,
+        DNALength hardClipSuffix,
+        DNALength &softClipPrefix, 
+        DNALength &softClipSuffix) {
+    DNALength qStart, qEnd;
+    qStart = alignment.QAlignStart();
+    qEnd   = alignment.QAlignEnd();
+
+    assert(qStart >= hardClipPrefix);
+    softClipPrefix = alignment.QAlignStart() - hardClipPrefix;
+    assert(alignment.QAlignEnd() + hardClipSuffix <= read.length);
+    softClipSuffix = read.length - hardClipSuffix - alignment.QAlignEnd();
+}
+
+template<typename T_Sequence>
+void SAMOutput::SetHardClip(T_AlignmentCandidate &alignment, 
+        T_Sequence &read,
+        DNALength &prefixClip,
+        DNALength &suffixClip) {
+    //
+    // Set the hard clipping assuming the read is in the forward
+    // direction.
+    //
+    prefixClip = alignment.QAlignStart();
+    suffixClip = read.length - alignment.QAlignEnd();
+    if (alignment.tStrand == 1) {
+        //
+        // If the read is instead reverse, swap the clipping lengths.
+        //
+        std::swap(prefixClip, suffixClip);
+    }
+}
+
+
+//
+// Straight forward: create the cigar string allowing some clipping
+// The read is provided to give length and hq information.
+//
+template<typename T_Sequence>
+void SAMOutput::CreateCIGARString(T_AlignmentCandidate &alignment,
+        T_Sequence &read,
+        std::string &cigarString,
+        Clipping clipping,
+        DNALength & prefixSoftClip, DNALength & suffixSoftClip, 
+        DNALength & prefixHardClip, DNALength & suffixHardClip,
+        bool cigarUseSeqMatch) {
+
+    cigarString = "";
+    // All cigarString use the no clipping core
+    std::vector<int> opSize;
+    std::vector<char> opChar;
+    CreateNoClippingCigarOps(alignment, opSize, opChar, cigarUseSeqMatch);
+
+    // Clipping needs to be added
+
+    if (clipping == hard) {
+      SetHardClip(alignment, read, prefixHardClip, suffixHardClip);
+      if (prefixHardClip > 0) {
+        opSize.insert(opSize.begin(), prefixHardClip);
+        opChar.insert(opChar.begin(), 'H');
+      }
+      if (suffixHardClip > 0) {
+        opSize.push_back(suffixHardClip);
+        opChar.push_back('H');
+      }
+      prefixSoftClip = 0;
+      suffixSoftClip = 0;
+    }
+    if (clipping == soft or clipping == subread) {
+      //
+      // Even if clipping is soft, the hard clipping removes the 
+      // low quality regions
+      //
+      if (clipping == soft) {
+          prefixHardClip = read.lowQualityPrefix;
+          suffixHardClip = read.lowQualitySuffix;
+      }
+      else if (clipping == subread) {
+          prefixHardClip = std::max((DNALength) read.subreadStart, read.lowQualityPrefix);
+          suffixHardClip = std::max((DNALength)(read.length - read.subreadEnd), read.lowQualitySuffix);
+      }
+
+      SetSoftClip(alignment, read, prefixHardClip, suffixHardClip, prefixSoftClip, suffixSoftClip);
+
+      if (alignment.tStrand == 1) {
+        std::swap(prefixHardClip, suffixHardClip);
+        std::swap(prefixSoftClip, suffixSoftClip);
+      }
+
+      //
+      // Insert the hard and soft clipping so that they are in the
+      // order H then S if both exist.
+      //
+      if (prefixSoftClip > 0) {
+        opSize.insert(opSize.begin(), prefixSoftClip);
+        opChar.insert(opChar.begin(), 'S');
+      }
+      if (prefixHardClip > 0) {
+        opSize.insert(opSize.begin(), prefixHardClip);
+        opChar.insert(opChar.begin(), 'H');
+      }
+      
+      //
+      // Append the hard and soft clipping so they are in the order S
+      // then H. 
+      //
+      if (suffixSoftClip > 0) {
+        opSize.push_back(suffixSoftClip);
+        opChar.push_back('S');
+      }
+      if (suffixHardClip > 0) {
+        opSize.push_back(suffixHardClip);
+        opChar.push_back('H');
+      }
+    }
+
+    CigarOpsToString(opSize, opChar, cigarString);
+}
+
+template<typename T_Sequence>
+void SAMOutput::PrintAlignment(T_AlignmentCandidate &alignment,
+        T_Sequence &read,
+        std::ostream &samFile,
+        AlignmentContext &context,
+        SupplementalQVList & qvList,
+        Clipping clipping,
+        bool cigarUseSeqMatch) {
+
+    std::string cigarString;
+    uint16_t flag;
+    T_Sequence alignedSequence;
+    DNALength prefixSoftClip = 0, suffixSoftClip = 0;
+    DNALength prefixHardClip = 0, suffixHardClip = 0;
+
+    CreateCIGARString(alignment, read, cigarString, clipping, prefixSoftClip, suffixSoftClip, prefixHardClip, suffixHardClip, cigarUseSeqMatch);
+    SetAlignedSequence(alignment, read, alignedSequence, clipping);
+    BuildFlag(alignment, context, flag);
+    samFile << alignment.qName << "\t" 
+            << flag << "\t" 
+            << alignment.tName << "\t";   // RNAME
+    if (alignment.tStrand == 0) {
+      samFile << alignment.TAlignStart() + 1 << "\t"; 
+      // POS, add 1 to get 1 based coordinate system
+    }
+    else {
+      samFile << alignment.tLength - (alignment.TAlignStart() + alignment.TEnd()) + 1 << "\t"; // includes - 1 for rev-comp,  +1 for one-based
+    }
+    samFile << (int) alignment.mapQV << "\t"// MAPQ
+            << cigarString << "\t"; // CIGAR
+      
+      //
+      // Determine RNEXT
+
+    std::string rNext;
+    rNext = "*";
+    /*
+    if (context.hasNextSubreadPos == false) {
+      rNext = "*";
+    }
+    else {
+      if (context.rNext == alignment.tName) {
+        rNext = "=";
+      }
+      else {
+        rNext = context.rNext;
+      }
+    }
+    */
+    samFile << rNext << "\t"; // RNEXT
+    
+    DNALength nextSubreadPos = 0;
+    /*
+    if (context.hasNextSubreadPos) {
+      nextSubreadPos = context.nextSubreadPos + 1;
+      }*/
+    samFile << nextSubreadPos << "\t"; // RNEXT, add 1 for 1 based
+                                           // indexing
+
+    //DNALength tLen = alignment.GenomicTEnd() - alignment.GenomicTBegin();
+    //SAM v1.5, tLen is set as 0 for single-segment template
+    samFile << 0 << "\t"; // TLEN
+    // Print the sequence on one line, and suppress printing the
+    // newline (by setting the line length to alignedSequence.length
+    (static_cast<DNASequence*>(&alignedSequence))->PrintSeq(samFile, 0);  // SEQ
+    samFile << "\t";
+    if (alignedSequence.qual.data != NULL && qvList.useqv == 0) {
+        alignedSequence.PrintAsciiQual(samFile, 0);  // QUAL
+    }
+    else {
+      samFile <<"*";
+    }
+    samFile << "\t";
+    //
+    // Add optional fields
+    //
+    samFile << "RG:Z:" << context.readGroupId << "\t";
+    samFile << "AS:i:" << alignment.score << "\t";
+
+    //
+    // "RG" read group Id
+    // "AS" alignment score
+    // "XS" read alignment start position without counting previous soft clips (1 based) 
+    // "XE" read alignment end position without counting previous soft clips (1 based) 
+    // "XL" aligned read length 
+    // "XQ" query sequence length
+    // "XT" # of continues reads, always 1 for blasr 
+    // "NM" edit distance 
+    // "FI" read alignment start position (1 based) 
+    //
+    
+    DNALength qAlignStart = alignment.QAlignStart();
+    DNALength qAlignEnd = alignment.QAlignEnd();
+
+    if (clipping == none) {
+      samFile << "XS:i:" << qAlignStart + 1 << "\t";
+      samFile << "XE:i:" << qAlignEnd + 1 << "\t";
+    }
+    else if (clipping == hard or clipping == soft or clipping == subread) {
+        DNALength xs = prefixHardClip;
+        DNALength xe = read.length - suffixHardClip;
+        if (alignment.tStrand == 1) {
+            xs = suffixHardClip;
+            xe = read.length - prefixHardClip;
+        }
+        samFile << "XS:i:" << xs + 1 << "\t"; // add 1 for 1-based indexing in sam
+        assert(read.length - suffixHardClip == prefixHardClip + alignedSequence.length);
+        samFile << "XE:i:" << xe + 1 << "\t";
+    }
+    samFile << "YS:i:" << read.subreadStart << "\t";
+    samFile << "YE:i:" << read.subreadEnd << "\t";
+    samFile << "ZM:i:" << read.zmwData.holeNumber << "\t";
+    samFile << "XL:i:" << alignment.qAlignedSeq.length << "\t";
+    samFile << "XT:i:1\t"; // reads are allways continuous reads, not
+                        // referenced based circular consensus when
+                        // output by blasr.
+    samFile << "NM:i:" << context.editDist << "\t";
+    samFile << "FI:i:" << alignment.qAlignedSeqPos + 1;
+    // Add query sequence length
+    samFile << "\t" << "XQ:i:" << alignment.qLength;
+
+    //
+	// Write out optional quality values.  If qvlist does not 
+	// have any qv's signaled to print, this is a no-op.
+	//
+	// First transform characters that are too large to printable ones.
+	qvList.FormatQVOptionalFields(alignedSequence);
+	qvList.PrintQVOptionalFields(alignedSequence, samFile);
+
+    samFile << std::endl;
+}
diff --git a/libcpp/alignment/format/StickAlignmentPrinter.hpp b/libcpp/alignment/format/StickAlignmentPrinter.hpp
new file mode 100644
index 0000000..11f6b39
--- /dev/null
+++ b/libcpp/alignment/format/StickAlignmentPrinter.hpp
@@ -0,0 +1,123 @@
+#ifndef _BLASR_STICK_ALIGNMENT_PRINTER_HPP_
+#define _BLASR_STICK_ALIGNMENT_PRINTER_HPP_
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include "datastructures/alignment/Alignment.hpp"
+#include "algorithms/alignment/AlignmentUtils.hpp"
+
+template<typename T_Alignment, typename T_QuerySequence, typename T_TargetSequence>
+void StickPrintAlignment(T_Alignment &alignment, 
+        T_QuerySequence &query, T_TargetSequence &text, std::ostream &out,
+        unsigned int qPrintStart = 0,
+        unsigned int tPrintStart = 0,
+        int maxPrintLength = 50) {
+    //
+    // Eventually hack to add options for alignment format.
+    //
+    std::string queryStr, alignStr, textStr;
+    char gapChar = '-';
+    //
+    // [q/t]PrintStart are the beginning/ending of the subsequence that
+    // is being printed however the actual alignment begins at
+    // [q/t]PrintStart + alignment->[q/t]Pos, since there may be a small
+    // gap between the beginning of the alignment and the beginning of
+    // the substring that is aligned.
+    //
+    out << "         Query: " << alignment.qName << endl;
+    out << "        Target: " << alignment.tName << endl;
+    out << "         Model: a hybrid of global/local non-affine alignment" <<endl;
+    out << "     Raw score: " << alignment.score << endl;
+    out << "        Map QV: " << alignment.mapQV << endl;
+    out << "  Query strand: " << alignment.qStrand << endl;
+    out << " Target strand: " << alignment.tStrand << endl;
+    if (alignment.blocks.size() > 0) {
+        out << "   QueryRange: " << qPrintStart + alignment.qPos //alignment.blocks[0].qPos 
+            << " -> " 
+            << (qPrintStart + alignment.qPos + 
+                    + alignment.blocks[alignment.blocks.size() - 1 ].qPos
+                    + alignment.blocks[alignment.blocks.size() - 1 ].length) << " of " << alignment.qLength << endl;
+        out << "  TargetRange: " << tPrintStart + alignment.tPos //alignment.blocks[0].tPos 
+            << " -> " 
+            //				<< (tPrintStart + alignment.blocks[alignment.blocks.size() - 1].tPos +
+            << (tPrintStart + alignment.tPos +
+                    alignment.blocks[alignment.blocks.size() - 1 ].tPos + 
+                    alignment.blocks[alignment.blocks.size() - 1].length) << " of " << alignment.tLength << endl;
+    }
+    else {
+        out << "   QueryRange: NONE " << endl;
+        out << "  TargetRange: NONE " << endl;
+    }
+
+    if (alignment.blocks.size() == 0) 
+        return;
+    CreateAlignmentStrings(alignment, query.seq, text.seq, textStr, alignStr, queryStr, query.length, text.length);
+
+    //
+    // Process any gaps at the beginning of 
+    // the alignment.
+    //
+
+    DNALength qPos, tPos;
+
+    int coordsPrintWidth = MAX(GetNumberWidth(alignment.qPos + qPrintStart + query.length), 
+            GetNumberWidth(alignment.tPos + tPrintStart + query.length));
+
+    // 
+    // Now print the alignment
+    VectorIndex lineLength = maxPrintLength;
+    if (lineLength > textStr.size())
+        lineLength = textStr.size();
+
+    std::string textLine, queryLine, alignLine;
+    DNALength pos = 0;
+    tPos = alignment.tPos;
+    qPos = alignment.qPos;
+    int spacePad = 2;
+    std::string coordPadding(spacePad, ' ');
+    std::string alignStrPadding(coordsPrintWidth + spacePad, ' ');
+
+    while (lineLength > 0) {
+        textLine.assign(textStr, pos, lineLength);
+        alignLine.assign(alignStr, pos, lineLength);
+        queryLine.assign(queryStr, pos, lineLength);
+        out.width(coordsPrintWidth);
+        out << qPrintStart + qPos;
+        out.width(0);
+        out << coordPadding << queryLine << endl;
+        out << alignStrPadding <<  alignLine << endl;
+        out.width(coordsPrintWidth);
+        out << tPrintStart + tPos ;
+        out.width(0);
+        out << coordPadding << textLine  << endl;
+        out << endl;
+
+        pos += lineLength;
+        tPos += lineLength;
+        qPos += lineLength;
+        //
+        // Adjust tPos and qPos for indels.
+        //
+        VectorIndex p;
+        for (p = 0; p < textLine.size(); p++) {
+            if (textLine[p] == gapChar)
+                tPos--;
+        }
+        for (p = 0; p < queryLine.size(); p++) {
+            if (queryLine[p] == gapChar)
+                qPos--;
+        }
+
+        lineLength = maxPrintLength;
+        if (textStr.size() < (pos +lineLength)) {
+            // sets lineLength to 0 on the last iteration
+            lineLength = textStr.size() - pos;
+        }
+        else {
+            lineLength = maxPrintLength;
+        }
+    }
+}
+
+#endif // _BLASR_STICK_ALIGNMENT_PRINTER_HPP_
diff --git a/libcpp/alignment/format/SummaryPrinter.cpp b/libcpp/alignment/format/SummaryPrinter.cpp
new file mode 100644
index 0000000..6704bce
--- /dev/null
+++ b/libcpp/alignment/format/SummaryPrinter.cpp
@@ -0,0 +1,26 @@
+#include "SummaryPrinter.hpp"
+
+void SummaryOutput::Print(
+    AlignmentCandidate<DNASequence,FASTQSequence> &alignment, 
+    std::ostream &outFile) {
+
+    int lastBlock = alignment.blocks.size()-1;
+    outFile << alignment.qName << " "
+        << alignment.tName << " " 
+        << alignment.qStrand << " " 
+        << alignment.tStrand << " " 
+        << alignment.score << " " 
+        << alignment.pctSimilarity << " "
+        << alignment.tAlignedSeqPos + alignment.blocks[0].tPos << " " 
+        << alignment.tAlignedSeqPos + alignment.blocks[lastBlock].tPos + alignment.blocks[lastBlock].length << " " 
+        << alignment.tLength << " "
+        << alignment.qAlignedSeqPos + alignment.blocks[0].qPos << " " 
+        << alignment.qAlignedSeqPos + alignment.blocks[lastBlock].qPos + alignment.blocks[lastBlock].length << " " 
+        << alignment.qLength << " " << alignment.nCells << std::endl;
+}
+
+void SummaryOutput::PrintHeader(std::ostream &out) {
+    out << "qName tName qStrand tStrand score percentSimilarity tStart tEnd tLength qStart qEnd qLength nCells" 
+        << std::endl;
+}
+
diff --git a/libcpp/alignment/format/SummaryPrinter.hpp b/libcpp/alignment/format/SummaryPrinter.hpp
new file mode 100644
index 0000000..5cc9c29
--- /dev/null
+++ b/libcpp/alignment/format/SummaryPrinter.hpp
@@ -0,0 +1,14 @@
+#ifndef SUMMARY_ALIGNMENT_PRINTER_H_
+#define SUMMARY_ALIGNMENT_PRINTER_H_
+
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "FASTQSequence.hpp"
+
+namespace SummaryOutput{
+
+   void Print(AlignmentCandidate<DNASequence,FASTQSequence> &alignment, std::ostream &outFile);
+
+   void PrintHeader(std::ostream &out);
+}
+
+#endif
diff --git a/libcpp/alignment/format/VulgarPrinter.hpp b/libcpp/alignment/format/VulgarPrinter.hpp
new file mode 100644
index 0000000..a4505cf
--- /dev/null
+++ b/libcpp/alignment/format/VulgarPrinter.hpp
@@ -0,0 +1,53 @@
+#ifndef _BLASR_VULGAR_ALIGNMENT_PRINTER_HPP_
+#define _BLASR_VULGAR_ALIGNMENT_PRINTER_HPP_
+
+#include <string>
+#include <sstream>
+
+namespace VulgarOutput{
+template <typename T_Alignment>
+int CreateVulgarString(T_Alignment &alignment, std::string &vstring) {
+    std::stringstream vstream;
+	VectorIndex b;
+	int tGap, qGap, cGap;
+	if (alignment.blocks.size() == 0) {
+		vstring = "";
+		return 1;
+	}
+	for (b = 0; b < alignment.blocks.size() - 1; b++) {
+		tGap = (alignment.blocks[b+1].tPos 
+			    - (alignment.blocks[b].length + 
+				alignment.blocks[b].tPos));
+		qGap = (alignment.blocks[b+1].qPos 
+				- (alignment.blocks[b].length + 
+				alignment.blocks[b].qPos));
+		if (tGap > 0 and qGap > 0)
+			cGap = abs(tGap - qGap);
+		else 
+			cGap = 0;
+		tGap -= cGap;
+		qGap -= cGap;
+		vstream << " M " << alignment.blocks[b].length + cGap;
+		if (tGap > 0) {
+			vstream << " D " << tGap;
+		}
+		else {
+			vstream << " I " << qGap;
+		}
+	}
+	if (alignment.blocks.size() > 0) {
+		vstream << " M " << alignment.blocks[alignment.blocks.size() - 1].length;
+	}
+	vstring = vstream.str();
+	return 1;
+}
+
+template <typename T_Alignment>
+void Print(T_Alignment &alignment, std::ostream &out) {
+    std::string vstring;
+	CreateVulgarString(alignment, vstring);
+	out << vstring;
+}
+}
+
+#endif
diff --git a/libcpp/alignment/format/XMLPrinter.hpp b/libcpp/alignment/format/XMLPrinter.hpp
new file mode 100644
index 0000000..076518e
--- /dev/null
+++ b/libcpp/alignment/format/XMLPrinter.hpp
@@ -0,0 +1,84 @@
+#ifndef _BLASR_XML_PRINTER_HPP_
+#define _BLASR_XML_PRINTER_HPP_
+
+#include "utils/SimpleXMLUtils.hpp"
+
+namespace XMLOutput{
+
+template<typename T_Alignment, typename T_Sequence> 
+void Print(T_Alignment &alignment, 
+    T_Sequence &query, T_Sequence &text, std::ostream &out,
+    int qPrintStart = 0,
+    int tPrintStart = 0,
+    int maxPrintLength = 50) {
+    /*
+     * Sample alignment:
+     *
+     <hit name="x15_y33_1220208-0008_m081205_152444_Uni_p2_b15" unalignedLength="1301" start="1051" end="1016" strand="-" targetStart="1" targetEnd="44" targetStrand="+">
+     <zScore value="-6.091"/>
+     <nInsert value="1" percent="2.86" />
+     <nDelete value="9" percent="25.71" />
+     <nMismatch value="1" percent="2.86" />
+     <nCorrect value="24" percent="68.57" />
+     <alignment><query>
+     AG--CGTTCC-TATGG-TG-GGGTCGTTA-ACT---GTCGCCAG
+     </query><target>
+     AGCCCG-TCCTTATGGTTGAGGGTTGTTACACTTCGGTCGCCAG
+     </target></alignment>
+     </hit>
+     */
+    char strand[2] = {'+', '-'};
+    std::string tAlignStr, alignStr, qAlignStr;
+    CreateAlignmentStrings(alignment, query.seq, text.seq, tAlignStr, alignStr, qAlignStr);
+    int alignLength = tAlignStr.size();
+    if (alignLength == 0) {
+        alignLength = 1; // Make sure there are no divide by zero.
+        alignment.nIns = 0;
+        alignment.nDel = 0;
+        alignment.nMismatch = 0;
+        alignment.nMatch = 0;
+    }
+    out << BeginDataEntry(std::string("hit"),
+            CreateKeywordValuePair(std::string("name"), alignment.qName) +
+            CreateKeywordValuePair(std::string("unalignedLength"), alignment.qLength) +
+            CreateKeywordValuePair(std::string("start"), alignment.qPos) + 
+            CreateKeywordValuePair(std::string("end"), alignment.qPos + alignment.qAlignLength) +
+            CreateKeywordValuePair(std::string("strand"), strand[alignment.qStrand]) + 
+            CreateKeywordValuePair(std::string("targetStart"), alignment.tPos) +													 
+            CreateKeywordValuePair(std::string("targetEnd"), alignment.tPos + alignment.tAlignLength) +
+            CreateKeywordValuePair(std::string("targetStrand"), strand[alignment.tStrand])) 
+        << std::endl;
+    out << CreateDataEntry(std::string("zScore"),
+            CreateKeywordValuePair(std::string("value"), alignment.zScore)) 
+        << std::endl;
+    out << CreateDataEntry(std::string("nInsert"),
+            CreateKeywordValuePair(std::string("value"), alignment.nIns) + " " +
+            CreateKeywordValuePair(std::string("percent"), alignment.nIns*0.5/alignLength)) 
+        << std::endl;
+    out << CreateDataEntry(std::string("nDelete"),
+            CreateKeywordValuePair(std::string("value"), alignment.nDel) + " " + 
+            CreateKeywordValuePair(std::string("percent"), alignment.nDel*0.5/alignLength)) 
+        << std::endl;
+    out << CreateDataEntry(std::string("nMismatch"),
+            CreateKeywordValuePair(std::string("value"), alignment.nMismatch) + " " + 
+            CreateKeywordValuePair(std::string("percent"), alignment.nMismatch*0.5/alignLength)) 
+        << std::endl;
+    out << CreateDataEntry(std::string("nCorrect"),
+            CreateKeywordValuePair(std::string("value"), alignment.nMatch) + " " +
+            CreateKeywordValuePair(std::string("percent"), alignment.nMatch*0.5/alignLength)) 
+        << std::endl;
+
+    out << CreateStartEntry(std::string("alignment"), std::string("")) 
+        << CreateStartEntry(std::string("query"), std::string("")) 
+        << std::endl;
+    out << qAlignStr << std::endl;
+    out << CreateEndEntry(std::string("query")) << std::endl;
+    out << CreateStartEntry(std::string("target"), std::string("")) 
+        << std::endl;
+    out << tAlignStr << std::endl;
+    out << CreateEndEntry(std::string("target")) << std::endl;
+    out << CreateEndEntry(std::string("alignment")) << std::endl;
+    out << CreateEndEntry(std::string("hit")) << std::endl;
+}
+}
+#endif
diff --git a/libcpp/alignment/ipc/SharedMemoryAllocator.hpp b/libcpp/alignment/ipc/SharedMemoryAllocator.hpp
new file mode 100644
index 0000000..5599b63
--- /dev/null
+++ b/libcpp/alignment/ipc/SharedMemoryAllocator.hpp
@@ -0,0 +1,33 @@
+#ifndef _BLASR_SHARED_MEMORY_ALLOCATOR_HPP_
+#define _BLASR_SHARED_MEMORY_ALLOCATOR_HPP_
+
+#include <iostream>
+#include <string>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+template<typename T_Data>
+int AllocateMappedShare(std::string &handle, int dataLength, T_Data *&dataPtr, int &shmId) {
+    std::cout << "opening shm" << std::endl;
+    shmId = shm_open(handle.c_str(), O_CREAT| O_RDWR, S_IRUSR | S_IWUSR);
+    if (ftruncate(shmId, sizeof(T_Data[dataLength])) == -1) {
+        std::cout <<" ftruncate error: " << errno << std::endl;
+    }
+    std::cout << "done truncating." << std::endl;
+    dataPtr = (T_Data*) mmap(NULL, sizeof(T_Data[dataLength]),
+                                                PROT_READ | PROT_WRITE, MAP_SHARED, shmId, 0); 
+    if (dataPtr == MAP_FAILED) {
+        // 
+        // Handle this better later on.
+        //
+        std::cout << "ERROR, MEMORY MAP FAILED." << std::endl;
+        exit(1);
+    }
+    std::cout << "done mapping." << std::endl;
+    return dataLength;
+}
+
+
+#endif // _BLASR_SHARED_MEMORY_ALLOCATOR_HPP_
diff --git a/libcpp/alignment/makefile b/libcpp/alignment/makefile
new file mode 100644
index 0000000..0cfd1d6
--- /dev/null
+++ b/libcpp/alignment/makefile
@@ -0,0 +1,52 @@
+all:
+
+include ../rules.mk
+include ../defines.mk
+
+CXXOPTS := -std=c++11 -pedantic -MMD -MP -Wno-long-long
+INCLUDES += . ${LIBPBDATA_INCLUDE} ${LIBPBIHDF_INCLUDE} ${HDF5_INCLUDE} ${PBBAM_INCLUDE} ${HTSLIB_INCLUDE} ${BOOST_INCLUDE}
+DEP_LIBS += ${LIBPBDATA_LIB} ${HDF5_LIB} ${PBBAM_LIB} ${HTSLIB_LIB} ${ZLIB_LIB}
+LDFLAGS  += $(patsubst %,$(dirname %),${DEP_LIBS})
+
+all: libblasr.a libblasr.so
+
+sources := $(wildcard algorithms/alignment/*.cpp) \
+		   $(wildcard algorithms/alignment/sdp/*.cpp) \
+		   $(wildcard algorithms/anchoring/*.cpp) \
+		   $(wildcard algorithms/compare/*.cpp) \
+		   $(wildcard algorithms/sorting/*.cpp) \
+		   $(wildcard datastructures/alignment/*.cpp) \
+		   $(wildcard datastructures/alignmentset/*.cpp) \
+		   $(wildcard datastructures/anchoring/*.cpp) \
+		   $(wildcard datastructures/tuplelists/*.cpp) \
+		   $(wildcard suffixarray/*.cpp) \
+		   $(wildcard qvs/*.cpp) \
+		   $(wildcard statistics/*.cpp) \
+		   $(wildcard tuples/*.cpp) \
+		   $(wildcard utils/*.cpp) \
+		   $(wildcard files/*.cpp) \
+		   $(wildcard format/*.cpp) \
+		   $(wildcard simulator/*.cpp) \
+		   $(wildcard *.cpp) 
+
+ifdef nohdf
+sources := $(filter-out files/% utils/FileOfFileNames.cpp format/SAMHeaderPrinter.cpp, $(sources))
+endif
+
+objects := $(sources:.cpp=.o)
+shared_objects := $(sources:.cpp=.shared.o)
+dependencies := $(objects:.o=.d) $(shared_objects:.o=.d)
+
+libblasr.a: $(objects)
+	$(AR) $(ARFLAGS) $@ $^
+
+libblasr.so: $(shared_objects) $(DEP_LIBS)
+	$(CXX) $(LD_SHAREDFLAGS) -o $@ -Wl,-soname,$@ $^
+
+clean: 
+	@rm -f libblasr.a libblasr.so
+	@rm -f $(objects) $(shared_objects) $(dependencies)
+	@find . -type f -name \*.o -delete
+	@find . -type f -name \*.d -delete
+
+-include $(dependencies)
diff --git a/libcpp/alignment/old.Makefile b/libcpp/alignment/old.Makefile
new file mode 100644
index 0000000..099a7d0
--- /dev/null
+++ b/libcpp/alignment/old.Makefile
@@ -0,0 +1,113 @@
+
+include ../common.mk
+
+# To enable building a shared library, invoke as "make SHARED_LIB=true ..."
+ifneq ($(SHARED_LIB),)
+    # Generating shared library
+    CXX_SHAREDFLAGS := -fPIC
+    LD_SHAREDFLAGS  := -shared -fPIC
+    TARGET_LIB      := libblasr.so
+    # Developers should set these to appropriate defaults (other systems 
+    # will override these on the command line):
+    HDF5_LIB        := ../../../../prebuilt.out/prebuilt.out/hdf5/hdf5-1.8.12/centos-5/lib/libhdf5.so
+    ZLIB_LIB        := ../../../../prebuilt.tmpsrc/zlib/zlib_1.2.8/_output/install/lib/libz.so
+    HTSLIB_LIB      := ../../../staging/PostPrimary/pbbam/_output/install-build/lib/libpbbam.so
+    PBBAM_LIB       := ../../../staging/PostPrimary/pbbam/third-party/htslib/_output/install-build/lib/libhts.so
+    LIBPBDATA_LIB   := ../../../staging/PostPrimary/pbbam/third-party/htslib/_output/install-build/lib/libhts.so
+else
+    # Generating shared library
+    CXX_SHAREDFLAGS :=
+    LD_SHAREDFLAGS  :=
+    TARGET_LIB      := libblasr.a
+    HDF5_LIB        :=
+    ZLIB_LIB        :=
+    HTSLIB_LIB      :=
+    PBBAM_LIB       :=
+    LIBPBDATA_LIB   :=
+endif
+
+DEP_LIBS := $(HDF5_LIB) $(ZLIB_LIB) $(HTSLIB_LIB) $(PBBAM_LIB) $(PBDATA_LIB)
+
+LIBPBDATA_INCLUDE := ../pbdata
+LIBPBIHDF_INCLUDE := ../hdf
+PBBAM_INCLUDE := $(PBBAM)/include
+HTSLIB_INCLUDE ?= $(HTSLIB)
+
+INCLUDES = -I$(LIBPBDATA_INCLUDE) \
+           -I$(LIBPBIHDF_INCLUDE) \
+	   -I.
+ifneq ($(HDF5_INC),)
+INCLUDES += -I$(HDF5_INC)
+else
+HDF_HEADERS := hdf5-1.8.12-headers
+INCLUDES += -I../hdf/$(HDF_HEADERS)/src -I../hdf/$(HDF_HEADERS)/c++/src
+endif
+
+ifneq ($(ZLIB_ROOT), notfound)
+	INCLUDES += -I$(ZLIB_ROOT)/include
+endif
+
+ifeq ($(origin nopbbam), undefined)
+    INCLUDES += -I$(PBBAM_INCLUDE) -I$(HTSLIB_INCLUDE) -I$(BOOST_INCLUDE)
+endif
+
+CXXOPTS := -std=c++11 -pedantic -Wno-long-long -MMD -MP
+
+sources := $(wildcard algorithms/alignment/*.cpp) \
+		   $(wildcard algorithms/alignment/sdp/*.cpp) \
+		   $(wildcard algorithms/anchoring/*.cpp) \
+		   $(wildcard algorithms/compare/*.cpp) \
+		   $(wildcard algorithms/sorting/*.cpp) \
+		   $(wildcard datastructures/alignment/*.cpp) \
+		   $(wildcard datastructures/alignmentset/*.cpp) \
+		   $(wildcard datastructures/anchoring/*.cpp) \
+		   $(wildcard datastructures/tuplelists/*.cpp) \
+		   $(wildcard suffixarray/*.cpp) \
+		   $(wildcard qvs/*.cpp) \
+		   $(wildcard statistics/*.cpp) \
+		   $(wildcard tuples/*.cpp) \
+		   $(wildcard utils/*.cpp) \
+		   $(wildcard files/*.cpp) \
+		   $(wildcard format/*.cpp) \
+		   $(wildcard simulator/*.cpp) \
+		   $(wildcard *.cpp) 
+
+ifdef nohdf
+sources := $(filter-out files/% utils/FileOfFileNames.cpp, $(sources))
+endif
+
+objects := $(sources:.cpp=.o)
+shared_objects := $(sources:.cpp=.shared.o)
+dependencies := $(objects:.o=.d) $(shared_objects:.o=.d)
+
+all : CXXFLAGS ?= -O3
+
+debug : CXXFLAGS ?= -g -ggdb -fno-inline
+
+profile : CXXFLAGS ?= -Os -pg
+
+g: CXXFLAGS = -g -ggdb -fno-inline -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fno-omit-frame-pointer 
+
+all debug profile g: $(TARGET_LIB)
+
+libblasr.a: $(objects)
+	$(AR_pp) $(ARFLAGS) $@ $^
+
+libblasr.so: $(shared_objects) $(DEP_LIBS)
+	$(CXX_pp) $(LD_SHAREDFLAGS) -o $@ $^
+
+%.o: %.cpp
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(LEGACY) $(INCLUDES) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o) $(@:%.o=%.d)" -c $< -o $@
+
+%.shared.o: %.cpp
+	$(CXX_pp) $(CXX_SHAREDFLAGS) $(CXXOPTS) $(CXXFLAGS) $(LEGACY) $(INCLUDES) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o) $(@:%.o=%.d)" -c $< -o $@
+
+# .INTERMEDIATE: $(objects)
+
+clean: 
+	@rm -f libblasr.a libblasr.so
+	@rm -f $(objects) $(shared_objects) $(dependencies)
+	@find . -type f -name \*.o -delete
+	@find . -type f -name \*.d -delete
+
+-include $(dependencies)
diff --git a/libcpp/alignment/qvs/QualityValueProfile.cpp b/libcpp/alignment/qvs/QualityValueProfile.cpp
new file mode 100644
index 0000000..f1c3c2f
--- /dev/null
+++ b/libcpp/alignment/qvs/QualityValueProfile.cpp
@@ -0,0 +1,41 @@
+#include "QualityValueProfile.hpp"
+
+QualityValueProfile::QualityValueProfile(int _wordSize, 
+    int _numQualityValues) {
+    wordSize = _wordSize;
+    numQualityValues = _numQualityValues;
+    // Initialize the tuple metrics to map from seq->index
+    tm.Initialize(wordSize);
+    nWords = 1 << (2*wordSize);
+    // Initialize the matrix of quality values.
+    profile.Grow(nWords, numQualityValues);
+    profile.Initialize(0);
+}
+
+void QualityValueProfile::Update(Nucleotide *seq, QualityValue qv) {
+    DNATuple tuple;
+    if (tuple.FromStringLR(seq, tm)) {
+        profile.Set(tuple.tuple, qv, profile(tuple.tuple, qv) + 1);
+    }
+}
+
+void QualityValueProfile::Print(std::ofstream &out) {
+    out << wordSize << " " << numQualityValues 
+        << " " << CDF_GRANULARITY << std::endl;
+    profile.Print(out);
+}
+
+void QualityValueProfile::ProfileToCDF() {
+    int qv;
+    int wordIndex;
+    for (wordIndex = 0 ; wordIndex < nWords; wordIndex++) {
+        int totalSamples = 0;			
+        for (qv = 0; qv < numQualityValues; qv++) {
+            totalSamples += profile(wordIndex, qv);
+            profile.Set(wordIndex, qv, totalSamples);
+        }
+        for (qv = 0; qv < numQualityValues; qv++ ){ 
+            profile.Set(wordIndex, qv, ((profile(wordIndex,qv) * 1.0) / totalSamples)  * CDF_GRANULARITY);
+        }
+    }
+}
diff --git a/libcpp/alignment/qvs/QualityValueProfile.hpp b/libcpp/alignment/qvs/QualityValueProfile.hpp
new file mode 100644
index 0000000..a410fe9
--- /dev/null
+++ b/libcpp/alignment/qvs/QualityValueProfile.hpp
@@ -0,0 +1,23 @@
+#ifndef _BLASR_QUALITY_VALUE_PROFILE_HPP_
+#define _BLASR_QUALITY_VALUE_PROFILE_HPP_
+
+#include <fstream>
+#include "tuples/DNATuple.hpp"
+#include "tuples/TupleMetrics.hpp"
+#include "matrix/FlatMatrix.hpp"
+#include "qvs/QualityValue.hpp"
+
+class QualityValueProfile {
+	int wordSize;
+	int numQualityValues;
+	FlatMatrix2D<int> profile;
+	int nWords;
+	TupleMetrics tm;
+public:
+	static const int CDF_GRANULARITY = 10000;
+	QualityValueProfile(int _wordSize, int _numQualityValues);
+	void Update(Nucleotide *seq, QualityValue qv);
+   	void Print(std::ofstream &out);
+   	void ProfileToCDF();
+};
+#endif
diff --git a/libcpp/alignment/simulator/CDFMap.hpp b/libcpp/alignment/simulator/CDFMap.hpp
new file mode 100644
index 0000000..9a66a51
--- /dev/null
+++ b/libcpp/alignment/simulator/CDFMap.hpp
@@ -0,0 +1,44 @@
+#ifndef _SIMULATOR_CDF_MAP_HPP_
+#define _SIMULATOR_CDF_MAP_HPP_
+#include <algorithm>
+#include <vector>
+#include <assert.h>
+#include "statistics/StatUtils.hpp"
+
+template<typename T_Data>
+class CDFMap {
+public:
+    std::vector<int> cdf;
+    std::vector<T_Data> data;
+    /* Tests:
+     * indices                0 1 2 3 4  5  6
+     * lengths:               1 3 5 9 10 10 11
+     * lengthHistogram.data:  1 3 5 9 10 11
+     * lengthHistogram.cdf :  1 2 3 4 6  7
+     *
+     * lengths:               1 3 5 9 10 11
+     * lengthHistogram.data:  1 3 5 9 10 11
+     * lengthHistogram.cdf :  1 2 3 4 5  6
+     *
+     * lengths:               10
+     * lengthHistogram.data:  10
+     * lengthHistogram.cdf :  1 
+     */ 
+     int SelectRandomValue(T_Data &value);
+
+};
+
+template<typename T_Data>
+int CDFMap<T_Data>::SelectRandomValue(T_Data &value)
+{
+    std::vector<int>::iterator search_it;
+    assert(cdf.size() >= 0);
+    int randomIndex = RandomInt(cdf[cdf.size()-1]);
+    search_it = lower_bound(cdf.begin(), cdf.end(), randomIndex);
+    assert(search_it != cdf.end());
+    int valueIndex = search_it - cdf.begin();
+    value = data[valueIndex];
+    return valueIndex;
+}
+
+#endif
diff --git a/libcpp/alignment/simulator/ContextOutputList.hpp b/libcpp/alignment/simulator/ContextOutputList.hpp
new file mode 100644
index 0000000..5023463
--- /dev/null
+++ b/libcpp/alignment/simulator/ContextOutputList.hpp
@@ -0,0 +1,100 @@
+#ifndef _SIMULATOR_CONTEXT_OUTPUT_LIST_HPP_
+#define _SIMULATOR_CONTEXT_OUTPUT_LIST_HPP_
+
+#include <stdlib.h>
+#include <map>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include "utils.hpp"
+#include "simulator/OutputList.hpp"
+
+
+class ContextOutputList {
+public:
+    std::map<std::string, OutputList*> outputMap;
+    int contextLength;
+    int ParsePair(std::string &output, std::string &outStr, int &outCount){ 
+        std::string contextStr, outCountStr;
+        int i;
+        for (i = 0; i < output.size(); i++) {
+            if (output[i] == '=') {
+                int start = 0;
+                while(start < i and (output[start] == ' ' or output[start] == '\t')) { start++;}
+                outStr.assign(&output[start], i-start);
+                outCountStr.assign(&output[i+1], output.size()-i-1);
+                outCount = atoi(outCountStr.c_str());
+                return 1;
+            }
+        }
+        return 0;
+    }
+
+    int SampleRandomContext(std::string refContext, std::string &readContext) {
+        //
+        // Chec to see if there is a distribution for this ref context, if
+        // not, just return the ref context so that things may proceed,
+        // but return a fail code.
+        //
+        if (outputMap.find(refContext) == outputMap.end()) {
+            readContext = refContext;
+            return 0;
+        }
+        else {
+            outputMap[refContext]->SelectRandomContect(readContext);
+            return 1;
+        }
+    }
+
+
+    void Read(std::string &inName) {
+        ifstream in;
+        CrucialOpen(inName, in, std::ios::in);
+        Read(in);
+    }
+
+    void Read(ifstream &in) {
+        int nLines = 0;
+        contextLength = 0;
+        while(in) {
+            std::string context;
+            if (!(in >> context)) break;
+
+            contextLength = context.size();
+            std::string outputsLine;
+            getline(in,outputsLine);
+            // parse ctx=num; pairs
+            int i;
+            int e;
+            i = 0;
+            if (outputMap.find(context) == outputMap.end()) {
+                outputMap[context] = new OutputList;
+            }
+
+            while(i < outputsLine.size()) {
+                e = i+1;
+                while(e < outputsLine.size() and outputsLine[e] != ';') e++;
+                std::string pairStr;
+                pairStr.assign(&outputsLine[i], e-i);
+                if (e > i + 1) {
+                    std::string outStr;
+                    int outCount;
+                    ParsePair(pairStr, outStr, outCount);
+                    outputMap[context]->AddOutput(outStr, outCount);
+                }
+                i = e + 1;
+            }
+            outputMap[context]->StoreCumulativeCounts();
+        }
+    }
+
+    void Free() {
+        std::map<std::string,OutputList*>::iterator mapIt;
+        for (mapIt = outputMap.begin(); mapIt != outputMap.end(); ++mapIt) {
+            if (mapIt->second) {delete mapIt->second;}
+        }
+    }
+};
+
+
+#endif
diff --git a/libcpp/alignment/simulator/ContextSample.cpp b/libcpp/alignment/simulator/ContextSample.cpp
new file mode 100644
index 0000000..798df30
--- /dev/null
+++ b/libcpp/alignment/simulator/ContextSample.cpp
@@ -0,0 +1,53 @@
+#include "ContextSample.hpp"
+
+ContextSample::ContextSample() {
+    minSamples = 0;
+    maxSamples = 0;
+    reachedMinSamples = 0;
+}
+
+int ContextSample::GetNSamples() {
+    return samples.size();
+}
+
+int ContextSample::AppendSample(SMRTSequence &seq, DNALength pos) {
+    // 
+    // Check to see if the space has been sampled enough.
+    //
+    if (maxSamples != 0 and samples.size() >= maxSamples)
+        return 0;
+
+    samples.resize(samples.size()+1);
+    samples[samples.size()-1].CreateFromRead(seq,pos);
+    if (samples.size() > minSamples and reachedMinSamples == 0) {
+        reachedMinSamples = 1;
+        return 1;
+    }
+    else {
+        return 0;
+    }
+}
+
+QualitySample* ContextSample::GetRandomQualitySample() {
+    int sampleIndex = RandomInt(samples.size());
+    return &samples[sampleIndex];
+}
+
+void ContextSample::Write(std::ofstream &out) {
+    int s;
+    int sampleSize = samples.size();
+    out.write((char*) &sampleSize, sizeof(sampleSize));
+    for (s = 0; s < samples.size(); s++ ){
+        samples[s].Write(out);
+    }
+}
+
+void ContextSample::Read(std::ifstream &in) {
+    int s;
+    int sampleSize;
+    in.read((char*)&sampleSize, sizeof(sampleSize));
+    samples.resize(sampleSize);
+    for (s = 0; s < sampleSize; s++ ){
+        samples[s].Read(in);
+    }
+}
diff --git a/libcpp/alignment/simulator/ContextSample.hpp b/libcpp/alignment/simulator/ContextSample.hpp
new file mode 100644
index 0000000..c7aa5c2
--- /dev/null
+++ b/libcpp/alignment/simulator/ContextSample.hpp
@@ -0,0 +1,30 @@
+#ifndef _SIMULATOR_CONTEXT_SAMPLE_HPP_
+#define _SIMULATOR_CONTEXT_SAMPLE_HPP_
+
+#include<string>
+#include<vector>
+#include<iostream>
+#include "simulator/QualitySample.hpp"
+#include "statistics/StatUtils.hpp"
+
+class ContextSample {
+public:
+    std::vector<QualitySample> samples;
+    int minSamples;
+    int maxSamples;
+    int reachedMinSamples;
+
+    ContextSample();
+
+    int GetNSamples();
+
+    int AppendSample(SMRTSequence &seq, DNALength pos);
+
+    QualitySample* GetRandomQualitySample();
+
+    void Write(std::ofstream &out);
+
+    void Read(std::ifstream &in);
+};
+
+#endif
diff --git a/libcpp/alignment/simulator/ContextSet.cpp b/libcpp/alignment/simulator/ContextSet.cpp
new file mode 100644
index 0000000..1d84d72
--- /dev/null
+++ b/libcpp/alignment/simulator/ContextSet.cpp
@@ -0,0 +1,35 @@
+#include "ContextSet.hpp"
+
+ContextSampleMap::ContextSampleMap() {
+    contextLength = 0;
+}
+
+void ContextSampleMap::Write(std::ofstream &out) {
+    T_ContextSampleMap::iterator mapIt, mapEnd;
+    int mapSize = this->size();
+    out.write((char*)&contextLength, sizeof(contextLength));
+    out.write((char*)&mapSize, sizeof(mapSize));
+    mapEnd = this->end();
+    for(mapIt = this->begin(); mapIt != mapEnd; ++mapIt) {
+        out.write(mapIt->first.c_str(), contextLength);
+        mapIt->second->Write(out);
+    }
+}
+
+void ContextSampleMap::Read(std::ifstream &in) {
+    in.read((char*)&contextLength, sizeof(contextLength));
+    int numContext;
+    in.read((char*)&numContext, sizeof(numContext));
+    int i;
+    char *context = new char[contextLength+1];
+    context[contextLength] = '\0';
+    for (i = 0; i < numContext; i++) {
+        in.read(context, contextLength);
+        std::string contextString = context;
+        // Allocate the context
+        (*this)[contextString] = new ContextSample;
+        (*this)[contextString]->Read(in);
+    }
+    delete[] context;
+}
+
diff --git a/libcpp/alignment/simulator/ContextSet.hpp b/libcpp/alignment/simulator/ContextSet.hpp
new file mode 100644
index 0000000..7441f08
--- /dev/null
+++ b/libcpp/alignment/simulator/ContextSet.hpp
@@ -0,0 +1,19 @@
+#ifndef _SIMULATOR_CONTEXT_SET_HPP_
+#define _SIMULATOR_CONTEXT_SET_HPP_
+
+#include <map>
+#include <iostream>
+#include "ContextSample.hpp"
+
+typedef std::map<std::string, ContextSample*> T_ContextSampleMap;
+
+class ContextSampleMap : public T_ContextSampleMap {
+public:
+    int contextLength;
+
+    ContextSampleMap();
+    void Write(std::ofstream &out);
+    void Read(std::ifstream &in);
+};
+
+#endif
diff --git a/libcpp/alignment/simulator/LengthHistogram.cpp b/libcpp/alignment/simulator/LengthHistogram.cpp
new file mode 100644
index 0000000..e135db2
--- /dev/null
+++ b/libcpp/alignment/simulator/LengthHistogram.cpp
@@ -0,0 +1,58 @@
+#include "simulator/LengthHistogram.hpp"
+
+int LengthHistogram::Read(std::string &inName) {
+    std::ifstream in;
+    CrucialOpen(inName, in, std::ios::in);
+    return Read(in);
+}
+
+int LengthHistogram::Read(std::ifstream &in) {
+    while(in) {
+        int length, count;
+        in >> length;
+        in >> count;
+        lengthHistogram.data.push_back(length);
+        if (lengthHistogram.cdf.size() == 0) {
+            lengthHistogram.cdf.push_back(count);
+        }
+        else {
+            lengthHistogram.cdf.push_back(lengthHistogram.cdf[lengthHistogram.cdf.size()-1] + count);
+        }
+    }
+    return 1;
+}
+
+void LengthHistogram::GetRandomLength(int &length) {
+    lengthHistogram.SelectRandomValue(length);
+}
+
+void LengthHistogram::BuildFromAlignmentLengths(std::vector<int> &lengths) {
+    int i;
+    sort(lengths.begin(), lengths.end());
+    int f;
+    for (f = 0, i = 1; i < lengths.size(); i++) {
+        if (lengths[i] != lengths[f]) {
+            lengthHistogram.data.push_back(lengths[f]);
+            lengthHistogram.cdf.push_back(i);
+            f = i;
+        }
+    }
+    if (lengths.size() != 0) {
+        lengthHistogram.data.push_back(lengths[lengths.size()-1]);
+        lengthHistogram.cdf.push_back(lengths.size());
+    }
+    /* Tests:
+     * indices                0 1 2 3 4  5  6
+     * lengths:               1 3 5 9 10 10 11
+     * lengthHistogram.data:  1 3 5 9 10 11
+     * lengthHistogram.cdf :  1 2 3 4 6  7
+     *
+     * lengths:               1 3 5 9 10 11
+     * lengthHistogram.data:  1 3 5 9 10 11
+     * lengthHistogram.cdf :  1 2 3 4 5  6
+     *
+     * lengths:               10
+     * lengthHistogram.data:  10
+     * lengthHistogram.cdf :  1 
+     */ 
+}
diff --git a/libcpp/alignment/simulator/LengthHistogram.hpp b/libcpp/alignment/simulator/LengthHistogram.hpp
new file mode 100644
index 0000000..28c5e51
--- /dev/null
+++ b/libcpp/alignment/simulator/LengthHistogram.hpp
@@ -0,0 +1,24 @@
+#ifndef _SIMULATOR_LENGTH_HISTOGRAM_HPP_
+#define _SIMULATOR_LENGTH_HISTOGRAM_HPP_
+
+#include <iostream>
+#include <string>
+#include <vector>
+#include "simulator/CDFMap.hpp"
+#include "alignment/CmpAlignment.hpp"
+#include "utils.hpp"
+
+class LengthHistogram {
+public:
+    CDFMap<int> lengthHistogram;
+
+    int Read(std::string &inName);
+   
+    int Read(std::ifstream &in);
+
+    void GetRandomLength(int &length);
+
+    void BuildFromAlignmentLengths(std::vector<int> &lengths);
+};
+
+#endif
diff --git a/libcpp/alignment/simulator/OutputList.hpp b/libcpp/alignment/simulator/OutputList.hpp
new file mode 100644
index 0000000..352c047
--- /dev/null
+++ b/libcpp/alignment/simulator/OutputList.hpp
@@ -0,0 +1,57 @@
+#ifndef _SIMULATOR_OUTPUT_LIST_HPP_
+#define _SIMULATOR_OUTPUT_LIST_HPP_
+
+#include <string>
+#include <vector>
+
+#include "CDFMap.hpp"
+
+class Output {
+public:
+    std::string output;
+	int    count;
+};
+
+class OutputList {
+public:
+	int totalCount;
+    std::vector<Output> outputs;
+	CDFMap<std::vector<Output>::iterator> cdf;
+
+	OutputList() {
+		totalCount = 0;
+	}
+
+	int AddOutput(std::string str, int count) {
+		outputs.resize(outputs.size()+1);
+		outputs[outputs.size()-1].output = str;
+		outputs[outputs.size()-1].count  = count;
+		totalCount += count;
+	}
+	
+	void StoreCumulativeCounts() {
+		int outputIndex;
+		int total = 0;
+		for (outputIndex = 0; outputIndex < outputs.size(); outputIndex++) {
+			total += outputs[outputIndex].count;
+			cdf.cdf.push_back(total);
+			cdf.data.push_back(outputs.begin() + outputIndex);
+		}
+		assert(total == totalCount);
+	}
+
+	int ReturnUniformRandomContextIt(std::vector<Output>::iterator &outputIt) {
+		return cdf.SelectRandomValue(outputIt);
+	}
+
+	int SelectRandomContect(std::string &outputContext) {
+        std::vector<Output>::iterator outIt;
+		ReturnUniformRandomContextIt(outIt);
+		outputContext = outIt->output;
+		return outIt - outputs.begin();
+	}
+		
+};
+
+
+#endif
diff --git a/libcpp/alignment/simulator/OutputSample.hpp b/libcpp/alignment/simulator/OutputSample.hpp
new file mode 100644
index 0000000..528ecd3
--- /dev/null
+++ b/libcpp/alignment/simulator/OutputSample.hpp
@@ -0,0 +1,59 @@
+#ifndef _SIMULATOR_OUTPUT_SAMPLE_HPP_
+#define _SIMULATOR_OUTPUT_SAMPLE_HPP_
+
+#include "QualitySample.hpp"
+#include "SMRTSequence.hpp"
+
+class OutputSample {
+public:
+    enum Type {Match, Insertion, Deletion, Substitution};
+
+    std::vector<QualitySample> qualities;
+    std::vector<Nucleotide>    nucleotides;
+    Type type;
+
+    void Resize(int size) {
+        qualities.resize(size);
+        nucleotides.resize(size);
+    }
+
+    int CopyFromSeq(SMRTSequence &seq, int pos, int length=1) {
+        Resize(length);
+        int i;
+        for (i = 0; i < length; i++) {
+            qualities[i].CopyFromSequence(seq, pos+i);
+            nucleotides[i] = seq.seq[pos+i];
+        }
+    }
+
+    void Write(std::ofstream &out) {
+
+        out.write((char*) &type, sizeof(type));
+        int nNuc = nucleotides.size();
+
+        out.write((char*)&nNuc, sizeof(int));
+        int i;
+        for (i = 0; i < qualities.size(); i++) {
+            qualities[i].Write(out);
+        }
+        assert(nNuc == qualities.size());
+        out.write((char*) &nucleotides[0], sizeof(Nucleotide)*nucleotides.size());
+
+    }
+
+    void Read(std::ifstream &in) {
+        in.read((char*) &type, sizeof(Type));
+        int nNuc;
+        in.read((char*) &nNuc, sizeof(int));
+        qualities.resize(nNuc);
+        int i;
+        for (i = 0; i < nNuc; i++) {
+            qualities[i].Read(in);
+        }
+        nucleotides.resize(nNuc);
+        in.read((char*) &nucleotides[0], sizeof(Nucleotide)* nNuc);
+
+    }
+};
+
+#endif
diff --git a/libcpp/alignment/simulator/OutputSampleList.hpp b/libcpp/alignment/simulator/OutputSampleList.hpp
new file mode 100644
index 0000000..f2da93f
--- /dev/null
+++ b/libcpp/alignment/simulator/OutputSampleList.hpp
@@ -0,0 +1,33 @@
+#ifndef _SIMULATOR_OUTPUT_SAMPLE_LIST_HPP_
+#define _SIMULATOR_OUTPUT_SAMPLE_LIST_HPP_
+
+#include <vector>
+#include "OutputSample.hpp"
+
+class OutputSampleList: public std::vector<OutputSample> {
+public:
+    void Write(ofstream &out) {
+        int nElem = this->size();
+        out.write((char*)&nElem, sizeof(int));
+        if (nElem > 0) {
+            int i;
+            for (i = 0; i < nElem; i++) {
+                (*this)[i].Write(out);
+            }
+        }
+    }
+
+    void Read(std::ifstream &in) {
+        int nElem;
+        in.read((char*) &nElem, sizeof(int));
+        if (nElem > 0) {
+            this->resize(nElem);
+            int i;
+            for (i = 0; i < nElem; i++) {
+                (*this)[i].Read(in);
+            }
+        }
+    }
+};
+
+#endif
diff --git a/libcpp/alignment/simulator/OutputSampleListSet.hpp b/libcpp/alignment/simulator/OutputSampleListSet.hpp
new file mode 100644
index 0000000..dbfe8d0
--- /dev/null
+++ b/libcpp/alignment/simulator/OutputSampleListSet.hpp
@@ -0,0 +1,123 @@
+#ifndef SIMULATOR_OUTPUT_SAMPLE_LIST_SET_H_
+#define SIMULATOR_OUTPUT_SAMPLE_LIST_SET_H_
+
+#include <map>
+#include <string>
+#include <iostream>
+#include "OutputSampleList.hpp"
+
+
+using namespace std;
+
+typedef map<string, OutputSampleList> OutputSampleListMap;
+class OutputSampleListSet {
+ public:
+  OutputSampleListMap listMap;
+  vector<string> keys;
+  int keyLength;
+  int nSufficient;
+  int sampleSpaceSize;
+  int keySize;
+  int minSamples;
+  int maxSamples;
+  vector<int> lengths;
+  OutputSampleListSet(int keySizeP) {
+    minSamples = 500;
+    maxSamples = 2000;
+    nSufficient = 0;
+    keySize = keySizeP;
+    sampleSpaceSize = 1 << (2*keySize);
+  }
+
+  void Write(ofstream &out) {
+    // Say how many elements to write.
+    OutputSampleListMap::iterator mapIt;
+    int setSize = listMap.size();
+    out.write((char*) &setSize, sizeof(int));
+    int keySize = 0;
+    // Say how large each element is.
+    if (listMap.size() > 0) {
+      keySize = listMap.begin()->first.size();
+    }
+    out.write((char*)&keySize, sizeof(int));
+
+    for (mapIt = listMap.begin(); mapIt != listMap.end(); ++mapIt) {
+      string mapItKey = mapIt->first;
+      out.write((char*) mapItKey.c_str(), sizeof(char) * mapItKey.size());
+      mapIt->second.Write(out);
+    }
+    int numLengths = lengths.size();
+    out.write((char*) &numLengths, sizeof(int));
+    int i;
+    for ( i = 0; i < lengths.size(); i++) {
+      out.write((char*) &lengths[i], sizeof(int));
+    }
+  }
+
+  void Read(string &inName) {
+    ifstream in;
+    CrucialOpen(inName, in, std::ios::in|std::ios::binary);
+    Read(in);
+    in.close();
+  }
+
+  void Read(ifstream &in) {
+    int setSize;
+    in.read((char*) &setSize, sizeof(int));
+    in.read((char*) &keyLength, sizeof(int));
+
+    if (keyLength == 0 or setSize == 0) { return; }
+    char *key = new char[keyLength+1];
+    key[keyLength] = '\0';
+    int i;
+    for (i = 0; i < setSize; i++) {
+      in.read(key, sizeof(char)*keyLength);
+      listMap[key].Read(in);
+    }
+    int numLengths;
+    in.read((char*) &numLengths, sizeof(int));
+    if (numLengths > 0) {
+      lengths.resize(numLengths);
+    }
+    for (i = 0; i < numLengths; i++) {
+      in.read((char*) &lengths[i], sizeof(int));
+    }
+    if (key) {delete [] key; key = NULL;}
+  }
+
+  void AppendOutputSample(string key, OutputSample &sample) {
+      if (listMap[key].size() < minSamples) {
+          if (listMap[key].size() < maxSamples) {
+              listMap[key].push_back(sample);
+          }
+          if (listMap[key].size() == minSamples) {
+              nSufficient++;
+              cout << nSufficient << " / " << sampleSpaceSize << endl;
+          }
+      }
+  }
+
+  bool Sufficient() {
+      return nSufficient == sampleSpaceSize;
+  }
+
+  void SampleRandomSample(string key, OutputSample &sample) {
+      if (listMap.find(key) == listMap.end()) {
+          cout << listMap.size() << endl;
+          cout <<"ERROR, " << key << " is not a sampled context." << endl;
+          int i;
+          for (i = 0; i < key.size(); i++) {
+              char c = toupper(key[i]);
+              if (c != 'A' and c != 'C' and c != 'G' and c != 'T') {
+                  cout << "The nucleotide " << c << " is not supported." << endl;
+              }
+          }
+          exit(1);
+      }
+      sample = listMap[key][RandomInt(listMap[key].size())];
+  }
+
+
+};
+
+#endif
diff --git a/libcpp/alignment/simulator/QualitySample.cpp b/libcpp/alignment/simulator/QualitySample.cpp
new file mode 100644
index 0000000..1f15b95
--- /dev/null
+++ b/libcpp/alignment/simulator/QualitySample.cpp
@@ -0,0 +1,77 @@
+#include "QualitySample.hpp" 
+
+void QualitySample::CopyFromSequence(SMRTSequence &seq, int pos) {
+    qv[0] = seq.qual[pos];
+    qv[1] = seq.deletionQV[pos];
+    qv[2] = seq.insertionQV[pos];
+    qv[3] = seq.substitutionQV[pos];
+    tags[0] = seq.deletionTag[pos];
+    tags[1] = seq.substitutionTag[pos];
+    frameValues[0] = seq.pulseIndex[pos];
+    frameValues[1] = seq.preBaseFrames[pos];
+    frameValues[2] = seq.widthInFrames[pos];
+}
+
+void QualitySample::Write(std::ofstream &out) {
+    out.write((char*)qv, sizeof(qv[0])*NQV);
+    out.write((char*)frameValues, sizeof(frameValues[0])*NFV);
+    out.write((char*)tags, sizeof(tags[0])*NT);
+}
+
+void QualitySample::Read(std::ifstream &in) {
+    in.read((char*)qv, sizeof(QualityValue)*NQV);
+    in.read((char*)frameValues, sizeof(frameValues[0])*NFV);
+    in.read((char*)tags, sizeof(tags[0])*NT);
+}
+
+void QualitySample::CreateFromRead(SMRTSequence &seq, DNALength pos) {
+    /*
+     * For now create with a static set of values:
+     * qvs:
+     * 0 QualityValue
+     * 1 DeletionQV
+     * 2 InsertionQV
+     * 3 SubstitutionQV
+     * tags:
+     * 0 DeletionTag
+     * 1 SubstitutionTag
+     * PulseData
+     * 0 PulseIndex
+     * 1 PreBaseFrames
+     * 2 WidthInFrames
+     */
+    //		qv.resize(4);
+    std::fill(&qv[0], &qv[NQV], 0);
+    if (seq.qual.Empty() == false){ 
+        qv[0] = seq.qual[pos];
+    }
+    if (seq.deletionQV.Empty() == false) {
+        qv[1] = seq.deletionQV[pos];
+    }
+    if (seq.insertionQV.Empty() == false ){ 
+        qv[2] = seq.insertionQV[pos];
+    }
+    if (seq.substitutionQV.Empty() == false){ 
+        qv[3] = seq.substitutionQV[pos];
+    }
+    std::fill(&tags[0], &tags[NT], 0);
+    if (seq.deletionTag){ 
+        tags[0] = seq.deletionTag[pos];
+    }
+    if (seq.substitutionTag) {
+        tags[1] = seq.substitutionTag[pos];
+    }
+
+    std::fill(&frameValues[0], &frameValues[NFV], 0);
+    if (seq.pulseIndex) {
+        frameValues[0] = seq.pulseIndex[pos];
+    }
+
+    if (seq.preBaseFrames) {
+        frameValues[1] = seq.preBaseFrames[pos];
+    }
+
+    if (seq.widthInFrames) {
+        frameValues[2] = seq.widthInFrames[pos];
+    }
+}
diff --git a/libcpp/alignment/simulator/QualitySample.hpp b/libcpp/alignment/simulator/QualitySample.hpp
new file mode 100644
index 0000000..3f0a181
--- /dev/null
+++ b/libcpp/alignment/simulator/QualitySample.hpp
@@ -0,0 +1,28 @@
+#ifndef _SIMULATOR_QUALITY_SAMPLE_HPP_
+#define _SIMULATOR_QUALITY_SAMPLE_HPP_
+
+#include <iostream>
+#include "Types.h"
+#include "SMRTSequence.hpp"
+#include "qvs/QualityValue.hpp"
+
+#define NQV 4
+#define NFV 3
+#define NT  2
+
+class QualitySample {
+public:
+	QualityValue qv[NQV];
+	HalfWord     frameValues[NFV];
+	Nucleotide   tags[NT];
+
+    void CopyFromSequence(SMRTSequence &seq, int pos);
+    
+    void Write(std::ofstream &out);
+   
+    void Read(std::ifstream &in);
+   
+    void CreateFromRead(SMRTSequence &seq, DNALength pos);
+};
+
+#endif
diff --git a/libcpp/alignment/statistics/AnchorDistributionTable.hpp b/libcpp/alignment/statistics/AnchorDistributionTable.hpp
new file mode 100644
index 0000000..c789b4d
--- /dev/null
+++ b/libcpp/alignment/statistics/AnchorDistributionTable.hpp
@@ -0,0 +1,43518 @@
+#ifndef STATISTICS_ANCHOR_DISTRIBUTION_TABLE_H_
+#define STATISTICS_ANCHOR_DISTRIBUTION_TABLE_H_
+
+static int anchorMinKValues[] = {10,25,1};
+static int anchorReadLengths[] = {100,3000,10};
+static int anchorReadAccuracies[]  = {70,95,1};
+static float meanNumAnchors[] = {
+0.83,0.91,1.07,1.08,1.18,1.21,1.39,1.46,1.54,1.64,
+1.69,1.83,1.87,1.96,2.08,2.11,2.22,2.35,2.38,2.46,
+2.57,2.60,2.66,2.65,2.82,3.03,3.08,3.06,3.26,3.31,
+3.32,3.38,3.58,3.67,3.69,3.85,3.81,3.88,4.05,4.16,
+4.32,4.43,4.44,4.38,4.44,4.52,4.65,4.90,4.73,4.90,
+4.98,5.11,5.21,5.31,5.37,5.49,5.54,5.70,5.59,5.75,
+5.89,6.02,6.10,6.18,6.33,6.37,6.59,6.36,6.56,6.65,
+6.72,6.74,6.85,7.01,7.08,7.18,7.24,7.27,7.36,7.57,
+7.43,7.63,7.80,7.81,8.12,7.86,8.11,8.20,8.29,8.33,
+8.43,8.39,8.71,8.81,8.70,8.75,8.92,8.94,9.24,9.21,
+9.11,9.36,9.32,9.41,9.62,9.60,9.73,9.91,9.80,9.82,
+10.09,10.17,10.20,10.27,10.33,10.39,10.57,10.46,10.72,10.91,
+10.80,11.10,11.25,11.11,11.45,11.21,11.25,11.45,11.65,11.56,
+11.91,12.01,11.90,11.97,12.09,12.25,12.12,12.21,12.54,12.53,
+12.61,12.37,12.88,12.88,13.03,12.94,13.12,13.23,13.37,13.26,
+13.40,13.47,13.70,13.60,13.72,13.79,14.00,13.99,14.04,13.95,
+14.27,14.16,14.57,14.47,14.65,14.68,14.93,14.98,14.89,15.01,
+15.08,15.24,15.21,15.25,15.21,15.59,15.64,15.81,15.64,15.86,
+15.98,16.17,16.13,16.11,16.15,16.15,16.25,16.42,16.61,16.56,
+16.78,16.62,17.07,16.83,17.13,17.18,17.13,17.51,17.57,17.73,
+17.49,17.83,17.75,17.79,18.08,17.96,18.09,18.25,18.27,18.09,
+18.35,18.56,18.59,18.75,18.67,18.93,18.97,19.12,19.01,19.23,
+19.32,19.48,19.41,19.47,19.72,19.68,19.83,19.94,19.88,20.18,
+20.19,20.11,20.14,20.50,20.35,20.65,20.74,20.77,20.91,20.83,
+20.78,20.91,21.19,21.12,21.21,21.39,21.52,21.27,21.62,21.96,
+21.96,21.59,22.06,21.96,22.24,22.45,22.18,22.63,22.50,22.83,
+22.57,22.77,22.71,22.70,23.02,23.00,23.06,23.24,23.33,23.42,
+23.57,23.61,23.95,23.48,23.88,23.82,24.00,24.08,23.96,24.24,
+24.36,24.41,24.75,24.72,24.59,24.57,24.82,24.71,25.22,24.88,
+0.59,0.65,0.70,0.76,0.82,0.87,0.95,0.98,1.17,1.11,
+1.18,1.22,1.27,1.32,1.48,1.53,1.59,1.60,1.65,1.67,
+1.78,1.80,1.92,1.97,2.07,2.07,2.09,2.18,2.31,2.29,
+2.42,2.49,2.46,2.51,2.56,2.67,2.75,2.79,2.84,2.85,
+2.94,3.01,3.04,3.18,3.22,3.34,3.27,3.39,3.40,3.53,
+3.49,3.61,3.60,3.71,3.77,3.71,3.85,3.98,4.05,4.04,
+4.13,4.24,4.33,4.35,4.37,4.41,4.49,4.55,4.59,4.59,
+4.74,4.89,4.79,4.81,4.82,5.00,5.10,5.11,5.07,5.23,
+5.31,5.39,5.55,5.40,5.47,5.63,5.63,5.73,5.73,5.91,
+5.89,5.94,6.02,5.94,6.13,6.26,6.31,6.29,6.58,6.45,
+6.46,6.41,6.56,6.77,6.79,6.70,6.82,6.84,7.14,7.03,
+6.94,7.00,7.27,7.23,7.35,7.29,7.37,7.28,7.48,7.52,
+7.53,7.74,7.92,7.76,7.85,8.00,7.86,8.04,8.02,8.08,
+8.35,8.32,8.41,8.39,8.34,8.56,8.61,8.67,8.66,8.81,
+8.70,8.87,8.81,8.75,9.33,9.09,9.10,9.00,9.35,9.28,
+9.27,9.44,9.54,9.60,9.60,9.65,9.72,9.77,9.91,9.90,
+10.11,9.90,10.13,10.13,10.21,10.39,10.34,10.22,10.46,10.64,
+10.40,10.84,10.89,10.70,10.98,10.79,10.75,10.96,11.09,11.12,
+11.26,11.40,11.34,11.28,11.32,11.45,11.55,11.80,11.61,11.67,
+11.74,11.69,11.95,11.92,11.92,11.88,11.98,12.26,12.25,12.13,
+12.19,12.16,12.24,12.51,12.52,12.48,12.63,12.90,12.85,12.79,
+12.77,13.16,13.05,13.13,13.12,13.13,13.41,13.37,13.46,13.35,
+13.44,13.65,13.61,13.58,13.74,13.67,13.98,13.97,13.95,13.92,
+14.07,13.87,14.15,14.41,14.36,14.44,14.38,14.54,14.69,14.78,
+14.72,14.90,14.77,14.85,14.84,14.96,15.08,15.04,15.21,15.08,
+15.23,15.29,15.42,15.36,15.29,15.58,15.71,15.78,15.55,15.98,
+16.01,15.88,15.89,16.07,16.11,16.44,16.32,16.29,16.37,16.50,
+16.58,16.38,16.55,16.54,16.54,16.55,16.80,16.77,16.81,16.95,
+16.89,17.43,17.14,17.19,17.04,17.35,17.34,17.40,17.27,17.73,
+0.41,0.47,0.52,0.54,0.56,0.61,0.66,0.72,0.77,0.79,
+0.81,0.90,0.88,0.92,1.01,1.12,1.03,1.09,1.16,1.20,
+1.25,1.25,1.40,1.31,1.37,1.43,1.43,1.51,1.48,1.62,
+1.68,1.73,1.66,1.74,1.82,1.84,1.86,1.94,2.04,2.02,
+2.06,2.14,2.18,2.18,2.17,2.25,2.30,2.25,2.36,2.37,
+2.42,2.50,2.59,2.54,2.63,2.64,2.70,2.88,2.74,2.76,
+2.88,2.91,3.07,2.96,3.09,3.12,3.17,3.14,3.24,3.35,
+3.22,3.27,3.43,3.39,3.38,3.52,3.45,3.56,3.66,3.75,
+3.71,3.69,3.77,3.92,3.90,3.87,3.86,3.99,4.06,4.11,
+4.05,4.18,4.16,4.29,4.31,4.42,4.40,4.47,4.61,4.52,
+4.42,4.54,4.59,4.65,4.71,4.74,4.71,4.88,4.81,4.88,
+4.95,5.00,5.11,5.14,5.18,5.11,5.15,5.32,5.30,5.27,
+5.39,5.45,5.54,5.53,5.52,5.50,5.55,5.67,5.64,5.70,
+5.64,5.84,5.83,5.73,5.93,5.95,6.03,6.21,6.12,6.04,
+6.16,6.14,6.30,6.26,6.24,6.48,6.51,6.33,6.42,6.46,
+6.60,6.59,6.61,6.72,6.83,6.78,6.83,6.91,6.89,6.94,
+6.90,6.99,7.01,7.15,7.19,7.18,7.26,7.11,7.25,7.33,
+7.40,7.34,7.64,7.62,7.51,7.66,7.84,7.69,7.79,7.73,
+7.92,7.83,7.90,7.95,8.08,8.01,8.15,8.24,8.10,8.25,
+8.13,8.15,8.40,8.47,8.45,8.43,8.31,8.52,8.58,8.68,
+8.69,8.53,8.69,8.71,8.69,8.97,8.92,8.80,8.86,8.99,
+9.04,9.08,9.15,9.19,9.32,9.12,9.15,9.47,9.31,9.42,
+9.39,9.54,9.56,9.60,9.70,9.81,9.78,9.68,9.68,9.91,
+9.90,9.69,9.89,9.91,10.12,10.16,10.22,10.25,10.26,10.21,
+10.32,10.34,10.35,10.33,10.37,10.44,10.52,10.53,10.60,10.76,
+10.61,10.79,10.80,10.87,10.84,10.80,10.94,10.90,10.85,11.04,
+11.09,11.20,11.03,11.08,11.16,11.42,11.14,11.30,11.54,11.36,
+11.52,11.43,11.53,11.68,11.62,11.67,11.80,11.83,11.94,12.01,
+11.90,11.94,11.77,12.01,12.08,12.09,12.13,12.33,12.26,12.06,
+0.28,0.33,0.37,0.39,0.41,0.48,0.50,0.49,0.52,0.51,
+0.58,0.63,0.65,0.66,0.68,0.71,0.68,0.79,0.83,0.84,
+0.89,0.90,0.91,0.95,1.02,1.04,1.08,1.04,1.08,1.19,
+1.08,1.22,1.20,1.21,1.30,1.27,1.36,1.35,1.37,1.45,
+1.41,1.44,1.54,1.49,1.54,1.55,1.56,1.65,1.68,1.71,
+1.71,1.78,1.80,1.81,1.85,1.86,1.87,1.87,1.97,1.96,
+2.12,2.07,2.09,2.17,2.14,2.19,2.21,2.27,2.27,2.25,
+2.24,2.36,2.29,2.33,2.44,2.35,2.48,2.45,2.63,2.58,
+2.60,2.64,2.67,2.67,2.69,2.74,2.77,2.84,2.78,2.87,
+3.02,2.88,3.05,2.94,3.05,3.04,3.16,3.15,3.12,3.12,
+3.22,3.28,3.17,3.27,3.22,3.40,3.32,3.34,3.47,3.45,
+3.44,3.49,3.60,3.69,3.63,3.52,3.53,3.69,3.70,3.68,
+3.74,3.78,3.83,3.87,3.96,3.72,3.86,3.95,4.00,3.92,
+4.07,4.03,4.04,4.03,4.12,4.14,4.22,4.17,4.20,4.22,
+4.36,4.31,4.41,4.43,4.46,4.45,4.48,4.53,4.54,4.53,
+4.59,4.71,4.64,4.72,4.78,4.75,4.70,4.85,4.83,4.90,
+4.86,4.98,4.90,5.05,5.04,4.90,5.08,5.16,5.04,5.21,
+5.23,5.09,5.26,5.24,5.29,5.29,5.34,5.46,5.45,5.39,
+5.39,5.53,5.49,5.54,5.42,5.57,5.51,5.64,5.75,5.64,
+5.76,5.76,5.84,5.95,5.89,6.02,5.84,5.99,5.90,6.16,
+6.14,5.97,5.99,6.27,6.06,6.10,6.27,6.31,6.18,6.18,
+6.24,6.32,6.35,6.39,6.54,6.52,6.49,6.51,6.57,6.68,
+6.70,6.57,6.63,6.74,6.72,6.69,6.72,6.96,6.85,6.81,
+6.92,6.79,6.95,7.11,6.98,7.02,6.97,7.06,7.02,7.15,
+7.17,7.20,7.20,7.34,7.35,7.18,7.24,7.46,7.38,7.35,
+7.50,7.52,7.60,7.71,7.47,7.43,7.68,7.65,7.71,7.80,
+7.76,7.78,7.81,7.68,7.98,7.98,8.05,7.86,8.13,8.02,
+8.16,8.19,8.09,8.19,8.09,8.07,8.07,8.19,8.20,8.38,
+8.36,8.51,8.50,8.38,8.37,8.51,8.57,8.34,8.52,8.65,
+0.19,0.22,0.23,0.26,0.28,0.32,0.36,0.34,0.37,0.41,
+0.42,0.42,0.45,0.46,0.51,0.50,0.55,0.53,0.62,0.57,
+0.60,0.59,0.67,0.69,0.75,0.69,0.78,0.77,0.80,0.79,
+0.76,0.89,0.89,0.86,0.94,0.92,0.97,0.93,1.00,1.00,
+1.04,1.07,1.04,1.01,1.11,1.12,1.10,1.18,1.15,1.22,
+1.25,1.26,1.22,1.24,1.33,1.36,1.30,1.39,1.47,1.44,
+1.38,1.42,1.38,1.47,1.49,1.55,1.53,1.58,1.54,1.55,
+1.62,1.64,1.67,1.68,1.70,1.73,1.77,1.84,1.74,1.81,
+1.77,1.81,1.92,1.87,1.95,1.88,1.91,2.00,1.96,1.98,
+2.02,2.10,2.05,2.05,2.08,2.14,2.17,2.14,2.21,2.13,
+2.17,2.19,2.17,2.21,2.23,2.19,2.34,2.29,2.39,2.41,
+2.44,2.42,2.53,2.53,2.45,2.53,2.60,2.59,2.67,2.60,
+2.54,2.62,2.55,2.73,2.74,2.75,2.68,2.74,2.75,2.77,
+2.82,2.81,2.88,2.83,2.97,3.01,2.90,2.98,2.94,3.01,
+3.04,3.06,3.00,3.13,3.06,3.22,3.25,3.23,3.24,3.22,
+3.28,3.31,3.33,3.29,3.28,3.30,3.29,3.41,3.32,3.30,
+3.45,3.38,3.38,3.48,3.45,3.50,3.50,3.61,3.50,3.75,
+3.68,3.57,3.58,3.64,3.66,3.79,3.71,3.71,3.69,3.79,
+3.77,3.85,3.81,3.80,3.85,3.96,4.03,3.91,4.07,4.08,
+3.96,3.93,4.02,4.13,4.09,4.12,4.17,4.13,4.21,4.16,
+4.30,4.17,4.38,4.23,4.29,4.22,4.40,4.39,4.46,4.35,
+4.40,4.43,4.43,4.56,4.49,4.58,4.60,4.49,4.61,4.57,
+4.71,4.59,4.71,4.84,4.72,4.67,4.76,4.79,4.69,4.85,
+4.85,4.82,4.80,4.93,4.94,4.89,4.95,5.06,5.02,5.00,
+5.10,5.06,5.08,5.09,5.14,5.17,5.19,5.23,5.22,5.21,
+5.21,5.23,5.13,5.41,5.37,5.32,5.27,5.33,5.45,5.40,
+5.37,5.53,5.46,5.51,5.56,5.64,5.60,5.49,5.55,5.57,
+5.60,5.72,5.47,5.70,5.68,5.71,5.75,5.76,5.79,5.93,
+5.80,5.80,5.94,5.98,5.89,5.98,5.89,6.07,5.93,6.03,
+0.14,0.14,0.16,0.18,0.18,0.22,0.23,0.25,0.23,0.30,
+0.30,0.31,0.28,0.34,0.36,0.38,0.35,0.41,0.39,0.42,
+0.45,0.45,0.44,0.47,0.48,0.49,0.50,0.50,0.54,0.55,
+0.53,0.57,0.57,0.64,0.64,0.66,0.64,0.69,0.68,0.69,
+0.68,0.70,0.76,0.71,0.76,0.81,0.78,0.78,0.82,0.77,
+0.83,0.87,0.87,0.92,0.90,0.90,0.95,0.96,1.02,0.97,
+0.95,1.02,1.02,1.10,1.03,1.03,1.16,1.12,1.07,1.13,
+1.14,1.14,1.13,1.16,1.20,1.21,1.16,1.21,1.26,1.23,
+1.31,1.24,1.32,1.29,1.31,1.31,1.32,1.44,1.39,1.41,
+1.41,1.40,1.49,1.41,1.46,1.46,1.56,1.52,1.49,1.62,
+1.52,1.54,1.59,1.57,1.61,1.62,1.62,1.74,1.68,1.72,
+1.73,1.74,1.72,1.68,1.74,1.75,1.75,1.85,1.81,1.81,
+1.80,1.85,1.92,1.91,1.95,1.91,1.85,1.98,1.97,2.00,
+2.00,2.00,2.03,2.04,2.11,2.07,2.08,2.07,2.15,2.10,
+2.10,2.08,2.11,2.20,2.17,2.19,2.23,2.14,2.26,2.26,
+2.25,2.22,2.27,2.33,2.30,2.35,2.33,2.36,2.35,2.36,
+2.37,2.42,2.38,2.51,2.45,2.44,2.53,2.55,2.54,2.51,
+2.54,2.51,2.53,2.55,2.65,2.62,2.65,2.61,2.73,2.70,
+2.60,2.68,2.73,2.72,2.67,2.74,2.74,2.82,2.79,2.83,
+2.85,2.82,2.90,2.83,2.89,2.93,2.92,2.94,2.90,2.92,
+3.03,2.93,2.95,2.98,3.03,3.02,3.17,3.09,3.12,3.09,
+3.12,3.14,3.18,3.20,3.18,3.07,3.21,3.21,3.19,3.23,
+3.28,3.30,3.27,3.21,3.35,3.35,3.44,3.34,3.29,3.35,
+3.42,3.37,3.48,3.43,3.36,3.45,3.43,3.52,3.49,3.51,
+3.54,3.62,3.47,3.66,3.56,3.55,3.55,3.70,3.56,3.61,
+3.65,3.66,3.64,3.69,3.65,3.77,3.75,3.68,3.79,3.73,
+3.68,3.77,3.81,3.84,3.81,3.85,3.85,3.90,3.91,3.92,
+3.82,3.95,3.93,4.00,4.05,3.99,4.08,4.04,4.02,4.03,
+4.07,4.19,4.12,4.15,4.12,4.18,4.20,4.22,4.23,4.19,
+0.08,0.11,0.12,0.14,0.14,0.15,0.16,0.17,0.18,0.19,
+0.18,0.20,0.23,0.22,0.24,0.24,0.23,0.29,0.26,0.30,
+0.31,0.29,0.33,0.31,0.33,0.34,0.33,0.38,0.35,0.38,
+0.36,0.40,0.46,0.42,0.41,0.43,0.47,0.47,0.48,0.46,
+0.48,0.49,0.50,0.56,0.52,0.54,0.59,0.59,0.59,0.59,
+0.61,0.56,0.59,0.63,0.64,0.68,0.66,0.68,0.66,0.70,
+0.72,0.69,0.71,0.70,0.72,0.72,0.73,0.78,0.71,0.74,
+0.78,0.80,0.82,0.79,0.84,0.80,0.86,0.89,0.83,0.83,
+0.88,0.91,0.95,0.87,0.91,0.95,0.96,0.94,1.04,0.92,
+0.99,1.07,1.00,0.99,1.04,1.07,1.01,1.06,1.04,1.07,
+1.11,1.13,1.08,1.12,1.14,1.16,1.13,1.14,1.23,1.14,
+1.21,1.21,1.21,1.18,1.30,1.20,1.27,1.32,1.26,1.26,
+1.25,1.30,1.27,1.29,1.28,1.32,1.36,1.32,1.35,1.34,
+1.38,1.40,1.35,1.44,1.45,1.45,1.47,1.45,1.48,1.50,
+1.51,1.45,1.52,1.51,1.51,1.49,1.58,1.53,1.55,1.59,
+1.57,1.61,1.58,1.61,1.70,1.66,1.65,1.67,1.71,1.59,
+1.66,1.70,1.69,1.74,1.74,1.73,1.80,1.74,1.71,1.78,
+1.81,1.71,1.86,1.85,1.83,1.83,1.81,1.87,1.92,1.89,
+1.84,1.92,1.85,1.90,1.90,1.88,1.94,2.05,1.92,1.87,
+2.02,1.98,2.04,2.01,2.04,2.01,2.00,2.05,2.02,2.16,
+2.03,2.03,2.13,2.02,2.13,2.15,2.19,2.20,2.15,2.26,
+2.20,2.18,2.15,2.24,2.21,2.27,2.23,2.29,2.29,2.35,
+2.17,2.27,2.26,2.35,2.30,2.32,2.38,2.31,2.41,2.33,
+2.34,2.43,2.33,2.39,2.39,2.34,2.44,2.49,2.50,2.42,
+2.47,2.47,2.54,2.52,2.49,2.58,2.46,2.54,2.47,2.45,
+2.49,2.60,2.57,2.53,2.75,2.65,2.59,2.63,2.65,2.60,
+2.61,2.74,2.59,2.66,2.69,2.65,2.73,2.72,2.71,2.76,
+2.82,2.80,2.84,2.79,2.84,2.74,2.81,2.90,2.85,2.85,
+2.99,2.88,2.88,2.82,2.88,2.93,2.84,2.84,2.99,2.93,
+0.06,0.08,0.07,0.10,0.10,0.12,0.14,0.10,0.12,0.15,
+0.17,0.17,0.13,0.17,0.17,0.16,0.19,0.17,0.20,0.22,
+0.22,0.21,0.23,0.24,0.22,0.23,0.24,0.25,0.28,0.25,
+0.32,0.24,0.28,0.29,0.26,0.34,0.32,0.33,0.34,0.34,
+0.34,0.39,0.38,0.37,0.35,0.40,0.41,0.38,0.40,0.41,
+0.41,0.42,0.44,0.45,0.47,0.46,0.46,0.47,0.49,0.44,
+0.48,0.52,0.52,0.48,0.52,0.50,0.53,0.59,0.56,0.51,
+0.56,0.54,0.53,0.57,0.58,0.58,0.59,0.59,0.59,0.61,
+0.61,0.65,0.63,0.60,0.66,0.61,0.69,0.68,0.66,0.71,
+0.69,0.69,0.70,0.72,0.71,0.69,0.72,0.76,0.72,0.71,
+0.75,0.80,0.80,0.77,0.76,0.77,0.77,0.82,0.87,0.82,
+0.83,0.83,0.83,0.93,0.84,0.89,0.92,0.90,0.87,0.88,
+0.95,0.92,0.93,0.93,0.96,0.92,0.95,0.97,0.96,0.98,
+1.01,0.96,0.98,0.96,0.98,1.02,1.01,1.09,1.06,1.05,
+1.04,1.02,0.99,1.01,1.04,1.15,1.03,1.08,1.08,1.09,
+1.09,1.09,1.11,1.13,1.07,1.06,1.16,1.13,1.15,1.13,
+1.20,1.15,1.19,1.13,1.20,1.20,1.23,1.25,1.18,1.27,
+1.20,1.25,1.25,1.30,1.27,1.26,1.29,1.28,1.28,1.32,
+1.31,1.40,1.30,1.34,1.32,1.39,1.38,1.37,1.38,1.42,
+1.40,1.36,1.32,1.41,1.45,1.48,1.38,1.43,1.44,1.46,
+1.52,1.49,1.52,1.44,1.44,1.47,1.51,1.56,1.54,1.54,
+1.55,1.54,1.55,1.55,1.58,1.58,1.49,1.57,1.65,1.54,
+1.64,1.61,1.71,1.63,1.59,1.65,1.60,1.62,1.65,1.65,
+1.64,1.64,1.72,1.73,1.63,1.67,1.76,1.69,1.67,1.79,
+1.69,1.77,1.80,1.76,1.73,1.76,1.82,1.72,1.72,1.86,
+1.72,1.79,1.73,1.79,1.83,1.85,1.88,1.90,1.84,1.81,
+1.83,1.88,1.91,1.90,1.94,1.97,1.89,1.90,1.82,1.88,
+1.96,1.96,1.94,1.91,1.96,2.02,2.03,2.03,1.97,2.03,
+2.04,1.98,2.06,2.05,2.01,2.07,2.04,2.11,2.09,2.14,
+0.04,0.05,0.07,0.06,0.08,0.09,0.09,0.07,0.09,0.11,
+0.09,0.09,0.10,0.11,0.12,0.12,0.13,0.13,0.12,0.15,
+0.15,0.13,0.15,0.17,0.19,0.17,0.17,0.16,0.16,0.17,
+0.21,0.20,0.22,0.20,0.22,0.21,0.22,0.23,0.25,0.22,
+0.23,0.27,0.27,0.27,0.26,0.26,0.27,0.29,0.27,0.30,
+0.28,0.28,0.33,0.31,0.30,0.28,0.32,0.31,0.31,0.33,
+0.34,0.34,0.34,0.36,0.31,0.35,0.37,0.38,0.38,0.39,
+0.39,0.40,0.41,0.40,0.38,0.44,0.44,0.42,0.43,0.42,
+0.46,0.45,0.44,0.44,0.44,0.49,0.48,0.47,0.51,0.48,
+0.47,0.52,0.49,0.52,0.52,0.52,0.50,0.48,0.52,0.54,
+0.52,0.55,0.52,0.54,0.51,0.59,0.62,0.61,0.57,0.58,
+0.54,0.57,0.61,0.60,0.61,0.56,0.62,0.62,0.59,0.61,
+0.67,0.66,0.62,0.66,0.63,0.67,0.64,0.65,0.67,0.65,
+0.70,0.70,0.68,0.68,0.73,0.71,0.66,0.73,0.75,0.70,
+0.77,0.74,0.73,0.73,0.75,0.77,0.78,0.70,0.76,0.77,
+0.78,0.77,0.82,0.79,0.74,0.78,0.81,0.84,0.83,0.83,
+0.82,0.86,0.81,0.85,0.90,0.82,0.79,0.87,0.89,0.91,
+0.83,0.90,0.92,0.90,0.80,0.93,0.92,0.87,0.90,0.88,
+0.89,0.92,0.91,0.97,0.93,0.96,0.92,0.92,0.90,0.87,
+0.94,0.98,0.95,0.98,0.93,0.97,1.02,1.06,0.97,1.09,
+1.06,1.04,1.06,1.08,1.00,0.96,1.03,1.06,1.04,1.07,
+1.05,1.08,1.01,1.03,1.03,1.12,1.05,1.07,1.12,1.02,
+1.09,1.16,1.07,1.15,1.12,1.09,1.13,1.14,1.22,1.21,
+1.16,1.16,1.16,1.20,1.22,1.23,1.18,1.20,1.18,1.20,
+1.20,1.23,1.21,1.21,1.26,1.21,1.24,1.29,1.23,1.23,
+1.26,1.26,1.24,1.27,1.34,1.21,1.25,1.33,1.29,1.29,
+1.37,1.34,1.36,1.31,1.35,1.37,1.35,1.32,1.33,1.36,
+1.35,1.25,1.33,1.39,1.36,1.39,1.45,1.30,1.41,1.45,
+1.37,1.43,1.42,1.43,1.47,1.49,1.43,1.40,1.47,1.46,
+0.04,0.04,0.04,0.04,0.05,0.06,0.06,0.05,0.05,0.06,
+0.07,0.07,0.07,0.06,0.08,0.07,0.09,0.08,0.09,0.12,
+0.11,0.10,0.11,0.13,0.14,0.12,0.14,0.13,0.15,0.14,
+0.14,0.14,0.15,0.17,0.16,0.16,0.16,0.15,0.17,0.16,
+0.16,0.18,0.17,0.20,0.20,0.17,0.20,0.20,0.18,0.18,
+0.19,0.22,0.23,0.21,0.22,0.24,0.22,0.23,0.25,0.22,
+0.21,0.25,0.27,0.27,0.24,0.28,0.25,0.26,0.31,0.25,
+0.27,0.29,0.27,0.29,0.26,0.28,0.32,0.29,0.29,0.28,
+0.33,0.32,0.33,0.34,0.34,0.32,0.33,0.34,0.30,0.36,
+0.34,0.35,0.33,0.37,0.36,0.37,0.34,0.39,0.35,0.36,
+0.38,0.37,0.36,0.36,0.40,0.42,0.36,0.36,0.41,0.40,
+0.39,0.42,0.39,0.41,0.41,0.43,0.45,0.43,0.45,0.43,
+0.43,0.48,0.40,0.48,0.45,0.49,0.46,0.47,0.43,0.47,
+0.42,0.48,0.45,0.46,0.51,0.46,0.50,0.49,0.48,0.50,
+0.51,0.52,0.52,0.48,0.55,0.54,0.51,0.54,0.54,0.49,
+0.57,0.55,0.55,0.51,0.54,0.51,0.57,0.55,0.57,0.55,
+0.55,0.60,0.58,0.64,0.60,0.57,0.56,0.60,0.60,0.62,
+0.64,0.57,0.60,0.62,0.57,0.61,0.64,0.66,0.62,0.66,
+0.62,0.62,0.69,0.68,0.69,0.62,0.67,0.64,0.71,0.66,
+0.67,0.64,0.67,0.67,0.68,0.68,0.67,0.70,0.70,0.75,
+0.70,0.72,0.70,0.71,0.73,0.71,0.73,0.76,0.72,0.74,
+0.78,0.79,0.72,0.76,0.76,0.76,0.76,0.78,0.80,0.75,
+0.77,0.78,0.72,0.78,0.79,0.78,0.81,0.82,0.79,0.85,
+0.75,0.79,0.81,0.83,0.85,0.84,0.86,0.85,0.85,0.83,
+0.89,0.85,0.83,0.88,0.85,0.88,0.84,0.85,0.90,0.89,
+0.90,0.88,0.84,0.87,0.85,0.90,0.91,0.93,0.88,0.90,
+0.88,0.84,0.94,0.90,0.91,0.91,0.93,0.92,0.92,0.97,
+0.94,0.93,0.95,0.94,0.99,0.94,0.93,1.00,1.02,0.95,
+0.96,0.97,0.99,1.05,1.04,1.01,0.96,1.03,1.03,0.99,
+0.02,0.03,0.03,0.03,0.03,0.03,0.04,0.04,0.05,0.05,
+0.05,0.04,0.06,0.05,0.06,0.06,0.06,0.07,0.07,0.06,
+0.07,0.07,0.07,0.08,0.06,0.09,0.07,0.09,0.08,0.09,
+0.10,0.11,0.10,0.09,0.10,0.10,0.10,0.11,0.11,0.12,
+0.12,0.11,0.14,0.15,0.14,0.12,0.12,0.15,0.15,0.15,
+0.13,0.16,0.15,0.15,0.17,0.14,0.15,0.14,0.16,0.14,
+0.16,0.17,0.18,0.19,0.18,0.19,0.18,0.16,0.18,0.19,
+0.19,0.19,0.18,0.19,0.18,0.21,0.22,0.21,0.22,0.20,
+0.22,0.23,0.22,0.22,0.22,0.23,0.21,0.24,0.26,0.22,
+0.25,0.23,0.23,0.22,0.23,0.24,0.26,0.24,0.23,0.25,
+0.23,0.28,0.26,0.27,0.28,0.28,0.29,0.29,0.26,0.27,
+0.30,0.29,0.29,0.27,0.30,0.31,0.28,0.32,0.31,0.29,
+0.32,0.32,0.33,0.30,0.30,0.32,0.33,0.32,0.34,0.33,
+0.32,0.32,0.35,0.34,0.34,0.33,0.35,0.35,0.37,0.33,
+0.31,0.34,0.35,0.40,0.37,0.34,0.41,0.41,0.38,0.37,
+0.39,0.37,0.36,0.38,0.37,0.40,0.41,0.39,0.39,0.42,
+0.39,0.38,0.41,0.39,0.45,0.41,0.43,0.40,0.40,0.48,
+0.45,0.43,0.41,0.44,0.43,0.42,0.46,0.45,0.47,0.47,
+0.43,0.45,0.43,0.48,0.46,0.45,0.46,0.48,0.46,0.47,
+0.51,0.47,0.46,0.52,0.47,0.49,0.50,0.51,0.51,0.48,
+0.54,0.49,0.50,0.52,0.52,0.53,0.53,0.51,0.56,0.54,
+0.53,0.55,0.47,0.54,0.55,0.54,0.52,0.56,0.56,0.52,
+0.53,0.56,0.56,0.55,0.55,0.51,0.54,0.56,0.53,0.56,
+0.57,0.57,0.58,0.63,0.59,0.54,0.55,0.59,0.57,0.57,
+0.57,0.57,0.59,0.59,0.57,0.61,0.58,0.59,0.61,0.63,
+0.64,0.61,0.60,0.65,0.62,0.68,0.67,0.64,0.66,0.67,
+0.66,0.68,0.63,0.65,0.66,0.67,0.67,0.63,0.67,0.56,
+0.64,0.64,0.71,0.64,0.63,0.67,0.68,0.64,0.66,0.68,
+0.66,0.69,0.71,0.71,0.71,0.65,0.73,0.70,0.69,0.71,
+0.01,0.03,0.02,0.02,0.03,0.03,0.03,0.03,0.03,0.03,
+0.04,0.04,0.03,0.04,0.05,0.04,0.03,0.05,0.05,0.04,
+0.06,0.05,0.05,0.04,0.06,0.06,0.08,0.06,0.05,0.06,
+0.06,0.07,0.07,0.08,0.07,0.08,0.09,0.08,0.08,0.08,
+0.08,0.09,0.08,0.09,0.09,0.10,0.08,0.11,0.09,0.10,
+0.10,0.11,0.11,0.10,0.09,0.11,0.10,0.11,0.11,0.12,
+0.11,0.13,0.12,0.13,0.13,0.13,0.12,0.13,0.12,0.12,
+0.13,0.13,0.15,0.14,0.14,0.14,0.15,0.15,0.15,0.15,
+0.16,0.15,0.17,0.15,0.16,0.17,0.16,0.15,0.17,0.15,
+0.17,0.17,0.17,0.16,0.17,0.16,0.18,0.17,0.17,0.17,
+0.19,0.18,0.17,0.19,0.19,0.19,0.21,0.20,0.20,0.19,
+0.20,0.21,0.19,0.19,0.21,0.21,0.21,0.19,0.22,0.22,
+0.21,0.20,0.22,0.21,0.23,0.21,0.22,0.22,0.25,0.24,
+0.23,0.24,0.20,0.25,0.21,0.22,0.25,0.23,0.24,0.25,
+0.24,0.23,0.24,0.25,0.26,0.25,0.23,0.28,0.26,0.26,
+0.28,0.29,0.26,0.29,0.28,0.29,0.24,0.26,0.26,0.29,
+0.28,0.29,0.32,0.28,0.28,0.30,0.32,0.29,0.32,0.30,
+0.31,0.28,0.33,0.29,0.29,0.30,0.31,0.32,0.27,0.32,
+0.32,0.30,0.33,0.30,0.31,0.32,0.32,0.32,0.32,0.33,
+0.31,0.33,0.33,0.34,0.38,0.33,0.32,0.32,0.37,0.34,
+0.33,0.33,0.33,0.35,0.34,0.37,0.35,0.35,0.37,0.35,
+0.33,0.39,0.40,0.37,0.36,0.37,0.35,0.39,0.38,0.36,
+0.40,0.42,0.40,0.40,0.39,0.37,0.40,0.38,0.40,0.39,
+0.40,0.40,0.40,0.36,0.37,0.40,0.41,0.43,0.44,0.45,
+0.46,0.41,0.38,0.41,0.44,0.40,0.43,0.41,0.45,0.40,
+0.43,0.42,0.43,0.45,0.52,0.47,0.44,0.47,0.43,0.42,
+0.44,0.48,0.48,0.46,0.46,0.46,0.43,0.50,0.46,0.45,
+0.45,0.43,0.44,0.44,0.49,0.47,0.46,0.43,0.48,0.48,
+0.51,0.49,0.49,0.46,0.51,0.47,0.50,0.50,0.48,0.49,
+0.02,0.01,0.01,0.01,0.01,0.02,0.01,0.02,0.02,0.02,
+0.02,0.02,0.03,0.03,0.02,0.04,0.02,0.03,0.04,0.02,
+0.04,0.05,0.04,0.04,0.04,0.05,0.04,0.07,0.05,0.05,
+0.04,0.06,0.05,0.05,0.04,0.06,0.05,0.06,0.07,0.06,
+0.07,0.06,0.07,0.08,0.07,0.05,0.07,0.07,0.06,0.07,
+0.06,0.09,0.07,0.07,0.07,0.08,0.08,0.09,0.08,0.09,
+0.07,0.09,0.10,0.08,0.08,0.08,0.08,0.08,0.09,0.09,
+0.10,0.10,0.08,0.09,0.08,0.11,0.12,0.09,0.07,0.10,
+0.09,0.10,0.12,0.09,0.12,0.12,0.12,0.11,0.10,0.12,
+0.12,0.11,0.12,0.11,0.14,0.12,0.12,0.11,0.12,0.13,
+0.13,0.12,0.13,0.13,0.13,0.12,0.14,0.13,0.12,0.14,
+0.14,0.13,0.15,0.16,0.14,0.14,0.13,0.13,0.15,0.14,
+0.18,0.15,0.15,0.15,0.17,0.15,0.16,0.16,0.16,0.14,
+0.17,0.17,0.14,0.18,0.18,0.16,0.17,0.15,0.15,0.17,
+0.18,0.17,0.19,0.17,0.18,0.20,0.20,0.17,0.19,0.20,
+0.18,0.20,0.17,0.18,0.20,0.17,0.20,0.19,0.20,0.20,
+0.22,0.20,0.20,0.20,0.24,0.22,0.24,0.21,0.21,0.20,
+0.21,0.21,0.23,0.22,0.23,0.22,0.21,0.21,0.24,0.22,
+0.22,0.22,0.20,0.23,0.23,0.22,0.20,0.26,0.24,0.23,
+0.23,0.23,0.24,0.25,0.27,0.27,0.24,0.25,0.23,0.24,
+0.24,0.25,0.23,0.24,0.25,0.25,0.24,0.24,0.26,0.26,
+0.26,0.29,0.28,0.27,0.27,0.26,0.30,0.25,0.26,0.29,
+0.26,0.24,0.28,0.27,0.28,0.30,0.28,0.29,0.27,0.30,
+0.28,0.26,0.30,0.31,0.28,0.30,0.31,0.30,0.32,0.28,
+0.35,0.30,0.27,0.30,0.28,0.30,0.29,0.29,0.29,0.33,
+0.29,0.33,0.27,0.30,0.30,0.30,0.30,0.30,0.31,0.29,
+0.31,0.29,0.33,0.29,0.34,0.33,0.34,0.35,0.34,0.31,
+0.32,0.33,0.33,0.34,0.34,0.36,0.32,0.34,0.35,0.36,
+0.34,0.35,0.33,0.36,0.33,0.34,0.38,0.36,0.34,0.35,
+0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,
+0.02,0.01,0.01,0.01,0.02,0.02,0.03,0.03,0.02,0.02,
+0.02,0.04,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.04,
+0.04,0.03,0.04,0.04,0.03,0.03,0.05,0.04,0.05,0.02,
+0.04,0.04,0.04,0.05,0.04,0.04,0.04,0.05,0.05,0.06,
+0.04,0.06,0.08,0.06,0.06,0.05,0.04,0.05,0.06,0.06,
+0.06,0.05,0.07,0.06,0.06,0.05,0.06,0.06,0.07,0.07,
+0.07,0.05,0.07,0.07,0.07,0.08,0.07,0.08,0.07,0.06,
+0.08,0.09,0.07,0.07,0.07,0.07,0.08,0.08,0.07,0.08,
+0.09,0.08,0.10,0.07,0.08,0.10,0.09,0.09,0.09,0.08,
+0.08,0.10,0.09,0.10,0.10,0.12,0.09,0.10,0.09,0.09,
+0.10,0.10,0.09,0.10,0.12,0.09,0.11,0.10,0.10,0.11,
+0.11,0.10,0.10,0.11,0.13,0.10,0.10,0.11,0.11,0.13,
+0.12,0.12,0.10,0.11,0.11,0.14,0.14,0.11,0.11,0.13,
+0.13,0.12,0.13,0.13,0.11,0.13,0.12,0.12,0.11,0.13,
+0.12,0.13,0.14,0.12,0.13,0.13,0.16,0.14,0.14,0.13,
+0.14,0.12,0.14,0.13,0.14,0.16,0.13,0.15,0.15,0.16,
+0.15,0.14,0.13,0.15,0.15,0.14,0.15,0.15,0.17,0.17,
+0.17,0.17,0.14,0.16,0.15,0.17,0.17,0.17,0.18,0.17,
+0.18,0.15,0.17,0.17,0.18,0.16,0.14,0.17,0.15,0.17,
+0.17,0.18,0.17,0.17,0.19,0.20,0.17,0.17,0.18,0.18,
+0.19,0.15,0.21,0.18,0.17,0.17,0.19,0.18,0.20,0.19,
+0.16,0.20,0.20,0.19,0.20,0.21,0.20,0.19,0.19,0.19,
+0.20,0.20,0.18,0.21,0.18,0.22,0.18,0.20,0.22,0.19,
+0.18,0.21,0.19,0.23,0.22,0.21,0.20,0.22,0.22,0.20,
+0.23,0.22,0.21,0.20,0.21,0.23,0.22,0.21,0.20,0.21,
+0.20,0.21,0.20,0.24,0.23,0.23,0.23,0.19,0.26,0.23,
+0.23,0.24,0.21,0.22,0.19,0.28,0.21,0.24,0.22,0.20,
+0.23,0.24,0.23,0.23,0.26,0.23,0.23,0.28,0.24,0.24,
+0.00,0.01,0.01,0.00,0.01,0.01,0.01,0.01,0.01,0.01,
+0.01,0.01,0.01,0.01,0.01,0.01,0.02,0.02,0.02,0.01,
+0.02,0.02,0.02,0.01,0.01,0.03,0.01,0.02,0.02,0.02,
+0.01,0.03,0.02,0.02,0.03,0.04,0.03,0.03,0.04,0.03,
+0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.04,0.04,0.04,
+0.03,0.03,0.04,0.03,0.03,0.04,0.04,0.04,0.03,0.04,
+0.04,0.04,0.04,0.05,0.05,0.04,0.04,0.04,0.05,0.05,
+0.04,0.05,0.05,0.05,0.05,0.04,0.05,0.05,0.06,0.06,
+0.05,0.03,0.05,0.05,0.05,0.06,0.05,0.06,0.05,0.05,
+0.05,0.06,0.05,0.06,0.05,0.05,0.07,0.06,0.06,0.07,
+0.07,0.06,0.07,0.06,0.07,0.06,0.07,0.07,0.07,0.06,
+0.06,0.06,0.09,0.07,0.06,0.07,0.07,0.06,0.07,0.08,
+0.08,0.07,0.07,0.09,0.08,0.08,0.07,0.10,0.08,0.09,
+0.07,0.09,0.08,0.08,0.09,0.08,0.10,0.08,0.09,0.08,
+0.08,0.09,0.08,0.09,0.09,0.08,0.10,0.08,0.07,0.09,
+0.09,0.09,0.09,0.10,0.10,0.10,0.11,0.11,0.09,0.10,
+0.10,0.11,0.10,0.09,0.11,0.09,0.09,0.09,0.12,0.11,
+0.11,0.09,0.10,0.11,0.10,0.11,0.11,0.12,0.10,0.10,
+0.10,0.12,0.11,0.13,0.12,0.09,0.12,0.12,0.11,0.12,
+0.14,0.09,0.11,0.10,0.10,0.10,0.10,0.10,0.12,0.12,
+0.12,0.11,0.13,0.12,0.13,0.12,0.12,0.14,0.12,0.12,
+0.11,0.13,0.11,0.12,0.13,0.12,0.12,0.12,0.11,0.12,
+0.13,0.14,0.13,0.12,0.13,0.13,0.11,0.13,0.14,0.15,
+0.14,0.12,0.12,0.15,0.12,0.14,0.15,0.14,0.13,0.13,
+0.14,0.14,0.12,0.11,0.14,0.16,0.13,0.14,0.14,0.14,
+0.15,0.16,0.14,0.15,0.15,0.15,0.14,0.17,0.14,0.14,
+0.15,0.17,0.17,0.15,0.15,0.15,0.16,0.16,0.18,0.16,
+0.14,0.17,0.17,0.18,0.16,0.15,0.15,0.15,0.17,0.14,
+0.14,0.20,0.17,0.17,0.17,0.20,0.17,0.17,0.17,0.18,
+1.00,1.00,1.20,1.30,1.36,1.48,1.59,1.64,1.81,1.86,
+1.94,1.98,2.13,2.22,2.30,2.41,2.54,2.55,2.70,2.75,
+2.88,3.01,3.04,3.10,3.29,3.31,3.46,3.58,3.61,3.72,
+3.90,3.87,4.07,4.23,4.14,4.26,4.41,4.52,4.58,4.57,
+4.82,4.80,4.87,5.01,5.15,5.16,5.31,5.32,5.53,5.63,
+5.69,5.89,5.88,5.92,6.08,6.10,6.28,6.27,6.40,6.54,
+6.63,6.75,6.96,7.02,6.96,7.12,7.13,7.40,7.39,7.65,
+7.65,7.77,7.87,7.85,8.06,7.98,8.17,8.21,8.51,8.57,
+8.51,8.66,8.80,8.84,8.93,9.03,8.98,9.25,9.28,9.34,
+9.57,9.63,9.56,9.75,9.99,9.90,10.07,10.19,10.11,10.43,
+10.49,10.59,10.53,10.79,10.84,10.90,11.12,11.16,11.30,11.03,
+11.44,11.41,11.54,11.61,11.81,11.91,11.93,12.09,12.13,12.21,
+12.28,12.38,12.51,12.65,12.60,12.77,12.95,12.99,13.02,13.26,
+13.17,13.37,13.57,13.78,13.71,13.76,13.85,14.13,13.95,14.01,
+14.18,14.25,14.49,14.60,14.67,14.82,14.69,14.85,14.98,15.21,
+15.34,15.18,15.33,15.46,15.69,15.60,15.76,16.04,16.03,15.95,
+16.03,16.31,16.35,16.56,16.57,16.43,16.75,16.62,16.88,17.13,
+17.20,17.16,17.13,17.58,17.45,17.70,17.74,17.89,18.03,17.80,
+18.18,18.14,18.36,18.28,18.41,18.50,18.52,18.66,18.82,18.75,
+18.87,19.05,19.18,19.39,19.53,19.25,19.63,19.55,19.66,19.90,
+19.85,19.90,19.94,20.57,20.27,20.45,20.60,20.54,20.68,20.66,
+20.67,20.83,21.09,21.29,21.41,21.46,21.46,21.52,21.64,21.59,
+21.80,22.01,22.18,21.96,22.18,22.18,22.42,22.66,22.53,22.83,
+22.78,22.86,22.76,22.99,23.11,23.21,23.65,23.32,23.59,23.63,
+23.87,23.84,24.07,23.96,24.32,24.29,24.46,24.39,24.52,24.60,
+24.37,24.79,24.85,25.00,25.09,25.21,25.18,25.27,25.38,25.43,
+25.77,25.36,25.75,26.00,25.97,26.01,26.32,26.52,26.42,26.56,
+26.49,26.48,27.00,26.77,27.10,26.92,27.08,27.14,26.85,27.37,
+27.57,27.62,27.64,27.78,27.81,27.94,27.92,28.17,28.38,28.37,
+0.67,0.78,0.81,0.88,0.99,1.02,1.11,1.12,1.29,1.27,
+1.35,1.37,1.50,1.59,1.63,1.76,1.75,1.84,1.95,1.98,
+2.07,2.12,2.10,2.23,2.32,2.43,2.37,2.53,2.54,2.65,
+2.74,2.77,2.89,2.96,3.00,3.12,3.14,3.15,3.27,3.31,
+3.34,3.43,3.45,3.45,3.62,3.69,3.73,3.73,3.94,3.94,
+4.12,4.09,4.20,4.19,4.23,4.49,4.47,4.66,4.66,4.56,
+4.87,4.84,4.93,4.92,4.93,5.01,5.21,5.21,5.25,5.34,
+5.47,5.43,5.51,5.69,5.75,5.67,5.78,5.97,6.03,6.01,
+6.06,6.16,6.27,6.24,6.48,6.42,6.67,6.49,6.74,6.71,
+6.71,6.82,6.81,6.89,7.01,7.04,7.19,7.19,7.35,7.39,
+7.41,7.62,7.51,7.70,7.67,7.80,7.75,7.98,7.96,7.98,
+8.04,8.11,8.20,8.19,8.33,8.33,8.26,8.50,8.59,8.66,
+8.80,8.86,8.96,8.81,9.11,9.12,9.17,9.18,9.27,9.46,
+9.42,9.39,9.63,9.54,9.70,9.73,9.79,10.01,10.08,10.02,
+10.12,10.17,10.30,10.32,10.47,10.62,10.52,10.54,10.60,10.63,
+10.69,10.92,10.92,11.05,11.07,11.14,11.30,11.34,11.27,11.45,
+11.32,11.60,11.61,11.75,11.71,11.63,11.65,11.97,12.04,12.03,
+12.09,12.21,12.23,12.20,12.42,12.39,12.68,12.75,12.64,12.65,
+12.75,12.96,12.87,13.04,13.03,13.08,13.22,13.31,13.09,13.56,
+13.44,13.60,13.78,13.61,13.66,13.71,14.00,13.90,14.11,14.04,
+14.07,14.07,14.22,14.46,14.41,14.46,14.44,14.72,14.60,14.97,
+14.74,14.87,15.22,15.05,15.14,15.06,15.23,15.28,15.48,15.57,
+15.41,15.69,15.93,15.48,15.56,15.73,16.08,15.84,16.12,16.09,
+16.28,16.25,16.54,16.34,16.40,16.50,16.68,16.96,16.79,16.56,
+16.97,16.90,16.91,17.20,17.10,17.08,17.23,17.32,17.46,17.37,
+17.47,17.61,17.60,17.80,17.85,17.99,17.94,18.07,18.06,18.30,
+18.25,18.20,18.35,18.32,18.48,18.59,18.56,18.53,18.62,18.67,
+18.90,19.21,19.03,18.89,19.21,19.07,19.34,19.21,19.59,19.40,
+19.57,19.52,19.52,19.88,19.77,19.73,20.24,19.98,20.13,20.05,
+0.54,0.54,0.61,0.61,0.71,0.76,0.76,0.87,0.91,0.91,
+1.00,1.02,1.06,1.12,1.19,1.28,1.29,1.30,1.35,1.43,
+1.40,1.47,1.58,1.60,1.70,1.67,1.74,1.78,1.85,1.90,
+1.98,1.99,2.04,2.09,2.07,2.16,2.21,2.21,2.32,2.37,
+2.43,2.46,2.52,2.57,2.69,2.55,2.68,2.66,2.87,2.80,
+2.89,2.80,2.98,2.98,3.04,3.17,3.14,3.18,3.33,3.36,
+3.38,3.44,3.46,3.47,3.63,3.52,3.70,3.54,3.74,3.93,
+3.89,3.88,3.95,3.94,3.96,4.13,4.15,4.20,4.19,4.27,
+4.31,4.45,4.41,4.39,4.57,4.63,4.68,4.60,4.76,4.61,
+4.73,4.87,4.88,4.92,4.87,5.03,5.20,5.08,5.16,5.18,
+5.32,5.40,5.40,5.43,5.50,5.54,5.71,5.57,5.69,5.72,
+5.80,5.89,5.90,5.85,5.95,6.04,6.06,6.12,6.20,6.18,
+6.30,6.22,6.38,6.47,6.43,6.42,6.43,6.49,6.71,6.57,
+6.78,6.81,6.78,6.88,6.87,7.11,7.11,7.03,7.09,7.06,
+7.33,7.12,7.30,7.37,7.32,7.41,7.51,7.36,7.54,7.56,
+7.59,7.78,7.89,7.91,7.75,7.83,8.09,8.05,7.93,8.23,
+8.14,8.04,8.16,8.22,8.34,8.32,8.56,8.31,8.73,8.55,
+8.61,8.73,8.80,8.70,8.89,8.85,8.97,9.01,9.06,9.14,
+8.99,9.16,9.22,9.33,9.35,9.39,9.41,9.34,9.34,9.49,
+9.62,9.70,9.54,9.61,9.78,9.76,9.91,9.96,10.12,10.05,
+10.10,10.07,10.16,10.16,10.24,10.03,10.40,10.36,10.63,10.31,
+10.71,10.57,10.75,10.70,10.62,10.65,10.62,10.93,10.97,10.84,
+11.04,10.99,11.11,11.15,11.28,11.19,11.36,11.38,11.34,11.43,
+11.48,11.41,11.59,11.72,11.65,11.80,11.84,11.76,11.87,11.82,
+11.91,11.98,11.99,12.11,12.14,12.43,12.47,12.38,12.38,12.40,
+12.60,12.43,12.36,12.58,12.80,12.61,12.70,12.73,12.86,12.84,
+12.97,12.82,12.97,13.08,13.20,13.01,13.30,13.40,13.38,13.30,
+13.46,13.52,13.45,13.65,13.66,13.46,13.59,13.69,13.67,13.80,
+13.79,13.88,14.01,14.04,14.11,14.18,14.16,13.97,14.17,14.15,
+0.34,0.40,0.41,0.43,0.50,0.54,0.59,0.58,0.62,0.65,
+0.69,0.74,0.77,0.81,0.81,0.83,0.92,0.91,0.95,1.05,
+1.07,1.03,1.11,1.11,1.16,1.24,1.24,1.28,1.25,1.32,
+1.36,1.42,1.43,1.43,1.51,1.58,1.59,1.57,1.58,1.69,
+1.75,1.79,1.73,1.80,1.85,1.90,1.91,1.97,2.02,2.09,
+2.00,2.08,2.10,2.12,2.19,2.22,2.18,2.31,2.28,2.31,
+2.41,2.41,2.46,2.43,2.52,2.50,2.55,2.52,2.66,2.70,
+2.67,2.79,2.72,2.89,2.88,2.92,2.97,2.88,3.07,3.05,
+3.03,3.12,3.10,3.15,3.17,3.30,3.26,3.25,3.29,3.38,
+3.28,3.43,3.44,3.54,3.57,3.57,3.61,3.73,3.67,3.68,
+3.78,3.86,3.75,3.76,3.98,3.87,3.94,4.04,4.00,4.09,
+4.06,4.02,4.23,4.18,4.29,4.25,4.20,4.27,4.35,4.47,
+4.43,4.49,4.67,4.47,4.51,4.59,4.56,4.75,4.74,4.87,
+4.87,4.75,4.82,4.74,4.95,4.96,4.86,5.04,4.90,4.99,
+5.06,5.15,5.10,5.27,5.10,5.28,5.42,5.14,5.40,5.46,
+5.46,5.53,5.32,5.48,5.49,5.71,5.66,5.70,5.65,5.75,
+5.83,5.75,5.96,5.81,5.96,6.02,5.98,5.99,5.99,5.90,
+6.24,6.08,6.25,6.35,6.26,6.29,6.39,6.44,6.45,6.51,
+6.39,6.41,6.60,6.52,6.49,6.69,6.44,6.59,6.76,6.73,
+6.79,6.78,6.78,6.87,6.88,6.96,7.04,7.00,7.10,7.05,
+7.21,7.16,7.43,7.03,7.39,7.24,7.33,7.32,7.34,7.42,
+7.40,7.66,7.69,7.72,7.36,7.56,7.62,7.67,7.77,7.76,
+7.93,7.92,7.93,8.07,7.95,8.04,7.88,8.08,7.95,8.18,
+8.20,8.07,8.22,8.35,8.39,8.34,8.49,8.49,8.31,8.46,
+8.51,8.65,8.61,8.46,8.58,8.74,8.58,8.81,8.64,8.68,
+8.60,8.66,8.77,8.83,8.95,9.06,9.21,9.05,9.04,9.04,
+9.12,9.07,9.27,9.31,9.40,9.27,9.47,9.39,9.54,9.50,
+9.59,9.44,9.63,9.69,9.73,9.63,9.87,9.64,9.83,9.77,
+9.73,9.97,9.92,10.00,9.83,9.95,10.26,10.07,10.02,10.26,
+0.22,0.23,0.29,0.32,0.38,0.35,0.40,0.45,0.43,0.52,
+0.49,0.50,0.56,0.55,0.57,0.62,0.66,0.66,0.70,0.70,
+0.72,0.75,0.81,0.81,0.85,0.83,0.88,0.92,0.93,0.92,
+0.97,0.96,1.02,1.05,1.08,1.08,1.15,1.12,1.18,1.15,
+1.26,1.24,1.19,1.31,1.30,1.38,1.31,1.36,1.43,1.47,
+1.48,1.52,1.54,1.59,1.53,1.62,1.61,1.58,1.66,1.69,
+1.67,1.74,1.71,1.76,1.79,1.79,1.91,1.80,1.84,1.89,
+1.97,2.01,1.99,1.95,1.96,2.00,2.10,2.11,2.08,2.14,
+2.18,2.20,2.21,2.15,2.23,2.33,2.36,2.38,2.39,2.46,
+2.53,2.48,2.42,2.54,2.55,2.47,2.58,2.61,2.57,2.58,
+2.73,2.64,2.69,2.77,2.75,2.86,2.90,2.83,2.92,2.90,
+2.94,3.00,2.94,2.96,2.91,2.93,2.97,3.12,3.07,3.05,
+3.18,3.12,3.22,3.18,3.33,3.23,3.31,3.33,3.39,3.34,
+3.43,3.31,3.42,3.52,3.46,3.50,3.48,3.54,3.55,3.56,
+3.66,3.64,3.61,3.71,3.75,3.82,3.71,3.83,3.80,3.91,
+3.82,3.87,4.00,3.97,4.03,3.94,4.05,4.03,4.09,4.12,
+4.08,4.03,4.12,4.16,4.08,4.21,4.22,4.24,4.34,4.39,
+4.50,4.40,4.52,4.35,4.43,4.42,4.64,4.54,4.55,4.56,
+4.50,4.71,4.67,4.73,4.71,4.70,4.73,4.93,4.77,4.85,
+4.76,4.91,4.77,4.91,5.13,4.81,5.04,5.10,5.07,5.10,
+4.95,5.00,5.14,5.05,5.17,5.15,5.30,5.20,5.16,5.36,
+5.31,5.41,5.48,5.40,5.33,5.37,5.46,5.58,5.47,5.70,
+5.46,5.65,5.50,5.63,5.64,5.58,5.52,5.83,5.78,5.87,
+5.77,5.78,5.92,5.83,5.92,5.86,6.00,5.93,6.01,6.09,
+6.09,6.08,6.02,6.01,6.08,6.17,6.22,6.25,6.25,6.19,
+6.13,6.26,6.18,6.33,6.31,6.33,6.38,6.45,6.38,6.57,
+6.49,6.45,6.54,6.43,6.72,6.60,6.75,6.69,6.72,6.74,
+6.73,6.71,6.71,6.73,7.08,6.98,6.85,7.04,6.98,7.00,
+6.90,7.22,7.02,7.17,6.88,7.06,6.94,7.31,7.20,7.21,
+0.16,0.19,0.21,0.24,0.23,0.27,0.25,0.29,0.30,0.34,
+0.34,0.35,0.39,0.35,0.44,0.45,0.49,0.45,0.47,0.48,
+0.53,0.58,0.56,0.58,0.61,0.62,0.58,0.63,0.68,0.70,
+0.62,0.71,0.74,0.72,0.74,0.86,0.79,0.80,0.78,0.87,
+0.84,0.90,0.93,0.94,0.90,0.91,1.01,0.97,1.01,1.02,
+1.04,1.08,1.02,1.08,1.14,1.11,1.12,1.14,1.12,1.14,
+1.24,1.26,1.24,1.23,1.29,1.26,1.28,1.35,1.31,1.33,
+1.39,1.38,1.34,1.41,1.39,1.44,1.49,1.51,1.47,1.48,
+1.56,1.54,1.64,1.53,1.65,1.65,1.59,1.67,1.62,1.70,
+1.75,1.64,1.74,1.78,1.80,1.82,1.89,1.79,1.75,1.82,
+1.92,1.91,1.88,1.97,2.00,2.02,1.99,1.98,2.10,1.96,
+2.03,2.13,2.13,2.07,2.07,2.12,2.12,2.22,2.15,2.18,
+2.19,2.23,2.32,2.29,2.31,2.31,2.33,2.40,2.37,2.38,
+2.35,2.44,2.41,2.42,2.49,2.50,2.56,2.49,2.58,2.61,
+2.60,2.55,2.56,2.63,2.62,2.63,2.76,2.63,2.73,2.75,
+2.69,2.73,2.77,2.86,2.77,2.82,2.89,2.79,2.84,2.95,
+2.91,2.93,2.90,2.94,2.98,3.00,3.06,3.02,3.03,3.09,
+3.02,3.07,3.21,3.09,3.21,3.19,3.23,3.11,3.33,3.30,
+3.27,3.23,3.29,3.37,3.37,3.35,3.43,3.32,3.37,3.34,
+3.45,3.52,3.45,3.52,3.46,3.50,3.56,3.57,3.56,3.60,
+3.57,3.65,3.68,3.65,3.62,3.68,3.76,3.77,3.80,3.78,
+3.79,3.76,3.86,3.90,3.74,3.87,3.89,3.93,3.94,3.91,
+3.89,3.93,4.02,4.03,4.00,4.08,4.13,4.12,4.16,4.00,
+4.17,4.16,4.16,4.21,4.12,4.13,4.21,4.15,4.33,4.43,
+4.34,4.39,4.31,4.38,4.42,4.37,4.36,4.40,4.30,4.41,
+4.46,4.45,4.44,4.42,4.48,4.53,4.43,4.62,4.62,4.64,
+4.56,4.62,4.56,4.69,4.70,4.75,4.71,4.78,4.70,4.91,
+4.79,4.81,4.77,4.78,4.88,4.91,4.89,4.91,4.92,4.90,
+4.97,5.00,4.96,5.00,5.15,5.04,5.03,4.96,5.17,5.07,
+0.12,0.13,0.15,0.16,0.18,0.18,0.19,0.21,0.23,0.23,
+0.24,0.26,0.27,0.28,0.30,0.31,0.31,0.36,0.36,0.33,
+0.38,0.37,0.41,0.42,0.39,0.45,0.44,0.47,0.45,0.49,
+0.48,0.52,0.56,0.53,0.53,0.58,0.54,0.56,0.59,0.57,
+0.59,0.63,0.66,0.67,0.65,0.71,0.69,0.69,0.73,0.69,
+0.77,0.76,0.71,0.74,0.79,0.75,0.85,0.84,0.84,0.84,
+0.81,0.83,0.88,0.84,0.88,0.98,0.95,0.99,0.95,1.02,
+0.99,1.00,1.05,1.06,1.06,1.02,1.02,1.07,1.06,1.10,
+1.09,1.12,1.18,1.14,1.17,1.17,1.18,1.21,1.23,1.23,
+1.19,1.22,1.21,1.21,1.30,1.31,1.34,1.34,1.31,1.34,
+1.32,1.33,1.40,1.43,1.45,1.41,1.39,1.37,1.44,1.37,
+1.40,1.48,1.48,1.54,1.49,1.52,1.59,1.65,1.55,1.54,
+1.53,1.63,1.62,1.63,1.63,1.61,1.69,1.62,1.70,1.70,
+1.74,1.69,1.73,1.74,1.71,1.71,1.84,1.77,1.77,1.82,
+1.84,1.82,1.82,1.88,1.86,1.82,1.87,1.84,2.01,2.01,
+1.97,1.93,1.98,1.96,2.05,2.01,2.03,2.07,1.95,2.05,
+2.04,2.14,2.08,2.11,2.09,2.20,2.20,2.18,2.18,2.22,
+2.27,2.19,2.27,2.25,2.17,2.26,2.29,2.29,2.25,2.29,
+2.28,2.36,2.31,2.37,2.38,2.40,2.43,2.42,2.33,2.42,
+2.43,2.48,2.50,2.48,2.45,2.47,2.44,2.51,2.50,2.44,
+2.58,2.67,2.57,2.58,2.55,2.62,2.65,2.66,2.68,2.61,
+2.66,2.68,2.73,2.87,2.78,2.70,2.84,2.78,2.69,2.83,
+2.88,2.92,2.80,2.87,2.74,2.88,2.87,2.93,2.87,2.93,
+2.95,2.88,2.93,3.01,2.99,2.95,3.01,2.98,3.06,3.07,
+3.11,3.09,3.13,3.07,3.02,3.08,3.09,3.12,3.15,3.13,
+3.12,3.23,3.16,3.26,3.22,3.22,3.11,3.25,3.26,3.25,
+3.23,3.39,3.29,3.31,3.40,3.30,3.41,3.32,3.41,3.37,
+3.49,3.44,3.49,3.40,3.39,3.47,3.37,3.49,3.64,3.43,
+3.59,3.54,3.64,3.58,3.54,3.56,3.63,3.57,3.57,3.73,
+0.07,0.07,0.10,0.10,0.14,0.15,0.13,0.14,0.16,0.14,
+0.19,0.18,0.21,0.21,0.20,0.21,0.22,0.23,0.23,0.26,
+0.33,0.26,0.26,0.29,0.28,0.34,0.32,0.29,0.32,0.33,
+0.37,0.35,0.34,0.35,0.37,0.36,0.35,0.40,0.43,0.40,
+0.43,0.43,0.43,0.46,0.48,0.49,0.46,0.50,0.51,0.53,
+0.55,0.49,0.55,0.56,0.56,0.57,0.56,0.56,0.58,0.60,
+0.61,0.61,0.66,0.67,0.63,0.63,0.65,0.64,0.69,0.67,
+0.67,0.67,0.72,0.67,0.74,0.72,0.76,0.78,0.78,0.77,
+0.78,0.82,0.80,0.87,0.80,0.81,0.81,0.83,0.84,0.88,
+0.85,0.79,0.90,0.86,0.88,0.89,0.95,0.93,0.90,0.98,
+0.96,0.94,0.97,1.01,0.95,1.03,1.03,1.03,1.05,1.05,
+1.02,1.10,1.07,1.00,1.06,1.04,1.09,1.04,1.07,1.08,
+1.12,1.17,1.13,1.13,1.21,1.15,1.17,1.18,1.15,1.21,
+1.25,1.17,1.23,1.25,1.24,1.28,1.17,1.29,1.25,1.27,
+1.32,1.25,1.30,1.29,1.40,1.34,1.38,1.35,1.40,1.36,
+1.38,1.40,1.41,1.45,1.43,1.41,1.45,1.48,1.46,1.47,
+1.48,1.48,1.54,1.56,1.53,1.51,1.48,1.57,1.53,1.57,
+1.59,1.59,1.57,1.61,1.56,1.58,1.58,1.55,1.61,1.58,
+1.66,1.68,1.65,1.67,1.66,1.69,1.68,1.69,1.67,1.69,
+1.70,1.69,1.71,1.82,1.75,1.74,1.81,1.75,1.76,1.75,
+1.79,1.84,1.72,1.88,1.89,1.83,1.86,1.87,1.92,1.77,
+1.93,1.87,1.84,1.93,2.00,2.00,1.92,1.95,1.97,1.97,
+1.98,1.99,2.02,2.12,2.07,2.00,1.98,2.02,2.10,2.07,
+2.09,2.10,2.07,2.07,2.14,2.11,2.13,2.17,2.08,2.13,
+2.17,2.15,2.17,2.20,2.18,2.19,2.29,2.24,2.08,2.28,
+2.24,2.24,2.22,2.24,2.35,2.30,2.40,2.27,2.26,2.37,
+2.34,2.31,2.30,2.34,2.36,2.30,2.40,2.36,2.44,2.41,
+2.39,2.39,2.46,2.40,2.48,2.44,2.43,2.51,2.53,2.56,
+2.52,2.55,2.45,2.58,2.49,2.53,2.63,2.53,2.47,2.58,
+0.07,0.06,0.08,0.08,0.10,0.10,0.10,0.11,0.10,0.11,
+0.14,0.11,0.13,0.13,0.15,0.15,0.16,0.17,0.17,0.19,
+0.17,0.20,0.23,0.21,0.21,0.23,0.22,0.23,0.21,0.25,
+0.23,0.26,0.23,0.24,0.29,0.28,0.29,0.27,0.30,0.30,
+0.33,0.30,0.29,0.33,0.33,0.33,0.38,0.40,0.39,0.34,
+0.34,0.37,0.39,0.40,0.40,0.39,0.41,0.44,0.41,0.42,
+0.44,0.41,0.42,0.44,0.47,0.49,0.47,0.52,0.48,0.54,
+0.51,0.47,0.55,0.52,0.54,0.51,0.54,0.52,0.59,0.52,
+0.55,0.53,0.56,0.54,0.56,0.62,0.62,0.60,0.63,0.60,
+0.57,0.63,0.62,0.61,0.61,0.62,0.63,0.65,0.68,0.72,
+0.68,0.63,0.68,0.64,0.67,0.71,0.67,0.70,0.74,0.67,
+0.74,0.73,0.72,0.80,0.73,0.76,0.77,0.79,0.80,0.74,
+0.81,0.81,0.78,0.81,0.84,0.81,0.84,0.88,0.82,0.82,
+0.78,0.83,0.88,0.93,0.91,0.89,0.90,0.91,0.89,0.92,
+0.93,0.88,1.00,0.95,0.98,0.94,0.97,0.95,0.98,0.95,
+0.93,0.93,0.93,0.92,1.00,1.01,1.00,1.02,1.02,1.01,
+1.03,1.01,1.00,1.05,1.03,1.02,1.07,1.07,1.12,1.17,
+1.15,1.11,1.05,1.08,1.10,1.08,1.10,1.17,1.14,1.13,
+1.21,1.18,1.22,1.17,1.20,1.20,1.29,1.24,1.24,1.19,
+1.13,1.24,1.21,1.27,1.18,1.34,1.29,1.26,1.26,1.27,
+1.24,1.35,1.31,1.34,1.37,1.35,1.31,1.34,1.42,1.38,
+1.33,1.39,1.33,1.41,1.37,1.34,1.38,1.44,1.44,1.40,
+1.35,1.40,1.42,1.44,1.43,1.44,1.47,1.45,1.44,1.52,
+1.39,1.45,1.49,1.50,1.49,1.57,1.51,1.55,1.47,1.56,
+1.54,1.60,1.54,1.59,1.49,1.56,1.54,1.56,1.58,1.56,
+1.63,1.62,1.54,1.53,1.70,1.62,1.59,1.65,1.68,1.64,
+1.67,1.69,1.71,1.71,1.72,1.64,1.74,1.74,1.71,1.75,
+1.72,1.75,1.65,1.75,1.75,1.72,1.74,1.82,1.74,1.79,
+1.75,1.72,1.75,1.87,1.79,1.78,1.82,1.82,1.78,1.85,
+0.04,0.04,0.06,0.06,0.08,0.07,0.07,0.08,0.09,0.09,
+0.09,0.09,0.08,0.10,0.10,0.13,0.11,0.12,0.12,0.12,
+0.12,0.14,0.15,0.15,0.14,0.12,0.15,0.17,0.15,0.18,
+0.17,0.20,0.17,0.18,0.19,0.20,0.21,0.20,0.22,0.22,
+0.21,0.23,0.23,0.22,0.23,0.24,0.26,0.26,0.25,0.26,
+0.26,0.30,0.28,0.27,0.29,0.28,0.28,0.33,0.33,0.29,
+0.29,0.32,0.32,0.31,0.34,0.35,0.32,0.36,0.31,0.35,
+0.34,0.35,0.37,0.34,0.40,0.36,0.39,0.40,0.40,0.39,
+0.36,0.39,0.42,0.38,0.42,0.44,0.37,0.41,0.45,0.42,
+0.44,0.43,0.47,0.44,0.41,0.48,0.44,0.42,0.47,0.48,
+0.51,0.51,0.48,0.49,0.48,0.51,0.51,0.53,0.49,0.57,
+0.51,0.55,0.54,0.51,0.52,0.50,0.52,0.53,0.58,0.57,
+0.53,0.53,0.53,0.55,0.55,0.62,0.57,0.60,0.61,0.63,
+0.60,0.62,0.63,0.63,0.64,0.64,0.65,0.63,0.66,0.68,
+0.62,0.67,0.71,0.63,0.65,0.64,0.70,0.68,0.71,0.71,
+0.64,0.68,0.70,0.69,0.73,0.69,0.71,0.72,0.78,0.77,
+0.75,0.78,0.75,0.74,0.77,0.73,0.81,0.74,0.75,0.80,
+0.81,0.82,0.77,0.84,0.80,0.80,0.80,0.84,0.80,0.88,
+0.82,0.80,0.87,0.90,0.84,0.90,0.86,0.86,0.85,0.87,
+0.87,0.86,0.88,0.91,0.86,0.89,0.89,0.91,0.92,0.91,
+0.89,0.92,0.93,0.98,0.91,0.88,0.95,0.98,0.97,0.95,
+0.98,0.94,0.99,0.97,1.02,0.99,0.98,1.00,1.02,0.99,
+1.03,1.07,0.98,1.03,1.00,1.01,1.02,1.02,1.02,1.05,
+1.05,1.10,1.10,1.06,1.06,1.08,1.03,1.07,1.08,1.11,
+1.07,1.07,1.10,1.12,1.15,1.13,1.14,1.11,1.09,1.12,
+1.17,1.13,1.15,1.15,1.17,1.12,1.17,1.17,1.20,1.14,
+1.20,1.21,1.15,1.17,1.16,1.19,1.16,1.17,1.22,1.20,
+1.19,1.21,1.22,1.19,1.24,1.19,1.26,1.25,1.28,1.19,
+1.31,1.33,1.27,1.31,1.29,1.33,1.28,1.32,1.34,1.31,
+0.04,0.04,0.05,0.03,0.06,0.05,0.06,0.05,0.07,0.06,
+0.08,0.07,0.06,0.07,0.07,0.07,0.08,0.09,0.09,0.11,
+0.09,0.10,0.10,0.09,0.10,0.10,0.11,0.13,0.13,0.11,
+0.12,0.13,0.13,0.12,0.13,0.15,0.15,0.15,0.17,0.18,
+0.17,0.17,0.14,0.17,0.19,0.19,0.17,0.18,0.20,0.19,
+0.17,0.21,0.19,0.21,0.21,0.21,0.21,0.22,0.20,0.24,
+0.23,0.21,0.23,0.22,0.21,0.22,0.25,0.28,0.26,0.24,
+0.25,0.23,0.28,0.28,0.28,0.27,0.25,0.28,0.25,0.27,
+0.28,0.27,0.27,0.29,0.28,0.31,0.29,0.31,0.31,0.30,
+0.29,0.32,0.34,0.32,0.30,0.33,0.31,0.32,0.34,0.33,
+0.37,0.34,0.31,0.39,0.36,0.37,0.38,0.35,0.34,0.38,
+0.33,0.39,0.34,0.38,0.40,0.42,0.37,0.38,0.37,0.40,
+0.39,0.42,0.39,0.40,0.43,0.41,0.41,0.47,0.43,0.44,
+0.45,0.41,0.44,0.43,0.48,0.45,0.47,0.48,0.46,0.47,
+0.46,0.48,0.47,0.47,0.52,0.52,0.46,0.51,0.49,0.52,
+0.52,0.49,0.48,0.49,0.51,0.53,0.50,0.50,0.56,0.51,
+0.51,0.54,0.53,0.49,0.46,0.53,0.54,0.55,0.51,0.52,
+0.53,0.58,0.58,0.59,0.59,0.55,0.58,0.58,0.62,0.56,
+0.61,0.58,0.59,0.59,0.58,0.62,0.62,0.60,0.59,0.57,
+0.62,0.61,0.61,0.62,0.61,0.60,0.61,0.64,0.66,0.64,
+0.65,0.72,0.68,0.63,0.67,0.67,0.64,0.72,0.69,0.66,
+0.67,0.69,0.71,0.73,0.67,0.68,0.69,0.69,0.73,0.73,
+0.68,0.70,0.72,0.72,0.70,0.72,0.69,0.73,0.74,0.74,
+0.76,0.74,0.74,0.78,0.69,0.76,0.74,0.73,0.80,0.80,
+0.76,0.77,0.73,0.81,0.79,0.76,0.77,0.82,0.78,0.81,
+0.82,0.82,0.77,0.83,0.85,0.89,0.87,0.79,0.85,0.83,
+0.86,0.84,0.82,0.77,0.82,0.83,0.89,0.86,0.84,0.86,
+0.85,0.88,0.85,0.85,0.82,0.94,0.86,0.93,0.97,0.85,
+0.88,0.89,0.94,0.88,0.92,0.87,0.91,0.91,0.90,0.97,
+0.03,0.03,0.03,0.03,0.04,0.04,0.04,0.04,0.04,0.04,
+0.05,0.05,0.04,0.05,0.05,0.06,0.04,0.06,0.06,0.07,
+0.06,0.06,0.07,0.08,0.06,0.08,0.07,0.08,0.08,0.08,
+0.10,0.09,0.10,0.09,0.10,0.10,0.11,0.10,0.11,0.11,
+0.12,0.10,0.11,0.12,0.13,0.12,0.12,0.12,0.11,0.11,
+0.12,0.14,0.15,0.13,0.14,0.15,0.14,0.14,0.16,0.15,
+0.15,0.16,0.13,0.18,0.15,0.16,0.19,0.16,0.20,0.17,
+0.17,0.16,0.19,0.19,0.20,0.18,0.18,0.16,0.18,0.19,
+0.20,0.21,0.20,0.20,0.22,0.21,0.22,0.23,0.21,0.23,
+0.21,0.21,0.24,0.23,0.25,0.23,0.24,0.25,0.22,0.27,
+0.23,0.26,0.26,0.26,0.25,0.24,0.28,0.28,0.26,0.26,
+0.25,0.28,0.27,0.25,0.25,0.27,0.29,0.28,0.27,0.30,
+0.27,0.28,0.30,0.31,0.27,0.27,0.30,0.28,0.34,0.31,
+0.30,0.29,0.34,0.31,0.32,0.30,0.33,0.34,0.33,0.34,
+0.32,0.31,0.31,0.35,0.34,0.32,0.30,0.35,0.38,0.34,
+0.37,0.34,0.36,0.32,0.34,0.38,0.37,0.37,0.37,0.38,
+0.39,0.38,0.42,0.35,0.38,0.37,0.38,0.43,0.42,0.39,
+0.40,0.41,0.40,0.41,0.37,0.42,0.41,0.40,0.44,0.39,
+0.41,0.43,0.43,0.41,0.42,0.44,0.39,0.40,0.43,0.44,
+0.41,0.43,0.48,0.47,0.44,0.43,0.42,0.45,0.47,0.45,
+0.46,0.48,0.46,0.45,0.52,0.47,0.44,0.45,0.48,0.51,
+0.48,0.49,0.45,0.50,0.55,0.52,0.50,0.50,0.54,0.50,
+0.52,0.55,0.52,0.50,0.52,0.52,0.52,0.54,0.56,0.52,
+0.53,0.53,0.55,0.52,0.50,0.56,0.56,0.55,0.56,0.56,
+0.58,0.56,0.58,0.56,0.57,0.56,0.56,0.54,0.53,0.57,
+0.56,0.54,0.60,0.60,0.57,0.56,0.62,0.60,0.56,0.57,
+0.59,0.59,0.61,0.60,0.58,0.61,0.65,0.60,0.56,0.66,
+0.62,0.62,0.63,0.57,0.65,0.58,0.62,0.64,0.65,0.60,
+0.60,0.64,0.58,0.65,0.63,0.67,0.68,0.65,0.65,0.69,
+0.01,0.03,0.03,0.03,0.03,0.02,0.03,0.03,0.03,0.03,
+0.03,0.04,0.02,0.03,0.04,0.03,0.04,0.05,0.04,0.04,
+0.05,0.05,0.06,0.04,0.05,0.07,0.05,0.06,0.06,0.08,
+0.06,0.06,0.08,0.07,0.08,0.05,0.09,0.06,0.09,0.07,
+0.06,0.09,0.09,0.08,0.10,0.08,0.10,0.07,0.08,0.08,
+0.10,0.11,0.08,0.10,0.10,0.11,0.11,0.11,0.10,0.12,
+0.09,0.10,0.14,0.12,0.11,0.11,0.11,0.14,0.12,0.14,
+0.14,0.12,0.12,0.13,0.12,0.14,0.14,0.12,0.14,0.15,
+0.15,0.16,0.13,0.16,0.15,0.14,0.14,0.16,0.19,0.16,
+0.16,0.14,0.14,0.16,0.17,0.14,0.17,0.14,0.18,0.15,
+0.17,0.17,0.16,0.17,0.18,0.19,0.19,0.15,0.16,0.19,
+0.19,0.19,0.19,0.17,0.18,0.20,0.22,0.18,0.20,0.19,
+0.21,0.22,0.19,0.20,0.22,0.20,0.22,0.21,0.23,0.21,
+0.20,0.22,0.20,0.19,0.21,0.22,0.24,0.19,0.22,0.25,
+0.22,0.23,0.22,0.23,0.25,0.23,0.26,0.25,0.23,0.27,
+0.25,0.25,0.27,0.22,0.27,0.24,0.29,0.25,0.26,0.25,
+0.26,0.29,0.27,0.27,0.29,0.28,0.29,0.30,0.29,0.28,
+0.30,0.28,0.28,0.27,0.29,0.27,0.28,0.28,0.30,0.28,
+0.26,0.30,0.30,0.32,0.30,0.31,0.29,0.34,0.30,0.32,
+0.31,0.33,0.32,0.27,0.33,0.29,0.36,0.36,0.31,0.31,
+0.33,0.36,0.32,0.35,0.31,0.28,0.34,0.30,0.32,0.32,
+0.37,0.35,0.33,0.32,0.37,0.36,0.36,0.36,0.36,0.34,
+0.38,0.34,0.38,0.37,0.37,0.39,0.33,0.39,0.36,0.39,
+0.35,0.37,0.37,0.38,0.39,0.39,0.40,0.37,0.42,0.39,
+0.37,0.37,0.40,0.39,0.41,0.38,0.41,0.41,0.42,0.37,
+0.38,0.38,0.45,0.39,0.42,0.40,0.45,0.39,0.39,0.40,
+0.45,0.40,0.40,0.45,0.38,0.43,0.43,0.45,0.44,0.46,
+0.40,0.47,0.41,0.45,0.45,0.49,0.44,0.46,0.45,0.45,
+0.47,0.45,0.45,0.48,0.44,0.46,0.44,0.46,0.42,0.50,
+0.01,0.01,0.01,0.02,0.01,0.02,0.01,0.01,0.01,0.02,
+0.02,0.03,0.02,0.02,0.02,0.02,0.02,0.03,0.03,0.03,
+0.04,0.03,0.03,0.05,0.04,0.03,0.05,0.04,0.04,0.05,
+0.05,0.04,0.05,0.05,0.04,0.05,0.06,0.06,0.04,0.06,
+0.05,0.06,0.05,0.05,0.07,0.05,0.07,0.06,0.05,0.07,
+0.06,0.09,0.07,0.07,0.07,0.06,0.08,0.07,0.08,0.07,
+0.08,0.08,0.09,0.09,0.08,0.09,0.09,0.08,0.09,0.10,
+0.09,0.08,0.10,0.09,0.09,0.10,0.09,0.11,0.11,0.10,
+0.10,0.11,0.10,0.09,0.12,0.10,0.11,0.10,0.10,0.12,
+0.10,0.12,0.10,0.11,0.13,0.12,0.12,0.10,0.12,0.11,
+0.13,0.11,0.13,0.14,0.12,0.13,0.12,0.12,0.10,0.12,
+0.12,0.14,0.14,0.13,0.14,0.15,0.14,0.14,0.14,0.15,
+0.14,0.14,0.17,0.14,0.17,0.16,0.17,0.13,0.17,0.17,
+0.16,0.16,0.14,0.16,0.15,0.15,0.15,0.15,0.17,0.16,
+0.17,0.17,0.16,0.16,0.18,0.16,0.18,0.18,0.18,0.16,
+0.17,0.17,0.17,0.17,0.17,0.18,0.17,0.19,0.20,0.19,
+0.19,0.21,0.19,0.20,0.20,0.21,0.20,0.21,0.20,0.20,
+0.18,0.20,0.20,0.23,0.21,0.19,0.22,0.20,0.22,0.23,
+0.21,0.20,0.19,0.23,0.19,0.23,0.21,0.24,0.20,0.24,
+0.20,0.21,0.24,0.24,0.21,0.23,0.23,0.22,0.23,0.23,
+0.24,0.21,0.22,0.25,0.25,0.26,0.22,0.25,0.23,0.24,
+0.23,0.27,0.24,0.26,0.25,0.23,0.24,0.26,0.28,0.23,
+0.23,0.24,0.25,0.26,0.28,0.24,0.25,0.22,0.26,0.22,
+0.27,0.24,0.28,0.27,0.26,0.28,0.33,0.26,0.27,0.24,
+0.28,0.26,0.27,0.29,0.26,0.28,0.28,0.28,0.28,0.31,
+0.28,0.23,0.27,0.31,0.30,0.30,0.31,0.26,0.33,0.31,
+0.30,0.33,0.29,0.30,0.30,0.29,0.28,0.34,0.28,0.32,
+0.32,0.32,0.29,0.33,0.33,0.33,0.30,0.31,0.30,0.30,
+0.32,0.32,0.30,0.32,0.34,0.32,0.33,0.32,0.33,0.35,
+0.01,0.01,0.01,0.01,0.01,0.01,0.02,0.01,0.01,0.02,
+0.02,0.01,0.01,0.01,0.02,0.01,0.02,0.03,0.02,0.02,
+0.03,0.02,0.02,0.02,0.04,0.04,0.02,0.03,0.03,0.04,
+0.03,0.02,0.03,0.03,0.03,0.04,0.04,0.04,0.04,0.04,
+0.04,0.04,0.04,0.04,0.05,0.04,0.05,0.04,0.05,0.05,
+0.05,0.04,0.04,0.05,0.06,0.04,0.05,0.04,0.06,0.04,
+0.05,0.05,0.06,0.07,0.07,0.07,0.06,0.06,0.05,0.06,
+0.07,0.07,0.06,0.07,0.07,0.06,0.06,0.07,0.07,0.08,
+0.07,0.06,0.07,0.07,0.08,0.07,0.07,0.07,0.08,0.07,
+0.08,0.07,0.08,0.09,0.09,0.09,0.08,0.08,0.09,0.09,
+0.09,0.11,0.09,0.09,0.08,0.09,0.08,0.10,0.09,0.09,
+0.10,0.09,0.10,0.11,0.11,0.11,0.09,0.08,0.10,0.09,
+0.10,0.08,0.10,0.10,0.10,0.09,0.11,0.12,0.10,0.12,
+0.13,0.09,0.13,0.12,0.12,0.14,0.12,0.12,0.10,0.12,
+0.13,0.13,0.10,0.14,0.12,0.12,0.10,0.14,0.14,0.13,
+0.13,0.14,0.12,0.13,0.11,0.13,0.13,0.13,0.10,0.13,
+0.12,0.13,0.12,0.14,0.13,0.15,0.13,0.13,0.16,0.13,
+0.14,0.15,0.13,0.18,0.14,0.14,0.14,0.15,0.16,0.15,
+0.15,0.16,0.17,0.16,0.13,0.14,0.16,0.17,0.15,0.16,
+0.14,0.16,0.17,0.16,0.17,0.17,0.17,0.18,0.15,0.17,
+0.19,0.17,0.17,0.17,0.17,0.16,0.19,0.18,0.17,0.17,
+0.19,0.16,0.14,0.17,0.20,0.18,0.18,0.18,0.16,0.20,
+0.20,0.18,0.20,0.19,0.20,0.21,0.19,0.18,0.17,0.19,
+0.19,0.18,0.20,0.20,0.20,0.19,0.20,0.18,0.20,0.21,
+0.19,0.20,0.21,0.18,0.20,0.21,0.19,0.21,0.22,0.22,
+0.18,0.20,0.21,0.20,0.21,0.20,0.21,0.19,0.22,0.18,
+0.25,0.20,0.21,0.22,0.25,0.21,0.22,0.23,0.22,0.21,
+0.22,0.21,0.25,0.24,0.24,0.21,0.25,0.23,0.26,0.21,
+0.23,0.23,0.24,0.23,0.21,0.21,0.25,0.27,0.23,0.25,
+1.13,1.23,1.22,1.52,1.57,1.61,1.72,1.82,1.98,2.08,
+2.08,2.28,2.47,2.49,2.66,2.70,2.78,2.95,3.03,3.12,
+3.19,3.31,3.49,3.69,3.64,3.79,3.77,4.09,4.18,4.25,
+4.41,4.43,4.59,4.59,4.72,4.85,4.90,5.08,5.10,5.29,
+5.31,5.58,5.64,5.77,5.86,6.13,6.01,6.20,6.24,6.15,
+6.50,6.64,6.57,6.78,6.88,6.86,7.11,7.11,7.19,7.46,
+7.42,7.50,7.61,7.85,7.99,7.97,8.28,8.25,8.40,8.52,
+8.53,8.72,8.69,8.92,9.10,9.20,9.27,9.38,9.39,9.53,
+9.77,9.74,9.80,10.00,10.03,10.10,10.33,10.36,10.55,10.82,
+10.70,10.82,11.03,11.00,11.11,11.25,11.34,11.55,11.53,11.58,
+11.77,11.97,11.90,12.09,12.14,12.46,12.50,12.70,12.80,12.60,
+12.92,13.05,12.86,13.00,13.32,13.50,13.40,13.73,13.71,13.66,
+14.07,13.91,14.24,14.24,14.23,14.65,14.65,14.71,14.76,14.76,
+15.04,14.97,15.22,15.50,15.34,15.62,15.66,15.82,16.03,16.02,
+16.08,16.00,16.43,16.32,16.50,16.67,16.81,16.82,16.99,17.20,
+17.09,17.54,17.38,17.50,17.39,17.62,17.75,17.74,17.94,18.16,
+18.27,18.24,18.36,18.36,18.61,18.89,18.71,18.81,19.26,19.17,
+19.29,19.51,19.53,19.74,19.78,19.84,20.31,20.13,20.05,20.29,
+20.33,20.42,20.67,20.55,20.69,20.97,21.05,20.96,21.18,21.40,
+21.54,21.47,21.79,21.85,21.91,22.21,22.27,22.09,22.12,22.45,
+22.44,22.66,22.64,22.87,22.74,23.11,23.13,23.20,23.52,23.53,
+23.52,23.78,23.94,23.95,24.07,24.13,24.34,24.41,24.44,24.95,
+24.52,24.64,24.91,24.86,25.14,25.09,25.42,25.35,25.70,25.62,
+25.78,25.74,25.74,25.66,26.19,26.30,26.38,26.48,26.46,26.44,
+26.68,26.81,26.83,26.90,27.21,27.17,27.46,27.60,27.54,27.61,
+27.73,28.27,28.10,28.25,28.32,28.33,28.61,28.49,28.83,28.64,
+29.05,29.12,29.11,29.41,29.05,29.44,29.57,29.86,29.89,29.85,
+29.90,29.92,30.36,30.49,30.41,30.31,30.55,30.46,30.98,31.29,
+31.11,30.90,31.50,31.41,31.43,31.73,31.69,31.89,31.80,32.22,
+0.75,0.87,0.95,1.08,1.13,1.15,1.30,1.41,1.40,1.54,
+1.52,1.64,1.74,1.79,1.89,1.90,2.08,2.17,2.12,2.32,
+2.32,2.44,2.51,2.61,2.62,2.76,2.88,2.84,2.90,2.97,
+3.10,3.13,3.25,3.38,3.34,3.48,3.62,3.54,3.69,3.87,
+4.00,4.00,4.03,4.21,4.18,4.36,4.37,4.45,4.39,4.59,
+4.77,4.67,4.85,4.94,4.95,4.97,5.09,5.21,5.27,5.35,
+5.43,5.54,5.55,5.73,5.74,5.86,5.91,6.05,6.08,6.12,
+6.14,6.32,6.25,6.44,6.42,6.54,6.60,6.67,6.63,6.85,
+6.98,6.87,7.01,7.11,7.22,7.26,7.42,7.54,7.70,7.66,
+7.72,7.88,7.75,8.05,8.02,8.23,8.31,8.23,8.36,8.42,
+8.41,8.53,8.53,8.72,8.78,8.91,9.04,9.09,9.07,9.16,
+9.27,9.32,9.43,9.45,9.46,9.74,9.57,9.93,9.96,9.96,
+10.06,10.12,10.34,10.18,10.35,10.40,10.60,10.59,10.61,10.83,
+10.82,10.85,10.84,11.04,11.08,11.21,11.07,11.39,11.53,11.56,
+11.46,11.48,11.84,11.79,12.07,11.86,11.97,12.18,12.31,12.20,
+12.23,12.35,12.56,12.52,12.68,12.79,12.77,12.89,12.91,12.94,
+13.26,13.11,13.35,13.45,13.46,13.55,13.63,14.05,13.59,13.83,
+13.84,13.96,14.00,14.20,14.28,14.32,14.66,14.50,14.42,14.45,
+14.63,14.89,14.93,14.72,15.00,14.96,15.10,15.18,15.30,15.21,
+15.24,15.32,15.65,15.77,15.53,15.82,16.02,15.99,16.06,16.03,
+16.22,16.15,16.32,16.40,16.54,16.57,16.72,16.73,16.99,17.02,
+16.99,17.14,17.11,17.14,17.33,17.41,17.23,17.56,17.59,17.73,
+17.89,17.92,17.97,18.03,18.15,18.11,18.19,18.25,18.09,18.48,
+18.77,18.48,18.75,18.89,18.70,19.28,19.11,19.00,19.04,19.19,
+19.36,19.26,19.53,19.47,19.55,19.95,19.69,19.92,19.93,19.92,
+20.06,20.04,20.48,20.34,20.16,20.25,20.74,20.69,20.43,20.54,
+20.69,20.79,20.92,21.01,21.20,21.13,21.21,21.61,21.32,21.48,
+21.74,21.75,21.95,21.72,21.65,21.75,21.96,22.13,22.12,22.11,
+22.46,22.21,22.61,22.80,23.00,22.71,22.36,23.00,22.98,23.14,
+0.57,0.65,0.67,0.73,0.75,0.82,0.96,0.96,0.98,1.05,
+1.08,1.22,1.20,1.32,1.29,1.35,1.44,1.52,1.64,1.63,
+1.65,1.76,1.77,1.88,1.86,2.00,1.94,1.97,2.09,2.22,
+2.27,2.34,2.35,2.46,2.46,2.53,2.51,2.64,2.65,2.75,
+2.87,2.82,2.95,2.99,3.03,3.01,3.10,3.14,3.21,3.36,
+3.32,3.41,3.48,3.50,3.70,3.61,3.63,3.68,3.84,3.94,
+3.82,3.94,4.02,3.89,4.08,4.21,4.21,4.33,4.27,4.46,
+4.34,4.52,4.48,4.67,4.59,4.81,4.71,4.88,4.80,5.04,
+4.97,5.01,5.05,5.16,5.23,5.29,5.26,5.42,5.36,5.42,
+5.60,5.67,5.60,5.79,5.68,5.84,5.87,6.05,6.02,6.14,
+6.01,6.15,6.29,6.26,6.44,6.39,6.35,6.59,6.41,6.54,
+6.75,6.71,6.82,6.84,6.85,7.04,7.06,7.10,7.15,7.08,
+7.19,7.27,7.34,7.57,7.30,7.53,7.60,7.63,7.68,7.75,
+7.62,7.81,7.80,8.01,7.98,7.96,8.11,8.24,8.34,8.35,
+8.25,8.49,8.49,8.54,8.69,8.70,8.52,8.57,8.77,8.92,
+8.99,9.01,9.04,9.15,9.12,9.05,9.12,9.29,9.26,9.26,
+9.41,9.43,9.51,9.87,9.60,9.87,9.60,9.79,9.90,10.03,
+10.01,10.01,10.09,10.23,10.13,10.36,10.27,10.47,10.60,10.69,
+10.63,10.59,10.67,10.80,10.68,10.72,10.91,11.05,11.00,11.11,
+11.31,11.18,11.28,11.34,11.51,11.40,11.38,11.40,11.50,11.56,
+11.62,11.83,11.83,11.89,11.90,12.02,12.01,12.09,12.05,12.39,
+12.24,12.26,12.19,12.40,12.52,12.59,12.44,12.55,12.67,12.63,
+12.89,12.95,12.81,13.06,12.83,13.12,13.14,13.14,13.16,13.07,
+13.27,13.40,13.27,13.41,13.42,13.58,13.76,13.80,13.57,13.73,
+13.70,13.86,13.81,14.04,14.19,14.37,14.20,14.19,14.32,14.50,
+14.51,14.32,14.46,14.46,14.57,14.84,14.77,14.66,15.07,15.04,
+14.97,15.06,15.07,15.24,15.26,15.21,15.24,15.34,15.75,15.33,
+15.55,15.66,15.59,15.91,15.72,15.65,15.83,15.92,16.07,16.21,
+16.07,16.15,15.99,16.28,16.22,16.42,16.68,16.54,16.51,16.71,
+0.37,0.47,0.47,0.51,0.57,0.67,0.68,0.73,0.72,0.77,
+0.83,0.84,0.87,0.85,0.93,0.99,1.00,1.12,1.15,1.19,
+1.22,1.17,1.29,1.37,1.41,1.44,1.44,1.44,1.46,1.50,
+1.70,1.64,1.66,1.70,1.77,1.81,1.88,1.95,1.90,1.99,
+1.98,2.15,2.06,2.09,2.15,2.24,2.18,2.31,2.32,2.31,
+2.37,2.49,2.56,2.50,2.52,2.52,2.61,2.72,2.73,2.69,
+2.72,2.96,2.86,2.93,3.02,3.04,3.14,3.11,3.08,3.18,
+3.23,3.15,3.33,3.31,3.41,3.44,3.45,3.51,3.50,3.61,
+3.66,3.62,3.67,3.74,3.73,3.81,3.88,3.83,3.95,3.92,
+4.08,4.02,4.12,4.03,4.14,4.22,4.36,4.23,4.29,4.27,
+4.51,4.42,4.48,4.52,4.51,4.78,4.59,4.76,4.77,4.84,
+4.75,4.79,4.88,4.99,5.02,4.99,4.97,5.02,5.10,5.12,
+5.15,5.29,5.34,5.30,5.44,5.35,5.37,5.47,5.54,5.52,
+5.59,5.64,5.70,5.78,5.68,5.70,5.93,5.88,6.06,6.01,
+6.09,6.08,6.12,6.01,6.04,6.31,6.30,6.30,6.38,6.34,
+6.36,6.55,6.48,6.67,6.57,6.65,6.76,6.76,6.79,6.84,
+6.85,6.89,6.87,6.87,6.81,7.00,6.88,6.97,7.00,7.16,
+7.27,7.09,7.33,7.27,7.50,7.37,7.40,7.36,7.59,7.48,
+7.66,7.70,7.79,7.70,7.63,7.82,7.82,8.00,7.97,7.98,
+7.96,8.00,8.15,8.16,8.15,8.36,8.10,8.26,8.38,8.23,
+8.43,8.43,8.48,8.51,8.45,8.58,8.59,8.52,8.78,8.71,
+8.75,8.82,8.96,8.99,9.01,9.05,8.92,9.06,9.01,9.39,
+9.19,9.29,9.34,9.05,9.31,9.38,9.38,9.48,9.44,9.39,
+9.64,9.59,9.80,9.75,9.67,9.65,9.84,9.75,9.89,10.20,
+9.93,10.05,10.01,10.08,10.11,10.26,10.03,10.23,10.15,10.48,
+10.42,10.38,10.37,10.54,10.57,10.55,10.49,10.54,10.69,10.76,
+10.71,10.90,10.89,10.91,11.09,10.75,10.78,10.98,11.14,11.12,
+10.98,11.24,11.25,11.31,11.27,11.45,11.46,11.59,11.61,11.49,
+11.42,11.70,11.37,11.76,11.92,11.77,11.75,11.79,11.80,11.73,
+0.32,0.32,0.33,0.42,0.43,0.46,0.43,0.52,0.47,0.59,
+0.57,0.62,0.67,0.66,0.72,0.80,0.79,0.78,0.81,0.86,
+0.88,0.89,0.93,0.87,0.96,0.96,1.02,1.08,1.09,1.08,
+1.17,1.19,1.24,1.28,1.23,1.28,1.36,1.32,1.34,1.36,
+1.40,1.53,1.49,1.52,1.62,1.55,1.68,1.58,1.66,1.69,
+1.71,1.70,1.82,1.85,1.86,1.87,1.91,1.96,2.02,1.92,
+2.03,2.02,2.05,2.10,2.10,2.13,2.23,2.22,2.23,2.25,
+2.32,2.29,2.36,2.37,2.40,2.36,2.46,2.44,2.50,2.59,
+2.67,2.68,2.66,2.67,2.70,2.67,2.77,2.76,2.76,2.81,
+2.97,2.98,2.90,2.97,3.10,3.08,3.09,3.08,3.11,3.12,
+3.12,3.24,3.27,3.23,3.35,3.21,3.37,3.41,3.35,3.36,
+3.45,3.49,3.51,3.53,3.49,3.62,3.62,3.65,3.69,3.73,
+3.68,3.77,3.87,3.79,3.87,3.88,3.85,3.99,4.03,4.08,
+4.00,4.12,4.16,4.03,4.17,4.14,4.35,4.31,4.23,4.24,
+4.32,4.34,4.39,4.45,4.52,4.45,4.56,4.53,4.51,4.59,
+4.61,4.71,4.64,4.65,4.77,4.71,4.67,4.80,4.85,4.87,
+4.94,4.79,5.03,4.88,5.07,5.06,5.05,5.18,5.16,5.17,
+5.20,5.24,5.23,5.17,5.31,5.27,5.38,5.28,5.38,5.43,
+5.41,5.39,5.61,5.54,5.65,5.53,5.58,5.71,5.71,5.63,
+5.85,5.76,5.77,5.75,5.98,5.88,5.86,6.08,6.05,6.00,
+6.01,6.06,6.04,6.12,6.14,6.19,6.28,6.31,6.29,6.45,
+6.36,6.42,6.41,6.45,6.47,6.42,6.44,6.63,6.52,6.69,
+6.60,6.64,6.68,6.77,6.78,6.85,6.78,6.75,6.83,6.94,
+6.70,6.86,6.87,7.02,7.01,6.92,7.08,7.08,7.08,7.04,
+7.11,7.25,7.19,7.29,7.28,7.27,7.42,7.46,7.44,7.46,
+7.60,7.58,7.47,7.54,7.58,7.59,7.57,7.68,7.89,7.70,
+7.58,7.83,7.78,7.69,7.92,7.79,8.13,7.95,8.08,8.08,
+8.16,8.06,8.22,8.06,8.19,8.25,8.21,8.21,8.29,8.35,
+8.47,8.41,8.45,8.36,8.38,8.36,8.53,8.52,8.67,8.71,
+0.23,0.22,0.23,0.27,0.30,0.33,0.34,0.38,0.37,0.39,
+0.43,0.46,0.44,0.47,0.51,0.54,0.51,0.56,0.57,0.59,
+0.66,0.66,0.67,0.67,0.69,0.75,0.79,0.80,0.77,0.84,
+0.84,0.87,0.82,0.86,0.90,0.93,0.93,0.99,0.98,0.94,
+1.02,1.08,1.02,1.08,1.17,1.17,1.15,1.18,1.21,1.27,
+1.28,1.27,1.25,1.36,1.36,1.29,1.39,1.39,1.35,1.51,
+1.41,1.42,1.55,1.49,1.60,1.51,1.60,1.64,1.58,1.58,
+1.67,1.68,1.68,1.60,1.70,1.75,1.77,1.75,1.83,1.82,
+1.85,1.94,1.97,1.88,1.96,2.00,2.02,2.02,2.09,2.02,
+2.07,2.12,2.17,2.13,2.16,2.15,2.17,2.14,2.27,2.27,
+2.27,2.33,2.35,2.39,2.47,2.37,2.38,2.43,2.54,2.47,
+2.51,2.51,2.50,2.58,2.63,2.61,2.59,2.57,2.71,2.70,
+2.71,2.69,2.68,2.78,2.78,2.81,2.80,2.80,2.81,2.87,
+2.95,3.11,2.91,2.92,2.92,3.04,2.96,3.06,3.06,3.13,
+3.08,3.12,3.11,3.20,3.23,3.19,3.21,3.23,3.32,3.28,
+3.43,3.25,3.35,3.36,3.47,3.44,3.40,3.46,3.38,3.45,
+3.54,3.60,3.46,3.61,3.57,3.62,3.67,3.67,3.57,3.80,
+3.73,3.85,3.78,3.77,3.83,3.84,3.83,3.80,4.04,3.98,
+3.90,3.90,4.01,3.92,4.00,4.06,4.08,4.15,4.08,4.17,
+4.14,4.15,4.18,4.11,4.31,4.18,4.26,4.27,4.25,4.29,
+4.28,4.37,4.49,4.31,4.37,4.39,4.44,4.53,4.53,4.53,
+4.55,4.49,4.67,4.58,4.62,4.51,4.66,4.76,4.65,4.82,
+4.60,4.82,4.70,4.87,4.88,4.78,4.95,4.96,4.87,4.96,
+4.92,5.02,4.92,4.99,4.94,5.02,5.06,5.08,5.04,5.14,
+5.13,5.23,5.17,5.25,5.25,5.26,5.19,5.32,5.30,5.46,
+5.44,5.43,5.49,5.29,5.43,5.61,5.50,5.59,5.58,5.60,
+5.62,5.63,5.77,5.76,5.62,5.62,5.58,5.78,5.73,5.71,
+5.79,5.78,5.81,5.79,5.74,5.87,6.03,5.95,6.06,5.92,
+5.95,6.06,6.07,5.91,6.03,6.04,5.99,6.15,6.25,6.18,
+0.15,0.18,0.19,0.20,0.21,0.22,0.23,0.27,0.28,0.31,
+0.27,0.32,0.34,0.32,0.34,0.35,0.42,0.41,0.44,0.42,
+0.46,0.46,0.47,0.45,0.51,0.52,0.52,0.55,0.60,0.56,
+0.63,0.63,0.65,0.67,0.61,0.67,0.70,0.73,0.74,0.74,
+0.75,0.76,0.79,0.77,0.83,0.74,0.83,0.86,0.87,0.92,
+0.88,0.86,0.89,0.95,0.97,0.96,1.03,1.06,1.05,1.03,
+1.08,1.09,1.11,1.09,1.08,1.11,1.15,1.17,1.16,1.12,
+1.19,1.26,1.18,1.23,1.25,1.24,1.30,1.35,1.32,1.38,
+1.38,1.33,1.33,1.40,1.47,1.42,1.47,1.44,1.51,1.47,
+1.50,1.47,1.51,1.48,1.51,1.57,1.57,1.63,1.55,1.65,
+1.63,1.65,1.67,1.73,1.67,1.67,1.75,1.76,1.74,1.81,
+1.78,1.80,1.81,1.87,1.84,1.93,1.88,1.96,1.97,1.91,
+1.94,2.00,1.99,2.00,2.03,1.97,1.98,2.04,2.00,2.00,
+2.06,2.10,2.08,2.12,2.20,2.19,2.20,2.22,2.13,2.23,
+2.24,2.25,2.25,2.21,2.30,2.40,2.34,2.39,2.35,2.32,
+2.35,2.36,2.45,2.42,2.42,2.47,2.48,2.54,2.59,2.56,
+2.57,2.57,2.57,2.67,2.65,2.61,2.63,2.62,2.62,2.67,
+2.77,2.73,2.71,2.81,2.70,2.87,2.83,2.84,2.77,2.84,
+2.78,2.83,2.94,2.96,2.96,2.93,2.96,2.99,2.95,3.05,
+2.97,3.06,2.98,2.97,3.09,3.02,3.13,3.10,3.01,3.07,
+3.13,3.19,3.15,3.17,3.25,3.20,3.19,3.26,3.24,3.24,
+3.23,3.29,3.39,3.22,3.49,3.41,3.35,3.47,3.37,3.40,
+3.40,3.42,3.42,3.44,3.57,3.44,3.47,3.58,3.63,3.58,
+3.61,3.60,3.69,3.67,3.75,3.65,3.46,3.74,3.75,3.67,
+3.85,3.65,3.76,3.79,3.76,3.81,3.75,3.94,3.84,3.86,
+3.92,3.93,3.88,3.99,4.01,3.95,4.12,4.08,4.04,4.00,
+4.14,3.94,4.01,4.01,4.13,4.10,4.03,4.15,4.13,4.11,
+3.98,4.20,4.21,4.29,4.22,4.21,4.20,4.31,4.34,4.34,
+4.37,4.27,4.37,4.40,4.31,4.45,4.47,4.43,4.54,4.53,
+0.12,0.11,0.14,0.16,0.16,0.17,0.16,0.17,0.23,0.21,
+0.24,0.21,0.26,0.25,0.26,0.29,0.26,0.28,0.30,0.31,
+0.32,0.29,0.34,0.34,0.34,0.40,0.39,0.38,0.43,0.40,
+0.41,0.48,0.45,0.45,0.48,0.50,0.51,0.48,0.52,0.52,
+0.52,0.54,0.51,0.55,0.59,0.55,0.64,0.60,0.61,0.61,
+0.64,0.66,0.67,0.68,0.69,0.66,0.72,0.74,0.74,0.76,
+0.75,0.81,0.81,0.77,0.82,0.77,0.87,0.84,0.88,0.82,
+0.89,0.84,0.94,0.92,0.92,0.88,0.94,0.89,0.97,0.91,
+0.96,0.94,0.97,1.07,1.01,0.98,1.02,1.01,1.10,1.09,
+1.07,1.10,1.10,1.16,1.10,1.08,1.10,1.10,1.16,1.16,
+1.19,1.21,1.25,1.21,1.21,1.25,1.24,1.22,1.24,1.24,
+1.29,1.29,1.32,1.34,1.35,1.29,1.34,1.34,1.37,1.43,
+1.43,1.35,1.49,1.39,1.39,1.50,1.43,1.49,1.46,1.46,
+1.52,1.44,1.54,1.59,1.51,1.55,1.56,1.53,1.54,1.53,
+1.60,1.58,1.60,1.73,1.63,1.67,1.66,1.62,1.64,1.70,
+1.71,1.76,1.78,1.73,1.80,1.76,1.75,1.85,1.78,1.85,
+1.84,1.84,1.89,1.85,1.85,1.99,1.97,1.89,1.86,1.91,
+1.91,1.89,2.00,1.98,1.97,2.01,1.97,2.03,2.05,2.04,
+2.01,2.03,2.01,2.03,2.10,2.04,2.18,2.25,2.10,2.11,
+2.07,2.22,2.14,2.20,2.15,2.20,2.19,2.27,2.15,2.29,
+2.28,2.24,2.25,2.30,2.32,2.36,2.31,2.41,2.36,2.32,
+2.37,2.37,2.38,2.45,2.34,2.40,2.48,2.42,2.43,2.47,
+2.57,2.57,2.50,2.56,2.46,2.55,2.50,2.47,2.52,2.62,
+2.64,2.52,2.64,2.61,2.54,2.68,2.67,2.61,2.74,2.69,
+2.70,2.65,2.81,2.73,2.71,2.69,2.71,2.76,2.85,2.83,
+2.84,2.85,2.83,2.88,2.81,2.72,2.91,2.84,2.90,2.85,
+2.96,2.88,2.91,3.03,3.03,2.87,2.97,2.96,3.01,2.98,
+3.12,3.04,3.06,3.03,3.03,3.08,3.11,3.08,3.10,3.13,
+3.09,3.21,3.19,3.18,3.24,3.24,3.21,3.19,3.17,3.20,
+0.08,0.09,0.08,0.09,0.13,0.10,0.14,0.12,0.14,0.17,
+0.16,0.16,0.16,0.17,0.20,0.19,0.19,0.20,0.22,0.21,
+0.24,0.24,0.25,0.27,0.27,0.28,0.27,0.30,0.29,0.33,
+0.31,0.31,0.32,0.35,0.33,0.35,0.36,0.36,0.35,0.37,
+0.40,0.42,0.38,0.41,0.40,0.45,0.45,0.45,0.42,0.44,
+0.48,0.49,0.43,0.48,0.50,0.50,0.53,0.51,0.50,0.54,
+0.57,0.58,0.51,0.59,0.54,0.52,0.57,0.58,0.61,0.62,
+0.62,0.61,0.65,0.63,0.67,0.64,0.66,0.66,0.69,0.68,
+0.68,0.68,0.73,0.68,0.70,0.73,0.78,0.78,0.73,0.79,
+0.75,0.77,0.77,0.84,0.75,0.78,0.83,0.86,0.91,0.89,
+0.82,0.83,0.85,0.84,0.92,0.86,0.94,0.89,0.89,0.86,
+0.92,0.85,0.93,0.90,0.98,0.95,0.98,1.00,0.94,1.02,
+0.96,0.98,1.02,0.99,1.00,1.04,1.06,1.04,1.06,1.12,
+1.08,1.06,1.11,1.07,1.11,1.08,1.10,1.09,1.14,1.14,
+1.15,1.13,1.17,1.15,1.24,1.22,1.19,1.18,1.24,1.20,
+1.35,1.21,1.21,1.27,1.28,1.32,1.26,1.24,1.36,1.31,
+1.32,1.33,1.27,1.32,1.32,1.37,1.36,1.33,1.43,1.38,
+1.39,1.37,1.42,1.50,1.38,1.41,1.38,1.47,1.40,1.47,
+1.48,1.52,1.46,1.51,1.48,1.55,1.52,1.54,1.58,1.58,
+1.56,1.59,1.58,1.53,1.56,1.58,1.63,1.57,1.60,1.53,
+1.66,1.65,1.68,1.61,1.65,1.64,1.67,1.65,1.70,1.68,
+1.68,1.69,1.64,1.77,1.71,1.74,1.73,1.85,1.75,1.75,
+1.75,1.74,1.77,1.84,1.79,1.89,1.83,1.78,1.93,1.88,
+1.76,1.88,1.90,1.88,1.91,1.91,1.84,1.95,1.96,1.94,
+1.99,1.92,2.04,1.97,1.94,1.96,1.99,1.98,2.00,2.06,
+2.04,1.97,2.00,2.00,2.10,2.01,2.08,2.02,2.07,2.08,
+2.10,2.19,2.10,2.15,2.12,2.09,2.22,2.08,2.16,2.17,
+2.16,2.18,2.18,2.21,2.20,2.12,2.28,2.20,2.10,2.11,
+2.15,2.29,2.26,2.22,2.23,2.23,2.31,2.33,2.30,2.28,
+0.06,0.07,0.07,0.09,0.07,0.09,0.08,0.09,0.12,0.12,
+0.10,0.13,0.13,0.10,0.14,0.16,0.15,0.16,0.14,0.17,
+0.17,0.18,0.18,0.19,0.20,0.21,0.18,0.21,0.21,0.22,
+0.22,0.21,0.23,0.24,0.24,0.28,0.24,0.27,0.26,0.28,
+0.24,0.29,0.29,0.30,0.30,0.32,0.29,0.30,0.32,0.36,
+0.34,0.33,0.38,0.37,0.35,0.37,0.38,0.36,0.39,0.37,
+0.40,0.43,0.38,0.40,0.41,0.42,0.44,0.39,0.43,0.44,
+0.40,0.47,0.43,0.44,0.48,0.52,0.44,0.48,0.50,0.50,
+0.50,0.52,0.49,0.53,0.57,0.50,0.57,0.56,0.59,0.57,
+0.58,0.54,0.57,0.54,0.60,0.60,0.61,0.58,0.62,0.63,
+0.60,0.63,0.65,0.64,0.68,0.63,0.63,0.62,0.67,0.65,
+0.65,0.67,0.66,0.71,0.71,0.69,0.74,0.72,0.69,0.74,
+0.69,0.73,0.73,0.72,0.76,0.77,0.74,0.76,0.79,0.81,
+0.78,0.80,0.80,0.79,0.83,0.83,0.80,0.87,0.80,0.82,
+0.79,0.85,0.80,0.84,0.82,0.86,0.86,0.85,0.83,0.91,
+0.91,0.90,0.94,0.91,0.92,0.89,0.95,0.87,0.96,0.96,
+0.93,0.99,0.95,0.94,0.94,1.04,0.93,1.02,1.02,1.00,
+1.03,1.02,1.01,1.04,1.01,1.00,1.02,1.03,1.01,1.15,
+1.06,1.06,1.08,1.12,1.12,1.07,1.06,1.12,1.06,1.12,
+1.14,1.07,1.14,1.10,1.14,1.11,1.17,1.17,1.13,1.18,
+1.19,1.20,1.18,1.20,1.23,1.16,1.25,1.24,1.22,1.26,
+1.27,1.19,1.28,1.29,1.14,1.23,1.22,1.28,1.23,1.25,
+1.32,1.32,1.29,1.25,1.35,1.35,1.32,1.35,1.30,1.36,
+1.40,1.35,1.38,1.39,1.35,1.37,1.34,1.36,1.31,1.42,
+1.41,1.41,1.41,1.39,1.46,1.33,1.44,1.41,1.39,1.48,
+1.42,1.47,1.46,1.52,1.55,1.54,1.51,1.44,1.55,1.51,
+1.54,1.47,1.45,1.58,1.55,1.47,1.56,1.49,1.60,1.53,
+1.59,1.63,1.55,1.58,1.62,1.54,1.56,1.54,1.59,1.57,
+1.63,1.66,1.66,1.60,1.68,1.67,1.62,1.69,1.67,1.69,
+0.05,0.04,0.05,0.06,0.06,0.07,0.06,0.06,0.08,0.07,
+0.09,0.10,0.08,0.10,0.11,0.09,0.10,0.11,0.11,0.11,
+0.12,0.11,0.13,0.12,0.15,0.15,0.14,0.14,0.15,0.16,
+0.18,0.16,0.17,0.16,0.22,0.18,0.19,0.17,0.19,0.21,
+0.21,0.21,0.21,0.21,0.22,0.19,0.25,0.21,0.23,0.24,
+0.26,0.25,0.23,0.26,0.25,0.28,0.27,0.26,0.26,0.26,
+0.26,0.27,0.28,0.30,0.30,0.30,0.29,0.31,0.31,0.31,
+0.30,0.30,0.33,0.34,0.33,0.30,0.34,0.34,0.37,0.34,
+0.35,0.37,0.37,0.35,0.40,0.36,0.38,0.38,0.41,0.36,
+0.36,0.39,0.39,0.41,0.42,0.43,0.43,0.45,0.44,0.45,
+0.45,0.43,0.45,0.47,0.43,0.48,0.47,0.47,0.48,0.51,
+0.50,0.51,0.51,0.51,0.51,0.49,0.51,0.56,0.49,0.52,
+0.55,0.50,0.55,0.57,0.54,0.50,0.55,0.56,0.56,0.57,
+0.53,0.55,0.58,0.57,0.60,0.59,0.56,0.61,0.62,0.62,
+0.60,0.56,0.63,0.60,0.60,0.59,0.65,0.67,0.69,0.61,
+0.60,0.66,0.61,0.66,0.66,0.62,0.68,0.67,0.74,0.67,
+0.70,0.66,0.64,0.70,0.71,0.71,0.68,0.70,0.74,0.73,
+0.73,0.75,0.73,0.74,0.77,0.75,0.76,0.72,0.77,0.78,
+0.76,0.75,0.75,0.78,0.82,0.79,0.84,0.77,0.78,0.80,
+0.78,0.83,0.82,0.79,0.85,0.84,0.79,0.81,0.89,0.82,
+0.81,0.81,0.88,0.84,0.84,0.89,0.87,0.87,0.81,0.88,
+0.90,0.89,0.88,0.92,0.86,0.92,0.89,0.88,0.91,0.96,
+0.90,0.94,0.90,0.91,0.90,1.00,0.96,0.93,0.92,1.00,
+0.97,0.94,0.94,0.94,0.99,0.97,1.00,0.98,1.00,1.06,
+0.99,1.05,0.98,1.01,1.00,1.02,1.05,1.06,1.00,1.00,
+1.03,1.00,1.01,1.06,1.09,1.00,1.04,1.08,1.14,1.12,
+1.04,1.13,1.09,1.10,1.15,1.09,1.06,1.15,1.08,1.07,
+1.14,1.16,1.15,1.09,1.10,1.14,1.17,1.15,1.16,1.17,
+1.17,1.14,1.23,1.19,1.19,1.24,1.23,1.16,1.11,1.17,
+0.02,0.02,0.03,0.04,0.05,0.06,0.04,0.05,0.05,0.07,
+0.04,0.06,0.06,0.07,0.07,0.08,0.08,0.07,0.07,0.07,
+0.09,0.09,0.09,0.10,0.10,0.10,0.11,0.10,0.11,0.12,
+0.11,0.11,0.13,0.11,0.13,0.10,0.13,0.14,0.12,0.12,
+0.16,0.16,0.15,0.14,0.16,0.15,0.16,0.16,0.16,0.18,
+0.17,0.17,0.17,0.19,0.16,0.19,0.19,0.18,0.20,0.20,
+0.21,0.19,0.22,0.21,0.24,0.21,0.21,0.19,0.20,0.23,
+0.23,0.20,0.27,0.26,0.24,0.24,0.24,0.28,0.27,0.24,
+0.27,0.28,0.28,0.27,0.28,0.28,0.27,0.25,0.29,0.28,
+0.31,0.30,0.29,0.29,0.31,0.29,0.34,0.33,0.31,0.30,
+0.30,0.31,0.32,0.31,0.37,0.31,0.37,0.35,0.34,0.37,
+0.34,0.35,0.39,0.36,0.39,0.36,0.40,0.37,0.39,0.39,
+0.36,0.35,0.41,0.36,0.37,0.42,0.41,0.40,0.37,0.40,
+0.40,0.43,0.41,0.41,0.40,0.43,0.36,0.41,0.43,0.43,
+0.45,0.41,0.41,0.44,0.46,0.46,0.44,0.45,0.41,0.46,
+0.50,0.44,0.44,0.48,0.47,0.48,0.42,0.50,0.50,0.46,
+0.49,0.51,0.51,0.51,0.53,0.51,0.52,0.49,0.48,0.54,
+0.53,0.56,0.54,0.50,0.54,0.53,0.52,0.50,0.56,0.54,
+0.56,0.52,0.55,0.54,0.58,0.58,0.54,0.60,0.54,0.58,
+0.58,0.58,0.62,0.60,0.58,0.62,0.61,0.63,0.66,0.60,
+0.60,0.62,0.60,0.63,0.63,0.65,0.64,0.66,0.67,0.60,
+0.63,0.64,0.62,0.66,0.62,0.61,0.67,0.65,0.64,0.62,
+0.64,0.65,0.66,0.65,0.67,0.71,0.70,0.71,0.71,0.68,
+0.74,0.70,0.76,0.71,0.69,0.72,0.74,0.69,0.68,0.68,
+0.76,0.73,0.70,0.73,0.73,0.77,0.72,0.74,0.73,0.77,
+0.68,0.81,0.75,0.79,0.78,0.77,0.78,0.74,0.73,0.75,
+0.84,0.76,0.75,0.79,0.80,0.79,0.79,0.82,0.82,0.80,
+0.81,0.79,0.81,0.84,0.81,0.87,0.83,0.89,0.89,0.85,
+0.88,0.85,0.84,0.86,0.82,0.84,0.79,0.85,0.91,0.90,
+0.03,0.02,0.03,0.03,0.03,0.04,0.04,0.04,0.04,0.04,
+0.04,0.04,0.04,0.05,0.04,0.06,0.04,0.06,0.05,0.07,
+0.07,0.06,0.07,0.09,0.07,0.08,0.09,0.08,0.10,0.07,
+0.09,0.09,0.08,0.09,0.10,0.11,0.10,0.12,0.10,0.10,
+0.10,0.11,0.12,0.12,0.09,0.12,0.11,0.11,0.12,0.12,
+0.11,0.13,0.12,0.14,0.12,0.15,0.15,0.16,0.16,0.13,
+0.13,0.15,0.15,0.17,0.15,0.18,0.16,0.15,0.20,0.17,
+0.15,0.16,0.17,0.18,0.16,0.17,0.17,0.18,0.19,0.19,
+0.19,0.19,0.17,0.16,0.20,0.21,0.17,0.18,0.21,0.22,
+0.21,0.21,0.20,0.23,0.23,0.20,0.24,0.23,0.17,0.21,
+0.21,0.23,0.24,0.23,0.23,0.26,0.24,0.24,0.24,0.24,
+0.25,0.25,0.26,0.24,0.25,0.24,0.26,0.27,0.26,0.28,
+0.25,0.24,0.28,0.30,0.30,0.28,0.27,0.32,0.32,0.31,
+0.29,0.29,0.28,0.29,0.31,0.32,0.34,0.30,0.33,0.31,
+0.31,0.32,0.32,0.30,0.33,0.31,0.28,0.33,0.32,0.33,
+0.33,0.32,0.33,0.32,0.35,0.34,0.37,0.34,0.35,0.36,
+0.33,0.34,0.39,0.37,0.37,0.36,0.36,0.36,0.35,0.37,
+0.38,0.39,0.38,0.40,0.38,0.40,0.39,0.40,0.40,0.39,
+0.35,0.41,0.37,0.44,0.41,0.41,0.45,0.38,0.39,0.40,
+0.47,0.45,0.45,0.42,0.46,0.43,0.45,0.38,0.41,0.40,
+0.48,0.42,0.44,0.44,0.47,0.44,0.46,0.47,0.44,0.48,
+0.44,0.50,0.46,0.47,0.49,0.47,0.48,0.50,0.48,0.50,
+0.48,0.50,0.49,0.49,0.48,0.50,0.52,0.51,0.49,0.50,
+0.45,0.52,0.50,0.48,0.50,0.49,0.49,0.56,0.50,0.52,
+0.54,0.52,0.49,0.54,0.55,0.54,0.57,0.54,0.55,0.54,
+0.54,0.52,0.56,0.54,0.50,0.53,0.56,0.53,0.52,0.58,
+0.55,0.56,0.61,0.57,0.60,0.58,0.59,0.56,0.54,0.58,
+0.59,0.57,0.60,0.61,0.59,0.61,0.58,0.61,0.56,0.58,
+0.59,0.58,0.65,0.58,0.64,0.64,0.61,0.61,0.67,0.63,
+0.01,0.01,0.02,0.02,0.02,0.03,0.02,0.01,0.04,0.03,
+0.03,0.04,0.03,0.04,0.03,0.04,0.05,0.05,0.04,0.04,
+0.04,0.05,0.05,0.06,0.06,0.04,0.06,0.05,0.06,0.06,
+0.05,0.06,0.07,0.08,0.06,0.06,0.07,0.08,0.07,0.05,
+0.08,0.09,0.08,0.08,0.08,0.07,0.08,0.08,0.08,0.08,
+0.10,0.10,0.09,0.07,0.10,0.09,0.10,0.10,0.11,0.12,
+0.10,0.10,0.12,0.10,0.11,0.12,0.11,0.12,0.11,0.13,
+0.12,0.13,0.12,0.14,0.13,0.14,0.12,0.14,0.14,0.14,
+0.17,0.14,0.12,0.16,0.13,0.16,0.15,0.14,0.15,0.14,
+0.15,0.16,0.16,0.15,0.15,0.16,0.16,0.17,0.17,0.16,
+0.15,0.17,0.18,0.15,0.16,0.17,0.17,0.18,0.19,0.20,
+0.19,0.19,0.17,0.18,0.22,0.20,0.18,0.17,0.18,0.22,
+0.21,0.18,0.22,0.22,0.19,0.21,0.21,0.20,0.20,0.22,
+0.21,0.24,0.21,0.23,0.23,0.23,0.22,0.23,0.25,0.21,
+0.22,0.23,0.24,0.25,0.22,0.24,0.23,0.26,0.23,0.23,
+0.23,0.24,0.24,0.26,0.24,0.23,0.29,0.27,0.22,0.27,
+0.24,0.27,0.28,0.27,0.26,0.28,0.26,0.27,0.26,0.25,
+0.25,0.28,0.28,0.27,0.26,0.28,0.28,0.26,0.31,0.26,
+0.27,0.29,0.29,0.28,0.27,0.30,0.29,0.31,0.27,0.33,
+0.30,0.25,0.31,0.31,0.29,0.34,0.34,0.30,0.30,0.29,
+0.32,0.31,0.30,0.32,0.31,0.34,0.31,0.34,0.33,0.32,
+0.32,0.32,0.32,0.36,0.36,0.35,0.35,0.35,0.35,0.37,
+0.34,0.34,0.38,0.35,0.33,0.37,0.37,0.38,0.37,0.36,
+0.37,0.33,0.38,0.37,0.35,0.36,0.38,0.36,0.35,0.36,
+0.38,0.39,0.37,0.39,0.39,0.38,0.35,0.40,0.35,0.39,
+0.37,0.38,0.40,0.39,0.43,0.35,0.40,0.42,0.38,0.40,
+0.42,0.39,0.39,0.44,0.38,0.41,0.42,0.41,0.39,0.41,
+0.42,0.42,0.44,0.43,0.46,0.42,0.42,0.38,0.42,0.46,
+0.42,0.40,0.45,0.44,0.46,0.44,0.44,0.43,0.45,0.44,
+0.01,0.01,0.01,0.02,0.01,0.01,0.02,0.02,0.02,0.02,
+0.02,0.02,0.03,0.02,0.02,0.02,0.03,0.02,0.02,0.03,
+0.03,0.04,0.04,0.05,0.04,0.04,0.04,0.04,0.04,0.06,
+0.04,0.04,0.04,0.05,0.05,0.04,0.05,0.05,0.05,0.05,
+0.04,0.08,0.06,0.07,0.06,0.05,0.05,0.06,0.07,0.07,
+0.07,0.07,0.07,0.06,0.08,0.07,0.06,0.07,0.09,0.08,
+0.06,0.08,0.07,0.07,0.10,0.09,0.09,0.11,0.09,0.08,
+0.08,0.09,0.08,0.09,0.09,0.09,0.09,0.10,0.09,0.08,
+0.12,0.10,0.08,0.11,0.10,0.13,0.10,0.09,0.11,0.10,
+0.10,0.11,0.10,0.10,0.10,0.09,0.12,0.11,0.11,0.12,
+0.13,0.12,0.11,0.11,0.12,0.12,0.13,0.12,0.13,0.14,
+0.13,0.14,0.13,0.13,0.13,0.12,0.13,0.13,0.13,0.15,
+0.14,0.13,0.14,0.16,0.15,0.14,0.14,0.14,0.15,0.15,
+0.14,0.15,0.15,0.16,0.15,0.15,0.14,0.17,0.18,0.16,
+0.18,0.17,0.17,0.14,0.19,0.16,0.17,0.17,0.18,0.21,
+0.17,0.17,0.16,0.18,0.23,0.17,0.18,0.19,0.16,0.20,
+0.18,0.17,0.18,0.20,0.18,0.19,0.22,0.17,0.19,0.19,
+0.20,0.21,0.22,0.19,0.19,0.18,0.23,0.20,0.20,0.18,
+0.20,0.20,0.21,0.21,0.21,0.24,0.20,0.22,0.22,0.23,
+0.20,0.20,0.20,0.26,0.23,0.22,0.21,0.23,0.23,0.21,
+0.25,0.23,0.25,0.24,0.24,0.23,0.24,0.25,0.23,0.22,
+0.23,0.24,0.24,0.28,0.22,0.24,0.21,0.25,0.25,0.24,
+0.25,0.23,0.25,0.25,0.22,0.23,0.28,0.29,0.25,0.28,
+0.26,0.25,0.26,0.28,0.27,0.30,0.24,0.24,0.25,0.28,
+0.27,0.28,0.26,0.29,0.28,0.31,0.28,0.26,0.29,0.25,
+0.27,0.26,0.28,0.27,0.27,0.29,0.30,0.32,0.29,0.30,
+0.34,0.28,0.31,0.28,0.31,0.29,0.30,0.32,0.30,0.31,
+0.35,0.28,0.31,0.31,0.35,0.31,0.32,0.31,0.35,0.32,
+0.31,0.32,0.36,0.31,0.32,0.32,0.30,0.30,0.31,0.30,
+1.21,1.35,1.57,1.60,1.78,1.87,2.02,2.05,2.27,2.32,
+2.50,2.53,2.65,2.85,2.90,3.05,3.14,3.26,3.35,3.43,
+3.62,3.81,3.83,4.00,4.03,4.18,4.32,4.57,4.60,4.70,
+4.79,4.91,4.95,5.21,5.36,5.53,5.58,5.67,5.82,5.78,
+6.08,6.08,6.24,6.42,6.51,6.70,6.80,6.83,6.99,7.11,
+7.27,7.34,7.49,7.68,7.60,7.95,7.94,8.09,8.12,8.31,
+8.45,8.49,8.62,8.65,8.97,9.03,9.05,9.33,9.40,9.55,
+9.74,9.77,9.86,10.04,10.12,10.18,10.34,10.40,10.85,10.82,
+10.77,11.02,11.22,11.08,11.23,11.31,11.66,11.70,11.83,12.08,
+12.05,12.17,12.27,12.50,12.58,12.69,12.72,12.86,12.90,13.18,
+13.22,13.35,13.51,13.57,13.58,13.79,13.91,13.93,14.23,14.17,
+14.43,14.53,14.87,14.59,14.89,14.98,15.11,15.30,15.37,15.42,
+15.57,15.81,15.70,15.83,16.25,16.14,16.43,16.58,16.49,16.63,
+16.75,17.10,17.09,17.11,17.47,17.35,17.62,17.70,17.91,17.80,
+17.77,18.18,18.10,18.60,18.45,18.62,18.80,18.89,18.95,19.33,
+19.07,19.04,19.52,19.57,19.61,19.78,19.98,20.25,20.20,20.39,
+20.42,20.53,20.68,20.90,20.98,21.21,20.99,21.17,21.43,21.51,
+21.61,21.95,22.01,21.96,22.19,22.09,22.23,22.46,22.60,22.57,
+22.84,22.93,22.96,23.33,23.26,23.27,23.74,23.79,23.88,23.84,
+24.15,24.14,24.24,24.40,24.63,24.68,25.01,24.97,24.93,25.07,
+25.38,25.22,25.45,25.73,25.57,25.80,26.09,25.99,26.22,26.30,
+26.53,26.46,26.68,26.63,27.13,26.95,27.28,27.25,27.25,27.57,
+27.58,27.81,27.71,28.01,28.14,28.58,28.48,28.31,28.46,28.63,
+28.63,29.00,29.23,29.44,29.55,29.63,29.48,29.61,29.83,29.68,
+30.28,29.98,30.16,30.39,30.46,30.52,30.50,31.04,30.89,31.29,
+31.28,31.53,31.45,31.84,32.04,31.99,32.10,32.10,32.41,32.31,
+32.57,32.49,32.47,32.91,32.95,32.84,33.20,33.66,33.46,33.39,
+33.55,33.87,33.81,33.99,34.38,34.09,34.11,34.22,34.46,34.85,
+34.95,35.09,34.81,35.07,35.34,35.57,35.61,35.43,35.72,35.92,
+0.89,0.98,1.08,1.16,1.29,1.38,1.40,1.50,1.62,1.64,
+1.79,1.94,1.96,2.04,2.16,2.23,2.25,2.38,2.54,2.53,
+2.59,2.71,2.74,2.87,3.08,3.01,3.14,3.37,3.33,3.53,
+3.44,3.60,3.72,3.79,3.83,3.90,4.07,4.27,4.21,4.40,
+4.45,4.58,4.53,4.64,4.75,4.87,4.86,5.01,5.15,5.21,
+5.25,5.46,5.41,5.69,5.68,5.80,5.78,5.93,6.00,6.00,
+6.18,6.31,6.34,6.34,6.57,6.64,6.63,6.83,6.88,6.85,
+7.10,7.22,7.17,7.18,7.34,7.37,7.63,7.69,7.76,7.80,
+7.99,7.97,8.09,8.24,8.23,8.48,8.41,8.65,8.64,8.71,
+8.81,8.83,9.04,9.05,9.16,9.25,9.24,9.45,9.47,9.64,
+9.63,9.83,9.99,9.88,9.94,10.11,10.26,10.10,10.41,10.48,
+10.60,10.52,10.80,10.80,10.76,10.92,11.11,11.12,11.15,11.48,
+11.47,11.41,11.52,11.73,11.84,11.99,11.91,11.97,12.12,12.21,
+12.27,12.47,12.37,12.55,12.84,12.58,12.86,12.62,12.93,12.99,
+13.11,13.22,13.20,13.34,13.61,13.61,13.77,13.72,13.86,13.86,
+14.17,14.02,14.42,14.35,14.43,14.40,14.81,14.79,14.86,14.87,
+14.88,14.87,15.18,15.26,15.32,15.17,15.43,15.65,15.60,15.63,
+15.58,15.82,15.97,15.91,16.04,16.30,16.40,16.30,16.58,16.68,
+16.64,16.92,17.06,16.81,17.20,17.38,17.07,17.45,17.42,17.63,
+17.70,17.75,17.89,17.69,18.05,17.95,17.99,18.15,18.39,18.34,
+18.60,18.45,18.65,18.80,19.02,18.96,19.08,19.08,18.91,19.28,
+19.43,19.58,19.43,19.42,19.82,19.80,19.86,19.89,20.17,19.93,
+20.47,20.38,20.26,20.31,20.44,20.51,20.62,20.89,20.80,21.13,
+21.12,21.36,21.36,21.33,21.39,21.54,21.71,21.78,21.57,21.74,
+21.87,22.20,22.27,22.20,22.02,22.40,22.50,22.38,22.76,22.48,
+22.94,22.86,22.96,23.03,23.16,23.29,23.56,23.54,23.48,23.41,
+23.45,23.85,23.68,24.00,23.66,24.18,24.07,24.51,24.32,24.55,
+24.76,24.75,24.76,25.11,24.66,24.88,24.97,25.09,25.08,25.12,
+25.31,25.54,25.58,25.82,25.82,25.61,26.06,25.81,26.15,26.15,
+0.69,0.74,0.75,0.82,0.94,0.98,1.06,1.06,1.19,1.22,
+1.29,1.38,1.44,1.46,1.50,1.59,1.65,1.70,1.84,1.81,
+1.96,2.04,2.08,2.10,2.24,2.32,2.45,2.33,2.42,2.48,
+2.59,2.67,2.72,2.77,2.82,2.93,2.95,3.05,3.15,3.15,
+3.17,3.23,3.28,3.34,3.53,3.54,3.59,3.70,3.61,3.71,
+4.00,3.94,3.99,4.00,4.08,4.14,4.24,4.33,4.33,4.42,
+4.61,4.57,4.60,4.65,4.81,4.78,4.78,4.92,5.01,5.08,
+5.17,5.15,5.13,5.19,5.43,5.60,5.50,5.61,5.53,5.80,
+5.70,5.76,5.97,6.05,6.10,6.06,6.18,6.25,6.42,6.37,
+6.49,6.49,6.57,6.72,6.62,6.83,6.74,6.83,6.96,7.00,
+7.02,7.10,7.24,7.20,7.34,7.51,7.48,7.49,7.56,7.74,
+7.67,7.84,7.74,7.98,8.03,8.01,8.15,8.17,8.00,8.19,
+8.32,8.35,8.39,8.60,8.66,8.57,8.67,8.77,8.98,8.94,
+8.96,8.85,9.07,9.13,9.13,9.39,9.41,9.51,9.50,9.38,
+9.71,9.57,9.80,9.88,9.79,9.99,9.93,9.95,10.03,10.24,
+10.33,10.24,10.38,10.49,10.36,10.48,10.67,10.75,10.78,10.82,
+10.80,10.98,10.85,11.06,11.15,11.23,11.12,11.54,11.30,11.47,
+11.47,11.48,11.99,11.75,11.60,11.93,11.88,12.00,12.11,12.19,
+12.18,12.21,12.47,12.44,12.58,12.67,12.45,12.65,12.52,12.62,
+12.84,12.90,12.80,13.15,13.15,13.35,13.27,13.13,13.41,13.28,
+13.29,13.74,13.52,13.59,13.60,13.76,13.79,13.83,13.96,13.83,
+14.09,14.12,14.25,14.44,14.20,14.39,14.59,14.47,14.47,14.64,
+14.76,14.58,14.88,14.86,15.00,15.20,15.33,15.28,15.24,15.35,
+15.44,15.46,15.62,15.39,15.74,15.70,15.77,15.64,15.47,15.74,
+15.95,15.88,16.05,16.07,16.21,16.47,16.52,16.33,16.54,16.72,
+16.51,16.64,16.75,16.88,17.08,17.03,16.94,17.08,17.32,17.26,
+17.30,17.33,17.47,17.65,17.78,17.69,17.76,17.76,17.77,18.02,
+17.99,17.81,18.05,18.13,18.28,18.23,18.39,18.19,18.13,18.55,
+18.35,18.70,18.71,18.89,18.58,18.73,18.90,19.04,18.92,18.99,
+0.45,0.54,0.57,0.60,0.68,0.67,0.77,0.85,0.89,0.92,
+1.00,1.01,1.04,1.13,1.16,1.09,1.25,1.30,1.32,1.37,
+1.47,1.45,1.50,1.55,1.59,1.60,1.67,1.79,1.73,1.85,
+1.86,1.87,1.95,2.03,2.03,2.15,2.17,2.24,2.29,2.24,
+2.39,2.37,2.49,2.55,2.44,2.65,2.65,2.65,2.69,2.77,
+2.89,2.83,3.03,2.94,3.04,3.00,2.98,3.14,3.10,3.13,
+3.28,3.32,3.25,3.43,3.46,3.54,3.63,3.62,3.59,3.75,
+3.75,3.82,4.01,3.90,4.00,4.06,4.01,4.18,4.13,4.15,
+4.27,4.19,4.33,4.38,4.44,4.43,4.56,4.58,4.58,4.72,
+4.84,4.66,4.68,4.75,4.96,4.93,4.94,5.08,4.93,5.03,
+5.08,5.12,5.22,5.38,5.29,5.43,5.43,5.55,5.58,5.63,
+5.66,5.70,5.78,5.76,5.71,5.78,6.06,5.95,5.92,5.92,
+6.13,6.26,6.15,6.14,6.42,6.48,6.34,6.39,6.54,6.53,
+6.51,6.62,6.74,6.58,6.79,6.84,6.80,6.87,6.88,6.89,
+6.89,7.12,7.18,7.13,7.27,7.34,7.27,7.27,7.51,7.41,
+7.65,7.65,7.61,7.65,7.76,7.66,7.83,7.88,7.95,7.84,
+8.04,7.84,8.04,8.13,8.15,8.13,8.35,8.29,8.26,8.32,
+8.50,8.47,8.45,8.64,8.69,8.79,8.74,8.63,8.86,9.05,
+9.04,8.93,9.05,9.05,9.03,9.10,9.17,9.39,9.36,9.21,
+9.30,9.44,9.46,9.53,9.58,9.73,9.78,9.72,9.59,9.82,
+9.75,9.92,9.99,9.93,10.13,10.14,10.43,10.10,10.23,10.28,
+10.30,10.19,10.43,10.36,10.53,10.55,10.45,10.63,10.83,10.75,
+10.59,10.76,10.72,10.89,11.06,10.86,11.18,11.21,11.11,11.27,
+11.24,11.29,11.44,11.36,11.39,11.35,11.63,11.51,11.77,11.73,
+11.78,11.81,11.78,12.00,11.80,11.91,11.82,12.11,12.10,12.16,
+12.26,12.32,12.23,12.17,12.58,12.47,12.39,12.49,12.51,12.67,
+12.66,12.53,12.82,12.82,12.93,12.77,13.01,12.93,13.19,12.94,
+12.95,13.39,13.28,13.11,13.36,13.54,13.45,13.29,13.40,13.83,
+13.48,13.54,13.48,13.81,13.81,13.68,13.94,13.88,13.90,14.03,
+0.35,0.38,0.42,0.43,0.51,0.55,0.57,0.58,0.64,0.68,
+0.73,0.73,0.81,0.75,0.82,0.84,0.92,0.85,1.00,1.04,
+1.07,1.05,1.06,1.19,1.14,1.21,1.29,1.28,1.25,1.29,
+1.39,1.39,1.40,1.48,1.52,1.54,1.53,1.64,1.60,1.75,
+1.77,1.85,1.72,1.76,1.80,1.88,1.96,1.91,1.97,2.01,
+2.07,2.07,2.17,2.16,2.27,2.22,2.29,2.34,2.36,2.37,
+2.31,2.46,2.37,2.51,2.48,2.60,2.62,2.73,2.62,2.76,
+2.61,2.78,2.84,2.85,2.88,2.93,2.96,2.96,3.00,2.99,
+3.09,3.11,3.25,3.28,3.15,3.14,3.33,3.35,3.30,3.39,
+3.48,3.46,3.46,3.56,3.55,3.62,3.46,3.73,3.77,3.76,
+3.67,3.80,3.85,3.82,3.94,3.95,3.96,4.03,3.95,4.08,
+4.09,4.19,4.24,4.12,4.18,4.32,4.26,4.40,4.43,4.45,
+4.37,4.56,4.62,4.57,4.66,4.58,4.63,4.76,4.63,4.85,
+4.75,4.74,4.84,4.76,4.96,4.88,4.80,5.07,5.06,4.94,
+5.18,5.06,5.13,5.21,5.27,5.31,5.29,5.28,5.46,5.52,
+5.44,5.45,5.46,5.45,5.57,5.64,5.73,5.57,5.82,5.78,
+5.75,5.82,5.79,5.87,5.92,5.92,5.95,6.07,6.18,5.97,
+6.22,6.16,6.32,6.13,6.22,6.43,6.31,6.29,6.59,6.59,
+6.41,6.47,6.55,6.57,6.67,6.61,6.77,6.93,6.77,6.86,
+6.85,6.86,6.88,6.94,6.92,7.07,7.08,6.98,7.07,7.09,
+7.16,7.28,7.14,7.19,7.37,7.37,7.39,7.41,7.39,7.40,
+7.50,7.60,7.56,7.61,7.82,7.56,7.58,7.78,7.70,7.78,
+7.89,7.90,7.83,8.08,7.95,8.08,8.18,8.16,8.16,8.15,
+8.31,8.32,8.43,8.31,8.21,8.41,8.36,8.57,8.47,8.53,
+8.62,8.57,8.45,8.73,8.74,8.69,8.50,8.65,8.96,8.92,
+8.80,8.63,8.78,9.00,9.00,9.05,9.10,9.17,9.12,9.04,
+9.31,9.39,9.09,9.29,9.30,9.37,9.51,9.50,9.46,9.55,
+9.54,9.53,9.62,9.80,9.79,9.83,9.72,9.74,9.84,10.07,
+9.85,9.96,9.87,10.02,9.85,10.18,10.14,10.11,10.09,10.08,
+0.27,0.27,0.26,0.32,0.35,0.40,0.42,0.44,0.43,0.47,
+0.49,0.56,0.55,0.62,0.61,0.65,0.65,0.66,0.70,0.73,
+0.74,0.78,0.81,0.84,0.85,0.88,0.90,0.96,0.97,1.02,
+1.04,1.07,1.06,1.09,1.07,1.10,1.27,1.17,1.24,1.21,
+1.26,1.28,1.30,1.33,1.36,1.42,1.29,1.43,1.42,1.51,
+1.46,1.54,1.49,1.57,1.59,1.63,1.67,1.64,1.71,1.73,
+1.73,1.75,1.86,1.80,1.87,1.93,1.91,1.93,1.98,2.01,
+2.03,1.98,2.01,2.10,2.06,2.13,2.13,2.19,2.17,2.25,
+2.26,2.25,2.31,2.39,2.35,2.38,2.40,2.46,2.39,2.37,
+2.48,2.52,2.50,2.61,2.69,2.60,2.62,2.76,2.78,2.69,
+2.74,2.84,2.79,2.84,2.77,2.87,2.91,2.97,3.03,2.96,
+3.06,3.08,3.02,3.10,3.10,3.06,3.20,3.21,3.23,3.28,
+3.23,3.24,3.37,3.29,3.39,3.45,3.34,3.45,3.37,3.44,
+3.49,3.55,3.54,3.50,3.69,3.56,3.56,3.67,3.63,3.69,
+3.65,3.77,3.81,3.84,3.83,3.88,4.01,4.01,3.99,3.99,
+3.99,3.96,4.06,3.96,4.06,4.16,4.24,4.24,4.19,4.12,
+4.21,4.24,4.36,4.27,4.26,4.32,4.32,4.35,4.50,4.49,
+4.51,4.44,4.51,4.61,4.58,4.52,4.56,4.70,4.67,4.72,
+4.77,4.70,4.76,4.75,4.87,4.95,4.87,4.90,4.96,4.92,
+4.87,4.96,5.09,5.09,5.17,5.01,5.07,5.14,5.25,5.13,
+5.22,5.27,5.25,5.18,5.33,5.30,5.32,5.41,5.46,5.52,
+5.57,5.67,5.45,5.55,5.53,5.58,5.58,5.59,5.66,5.69,
+5.79,5.77,5.89,5.94,5.78,5.87,5.91,5.89,6.04,5.88,
+5.91,6.03,5.94,6.15,6.09,6.14,6.16,6.17,6.17,6.20,
+6.23,6.21,6.10,6.23,6.18,6.44,6.39,6.41,6.37,6.47,
+6.37,6.56,6.61,6.41,6.55,6.65,6.63,6.68,6.71,6.75,
+6.75,6.71,6.67,6.83,6.75,6.71,6.88,6.79,6.88,6.78,
+7.04,7.07,7.00,7.16,7.22,7.14,7.20,6.98,7.26,7.23,
+7.19,7.26,7.35,7.42,7.38,7.31,7.30,7.52,7.39,7.50,
+0.18,0.22,0.24,0.24,0.23,0.29,0.29,0.29,0.37,0.33,
+0.36,0.40,0.42,0.47,0.43,0.50,0.50,0.47,0.55,0.52,
+0.61,0.60,0.56,0.59,0.61,0.63,0.69,0.65,0.71,0.66,
+0.71,0.73,0.82,0.79,0.85,0.86,0.79,0.83,0.88,0.89,
+0.91,0.89,0.96,0.87,0.99,1.04,1.01,1.04,1.04,1.06,
+1.07,1.12,1.14,1.15,1.17,1.21,1.19,1.22,1.24,1.36,
+1.27,1.29,1.32,1.28,1.34,1.42,1.42,1.44,1.38,1.38,
+1.45,1.40,1.45,1.48,1.53,1.45,1.59,1.64,1.66,1.63,
+1.67,1.66,1.66,1.76,1.72,1.75,1.76,1.74,1.77,1.80,
+1.84,1.89,1.73,1.89,1.90,1.86,1.96,1.97,1.92,1.96,
+2.02,2.04,2.07,2.04,2.06,2.13,2.10,2.13,2.11,2.29,
+2.15,2.23,2.28,2.32,2.26,2.29,2.31,2.27,2.31,2.31,
+2.41,2.33,2.37,2.33,2.45,2.56,2.57,2.60,2.52,2.48,
+2.52,2.61,2.56,2.67,2.63,2.65,2.64,2.69,2.65,2.74,
+2.69,2.72,2.63,2.75,2.81,2.83,2.86,2.86,2.91,2.94,
+2.93,2.97,2.93,3.00,3.00,2.96,3.02,3.03,3.09,3.17,
+3.12,3.11,3.14,3.15,3.24,3.27,3.16,3.19,3.17,3.19,
+3.41,3.32,3.33,3.24,3.28,3.26,3.40,3.38,3.48,3.46,
+3.40,3.45,3.42,3.47,3.47,3.62,3.54,3.58,3.57,3.58,
+3.65,3.58,3.66,3.79,3.72,3.72,3.84,3.74,3.85,3.84,
+3.75,3.83,3.88,3.91,3.94,3.98,3.88,3.92,3.90,3.96,
+4.01,4.06,4.05,4.13,4.03,4.04,4.16,4.11,4.15,4.16,
+4.15,4.21,4.27,4.28,4.30,4.30,4.29,4.25,4.37,4.27,
+4.33,4.29,4.37,4.44,4.53,4.43,4.41,4.40,4.57,4.46,
+4.53,4.56,4.73,4.61,4.63,4.55,4.79,4.73,4.57,4.69,
+4.88,4.76,4.81,4.67,4.82,4.64,4.92,4.79,4.92,4.88,
+4.98,4.78,4.89,5.13,4.90,5.08,4.92,5.04,4.94,5.10,
+5.09,5.07,5.08,5.28,5.10,5.14,5.31,5.20,5.17,5.27,
+5.26,5.23,5.30,5.30,5.39,5.44,5.38,5.43,5.32,5.34,
+0.14,0.14,0.16,0.17,0.20,0.22,0.21,0.23,0.22,0.25,
+0.27,0.28,0.29,0.29,0.33,0.34,0.33,0.36,0.33,0.42,
+0.41,0.40,0.42,0.46,0.45,0.47,0.48,0.53,0.52,0.49,
+0.52,0.55,0.54,0.56,0.58,0.60,0.65,0.59,0.61,0.71,
+0.68,0.69,0.72,0.73,0.72,0.70,0.70,0.80,0.81,0.80,
+0.80,0.82,0.84,0.87,0.85,0.91,0.84,0.86,0.90,0.90,
+0.94,0.92,1.00,1.03,0.99,0.99,1.04,1.06,1.02,1.07,
+1.12,1.08,1.07,1.12,1.10,1.06,1.16,1.09,1.19,1.24,
+1.24,1.23,1.22,1.21,1.22,1.25,1.34,1.26,1.33,1.34,
+1.36,1.34,1.35,1.34,1.35,1.40,1.45,1.46,1.55,1.41,
+1.45,1.43,1.53,1.48,1.52,1.55,1.53,1.56,1.51,1.58,
+1.59,1.59,1.63,1.67,1.68,1.71,1.57,1.70,1.68,1.73,
+1.80,1.73,1.80,1.76,1.79,1.78,1.83,1.89,1.83,1.81,
+1.86,1.83,1.89,1.99,1.95,2.04,1.96,1.95,1.95,2.02,
+1.95,2.11,1.99,2.02,2.06,2.02,2.14,2.10,2.13,2.15,
+2.18,2.20,2.16,2.15,2.18,2.23,2.18,2.19,2.28,2.29,
+2.28,2.24,2.30,2.30,2.34,2.38,2.37,2.40,2.48,2.31,
+2.43,2.48,2.48,2.37,2.41,2.47,2.44,2.49,2.52,2.52,
+2.60,2.56,2.59,2.52,2.60,2.54,2.65,2.60,2.60,2.72,
+2.58,2.61,2.76,2.73,2.73,2.65,2.70,2.84,2.71,2.75,
+2.82,2.80,2.73,2.69,2.85,2.96,2.82,2.87,2.89,2.92,
+2.88,2.91,2.96,2.98,2.92,2.96,3.09,2.96,3.00,3.02,
+3.08,3.08,3.19,3.12,3.09,3.06,3.10,3.21,3.13,3.22,
+3.22,3.19,3.12,3.29,3.31,3.24,3.30,3.33,3.33,3.23,
+3.38,3.20,3.38,3.32,3.54,3.38,3.38,3.42,3.40,3.39,
+3.54,3.46,3.50,3.49,3.47,3.44,3.57,3.55,3.52,3.47,
+3.60,3.63,3.54,3.65,3.60,3.67,3.65,3.55,3.75,3.60,
+3.75,3.80,3.70,3.86,3.74,3.71,3.77,3.85,3.87,3.75,
+3.83,3.77,3.90,3.94,3.80,3.85,3.98,4.00,3.95,3.93,
+0.09,0.10,0.11,0.15,0.12,0.14,0.15,0.17,0.16,0.21,
+0.19,0.23,0.19,0.24,0.23,0.26,0.26,0.27,0.29,0.28,
+0.31,0.29,0.34,0.30,0.29,0.35,0.36,0.35,0.39,0.36,
+0.38,0.39,0.43,0.41,0.44,0.42,0.44,0.47,0.47,0.47,
+0.48,0.47,0.48,0.51,0.52,0.54,0.55,0.60,0.60,0.58,
+0.56,0.58,0.61,0.59,0.59,0.67,0.65,0.68,0.65,0.69,
+0.70,0.69,0.70,0.74,0.68,0.74,0.77,0.76,0.78,0.76,
+0.75,0.84,0.77,0.82,0.82,0.79,0.83,0.84,0.88,0.91,
+0.83,0.85,0.89,0.95,0.93,0.92,0.95,0.92,0.92,0.96,
+0.95,1.02,1.00,0.95,1.00,1.03,1.01,1.05,1.09,1.04,
+1.09,1.14,1.08,1.07,1.14,1.11,1.16,1.20,1.14,1.16,
+1.15,1.17,1.19,1.23,1.18,1.19,1.20,1.28,1.17,1.20,
+1.27,1.29,1.27,1.25,1.33,1.32,1.33,1.31,1.35,1.34,
+1.37,1.36,1.40,1.37,1.42,1.45,1.42,1.36,1.45,1.42,
+1.51,1.46,1.47,1.50,1.44,1.50,1.50,1.55,1.50,1.53,
+1.53,1.54,1.55,1.66,1.64,1.60,1.65,1.67,1.59,1.58,
+1.62,1.68,1.69,1.60,1.69,1.75,1.68,1.70,1.80,1.72,
+1.74,1.75,1.77,1.68,1.89,1.80,1.74,1.90,1.82,1.89,
+1.90,1.80,1.86,1.80,1.85,1.94,1.80,1.96,1.90,1.95,
+1.97,1.97,1.92,1.96,2.01,2.03,2.02,2.02,1.97,2.04,
+2.05,2.09,2.08,2.10,2.05,2.08,2.02,2.12,2.06,2.15,
+2.18,2.10,2.18,2.18,2.22,2.20,2.24,2.13,2.30,2.34,
+2.28,2.19,2.23,2.22,2.29,2.27,2.33,2.27,2.28,2.33,
+2.34,2.28,2.37,2.37,2.46,2.46,2.46,2.35,2.39,2.40,
+2.44,2.46,2.47,2.56,2.49,2.46,2.44,2.43,2.52,2.49,
+2.48,2.55,2.52,2.54,2.63,2.60,2.55,2.57,2.63,2.59,
+2.57,2.69,2.57,2.71,2.58,2.76,2.74,2.82,2.71,2.71,
+2.62,2.63,2.73,2.65,2.80,2.78,2.81,2.81,2.75,2.81,
+2.75,2.77,2.89,2.86,2.87,2.92,2.86,2.81,2.85,2.88,
+0.07,0.09,0.09,0.10,0.09,0.10,0.11,0.11,0.14,0.14,
+0.15,0.13,0.16,0.15,0.19,0.19,0.20,0.18,0.22,0.19,
+0.18,0.20,0.24,0.22,0.24,0.26,0.21,0.25,0.28,0.28,
+0.27,0.29,0.29,0.33,0.31,0.31,0.34,0.35,0.34,0.34,
+0.34,0.38,0.38,0.37,0.40,0.37,0.39,0.39,0.42,0.43,
+0.42,0.44,0.44,0.43,0.45,0.48,0.45,0.47,0.46,0.52,
+0.48,0.53,0.51,0.47,0.52,0.53,0.54,0.53,0.55,0.55,
+0.51,0.57,0.57,0.62,0.60,0.62,0.63,0.61,0.63,0.66,
+0.66,0.65,0.66,0.68,0.66,0.70,0.76,0.64,0.70,0.69,
+0.69,0.70,0.74,0.71,0.75,0.74,0.75,0.78,0.73,0.76,
+0.81,0.82,0.82,0.84,0.80,0.77,0.88,0.87,0.84,0.86,
+0.88,0.79,0.90,0.89,0.89,0.82,0.88,0.89,0.90,0.91,
+0.88,0.93,0.97,1.00,0.95,0.97,0.94,0.92,1.00,1.05,
+1.00,0.97,1.02,1.02,1.01,1.04,1.02,0.99,1.06,1.07,
+1.06,1.07,1.09,1.11,1.03,1.12,1.12,1.14,1.06,1.17,
+1.13,1.13,1.15,1.22,1.18,1.10,1.20,1.19,1.17,1.12,
+1.21,1.20,1.19,1.19,1.19,1.20,1.31,1.33,1.24,1.22,
+1.33,1.20,1.22,1.26,1.40,1.28,1.33,1.36,1.30,1.34,
+1.37,1.25,1.39,1.39,1.39,1.37,1.38,1.39,1.41,1.42,
+1.34,1.49,1.40,1.45,1.46,1.37,1.51,1.48,1.48,1.53,
+1.48,1.47,1.58,1.45,1.54,1.53,1.52,1.58,1.56,1.60,
+1.51,1.56,1.60,1.50,1.59,1.54,1.56,1.62,1.58,1.65,
+1.62,1.59,1.60,1.63,1.63,1.63,1.66,1.72,1.68,1.71,
+1.70,1.69,1.74,1.74,1.75,1.70,1.72,1.71,1.76,1.72,
+1.80,1.74,1.85,1.79,1.81,1.79,1.80,1.77,1.87,1.85,
+1.84,1.84,1.83,1.83,1.86,1.73,1.98,1.87,1.90,1.85,
+1.86,1.90,1.84,1.88,1.94,1.93,1.96,1.89,1.95,1.99,
+2.03,1.98,1.98,2.06,1.99,1.99,2.08,2.02,2.00,2.03,
+2.07,1.98,2.04,2.08,2.05,2.06,2.06,2.03,2.12,2.23,
+0.05,0.06,0.06,0.06,0.07,0.07,0.10,0.09,0.07,0.09,
+0.09,0.11,0.09,0.12,0.14,0.15,0.14,0.14,0.14,0.16,
+0.16,0.18,0.19,0.15,0.18,0.18,0.19,0.18,0.23,0.20,
+0.21,0.20,0.23,0.23,0.23,0.22,0.25,0.24,0.26,0.22,
+0.24,0.29,0.27,0.29,0.26,0.28,0.27,0.30,0.31,0.29,
+0.30,0.34,0.34,0.33,0.28,0.37,0.33,0.36,0.34,0.36,
+0.38,0.36,0.34,0.36,0.36,0.36,0.42,0.41,0.45,0.38,
+0.41,0.40,0.41,0.42,0.46,0.43,0.43,0.47,0.45,0.47,
+0.47,0.47,0.46,0.47,0.51,0.48,0.49,0.47,0.50,0.50,
+0.51,0.54,0.50,0.51,0.51,0.56,0.56,0.55,0.60,0.55,
+0.60,0.57,0.59,0.62,0.61,0.58,0.62,0.61,0.61,0.59,
+0.61,0.62,0.62,0.64,0.69,0.65,0.66,0.64,0.64,0.67,
+0.74,0.68,0.69,0.66,0.70,0.70,0.66,0.74,0.74,0.75,
+0.78,0.76,0.77,0.71,0.73,0.72,0.81,0.78,0.83,0.74,
+0.83,0.79,0.78,0.82,0.78,0.79,0.80,0.79,0.83,0.88,
+0.85,0.83,0.85,0.78,0.86,0.87,0.89,0.82,0.91,0.93,
+0.90,0.83,0.86,0.92,0.88,0.96,0.89,0.94,0.91,0.92,
+0.96,0.92,0.91,0.94,0.93,1.01,0.98,0.95,0.99,0.96,
+1.01,0.96,0.94,1.07,0.98,1.00,0.98,1.08,1.00,1.04,
+1.03,1.07,1.03,1.06,1.07,1.05,1.08,1.08,1.06,1.10,
+1.07,1.08,1.09,1.12,1.14,1.12,1.15,1.13,1.10,1.15,
+1.09,1.18,1.19,1.11,1.14,1.18,1.16,1.15,1.13,1.15,
+1.14,1.18,1.21,1.18,1.21,1.21,1.33,1.22,1.25,1.24,
+1.29,1.18,1.25,1.25,1.26,1.27,1.22,1.32,1.28,1.29,
+1.33,1.33,1.27,1.30,1.33,1.29,1.32,1.33,1.36,1.40,
+1.38,1.31,1.37,1.29,1.32,1.33,1.35,1.41,1.39,1.39,
+1.34,1.41,1.43,1.39,1.42,1.43,1.34,1.39,1.40,1.48,
+1.42,1.45,1.45,1.43,1.44,1.49,1.54,1.49,1.46,1.49,
+1.47,1.51,1.55,1.46,1.44,1.55,1.53,1.53,1.53,1.57,
+0.04,0.04,0.06,0.04,0.06,0.05,0.07,0.05,0.04,0.08,
+0.08,0.09,0.08,0.09,0.09,0.10,0.09,0.11,0.10,0.14,
+0.12,0.12,0.12,0.12,0.12,0.14,0.15,0.12,0.14,0.14,
+0.15,0.17,0.15,0.17,0.13,0.17,0.16,0.17,0.17,0.18,
+0.18,0.20,0.19,0.20,0.20,0.20,0.20,0.23,0.24,0.23,
+0.20,0.23,0.23,0.22,0.23,0.26,0.25,0.24,0.26,0.27,
+0.27,0.28,0.28,0.26,0.28,0.29,0.27,0.29,0.29,0.30,
+0.29,0.31,0.31,0.34,0.31,0.32,0.33,0.33,0.36,0.36,
+0.30,0.34,0.34,0.36,0.33,0.36,0.38,0.34,0.34,0.40,
+0.37,0.36,0.41,0.38,0.44,0.37,0.42,0.42,0.39,0.42,
+0.38,0.42,0.45,0.44,0.42,0.46,0.45,0.44,0.43,0.47,
+0.42,0.46,0.43,0.47,0.47,0.46,0.49,0.46,0.50,0.46,
+0.45,0.51,0.50,0.50,0.51,0.52,0.51,0.52,0.56,0.53,
+0.54,0.54,0.51,0.52,0.54,0.53,0.53,0.58,0.56,0.60,
+0.55,0.59,0.60,0.56,0.57,0.64,0.56,0.59,0.64,0.62,
+0.61,0.58,0.58,0.58,0.61,0.65,0.59,0.60,0.62,0.63,
+0.66,0.66,0.67,0.64,0.66,0.65,0.67,0.67,0.64,0.69,
+0.66,0.68,0.69,0.68,0.73,0.66,0.69,0.69,0.68,0.72,
+0.70,0.73,0.73,0.69,0.73,0.75,0.73,0.75,0.79,0.74,
+0.73,0.77,0.76,0.77,0.75,0.81,0.81,0.76,0.74,0.76,
+0.79,0.79,0.79,0.83,0.86,0.85,0.85,0.83,0.87,0.80,
+0.82,0.86,0.83,0.83,0.90,0.84,0.85,0.84,0.81,0.91,
+0.84,0.87,0.94,0.82,0.92,0.84,0.87,0.86,0.93,0.82,
+0.92,0.92,0.84,0.94,0.94,0.89,0.90,0.93,0.93,0.91,
+0.87,0.93,0.94,0.89,0.95,0.92,0.94,0.92,0.97,0.92,
+0.96,1.03,1.02,1.03,0.98,1.06,1.03,0.95,0.99,0.97,
+1.02,0.98,1.01,1.01,1.05,1.05,1.05,1.03,1.00,1.01,
+1.01,1.09,1.03,1.11,1.08,1.07,1.06,1.07,1.12,1.04,
+1.06,1.11,1.15,1.10,1.17,1.13,1.06,1.13,1.16,1.15,
+0.03,0.02,0.03,0.02,0.03,0.04,0.05,0.04,0.04,0.05,
+0.06,0.05,0.07,0.07,0.06,0.07,0.06,0.08,0.07,0.08,
+0.07,0.08,0.09,0.08,0.09,0.08,0.10,0.10,0.11,0.12,
+0.12,0.12,0.10,0.12,0.11,0.12,0.12,0.16,0.14,0.14,
+0.14,0.14,0.11,0.14,0.13,0.13,0.14,0.16,0.16,0.16,
+0.17,0.15,0.17,0.17,0.18,0.17,0.19,0.20,0.18,0.21,
+0.18,0.22,0.22,0.21,0.20,0.20,0.22,0.21,0.23,0.21,
+0.24,0.21,0.22,0.21,0.22,0.24,0.23,0.24,0.26,0.25,
+0.28,0.25,0.24,0.27,0.26,0.31,0.23,0.25,0.27,0.27,
+0.28,0.28,0.27,0.28,0.27,0.30,0.28,0.27,0.33,0.28,
+0.30,0.31,0.31,0.30,0.32,0.33,0.32,0.30,0.31,0.32,
+0.30,0.29,0.34,0.33,0.36,0.36,0.33,0.35,0.33,0.35,
+0.39,0.38,0.38,0.35,0.38,0.37,0.39,0.37,0.37,0.40,
+0.37,0.42,0.38,0.41,0.39,0.39,0.39,0.44,0.42,0.38,
+0.41,0.43,0.45,0.45,0.42,0.44,0.43,0.45,0.46,0.49,
+0.45,0.46,0.43,0.49,0.44,0.45,0.47,0.43,0.45,0.49,
+0.47,0.48,0.51,0.44,0.47,0.46,0.46,0.50,0.50,0.53,
+0.48,0.49,0.54,0.49,0.48,0.48,0.51,0.52,0.52,0.55,
+0.48,0.54,0.55,0.53,0.51,0.52,0.55,0.54,0.57,0.57,
+0.53,0.53,0.54,0.55,0.61,0.55,0.57,0.53,0.57,0.58,
+0.60,0.56,0.59,0.61,0.58,0.58,0.59,0.59,0.64,0.57,
+0.63,0.64,0.63,0.63,0.62,0.61,0.69,0.61,0.62,0.63,
+0.62,0.62,0.64,0.64,0.62,0.63,0.66,0.62,0.69,0.65,
+0.64,0.69,0.66,0.69,0.63,0.64,0.67,0.68,0.70,0.65,
+0.72,0.70,0.65,0.71,0.70,0.72,0.72,0.72,0.73,0.69,
+0.72,0.68,0.69,0.78,0.72,0.73,0.73,0.72,0.73,0.73,
+0.76,0.73,0.77,0.76,0.73,0.73,0.73,0.76,0.74,0.78,
+0.81,0.81,0.74,0.80,0.78,0.78,0.85,0.81,0.82,0.75,
+0.74,0.85,0.78,0.80,0.87,0.81,0.82,0.79,0.82,0.81,
+0.01,0.02,0.03,0.03,0.02,0.03,0.03,0.04,0.04,0.03,
+0.04,0.04,0.04,0.06,0.06,0.04,0.06,0.05,0.06,0.05,
+0.06,0.07,0.07,0.07,0.07,0.07,0.08,0.08,0.06,0.08,
+0.09,0.08,0.08,0.08,0.09,0.08,0.10,0.09,0.10,0.08,
+0.10,0.11,0.10,0.10,0.12,0.09,0.11,0.11,0.11,0.10,
+0.11,0.11,0.13,0.13,0.12,0.12,0.13,0.13,0.15,0.12,
+0.13,0.13,0.17,0.15,0.15,0.16,0.16,0.16,0.16,0.17,
+0.15,0.15,0.15,0.17,0.19,0.16,0.17,0.16,0.16,0.18,
+0.19,0.17,0.18,0.18,0.18,0.20,0.19,0.17,0.19,0.21,
+0.18,0.20,0.19,0.22,0.21,0.20,0.23,0.23,0.21,0.22,
+0.22,0.23,0.21,0.24,0.25,0.23,0.24,0.23,0.23,0.23,
+0.25,0.23,0.21,0.22,0.25,0.28,0.27,0.22,0.28,0.24,
+0.23,0.24,0.24,0.26,0.26,0.27,0.29,0.29,0.27,0.28,
+0.27,0.28,0.29,0.28,0.29,0.31,0.31,0.31,0.31,0.30,
+0.33,0.30,0.32,0.31,0.28,0.32,0.32,0.32,0.34,0.33,
+0.31,0.33,0.33,0.33,0.37,0.33,0.33,0.35,0.35,0.34,
+0.35,0.35,0.38,0.36,0.34,0.34,0.32,0.35,0.34,0.36,
+0.34,0.32,0.38,0.39,0.36,0.37,0.40,0.35,0.37,0.41,
+0.38,0.39,0.36,0.41,0.42,0.40,0.39,0.42,0.41,0.42,
+0.37,0.42,0.41,0.42,0.44,0.43,0.41,0.41,0.41,0.43,
+0.41,0.42,0.42,0.45,0.39,0.43,0.43,0.44,0.45,0.43,
+0.45,0.48,0.45,0.43,0.44,0.48,0.44,0.48,0.45,0.49,
+0.45,0.46,0.50,0.50,0.46,0.48,0.51,0.48,0.50,0.50,
+0.46,0.47,0.47,0.46,0.50,0.47,0.47,0.46,0.45,0.52,
+0.52,0.51,0.49,0.47,0.51,0.50,0.51,0.54,0.52,0.53,
+0.49,0.51,0.50,0.51,0.57,0.51,0.55,0.54,0.57,0.56,
+0.52,0.55,0.53,0.55,0.52,0.52,0.57,0.58,0.55,0.57,
+0.54,0.57,0.59,0.60,0.58,0.56,0.56,0.62,0.56,0.55,
+0.58,0.61,0.59,0.62,0.59,0.58,0.57,0.60,0.60,0.60,
+0.01,0.01,0.01,0.02,0.02,0.03,0.03,0.03,0.03,0.04,
+0.04,0.04,0.03,0.02,0.03,0.04,0.03,0.04,0.05,0.04,
+0.04,0.05,0.04,0.05,0.04,0.05,0.07,0.05,0.06,0.05,
+0.07,0.07,0.06,0.07,0.07,0.07,0.07,0.06,0.07,0.09,
+0.06,0.07,0.09,0.07,0.08,0.09,0.09,0.09,0.08,0.08,
+0.09,0.09,0.09,0.10,0.10,0.09,0.08,0.11,0.10,0.10,
+0.10,0.11,0.11,0.09,0.13,0.10,0.10,0.11,0.09,0.13,
+0.12,0.10,0.11,0.13,0.12,0.13,0.10,0.11,0.13,0.13,
+0.14,0.15,0.13,0.14,0.14,0.15,0.15,0.13,0.15,0.15,
+0.14,0.17,0.15,0.13,0.16,0.14,0.15,0.14,0.16,0.16,
+0.15,0.15,0.17,0.16,0.15,0.18,0.17,0.17,0.16,0.15,
+0.19,0.16,0.20,0.19,0.19,0.19,0.18,0.20,0.21,0.18,
+0.19,0.21,0.19,0.21,0.18,0.20,0.18,0.21,0.18,0.21,
+0.22,0.21,0.21,0.23,0.20,0.20,0.24,0.22,0.22,0.23,
+0.18,0.18,0.21,0.22,0.21,0.23,0.22,0.25,0.23,0.23,
+0.26,0.27,0.24,0.24,0.23,0.26,0.25,0.25,0.29,0.22,
+0.26,0.26,0.26,0.24,0.26,0.23,0.24,0.25,0.27,0.26,
+0.24,0.25,0.28,0.28,0.24,0.28,0.27,0.27,0.29,0.26,
+0.26,0.29,0.28,0.27,0.30,0.29,0.30,0.31,0.29,0.29,
+0.28,0.28,0.30,0.32,0.32,0.33,0.31,0.29,0.32,0.30,
+0.28,0.30,0.34,0.35,0.28,0.32,0.30,0.33,0.32,0.32,
+0.34,0.33,0.36,0.32,0.30,0.34,0.35,0.33,0.36,0.30,
+0.32,0.35,0.34,0.37,0.36,0.33,0.33,0.33,0.36,0.34,
+0.34,0.37,0.34,0.38,0.38,0.35,0.38,0.38,0.37,0.39,
+0.32,0.36,0.37,0.36,0.36,0.35,0.39,0.35,0.36,0.37,
+0.41,0.37,0.37,0.38,0.36,0.39,0.39,0.40,0.42,0.42,
+0.41,0.41,0.42,0.39,0.41,0.41,0.36,0.41,0.41,0.41,
+0.43,0.42,0.39,0.41,0.44,0.39,0.44,0.42,0.41,0.42,
+0.45,0.45,0.44,0.41,0.42,0.47,0.44,0.44,0.45,0.46,
+1.37,1.51,1.64,1.73,1.99,2.05,2.18,2.30,2.47,2.55,
+2.71,2.79,3.08,3.14,3.38,3.43,3.54,3.71,3.85,3.92,
+4.12,4.19,4.36,4.49,4.57,4.81,4.92,4.98,5.22,5.33,
+5.42,5.58,5.63,5.84,5.89,6.03,6.15,6.35,6.50,6.59,
+6.72,6.88,6.94,7.13,7.22,7.48,7.44,7.70,7.77,8.01,
+8.06,8.35,8.36,8.53,8.60,8.86,8.73,9.02,9.15,9.18,
+9.54,9.40,9.63,9.86,10.13,9.97,10.37,10.43,10.59,10.66,
+10.64,10.79,11.13,11.11,11.33,11.51,11.49,11.74,11.86,11.98,
+12.10,12.04,12.52,12.70,12.51,12.75,12.93,12.95,13.13,13.27,
+13.54,13.72,13.70,13.86,14.09,14.32,14.07,14.25,14.53,14.71,
+14.84,14.97,15.23,15.19,15.28,15.62,15.71,15.93,15.88,16.05,
+16.13,16.28,16.24,16.61,16.57,16.96,16.73,17.00,17.18,17.33,
+17.32,17.55,17.74,17.90,18.03,18.12,18.44,18.49,18.66,18.79,
+18.59,19.02,19.02,19.14,19.40,19.74,19.78,19.80,19.90,20.05,
+20.12,20.39,20.47,20.65,20.82,20.78,21.00,21.00,21.23,21.39,
+21.37,21.50,21.65,21.80,21.87,22.29,22.43,22.37,22.57,22.49,
+22.87,23.00,22.97,23.26,23.49,23.52,23.80,23.82,23.86,24.04,
+24.29,24.49,24.34,24.50,25.08,24.77,24.95,25.08,25.21,25.53,
+25.34,25.44,25.89,25.92,26.33,26.19,26.39,26.47,26.54,26.87,
+26.81,26.97,27.26,27.43,27.49,27.71,27.71,28.04,27.84,28.29,
+28.06,28.26,28.24,28.84,28.62,29.02,29.02,29.06,29.23,29.48,
+29.60,29.58,29.84,29.70,30.10,30.25,30.52,30.33,30.34,30.88,
+30.90,31.01,30.88,31.23,31.48,31.70,31.91,32.01,32.05,31.85,
+32.40,32.38,32.84,32.65,32.67,33.09,33.25,33.08,33.26,33.56,
+33.54,33.75,33.81,33.65,34.18,34.30,34.31,34.54,34.48,34.62,
+34.89,35.04,34.95,35.16,35.26,35.60,35.56,35.84,35.94,36.12,
+36.26,36.48,36.26,36.97,36.77,37.03,37.05,37.11,37.52,37.39,
+37.73,37.51,37.80,37.94,38.18,38.06,38.51,38.74,38.48,38.96,
+39.04,38.81,39.19,39.16,39.59,39.30,39.80,39.84,39.87,39.81,
+1.02,1.10,1.20,1.34,1.51,1.52,1.70,1.78,1.73,1.90,
+2.05,1.99,2.22,2.27,2.49,2.54,2.61,2.74,2.78,2.92,
+3.11,3.13,3.13,3.31,3.37,3.55,3.62,3.72,3.85,3.85,
+4.06,4.13,4.18,4.37,4.32,4.53,4.63,4.71,4.82,4.85,
+4.94,5.07,5.22,5.33,5.44,5.61,5.64,5.78,5.71,5.85,
+5.99,6.08,6.24,6.27,6.47,6.51,6.66,6.66,6.70,6.85,
+6.83,7.09,7.26,7.23,7.50,7.45,7.46,7.71,7.68,7.84,
+8.07,8.03,8.16,8.41,8.41,8.49,8.59,8.60,8.80,8.80,
+9.00,9.11,9.26,9.21,9.42,9.46,9.48,9.71,9.94,9.72,
+9.98,9.99,10.07,10.35,10.27,10.41,10.49,10.53,10.86,10.79,
+10.98,11.15,11.06,11.17,11.40,11.46,11.37,11.75,11.70,11.88,
+12.01,12.01,12.18,12.02,12.48,12.61,12.42,12.53,13.07,13.03,
+13.01,13.12,13.12,13.24,13.30,13.40,13.43,13.51,13.88,13.88,
+14.01,14.06,14.29,14.09,14.32,14.33,14.60,14.57,14.44,14.83,
+14.95,15.01,15.37,15.20,15.10,15.42,15.62,15.47,15.83,15.95,
+16.02,15.93,16.26,16.15,16.50,16.50,16.52,16.75,16.74,16.80,
+16.94,17.06,16.91,17.29,17.26,17.32,17.55,17.63,17.62,17.77,
+18.01,18.13,18.03,18.39,18.49,18.48,18.38,18.65,18.54,18.86,
+18.81,19.10,19.12,19.06,19.49,19.27,19.70,19.54,19.73,19.55,
+19.81,19.97,19.94,20.38,20.42,20.42,20.56,20.53,20.80,20.53,
+20.98,21.12,21.11,21.22,21.25,21.31,21.47,21.53,21.60,21.77,
+21.90,21.78,22.17,22.48,22.15,22.46,22.42,22.71,22.53,22.51,
+22.80,22.93,23.02,23.04,23.15,23.39,23.45,23.48,23.66,23.68,
+23.62,23.93,23.93,24.19,24.36,24.29,24.56,24.72,24.55,24.77,
+24.92,25.03,24.97,25.18,25.32,25.24,25.24,25.56,25.52,25.70,
+25.93,25.74,26.05,26.14,26.24,26.31,26.26,26.51,26.44,26.71,
+27.13,26.80,27.31,27.02,27.16,27.20,27.55,27.47,27.71,27.67,
+27.65,27.71,27.92,28.22,28.32,28.34,28.44,28.36,28.38,28.92,
+28.83,28.81,29.13,29.02,29.25,29.12,29.41,29.45,29.77,29.69,
+0.77,0.83,0.89,1.02,1.07,1.11,1.21,1.24,1.41,1.42,
+1.53,1.58,1.60,1.69,1.85,1.86,1.93,1.97,2.09,2.20,
+2.23,2.30,2.41,2.40,2.54,2.56,2.59,2.73,2.83,2.85,
+3.02,2.99,3.20,3.21,3.31,3.32,3.36,3.41,3.61,3.50,
+3.68,3.73,3.85,3.99,3.98,4.05,4.15,4.20,4.44,4.39,
+4.44,4.51,4.64,4.63,4.67,4.71,4.93,4.95,5.07,5.08,
+5.11,5.19,5.27,5.42,5.46,5.57,5.58,5.65,5.79,5.65,
+5.89,5.85,5.94,6.26,6.18,6.30,6.33,6.39,6.58,6.61,
+6.64,6.74,6.81,6.95,6.91,7.04,7.05,7.13,7.34,7.32,
+7.34,7.44,7.51,7.48,7.64,7.82,7.77,7.85,7.83,8.16,
+7.96,8.15,8.11,8.32,8.47,8.44,8.56,8.79,8.69,8.78,
+8.87,8.88,9.15,9.02,9.20,9.04,9.27,9.33,9.44,9.45,
+9.38,9.53,9.75,9.78,9.94,10.07,10.02,10.05,10.17,10.27,
+10.29,10.38,10.47,10.60,10.74,10.79,10.53,10.78,10.88,10.91,
+11.12,11.11,11.20,11.32,11.28,11.29,11.52,11.65,11.59,11.71,
+11.83,11.78,11.81,12.03,12.16,12.17,12.17,12.33,12.51,12.42,
+12.51,12.78,12.85,12.62,12.79,12.98,12.80,13.14,12.93,13.13,
+13.38,13.04,13.42,13.37,13.52,13.81,13.57,13.77,13.72,13.93,
+14.07,14.07,14.19,13.95,14.42,14.39,14.61,14.62,14.48,14.77,
+14.57,14.84,14.77,15.00,15.10,15.10,15.06,15.36,15.31,15.41,
+15.51,15.51,15.51,15.84,15.90,15.72,15.93,16.11,15.99,16.17,
+16.33,16.17,16.40,16.54,16.48,16.57,16.69,16.59,16.93,16.73,
+16.92,16.88,17.12,17.26,17.23,17.31,17.48,17.48,17.37,17.58,
+17.70,17.56,17.93,17.75,17.87,18.20,18.03,18.20,18.16,18.39,
+18.44,18.45,18.23,18.45,18.63,18.79,18.81,18.80,19.09,18.98,
+19.23,19.32,19.29,19.22,19.45,19.36,19.55,19.52,19.50,19.90,
+19.69,19.71,19.98,20.01,20.23,20.33,20.29,20.07,20.43,20.50,
+20.75,20.63,20.75,21.01,20.97,20.98,20.91,21.05,21.24,21.14,
+21.51,21.12,21.40,21.62,21.58,21.54,21.84,21.62,21.81,21.98,
+0.59,0.61,0.65,0.75,0.78,0.86,0.88,0.95,1.03,1.06,
+1.11,1.15,1.24,1.22,1.33,1.34,1.41,1.54,1.52,1.57,
+1.68,1.74,1.81,1.88,1.91,1.88,2.00,2.04,2.05,2.10,
+2.16,2.28,2.26,2.33,2.40,2.46,2.54,2.58,2.58,2.75,
+2.78,2.77,2.86,2.95,2.95,2.88,3.12,3.16,3.15,3.25,
+3.34,3.30,3.32,3.43,3.47,3.58,3.68,3.69,3.65,3.84,
+3.81,3.85,3.81,4.06,4.01,4.07,4.08,4.18,4.24,4.43,
+4.32,4.45,4.48,4.38,4.60,4.54,4.79,4.79,4.77,4.87,
+4.90,4.97,4.92,5.08,5.19,5.30,5.28,5.20,5.36,5.50,
+5.54,5.53,5.50,5.48,5.61,5.83,5.64,5.75,5.89,5.93,
+6.07,6.17,6.17,6.04,6.22,6.38,6.45,6.44,6.46,6.54,
+6.61,6.56,6.67,6.66,6.66,6.75,6.81,6.95,6.95,7.08,
+6.95,7.19,7.14,7.20,7.48,7.26,7.45,7.40,7.46,7.53,
+7.50,7.58,7.74,7.87,7.79,7.87,8.04,8.00,8.01,8.12,
+8.18,8.23,8.20,8.38,8.41,8.57,8.48,8.56,8.67,8.65,
+8.77,8.50,8.79,9.01,9.07,8.92,9.05,9.12,9.09,9.24,
+9.16,9.34,9.46,9.40,9.67,9.57,9.65,9.60,9.75,9.87,
+9.87,10.04,9.89,10.02,10.10,10.07,10.23,10.13,10.27,10.20,
+10.36,10.40,10.35,10.70,10.73,10.69,10.79,10.76,10.84,10.74,
+10.68,10.94,11.02,11.17,11.05,11.24,10.99,11.21,11.39,11.28,
+11.36,11.56,11.58,11.59,11.68,11.52,11.63,11.78,11.97,11.75,
+11.89,11.85,12.01,12.03,12.09,12.20,12.44,12.47,12.55,12.40,
+12.47,12.66,12.51,12.68,12.78,12.94,12.83,12.89,13.18,13.06,
+13.12,12.96,13.15,13.19,13.27,13.53,13.35,13.46,13.40,13.53,
+13.67,13.59,13.90,13.78,13.82,14.07,13.98,13.97,14.06,14.01,
+14.00,14.34,14.30,14.24,14.14,14.56,14.54,14.67,14.62,14.60,
+14.38,14.82,14.79,14.95,14.85,15.02,14.85,15.02,15.08,15.14,
+15.35,15.18,15.29,15.43,15.25,15.40,15.56,15.49,15.71,15.50,
+15.76,15.72,15.97,16.07,15.88,15.96,16.35,16.16,16.14,16.44,
+0.40,0.47,0.52,0.54,0.60,0.59,0.68,0.71,0.73,0.79,
+0.85,0.86,0.90,0.96,0.95,0.99,1.06,1.09,1.12,1.20,
+1.25,1.27,1.30,1.39,1.37,1.40,1.45,1.58,1.58,1.59,
+1.62,1.70,1.71,1.71,1.78,1.75,1.83,1.96,1.96,1.99,
+2.02,2.10,2.15,2.11,2.22,2.24,2.34,2.29,2.33,2.40,
+2.48,2.43,2.48,2.55,2.58,2.58,2.60,2.72,2.71,2.81,
+2.86,2.90,2.89,2.98,2.99,2.98,3.04,3.12,3.22,3.28,
+3.33,3.25,3.21,3.40,3.38,3.42,3.55,3.54,3.52,3.63,
+3.72,3.67,3.66,3.69,3.72,3.83,3.88,3.90,3.94,4.13,
+4.01,4.04,4.08,4.19,4.37,4.28,4.17,4.36,4.26,4.48,
+4.53,4.50,4.52,4.64,4.56,4.53,4.69,4.76,4.86,4.86,
+4.78,4.83,4.88,4.89,4.90,5.04,4.97,5.22,5.18,5.18,
+5.22,5.26,5.30,5.27,5.44,5.52,5.54,5.51,5.54,5.55,
+5.62,5.55,5.75,5.85,5.85,6.02,6.06,5.77,5.91,6.01,
+6.14,6.14,6.16,6.19,6.24,6.36,6.25,6.41,6.45,6.47,
+6.56,6.59,6.58,6.53,6.57,6.63,6.76,6.66,6.82,6.79,
+6.82,6.98,6.99,7.07,6.96,7.04,7.17,7.21,7.19,7.25,
+7.31,7.34,7.50,7.42,7.63,7.42,7.50,7.50,7.63,7.56,
+7.56,7.75,7.73,7.83,7.79,7.81,7.92,7.85,8.10,8.02,
+8.05,8.05,8.11,8.19,8.37,8.24,8.32,8.24,8.34,8.36,
+8.51,8.52,8.56,8.56,8.66,8.75,8.61,8.68,8.74,8.90,
+8.86,8.97,9.01,8.78,9.00,9.09,9.13,9.18,9.15,9.11,
+9.34,9.29,9.46,9.40,9.40,9.52,9.58,9.40,9.54,9.51,
+9.61,9.78,9.81,9.89,9.71,9.80,9.94,10.07,9.93,10.04,
+10.19,10.25,10.29,10.35,10.30,10.19,10.28,10.46,10.37,10.48,
+10.26,10.41,10.68,10.74,10.65,10.71,10.56,10.72,10.73,10.93,
+10.78,10.88,10.91,11.01,10.93,11.08,11.06,11.00,11.20,11.26,
+11.21,11.19,11.29,11.22,11.54,11.64,11.37,11.61,11.50,11.72,
+11.64,11.74,11.67,11.67,11.71,11.89,12.00,11.77,11.88,12.29,
+0.31,0.34,0.35,0.40,0.44,0.48,0.51,0.55,0.54,0.58,
+0.62,0.64,0.62,0.68,0.70,0.76,0.80,0.84,0.79,0.80,
+0.92,0.99,1.02,0.96,1.05,1.01,1.06,1.12,1.17,1.20,
+1.15,1.15,1.22,1.23,1.29,1.36,1.41,1.40,1.44,1.46,
+1.50,1.56,1.61,1.56,1.65,1.66,1.69,1.68,1.75,1.72,
+1.76,1.78,1.84,1.94,1.94,1.97,1.97,1.94,2.05,2.08,
+2.06,2.10,2.19,2.19,2.19,2.29,2.34,2.29,2.31,2.32,
+2.40,2.46,2.43,2.52,2.56,2.56,2.63,2.58,2.60,2.65,
+2.66,2.73,2.77,2.87,2.76,2.88,2.81,2.94,2.93,2.94,
+3.06,3.00,3.09,3.07,3.07,3.05,3.22,3.22,3.17,3.21,
+3.21,3.28,3.21,3.35,3.33,3.44,3.44,3.50,3.59,3.51,
+3.58,3.69,3.69,3.71,3.73,3.65,3.79,3.83,3.92,3.86,
+3.91,3.91,3.97,4.02,4.09,3.98,4.12,4.15,4.11,4.09,
+4.24,4.30,4.38,4.35,4.31,4.39,4.40,4.37,4.41,4.38,
+4.57,4.41,4.64,4.56,4.58,4.57,4.63,4.67,4.73,4.74,
+4.67,4.82,4.71,4.90,4.98,4.90,4.80,4.95,5.05,5.00,
+5.20,5.21,5.04,5.18,5.12,5.30,5.22,5.33,5.14,5.34,
+5.33,5.50,5.38,5.46,5.50,5.58,5.47,5.54,5.61,5.73,
+5.50,5.77,5.68,5.62,5.73,5.89,5.92,5.76,6.02,5.88,
+5.96,5.89,6.06,6.09,6.19,6.18,5.97,6.20,6.31,6.27,
+6.26,6.22,6.29,6.20,6.42,6.37,6.39,6.51,6.43,6.49,
+6.62,6.65,6.56,6.60,6.51,6.80,6.71,6.77,6.85,6.74,
+6.91,6.78,6.94,6.99,7.04,6.91,7.01,7.07,7.01,6.95,
+7.17,7.21,7.13,7.21,7.20,7.41,7.31,7.34,7.58,7.49,
+7.46,7.45,7.46,7.55,7.53,7.59,7.63,7.72,7.70,7.62,
+7.79,7.84,7.71,7.87,8.21,7.99,7.88,7.96,8.04,8.04,
+7.98,8.09,8.01,8.12,8.07,8.28,8.23,8.28,8.17,8.17,
+8.34,8.28,8.33,8.62,8.44,8.55,8.46,8.53,8.42,8.56,
+8.63,8.60,8.76,8.84,8.84,8.80,8.79,8.76,8.80,9.00,
+0.24,0.27,0.27,0.31,0.27,0.33,0.37,0.41,0.40,0.40,
+0.44,0.47,0.48,0.51,0.52,0.57,0.59,0.62,0.69,0.63,
+0.68,0.66,0.73,0.77,0.76,0.79,0.78,0.80,0.83,0.92,
+0.88,0.94,0.96,0.97,0.96,1.00,0.99,1.08,1.05,1.08,
+1.06,1.13,1.14,1.18,1.21,1.22,1.27,1.32,1.26,1.35,
+1.25,1.38,1.43,1.46,1.41,1.42,1.49,1.49,1.50,1.57,
+1.52,1.54,1.61,1.60,1.67,1.69,1.69,1.72,1.68,1.74,
+1.81,1.82,1.80,1.83,1.97,1.76,1.82,2.01,1.84,1.93,
+2.01,2.05,1.95,2.09,2.09,2.08,2.18,2.10,2.16,2.17,
+2.26,2.29,2.25,2.29,2.21,2.36,2.37,2.36,2.46,2.37,
+2.37,2.40,2.53,2.51,2.52,2.55,2.61,2.58,2.65,2.69,
+2.56,2.64,2.68,2.68,2.72,2.77,2.95,2.79,2.88,2.90,
+2.84,2.94,2.88,2.94,2.98,2.92,3.00,3.04,3.08,3.04,
+3.08,3.19,3.23,3.21,3.15,3.17,3.20,3.15,3.27,3.36,
+3.35,3.25,3.37,3.48,3.44,3.39,3.44,3.50,3.42,3.48,
+3.49,3.59,3.52,3.68,3.64,3.68,3.59,3.70,3.69,3.75,
+3.69,3.80,3.83,3.87,3.77,3.85,3.84,3.89,3.99,3.88,
+3.96,3.90,4.00,3.98,4.07,4.09,4.19,4.13,4.17,4.26,
+4.18,4.16,4.26,4.27,4.18,4.28,4.31,4.36,4.33,4.46,
+4.36,4.45,4.46,4.55,4.55,4.53,4.66,4.50,4.64,4.58,
+4.63,4.68,4.50,4.73,4.74,4.85,4.78,4.66,4.73,4.89,
+4.93,4.90,4.88,4.93,4.95,4.92,5.05,5.05,5.00,4.99,
+5.03,5.06,5.21,5.06,5.26,5.20,5.28,5.38,5.20,5.16,
+5.29,5.31,5.31,5.34,5.31,5.37,5.41,5.36,5.49,5.58,
+5.52,5.63,5.53,5.65,5.52,5.57,5.66,5.57,5.54,5.77,
+5.54,5.80,5.70,5.86,5.74,5.89,5.92,5.90,5.88,5.84,
+6.03,6.06,5.97,6.00,6.02,6.08,6.06,6.06,6.18,6.19,
+6.20,6.13,6.13,6.23,6.27,6.37,6.24,6.16,6.27,6.40,
+6.30,6.45,6.49,6.43,6.48,6.48,6.56,6.52,6.70,6.57,
+0.17,0.20,0.21,0.23,0.20,0.26,0.23,0.32,0.31,0.30,
+0.32,0.34,0.37,0.36,0.37,0.38,0.44,0.44,0.48,0.47,
+0.48,0.51,0.53,0.52,0.54,0.58,0.58,0.59,0.61,0.63,
+0.67,0.69,0.72,0.75,0.69,0.73,0.73,0.84,0.79,0.84,
+0.87,0.82,0.88,0.86,0.91,0.83,0.89,0.96,0.97,1.00,
+0.97,0.98,1.02,1.03,1.10,1.05,1.04,1.13,1.12,1.18,
+1.19,1.16,1.17,1.23,1.23,1.23,1.28,1.27,1.28,1.27,
+1.29,1.38,1.37,1.33,1.29,1.45,1.44,1.36,1.42,1.50,
+1.46,1.50,1.52,1.55,1.55,1.58,1.56,1.61,1.59,1.55,
+1.64,1.68,1.61,1.65,1.73,1.69,1.73,1.67,1.80,1.74,
+1.89,1.83,1.81,1.85,1.84,1.84,1.96,1.89,1.90,1.90,
+1.96,1.96,1.91,1.94,2.00,2.00,2.12,2.09,2.08,2.07,
+2.08,2.15,2.16,2.22,2.22,2.14,2.26,2.25,2.26,2.21,
+2.23,2.24,2.35,2.23,2.34,2.44,2.40,2.34,2.37,2.50,
+2.39,2.53,2.52,2.41,2.44,2.45,2.48,2.52,2.55,2.60,
+2.67,2.71,2.64,2.70,2.65,2.75,2.72,2.64,2.78,2.80,
+2.72,2.76,2.76,2.79,2.84,2.83,2.95,2.94,2.96,2.94,
+2.97,2.88,3.02,2.89,3.02,3.04,3.07,3.04,3.03,2.99,
+3.15,3.07,3.15,3.22,3.15,3.24,3.16,3.22,3.26,3.21,
+3.27,3.14,3.29,3.25,3.32,3.37,3.23,3.38,3.43,3.52,
+3.42,3.51,3.50,3.50,3.54,3.55,3.62,3.49,3.51,3.62,
+3.56,3.58,3.58,3.63,3.63,3.78,3.69,3.69,3.68,3.72,
+3.69,3.77,3.73,3.71,3.80,3.89,3.98,3.83,3.91,3.88,
+3.88,3.85,4.02,3.95,4.08,3.82,3.87,4.13,4.09,4.05,
+4.12,4.11,4.06,4.18,4.19,4.17,4.17,4.16,4.29,4.24,
+4.30,4.20,4.20,4.26,4.22,4.39,4.37,4.31,4.45,4.44,
+4.37,4.37,4.52,4.49,4.44,4.52,4.52,4.49,4.64,4.49,
+4.54,4.69,4.55,4.76,4.70,4.60,4.64,4.75,4.84,4.66,
+4.83,4.80,4.77,4.78,4.84,4.67,4.87,4.83,4.95,4.87,
+0.12,0.14,0.14,0.14,0.16,0.21,0.20,0.22,0.22,0.21,
+0.25,0.26,0.29,0.26,0.27,0.32,0.33,0.32,0.33,0.35,
+0.39,0.40,0.41,0.39,0.40,0.43,0.46,0.46,0.47,0.44,
+0.48,0.51,0.54,0.53,0.51,0.54,0.58,0.56,0.60,0.60,
+0.58,0.62,0.68,0.68,0.66,0.68,0.68,0.70,0.69,0.74,
+0.72,0.73,0.73,0.72,0.77,0.79,0.79,0.85,0.85,0.83,
+0.78,0.85,0.86,0.92,0.88,0.86,0.94,0.94,0.91,0.94,
+0.95,0.98,1.02,1.01,0.97,1.04,1.07,1.00,1.09,1.06,
+1.10,1.09,1.11,1.13,1.16,1.14,1.16,1.12,1.23,1.20,
+1.25,1.29,1.28,1.21,1.24,1.27,1.27,1.27,1.33,1.28,
+1.32,1.38,1.42,1.36,1.39,1.40,1.43,1.47,1.46,1.42,
+1.47,1.44,1.53,1.48,1.48,1.49,1.58,1.54,1.60,1.57,
+1.53,1.59,1.65,1.68,1.64,1.60,1.56,1.58,1.69,1.67,
+1.69,1.65,1.65,1.69,1.73,1.77,1.83,1.67,1.83,1.74,
+1.80,1.86,1.81,1.86,1.78,1.85,1.87,1.88,1.94,1.90,
+1.93,1.87,1.91,2.00,1.98,2.03,1.91,2.08,1.95,2.09,
+2.09,2.08,2.10,2.19,2.11,2.11,2.02,2.18,2.14,2.20,
+2.08,2.23,2.15,2.22,2.29,2.34,2.22,2.26,2.30,2.21,
+2.35,2.37,2.36,2.37,2.35,2.45,2.32,2.46,2.39,2.44,
+2.45,2.50,2.46,2.48,2.58,2.46,2.52,2.50,2.49,2.52,
+2.55,2.53,2.58,2.55,2.59,2.59,2.68,2.62,2.65,2.66,
+2.72,2.64,2.69,2.76,2.75,2.64,2.72,2.71,2.74,2.71,
+2.69,2.83,2.78,2.76,2.81,2.83,2.89,2.82,2.82,2.89,
+2.80,2.76,2.93,2.94,2.99,3.03,2.97,2.92,3.03,3.07,
+3.04,2.96,3.05,3.15,3.07,3.07,2.98,3.15,3.05,3.16,
+3.19,3.15,3.20,3.19,3.15,3.07,3.33,3.22,3.20,3.26,
+3.24,3.27,3.38,3.23,3.33,3.34,3.42,3.39,3.34,3.35,
+3.32,3.37,3.37,3.45,3.43,3.45,3.39,3.45,3.48,3.44,
+3.47,3.44,3.44,3.50,3.64,3.71,3.65,3.56,3.49,3.62,
+0.09,0.10,0.12,0.07,0.13,0.15,0.14,0.16,0.15,0.19,
+0.19,0.17,0.19,0.23,0.21,0.23,0.25,0.26,0.28,0.25,
+0.26,0.28,0.28,0.31,0.31,0.32,0.31,0.34,0.35,0.38,
+0.37,0.38,0.37,0.41,0.40,0.45,0.44,0.41,0.46,0.43,
+0.45,0.44,0.47,0.51,0.52,0.51,0.47,0.49,0.49,0.50,
+0.52,0.54,0.56,0.51,0.58,0.57,0.59,0.59,0.62,0.66,
+0.65,0.65,0.65,0.66,0.67,0.69,0.71,0.66,0.68,0.69,
+0.72,0.72,0.74,0.74,0.75,0.77,0.79,0.79,0.79,0.78,
+0.84,0.78,0.84,0.84,0.84,0.81,0.89,0.83,0.95,0.85,
+0.85,0.91,0.95,0.93,0.87,0.95,0.94,0.95,0.96,0.95,
+0.95,0.99,1.00,1.03,1.07,1.03,1.05,1.07,1.10,1.09,
+1.08,1.07,1.08,1.08,1.13,1.13,1.10,1.14,1.18,1.20,
+1.25,1.16,1.19,1.25,1.26,1.19,1.19,1.24,1.17,1.25,
+1.29,1.20,1.22,1.30,1.30,1.32,1.38,1.18,1.31,1.38,
+1.35,1.33,1.37,1.40,1.40,1.42,1.32,1.39,1.48,1.38,
+1.42,1.42,1.42,1.43,1.50,1.55,1.48,1.45,1.47,1.51,
+1.54,1.52,1.55,1.54,1.53,1.58,1.60,1.61,1.60,1.66,
+1.59,1.55,1.62,1.65,1.64,1.65,1.68,1.64,1.72,1.68,
+1.67,1.75,1.66,1.65,1.75,1.79,1.77,1.69,1.71,1.73,
+1.75,1.86,1.83,1.83,1.88,1.83,1.85,1.85,1.90,1.82,
+1.93,1.86,1.94,1.86,1.99,1.98,1.96,1.87,2.04,1.95,
+1.98,1.92,2.05,1.99,1.98,1.99,2.03,2.02,2.10,1.96,
+2.00,1.98,2.08,2.14,2.08,2.05,2.07,2.08,2.10,2.14,
+2.17,2.11,2.15,2.21,2.25,2.12,2.20,2.15,2.18,2.21,
+2.19,2.26,2.23,2.24,2.25,2.29,2.23,2.31,2.29,2.28,
+2.28,2.35,2.32,2.34,2.29,2.39,2.39,2.37,2.35,2.49,
+2.36,2.41,2.40,2.32,2.46,2.39,2.51,2.46,2.43,2.56,
+2.49,2.52,2.49,2.61,2.52,2.54,2.59,2.55,2.58,2.61,
+2.58,2.52,2.64,2.57,2.65,2.69,2.56,2.61,2.65,2.68,
+0.06,0.07,0.10,0.09,0.10,0.10,0.11,0.10,0.12,0.14,
+0.14,0.14,0.14,0.17,0.16,0.18,0.16,0.18,0.19,0.23,
+0.21,0.20,0.20,0.22,0.21,0.25,0.21,0.26,0.25,0.26,
+0.24,0.27,0.27,0.31,0.28,0.28,0.31,0.33,0.32,0.32,
+0.33,0.35,0.34,0.34,0.39,0.34,0.37,0.34,0.38,0.38,
+0.35,0.41,0.45,0.44,0.42,0.43,0.48,0.47,0.48,0.46,
+0.47,0.48,0.50,0.46,0.50,0.47,0.49,0.50,0.51,0.54,
+0.58,0.52,0.54,0.55,0.58,0.57,0.59,0.60,0.59,0.59,
+0.57,0.61,0.62,0.62,0.62,0.58,0.65,0.63,0.66,0.67,
+0.64,0.64,0.71,0.69,0.71,0.73,0.73,0.68,0.72,0.73,
+0.79,0.76,0.73,0.77,0.74,0.71,0.75,0.77,0.82,0.78,
+0.84,0.83,0.76,0.81,0.78,0.86,0.84,0.81,0.86,0.82,
+0.81,0.89,0.91,0.83,0.86,0.91,0.87,0.93,0.90,0.91,
+0.94,0.92,0.91,0.94,0.92,0.93,0.91,0.97,1.02,1.02,
+0.99,0.98,1.03,1.00,1.02,0.98,1.03,1.03,1.04,1.07,
+1.06,1.10,1.08,1.06,1.16,1.12,1.14,1.08,1.15,1.15,
+1.10,1.08,1.15,1.15,1.09,1.12,1.15,1.15,1.17,1.17,
+1.17,1.19,1.21,1.23,1.25,1.23,1.22,1.18,1.27,1.30,
+1.19,1.26,1.26,1.28,1.25,1.27,1.31,1.25,1.33,1.28,
+1.31,1.34,1.39,1.36,1.42,1.39,1.41,1.35,1.36,1.40,
+1.36,1.32,1.39,1.40,1.42,1.44,1.46,1.39,1.47,1.43,
+1.41,1.44,1.48,1.53,1.50,1.52,1.52,1.47,1.49,1.47,
+1.51,1.55,1.47,1.48,1.55,1.58,1.55,1.61,1.57,1.53,
+1.58,1.62,1.60,1.60,1.61,1.65,1.66,1.70,1.65,1.69,
+1.59,1.65,1.61,1.60,1.76,1.68,1.75,1.74,1.75,1.74,
+1.68,1.71,1.70,1.81,1.67,1.80,1.81,1.82,1.80,1.83,
+1.79,1.78,1.76,1.83,1.84,1.79,1.80,1.78,1.91,1.77,
+1.83,1.83,1.88,1.90,1.83,1.87,1.87,1.87,1.90,1.81,
+1.97,1.93,1.90,1.91,1.96,1.97,1.91,1.97,2.02,1.99,
+0.04,0.07,0.07,0.06,0.08,0.08,0.07,0.07,0.10,0.11,
+0.10,0.10,0.11,0.12,0.13,0.12,0.12,0.16,0.16,0.14,
+0.15,0.14,0.17,0.18,0.16,0.17,0.19,0.16,0.19,0.21,
+0.20,0.20,0.21,0.21,0.21,0.23,0.23,0.23,0.23,0.25,
+0.27,0.25,0.26,0.29,0.24,0.26,0.25,0.27,0.28,0.32,
+0.28,0.30,0.33,0.28,0.30,0.32,0.30,0.31,0.34,0.37,
+0.36,0.37,0.33,0.39,0.37,0.36,0.36,0.38,0.34,0.38,
+0.39,0.40,0.43,0.44,0.41,0.39,0.44,0.43,0.44,0.45,
+0.43,0.46,0.45,0.44,0.48,0.49,0.47,0.42,0.50,0.47,
+0.47,0.46,0.51,0.45,0.53,0.50,0.50,0.52,0.50,0.54,
+0.56,0.51,0.53,0.53,0.58,0.55,0.60,0.58,0.54,0.57,
+0.56,0.58,0.58,0.57,0.57,0.64,0.63,0.62,0.59,0.64,
+0.63,0.64,0.63,0.66,0.65,0.64,0.67,0.63,0.68,0.69,
+0.75,0.68,0.71,0.70,0.68,0.69,0.69,0.71,0.78,0.71,
+0.72,0.70,0.72,0.74,0.76,0.79,0.72,0.75,0.81,0.81,
+0.78,0.80,0.73,0.82,0.81,0.77,0.81,0.85,0.82,0.78,
+0.82,0.83,0.81,0.82,0.86,0.84,0.83,0.86,0.80,0.90,
+0.87,0.92,0.86,0.93,0.92,0.91,0.89,0.89,0.85,0.88,
+0.98,0.94,0.94,0.93,0.94,0.94,0.92,0.99,0.99,1.00,
+0.96,0.94,0.96,1.03,1.01,1.06,1.02,1.02,0.99,1.05,
+1.05,1.04,0.99,1.06,1.00,1.04,1.01,1.10,1.09,1.12,
+1.08,1.14,1.10,1.05,1.06,1.05,1.11,1.12,1.07,1.18,
+1.09,1.14,1.11,1.12,1.11,1.21,1.20,1.13,1.15,1.15,
+1.16,1.17,1.22,1.27,1.17,1.20,1.14,1.20,1.20,1.21,
+1.26,1.29,1.19,1.23,1.26,1.20,1.22,1.27,1.28,1.22,
+1.30,1.24,1.28,1.21,1.28,1.30,1.32,1.30,1.28,1.34,
+1.37,1.30,1.30,1.32,1.31,1.36,1.35,1.28,1.39,1.39,
+1.31,1.42,1.39,1.40,1.33,1.43,1.34,1.41,1.44,1.38,
+1.35,1.48,1.46,1.42,1.42,1.47,1.39,1.42,1.50,1.41,
+0.03,0.05,0.05,0.06,0.05,0.06,0.06,0.07,0.06,0.07,
+0.07,0.09,0.09,0.08,0.07,0.09,0.10,0.10,0.10,0.11,
+0.09,0.11,0.12,0.13,0.12,0.13,0.14,0.13,0.15,0.14,
+0.14,0.16,0.15,0.17,0.16,0.15,0.17,0.16,0.16,0.19,
+0.19,0.22,0.21,0.16,0.19,0.20,0.20,0.23,0.19,0.22,
+0.21,0.22,0.22,0.23,0.24,0.23,0.25,0.23,0.24,0.23,
+0.24,0.27,0.27,0.27,0.28,0.28,0.31,0.28,0.28,0.28,
+0.29,0.31,0.26,0.32,0.34,0.29,0.34,0.31,0.29,0.30,
+0.29,0.33,0.31,0.32,0.29,0.35,0.33,0.36,0.36,0.37,
+0.36,0.38,0.39,0.36,0.38,0.38,0.39,0.42,0.40,0.37,
+0.38,0.44,0.40,0.39,0.42,0.41,0.42,0.43,0.44,0.43,
+0.41,0.44,0.44,0.47,0.46,0.46,0.46,0.49,0.47,0.42,
+0.44,0.48,0.50,0.49,0.53,0.48,0.49,0.51,0.50,0.48,
+0.53,0.52,0.54,0.49,0.53,0.53,0.52,0.53,0.52,0.57,
+0.54,0.51,0.52,0.56,0.54,0.57,0.56,0.56,0.59,0.57,
+0.59,0.57,0.55,0.58,0.61,0.62,0.63,0.60,0.64,0.64,
+0.64,0.65,0.61,0.64,0.63,0.63,0.68,0.64,0.58,0.66,
+0.66,0.66,0.64,0.71,0.66,0.68,0.68,0.68,0.71,0.66,
+0.66,0.66,0.71,0.72,0.71,0.68,0.74,0.64,0.74,0.70,
+0.72,0.71,0.73,0.74,0.75,0.71,0.75,0.76,0.72,0.75,
+0.77,0.78,0.76,0.71,0.79,0.77,0.78,0.79,0.79,0.79,
+0.80,0.78,0.82,0.81,0.78,0.78,0.81,0.83,0.82,0.79,
+0.81,0.77,0.86,0.88,0.90,0.90,0.88,0.82,0.85,0.85,
+0.86,0.98,0.87,0.90,0.91,0.89,0.88,0.89,0.86,0.89,
+0.92,0.91,0.93,0.91,0.87,0.90,0.97,0.94,0.97,0.90,
+0.98,0.92,0.98,0.95,0.96,0.98,0.95,0.92,0.97,1.01,
+0.95,1.01,0.97,1.01,0.95,1.02,0.99,0.97,1.06,0.98,
+1.01,0.99,1.03,1.07,1.02,1.05,0.99,1.03,1.05,1.03,
+1.06,1.12,1.08,1.05,1.04,1.02,1.04,1.12,1.10,1.14,
+0.03,0.03,0.03,0.04,0.04,0.04,0.05,0.04,0.05,0.04,
+0.06,0.05,0.07,0.06,0.07,0.06,0.06,0.07,0.07,0.08,
+0.08,0.10,0.08,0.09,0.09,0.11,0.10,0.10,0.11,0.12,
+0.10,0.11,0.10,0.14,0.10,0.11,0.11,0.13,0.12,0.14,
+0.13,0.14,0.14,0.15,0.16,0.14,0.15,0.17,0.16,0.16,
+0.16,0.15,0.15,0.18,0.18,0.19,0.18,0.17,0.19,0.17,
+0.19,0.17,0.18,0.22,0.18,0.22,0.22,0.22,0.20,0.21,
+0.22,0.20,0.20,0.23,0.20,0.22,0.26,0.23,0.23,0.25,
+0.30,0.25,0.25,0.24,0.25,0.22,0.26,0.26,0.29,0.26,
+0.25,0.26,0.23,0.26,0.30,0.26,0.28,0.28,0.28,0.28,
+0.27,0.27,0.28,0.32,0.33,0.33,0.35,0.29,0.32,0.35,
+0.32,0.33,0.33,0.37,0.31,0.34,0.34,0.33,0.34,0.34,
+0.35,0.31,0.37,0.34,0.36,0.40,0.38,0.39,0.37,0.38,
+0.39,0.40,0.37,0.38,0.36,0.36,0.38,0.37,0.39,0.39,
+0.39,0.42,0.40,0.40,0.40,0.39,0.42,0.42,0.44,0.42,
+0.45,0.47,0.41,0.42,0.46,0.41,0.43,0.46,0.47,0.41,
+0.44,0.47,0.49,0.41,0.49,0.45,0.48,0.52,0.49,0.47,
+0.46,0.53,0.49,0.48,0.50,0.49,0.52,0.52,0.51,0.52,
+0.48,0.51,0.50,0.52,0.51,0.54,0.50,0.53,0.49,0.49,
+0.53,0.54,0.54,0.55,0.55,0.58,0.55,0.55,0.55,0.53,
+0.54,0.54,0.54,0.59,0.55,0.61,0.60,0.52,0.59,0.58,
+0.62,0.58,0.67,0.54,0.60,0.59,0.61,0.57,0.63,0.61,
+0.61,0.61,0.64,0.62,0.64,0.62,0.65,0.68,0.62,0.64,
+0.67,0.64,0.73,0.66,0.67,0.66,0.70,0.65,0.70,0.65,
+0.70,0.66,0.70,0.67,0.69,0.69,0.71,0.66,0.70,0.70,
+0.64,0.69,0.69,0.72,0.70,0.73,0.74,0.70,0.70,0.71,
+0.71,0.71,0.73,0.75,0.73,0.72,0.70,0.74,0.75,0.71,
+0.75,0.76,0.75,0.76,0.72,0.70,0.77,0.76,0.76,0.81,
+0.82,0.78,0.73,0.76,0.83,0.76,0.79,0.77,0.79,0.79,
+0.02,0.02,0.02,0.02,0.04,0.03,0.03,0.04,0.04,0.04,
+0.04,0.04,0.05,0.03,0.04,0.06,0.04,0.07,0.06,0.06,
+0.06,0.05,0.07,0.07,0.06,0.06,0.07,0.07,0.09,0.08,
+0.09,0.09,0.07,0.08,0.07,0.08,0.09,0.09,0.10,0.10,
+0.09,0.08,0.09,0.12,0.11,0.10,0.12,0.10,0.10,0.12,
+0.12,0.13,0.11,0.15,0.10,0.11,0.14,0.14,0.13,0.14,
+0.15,0.14,0.15,0.15,0.17,0.14,0.14,0.13,0.13,0.18,
+0.16,0.17,0.18,0.18,0.16,0.16,0.20,0.17,0.18,0.17,
+0.17,0.18,0.18,0.17,0.19,0.18,0.19,0.18,0.20,0.21,
+0.21,0.20,0.21,0.17,0.20,0.22,0.21,0.18,0.20,0.24,
+0.19,0.20,0.20,0.20,0.26,0.23,0.24,0.21,0.24,0.23,
+0.23,0.24,0.25,0.23,0.24,0.24,0.23,0.27,0.25,0.26,
+0.24,0.25,0.29,0.23,0.28,0.25,0.24,0.27,0.24,0.26,
+0.25,0.24,0.30,0.28,0.27,0.27,0.32,0.30,0.27,0.28,
+0.31,0.31,0.29,0.28,0.30,0.32,0.33,0.32,0.33,0.31,
+0.29,0.32,0.28,0.31,0.32,0.34,0.36,0.33,0.34,0.37,
+0.34,0.37,0.33,0.33,0.32,0.33,0.36,0.38,0.32,0.37,
+0.37,0.35,0.36,0.35,0.36,0.36,0.39,0.37,0.36,0.36,
+0.40,0.40,0.40,0.39,0.38,0.36,0.37,0.39,0.42,0.40,
+0.39,0.41,0.41,0.42,0.45,0.41,0.38,0.40,0.39,0.44,
+0.41,0.39,0.40,0.40,0.42,0.45,0.44,0.47,0.41,0.45,
+0.44,0.44,0.43,0.42,0.44,0.46,0.44,0.45,0.47,0.42,
+0.45,0.48,0.42,0.44,0.50,0.47,0.50,0.47,0.51,0.48,
+0.48,0.46,0.47,0.46,0.47,0.47,0.46,0.49,0.50,0.47,
+0.51,0.47,0.52,0.50,0.53,0.48,0.52,0.54,0.49,0.50,
+0.55,0.53,0.48,0.48,0.52,0.51,0.55,0.55,0.53,0.53,
+0.56,0.49,0.54,0.50,0.56,0.58,0.56,0.54,0.52,0.58,
+0.54,0.57,0.57,0.56,0.53,0.57,0.59,0.56,0.59,0.57,
+0.57,0.53,0.56,0.57,0.57,0.58,0.61,0.55,0.57,0.55,
+1.55,1.67,1.79,2.02,2.21,2.31,2.39,2.66,2.73,2.84,
+3.00,3.25,3.31,3.51,3.66,3.86,3.86,4.13,4.31,4.35,
+4.55,4.70,4.86,4.98,5.13,5.28,5.45,5.69,5.78,5.82,
+6.13,6.17,6.28,6.45,6.54,6.91,6.93,7.01,7.17,7.30,
+7.50,7.52,7.88,7.91,8.09,8.08,8.33,8.61,8.70,8.97,
+9.07,9.20,9.12,9.41,9.51,9.76,9.77,9.94,10.15,10.35,
+10.38,10.62,10.81,11.11,11.24,11.29,11.32,11.48,11.74,11.67,
+11.85,12.11,12.29,12.30,12.77,12.76,13.03,12.98,13.20,13.39,
+13.38,13.45,13.95,13.90,14.19,14.17,14.28,14.62,14.74,14.94,
+14.94,15.19,15.36,15.46,15.61,15.68,15.86,15.96,16.07,16.60,
+16.51,16.70,16.58,16.80,16.94,17.14,17.65,17.66,17.57,17.73,
+18.07,18.20,18.31,18.46,18.45,18.91,19.11,19.20,19.27,19.47,
+19.52,19.56,19.99,19.86,20.04,20.06,20.44,20.54,20.70,20.77,
+20.98,20.96,21.16,21.27,21.74,21.82,21.79,22.00,22.04,22.13,
+22.23,22.51,22.86,22.84,22.97,23.21,23.42,23.57,23.64,23.65,
+23.75,23.84,24.32,24.47,24.46,24.71,24.66,25.19,25.48,25.13,
+25.43,25.40,25.96,25.97,25.90,26.13,26.34,26.36,26.90,26.79,
+26.86,26.77,27.12,27.64,27.60,27.64,27.79,27.94,28.03,28.24,
+28.47,28.49,28.71,28.77,29.02,28.94,29.21,29.51,29.36,29.54,
+29.54,29.95,29.76,30.12,30.28,30.77,30.66,31.09,31.09,31.46,
+31.38,31.40,31.56,31.70,32.05,32.36,32.14,32.56,32.63,32.77,
+32.94,33.18,33.08,33.33,33.32,33.57,33.71,33.84,34.18,34.36,
+34.21,34.48,34.68,34.68,34.84,35.18,35.33,35.08,35.48,35.62,
+35.85,35.99,36.15,36.19,36.56,36.55,36.76,36.74,36.96,37.17,
+37.31,37.34,37.89,37.74,37.90,38.23,38.17,38.37,38.92,38.58,
+39.00,38.34,39.35,38.96,39.48,39.47,39.63,39.76,39.85,40.03,
+40.49,40.31,40.72,40.58,40.74,41.03,41.20,41.36,41.52,41.88,
+41.67,41.87,41.74,42.23,42.21,42.52,42.44,42.83,42.78,43.08,
+43.28,43.11,43.38,43.78,43.63,43.69,44.54,44.37,44.33,44.74,
+1.16,1.25,1.36,1.45,1.64,1.73,1.80,1.90,2.08,2.11,
+2.19,2.44,2.54,2.56,2.70,2.78,3.03,3.06,3.18,3.25,
+3.37,3.44,3.70,3.65,3.81,3.97,4.07,4.14,4.33,4.34,
+4.54,4.70,4.75,4.86,5.03,5.08,5.13,5.27,5.42,5.45,
+5.60,5.75,5.97,5.96,6.08,6.11,6.33,6.45,6.59,6.52,
+6.70,6.91,6.92,7.19,7.22,7.25,7.51,7.55,7.58,7.78,
+7.87,8.06,7.97,8.25,8.18,8.42,8.63,8.56,8.72,8.99,
+8.90,9.25,9.31,9.38,9.36,9.46,9.51,9.87,9.73,9.95,
+10.13,10.20,10.43,10.41,10.69,10.63,10.67,10.84,10.95,11.19,
+11.23,11.41,11.39,11.45,11.63,11.82,12.07,12.01,12.06,12.38,
+12.36,12.31,12.49,12.52,12.75,12.86,12.96,13.15,13.41,13.30,
+13.51,13.49,13.57,13.82,13.95,13.81,14.09,13.80,14.16,14.54,
+14.49,14.70,14.80,14.92,15.02,15.25,15.23,15.29,15.46,15.55,
+15.78,15.80,15.71,15.78,16.28,16.30,16.44,16.47,16.62,16.99,
+16.54,16.81,16.92,17.21,17.29,17.27,17.36,17.56,17.61,17.78,
+17.87,17.99,18.07,18.37,18.11,18.47,18.61,18.55,18.83,18.81,
+19.00,19.23,19.11,19.48,19.54,19.60,19.63,19.73,19.82,20.07,
+20.14,20.41,20.32,20.37,20.71,20.76,20.68,21.00,21.25,21.14,
+21.01,21.52,21.56,21.57,21.70,21.92,21.95,21.95,22.03,22.14,
+22.40,22.25,22.62,22.75,23.07,23.33,22.87,23.12,23.35,23.59,
+23.33,23.62,23.80,23.64,23.99,24.02,24.28,24.04,24.58,24.47,
+24.76,25.02,24.71,25.10,25.20,25.00,25.34,25.61,25.51,25.75,
+25.95,25.85,25.80,25.95,26.34,26.22,26.62,26.75,26.55,26.81,
+26.83,27.16,27.20,27.36,27.41,27.27,27.45,27.85,27.74,28.06,
+27.97,28.05,28.41,28.18,28.60,28.38,28.68,28.65,29.05,28.89,
+29.12,28.95,29.07,29.55,29.38,29.67,29.65,29.93,29.83,30.12,
+30.11,30.28,30.69,30.42,30.91,30.69,31.11,30.89,31.30,31.20,
+31.32,31.55,31.63,31.78,31.73,32.02,32.08,32.51,32.50,32.35,
+32.52,32.63,32.81,32.83,32.90,32.85,33.07,33.20,33.22,33.59,
+0.88,0.97,1.03,1.14,1.13,1.28,1.38,1.47,1.54,1.62,
+1.74,1.77,1.91,1.93,2.02,2.12,2.18,2.32,2.42,2.50,
+2.53,2.59,2.70,2.79,2.91,3.01,3.12,3.10,3.27,3.25,
+3.35,3.53,3.56,3.59,3.79,3.82,3.88,3.95,4.07,4.13,
+4.21,4.32,4.50,4.44,4.57,4.66,4.78,4.77,4.93,5.09,
+5.09,5.13,5.30,5.39,5.41,5.47,5.59,5.64,5.59,5.85,
+5.76,5.96,6.06,6.21,6.21,6.09,6.41,6.62,6.60,6.55,
+6.78,6.74,7.04,6.93,6.91,7.13,7.27,7.34,7.42,7.53,
+7.65,7.61,7.77,7.84,7.84,8.01,8.08,8.07,8.28,8.36,
+8.42,8.47,8.55,8.66,8.74,8.68,9.01,9.19,9.02,9.25,
+9.14,9.28,9.52,9.44,9.88,9.76,9.91,9.74,9.90,9.89,
+10.17,10.09,10.24,10.38,10.49,10.46,10.62,10.58,10.61,10.95,
+11.10,11.18,11.16,11.26,11.43,11.25,11.60,11.51,11.65,11.72,
+11.70,11.97,11.98,12.08,12.03,12.23,12.27,12.31,12.38,12.49,
+12.68,12.67,12.73,12.69,12.97,13.05,13.27,13.16,13.53,13.59,
+13.40,13.42,13.63,13.64,13.58,13.86,13.91,13.89,14.44,14.09,
+14.52,14.40,14.41,14.34,14.43,14.66,14.84,14.96,14.99,14.99,
+15.19,15.07,15.23,15.09,15.28,15.53,15.64,15.84,15.82,15.67,
+15.81,15.99,16.29,16.17,16.51,16.50,16.39,16.67,16.65,16.83,
+17.05,16.91,17.02,17.18,16.93,17.39,17.32,17.32,17.33,17.53,
+17.46,17.83,17.55,18.04,18.08,17.93,18.03,18.20,18.27,18.31,
+18.31,18.49,18.65,18.58,18.86,18.90,19.09,18.99,19.26,19.24,
+19.57,19.44,19.37,19.28,19.80,19.58,19.70,19.84,20.12,20.14,
+20.03,20.12,20.18,20.16,20.38,20.72,20.81,20.68,20.99,20.93,
+21.02,21.13,21.22,21.15,21.30,21.42,21.50,21.51,21.63,21.69,
+21.84,21.83,21.87,22.20,21.86,22.09,22.35,22.53,22.54,22.39,
+22.57,22.71,22.92,22.92,23.07,23.04,23.12,23.24,23.41,23.37,
+23.60,23.59,23.62,23.94,23.99,23.79,23.73,24.15,24.14,24.48,
+24.62,24.73,24.46,24.52,24.72,24.86,24.93,25.07,24.67,25.28,
+0.66,0.75,0.80,0.86,0.91,0.97,1.05,1.08,1.08,1.21,
+1.30,1.35,1.39,1.42,1.58,1.64,1.71,1.68,1.76,1.83,
+1.90,1.99,2.04,2.16,2.17,2.26,2.30,2.31,2.44,2.47,
+2.52,2.65,2.66,2.77,2.71,2.83,2.96,2.95,3.08,3.06,
+3.16,3.22,3.29,3.31,3.35,3.54,3.54,3.56,3.73,3.68,
+3.86,3.93,3.91,4.01,3.98,4.06,4.18,4.12,4.27,4.47,
+4.30,4.43,4.49,4.54,4.78,4.77,4.73,4.92,4.93,5.15,
+5.15,5.09,5.25,5.25,5.22,5.38,5.49,5.49,5.59,5.57,
+5.73,5.78,5.78,5.82,5.91,5.96,5.99,6.11,6.25,6.23,
+6.27,6.34,6.48,6.48,6.62,6.76,6.61,6.76,6.76,6.79,
+6.94,6.89,7.01,7.09,7.09,7.32,7.48,7.50,7.44,7.55,
+7.48,7.74,7.71,7.72,7.61,7.88,7.93,7.89,8.05,8.04,
+8.15,8.27,8.11,8.43,8.47,8.50,8.58,8.68,8.81,8.79,
+8.81,8.95,9.01,8.99,8.99,9.15,9.10,9.20,9.30,9.70,
+9.50,9.49,9.47,9.65,9.69,9.80,9.71,9.85,9.83,10.01,
+10.01,10.06,10.15,10.19,10.23,10.35,10.51,10.45,10.63,10.63,
+10.58,10.93,10.69,10.88,11.11,11.08,11.09,11.26,11.21,11.51,
+11.24,11.41,11.40,11.49,11.50,11.50,11.67,11.98,11.63,11.87,
+11.99,12.03,12.22,12.19,12.34,12.13,12.47,12.31,12.50,12.69,
+12.62,12.71,12.83,12.88,12.86,12.92,13.06,13.01,13.17,13.09,
+13.11,13.30,13.40,13.74,13.40,13.62,13.74,13.72,13.63,13.77,
+13.83,13.89,13.76,14.08,14.07,14.03,14.29,14.18,14.40,14.45,
+14.45,14.39,14.59,14.89,14.62,14.89,14.72,14.97,15.15,15.23,
+15.16,15.15,15.40,15.26,15.57,15.42,15.57,15.52,15.67,15.47,
+15.73,15.98,15.91,15.89,15.74,16.27,16.18,16.24,16.11,16.27,
+16.40,16.40,16.50,16.70,16.43,16.84,16.64,16.89,17.10,17.13,
+17.09,17.17,17.15,17.24,17.29,17.05,17.51,17.41,17.42,17.65,
+17.64,17.40,17.83,17.82,17.79,18.14,17.86,18.08,18.36,18.18,
+18.34,18.39,18.55,18.39,18.68,18.74,18.73,18.72,19.19,18.78,
+0.49,0.54,0.59,0.65,0.72,0.79,0.72,0.80,0.85,0.90,
+0.94,1.01,1.01,1.07,1.15,1.23,1.21,1.22,1.39,1.42,
+1.44,1.54,1.55,1.60,1.62,1.68,1.68,1.74,1.82,1.81,
+1.88,1.96,2.00,2.03,2.17,2.10,2.17,2.22,2.36,2.38,
+2.33,2.44,2.52,2.65,2.60,2.53,2.70,2.75,2.77,2.85,
+2.86,2.85,2.92,3.06,3.02,3.17,3.11,3.17,3.18,3.30,
+3.33,3.38,3.48,3.47,3.49,3.53,3.57,3.65,3.54,3.61,
+3.86,3.81,3.88,3.79,3.95,4.03,4.02,4.11,4.12,4.20,
+4.25,4.22,4.36,4.38,4.41,4.47,4.52,4.67,4.72,4.67,
+4.75,4.76,4.84,4.88,5.01,5.07,5.10,5.05,5.21,5.17,
+5.10,5.23,5.35,5.28,5.51,5.38,5.49,5.58,5.65,5.64,
+5.71,5.65,5.77,5.87,5.93,5.91,5.95,6.08,6.06,6.29,
+6.21,6.22,6.25,6.30,6.46,6.24,6.50,6.46,6.46,6.59,
+6.69,6.65,6.47,6.72,6.85,6.76,6.96,6.98,7.02,7.11,
+7.02,7.12,7.21,7.19,7.23,7.33,7.32,7.34,7.49,7.57,
+7.66,7.68,7.76,7.68,7.73,7.83,7.86,7.89,7.91,7.95,
+7.88,8.18,8.00,8.28,8.26,8.29,8.24,8.36,8.58,8.37,
+8.43,8.56,8.45,8.66,8.76,8.64,8.89,8.90,8.75,8.82,
+9.04,8.93,9.12,9.09,9.18,9.23,9.41,9.31,9.48,9.50,
+9.52,9.53,9.56,9.61,9.51,9.84,9.69,9.92,9.79,9.97,
+9.83,9.92,9.81,10.07,10.03,10.22,10.33,10.12,10.30,10.47,
+10.52,10.44,10.38,10.51,10.46,10.66,10.48,10.80,10.65,10.82,
+11.03,11.11,10.78,10.98,11.21,11.02,11.22,11.20,11.23,11.27,
+11.26,11.33,11.51,11.30,11.62,11.62,11.69,11.75,11.58,11.58,
+11.94,11.84,11.83,11.98,11.98,12.16,12.10,12.09,12.27,12.21,
+12.39,12.28,12.46,12.51,12.20,12.47,12.52,12.59,12.69,12.68,
+12.91,12.68,12.94,12.80,12.93,12.99,13.04,13.11,13.12,13.10,
+13.40,13.20,13.40,13.39,13.54,13.35,13.53,13.51,13.41,13.65,
+13.46,13.77,13.63,14.00,13.86,13.91,14.12,13.93,13.97,14.11,
+0.37,0.39,0.44,0.45,0.49,0.57,0.60,0.59,0.66,0.72,
+0.77,0.74,0.84,0.79,0.89,0.88,0.91,0.92,0.98,1.06,
+1.09,1.11,1.15,1.21,1.21,1.22,1.27,1.31,1.33,1.41,
+1.42,1.52,1.46,1.52,1.53,1.61,1.72,1.62,1.67,1.76,
+1.80,1.83,1.84,1.85,1.89,1.90,1.96,2.02,2.17,2.07,
+2.12,2.15,2.19,2.25,2.34,2.27,2.35,2.38,2.46,2.46,
+2.49,2.52,2.56,2.62,2.65,2.68,2.71,2.84,2.77,2.73,
+2.85,2.90,2.80,2.89,3.01,3.05,3.05,3.17,3.11,3.19,
+3.24,3.28,3.26,3.33,3.28,3.33,3.44,3.42,3.48,3.52,
+3.60,3.54,3.59,3.69,3.69,3.58,3.58,3.74,3.77,3.81,
+3.88,3.91,3.97,3.90,4.07,4.07,4.04,4.10,4.11,4.22,
+4.24,4.29,4.37,4.31,4.46,4.49,4.49,4.54,4.51,4.59,
+4.67,4.62,4.59,4.86,4.72,4.79,4.77,4.83,4.93,4.89,
+4.97,4.90,5.27,5.10,5.00,5.28,5.19,5.18,5.33,5.29,
+5.36,5.32,5.33,5.48,5.44,5.49,5.47,5.55,5.54,5.63,
+5.53,5.79,5.73,5.77,5.71,5.90,5.90,5.84,5.88,6.09,
+5.94,5.98,6.09,5.99,6.07,6.15,6.15,6.16,6.32,6.27,
+6.23,6.50,6.28,6.46,6.65,6.56,6.71,6.64,6.71,6.75,
+6.77,6.72,6.87,6.83,6.82,6.95,6.96,6.96,7.10,7.20,
+7.16,7.05,7.07,7.16,7.32,7.33,7.27,7.41,7.35,7.49,
+7.29,7.51,7.45,7.66,7.55,7.48,7.59,7.62,7.70,7.81,
+7.71,7.75,7.87,7.93,7.82,7.99,8.01,7.91,8.16,8.10,
+8.12,8.28,8.18,8.27,8.20,8.26,8.40,8.36,8.38,8.60,
+8.55,8.63,8.64,8.61,8.56,8.77,8.62,8.79,8.92,8.71,
+8.82,9.04,8.94,9.04,8.94,9.01,9.16,9.15,9.21,9.16,
+9.30,9.27,9.36,9.27,9.28,9.38,9.33,9.53,9.40,9.52,
+9.64,9.42,9.75,9.69,9.79,9.72,9.81,9.63,10.03,9.95,
+9.89,9.89,9.96,10.04,10.17,10.12,10.11,10.10,10.16,10.22,
+10.26,10.33,10.35,10.23,10.56,10.44,10.44,10.78,10.57,10.65,
+0.27,0.29,0.34,0.35,0.42,0.43,0.42,0.48,0.48,0.51,
+0.53,0.57,0.54,0.63,0.64,0.67,0.71,0.71,0.76,0.81,
+0.78,0.86,0.87,0.78,1.01,0.96,0.97,0.99,1.00,1.05,
+1.08,1.07,1.15,1.12,1.20,1.22,1.21,1.35,1.30,1.30,
+1.30,1.35,1.34,1.44,1.41,1.48,1.52,1.56,1.53,1.58,
+1.67,1.68,1.73,1.70,1.68,1.79,1.73,1.81,1.83,1.81,
+1.88,1.80,1.87,1.88,1.99,1.96,2.01,2.02,2.13,2.20,
+2.15,2.18,2.20,2.21,2.28,2.20,2.33,2.37,2.28,2.40,
+2.42,2.42,2.51,2.45,2.56,2.49,2.67,2.55,2.60,2.67,
+2.59,2.74,2.74,2.77,2.73,2.81,2.83,2.79,2.79,2.84,
+2.89,2.87,3.00,2.97,3.06,3.12,3.15,3.19,3.02,3.14,
+3.18,3.15,3.19,3.29,3.37,3.32,3.34,3.35,3.44,3.41,
+3.47,3.53,3.53,3.58,3.60,3.56,3.64,3.52,3.61,3.68,
+3.68,3.71,3.76,3.79,3.90,3.89,3.87,3.93,3.86,3.91,
+3.94,4.09,4.07,4.05,4.03,4.14,4.16,4.12,4.17,4.25,
+4.33,4.25,4.32,4.25,4.30,4.40,4.40,4.45,4.51,4.38,
+4.54,4.65,4.61,4.68,4.56,4.77,4.64,4.68,4.76,4.80,
+4.76,4.81,4.97,4.85,4.98,4.89,5.00,5.05,4.88,4.93,
+4.99,4.97,5.20,5.10,5.06,5.12,5.16,5.28,5.15,5.36,
+5.31,5.40,5.36,5.46,5.35,5.54,5.54,5.43,5.46,5.55,
+5.66,5.59,5.52,5.62,5.87,5.66,5.76,5.77,5.68,5.67,
+5.93,5.77,5.81,5.97,5.99,5.94,5.96,5.94,6.15,6.06,
+6.24,6.21,6.27,6.18,6.18,6.29,6.42,6.13,6.09,6.31,
+6.35,6.38,6.44,6.42,6.60,6.42,6.62,6.65,6.80,6.71,
+6.52,6.73,6.72,6.54,6.73,6.77,6.71,6.99,6.79,6.90,
+6.90,6.89,7.01,6.97,6.93,7.18,6.96,7.04,7.13,7.05,
+7.10,7.15,7.30,7.25,7.12,7.35,7.53,7.29,7.34,7.49,
+7.55,7.30,7.45,7.47,7.38,7.60,7.64,7.66,7.72,7.73,
+7.89,7.67,7.80,7.90,7.82,7.91,7.75,7.80,7.81,7.92,
+0.22,0.21,0.25,0.26,0.26,0.33,0.32,0.34,0.36,0.39,
+0.42,0.45,0.42,0.49,0.48,0.53,0.53,0.55,0.57,0.57,
+0.62,0.64,0.67,0.69,0.67,0.70,0.73,0.71,0.76,0.81,
+0.81,0.82,0.83,0.86,0.80,0.85,0.86,0.93,0.94,1.04,
+1.05,1.02,1.03,1.05,1.10,1.07,1.16,1.21,1.20,1.10,
+1.27,1.20,1.20,1.25,1.31,1.30,1.37,1.36,1.36,1.41,
+1.35,1.43,1.45,1.44,1.43,1.56,1.44,1.53,1.54,1.59,
+1.60,1.56,1.64,1.69,1.69,1.70,1.67,1.69,1.78,1.84,
+1.91,1.91,1.85,1.92,1.87,1.97,1.95,1.96,1.90,1.89,
+1.99,2.01,2.08,1.99,2.07,2.04,2.05,2.10,2.23,2.11,
+2.19,2.27,2.26,2.34,2.33,2.29,2.34,2.37,2.30,2.37,
+2.32,2.41,2.42,2.45,2.51,2.50,2.50,2.54,2.52,2.58,
+2.56,2.56,2.67,2.58,2.76,2.71,2.83,2.75,2.78,2.74,
+2.88,2.82,2.85,2.88,2.79,2.96,2.90,2.88,2.93,3.03,
+2.98,3.00,2.96,3.06,3.03,3.05,3.14,3.03,3.11,3.17,
+3.17,3.25,3.30,3.26,3.31,3.35,3.33,3.29,3.38,3.33,
+3.42,3.32,3.41,3.42,3.50,3.47,3.51,3.44,3.52,3.44,
+3.54,3.65,3.54,3.69,3.71,3.73,3.74,3.71,3.74,3.76,
+3.76,3.85,3.81,3.91,3.83,3.98,3.86,4.08,3.91,3.96,
+4.10,4.00,4.00,3.98,4.07,3.97,4.03,4.12,4.23,4.27,
+4.14,4.33,4.27,4.21,4.31,4.21,4.36,4.29,4.35,4.41,
+4.38,4.40,4.27,4.44,4.49,4.49,4.50,4.55,4.48,4.53,
+4.56,4.62,4.63,4.61,4.72,4.66,4.73,4.64,4.89,4.67,
+4.76,4.80,4.83,4.87,4.90,4.83,4.92,4.88,4.96,4.94,
+4.97,4.91,4.87,5.16,5.05,5.08,5.12,5.11,5.16,5.16,
+5.09,5.23,5.14,5.30,5.42,5.24,5.32,5.33,5.17,5.37,
+5.36,5.33,5.63,5.42,5.44,5.55,5.37,5.45,5.46,5.59,
+5.51,5.55,5.49,5.60,5.65,5.65,5.68,5.67,5.66,5.83,
+5.81,5.93,5.99,5.96,6.02,5.88,5.85,6.02,5.95,5.90,
+0.16,0.17,0.18,0.21,0.21,0.22,0.27,0.29,0.29,0.25,
+0.29,0.33,0.34,0.35,0.34,0.37,0.39,0.42,0.44,0.46,
+0.48,0.50,0.50,0.51,0.49,0.52,0.55,0.55,0.59,0.61,
+0.60,0.64,0.60,0.70,0.66,0.63,0.70,0.69,0.69,0.69,
+0.72,0.78,0.75,0.80,0.89,0.79,0.82,0.83,0.90,0.93,
+0.92,0.94,0.99,0.97,0.93,0.94,0.95,1.00,1.04,1.06,
+1.06,1.05,1.08,1.07,1.06,1.19,1.16,1.15,1.20,1.13,
+1.21,1.25,1.24,1.25,1.24,1.26,1.30,1.29,1.32,1.32,
+1.42,1.37,1.37,1.40,1.43,1.47,1.46,1.46,1.45,1.48,
+1.51,1.55,1.46,1.53,1.56,1.61,1.55,1.63,1.55,1.69,
+1.58,1.73,1.71,1.70,1.68,1.71,1.69,1.78,1.78,1.77,
+1.82,1.76,1.87,1.86,1.95,1.88,1.81,1.94,1.96,1.97,
+1.95,1.93,2.00,2.07,2.00,2.01,2.00,2.00,2.09,2.10,
+2.09,2.17,2.08,2.11,2.19,2.22,2.13,2.21,2.29,2.19,
+2.26,2.29,2.18,2.23,2.32,2.35,2.37,2.37,2.43,2.34,
+2.45,2.31,2.50,2.44,2.41,2.47,2.41,2.46,2.50,2.52,
+2.53,2.54,2.59,2.58,2.51,2.64,2.60,2.65,2.74,2.72,
+2.71,2.65,2.73,2.75,2.75,2.75,2.74,2.74,2.75,2.70,
+2.84,2.84,2.85,2.91,2.94,2.93,2.86,2.93,2.98,2.99,
+3.00,3.07,2.98,3.10,2.96,3.04,3.08,3.11,3.08,3.05,
+3.11,3.14,3.21,3.23,3.16,3.22,3.30,3.23,3.30,3.35,
+3.26,3.28,3.29,3.31,3.29,3.34,3.43,3.44,3.36,3.41,
+3.42,3.46,3.43,3.40,3.56,3.46,3.48,3.52,3.52,3.62,
+3.67,3.58,3.66,3.75,3.61,3.71,3.64,3.81,3.75,3.64,
+3.86,3.74,3.80,3.85,3.81,3.90,3.83,3.74,3.86,3.84,
+3.85,4.00,3.88,3.94,4.00,3.96,3.93,3.98,4.06,4.01,
+4.13,3.94,4.04,4.14,4.00,4.10,4.12,4.10,4.21,4.28,
+4.25,4.18,4.17,4.19,4.30,4.22,4.25,4.34,4.24,4.31,
+4.33,4.30,4.33,4.41,4.31,4.33,4.46,4.39,4.43,4.60,
+0.11,0.12,0.14,0.15,0.15,0.16,0.19,0.18,0.20,0.25,
+0.23,0.25,0.23,0.26,0.28,0.29,0.31,0.29,0.33,0.31,
+0.34,0.35,0.37,0.35,0.40,0.39,0.39,0.45,0.42,0.42,
+0.47,0.46,0.47,0.52,0.47,0.54,0.54,0.53,0.52,0.57,
+0.60,0.56,0.56,0.62,0.60,0.57,0.62,0.67,0.62,0.67,
+0.70,0.67,0.64,0.73,0.66,0.75,0.76,0.78,0.76,0.78,
+0.78,0.79,0.77,0.82,0.86,0.82,0.84,0.85,0.91,0.86,
+0.92,0.94,0.97,0.91,0.89,0.94,0.94,0.95,1.01,0.94,
+0.98,1.04,1.11,1.08,1.10,1.10,1.05,1.10,1.06,1.10,
+1.06,1.21,1.16,1.16,1.19,1.18,1.17,1.19,1.26,1.22,
+1.27,1.24,1.22,1.21,1.31,1.29,1.32,1.32,1.20,1.34,
+1.28,1.34,1.41,1.37,1.41,1.43,1.47,1.43,1.52,1.41,
+1.46,1.45,1.44,1.48,1.45,1.44,1.54,1.60,1.55,1.56,
+1.54,1.66,1.55,1.60,1.62,1.59,1.68,1.72,1.70,1.61,
+1.69,1.59,1.67,1.67,1.76,1.75,1.77,1.79,1.71,1.73,
+1.81,1.82,1.77,1.84,1.81,1.85,1.86,1.87,1.92,1.92,
+1.92,1.94,1.94,1.91,1.94,1.97,2.05,2.03,1.95,2.04,
+2.10,2.11,2.01,2.12,2.07,2.08,2.15,2.06,2.12,2.08,
+2.15,2.24,2.16,2.17,2.22,2.24,2.19,2.19,2.25,2.16,
+2.30,2.17,2.26,2.25,2.25,2.30,2.26,2.35,2.36,2.36,
+2.32,2.40,2.34,2.35,2.41,2.44,2.39,2.39,2.51,2.53,
+2.50,2.43,2.41,2.41,2.51,2.53,2.45,2.50,2.63,2.50,
+2.49,2.50,2.64,2.64,2.63,2.65,2.71,2.58,2.60,2.74,
+2.61,2.81,2.68,2.68,2.78,2.80,2.76,2.84,2.71,2.73,
+2.83,2.79,2.77,2.85,2.82,2.81,2.85,2.88,2.91,2.92,
+2.82,2.87,2.98,2.94,3.02,2.99,2.98,3.08,3.07,2.96,
+3.04,3.10,3.11,3.08,3.08,3.15,3.03,3.18,3.13,3.09,
+3.28,3.06,3.24,3.11,3.12,3.28,3.22,3.19,3.27,3.27,
+3.28,3.33,3.35,3.40,3.34,3.23,3.35,3.34,3.41,3.42,
+0.09,0.10,0.09,0.12,0.12,0.12,0.16,0.14,0.14,0.17,
+0.16,0.17,0.19,0.18,0.18,0.23,0.21,0.25,0.22,0.27,
+0.29,0.27,0.25,0.27,0.25,0.31,0.29,0.33,0.30,0.32,
+0.33,0.34,0.36,0.35,0.39,0.40,0.42,0.38,0.42,0.44,
+0.39,0.43,0.42,0.39,0.47,0.43,0.47,0.50,0.45,0.49,
+0.47,0.49,0.55,0.54,0.57,0.56,0.60,0.58,0.58,0.59,
+0.63,0.58,0.58,0.62,0.63,0.61,0.65,0.68,0.67,0.67,
+0.68,0.69,0.71,0.71,0.76,0.71,0.73,0.74,0.74,0.73,
+0.78,0.78,0.74,0.73,0.82,0.81,0.79,0.83,0.81,0.83,
+0.82,0.89,0.87,0.87,0.84,0.91,0.89,0.89,0.86,0.88,
+0.90,0.94,0.97,0.88,0.98,0.98,0.96,0.99,1.00,1.03,
+1.06,0.99,1.08,1.01,1.05,1.03,1.11,1.08,1.09,1.09,
+1.05,1.08,1.11,1.11,1.11,1.18,1.09,1.12,1.14,1.22,
+1.20,1.23,1.21,1.21,1.23,1.25,1.23,1.26,1.25,1.26,
+1.25,1.31,1.29,1.35,1.27,1.35,1.29,1.25,1.30,1.33,
+1.40,1.38,1.36,1.34,1.40,1.38,1.34,1.38,1.42,1.36,
+1.40,1.43,1.44,1.37,1.46,1.49,1.49,1.53,1.50,1.50,
+1.44,1.59,1.57,1.51,1.52,1.46,1.65,1.54,1.56,1.56,
+1.62,1.59,1.64,1.58,1.62,1.63,1.66,1.66,1.66,1.72,
+1.74,1.68,1.71,1.68,1.74,1.72,1.68,1.78,1.77,1.80,
+1.77,1.81,1.82,1.90,1.80,1.76,1.82,1.86,1.82,1.84,
+1.82,1.85,1.91,1.85,1.92,1.90,1.92,1.92,1.95,1.95,
+1.91,1.96,1.98,1.99,2.06,1.91,2.00,1.98,1.99,1.94,
+1.97,1.98,2.02,2.12,2.16,2.05,2.17,2.13,2.20,2.12,
+2.15,2.03,2.09,2.04,2.13,2.17,2.07,2.13,2.12,2.15,
+2.21,2.16,2.24,2.27,2.21,2.24,2.25,2.16,2.21,2.27,
+2.25,2.26,2.32,2.23,2.28,2.35,2.29,2.31,2.32,2.34,
+2.38,2.28,2.42,2.34,2.32,2.39,2.47,2.41,2.53,2.44,
+2.40,2.41,2.48,2.46,2.43,2.45,2.46,2.39,2.50,2.50,
+0.07,0.06,0.07,0.09,0.09,0.09,0.09,0.11,0.11,0.13,
+0.12,0.13,0.13,0.15,0.13,0.17,0.16,0.16,0.17,0.20,
+0.18,0.20,0.23,0.23,0.22,0.22,0.22,0.23,0.23,0.24,
+0.23,0.25,0.26,0.30,0.31,0.29,0.30,0.29,0.28,0.30,
+0.28,0.35,0.31,0.32,0.35,0.39,0.32,0.35,0.35,0.38,
+0.37,0.35,0.40,0.39,0.43,0.41,0.42,0.46,0.44,0.42,
+0.46,0.43,0.45,0.47,0.44,0.46,0.47,0.46,0.50,0.54,
+0.51,0.55,0.53,0.56,0.54,0.56,0.53,0.57,0.53,0.57,
+0.58,0.59,0.58,0.61,0.58,0.61,0.59,0.63,0.62,0.60,
+0.60,0.65,0.64,0.68,0.66,0.67,0.67,0.64,0.68,0.68,
+0.73,0.68,0.73,0.72,0.71,0.77,0.73,0.78,0.75,0.73,
+0.71,0.79,0.77,0.76,0.81,0.74,0.84,0.80,0.79,0.76,
+0.82,0.83,0.80,0.85,0.86,0.83,0.86,0.85,0.85,0.85,
+0.86,0.88,0.84,0.88,0.88,0.95,0.93,0.94,0.96,0.88,
+0.93,0.93,0.95,0.94,0.97,1.01,1.02,0.96,0.94,1.03,
+0.99,0.90,0.99,1.00,1.12,1.02,1.04,1.05,1.10,1.09,
+1.07,1.08,1.12,1.13,1.12,1.06,1.13,1.07,1.15,1.14,
+1.11,1.14,1.16,1.08,1.18,1.17,1.16,1.16,1.21,1.22,
+1.19,1.23,1.24,1.26,1.23,1.21,1.21,1.30,1.24,1.23,
+1.27,1.29,1.24,1.26,1.32,1.31,1.30,1.34,1.29,1.35,
+1.31,1.34,1.31,1.29,1.35,1.33,1.34,1.43,1.44,1.37,
+1.32,1.46,1.38,1.40,1.38,1.43,1.46,1.45,1.38,1.39,
+1.45,1.46,1.52,1.49,1.45,1.50,1.55,1.46,1.54,1.54,
+1.48,1.54,1.52,1.62,1.46,1.57,1.56,1.54,1.53,1.58,
+1.59,1.54,1.59,1.62,1.60,1.64,1.59,1.58,1.59,1.59,
+1.62,1.60,1.75,1.69,1.71,1.69,1.62,1.67,1.64,1.67,
+1.73,1.67,1.77,1.69,1.73,1.81,1.73,1.80,1.77,1.79,
+1.81,1.71,1.77,1.73,1.75,1.85,1.74,1.89,1.87,1.78,
+1.80,1.80,1.85,1.82,1.88,1.84,1.84,1.85,1.93,1.87,
+0.05,0.05,0.06,0.05,0.07,0.08,0.09,0.07,0.07,0.10,
+0.09,0.12,0.11,0.10,0.12,0.11,0.11,0.14,0.13,0.17,
+0.16,0.15,0.15,0.14,0.14,0.16,0.17,0.20,0.16,0.18,
+0.17,0.17,0.22,0.20,0.23,0.23,0.22,0.20,0.22,0.22,
+0.20,0.22,0.26,0.26,0.25,0.28,0.29,0.24,0.28,0.27,
+0.27,0.32,0.30,0.27,0.28,0.29,0.31,0.29,0.33,0.34,
+0.35,0.32,0.35,0.35,0.39,0.34,0.35,0.37,0.39,0.42,
+0.41,0.35,0.39,0.37,0.39,0.39,0.38,0.40,0.41,0.42,
+0.42,0.41,0.41,0.45,0.47,0.47,0.47,0.43,0.45,0.44,
+0.48,0.50,0.51,0.54,0.46,0.44,0.52,0.48,0.47,0.51,
+0.53,0.53,0.54,0.52,0.52,0.58,0.57,0.54,0.58,0.58,
+0.56,0.58,0.56,0.57,0.54,0.57,0.59,0.55,0.65,0.62,
+0.64,0.62,0.61,0.65,0.62,0.65,0.64,0.61,0.67,0.61,
+0.68,0.65,0.64,0.69,0.66,0.67,0.70,0.69,0.68,0.69,
+0.67,0.69,0.75,0.69,0.71,0.72,0.75,0.72,0.74,0.73,
+0.77,0.72,0.80,0.78,0.72,0.77,0.80,0.78,0.82,0.79,
+0.80,0.76,0.82,0.84,0.86,0.84,0.79,0.85,0.85,0.85,
+0.87,0.87,0.84,0.90,0.83,0.86,0.86,0.89,0.85,0.87,
+0.95,0.84,0.97,0.92,0.94,0.92,0.92,0.99,0.96,0.94,
+0.93,0.92,0.97,0.97,0.89,0.92,0.97,0.99,1.01,0.95,
+0.98,0.97,1.05,1.02,1.08,1.04,1.03,1.07,1.00,1.10,
+1.08,1.05,1.09,1.05,1.05,1.02,1.09,1.11,1.10,1.03,
+1.10,1.15,1.17,1.11,1.17,1.16,1.15,1.21,1.11,1.11,
+1.19,1.19,1.14,1.16,1.16,1.20,1.17,1.14,1.14,1.17,
+1.11,1.22,1.17,1.24,1.13,1.25,1.19,1.25,1.21,1.24,
+1.21,1.25,1.22,1.22,1.23,1.26,1.27,1.22,1.28,1.31,
+1.26,1.28,1.28,1.23,1.26,1.26,1.27,1.34,1.28,1.28,
+1.34,1.32,1.31,1.37,1.39,1.38,1.35,1.38,1.35,1.32,
+1.35,1.40,1.37,1.41,1.34,1.34,1.41,1.42,1.43,1.47,
+0.03,0.04,0.05,0.05,0.05,0.06,0.08,0.06,0.06,0.07,
+0.07,0.08,0.09,0.09,0.07,0.10,0.09,0.10,0.10,0.09,
+0.12,0.12,0.13,0.12,0.11,0.11,0.12,0.14,0.13,0.15,
+0.14,0.15,0.14,0.14,0.15,0.14,0.18,0.18,0.15,0.18,
+0.18,0.17,0.15,0.19,0.19,0.21,0.20,0.21,0.24,0.21,
+0.22,0.22,0.20,0.22,0.22,0.24,0.23,0.25,0.26,0.23,
+0.26,0.24,0.24,0.26,0.25,0.27,0.26,0.28,0.26,0.26,
+0.29,0.28,0.31,0.27,0.29,0.29,0.32,0.30,0.29,0.33,
+0.31,0.33,0.28,0.34,0.32,0.37,0.34,0.36,0.37,0.36,
+0.36,0.33,0.38,0.37,0.37,0.36,0.39,0.38,0.38,0.39,
+0.40,0.38,0.39,0.38,0.38,0.36,0.41,0.43,0.42,0.40,
+0.44,0.41,0.43,0.42,0.46,0.42,0.39,0.43,0.45,0.44,
+0.45,0.45,0.51,0.47,0.51,0.52,0.45,0.46,0.48,0.47,
+0.50,0.51,0.49,0.53,0.49,0.53,0.53,0.50,0.55,0.52,
+0.50,0.52,0.54,0.54,0.56,0.56,0.54,0.54,0.54,0.55,
+0.57,0.58,0.59,0.57,0.57,0.59,0.62,0.61,0.62,0.61,
+0.61,0.59,0.59,0.62,0.65,0.65,0.61,0.64,0.61,0.61,
+0.61,0.61,0.67,0.64,0.66,0.64,0.67,0.65,0.66,0.70,
+0.71,0.66,0.68,0.68,0.65,0.69,0.73,0.70,0.71,0.70,
+0.70,0.69,0.72,0.71,0.71,0.76,0.72,0.73,0.73,0.76,
+0.66,0.76,0.76,0.81,0.75,0.76,0.77,0.75,0.84,0.77,
+0.78,0.80,0.80,0.74,0.82,0.80,0.84,0.79,0.83,0.79,
+0.83,0.79,0.79,0.83,0.79,0.86,0.82,0.91,0.83,0.81,
+0.81,0.85,0.84,0.86,0.84,0.84,0.89,0.91,0.88,0.92,
+0.92,0.92,0.86,0.88,0.95,0.92,0.91,0.91,0.94,0.96,
+0.92,0.94,0.95,0.99,0.93,0.98,0.93,0.93,0.94,1.00,
+0.97,0.95,0.96,0.94,0.96,1.02,0.93,0.93,1.01,0.91,
+0.99,1.00,0.95,1.02,0.96,1.05,1.01,1.03,1.01,1.07,
+1.02,1.02,1.06,1.06,1.01,1.06,1.01,1.09,1.02,1.10,
+0.03,0.03,0.03,0.03,0.04,0.05,0.05,0.06,0.05,0.06,
+0.05,0.04,0.07,0.06,0.07,0.06,0.06,0.07,0.07,0.07,
+0.07,0.07,0.08,0.08,0.10,0.11,0.10,0.10,0.09,0.10,
+0.10,0.12,0.13,0.11,0.12,0.11,0.12,0.13,0.13,0.13,
+0.12,0.13,0.15,0.15,0.14,0.15,0.15,0.14,0.17,0.16,
+0.14,0.17,0.17,0.16,0.20,0.17,0.19,0.17,0.18,0.18,
+0.16,0.19,0.18,0.19,0.20,0.18,0.22,0.20,0.21,0.23,
+0.20,0.23,0.21,0.21,0.22,0.21,0.23,0.24,0.26,0.23,
+0.23,0.25,0.23,0.25,0.24,0.25,0.27,0.26,0.26,0.26,
+0.24,0.26,0.27,0.25,0.28,0.31,0.28,0.30,0.28,0.29,
+0.31,0.30,0.27,0.28,0.28,0.31,0.33,0.36,0.33,0.33,
+0.31,0.33,0.31,0.32,0.31,0.33,0.32,0.37,0.31,0.32,
+0.37,0.36,0.36,0.35,0.38,0.39,0.36,0.34,0.36,0.34,
+0.35,0.36,0.37,0.38,0.37,0.37,0.39,0.42,0.40,0.40,
+0.42,0.39,0.39,0.39,0.43,0.43,0.41,0.41,0.42,0.44,
+0.44,0.41,0.41,0.47,0.43,0.45,0.41,0.42,0.47,0.42,
+0.51,0.48,0.43,0.48,0.44,0.47,0.47,0.46,0.49,0.49,
+0.43,0.51,0.51,0.48,0.51,0.52,0.51,0.50,0.50,0.53,
+0.50,0.53,0.46,0.51,0.52,0.54,0.57,0.52,0.55,0.53,
+0.55,0.54,0.56,0.56,0.59,0.59,0.57,0.54,0.54,0.56,
+0.60,0.55,0.56,0.54,0.59,0.58,0.57,0.62,0.58,0.56,
+0.58,0.52,0.61,0.62,0.64,0.61,0.64,0.59,0.63,0.62,
+0.62,0.65,0.68,0.67,0.65,0.60,0.61,0.60,0.62,0.64,
+0.66,0.64,0.64,0.66,0.67,0.66,0.62,0.63,0.66,0.66,
+0.67,0.62,0.67,0.68,0.63,0.69,0.69,0.65,0.67,0.71,
+0.73,0.67,0.69,0.68,0.67,0.70,0.68,0.68,0.74,0.67,
+0.77,0.70,0.71,0.73,0.73,0.75,0.72,0.74,0.73,0.75,
+0.76,0.77,0.74,0.73,0.74,0.76,0.79,0.79,0.76,0.78,
+0.78,0.79,0.80,0.75,0.82,0.72,0.76,0.80,0.84,0.81,
+1.73,1.82,2.07,2.22,2.42,2.56,2.69,2.73,3.12,3.24,
+3.45,3.43,3.71,3.86,4.01,4.19,4.33,4.55,4.70,4.86,
+5.07,5.22,5.34,5.46,5.64,5.81,5.88,6.19,6.39,6.49,
+6.68,6.67,7.06,7.14,7.34,7.55,7.65,7.72,8.03,8.21,
+8.34,8.59,8.61,8.70,8.87,9.04,9.30,9.37,9.54,9.91,
+10.00,10.07,10.37,10.51,10.52,10.69,11.06,11.01,11.25,11.48,
+11.62,11.80,11.84,12.20,12.21,12.42,12.52,12.76,12.93,13.05,
+13.20,13.38,13.64,13.96,13.94,13.91,14.20,14.48,14.65,14.78,
+15.07,15.00,15.30,15.31,15.60,15.73,15.86,16.34,16.12,16.32,
+16.48,16.76,16.93,17.03,17.20,17.46,17.59,17.63,17.85,18.00,
+18.25,18.34,18.54,18.65,18.89,18.92,19.37,19.36,19.48,19.75,
+19.81,19.86,20.13,20.48,20.53,20.68,21.03,21.11,21.04,21.28,
+21.53,21.57,21.66,22.19,22.24,22.34,22.44,22.75,22.96,23.25,
+23.03,23.10,23.37,23.62,23.72,23.77,24.06,24.48,24.46,24.48,
+25.04,25.09,25.29,25.19,25.43,25.74,25.50,26.07,26.11,26.31,
+26.47,26.54,26.59,26.76,27.15,27.18,27.37,27.68,28.01,28.06,
+28.14,28.30,28.39,28.79,29.02,28.69,29.26,29.20,29.47,29.66,
+29.54,30.06,30.00,30.34,30.20,30.64,30.72,30.80,31.31,31.15,
+31.45,31.36,31.68,31.94,31.52,32.23,32.33,32.65,32.64,32.78,
+32.95,33.12,33.26,33.67,33.69,33.83,34.10,34.15,34.41,34.71,
+34.75,35.02,34.91,35.31,35.44,35.39,35.90,36.03,35.65,36.22,
+36.28,36.48,36.62,36.99,37.01,37.11,37.36,37.26,37.68,37.83,
+37.79,38.14,38.35,38.70,38.74,39.17,38.72,39.17,39.45,39.81,
+39.54,39.78,40.15,40.30,40.30,40.38,40.77,40.74,40.93,41.07,
+41.17,41.34,41.57,41.74,41.96,42.30,42.31,42.22,42.59,42.89,
+42.80,42.93,43.36,43.39,43.56,43.68,43.82,44.58,44.43,44.42,
+44.75,44.84,44.74,45.14,45.36,45.70,45.71,45.51,45.77,46.12,
+46.09,46.55,46.64,46.66,46.99,46.95,46.89,47.52,47.44,47.63,
+47.55,48.07,48.41,48.28,48.50,48.68,48.97,49.20,49.07,49.51,
+1.30,1.35,1.58,1.70,1.82,1.94,2.04,2.16,2.23,2.45,
+2.54,2.73,2.84,2.84,3.15,3.17,3.30,3.50,3.54,3.64,
+3.77,3.91,4.07,4.23,4.35,4.40,4.55,4.76,4.74,4.89,
+4.98,5.12,5.34,5.55,5.57,5.64,5.71,5.95,6.10,6.13,
+6.36,6.41,6.48,6.62,6.78,6.82,7.15,7.08,7.35,7.54,
+7.61,7.67,7.85,7.86,8.08,8.26,8.43,8.57,8.63,8.63,
+8.85,8.83,9.19,9.31,9.38,9.35,9.60,9.57,9.83,10.02,
+10.04,10.23,10.36,10.39,10.62,10.73,10.70,10.85,11.16,11.29,
+11.30,11.46,11.79,11.71,11.58,11.97,12.05,12.16,12.37,12.47,
+12.67,12.69,12.87,12.93,13.12,13.15,13.31,13.44,13.51,13.70,
+13.69,14.01,14.08,14.31,14.39,14.41,14.44,14.66,14.93,14.90,
+15.03,15.33,15.32,15.55,15.54,15.89,15.93,15.89,15.96,16.18,
+16.43,16.46,16.57,17.02,16.84,16.95,17.05,17.15,17.36,17.50,
+17.62,17.75,17.83,18.12,18.08,18.39,18.46,18.40,18.61,18.82,
+18.93,18.86,19.06,19.29,19.15,19.33,19.56,19.86,19.93,20.05,
+20.29,19.92,20.21,20.50,20.72,20.82,20.93,20.94,21.07,21.04,
+21.33,21.21,21.83,21.93,22.01,22.02,22.07,22.37,22.34,22.56,
+22.59,22.57,22.88,22.95,23.14,23.18,23.48,23.30,23.44,23.38,
+23.88,24.12,24.06,24.22,24.22,24.35,24.87,24.73,24.73,24.95,
+25.23,25.25,25.34,25.51,25.61,25.71,25.92,25.92,25.92,26.23,
+26.39,26.47,26.65,26.45,27.01,27.12,26.77,27.11,27.48,27.44,
+27.67,27.74,27.46,28.03,27.89,28.24,28.52,28.73,28.67,28.73,
+28.88,29.05,29.06,29.06,29.40,29.62,29.43,29.85,30.04,29.82,
+30.09,30.12,30.40,30.52,30.44,30.59,30.65,31.32,31.08,31.13,
+31.55,31.71,31.48,31.88,31.75,32.11,31.84,32.18,32.30,32.29,
+32.54,32.79,32.87,32.83,33.41,33.22,33.28,33.55,33.57,33.54,
+33.81,33.96,34.03,34.24,34.40,34.55,34.46,34.79,34.95,34.99,
+35.24,35.23,35.43,35.55,35.58,35.74,35.87,36.00,36.05,36.16,
+36.43,36.52,36.42,36.78,36.80,37.24,37.45,37.22,37.36,37.53,
+0.97,1.06,1.16,1.25,1.45,1.49,1.55,1.68,1.78,1.84,
+1.93,2.04,2.22,2.23,2.27,2.39,2.52,2.61,2.66,2.73,
+2.83,2.98,3.12,3.13,3.26,3.35,3.45,3.65,3.69,3.68,
+3.86,3.96,4.01,4.22,4.22,4.36,4.37,4.44,4.67,4.63,
+4.68,4.91,4.98,5.05,5.07,5.29,5.33,5.47,5.64,5.69,
+5.81,5.74,5.90,5.94,6.02,6.16,6.29,6.40,6.55,6.53,
+6.77,6.71,7.00,7.02,7.10,7.30,7.34,7.33,7.45,7.54,
+7.65,7.85,7.84,7.95,8.07,8.07,8.21,8.46,8.49,8.48,
+8.62,8.70,8.81,8.60,9.02,9.01,9.34,9.28,9.36,9.41,
+9.48,9.60,9.74,9.91,10.04,9.88,10.01,10.17,10.33,10.42,
+10.43,10.52,10.86,10.81,10.82,10.84,11.13,11.15,11.33,11.21,
+11.59,11.44,11.70,11.79,11.79,12.06,12.01,12.07,12.02,12.28,
+12.47,12.43,12.84,12.88,12.78,12.79,12.88,13.23,13.17,13.17,
+13.31,13.37,13.66,13.63,13.89,13.84,14.01,13.91,14.08,14.08,
+14.25,14.42,14.44,14.60,14.69,14.85,14.88,14.87,14.98,15.39,
+15.33,15.46,15.54,15.56,15.96,15.56,15.87,16.01,16.11,16.14,
+16.32,16.32,16.36,16.41,16.68,16.66,16.93,16.69,16.80,16.95,
+17.31,17.03,17.55,17.59,17.34,17.67,17.80,17.80,17.78,18.14,
+18.00,18.29,18.58,18.45,18.55,18.65,18.62,18.77,19.06,18.99,
+19.13,19.36,19.09,19.40,19.51,19.33,19.53,19.68,19.73,19.80,
+19.87,20.13,20.36,20.31,20.50,20.59,20.70,20.74,20.71,21.12,
+21.05,21.23,21.30,21.38,21.31,21.43,21.59,21.69,21.95,21.79,
+21.92,21.98,22.36,22.22,22.31,22.42,22.46,22.56,22.53,22.94,
+22.88,22.94,23.14,22.99,23.22,23.39,23.52,23.71,23.44,23.65,
+24.02,23.78,24.52,24.22,24.40,24.41,24.46,24.48,24.87,25.01,
+24.76,25.00,24.73,25.12,25.29,25.14,25.36,25.51,25.70,25.89,
+25.81,25.84,25.83,26.10,26.11,26.06,26.45,26.55,26.62,26.54,
+26.39,26.82,26.77,26.75,26.72,27.56,27.39,27.40,27.29,27.47,
+27.60,27.59,27.74,28.01,28.11,27.98,28.06,28.06,28.53,28.37,
+0.74,0.84,0.92,0.94,1.12,1.11,1.20,1.22,1.38,1.37,
+1.46,1.52,1.60,1.71,1.73,1.85,1.90,1.97,2.03,2.17,
+2.24,2.28,2.46,2.47,2.45,2.58,2.70,2.74,2.75,2.94,
+2.86,2.99,3.09,3.08,3.25,3.15,3.33,3.36,3.46,3.60,
+3.64,3.67,3.73,3.87,3.90,4.03,4.07,4.20,4.22,4.27,
+4.44,4.49,4.48,4.57,4.71,4.75,4.76,4.84,4.85,4.89,
+5.08,5.16,5.24,5.42,5.47,5.50,5.59,5.54,5.72,5.82,
+5.90,5.88,5.94,6.04,6.12,6.24,6.16,6.32,6.33,6.51,
+6.54,6.66,6.74,6.67,6.80,6.85,6.93,7.01,7.14,7.14,
+7.20,7.44,7.39,7.55,7.42,7.58,7.72,7.78,7.82,7.88,
+8.01,7.87,8.09,8.36,8.39,8.38,8.49,8.53,8.66,8.63,
+8.66,8.82,8.98,8.92,9.08,9.06,9.04,9.13,9.40,9.25,
+9.32,9.63,9.39,9.69,9.77,9.82,9.84,9.86,9.93,10.21,
+10.23,10.15,10.33,10.21,10.57,10.55,10.69,10.54,10.66,10.82,
+10.80,10.93,10.95,10.87,11.02,11.11,11.25,11.33,11.37,11.60,
+11.59,11.52,11.84,11.91,12.00,12.08,11.77,12.06,12.15,12.24,
+12.42,12.44,12.41,12.50,12.50,12.66,12.64,12.86,12.89,13.02,
+13.10,13.06,13.43,13.34,13.52,13.39,13.61,13.65,13.67,13.72,
+13.66,13.84,13.88,14.03,13.89,14.20,14.25,14.60,14.20,14.47,
+14.29,14.43,14.68,14.75,14.72,14.85,14.91,14.91,15.05,15.19,
+15.23,15.07,15.45,15.38,15.86,15.74,15.57,15.82,15.73,15.80,
+16.02,16.16,16.06,16.34,16.27,16.09,16.51,16.36,16.35,16.71,
+16.63,16.66,16.89,16.73,17.18,16.99,16.98,17.02,17.48,17.29,
+17.36,17.54,17.39,17.78,17.80,17.90,17.70,17.96,18.03,18.14,
+18.18,18.50,18.23,18.27,18.36,18.27,18.53,18.76,18.57,18.75,
+19.02,18.94,18.95,19.16,18.95,19.31,19.15,19.37,19.15,19.49,
+19.65,19.83,19.69,19.67,19.72,19.96,19.98,20.21,20.13,20.37,
+20.37,20.38,20.58,20.48,20.66,20.59,20.78,20.75,20.91,21.04,
+20.90,21.08,21.11,21.36,21.38,21.48,21.22,21.41,21.58,21.32,
+0.54,0.63,0.66,0.70,0.78,0.88,0.89,0.97,1.08,1.11,
+1.10,1.23,1.23,1.29,1.39,1.35,1.47,1.51,1.52,1.56,
+1.63,1.76,1.77,1.81,1.92,1.97,1.94,2.03,2.10,2.20,
+2.17,2.21,2.37,2.45,2.45,2.42,2.55,2.57,2.69,2.71,
+2.78,2.84,2.78,2.90,2.89,3.04,3.10,3.09,3.19,3.27,
+3.31,3.40,3.33,3.55,3.50,3.63,3.59,3.69,3.83,3.81,
+4.02,3.97,3.99,3.99,4.14,4.26,4.15,4.34,4.29,4.43,
+4.31,4.43,4.58,4.47,4.70,4.74,4.88,4.74,4.91,4.95,
+4.96,5.02,5.07,5.06,5.21,5.15,5.29,5.36,5.35,5.50,
+5.47,5.73,5.65,5.75,5.69,5.77,5.85,5.92,5.95,5.90,
+6.08,6.08,6.14,6.26,6.20,6.37,6.37,6.41,6.52,6.61,
+6.60,6.73,6.71,6.84,6.87,6.94,6.93,7.02,6.93,7.11,
+7.17,7.23,7.35,7.37,7.43,7.44,7.51,7.50,7.63,7.66,
+7.64,7.82,7.84,7.86,7.88,7.97,8.10,8.17,8.22,8.25,
+8.22,8.38,8.33,8.43,8.41,8.58,8.55,8.70,8.80,8.85,
+8.85,8.84,8.90,9.12,9.05,9.04,9.12,9.13,9.38,9.15,
+9.20,9.40,9.65,9.31,9.61,9.53,9.69,9.80,9.86,9.92,
+9.86,9.97,10.15,10.09,10.12,10.24,10.09,10.22,10.29,10.37,
+10.53,10.58,10.66,10.61,10.61,10.60,10.87,10.77,11.10,10.99,
+10.88,11.03,11.26,11.35,11.24,11.18,11.16,11.31,11.50,11.50,
+11.59,11.75,11.78,11.54,11.70,11.82,12.04,11.89,11.97,12.09,
+12.09,12.16,12.21,12.22,12.25,12.31,12.58,12.67,12.46,12.72,
+12.70,12.66,12.68,12.69,12.82,12.91,12.81,13.19,13.20,13.02,
+13.11,13.29,13.33,13.36,13.52,13.65,13.53,13.52,13.71,13.68,
+13.86,13.94,13.81,13.87,14.19,14.00,14.01,14.02,14.33,14.26,
+14.31,14.44,14.46,14.46,14.45,14.59,14.69,14.63,14.69,14.93,
+14.73,14.70,14.94,15.01,15.20,15.21,15.22,15.15,15.47,15.33,
+15.33,15.52,15.64,15.67,15.47,15.77,15.57,15.69,15.88,16.04,
+15.97,15.95,16.13,16.23,16.24,16.22,16.18,16.32,16.33,16.35,
+0.45,0.46,0.54,0.58,0.63,0.66,0.71,0.70,0.80,0.83,
+0.91,0.89,0.93,1.02,0.99,1.12,1.07,1.13,1.23,1.21,
+1.18,1.31,1.36,1.43,1.45,1.47,1.53,1.49,1.60,1.66,
+1.74,1.76,1.78,1.88,1.83,1.91,1.89,1.88,2.06,2.11,
+2.11,2.12,2.22,2.26,2.39,2.29,2.41,2.40,2.43,2.49,
+2.51,2.56,2.57,2.64,2.65,2.74,2.58,2.69,2.83,2.94,
+2.97,3.02,3.08,3.00,3.05,3.12,3.15,3.22,3.37,3.35,
+3.39,3.40,3.45,3.56,3.51,3.56,3.57,3.61,3.73,3.74,
+3.74,3.84,3.88,3.97,4.01,3.97,4.09,4.07,4.04,4.17,
+4.23,4.22,4.29,4.39,4.34,4.43,4.46,4.49,4.38,4.51,
+4.56,4.59,4.76,4.77,4.68,4.82,4.92,4.91,4.95,4.95,
+5.02,4.99,5.24,5.21,5.17,5.27,5.43,5.40,5.30,5.49,
+5.44,5.52,5.54,5.51,5.59,5.62,5.69,5.85,5.72,5.74,
+5.88,5.86,6.01,6.11,6.15,6.16,6.01,6.25,6.27,6.28,
+6.32,6.32,6.47,6.45,6.34,6.58,6.61,6.57,6.55,6.69,
+6.63,6.74,6.78,6.71,6.91,6.89,6.97,6.93,6.97,7.26,
+7.20,7.19,7.12,7.33,7.37,7.50,7.31,7.48,7.39,7.51,
+7.63,7.55,7.56,7.75,7.74,7.79,7.80,7.74,8.02,7.86,
+8.02,8.01,8.09,8.08,8.05,8.32,8.21,8.25,8.29,8.39,
+8.36,8.45,8.39,8.46,8.60,8.71,8.52,8.83,8.66,8.77,
+8.88,8.65,8.93,8.95,9.01,8.98,9.07,9.10,9.13,9.10,
+9.24,9.22,9.34,9.45,9.42,9.53,9.44,9.71,9.59,9.49,
+9.64,9.74,9.88,9.57,9.68,9.66,9.70,10.03,9.92,9.91,
+10.21,10.09,10.17,10.20,10.23,10.15,10.40,10.23,10.32,10.53,
+10.46,10.39,10.45,10.68,10.55,10.55,10.64,10.88,10.78,10.76,
+10.68,10.95,10.95,11.17,11.10,11.25,11.15,11.33,11.33,11.28,
+11.39,11.34,11.30,11.63,11.44,11.60,11.55,11.62,11.67,11.61,
+11.78,11.82,11.80,11.92,11.87,11.98,11.82,12.00,12.19,12.02,
+12.19,12.35,12.25,12.24,12.33,12.28,12.50,12.36,12.40,12.45,
+0.34,0.37,0.37,0.40,0.42,0.49,0.49,0.53,0.56,0.65,
+0.67,0.68,0.75,0.69,0.75,0.80,0.89,0.88,0.88,0.95,
+0.99,1.02,1.06,1.02,1.10,1.03,1.17,1.21,1.25,1.22,
+1.33,1.25,1.42,1.39,1.39,1.41,1.43,1.47,1.51,1.58,
+1.58,1.65,1.66,1.66,1.72,1.72,1.77,1.92,1.87,1.88,
+1.95,1.94,1.96,2.06,2.04,2.07,2.10,2.14,2.26,2.24,
+2.20,2.31,2.28,2.33,2.34,2.45,2.41,2.48,2.54,2.56,
+2.59,2.58,2.55,2.65,2.66,2.74,2.75,2.76,2.82,2.84,
+2.88,2.83,2.98,2.92,2.89,3.09,3.11,3.05,3.11,3.17,
+3.20,3.23,3.34,3.31,3.27,3.32,3.45,3.48,3.36,3.47,
+3.53,3.54,3.58,3.58,3.58,3.62,3.73,3.81,3.73,3.81,
+3.91,3.82,3.92,3.93,3.90,4.01,4.04,3.97,4.01,4.13,
+4.29,4.25,4.20,4.21,4.25,4.28,4.36,4.22,4.40,4.49,
+4.42,4.47,4.54,4.51,4.55,4.64,4.63,4.75,4.63,4.76,
+4.91,4.77,4.92,4.91,4.93,4.98,4.91,5.16,5.10,5.00,
+5.04,5.19,5.13,5.07,5.26,5.21,5.33,5.21,5.29,5.47,
+5.51,5.49,5.49,5.49,5.52,5.49,5.63,5.65,5.58,5.71,
+5.67,5.76,5.81,5.79,5.92,5.89,5.82,6.02,6.00,6.00,
+6.07,6.11,6.02,6.07,6.21,6.19,6.27,6.21,6.21,6.16,
+6.47,6.51,6.47,6.45,6.49,6.46,6.41,6.51,6.58,6.74,
+6.63,6.79,6.83,6.78,6.80,6.81,6.84,6.84,6.93,6.85,
+7.00,7.04,7.14,6.99,7.02,7.12,7.22,7.14,7.37,7.25,
+7.28,7.55,7.44,7.44,7.45,7.46,7.54,7.61,7.62,7.45,
+7.65,7.63,7.73,7.86,7.98,7.71,7.82,7.91,7.86,7.93,
+7.99,7.96,8.13,7.99,8.05,8.11,8.29,8.31,8.22,8.19,
+8.37,8.27,8.21,8.49,8.63,8.39,8.23,8.66,8.64,8.64,
+8.65,8.59,8.58,8.77,8.65,8.78,8.69,8.79,8.89,9.03,
+9.02,8.90,8.92,9.03,9.16,8.89,9.00,9.18,9.13,9.17,
+9.35,9.39,9.19,9.39,9.31,9.29,9.37,9.51,9.39,9.43,
+0.25,0.26,0.32,0.37,0.36,0.36,0.41,0.40,0.43,0.47,
+0.49,0.50,0.51,0.59,0.60,0.60,0.61,0.65,0.67,0.72,
+0.73,0.78,0.77,0.82,0.84,0.82,0.84,0.93,0.94,0.92,
+0.96,1.03,1.04,1.09,1.05,1.12,1.10,1.16,1.14,1.23,
+1.22,1.22,1.30,1.30,1.28,1.34,1.39,1.33,1.43,1.40,
+1.47,1.49,1.45,1.54,1.50,1.61,1.62,1.60,1.61,1.72,
+1.76,1.75,1.81,1.77,1.81,1.78,1.84,1.83,1.84,1.90,
+1.94,1.94,2.05,2.02,2.00,2.10,2.14,2.13,2.18,2.15,
+2.19,2.22,2.18,2.23,2.23,2.34,2.32,2.32,2.33,2.36,
+2.34,2.44,2.54,2.49,2.52,2.53,2.60,2.59,2.68,2.73,
+2.67,2.72,2.67,2.74,2.80,2.79,2.84,2.85,2.84,2.90,
+2.85,2.94,2.92,2.93,2.95,3.11,3.06,3.14,3.18,3.12,
+3.19,3.17,3.20,3.29,3.18,3.34,3.26,3.36,3.25,3.31,
+3.47,3.39,3.45,3.39,3.50,3.47,3.60,3.62,3.55,3.68,
+3.66,3.58,3.63,3.67,3.67,3.93,3.85,3.88,3.86,3.78,
+3.83,3.89,3.95,4.00,3.93,3.98,3.99,4.05,4.03,4.19,
+4.09,4.13,4.20,4.22,4.19,4.25,4.32,4.20,4.39,4.17,
+4.44,4.30,4.42,4.37,4.50,4.50,4.51,4.68,4.62,4.52,
+4.53,4.58,4.72,4.65,4.77,4.65,4.74,4.85,4.72,4.79,
+4.80,4.91,4.82,4.81,4.89,5.07,4.97,5.05,5.12,5.09,
+5.17,5.01,5.12,5.08,5.24,5.19,5.14,5.23,5.22,5.24,
+5.30,5.42,5.29,5.29,5.41,5.38,5.46,5.58,5.46,5.48,
+5.68,5.52,5.52,5.69,5.78,5.69,5.77,5.69,5.74,5.82,
+5.75,5.85,5.81,5.87,5.89,5.92,5.91,5.88,5.98,6.07,
+6.03,6.17,6.11,6.04,6.14,6.26,6.39,6.13,6.29,6.07,
+6.24,6.30,6.33,6.30,6.48,6.43,6.43,6.42,6.46,6.45,
+6.45,6.60,6.45,6.60,6.66,6.72,6.66,6.64,6.71,6.76,
+6.85,6.70,6.74,6.82,6.93,6.85,6.98,7.01,7.03,7.08,
+6.95,6.89,7.06,7.00,7.24,7.06,7.19,7.14,7.21,7.12,
+0.20,0.21,0.20,0.23,0.25,0.27,0.30,0.30,0.35,0.38,
+0.35,0.40,0.42,0.40,0.43,0.44,0.52,0.52,0.54,0.51,
+0.56,0.58,0.59,0.61,0.69,0.67,0.62,0.75,0.70,0.76,
+0.73,0.78,0.77,0.87,0.77,0.83,0.91,0.89,0.89,0.87,
+0.98,0.95,0.89,1.01,0.99,0.99,1.02,0.98,1.06,1.11,
+1.10,1.13,1.12,1.17,1.18,1.18,1.17,1.26,1.27,1.26,
+1.30,1.30,1.34,1.30,1.35,1.42,1.43,1.41,1.45,1.42,
+1.48,1.47,1.50,1.55,1.52,1.62,1.62,1.55,1.59,1.62,
+1.60,1.66,1.68,1.71,1.72,1.73,1.72,1.73,1.86,1.79,
+1.79,1.79,1.92,1.82,1.97,1.85,1.95,1.99,1.97,1.97,
+2.04,2.04,2.04,2.08,2.08,2.15,2.12,2.15,2.18,2.24,
+2.23,2.24,2.27,2.25,2.24,2.25,2.26,2.38,2.41,2.35,
+2.39,2.40,2.43,2.45,2.45,2.48,2.53,2.53,2.47,2.54,
+2.61,2.50,2.57,2.59,2.64,2.79,2.63,2.66,2.70,2.76,
+2.77,2.81,2.77,2.77,2.88,2.81,2.90,2.95,2.90,2.89,
+2.97,2.94,2.94,3.07,3.03,3.05,3.04,3.00,3.09,3.07,
+3.17,3.16,3.10,3.19,3.20,3.21,3.21,3.18,3.23,3.29,
+3.29,3.29,3.34,3.36,3.39,3.28,3.47,3.48,3.58,3.58,
+3.54,3.54,3.52,3.53,3.58,3.59,3.52,3.52,3.74,3.67,
+3.68,3.58,3.66,3.77,3.65,3.75,3.85,3.77,3.93,3.83,
+3.98,3.96,3.92,3.99,3.93,3.84,3.92,3.89,4.06,3.92,
+4.12,4.22,4.06,4.02,4.20,4.11,4.01,4.23,4.18,4.20,
+4.30,4.15,4.25,4.26,4.32,4.35,4.39,4.42,4.38,4.44,
+4.43,4.35,4.35,4.39,4.55,4.46,4.58,4.47,4.47,4.64,
+4.56,4.58,4.63,4.69,4.69,4.67,4.60,4.62,4.64,4.80,
+4.70,4.83,4.84,4.86,4.85,4.91,4.89,4.84,4.90,4.84,
+4.94,5.05,5.09,5.01,4.98,5.03,5.08,5.16,5.06,5.02,
+5.16,5.21,5.32,5.19,5.16,5.24,5.32,5.20,5.31,5.36,
+5.37,5.31,5.36,5.37,5.47,5.42,5.45,5.37,5.41,5.48,
+0.14,0.16,0.16,0.19,0.20,0.22,0.20,0.24,0.25,0.30,
+0.31,0.29,0.31,0.33,0.34,0.37,0.37,0.38,0.44,0.44,
+0.41,0.47,0.45,0.48,0.46,0.49,0.51,0.52,0.52,0.56,
+0.57,0.60,0.57,0.64,0.60,0.67,0.68,0.64,0.67,0.71,
+0.70,0.72,0.71,0.75,0.79,0.78,0.77,0.84,0.78,0.85,
+0.85,0.88,0.91,0.86,0.90,0.88,0.94,0.95,0.96,0.95,
+0.93,1.02,1.02,1.03,1.03,1.01,1.11,1.04,1.08,1.13,
+1.09,1.16,1.10,1.17,1.16,1.14,1.20,1.20,1.25,1.24,
+1.22,1.29,1.25,1.31,1.32,1.37,1.37,1.30,1.36,1.40,
+1.40,1.44,1.42,1.39,1.50,1.40,1.48,1.48,1.48,1.49,
+1.51,1.51,1.56,1.63,1.66,1.64,1.64,1.61,1.62,1.68,
+1.68,1.64,1.70,1.76,1.71,1.82,1.77,1.82,1.81,1.79,
+1.86,1.82,1.86,1.89,1.87,1.86,1.86,1.96,1.98,2.02,
+1.95,1.97,2.05,2.03,1.98,2.10,2.11,2.05,2.13,2.08,
+2.09,2.10,2.15,2.15,2.05,2.12,2.17,2.21,2.23,2.24,
+2.21,2.20,2.24,2.24,2.34,2.22,2.33,2.44,2.32,2.32,
+2.42,2.39,2.36,2.43,2.40,2.41,2.40,2.41,2.49,2.56,
+2.51,2.48,2.54,2.58,2.54,2.64,2.59,2.66,2.55,2.71,
+2.65,2.62,2.70,2.64,2.81,2.71,2.74,2.71,2.81,2.84,
+2.67,2.85,2.80,2.91,2.84,2.72,2.92,2.85,2.83,2.93,
+2.89,2.93,3.02,3.02,3.00,2.96,3.11,2.97,3.02,3.11,
+3.14,3.10,3.10,3.17,3.09,3.06,3.15,3.12,3.24,3.32,
+3.26,3.23,3.30,3.25,3.33,3.30,3.37,3.34,3.34,3.29,
+3.32,3.38,3.36,3.42,3.44,3.46,3.43,3.44,3.30,3.36,
+3.42,3.59,3.45,3.49,3.59,3.62,3.56,3.60,3.70,3.63,
+3.64,3.67,3.57,3.66,3.73,3.67,3.80,3.73,3.80,3.84,
+3.67,3.83,3.82,3.80,3.73,3.87,3.88,3.87,3.88,3.86,
+3.92,3.94,3.91,4.00,4.06,3.96,3.94,3.95,3.96,3.95,
+4.02,4.05,3.99,4.14,4.17,4.12,4.20,4.25,4.10,4.11,
+0.11,0.12,0.12,0.14,0.15,0.16,0.20,0.20,0.21,0.21,
+0.23,0.23,0.23,0.26,0.29,0.26,0.29,0.29,0.30,0.31,
+0.33,0.36,0.37,0.34,0.36,0.40,0.39,0.37,0.37,0.42,
+0.40,0.41,0.47,0.47,0.48,0.51,0.48,0.52,0.53,0.53,
+0.56,0.53,0.52,0.56,0.56,0.58,0.61,0.61,0.62,0.68,
+0.64,0.63,0.64,0.65,0.66,0.65,0.75,0.69,0.66,0.77,
+0.74,0.76,0.75,0.77,0.80,0.74,0.81,0.86,0.83,0.89,
+0.83,0.84,0.86,0.87,0.84,0.95,0.93,0.92,0.97,0.96,
+0.95,0.98,0.93,1.04,1.00,1.00,1.03,0.99,1.07,1.04,
+1.05,1.10,1.07,1.09,1.06,1.17,1.13,1.17,1.14,1.12,
+1.17,1.17,1.17,1.24,1.27,1.25,1.23,1.32,1.21,1.25,
+1.28,1.28,1.30,1.28,1.31,1.28,1.33,1.38,1.37,1.36,
+1.34,1.43,1.41,1.42,1.43,1.41,1.54,1.40,1.46,1.52,
+1.54,1.54,1.54,1.53,1.54,1.53,1.53,1.56,1.60,1.56,
+1.54,1.58,1.65,1.60,1.60,1.62,1.56,1.63,1.66,1.72,
+1.66,1.75,1.76,1.71,1.66,1.85,1.75,1.84,1.75,1.78,
+1.81,1.80,1.83,1.86,1.83,1.84,1.85,1.84,1.85,1.89,
+1.89,1.96,1.95,1.95,1.92,2.07,1.83,2.02,2.07,1.99,
+1.96,2.09,2.07,2.02,2.09,2.05,1.95,2.12,2.17,2.10,
+2.12,2.21,2.17,2.16,2.15,2.10,2.13,2.24,2.20,2.24,
+2.23,2.29,2.23,2.28,2.31,2.29,2.27,2.32,2.36,2.28,
+2.33,2.27,2.38,2.33,2.31,2.45,2.43,2.40,2.54,2.32,
+2.42,2.41,2.52,2.52,2.46,2.44,2.46,2.65,2.56,2.54,
+2.54,2.54,2.58,2.64,2.59,2.54,2.66,2.64,2.68,2.71,
+2.74,2.60,2.73,2.58,2.68,2.66,2.68,2.63,2.71,2.77,
+2.79,2.77,2.74,2.81,2.78,2.83,2.84,2.84,2.85,2.81,
+2.81,2.83,2.90,2.93,2.85,2.91,2.88,2.90,2.96,3.02,
+2.99,2.94,2.95,2.95,3.17,2.95,2.98,3.04,3.08,3.07,
+3.06,3.10,3.07,3.01,3.13,3.16,3.19,3.25,3.19,3.20,
+0.09,0.09,0.09,0.11,0.11,0.12,0.12,0.16,0.14,0.17,
+0.18,0.17,0.16,0.20,0.16,0.18,0.21,0.23,0.23,0.25,
+0.22,0.26,0.30,0.26,0.25,0.29,0.29,0.30,0.33,0.33,
+0.32,0.33,0.33,0.35,0.35,0.34,0.39,0.39,0.38,0.40,
+0.42,0.43,0.45,0.41,0.41,0.45,0.44,0.43,0.51,0.47,
+0.51,0.53,0.48,0.52,0.50,0.55,0.55,0.51,0.59,0.61,
+0.62,0.61,0.54,0.57,0.60,0.59,0.62,0.61,0.65,0.64,
+0.65,0.66,0.69,0.69,0.72,0.70,0.67,0.73,0.72,0.73,
+0.76,0.71,0.75,0.78,0.75,0.81,0.71,0.81,0.84,0.81,
+0.81,0.84,0.80,0.82,0.76,0.86,0.88,0.88,0.88,0.95,
+0.89,0.90,0.94,0.92,0.92,0.93,0.91,0.94,0.96,0.92,
+1.04,0.97,1.03,0.93,1.03,1.04,1.01,1.06,1.07,1.08,
+1.01,1.05,1.04,1.09,1.08,1.11,1.08,1.09,1.07,1.16,
+1.08,1.14,1.13,1.19,1.17,1.16,1.12,1.16,1.26,1.18,
+1.16,1.23,1.26,1.31,1.24,1.28,1.22,1.26,1.31,1.26,
+1.32,1.29,1.31,1.33,1.34,1.33,1.30,1.35,1.30,1.34,
+1.30,1.41,1.40,1.41,1.43,1.47,1.40,1.49,1.46,1.45,
+1.37,1.45,1.47,1.48,1.46,1.50,1.48,1.47,1.44,1.57,
+1.51,1.54,1.50,1.58,1.62,1.57,1.57,1.62,1.62,1.55,
+1.65,1.60,1.61,1.69,1.66,1.64,1.70,1.69,1.63,1.66,
+1.69,1.74,1.69,1.75,1.71,1.75,1.82,1.71,1.81,1.77,
+1.79,1.81,1.75,1.77,1.86,1.84,1.78,1.78,1.83,1.79,
+1.86,1.82,1.89,1.84,1.85,1.83,1.88,1.99,1.85,1.96,
+1.88,1.99,2.01,2.01,1.93,2.02,1.95,1.96,1.91,2.00,
+1.99,2.04,2.02,2.01,2.07,2.07,2.07,2.10,2.05,2.08,
+2.06,2.14,2.15,2.13,2.10,2.11,2.17,2.09,2.16,2.15,
+2.16,2.11,2.14,2.22,2.23,2.22,2.14,2.21,2.19,2.25,
+2.28,2.29,2.25,2.38,2.34,2.33,2.22,2.26,2.36,2.21,
+2.37,2.44,2.29,2.27,2.35,2.42,2.37,2.49,2.44,2.54,
+0.06,0.08,0.07,0.09,0.08,0.10,0.10,0.10,0.11,0.12,
+0.15,0.12,0.17,0.15,0.13,0.15,0.18,0.17,0.22,0.19,
+0.18,0.21,0.19,0.22,0.22,0.23,0.24,0.27,0.22,0.25,
+0.24,0.26,0.28,0.26,0.29,0.27,0.27,0.26,0.29,0.29,
+0.32,0.33,0.33,0.34,0.34,0.30,0.35,0.36,0.37,0.33,
+0.37,0.37,0.39,0.39,0.36,0.44,0.40,0.40,0.41,0.41,
+0.42,0.44,0.43,0.40,0.43,0.48,0.46,0.46,0.48,0.51,
+0.49,0.47,0.47,0.49,0.49,0.50,0.53,0.51,0.56,0.60,
+0.59,0.55,0.58,0.55,0.56,0.57,0.58,0.57,0.60,0.64,
+0.64,0.61,0.60,0.65,0.64,0.64,0.67,0.66,0.69,0.67,
+0.69,0.72,0.67,0.66,0.73,0.76,0.73,0.76,0.65,0.73,
+0.73,0.73,0.74,0.73,0.80,0.70,0.81,0.78,0.81,0.80,
+0.78,0.82,0.78,0.81,0.81,0.85,0.83,0.85,0.85,0.90,
+0.88,0.87,0.83,0.96,0.89,0.92,0.85,0.88,0.88,0.92,
+0.93,0.96,0.95,1.02,0.92,0.96,0.97,0.95,0.95,1.02,
+0.98,1.01,0.96,1.01,1.02,1.00,1.02,1.01,1.09,0.98,
+1.07,1.04,1.11,1.08,1.07,1.06,1.07,1.09,1.11,1.12,
+1.07,1.13,1.09,1.11,1.13,1.16,1.11,1.13,1.15,1.15,
+1.13,1.15,1.17,1.17,1.19,1.21,1.18,1.28,1.21,1.21,
+1.27,1.25,1.23,1.27,1.25,1.22,1.29,1.27,1.27,1.26,
+1.27,1.27,1.31,1.29,1.35,1.32,1.27,1.29,1.28,1.25,
+1.36,1.34,1.33,1.42,1.33,1.40,1.34,1.37,1.39,1.43,
+1.41,1.40,1.50,1.40,1.46,1.49,1.47,1.46,1.41,1.39,
+1.53,1.53,1.50,1.44,1.46,1.48,1.50,1.49,1.54,1.63,
+1.55,1.58,1.58,1.55,1.60,1.61,1.54,1.57,1.54,1.53,
+1.56,1.65,1.55,1.65,1.61,1.57,1.62,1.65,1.62,1.64,
+1.65,1.58,1.68,1.65,1.78,1.78,1.70,1.72,1.70,1.77,
+1.68,1.75,1.70,1.77,1.71,1.71,1.73,1.80,1.79,1.74,
+1.71,1.69,1.82,1.79,1.71,1.79,1.79,1.81,1.87,1.85,
+0.05,0.05,0.06,0.07,0.06,0.07,0.06,0.08,0.08,0.10,
+0.10,0.11,0.11,0.10,0.09,0.12,0.12,0.12,0.13,0.13,
+0.13,0.13,0.15,0.14,0.16,0.14,0.17,0.18,0.16,0.17,
+0.19,0.19,0.19,0.22,0.22,0.20,0.22,0.22,0.23,0.24,
+0.25,0.22,0.25,0.24,0.25,0.27,0.26,0.26,0.27,0.29,
+0.30,0.31,0.27,0.32,0.32,0.34,0.31,0.33,0.36,0.31,
+0.31,0.35,0.31,0.34,0.34,0.34,0.32,0.35,0.33,0.38,
+0.37,0.39,0.37,0.38,0.38,0.42,0.37,0.38,0.40,0.43,
+0.44,0.43,0.45,0.41,0.45,0.45,0.50,0.45,0.48,0.46,
+0.46,0.47,0.47,0.48,0.52,0.48,0.52,0.48,0.52,0.50,
+0.47,0.51,0.56,0.55,0.51,0.51,0.52,0.57,0.56,0.56,
+0.53,0.55,0.57,0.58,0.61,0.63,0.57,0.58,0.61,0.59,
+0.64,0.63,0.59,0.62,0.57,0.65,0.70,0.64,0.71,0.68,
+0.67,0.66,0.64,0.71,0.66,0.68,0.70,0.71,0.68,0.69,
+0.73,0.69,0.73,0.68,0.75,0.74,0.71,0.73,0.78,0.77,
+0.70,0.72,0.78,0.85,0.79,0.73,0.85,0.80,0.81,0.78,
+0.87,0.76,0.75,0.77,0.85,0.80,0.83,0.82,0.84,0.87,
+0.84,0.87,0.78,0.90,0.87,0.82,0.87,0.85,0.78,0.88,
+0.91,0.92,0.95,0.93,0.87,0.91,0.92,0.90,0.91,0.91,
+0.96,0.91,0.91,0.97,0.92,0.94,1.00,0.97,0.95,0.92,
+0.95,1.02,0.93,0.99,1.02,1.00,1.01,1.01,1.01,0.94,
+0.98,1.05,0.97,1.05,1.04,1.07,1.10,1.04,1.04,1.05,
+1.12,1.04,1.08,1.04,1.08,1.05,1.06,1.05,1.05,1.07,
+1.17,1.16,1.09,1.13,1.10,1.09,1.09,1.19,1.16,1.18,
+1.20,1.13,1.17,1.09,1.24,1.20,1.22,1.15,1.26,1.26,
+1.20,1.20,1.23,1.20,1.23,1.23,1.21,1.24,1.21,1.29,
+1.28,1.27,1.25,1.30,1.26,1.32,1.28,1.28,1.28,1.27,
+1.34,1.28,1.36,1.28,1.38,1.33,1.38,1.31,1.31,1.36,
+1.38,1.33,1.38,1.34,1.37,1.35,1.33,1.38,1.38,1.44,
+0.04,0.04,0.04,0.04,0.05,0.05,0.06,0.06,0.05,0.07,
+0.07,0.07,0.08,0.08,0.09,0.09,0.09,0.12,0.09,0.11,
+0.12,0.13,0.10,0.11,0.11,0.12,0.15,0.15,0.14,0.13,
+0.15,0.12,0.14,0.16,0.15,0.16,0.16,0.16,0.19,0.17,
+0.16,0.19,0.20,0.18,0.19,0.20,0.17,0.20,0.22,0.22,
+0.20,0.20,0.23,0.22,0.22,0.23,0.25,0.24,0.27,0.21,
+0.20,0.29,0.26,0.24,0.27,0.26,0.29,0.28,0.26,0.27,
+0.28,0.30,0.31,0.31,0.29,0.28,0.31,0.28,0.30,0.31,
+0.34,0.31,0.32,0.33,0.31,0.34,0.35,0.35,0.33,0.37,
+0.34,0.34,0.35,0.38,0.36,0.38,0.38,0.36,0.40,0.37,
+0.39,0.43,0.40,0.40,0.42,0.38,0.44,0.40,0.39,0.42,
+0.40,0.40,0.44,0.41,0.44,0.43,0.44,0.45,0.47,0.47,
+0.44,0.53,0.44,0.46,0.44,0.46,0.47,0.48,0.46,0.45,
+0.48,0.52,0.47,0.53,0.55,0.49,0.52,0.55,0.52,0.52,
+0.50,0.54,0.56,0.54,0.55,0.54,0.55,0.53,0.59,0.55,
+0.60,0.54,0.57,0.60,0.62,0.57,0.63,0.61,0.60,0.58,
+0.60,0.59,0.60,0.61,0.62,0.59,0.63,0.65,0.64,0.60,
+0.65,0.67,0.66,0.68,0.63,0.67,0.62,0.69,0.68,0.71,
+0.65,0.70,0.72,0.68,0.65,0.73,0.73,0.74,0.71,0.69,
+0.69,0.67,0.72,0.75,0.73,0.72,0.73,0.75,0.75,0.75,
+0.64,0.75,0.72,0.75,0.75,0.77,0.81,0.76,0.77,0.79,
+0.82,0.77,0.81,0.79,0.78,0.75,0.81,0.79,0.83,0.82,
+0.79,0.86,0.84,0.78,0.85,0.86,0.88,0.79,0.86,0.89,
+0.82,0.85,0.80,0.89,0.83,0.83,0.84,0.82,0.91,0.89,
+0.92,0.90,0.92,0.90,0.92,1.01,0.93,0.91,0.91,0.89,
+0.96,0.94,0.97,0.90,0.94,0.93,0.93,0.94,0.96,0.91,
+0.93,0.97,0.98,1.00,0.96,0.94,0.93,1.00,0.97,1.02,
+0.97,1.06,0.95,0.98,1.05,0.96,1.00,0.99,1.00,1.02,
+1.00,1.04,1.09,1.00,1.04,1.08,1.03,1.03,1.07,1.06,
+1.87,2.07,2.25,2.41,2.55,2.83,2.98,3.19,3.34,3.60,
+3.63,3.88,4.02,4.18,4.41,4.54,4.80,5.02,5.14,5.45,
+5.55,5.69,5.88,6.00,6.24,6.38,6.60,6.81,6.95,7.18,
+7.35,7.49,7.66,7.87,8.06,8.29,8.30,8.71,8.88,8.97,
+9.19,9.34,9.46,9.78,9.84,10.08,10.15,10.51,10.63,10.93,
+10.98,11.08,11.21,11.58,11.73,11.85,12.06,12.20,12.49,12.54,
+12.46,13.02,13.05,13.35,13.50,13.81,13.90,13.99,14.06,14.30,
+14.62,14.71,14.89,15.15,15.37,15.59,15.52,15.86,16.05,16.30,
+16.38,16.68,16.83,16.94,17.09,17.42,17.54,17.81,18.00,18.04,
+18.21,18.56,18.58,18.87,19.05,19.34,19.47,19.39,19.65,19.86,
+20.17,19.98,20.45,20.65,20.78,20.61,20.84,21.31,21.66,21.66,
+21.61,21.96,22.40,22.36,22.49,22.56,23.02,23.31,23.34,23.47,
+23.76,23.98,24.03,24.24,24.28,24.55,24.89,25.11,25.10,25.26,
+25.59,25.64,25.97,26.09,26.25,26.33,26.60,26.72,26.97,27.07,
+27.21,27.38,27.59,27.97,27.96,28.02,28.27,28.51,28.71,28.97,
+29.01,29.24,29.50,29.64,29.98,30.27,30.04,30.50,30.46,30.82,
+31.08,30.92,31.25,31.67,31.74,31.75,32.12,32.26,32.17,32.64,
+32.82,32.96,33.06,33.17,33.43,33.66,33.90,33.87,34.22,34.30,
+34.59,35.05,35.15,35.05,35.34,35.61,35.70,35.93,36.13,36.22,
+36.33,36.55,36.69,36.87,37.22,37.50,37.39,37.65,37.93,37.79,
+38.33,38.53,38.72,38.94,38.78,39.14,39.18,39.49,39.50,39.85,
+40.03,40.23,40.25,40.68,40.90,40.91,41.26,40.96,41.49,41.52,
+41.72,42.33,42.27,42.49,42.27,43.13,42.93,43.10,43.38,43.60,
+43.59,43.48,44.11,44.21,44.23,44.73,45.06,45.11,45.00,44.87,
+45.65,45.65,45.98,46.25,45.97,46.40,46.33,46.96,47.16,47.17,
+47.68,47.65,47.70,47.77,48.20,48.06,48.39,48.65,48.71,48.95,
+48.94,49.16,49.34,49.93,50.08,50.13,50.57,50.22,50.17,50.44,
+50.95,51.27,51.32,51.25,51.93,51.92,52.02,52.35,52.47,52.40,
+53.01,52.77,53.20,53.20,53.19,53.76,53.86,54.06,54.02,54.16,
+1.42,1.56,1.71,1.86,2.02,2.17,2.21,2.41,2.50,2.74,
+2.81,3.02,3.08,3.21,3.38,3.55,3.74,3.76,3.96,4.12,
+4.22,4.32,4.58,4.75,4.89,4.96,5.03,5.18,5.37,5.42,
+5.68,5.63,5.94,6.17,6.23,6.36,6.42,6.67,6.80,6.93,
+7.05,7.21,7.46,7.41,7.57,7.89,7.92,8.00,8.16,8.10,
+8.37,8.46,8.86,8.87,8.95,8.95,9.34,9.31,9.68,9.74,
+9.73,10.20,10.33,10.19,10.41,10.60,10.72,10.87,10.88,11.09,
+11.18,11.56,11.62,11.74,11.93,11.91,11.97,12.30,12.29,12.66,
+12.54,12.70,12.87,13.03,13.25,13.47,13.46,13.51,13.65,13.89,
+14.03,14.02,14.41,14.45,14.72,14.67,14.96,14.91,15.07,15.35,
+15.51,15.45,15.83,16.03,16.00,16.28,16.15,16.45,16.48,16.76,
+16.79,16.93,16.95,17.16,17.48,17.59,17.41,17.68,17.90,18.22,
+18.27,18.25,18.57,18.65,18.69,18.86,19.19,19.09,19.39,19.48,
+19.62,19.81,19.78,20.07,20.31,20.08,20.62,20.64,20.81,20.73,
+21.07,21.28,21.25,21.39,21.49,21.84,22.15,21.83,22.32,22.45,
+22.37,22.47,22.79,22.89,22.81,23.04,23.21,23.20,23.53,23.69,
+23.70,23.79,24.22,24.05,24.11,24.62,24.72,24.81,24.81,25.38,
+25.15,25.53,25.48,25.64,25.63,26.06,26.05,26.04,26.34,26.45,
+26.64,26.76,26.86,26.96,27.13,27.29,27.27,27.78,27.76,27.75,
+27.93,28.24,28.33,28.70,28.69,28.63,28.95,29.13,29.02,29.39,
+29.37,29.77,29.52,29.64,29.99,30.14,30.20,30.24,30.46,30.63,
+30.76,31.09,31.20,31.23,30.96,31.24,31.59,31.76,31.92,32.02,
+32.25,32.17,32.33,32.81,32.69,32.76,32.99,33.04,33.17,33.26,
+33.66,33.69,33.73,34.03,34.42,34.40,34.61,34.47,34.73,35.27,
+34.81,35.32,35.38,35.38,35.35,35.60,35.82,35.71,36.04,36.43,
+36.43,36.53,36.58,36.62,37.06,36.97,37.50,37.37,37.59,37.51,
+37.57,37.83,38.47,38.03,38.50,38.55,38.59,38.64,38.79,38.98,
+38.85,39.12,39.39,39.49,40.12,40.05,40.16,40.15,40.27,40.45,
+40.63,40.90,40.76,41.15,41.13,40.95,41.51,41.51,41.79,42.02,
+1.12,1.21,1.29,1.39,1.53,1.62,1.77,1.89,1.95,2.07,
+2.25,2.27,2.38,2.62,2.67,2.72,2.83,2.99,2.97,3.14,
+3.19,3.35,3.51,3.64,3.76,3.87,3.94,4.00,4.16,4.13,
+4.29,4.49,4.56,4.55,4.79,4.86,5.02,5.11,5.19,5.25,
+5.39,5.55,5.61,5.75,5.85,5.88,6.16,6.15,6.32,6.46,
+6.49,6.63,6.77,6.92,6.98,7.04,7.08,7.21,7.28,7.56,
+7.58,7.66,7.78,8.07,8.03,8.09,8.10,8.21,8.42,8.48,
+8.71,8.80,8.83,8.90,8.93,9.18,9.30,9.72,9.43,9.66,
+9.64,9.74,9.96,10.03,10.21,10.23,10.41,10.48,10.56,10.71,
+10.84,10.85,11.01,11.14,11.17,11.37,11.54,11.42,11.74,11.76,
+11.92,11.86,12.03,12.22,12.42,12.36,12.52,12.75,12.71,12.88,
+12.87,13.10,13.17,13.46,13.46,13.56,13.56,13.67,13.87,13.72,
+14.05,14.13,14.41,14.35,14.35,14.77,14.77,14.90,14.94,15.09,
+15.07,15.18,15.21,15.61,15.32,15.58,15.69,15.77,16.12,15.95,
+16.17,16.34,16.24,16.45,16.50,16.78,16.77,17.10,17.34,17.28,
+17.17,17.30,17.45,17.67,17.82,17.72,17.98,18.20,18.14,18.19,
+18.51,18.37,18.52,18.49,18.99,18.73,19.01,19.00,19.25,18.95,
+19.39,19.60,19.51,19.65,19.91,19.55,20.00,20.15,20.34,20.30,
+20.46,20.75,20.77,20.68,20.90,21.13,21.16,21.43,21.34,21.52,
+21.45,21.73,21.92,22.07,21.89,22.19,22.15,22.35,22.33,22.53,
+22.54,22.92,22.89,22.81,23.24,23.22,23.28,23.25,23.44,23.44,
+23.74,23.85,24.00,23.87,24.30,24.37,24.27,24.63,24.42,24.77,
+24.81,24.83,25.12,25.20,25.49,25.54,25.60,25.61,25.52,25.60,
+26.04,26.04,26.14,26.06,26.39,26.67,26.35,26.36,26.84,26.76,
+26.99,27.22,27.25,27.57,27.27,27.50,27.71,28.00,27.91,27.70,
+28.07,28.19,28.22,28.27,28.55,28.31,28.65,28.75,29.01,28.79,
+29.20,29.56,29.55,29.56,29.61,29.62,29.58,29.71,30.06,29.86,
+30.17,30.16,30.36,30.09,30.50,30.59,30.66,30.82,30.89,31.01,
+31.28,31.21,31.36,31.60,31.55,31.96,31.91,32.04,32.06,32.37,
+0.86,0.97,1.04,1.10,1.15,1.23,1.42,1.42,1.54,1.59,
+1.65,1.72,1.87,1.83,2.03,2.08,2.16,2.21,2.28,2.42,
+2.59,2.58,2.72,2.74,2.90,2.88,2.96,3.19,3.19,3.25,
+3.45,3.46,3.58,3.62,3.65,3.77,3.89,3.96,4.08,4.05,
+4.17,4.22,4.29,4.55,4.51,4.61,4.69,4.85,4.76,4.87,
+5.02,5.03,5.13,5.22,5.29,5.46,5.38,5.61,5.69,5.79,
+5.78,5.95,5.99,6.11,6.16,6.17,6.45,6.39,6.50,6.48,
+6.67,6.76,6.74,6.97,7.12,7.03,7.01,7.21,7.26,7.38,
+7.51,7.49,7.68,7.73,7.78,7.79,7.94,8.11,8.07,8.25,
+8.45,8.49,8.40,8.57,8.71,8.65,8.85,9.06,8.88,9.10,
+9.26,9.17,9.35,9.44,9.50,9.43,9.44,9.74,9.82,9.89,
+9.88,10.22,10.12,10.27,10.12,10.50,10.40,10.64,10.67,10.82,
+10.57,10.94,10.88,11.14,11.19,11.20,11.32,11.38,11.43,11.50,
+11.57,11.66,11.90,11.79,11.90,11.97,12.17,12.21,12.31,12.40,
+12.52,12.60,12.68,12.60,12.76,12.83,13.02,12.87,13.24,13.24,
+13.27,13.42,13.40,13.49,13.78,13.81,13.85,13.79,13.84,14.00,
+14.18,14.17,14.33,14.27,14.36,14.65,14.57,14.79,14.87,14.86,
+15.04,14.84,15.23,15.04,15.22,15.26,15.56,15.39,15.50,15.65,
+15.70,15.82,16.00,16.07,16.40,16.07,16.47,16.41,16.32,16.41,
+16.52,16.77,16.70,16.63,17.03,16.99,16.96,17.07,17.15,17.27,
+17.56,17.41,17.51,17.76,17.90,17.88,18.09,17.97,18.07,18.27,
+18.17,18.50,18.52,18.42,18.77,18.82,18.68,18.87,18.78,19.04,
+19.27,19.21,19.34,19.35,19.28,19.46,19.76,19.52,19.85,19.94,
+19.89,19.92,20.24,20.15,20.24,20.31,20.25,20.46,20.75,20.68,
+20.88,21.00,20.88,20.94,21.14,21.16,21.12,21.38,21.41,21.49,
+21.66,21.80,21.86,21.82,22.00,21.94,22.06,22.05,22.25,22.51,
+22.31,22.86,22.37,22.85,22.82,22.73,22.82,22.84,23.33,23.32,
+23.23,23.61,23.48,23.56,23.78,23.64,23.71,23.77,23.77,24.19,
+24.40,23.81,24.17,24.28,24.23,24.34,24.37,24.66,24.89,24.73,
+0.65,0.75,0.85,0.85,0.94,0.96,1.05,1.12,1.18,1.26,
+1.30,1.32,1.43,1.49,1.57,1.61,1.64,1.74,1.81,1.84,
+1.86,1.93,2.05,2.18,2.24,2.23,2.32,2.42,2.44,2.56,
+2.57,2.65,2.59,2.73,2.91,3.06,2.91,3.08,3.12,3.13,
+3.22,3.30,3.42,3.44,3.42,3.55,3.62,3.59,3.74,3.75,
+3.88,3.98,4.14,4.00,4.10,4.10,4.33,4.21,4.36,4.52,
+4.62,4.55,4.62,4.71,4.71,4.82,4.88,5.00,4.99,5.07,
+5.20,5.07,5.20,5.41,5.36,5.52,5.61,5.43,5.62,5.62,
+5.83,5.86,5.96,5.95,6.08,6.14,6.20,6.22,6.31,6.40,
+6.40,6.32,6.66,6.67,6.73,6.75,6.80,6.87,6.90,6.78,
+7.02,7.11,7.25,7.18,7.29,7.27,7.42,7.57,7.58,7.74,
+7.73,7.68,7.88,8.03,7.96,7.83,8.27,8.25,8.17,8.39,
+8.37,8.27,8.36,8.51,8.54,8.77,8.61,8.71,8.73,8.94,
+8.95,8.94,9.20,9.19,9.02,9.23,9.31,9.39,9.42,9.41,
+9.56,9.76,9.81,9.79,9.72,9.98,9.98,9.90,10.13,10.14,
+10.23,10.17,10.32,10.36,10.52,10.51,10.56,10.75,10.86,10.76,
+10.90,10.99,11.05,11.06,11.13,11.02,11.15,11.25,11.43,11.41,
+11.52,11.39,11.49,11.80,11.67,11.84,11.93,12.02,11.91,12.25,
+12.20,12.24,12.16,12.42,12.51,12.52,12.66,12.42,12.51,12.59,
+13.01,12.90,12.83,13.06,13.25,13.13,13.40,13.15,13.26,13.19,
+13.51,13.35,13.47,13.69,14.00,13.68,13.71,13.98,14.02,14.21,
+14.11,14.16,14.34,14.31,14.20,14.38,14.31,14.43,14.47,14.33,
+14.71,14.62,14.97,15.06,15.16,15.06,15.03,15.28,15.33,15.16,
+15.50,15.36,15.43,15.40,15.64,15.67,15.71,15.83,15.87,15.67,
+16.02,15.83,16.10,16.13,16.08,16.47,16.23,16.54,16.73,16.46,
+16.59,16.71,16.73,16.76,16.92,16.79,17.07,17.15,17.18,17.35,
+17.46,17.37,17.40,17.58,17.61,17.41,17.72,17.83,17.77,17.64,
+17.84,17.84,18.21,17.84,18.11,18.31,18.22,18.10,18.54,18.34,
+18.66,18.66,18.54,18.88,18.75,18.82,18.78,19.03,18.98,19.21,
+0.53,0.54,0.59,0.66,0.69,0.77,0.81,0.87,0.91,0.96,
+0.93,1.06,1.10,1.13,1.27,1.26,1.26,1.32,1.39,1.42,
+1.48,1.54,1.55,1.64,1.73,1.72,1.88,1.76,1.85,1.96,
+1.97,2.04,2.12,2.14,2.18,2.27,2.33,2.28,2.37,2.46,
+2.48,2.60,2.57,2.66,2.82,2.74,2.81,2.75,2.86,2.90,
+2.96,3.02,3.08,3.19,3.12,3.20,3.30,3.29,3.46,3.40,
+3.44,3.49,3.57,3.64,3.61,3.69,3.73,3.81,3.85,3.95,
+3.92,4.01,4.10,4.12,4.16,4.18,4.27,4.28,4.30,4.33,
+4.45,4.52,4.50,4.67,4.58,4.58,4.68,4.80,4.90,4.92,
+4.94,4.94,4.98,5.10,5.18,5.09,5.18,5.26,5.33,5.39,
+5.35,5.52,5.51,5.58,5.66,5.63,5.67,5.65,5.75,5.79,
+5.96,5.83,6.05,6.09,6.11,6.22,6.16,6.32,6.24,6.34,
+6.45,6.52,6.61,6.51,6.49,6.43,6.69,6.78,6.83,6.83,
+6.80,6.98,7.06,7.00,7.06,7.13,7.23,7.25,7.39,7.46,
+7.45,7.34,7.53,7.42,7.57,7.66,7.70,7.72,7.82,7.90,
+7.91,7.80,8.07,8.06,8.04,8.19,8.15,8.18,8.28,8.34,
+8.29,8.49,8.45,8.47,8.64,8.70,8.69,8.84,8.71,8.88,
+8.98,9.01,9.04,9.16,9.05,8.94,9.21,9.10,9.16,9.56,
+9.52,9.34,9.36,9.48,9.51,9.50,9.74,9.82,9.99,9.77,
+9.85,9.84,9.92,9.95,10.10,10.04,10.12,10.22,10.11,10.33,
+10.44,10.42,10.46,10.23,10.47,10.66,10.62,10.70,10.84,10.75,
+10.90,10.94,10.99,11.02,11.03,11.17,11.14,11.38,11.18,11.34,
+11.26,11.45,11.55,11.42,11.44,11.51,11.62,11.64,11.85,11.74,
+11.79,11.77,12.12,11.96,12.08,11.97,12.15,12.07,12.27,12.42,
+12.45,12.42,12.13,12.37,12.66,12.72,12.74,12.75,12.48,12.65,
+13.03,12.65,12.99,12.85,13.02,12.98,13.09,13.22,13.19,13.23,
+13.21,13.37,13.47,13.48,13.48,13.47,13.60,13.70,13.63,13.73,
+13.74,13.56,13.70,14.02,14.04,14.03,13.91,14.18,14.10,14.24,
+14.17,14.39,14.57,14.42,14.32,14.49,14.53,14.69,14.69,14.76,
+0.38,0.42,0.48,0.48,0.55,0.58,0.66,0.68,0.69,0.76,
+0.78,0.77,0.81,0.96,0.98,1.01,0.98,0.98,1.08,1.14,
+1.17,1.23,1.18,1.32,1.34,1.38,1.38,1.45,1.42,1.50,
+1.52,1.56,1.62,1.71,1.70,1.65,1.70,1.76,1.79,1.90,
+1.92,1.93,1.99,2.03,2.01,2.13,2.08,2.09,2.25,2.19,
+2.29,2.36,2.34,2.35,2.51,2.48,2.50,2.50,2.55,2.62,
+2.57,2.75,2.71,2.74,2.85,2.86,2.92,2.97,2.95,2.96,
+3.03,3.06,3.17,3.23,3.19,3.28,3.23,3.36,3.32,3.38,
+3.40,3.55,3.50,3.52,3.50,3.70,3.63,3.75,3.81,3.71,
+3.86,3.77,3.84,3.90,3.85,3.99,3.96,4.02,4.14,4.05,
+4.05,4.23,4.20,4.15,4.28,4.20,4.35,4.42,4.42,4.54,
+4.64,4.57,4.70,4.58,4.76,4.73,4.74,4.85,4.80,4.91,
+4.99,4.98,5.04,5.04,5.11,5.09,5.04,5.22,5.22,5.32,
+5.36,5.39,5.40,5.49,5.45,5.47,5.43,5.62,5.64,5.64,
+5.65,5.86,5.83,5.77,5.85,5.74,6.00,6.07,5.91,6.09,
+6.16,6.19,6.13,6.19,6.18,6.38,6.24,6.32,6.49,6.40,
+6.60,6.48,6.41,6.56,6.64,6.63,6.56,6.79,6.81,6.78,
+6.79,6.68,6.89,6.85,6.82,7.00,7.14,7.07,7.20,7.30,
+7.39,7.21,7.19,7.37,7.34,7.52,7.34,7.41,7.57,7.53,
+7.53,7.72,7.65,7.70,7.75,7.96,7.84,7.77,7.83,8.08,
+8.02,8.08,8.06,8.11,8.22,8.20,8.12,8.25,8.45,8.35,
+8.34,8.43,8.45,8.36,8.52,8.50,8.50,8.57,8.80,8.64,
+8.81,8.70,8.85,8.93,8.96,8.92,8.97,9.13,8.92,9.01,
+9.08,9.30,9.37,9.29,9.37,9.11,9.32,9.38,9.43,9.27,
+9.55,9.38,9.50,9.54,9.74,9.86,9.63,9.71,9.98,9.59,
+9.63,9.95,9.98,9.98,10.10,10.19,10.12,10.11,10.06,10.00,
+10.27,10.15,10.36,10.26,10.49,10.41,10.39,10.57,10.55,10.50,
+10.45,10.70,10.55,10.76,10.75,10.66,10.96,10.87,10.96,10.90,
+11.09,11.00,10.99,10.92,10.96,11.30,11.26,11.38,11.23,11.27,
+0.30,0.34,0.37,0.42,0.44,0.49,0.47,0.49,0.54,0.61,
+0.64,0.63,0.66,0.69,0.73,0.72,0.75,0.81,0.81,0.83,
+0.87,0.87,0.93,0.97,1.04,1.09,1.04,1.12,1.13,1.19,
+1.12,1.18,1.31,1.28,1.23,1.30,1.29,1.36,1.43,1.46,
+1.44,1.50,1.52,1.59,1.55,1.68,1.60,1.68,1.71,1.67,
+1.74,1.75,1.84,1.96,1.97,1.86,1.93,2.02,1.95,1.97,
+2.09,2.07,2.09,2.09,2.20,2.19,2.26,2.29,2.32,2.36,
+2.32,2.34,2.34,2.38,2.48,2.39,2.48,2.48,2.58,2.54,
+2.62,2.64,2.57,2.81,2.77,2.76,2.73,2.85,2.80,2.96,
+2.96,2.91,2.96,2.95,3.12,3.13,3.14,3.07,3.06,3.15,
+3.21,3.24,3.26,3.38,3.30,3.25,3.50,3.44,3.37,3.46,
+3.47,3.56,3.46,3.60,3.55,3.69,3.71,3.75,3.74,3.78,
+3.83,3.79,3.88,3.94,3.88,3.97,3.93,3.99,3.98,4.07,
+4.15,4.08,4.22,4.18,4.29,4.22,4.26,4.37,4.38,4.39,
+4.35,4.41,4.40,4.55,4.51,4.48,4.51,4.56,4.61,4.70,
+4.80,4.79,4.80,4.80,4.78,4.72,4.79,4.87,4.83,5.05,
+4.95,4.88,4.99,5.03,5.06,5.19,5.14,5.20,5.26,5.19,
+5.22,5.35,5.46,5.34,5.48,5.25,5.39,5.44,5.45,5.56,
+5.54,5.66,5.70,5.66,5.55,5.64,5.76,5.88,5.73,5.66,
+5.84,5.94,5.94,5.88,5.85,5.95,5.97,6.13,6.09,6.13,
+6.17,6.07,6.18,6.17,6.26,6.27,6.43,6.30,6.30,6.32,
+6.33,6.47,6.36,6.48,6.64,6.44,6.58,6.53,6.56,6.78,
+6.63,6.83,6.93,6.66,6.84,7.00,6.81,6.92,6.93,7.00,
+7.02,7.23,6.99,7.01,7.08,7.09,7.24,7.34,7.21,7.42,
+7.45,7.25,7.47,7.38,7.42,7.46,7.41,7.47,7.54,7.60,
+7.44,7.57,7.72,7.66,7.68,7.75,7.74,7.83,7.86,7.69,
+7.91,7.87,7.96,7.93,8.07,7.95,7.95,8.26,8.23,8.18,
+8.01,8.31,8.22,8.23,8.49,8.40,8.57,8.40,8.41,8.36,
+8.41,8.54,8.45,8.56,8.65,8.63,8.66,8.79,8.73,8.71,
+0.23,0.23,0.26,0.27,0.32,0.33,0.36,0.38,0.39,0.46,
+0.46,0.49,0.51,0.53,0.55,0.59,0.61,0.65,0.65,0.66,
+0.67,0.73,0.72,0.73,0.80,0.76,0.84,0.81,0.89,0.84,
+0.98,0.94,0.98,0.98,1.04,1.03,1.05,1.07,1.12,1.13,
+1.10,1.16,1.18,1.21,1.22,1.23,1.27,1.31,1.30,1.38,
+1.32,1.42,1.42,1.39,1.37,1.44,1.51,1.39,1.55,1.50,
+1.54,1.58,1.58,1.61,1.67,1.69,1.65,1.77,1.81,1.78,
+1.78,1.76,1.88,1.84,1.91,1.94,1.95,1.91,1.98,2.00,
+2.06,2.04,2.04,2.11,2.15,2.11,2.15,2.17,2.24,2.21,
+2.27,2.26,2.30,2.31,2.31,2.35,2.40,2.39,2.53,2.48,
+2.51,2.52,2.57,2.61,2.54,2.58,2.66,2.67,2.61,2.64,
+2.67,2.67,2.73,2.75,2.81,2.84,2.73,2.81,2.85,2.81,
+2.88,3.00,3.00,2.90,3.05,2.98,3.00,3.04,2.98,3.11,
+3.14,3.19,3.15,3.22,3.17,3.25,3.29,3.34,3.35,3.30,
+3.35,3.38,3.47,3.44,3.56,3.51,3.50,3.51,3.56,3.52,
+3.66,3.57,3.57,3.67,3.73,3.75,3.79,3.87,3.73,3.92,
+3.80,3.88,3.93,3.90,3.98,3.86,3.96,4.01,4.00,4.14,
+4.01,4.10,4.00,4.14,4.16,4.18,4.19,4.25,4.24,4.34,
+4.25,4.24,4.32,4.32,4.32,4.52,4.39,4.40,4.51,4.47,
+4.46,4.50,4.49,4.50,4.62,4.68,4.60,4.56,4.77,4.74,
+4.67,4.78,4.78,4.80,4.82,4.72,4.89,4.86,4.97,4.90,
+4.90,4.94,5.03,5.05,4.89,5.02,5.09,5.14,5.15,5.08,
+5.21,5.21,5.25,5.33,5.37,5.28,5.36,5.43,5.27,5.33,
+5.42,5.45,5.42,5.46,5.47,5.51,5.54,5.53,5.63,5.44,
+5.77,5.62,5.59,5.55,5.62,5.70,5.71,5.78,5.86,5.83,
+5.83,5.97,5.89,5.94,6.01,5.87,6.06,6.07,6.13,6.03,
+6.04,6.09,6.18,6.19,6.11,6.09,6.10,6.26,6.37,6.25,
+6.14,6.10,6.24,6.14,6.29,6.61,6.41,6.36,6.61,6.34,
+6.56,6.57,6.49,6.65,6.65,6.67,6.57,6.74,6.67,6.68,
+0.15,0.22,0.21,0.24,0.24,0.26,0.29,0.28,0.31,0.35,
+0.34,0.35,0.37,0.41,0.45,0.44,0.47,0.47,0.47,0.50,
+0.55,0.55,0.55,0.56,0.57,0.56,0.58,0.66,0.66,0.63,
+0.64,0.71,0.72,0.73,0.73,0.80,0.82,0.83,0.85,0.83,
+0.89,0.90,0.96,0.94,0.95,0.97,0.94,0.93,1.03,0.96,
+1.07,1.02,1.11,1.11,1.11,1.10,1.07,1.13,1.20,1.24,
+1.11,1.21,1.21,1.32,1.30,1.29,1.32,1.35,1.35,1.39,
+1.36,1.42,1.43,1.44,1.45,1.46,1.52,1.51,1.51,1.60,
+1.50,1.61,1.53,1.64,1.65,1.63,1.55,1.70,1.66,1.73,
+1.73,1.75,1.62,1.76,1.85,1.75,1.87,1.85,1.79,1.80,
+1.88,1.95,1.91,1.93,2.01,1.95,2.01,2.00,2.04,2.09,
+2.04,2.11,2.17,2.10,2.15,2.15,2.16,2.22,2.29,2.28,
+2.23,2.31,2.27,2.30,2.34,2.34,2.29,2.38,2.37,2.38,
+2.41,2.44,2.52,2.48,2.48,2.56,2.51,2.66,2.55,2.62,
+2.57,2.68,2.66,2.62,2.72,2.72,2.75,2.65,2.79,2.69,
+2.73,2.75,2.84,2.76,2.90,2.77,2.89,2.90,2.95,2.90,
+2.97,2.92,2.97,2.94,3.09,3.07,2.98,2.98,3.15,2.99,
+3.13,3.23,3.01,3.19,3.20,3.20,3.21,3.13,3.34,3.37,
+3.23,3.21,3.28,3.32,3.21,3.35,3.41,3.40,3.47,3.38,
+3.43,3.48,3.49,3.52,3.60,3.44,3.58,3.65,3.65,3.62,
+3.71,3.69,3.72,3.71,3.63,3.81,3.76,3.76,3.77,3.76,
+3.77,3.92,3.79,3.77,3.72,3.92,3.90,3.82,3.95,4.03,
+4.04,4.04,4.10,3.99,4.04,4.04,4.15,3.99,4.07,4.03,
+4.21,4.21,4.19,4.12,4.25,4.27,4.33,4.21,4.17,4.35,
+4.29,4.37,4.34,4.28,4.46,4.38,4.35,4.43,4.42,4.51,
+4.52,4.40,4.63,4.55,4.53,4.42,4.57,4.58,4.60,4.71,
+4.71,4.55,4.80,4.71,4.78,4.75,4.77,4.75,4.74,4.73,
+4.74,4.76,4.86,4.78,4.88,4.90,4.99,5.01,5.00,4.96,
+4.99,5.09,5.09,5.09,5.13,5.08,5.00,5.11,5.18,5.11,
+0.14,0.16,0.16,0.18,0.20,0.21,0.22,0.24,0.26,0.28,
+0.28,0.28,0.31,0.33,0.32,0.32,0.38,0.39,0.36,0.38,
+0.40,0.41,0.44,0.45,0.47,0.47,0.51,0.53,0.55,0.53,
+0.52,0.51,0.56,0.55,0.55,0.65,0.59,0.65,0.61,0.64,
+0.64,0.70,0.71,0.70,0.73,0.76,0.73,0.72,0.74,0.81,
+0.78,0.88,0.79,0.84,0.80,0.88,0.88,0.89,0.90,0.89,
+0.98,1.00,0.97,0.99,0.97,0.99,1.05,1.07,1.05,1.03,
+1.06,1.09,1.19,1.09,1.11,1.14,1.10,1.17,1.12,1.18,
+1.22,1.26,1.22,1.24,1.21,1.28,1.30,1.29,1.35,1.33,
+1.29,1.29,1.31,1.35,1.43,1.37,1.43,1.50,1.47,1.44,
+1.48,1.52,1.50,1.52,1.52,1.53,1.62,1.56,1.63,1.58,
+1.60,1.57,1.64,1.61,1.61,1.67,1.66,1.80,1.73,1.70,
+1.69,1.74,1.80,1.79,1.77,1.81,1.82,1.74,1.85,1.79,
+1.88,1.81,1.98,1.96,1.93,1.91,1.96,2.02,1.91,1.98,
+2.04,2.03,2.07,2.14,2.10,2.04,2.12,2.00,2.09,2.08,
+2.13,2.07,2.18,2.07,2.25,2.12,2.18,2.17,2.26,2.29,
+2.28,2.28,2.31,2.21,2.28,2.34,2.32,2.41,2.38,2.41,
+2.32,2.46,2.45,2.43,2.44,2.48,2.40,2.51,2.47,2.54,
+2.46,2.65,2.48,2.58,2.53,2.60,2.69,2.70,2.65,2.74,
+2.67,2.70,2.69,2.64,2.65,2.74,2.72,2.87,2.72,2.70,
+2.83,2.84,2.82,2.81,2.84,2.89,2.86,2.88,2.94,2.86,
+2.94,2.94,2.97,2.89,2.95,3.01,2.98,3.02,2.96,3.10,
+3.00,3.13,3.08,3.14,3.14,3.20,3.19,3.15,3.26,3.21,
+3.23,3.23,3.18,3.30,3.23,3.29,3.36,3.35,3.36,3.24,
+3.29,3.29,3.37,3.31,3.44,3.43,3.39,3.46,3.35,3.50,
+3.48,3.43,3.56,3.47,3.46,3.48,3.54,3.59,3.62,3.52,
+3.59,3.57,3.59,3.55,3.71,3.73,3.68,3.75,3.62,3.72,
+3.71,3.69,3.80,3.87,3.79,3.82,3.86,3.85,3.72,3.84,
+3.93,3.84,3.93,3.93,3.94,3.96,3.94,4.02,3.98,3.93,
+0.13,0.10,0.13,0.13,0.15,0.17,0.17,0.18,0.18,0.21,
+0.21,0.21,0.24,0.27,0.25,0.24,0.26,0.29,0.30,0.32,
+0.27,0.31,0.35,0.32,0.38,0.37,0.36,0.39,0.43,0.41,
+0.40,0.42,0.46,0.41,0.44,0.47,0.47,0.47,0.47,0.51,
+0.51,0.51,0.56,0.55,0.57,0.53,0.61,0.60,0.62,0.60,
+0.62,0.66,0.63,0.67,0.65,0.69,0.68,0.71,0.68,0.70,
+0.77,0.76,0.75,0.76,0.77,0.78,0.77,0.76,0.77,0.81,
+0.78,0.89,0.85,0.82,0.85,0.90,0.89,0.93,0.87,0.91,
+0.92,0.91,0.98,0.93,1.01,1.03,0.93,1.02,1.01,1.01,
+1.01,1.02,1.08,1.03,1.10,1.13,1.07,1.08,1.14,1.14,
+1.12,1.16,1.12,1.11,1.13,1.22,1.23,1.20,1.20,1.21,
+1.22,1.21,1.23,1.29,1.27,1.30,1.34,1.30,1.31,1.34,
+1.25,1.33,1.39,1.36,1.43,1.38,1.39,1.44,1.41,1.48,
+1.38,1.50,1.44,1.41,1.51,1.48,1.50,1.48,1.46,1.57,
+1.58,1.54,1.56,1.55,1.58,1.66,1.63,1.65,1.66,1.51,
+1.58,1.69,1.57,1.69,1.75,1.71,1.69,1.67,1.80,1.77,
+1.75,1.78,1.75,1.71,1.80,1.74,1.79,1.86,1.89,1.79,
+1.88,1.83,1.84,1.85,1.86,1.93,1.87,1.91,1.87,1.91,
+1.97,1.96,1.96,1.95,1.96,2.03,2.02,2.07,2.07,1.97,
+1.99,2.08,2.08,2.17,2.04,2.13,2.15,2.11,2.09,2.14,
+2.16,2.19,2.21,2.17,2.13,2.10,2.27,2.24,2.29,2.20,
+2.27,2.35,2.26,2.30,2.36,2.35,2.39,2.35,2.37,2.35,
+2.42,2.42,2.42,2.34,2.45,2.45,2.43,2.49,2.48,2.49,
+2.39,2.50,2.46,2.43,2.54,2.50,2.58,2.51,2.57,2.58,
+2.56,2.62,2.56,2.62,2.55,2.60,2.63,2.66,2.66,2.61,
+2.65,2.70,2.72,2.73,2.79,2.73,2.68,2.77,2.79,2.75,
+2.81,2.81,2.74,2.72,2.87,2.80,2.81,2.92,2.85,2.87,
+2.86,2.86,2.92,2.85,2.97,2.86,2.92,3.05,2.85,3.08,
+3.05,2.98,3.03,3.00,3.06,3.03,2.95,3.10,3.04,3.06,
+0.08,0.08,0.08,0.10,0.10,0.12,0.14,0.13,0.15,0.14,
+0.17,0.18,0.19,0.18,0.22,0.19,0.22,0.23,0.23,0.23,
+0.24,0.23,0.26,0.28,0.29,0.26,0.31,0.31,0.29,0.28,
+0.33,0.33,0.31,0.35,0.40,0.37,0.34,0.38,0.39,0.37,
+0.41,0.39,0.41,0.38,0.41,0.42,0.45,0.46,0.45,0.49,
+0.46,0.47,0.51,0.51,0.46,0.51,0.54,0.52,0.55,0.55,
+0.56,0.56,0.54,0.57,0.55,0.59,0.55,0.56,0.62,0.60,
+0.62,0.63,0.69,0.62,0.65,0.68,0.68,0.73,0.73,0.69,
+0.74,0.74,0.70,0.73,0.74,0.72,0.74,0.76,0.81,0.79,
+0.80,0.81,0.80,0.85,0.84,0.83,0.89,0.84,0.84,0.84,
+0.91,0.87,0.86,0.89,0.90,0.91,0.95,0.94,0.94,0.96,
+0.98,0.96,0.96,1.02,1.02,1.02,1.02,1.00,1.01,1.03,
+1.02,1.07,1.06,1.04,1.05,1.08,1.01,1.17,1.08,1.10,
+1.13,1.15,1.12,1.14,1.20,1.16,1.13,1.18,1.13,1.20,
+1.25,1.18,1.16,1.23,1.26,1.24,1.27,1.28,1.24,1.19,
+1.26,1.27,1.27,1.31,1.30,1.31,1.33,1.33,1.33,1.31,
+1.41,1.36,1.40,1.38,1.43,1.34,1.38,1.41,1.49,1.47,
+1.40,1.42,1.50,1.52,1.49,1.45,1.48,1.42,1.48,1.49,
+1.50,1.49,1.54,1.56,1.52,1.51,1.61,1.61,1.55,1.50,
+1.71,1.62,1.63,1.63,1.64,1.62,1.66,1.60,1.65,1.61,
+1.65,1.72,1.68,1.63,1.68,1.70,1.71,1.78,1.73,1.78,
+1.74,1.68,1.79,1.80,1.81,1.78,1.78,1.89,1.83,1.76,
+1.77,1.82,1.81,1.85,1.90,1.91,1.84,1.90,1.94,1.84,
+1.89,1.93,1.87,1.92,1.92,1.91,1.99,1.87,1.95,1.95,
+1.93,1.98,2.02,1.98,1.90,1.94,1.98,1.97,2.05,2.02,
+2.06,2.05,2.10,2.09,2.10,2.22,2.11,2.09,2.06,2.21,
+2.09,2.18,2.13,2.21,2.20,2.15,2.22,2.11,2.28,2.21,
+2.22,2.24,2.29,2.28,2.22,2.23,2.27,2.23,2.30,2.24,
+2.31,2.40,2.33,2.30,2.41,2.35,2.35,2.38,2.30,2.37,
+0.06,0.07,0.08,0.08,0.08,0.09,0.09,0.09,0.10,0.12,
+0.12,0.14,0.12,0.14,0.15,0.18,0.14,0.18,0.20,0.17,
+0.18,0.20,0.20,0.20,0.21,0.23,0.20,0.23,0.23,0.22,
+0.22,0.25,0.26,0.28,0.27,0.26,0.28,0.28,0.29,0.29,
+0.31,0.32,0.31,0.33,0.32,0.36,0.35,0.33,0.37,0.36,
+0.37,0.37,0.38,0.39,0.40,0.41,0.41,0.42,0.39,0.42,
+0.45,0.47,0.47,0.43,0.47,0.48,0.46,0.47,0.45,0.50,
+0.47,0.50,0.53,0.50,0.50,0.49,0.54,0.55,0.52,0.55,
+0.53,0.55,0.54,0.59,0.58,0.57,0.56,0.61,0.59,0.64,
+0.61,0.62,0.61,0.67,0.64,0.64,0.65,0.67,0.64,0.69,
+0.67,0.66,0.70,0.70,0.67,0.68,0.70,0.71,0.71,0.77,
+0.75,0.73,0.73,0.71,0.74,0.81,0.81,0.84,0.81,0.80,
+0.82,0.76,0.77,0.77,0.76,0.78,0.83,0.88,0.80,0.83,
+0.83,0.83,0.84,0.89,0.87,0.90,0.88,0.88,0.93,0.95,
+0.93,0.91,0.93,0.90,0.92,0.96,0.97,1.01,1.02,0.92,
+1.02,1.04,1.02,1.03,1.01,1.00,0.95,1.01,1.03,1.06,
+1.01,1.06,1.05,1.06,1.03,1.10,1.14,1.09,1.07,1.10,
+1.05,1.09,1.09,1.10,1.13,1.12,1.11,1.14,1.20,1.09,
+1.16,1.15,1.17,1.12,1.18,1.15,1.19,1.19,1.18,1.21,
+1.21,1.28,1.26,1.19,1.26,1.18,1.24,1.28,1.29,1.30,
+1.34,1.33,1.31,1.27,1.26,1.27,1.35,1.29,1.27,1.28,
+1.21,1.34,1.41,1.39,1.29,1.31,1.37,1.45,1.42,1.38,
+1.39,1.46,1.40,1.43,1.38,1.41,1.40,1.41,1.40,1.48,
+1.47,1.45,1.55,1.52,1.47,1.51,1.49,1.49,1.49,1.49,
+1.53,1.50,1.49,1.51,1.53,1.55,1.57,1.55,1.57,1.55,
+1.54,1.56,1.65,1.62,1.63,1.66,1.60,1.67,1.58,1.61,
+1.56,1.67,1.58,1.71,1.68,1.70,1.65,1.68,1.67,1.66,
+1.62,1.67,1.69,1.73,1.63,1.74,1.66,1.75,1.68,1.69,
+1.75,1.76,1.81,1.77,1.76,1.81,1.78,1.77,1.80,1.78,
+0.04,0.06,0.07,0.06,0.07,0.06,0.08,0.07,0.09,0.09,
+0.09,0.09,0.10,0.10,0.12,0.12,0.11,0.14,0.14,0.13,
+0.12,0.14,0.17,0.16,0.15,0.14,0.16,0.19,0.19,0.16,
+0.17,0.17,0.20,0.20,0.20,0.21,0.24,0.21,0.23,0.22,
+0.24,0.24,0.26,0.27,0.26,0.28,0.25,0.29,0.30,0.29,
+0.29,0.28,0.30,0.28,0.27,0.31,0.28,0.28,0.33,0.34,
+0.32,0.35,0.36,0.32,0.36,0.38,0.38,0.36,0.39,0.37,
+0.39,0.35,0.39,0.38,0.40,0.39,0.39,0.42,0.41,0.43,
+0.41,0.41,0.44,0.41,0.43,0.44,0.47,0.45,0.47,0.50,
+0.44,0.50,0.52,0.50,0.50,0.49,0.49,0.51,0.53,0.53,
+0.54,0.52,0.56,0.55,0.57,0.55,0.57,0.56,0.54,0.53,
+0.56,0.56,0.60,0.60,0.59,0.61,0.62,0.62,0.64,0.62,
+0.64,0.59,0.64,0.60,0.62,0.64,0.63,0.64,0.64,0.71,
+0.65,0.64,0.62,0.68,0.63,0.69,0.71,0.70,0.69,0.71,
+0.71,0.65,0.73,0.70,0.71,0.73,0.73,0.73,0.77,0.73,
+0.77,0.79,0.76,0.76,0.74,0.78,0.79,0.76,0.83,0.78,
+0.76,0.80,0.82,0.82,0.86,0.85,0.80,0.81,0.84,0.85,
+0.81,0.79,0.88,0.85,0.82,0.86,0.85,0.89,0.91,0.90,
+0.82,0.88,0.90,0.90,0.92,0.93,0.96,0.95,0.94,0.95,
+0.90,0.91,0.92,0.94,0.97,0.98,1.00,0.92,0.94,1.03,
+1.02,0.99,0.99,0.94,1.02,0.99,0.96,1.02,1.03,1.05,
+1.02,1.03,1.13,1.07,1.11,1.10,1.04,1.07,1.09,1.02,
+1.02,1.10,1.09,1.13,1.15,1.11,1.04,1.14,1.16,1.12,
+1.09,1.13,1.14,1.10,1.16,1.13,1.17,1.11,1.19,1.10,
+1.12,1.13,1.22,1.19,1.21,1.19,1.25,1.19,1.27,1.21,
+1.24,1.15,1.21,1.18,1.19,1.26,1.21,1.22,1.23,1.23,
+1.22,1.25,1.23,1.29,1.32,1.29,1.28,1.36,1.29,1.30,
+1.28,1.27,1.34,1.34,1.31,1.29,1.33,1.30,1.36,1.36,
+1.33,1.38,1.31,1.32,1.42,1.36,1.41,1.35,1.39,1.49,
+2.02,2.27,2.52,2.65,2.79,3.04,3.21,3.42,3.63,3.85,
+4.06,4.25,4.46,4.71,4.87,5.12,5.17,5.42,5.82,5.80,
+6.03,6.25,6.46,6.78,6.86,6.98,7.13,7.39,7.69,7.86,
+8.03,8.24,8.38,8.76,8.86,9.10,9.18,9.44,9.67,9.73,
+10.06,10.16,10.45,10.67,10.89,11.03,11.24,11.51,11.73,11.85,
+12.06,12.30,12.24,12.67,12.84,13.05,13.14,13.20,13.45,13.77,
+14.18,14.10,14.41,14.66,15.07,15.02,15.12,15.30,15.79,15.74,
+15.95,16.38,16.46,16.69,16.73,17.04,17.11,17.60,17.65,17.78,
+18.05,18.17,18.27,18.51,18.61,19.05,19.05,19.45,19.57,19.81,
+19.94,20.21,20.41,20.79,20.64,20.80,21.10,21.36,21.61,21.72,
+22.06,22.10,22.51,22.57,23.01,22.88,23.33,23.65,23.58,23.84,
+24.03,24.19,24.42,24.46,24.56,24.92,25.21,25.40,25.64,25.67,
+25.84,25.93,26.51,26.58,26.41,26.69,27.12,27.28,27.48,27.81,
+27.87,28.01,28.41,28.45,28.84,28.80,29.06,29.38,29.69,29.62,
+29.85,30.13,30.44,30.53,30.70,30.85,31.17,31.11,31.49,31.79,
+31.95,31.93,32.27,32.24,32.57,32.97,33.08,33.22,33.52,33.71,
+34.12,34.06,34.14,34.09,34.57,35.15,35.07,35.49,35.32,35.53,
+36.04,36.03,36.22,36.55,36.83,36.87,36.87,37.45,37.30,37.81,
+37.59,37.86,38.24,38.45,38.44,38.68,39.09,39.09,39.58,39.40,
+39.82,40.23,40.16,40.29,40.74,40.60,41.16,41.37,41.58,41.62,
+41.85,41.84,42.37,42.46,42.66,42.99,43.17,43.23,43.12,43.52,
+43.95,44.00,44.01,44.32,44.77,45.02,44.79,45.54,45.62,45.64,
+45.85,45.90,46.29,46.55,46.64,46.80,47.17,47.19,47.35,47.81,
+47.77,47.71,48.21,48.58,48.67,48.60,48.75,48.89,49.45,49.83,
+49.65,49.82,50.12,50.55,50.91,50.48,51.24,51.26,51.56,51.60,
+51.69,51.74,52.44,52.21,52.43,52.83,52.72,53.13,53.66,53.60,
+53.97,53.80,54.01,54.27,54.64,54.33,55.27,55.38,55.26,55.46,
+55.75,55.74,56.28,55.98,56.51,56.76,57.15,57.48,57.43,57.37,
+57.82,57.88,58.17,58.19,58.73,59.00,58.96,58.96,59.01,59.61,
+1.61,1.75,1.91,2.03,2.21,2.32,2.53,2.76,2.85,2.93,
+3.18,3.32,3.51,3.69,3.77,3.91,4.06,4.26,4.46,4.52,
+4.67,4.84,4.96,5.24,5.28,5.47,5.64,5.73,5.89,6.20,
+6.30,6.41,6.69,6.86,6.93,7.06,7.19,7.34,7.42,7.67,
+7.79,7.91,8.32,8.27,8.46,8.59,8.78,8.88,9.06,9.32,
+9.20,9.46,9.70,9.84,10.13,10.05,10.29,10.41,10.65,10.79,
+10.85,11.08,11.24,11.25,11.45,11.78,11.97,12.12,12.05,12.35,
+12.52,12.64,12.98,13.09,13.41,13.40,13.32,13.71,13.72,13.79,
+13.95,14.12,14.37,14.61,14.38,14.81,15.15,15.18,15.27,15.43,
+15.58,15.75,15.93,16.00,16.15,16.43,16.63,16.71,16.68,16.90,
+17.00,17.19,17.43,17.68,17.94,18.01,17.86,17.99,18.40,18.40,
+18.82,18.78,18.96,19.13,19.30,19.37,19.39,19.94,20.20,19.87,
+20.16,20.14,20.31,20.73,20.91,21.16,21.29,21.34,21.32,21.56,
+21.83,22.06,22.08,22.32,22.53,22.70,22.75,22.86,23.27,23.28,
+23.28,23.59,23.58,23.68,23.92,23.95,24.40,24.28,24.47,24.85,
+25.10,25.12,25.28,25.46,25.33,25.60,26.05,26.26,26.39,26.38,
+26.20,26.86,26.86,26.53,27.08,27.20,27.35,27.58,27.46,27.77,
+27.94,28.11,28.22,28.65,28.58,28.55,28.90,29.15,29.21,29.49,
+29.52,29.79,29.91,29.94,30.39,30.31,30.44,30.47,30.71,30.75,
+31.16,31.26,31.31,31.43,31.84,31.65,32.24,32.16,32.55,32.73,
+32.70,32.97,33.07,33.31,33.35,33.66,33.67,34.05,33.72,34.25,
+34.24,34.32,34.57,34.55,34.88,34.88,35.24,35.16,35.24,35.39,
+35.96,35.97,35.93,36.10,36.34,36.51,36.84,37.06,36.89,37.13,
+37.60,37.68,37.77,37.85,37.81,37.71,38.19,38.55,38.59,38.77,
+39.24,39.04,39.12,39.31,39.40,39.56,40.07,40.26,40.32,40.43,
+40.58,40.78,40.95,40.86,41.13,41.31,41.29,41.67,41.58,41.70,
+42.29,42.26,42.04,42.66,42.74,42.68,43.03,43.02,43.12,43.42,
+43.58,43.70,43.82,43.82,44.13,44.58,44.10,44.70,44.74,44.90,
+45.35,45.44,45.16,45.51,45.78,45.64,46.12,46.16,46.34,46.09,
+1.27,1.35,1.55,1.65,1.80,1.91,1.96,2.09,2.18,2.37,
+2.49,2.62,2.77,2.82,2.94,3.14,3.22,3.26,3.56,3.54,
+3.67,3.71,3.89,4.03,4.12,4.23,4.46,4.51,4.68,4.68,
+4.95,4.96,5.11,5.33,5.40,5.41,5.63,5.70,5.91,5.96,
+6.03,6.16,6.43,6.44,6.59,6.83,6.90,7.02,7.00,7.25,
+7.37,7.36,7.58,7.70,7.72,7.88,7.97,8.07,8.18,8.48,
+8.59,8.51,8.65,8.79,9.05,9.06,9.20,9.49,9.49,9.58,
+9.88,9.83,10.00,9.96,10.24,10.35,10.49,10.74,10.67,10.95,
+11.04,11.04,11.12,11.21,11.36,11.64,11.58,11.89,11.91,12.10,
+12.16,12.29,12.35,12.44,12.65,12.71,12.84,12.96,13.07,13.18,
+13.37,13.40,13.65,13.72,13.67,14.05,14.08,14.10,14.44,14.46,
+14.55,14.78,14.76,14.82,15.27,15.37,15.30,15.61,15.63,15.56,
+15.68,15.98,15.98,16.05,16.33,16.39,16.48,16.71,16.55,16.87,
+16.96,17.03,17.20,17.43,17.45,17.40,17.76,17.85,18.06,18.07,
+17.99,18.22,18.37,18.48,18.55,18.88,19.03,19.01,19.21,19.20,
+19.48,19.44,19.63,19.86,19.73,20.14,19.93,20.30,20.55,20.38,
+20.55,20.75,20.90,20.95,21.16,21.34,21.46,21.32,21.61,21.88,
+21.69,22.05,22.18,22.22,22.35,22.81,22.41,22.73,22.85,22.83,
+23.00,22.89,23.31,23.66,23.53,23.51,23.91,24.03,23.91,23.96,
+24.27,24.45,24.26,24.65,24.73,24.99,25.09,24.99,25.36,25.70,
+25.43,25.56,25.67,26.08,25.85,26.32,26.42,26.34,26.35,26.58,
+26.51,26.80,26.89,27.07,27.20,27.44,27.26,27.52,27.83,27.88,
+28.22,27.91,28.15,28.25,28.54,28.58,28.41,28.95,28.82,29.09,
+29.22,29.05,29.23,29.39,29.61,29.80,29.90,30.03,30.10,30.68,
+30.10,30.65,30.62,30.79,30.80,30.79,30.96,31.27,31.16,31.50,
+31.61,31.61,31.54,31.89,32.20,32.28,32.16,32.42,32.58,32.73,
+32.56,32.77,32.65,33.00,33.27,33.41,33.58,33.58,33.61,33.91,
+33.95,34.13,34.10,34.19,34.42,34.51,34.69,34.81,35.13,34.97,
+35.32,35.27,35.76,35.75,35.53,35.82,36.10,35.92,36.09,36.20,
+0.95,1.06,1.17,1.24,1.37,1.49,1.51,1.65,1.69,1.82,
+1.91,2.01,2.07,2.19,2.26,2.41,2.45,2.63,2.69,2.75,
+2.81,2.99,3.07,3.11,3.19,3.29,3.36,3.55,3.54,3.69,
+3.84,3.88,3.87,4.15,4.27,4.23,4.38,4.42,4.50,4.77,
+4.76,4.86,4.88,5.04,5.14,5.20,5.41,5.45,5.67,5.55,
+5.72,5.67,5.95,5.91,6.08,6.17,6.25,6.32,6.46,6.66,
+6.58,6.82,6.81,6.92,7.08,7.07,7.23,7.41,7.30,7.55,
+7.55,7.71,7.88,7.85,7.83,7.97,8.26,8.26,8.41,8.43,
+8.42,8.54,8.81,8.77,9.02,8.98,9.11,9.29,9.24,9.35,
+9.50,9.49,9.60,9.54,9.85,9.98,10.09,10.22,10.39,10.27,
+10.37,10.56,10.55,10.64,10.80,11.15,11.02,11.23,11.30,11.31,
+11.41,11.40,11.52,11.66,11.78,11.91,11.84,12.16,12.15,12.18,
+12.32,12.46,12.71,12.63,12.74,12.66,12.80,13.07,13.09,13.04,
+13.46,13.22,13.42,13.63,13.66,13.68,13.69,14.05,14.04,14.20,
+14.15,14.32,14.42,14.52,14.69,14.62,14.73,14.89,15.02,15.00,
+15.16,15.24,15.30,15.39,15.49,15.68,15.89,15.69,15.89,15.94,
+16.14,16.16,16.40,16.25,16.37,16.46,16.61,16.72,16.93,16.86,
+17.01,17.12,17.27,17.27,17.42,17.65,17.53,17.67,17.88,17.77,
+17.94,18.15,18.29,18.34,18.38,18.52,18.32,18.58,18.76,18.84,
+18.85,18.80,18.92,19.29,19.30,19.52,19.46,19.68,19.50,19.92,
+19.95,19.95,20.09,20.30,20.27,20.25,20.51,20.61,20.56,20.86,
+20.70,20.93,21.13,21.05,21.02,21.32,21.48,21.72,21.80,21.97,
+21.65,22.06,22.06,22.26,22.06,22.21,22.18,22.46,22.61,22.66,
+22.73,22.71,23.06,22.67,23.01,23.09,23.31,23.20,23.59,23.61,
+23.20,23.83,23.85,23.84,24.01,24.34,24.30,24.30,24.21,24.57,
+24.54,24.66,24.75,24.85,24.74,24.86,25.37,25.14,25.44,25.39,
+25.40,25.70,25.82,25.87,25.92,25.83,26.20,26.48,26.11,26.36,
+26.44,26.51,27.03,26.77,26.63,27.07,26.99,27.14,27.44,27.36,
+27.35,27.57,27.59,27.83,27.48,27.95,28.09,28.20,28.06,28.09,
+0.75,0.85,0.92,0.99,1.07,1.16,1.19,1.25,1.34,1.42,
+1.50,1.58,1.64,1.74,1.77,1.89,1.96,1.97,2.09,2.15,
+2.20,2.24,2.42,2.45,2.55,2.56,2.62,2.78,2.94,2.80,
+2.97,3.08,3.10,3.29,3.29,3.33,3.36,3.47,3.50,3.58,
+3.74,3.72,3.88,3.94,4.05,4.16,4.16,4.20,4.36,4.41,
+4.42,4.46,4.62,4.67,4.76,4.76,4.79,4.91,5.07,4.98,
+5.18,5.22,5.29,5.37,5.48,5.63,5.59,5.76,5.72,5.84,
+5.83,5.94,6.04,6.04,6.25,6.48,6.33,6.33,6.53,6.54,
+6.74,6.71,6.76,6.86,6.94,7.01,7.14,7.07,7.23,7.24,
+7.45,7.28,7.65,7.64,7.81,7.74,7.78,8.02,8.03,7.94,
+8.11,8.22,8.34,8.40,8.39,8.41,8.51,8.75,8.65,8.70,
+8.82,8.95,9.05,9.11,9.08,9.19,9.27,9.54,9.46,9.48,
+9.73,9.62,9.82,9.82,9.76,10.02,10.26,9.98,10.12,10.19,
+10.21,10.57,10.43,10.55,10.66,10.60,10.75,10.87,10.99,10.89,
+11.13,11.04,11.34,11.15,11.44,11.31,11.63,11.55,11.75,11.97,
+11.86,11.76,11.76,12.25,12.06,12.24,12.22,12.36,12.46,12.40,
+12.34,12.61,12.77,12.84,12.73,12.92,12.88,12.92,13.05,13.16,
+13.26,13.35,13.47,13.29,13.59,13.70,13.67,13.69,13.94,13.94,
+14.12,14.03,14.06,14.24,14.34,14.39,14.50,14.59,14.52,14.52,
+14.61,14.78,14.99,15.04,15.14,14.98,15.14,15.29,15.29,15.31,
+15.49,15.58,15.72,15.60,15.76,16.02,16.02,15.92,16.12,16.25,
+16.15,16.24,16.59,16.43,16.47,16.70,16.63,16.75,16.85,17.02,
+16.85,16.95,17.09,17.28,17.18,17.27,17.50,17.48,17.42,17.59,
+17.95,17.78,17.90,18.12,17.82,18.24,18.03,18.37,18.43,18.58,
+18.51,18.55,18.39,18.55,18.74,18.65,18.80,18.86,19.03,18.91,
+19.12,19.23,19.25,19.46,19.28,19.49,19.45,19.68,19.69,19.81,
+19.76,20.16,20.19,20.26,20.23,20.10,20.37,20.36,20.41,20.81,
+20.72,20.73,20.94,20.70,20.93,20.77,21.02,21.21,21.24,21.34,
+21.53,21.20,21.47,21.47,21.64,21.99,21.84,21.87,21.82,22.25,
+0.60,0.66,0.72,0.76,0.81,0.82,0.94,0.97,1.03,1.10,
+1.24,1.23,1.28,1.39,1.40,1.40,1.57,1.60,1.62,1.63,
+1.81,1.73,1.88,1.94,2.01,2.02,2.09,2.17,2.22,2.27,
+2.31,2.37,2.49,2.51,2.53,2.57,2.65,2.79,2.78,2.85,
+2.91,2.86,2.99,3.02,3.16,3.26,3.20,3.42,3.50,3.39,
+3.54,3.56,3.48,3.68,3.71,3.80,4.00,3.89,3.91,3.93,
+4.04,4.12,4.18,4.21,4.20,4.42,4.43,4.45,4.66,4.53,
+4.63,4.70,4.63,4.87,4.93,4.95,5.06,5.00,5.05,5.21,
+5.19,5.23,5.38,5.41,5.38,5.37,5.43,5.59,5.67,5.78,
+5.85,5.94,5.80,6.03,6.14,6.03,6.05,6.13,6.26,6.37,
+6.43,6.33,6.52,6.58,6.54,6.72,6.77,6.83,6.76,6.83,
+6.80,7.00,6.82,7.00,7.24,7.28,7.25,7.27,7.41,7.51,
+7.44,7.48,7.66,7.79,7.77,7.68,7.75,7.82,7.89,7.94,
+8.18,8.08,8.20,8.26,8.41,8.34,8.45,8.43,8.42,8.59,
+8.65,8.69,8.90,8.88,8.81,8.99,8.87,8.86,9.09,9.26,
+9.21,9.31,9.31,9.38,9.37,9.51,9.48,9.63,9.72,9.69,
+9.87,9.99,10.04,9.98,10.04,10.22,10.10,10.27,10.35,10.31,
+10.36,10.53,10.44,10.70,10.45,10.66,10.69,10.74,10.94,10.96,
+10.87,11.10,11.22,11.19,11.19,11.24,11.50,11.37,11.49,11.43,
+11.70,11.62,11.65,11.63,11.76,11.78,11.76,12.06,12.10,11.99,
+12.13,11.98,12.37,12.26,12.37,12.47,12.46,12.64,12.54,12.71,
+12.81,12.58,12.62,12.99,12.97,12.87,13.13,12.97,12.97,13.24,
+13.26,13.27,13.56,13.36,13.58,13.34,13.49,13.66,13.68,13.91,
+13.92,13.95,13.95,14.04,14.13,14.09,14.14,14.10,14.38,14.19,
+14.35,14.47,14.42,14.45,14.63,14.74,14.63,14.83,14.90,14.93,
+15.06,15.01,14.91,14.98,14.98,15.12,15.23,15.39,15.77,15.48,
+15.50,15.60,15.77,15.84,15.93,15.95,15.81,15.92,15.93,16.03,
+16.17,16.24,16.27,16.52,16.64,16.32,16.59,16.46,16.73,16.64,
+16.76,16.72,16.76,16.87,16.99,16.94,17.16,16.90,17.10,17.21,
+0.47,0.49,0.56,0.63,0.65,0.66,0.76,0.71,0.85,0.88,
+0.90,0.94,0.99,1.05,1.10,1.13,1.22,1.22,1.29,1.35,
+1.42,1.39,1.45,1.56,1.58,1.60,1.63,1.67,1.72,1.75,
+1.70,1.84,1.88,1.98,1.94,2.05,2.03,2.07,2.23,2.21,
+2.32,2.36,2.32,2.37,2.44,2.51,2.57,2.55,2.66,2.67,
+2.73,2.74,2.90,2.81,2.85,2.88,2.93,2.95,3.06,3.12,
+3.21,3.18,3.41,3.33,3.40,3.37,3.48,3.48,3.54,3.57,
+3.62,3.60,3.71,3.85,3.80,3.73,3.81,3.88,3.91,3.96,
+4.05,4.08,4.22,4.14,4.30,4.38,4.31,4.40,4.38,4.47,
+4.62,4.68,4.57,4.65,4.52,4.72,4.79,4.80,4.83,4.89,
+4.81,5.01,4.95,5.11,5.14,5.14,5.30,5.15,5.30,5.33,
+5.46,5.43,5.45,5.68,5.53,5.67,5.66,5.77,5.89,5.74,
+5.94,5.92,5.92,5.86,6.09,6.04,6.11,6.08,6.11,6.28,
+6.27,6.34,6.36,6.36,6.42,6.54,6.63,6.52,6.70,6.62,
+6.76,6.78,6.86,6.86,6.91,6.97,6.95,7.15,7.13,7.24,
+7.29,7.17,7.18,7.38,7.35,7.36,7.46,7.51,7.41,7.38,
+7.68,7.54,7.82,7.78,7.98,7.79,7.85,7.95,7.91,8.04,
+8.12,8.13,8.15,8.22,8.21,8.25,8.49,8.39,8.46,8.47,
+8.52,8.61,8.60,8.61,8.71,8.85,8.90,8.89,8.85,8.91,
+9.06,8.95,9.05,9.06,9.23,9.06,9.31,9.37,9.37,9.46,
+9.33,9.42,9.38,9.46,9.87,9.83,9.71,9.79,9.74,9.75,
+10.09,9.80,10.07,10.06,10.02,9.97,10.20,10.13,10.26,10.25,
+10.21,10.35,10.57,10.61,10.49,10.63,10.47,10.66,10.44,10.73,
+10.82,10.88,10.88,10.81,11.01,11.11,10.99,11.00,11.20,11.15,
+11.26,11.16,11.30,11.44,11.26,11.32,11.46,11.57,11.65,11.82,
+11.75,11.68,11.77,11.83,11.88,11.92,12.09,12.02,12.18,12.15,
+12.07,12.16,12.12,12.32,12.41,12.39,12.22,12.29,12.53,12.68,
+12.51,12.49,12.43,12.73,13.00,12.65,12.80,12.83,12.74,12.96,
+13.03,13.10,12.90,13.24,13.00,13.12,13.35,13.40,13.31,13.44,
+0.33,0.39,0.43,0.49,0.52,0.55,0.56,0.62,0.65,0.70,
+0.76,0.72,0.77,0.82,0.81,0.94,0.93,0.97,0.99,0.97,
+1.07,1.09,1.12,1.18,1.19,1.21,1.24,1.34,1.36,1.44,
+1.42,1.42,1.45,1.52,1.60,1.59,1.62,1.67,1.61,1.76,
+1.78,1.78,1.78,1.87,1.88,1.90,1.99,2.06,2.10,2.05,
+2.10,2.15,2.23,2.25,2.18,2.19,2.30,2.32,2.39,2.41,
+2.41,2.52,2.54,2.45,2.63,2.60,2.68,2.66,2.78,2.75,
+2.85,2.84,2.94,2.97,2.96,3.07,3.14,3.01,3.08,3.13,
+3.17,3.23,3.14,3.27,3.27,3.28,3.51,3.44,3.44,3.48,
+3.52,3.46,3.57,3.61,3.67,3.71,3.69,3.76,3.73,3.90,
+3.85,3.86,3.92,3.91,4.00,4.08,4.03,4.13,4.24,4.07,
+4.16,4.17,4.27,4.24,4.39,4.40,4.59,4.42,4.55,4.44,
+4.55,4.56,4.57,4.75,4.69,4.74,4.80,4.81,4.88,4.83,
+4.75,5.01,4.97,5.00,4.87,5.13,4.99,5.27,5.13,5.24,
+5.24,5.28,5.18,5.35,5.36,5.30,5.47,5.62,5.67,5.55,
+5.70,5.55,5.75,5.58,5.81,5.74,5.68,5.86,5.79,5.92,
+6.00,5.89,5.99,6.00,6.01,6.08,6.19,6.25,6.27,6.27,
+6.18,6.28,6.37,6.48,6.36,6.59,6.46,6.50,6.58,6.52,
+6.62,6.70,6.71,6.84,6.71,6.89,6.92,6.95,6.91,7.08,
+7.15,7.12,7.04,7.21,7.00,7.03,7.08,7.29,7.34,7.42,
+7.46,7.36,7.40,7.60,7.52,7.56,7.44,7.58,7.76,7.65,
+7.59,7.72,7.85,7.90,7.95,7.98,7.92,7.93,7.88,8.10,
+8.08,8.11,8.12,8.23,8.09,8.09,8.16,8.36,8.25,8.34,
+8.36,8.46,8.32,8.70,8.54,8.49,8.63,8.72,8.64,8.55,
+8.82,8.85,8.82,8.93,8.84,8.95,8.91,8.94,9.02,9.07,
+9.11,9.21,9.21,9.03,9.25,9.16,9.24,9.30,9.51,9.35,
+9.59,9.33,9.57,9.63,9.49,9.53,9.64,9.70,9.77,9.63,
+9.83,9.74,9.78,9.96,10.12,10.09,9.90,10.05,10.11,10.11,
+10.20,10.11,10.28,10.19,10.37,10.16,10.37,10.22,10.38,10.33,
+0.28,0.32,0.32,0.36,0.42,0.42,0.44,0.46,0.50,0.53,
+0.57,0.58,0.59,0.66,0.63,0.67,0.72,0.80,0.76,0.74,
+0.80,0.82,0.90,0.96,0.89,1.01,1.02,1.01,1.02,1.08,
+1.10,1.09,1.19,1.19,1.18,1.25,1.28,1.28,1.32,1.34,
+1.28,1.43,1.47,1.49,1.45,1.50,1.47,1.53,1.60,1.59,
+1.61,1.69,1.71,1.74,1.77,1.79,1.84,1.79,1.87,2.00,
+1.96,1.94,1.95,2.03,2.00,2.06,2.14,2.08,2.09,2.17,
+2.19,2.20,2.17,2.33,2.34,2.38,2.35,2.45,2.38,2.52,
+2.53,2.49,2.56,2.61,2.55,2.57,2.72,2.74,2.72,2.66,
+2.78,2.68,2.85,2.76,2.84,2.86,2.92,2.96,2.94,3.08,
+2.94,3.05,3.12,3.06,3.14,3.14,3.23,3.25,3.13,3.27,
+3.25,3.36,3.31,3.38,3.34,3.40,3.39,3.47,3.58,3.57,
+3.63,3.56,3.65,3.70,3.71,3.77,3.73,3.80,3.81,3.86,
+3.86,3.80,3.81,4.04,3.90,4.00,4.11,4.01,4.06,4.02,
+4.12,4.14,4.15,4.16,4.12,4.20,4.12,4.44,4.26,4.38,
+4.37,4.32,4.44,4.47,4.49,4.55,4.54,4.47,4.65,4.61,
+4.67,4.61,4.65,4.72,4.65,4.80,4.74,4.81,4.85,5.04,
+4.95,5.02,4.91,4.94,4.95,5.00,5.04,5.14,5.18,5.22,
+5.04,5.27,5.15,5.23,5.25,5.33,5.32,5.29,5.58,5.50,
+5.40,5.61,5.52,5.58,5.45,5.59,5.57,5.58,5.73,5.80,
+5.76,5.69,5.82,5.75,5.84,5.76,5.86,5.86,5.98,5.89,
+6.04,6.07,6.10,6.13,6.23,6.21,6.22,6.14,6.18,6.26,
+6.15,6.31,6.20,6.21,6.44,6.40,6.48,6.42,6.64,6.54,
+6.55,6.56,6.56,6.55,6.69,6.79,6.59,6.77,6.81,6.81,
+6.72,7.00,6.89,6.93,6.96,7.01,6.88,7.08,6.97,7.10,
+6.97,7.24,7.16,7.17,7.19,7.03,7.18,7.21,7.34,7.24,
+7.41,7.42,7.48,7.33,7.43,7.59,7.40,7.42,7.64,7.73,
+7.63,7.47,7.73,7.67,7.71,7.74,7.90,7.82,7.93,7.93,
+7.90,7.92,8.04,8.18,8.12,7.98,8.10,7.96,8.29,8.03,
+0.22,0.23,0.27,0.29,0.29,0.35,0.33,0.37,0.42,0.40,
+0.42,0.47,0.49,0.52,0.51,0.51,0.58,0.60,0.61,0.59,
+0.64,0.64,0.68,0.73,0.73,0.74,0.79,0.80,0.83,0.82,
+0.88,0.91,0.88,0.91,1.01,1.02,1.00,1.00,1.05,0.99,
+1.09,1.11,1.10,1.08,1.17,1.12,1.17,1.22,1.22,1.28,
+1.27,1.27,1.37,1.38,1.34,1.39,1.43,1.40,1.46,1.51,
+1.50,1.49,1.54,1.57,1.58,1.57,1.63,1.59,1.69,1.67,
+1.69,1.74,1.77,1.75,1.78,1.81,1.86,1.84,1.85,1.82,
+1.98,1.97,1.99,1.99,2.11,2.05,2.05,2.11,2.09,2.08,
+2.16,2.10,2.22,2.32,2.23,2.22,2.26,2.23,2.30,2.32,
+2.28,2.37,2.42,2.42,2.48,2.44,2.49,2.42,2.43,2.49,
+2.57,2.58,2.54,2.59,2.61,2.69,2.65,2.73,2.78,2.69,
+2.77,2.77,2.79,2.77,2.88,2.92,2.97,2.97,2.95,2.92,
+3.14,2.98,2.98,3.08,2.98,3.07,3.03,3.09,3.13,3.29,
+3.17,3.28,3.32,3.12,3.24,3.35,3.34,3.32,3.30,3.41,
+3.40,3.46,3.48,3.40,3.51,3.48,3.54,3.43,3.56,3.62,
+3.56,3.58,3.69,3.72,3.79,3.77,3.81,3.74,3.77,3.80,
+3.86,3.77,3.88,3.78,3.95,3.93,4.01,3.93,4.13,4.10,
+4.01,4.05,4.02,4.14,4.22,4.24,4.21,4.17,4.21,4.22,
+4.22,4.25,4.36,4.35,4.36,4.32,4.40,4.45,4.48,4.51,
+4.58,4.42,4.52,4.54,4.51,4.47,4.64,4.62,4.64,4.62,
+4.79,4.64,4.60,4.78,4.77,4.80,4.88,4.78,4.78,4.83,
+4.94,4.99,4.93,4.87,4.97,4.95,5.04,4.95,5.04,5.08,
+5.08,5.11,5.16,5.26,5.11,5.30,5.25,5.20,5.29,5.36,
+5.34,5.39,5.27,5.49,5.50,5.37,5.42,5.47,5.43,5.59,
+5.53,5.57,5.51,5.64,5.53,5.67,5.59,5.61,5.73,5.77,
+5.85,5.74,5.84,5.75,5.81,5.72,5.88,5.86,5.92,5.96,
+6.00,6.00,6.02,5.95,5.96,6.11,6.11,6.10,6.09,6.11,
+6.11,6.30,6.16,6.28,6.21,6.16,6.42,6.36,6.26,6.16,
+0.15,0.20,0.22,0.23,0.22,0.27,0.24,0.29,0.29,0.32,
+0.36,0.39,0.37,0.41,0.38,0.40,0.45,0.47,0.47,0.48,
+0.51,0.53,0.54,0.55,0.54,0.55,0.60,0.63,0.67,0.65,
+0.68,0.74,0.70,0.79,0.72,0.74,0.80,0.79,0.82,0.76,
+0.82,0.85,0.84,0.93,0.88,0.91,0.98,1.02,0.93,1.04,
+1.00,0.96,1.06,1.05,1.12,1.12,1.13,1.15,1.14,1.14,
+1.16,1.20,1.25,1.21,1.20,1.27,1.26,1.26,1.25,1.25,
+1.32,1.33,1.38,1.42,1.50,1.41,1.41,1.41,1.48,1.52,
+1.54,1.58,1.57,1.56,1.55,1.58,1.58,1.64,1.61,1.70,
+1.61,1.70,1.66,1.70,1.76,1.67,1.80,1.80,1.88,1.78,
+1.83,1.82,1.90,1.92,1.89,1.94,1.92,1.95,1.93,1.92,
+2.01,1.95,2.08,2.07,2.03,2.10,2.17,2.07,2.12,2.12,
+2.14,2.18,2.20,2.09,2.19,2.33,2.27,2.27,2.29,2.33,
+2.41,2.32,2.38,2.31,2.32,2.42,2.46,2.41,2.40,2.50,
+2.60,2.50,2.51,2.47,2.55,2.60,2.62,2.62,2.69,2.60,
+2.65,2.62,2.72,2.66,2.70,2.74,2.77,2.70,2.80,2.82,
+2.79,2.71,2.88,2.85,2.94,2.78,2.89,2.87,2.94,2.96,
+2.94,3.09,3.05,3.06,3.11,3.01,3.19,3.14,3.11,3.15,
+3.10,3.16,3.15,3.26,3.33,3.31,3.38,3.17,3.17,3.31,
+3.29,3.33,3.27,3.35,3.46,3.43,3.46,3.40,3.43,3.54,
+3.49,3.61,3.46,3.51,3.62,3.62,3.59,3.58,3.58,3.65,
+3.61,3.76,3.63,3.68,3.64,3.69,3.73,3.82,3.84,3.76,
+3.89,3.77,3.89,3.90,3.87,3.98,3.91,3.94,4.00,4.00,
+3.94,3.97,4.08,4.01,4.17,4.07,4.13,4.10,4.04,4.11,
+4.07,4.05,4.18,4.11,4.28,4.12,4.25,4.26,4.39,4.25,
+4.29,4.30,4.34,4.29,4.33,4.38,4.42,4.31,4.55,4.33,
+4.49,4.58,4.43,4.45,4.63,4.54,4.53,4.67,4.56,4.72,
+4.76,4.67,4.80,4.68,4.67,4.74,4.75,4.79,4.69,4.70,
+4.73,4.87,4.80,4.82,4.99,4.85,4.76,5.04,4.93,4.94,
+0.12,0.15,0.16,0.18,0.19,0.20,0.21,0.19,0.26,0.23,
+0.27,0.28,0.29,0.29,0.29,0.33,0.32,0.36,0.40,0.38,
+0.39,0.38,0.39,0.42,0.48,0.47,0.46,0.47,0.48,0.49,
+0.53,0.55,0.54,0.56,0.57,0.58,0.62,0.59,0.61,0.68,
+0.65,0.68,0.66,0.66,0.66,0.76,0.75,0.78,0.70,0.77,
+0.76,0.80,0.80,0.81,0.82,0.81,0.86,0.83,0.86,0.90,
+0.91,0.93,1.02,0.95,0.97,1.00,0.99,0.97,1.06,0.99,
+1.07,1.04,1.03,1.08,1.06,1.08,1.08,1.08,1.20,1.17,
+1.23,1.20,1.22,1.24,1.20,1.24,1.21,1.26,1.28,1.23,
+1.26,1.31,1.34,1.32,1.30,1.37,1.37,1.41,1.39,1.43,
+1.42,1.43,1.41,1.44,1.48,1.46,1.52,1.48,1.48,1.57,
+1.57,1.61,1.62,1.56,1.64,1.58,1.67,1.66,1.62,1.76,
+1.70,1.75,1.71,1.75,1.70,1.72,1.75,1.79,1.74,1.81,
+1.78,1.82,1.92,1.92,1.92,1.84,1.90,1.92,1.87,1.98,
+1.90,2.00,2.01,1.95,1.99,1.98,2.01,2.12,2.03,2.04,
+2.10,2.06,2.09,2.04,2.18,2.12,2.13,2.15,2.16,2.18,
+2.25,2.29,2.27,2.23,2.31,2.25,2.24,2.27,2.31,2.38,
+2.34,2.35,2.38,2.38,2.40,2.39,2.37,2.43,2.44,2.40,
+2.46,2.42,2.45,2.54,2.47,2.53,2.62,2.58,2.60,2.44,
+2.57,2.60,2.55,2.57,2.70,2.65,2.67,2.77,2.67,2.71,
+2.71,2.65,2.80,2.76,2.79,2.86,2.77,2.80,2.81,2.83,
+2.76,2.83,2.95,2.85,2.86,2.95,2.94,2.91,2.98,2.95,
+2.93,3.03,3.03,3.00,3.02,3.04,3.08,3.08,3.01,2.96,
+3.14,3.13,3.24,3.15,3.13,3.28,3.16,3.06,3.26,3.26,
+3.28,3.17,3.25,3.30,3.32,3.39,3.23,3.27,3.27,3.33,
+3.35,3.35,3.40,3.41,3.45,3.46,3.53,3.48,3.43,3.48,
+3.50,3.46,3.39,3.65,3.54,3.48,3.49,3.66,3.62,3.65,
+3.56,3.56,3.65,3.70,3.63,3.62,3.76,3.68,3.71,3.81,
+3.79,3.82,3.75,3.78,3.84,3.83,3.86,3.90,3.87,3.93,
+0.10,0.10,0.14,0.14,0.14,0.17,0.16,0.18,0.18,0.20,
+0.22,0.23,0.23,0.24,0.25,0.26,0.29,0.27,0.28,0.30,
+0.33,0.34,0.38,0.35,0.35,0.35,0.36,0.35,0.38,0.40,
+0.39,0.38,0.40,0.46,0.43,0.44,0.47,0.44,0.51,0.51,
+0.50,0.51,0.52,0.53,0.59,0.56,0.59,0.56,0.60,0.61,
+0.63,0.65,0.67,0.62,0.68,0.65,0.68,0.70,0.67,0.69,
+0.68,0.70,0.78,0.75,0.73,0.75,0.76,0.78,0.77,0.76,
+0.78,0.82,0.80,0.86,0.85,0.87,0.89,0.93,0.87,0.93,
+0.87,0.94,0.95,0.96,1.01,1.00,0.94,0.99,0.97,0.97,
+1.05,0.98,1.00,1.03,1.03,1.06,1.06,1.11,1.07,1.11,
+1.10,1.05,1.19,1.17,1.17,1.13,1.17,1.23,1.16,1.24,
+1.22,1.21,1.24,1.23,1.20,1.29,1.23,1.35,1.31,1.36,
+1.27,1.36,1.35,1.38,1.37,1.34,1.40,1.35,1.40,1.35,
+1.43,1.40,1.45,1.45,1.43,1.45,1.47,1.50,1.49,1.49,
+1.55,1.59,1.58,1.54,1.52,1.56,1.60,1.58,1.57,1.59,
+1.66,1.61,1.69,1.65,1.70,1.63,1.68,1.59,1.62,1.75,
+1.70,1.70,1.78,1.86,1.74,1.84,1.83,1.79,1.82,1.78,
+1.82,1.91,1.78,1.76,1.84,1.88,1.87,1.89,1.85,1.86,
+1.92,1.99,1.96,1.97,1.92,2.03,1.93,1.96,2.05,1.91,
+2.06,1.95,2.02,2.00,2.13,2.00,2.07,2.15,2.07,2.06,
+2.11,2.21,2.16,2.12,2.13,2.23,2.20,2.19,2.26,2.21,
+2.28,2.21,2.26,2.29,2.27,2.30,2.25,2.23,2.29,2.34,
+2.26,2.36,2.30,2.38,2.44,2.34,2.39,2.27,2.39,2.34,
+2.44,2.42,2.38,2.43,2.49,2.49,2.39,2.55,2.52,2.65,
+2.59,2.50,2.50,2.54,2.59,2.61,2.56,2.58,2.63,2.63,
+2.74,2.61,2.65,2.58,2.69,2.63,2.72,2.73,2.60,2.66,
+2.72,2.75,2.70,2.77,2.71,2.78,2.80,2.73,2.81,2.90,
+2.81,2.84,2.86,2.84,2.88,2.79,2.97,2.85,2.93,2.95,
+2.90,2.94,2.93,2.98,2.89,2.94,2.96,3.01,3.01,3.06,
+0.09,0.10,0.10,0.10,0.10,0.13,0.11,0.15,0.15,0.14,
+0.16,0.18,0.18,0.18,0.20,0.20,0.20,0.21,0.25,0.20,
+0.23,0.20,0.25,0.26,0.26,0.28,0.26,0.31,0.29,0.33,
+0.33,0.34,0.32,0.36,0.32,0.37,0.35,0.36,0.36,0.41,
+0.40,0.39,0.42,0.42,0.43,0.41,0.47,0.46,0.48,0.47,
+0.43,0.49,0.49,0.51,0.49,0.44,0.54,0.55,0.54,0.51,
+0.59,0.59,0.59,0.60,0.57,0.58,0.58,0.61,0.61,0.70,
+0.60,0.62,0.66,0.66,0.66,0.63,0.70,0.67,0.68,0.71,
+0.74,0.73,0.75,0.72,0.70,0.75,0.75,0.81,0.78,0.79,
+0.82,0.83,0.79,0.82,0.83,0.80,0.88,0.80,0.85,0.82,
+0.89,0.89,0.85,0.90,0.91,0.96,0.95,0.92,0.91,0.95,
+0.92,0.99,0.94,1.00,0.94,0.97,1.01,1.03,1.01,1.05,
+1.08,1.00,1.01,1.11,1.04,1.08,1.07,1.06,1.12,1.11,
+1.12,1.11,1.06,1.08,1.19,1.13,1.14,1.14,1.16,1.21,
+1.19,1.20,1.23,1.24,1.17,1.16,1.22,1.23,1.31,1.23,
+1.19,1.33,1.31,1.26,1.27,1.31,1.35,1.29,1.28,1.30,
+1.38,1.37,1.31,1.40,1.40,1.41,1.34,1.43,1.38,1.45,
+1.38,1.39,1.45,1.46,1.38,1.38,1.48,1.50,1.46,1.53,
+1.48,1.53,1.46,1.51,1.52,1.57,1.59,1.55,1.58,1.60,
+1.52,1.60,1.59,1.55,1.66,1.55,1.65,1.69,1.62,1.62,
+1.66,1.62,1.70,1.67,1.65,1.69,1.71,1.74,1.69,1.73,
+1.67,1.69,1.77,1.77,1.78,1.79,1.70,1.71,1.82,1.79,
+1.77,1.83,1.88,1.86,1.84,1.83,1.90,1.83,1.88,1.89,
+1.95,1.94,1.85,1.90,1.90,1.91,1.92,1.92,1.97,2.08,
+1.92,1.97,1.97,2.04,2.02,2.02,2.00,2.00,2.07,2.03,
+2.08,2.06,2.08,2.09,2.08,2.16,2.16,2.13,2.17,2.15,
+2.09,2.09,2.14,2.12,2.18,2.15,2.16,2.17,2.16,2.17,
+2.13,2.30,2.25,2.28,2.23,2.31,2.25,2.23,2.26,2.30,
+2.36,2.28,2.30,2.35,2.33,2.29,2.38,2.31,2.33,2.33,
+0.06,0.07,0.08,0.09,0.10,0.10,0.09,0.09,0.11,0.11,
+0.12,0.13,0.16,0.16,0.17,0.17,0.16,0.17,0.17,0.15,
+0.20,0.18,0.23,0.19,0.23,0.22,0.23,0.20,0.22,0.22,
+0.24,0.24,0.22,0.23,0.24,0.29,0.31,0.29,0.27,0.30,
+0.30,0.29,0.29,0.33,0.35,0.35,0.36,0.37,0.33,0.33,
+0.38,0.39,0.36,0.38,0.40,0.41,0.40,0.40,0.41,0.44,
+0.39,0.42,0.40,0.46,0.48,0.45,0.46,0.47,0.48,0.41,
+0.51,0.50,0.49,0.53,0.50,0.51,0.53,0.51,0.57,0.59,
+0.56,0.55,0.55,0.56,0.53,0.58,0.56,0.58,0.61,0.59,
+0.61,0.68,0.67,0.68,0.63,0.66,0.65,0.66,0.67,0.67,
+0.68,0.70,0.68,0.68,0.73,0.74,0.72,0.75,0.71,0.69,
+0.80,0.76,0.72,0.71,0.74,0.84,0.82,0.74,0.77,0.77,
+0.80,0.85,0.82,0.77,0.79,0.78,0.82,0.88,0.81,0.84,
+0.92,0.89,0.89,0.88,0.88,0.92,0.84,0.90,0.92,0.93,
+0.94,0.88,0.94,0.97,0.94,0.98,0.95,0.98,0.95,1.01,
+1.00,0.98,1.04,0.99,1.02,1.02,1.03,0.99,1.08,1.02,
+1.01,1.05,1.09,1.07,1.17,1.09,1.05,1.07,1.13,1.08,
+1.09,1.12,1.13,1.11,1.12,1.20,1.22,1.17,1.07,1.13,
+1.17,1.16,1.19,1.19,1.23,1.19,1.23,1.26,1.23,1.21,
+1.19,1.17,1.21,1.22,1.30,1.30,1.25,1.23,1.27,1.28,
+1.33,1.34,1.23,1.27,1.35,1.35,1.32,1.30,1.33,1.33,
+1.34,1.39,1.36,1.35,1.38,1.39,1.43,1.36,1.40,1.43,
+1.41,1.46,1.36,1.48,1.44,1.40,1.51,1.46,1.43,1.44,
+1.49,1.51,1.48,1.54,1.55,1.56,1.52,1.48,1.47,1.57,
+1.58,1.53,1.59,1.54,1.52,1.60,1.61,1.57,1.61,1.59,
+1.63,1.60,1.54,1.59,1.64,1.61,1.65,1.59,1.67,1.70,
+1.65,1.66,1.67,1.72,1.65,1.72,1.72,1.71,1.72,1.71,
+1.70,1.71,1.83,1.79,1.72,1.75,1.80,1.67,1.75,1.69,
+1.78,1.75,1.77,1.83,1.86,1.85,1.88,1.88,1.81,1.85,
+2.20,2.56,2.64,2.94,3.11,3.34,3.56,3.75,4.01,4.29,
+4.43,4.73,4.87,5.05,5.27,5.51,5.72,5.93,6.08,6.51,
+6.76,6.91,7.02,7.20,7.48,7.72,8.01,8.05,8.39,8.64,
+8.67,8.93,9.11,9.48,9.73,9.84,9.99,10.13,10.29,10.56,
+10.99,11.21,11.28,11.64,11.87,12.02,12.31,12.48,12.63,13.08,
+13.18,13.24,13.49,13.70,13.92,14.25,14.41,14.54,14.85,15.06,
+15.20,15.71,15.91,15.86,16.05,16.40,16.77,16.74,17.05,17.16,
+17.39,17.57,17.89,17.91,18.23,18.68,18.89,18.84,19.20,19.33,
+19.54,19.76,20.16,20.12,20.18,20.67,21.10,21.17,21.42,21.47,
+21.79,21.93,22.19,22.36,22.70,22.81,23.08,23.45,23.59,23.67,
+23.79,24.17,24.46,24.53,24.74,25.11,25.33,25.35,25.74,25.95,
+26.21,26.63,26.51,26.64,27.04,27.01,27.48,27.67,27.82,28.27,
+28.29,28.52,28.68,28.98,29.18,29.27,29.67,29.92,29.92,30.08,
+30.33,30.58,30.96,31.22,31.34,31.73,31.64,31.71,31.99,32.36,
+32.64,32.71,33.23,33.10,33.47,33.81,33.97,34.23,34.34,34.80,
+34.53,34.64,35.26,35.66,35.67,35.65,36.11,36.41,36.68,36.88,
+36.97,37.25,37.37,37.67,37.92,37.98,38.30,38.51,38.77,39.02,
+39.25,39.45,39.70,39.77,39.98,40.19,40.57,40.77,40.81,40.84,
+41.64,41.79,41.96,42.00,42.08,42.31,42.72,42.82,43.28,43.27,
+43.51,43.62,43.99,44.47,44.16,44.12,44.65,44.95,45.06,45.27,
+45.78,45.98,45.69,46.81,46.77,46.78,46.86,46.92,46.96,47.77,
+47.78,48.06,48.28,48.38,48.44,49.15,49.10,49.08,49.62,49.80,
+50.14,50.40,50.59,50.25,51.19,51.28,51.21,51.53,51.56,51.92,
+52.12,52.50,52.46,52.93,53.21,53.30,53.67,53.87,53.83,54.41,
+54.25,54.49,54.80,54.90,55.36,55.20,55.62,55.84,56.54,56.19,
+56.65,57.00,57.13,56.71,57.30,57.64,57.41,57.79,58.36,58.79,
+58.93,58.97,59.22,59.26,59.48,59.54,59.93,60.25,60.72,60.81,
+60.67,60.91,61.24,61.70,61.75,62.03,62.09,62.51,62.40,62.93,
+63.07,63.39,63.29,63.57,63.56,63.70,64.24,64.56,64.95,65.09,
+1.78,1.92,2.13,2.27,2.44,2.58,2.85,3.07,3.19,3.35,
+3.50,3.58,3.82,4.03,4.34,4.31,4.53,4.66,4.79,5.03,
+5.17,5.47,5.60,5.79,5.93,6.06,6.19,6.38,6.60,6.86,
+6.96,7.14,7.24,7.46,7.67,7.73,7.98,8.13,8.27,8.44,
+8.70,8.79,8.83,9.19,9.38,9.56,9.58,9.77,10.09,10.17,
+10.20,10.51,10.62,10.88,11.10,11.16,11.15,11.46,11.73,11.87,
+12.20,12.34,12.38,12.55,12.65,12.90,13.07,13.19,13.45,13.46,
+13.87,13.85,14.20,14.23,14.63,14.46,14.77,15.08,15.10,15.29,
+15.39,15.68,15.82,15.91,16.24,16.26,16.70,16.59,16.95,17.06,
+16.96,17.30,17.55,17.73,17.86,18.14,18.33,18.52,18.54,18.69,
+18.98,19.12,19.25,19.36,19.77,19.69,20.06,20.19,20.22,20.54,
+20.73,20.74,20.81,21.16,21.44,21.32,21.99,21.75,22.23,22.12,
+22.35,22.48,22.73,23.08,23.21,23.12,23.33,23.50,23.81,23.95,
+23.98,24.25,24.48,24.53,24.90,24.99,25.11,25.05,25.47,25.53,
+25.65,25.96,26.03,26.28,26.56,26.63,26.71,27.10,27.25,27.27,
+27.44,27.69,27.86,27.71,28.26,28.35,28.55,28.74,28.95,28.91,
+29.01,29.37,29.70,29.76,29.86,29.80,30.51,30.50,30.28,30.88,
+31.07,30.97,31.24,31.35,31.61,31.82,31.87,32.05,32.28,32.56,
+32.77,32.73,33.00,33.31,33.17,33.44,33.54,33.50,34.07,34.10,
+34.03,34.37,34.78,34.85,35.01,35.20,35.31,35.52,35.60,35.64,
+36.03,36.31,36.28,36.45,36.70,36.80,37.23,37.17,37.31,37.74,
+37.73,38.23,38.35,38.32,38.57,38.48,38.83,38.68,39.31,39.34,
+39.74,39.60,39.98,40.08,40.18,40.13,40.58,40.58,40.88,40.95,
+41.49,41.21,41.72,41.59,41.56,41.95,42.09,42.46,42.69,43.03,
+42.79,43.25,42.94,43.44,43.64,43.71,43.67,43.88,44.29,44.48,
+44.62,44.81,44.93,45.27,45.07,45.49,45.84,45.94,46.22,46.19,
+46.60,46.42,46.59,46.66,46.69,47.40,47.12,47.59,47.54,48.11,
+48.26,48.13,48.36,48.59,48.62,48.67,49.26,49.15,49.44,49.73,
+49.81,49.91,50.16,50.32,50.48,50.53,50.81,51.05,51.15,51.37,
+1.47,1.55,1.63,1.90,2.00,2.08,2.23,2.35,2.47,2.65,
+2.85,2.89,2.97,3.17,3.24,3.42,3.58,3.69,3.84,3.97,
+4.11,4.16,4.33,4.62,4.73,4.81,4.89,5.00,5.13,5.40,
+5.50,5.66,5.75,5.99,6.00,6.10,6.34,6.30,6.62,6.82,
+6.84,6.92,7.11,7.27,7.29,7.47,7.69,7.75,7.94,8.01,
+8.24,8.37,8.45,8.64,8.59,8.82,9.00,9.29,9.30,9.40,
+9.43,9.58,9.69,10.14,9.93,10.38,10.45,10.54,10.61,10.69,
+10.87,10.87,11.00,11.13,11.42,11.58,11.63,11.88,11.91,12.14,
+12.44,12.34,12.47,12.56,12.85,12.88,13.04,12.97,13.35,13.31,
+13.61,13.87,13.63,13.83,14.17,14.23,14.36,14.44,14.68,14.73,
+14.97,15.39,15.36,15.34,15.53,15.46,15.95,15.91,15.97,16.14,
+16.32,16.39,16.79,16.83,16.86,16.88,17.26,17.22,17.44,17.55,
+17.54,17.65,17.94,18.33,18.16,18.33,18.44,18.58,18.70,18.93,
+18.98,19.17,19.50,19.51,19.63,19.82,19.70,19.96,20.12,20.15,
+20.49,20.68,20.67,20.88,20.94,20.87,21.40,21.67,21.61,21.63,
+21.67,21.97,21.98,22.14,22.25,22.49,22.44,22.76,22.80,22.86,
+23.04,23.31,23.25,23.46,23.58,23.79,24.00,24.00,24.12,24.02,
+24.30,24.78,24.66,24.97,24.93,25.03,25.28,25.16,25.66,25.59,
+25.89,25.81,25.87,26.23,26.24,26.26,26.58,26.64,26.87,26.80,
+26.91,27.20,27.45,27.43,27.69,27.99,28.02,27.95,27.97,28.50,
+28.62,28.66,28.63,28.77,29.18,29.19,29.16,29.29,29.72,29.96,
+29.67,30.06,29.91,30.18,30.41,30.62,30.56,30.89,30.89,31.10,
+31.38,31.25,31.56,31.61,31.73,31.93,32.08,32.18,32.40,32.68,
+32.71,32.82,32.72,32.96,33.26,33.50,33.28,33.31,33.53,33.63,
+34.14,34.16,34.20,34.27,34.58,34.56,34.76,34.78,34.91,34.92,
+35.23,35.76,35.34,35.84,35.87,36.04,35.90,36.30,36.37,36.29,
+36.77,36.68,36.84,37.15,37.43,37.43,37.61,37.84,37.80,37.72,
+37.85,38.04,38.09,38.54,38.62,38.64,38.46,38.86,39.26,38.93,
+39.27,39.45,39.37,39.66,39.72,39.86,40.40,40.73,40.32,40.68,
+1.09,1.23,1.35,1.39,1.53,1.61,1.77,1.80,2.00,2.02,
+2.14,2.34,2.40,2.44,2.63,2.74,2.84,2.91,3.06,3.22,
+3.30,3.26,3.47,3.64,3.63,3.84,3.86,3.97,4.03,4.19,
+4.29,4.41,4.49,4.60,4.71,4.76,4.92,5.10,5.13,5.35,
+5.38,5.42,5.55,5.59,5.90,5.95,6.07,6.13,6.29,6.28,
+6.35,6.59,6.75,6.63,6.94,6.89,7.07,7.36,7.37,7.43,
+7.49,7.69,7.83,7.91,7.92,8.19,8.05,8.34,8.43,8.66,
+8.59,8.81,8.73,8.99,9.05,9.17,9.24,9.38,9.48,9.49,
+9.68,9.89,9.96,9.99,10.04,10.11,10.47,10.48,10.41,10.75,
+10.75,10.96,10.81,11.21,11.09,11.31,11.39,11.51,11.67,11.62,
+11.84,11.93,11.91,12.27,12.15,12.29,12.36,12.62,12.61,12.81,
+12.83,12.97,13.04,13.15,13.18,13.66,13.46,13.51,13.84,13.82,
+13.97,14.13,14.32,14.22,14.37,14.65,14.55,14.62,14.76,14.93,
+15.03,15.14,14.99,15.45,15.41,15.69,15.79,15.81,15.93,16.04,
+15.96,16.15,16.24,16.32,16.42,16.82,16.57,16.90,16.94,17.26,
+17.17,17.27,17.48,17.56,17.58,17.70,17.79,17.83,17.96,17.94,
+18.08,18.49,18.48,18.53,18.58,18.94,18.68,18.92,19.33,19.36,
+19.46,19.37,19.51,19.61,19.77,20.00,20.04,20.14,20.33,20.07,
+20.47,20.48,20.39,20.69,20.71,20.93,21.10,21.04,21.15,21.45,
+21.38,21.46,21.77,21.77,22.01,22.11,22.23,22.14,22.29,22.39,
+22.62,22.51,22.95,22.87,22.81,23.13,23.31,23.20,23.37,23.25,
+23.49,23.61,23.85,23.82,23.82,23.82,24.39,24.54,24.64,24.80,
+24.66,24.54,24.67,24.90,25.27,25.12,25.52,25.33,25.40,25.47,
+25.68,25.77,25.93,26.02,25.89,26.33,26.37,26.29,26.63,26.64,
+26.71,26.73,27.07,27.09,27.17,27.23,27.50,27.63,27.41,27.79,
+27.64,28.02,28.03,28.00,28.29,28.20,28.52,28.55,28.63,28.78,
+28.99,29.07,28.92,28.95,29.20,29.37,29.58,29.82,29.95,29.97,
+29.82,30.05,30.41,30.53,30.23,30.65,30.61,30.71,30.87,31.10,
+30.99,30.89,31.33,31.22,31.18,31.57,31.44,31.73,32.12,31.95,
+0.92,0.93,1.01,1.12,1.23,1.26,1.34,1.50,1.55,1.67,
+1.70,1.80,1.89,1.94,2.06,2.19,2.24,2.31,2.36,2.56,
+2.60,2.66,2.68,2.74,3.01,2.94,2.99,3.08,3.39,3.35,
+3.41,3.48,3.56,3.72,3.72,3.85,4.06,3.90,4.11,4.17,
+4.32,4.41,4.59,4.57,4.52,4.66,4.78,4.80,4.97,5.10,
+5.21,5.18,5.37,5.33,5.40,5.46,5.56,5.70,5.78,5.80,
+6.05,5.96,6.09,6.17,6.36,6.53,6.41,6.54,6.54,6.67,
+6.77,6.85,7.04,7.02,7.10,7.29,7.33,7.36,7.32,7.47,
+7.65,7.67,7.79,7.94,7.99,8.13,8.21,8.14,8.31,8.32,
+8.56,8.54,8.70,8.70,8.92,8.86,8.96,9.00,9.13,9.40,
+9.18,9.43,9.52,9.56,9.77,9.77,9.99,9.96,9.91,10.17,
+10.08,10.30,10.33,10.52,10.38,10.63,10.59,10.73,10.88,11.01,
+10.97,11.02,11.16,11.29,11.31,11.50,11.50,11.72,11.70,11.92,
+11.89,11.98,12.13,12.02,12.04,12.20,12.49,12.39,12.61,12.46,
+12.72,12.82,12.90,12.96,12.97,13.10,13.10,13.34,13.44,13.37,
+13.48,13.72,13.89,13.58,13.72,14.04,13.99,14.18,14.16,14.26,
+14.57,14.34,14.54,14.49,14.93,14.96,14.76,15.02,15.05,15.19,
+15.03,15.48,15.52,15.19,15.75,15.78,15.73,16.00,15.86,15.99,
+16.02,16.41,16.28,16.37,16.23,16.42,16.51,16.54,16.89,16.77,
+16.77,16.98,17.22,17.46,17.53,17.50,17.33,17.55,17.57,17.81,
+17.75,17.82,17.91,17.89,18.22,18.20,18.27,18.75,18.47,18.54,
+18.65,18.65,18.82,19.08,18.78,19.12,19.26,19.15,19.43,19.31,
+19.40,19.50,19.63,20.06,20.01,19.77,19.84,20.00,20.16,20.03,
+20.18,20.30,20.68,20.52,20.64,20.72,20.71,21.14,21.11,21.18,
+21.24,21.16,21.36,21.60,21.62,21.57,21.86,21.87,21.85,21.91,
+21.87,21.93,22.30,22.40,22.18,22.42,22.75,22.36,22.64,22.71,
+22.79,22.93,23.18,23.10,23.16,23.19,23.34,23.32,23.48,23.86,
+23.69,23.93,23.62,24.00,24.27,24.11,24.41,24.40,24.29,24.37,
+24.62,24.50,24.68,24.97,24.80,25.24,25.15,25.12,25.22,25.77,
+0.68,0.74,0.84,0.93,0.93,1.04,1.09,1.14,1.19,1.29,
+1.35,1.42,1.49,1.61,1.58,1.69,1.79,1.87,1.90,1.95,
+1.97,2.15,2.19,2.21,2.32,2.29,2.47,2.46,2.54,2.62,
+2.68,2.78,2.80,2.89,3.00,3.00,3.05,3.22,3.24,3.28,
+3.39,3.43,3.52,3.46,3.67,3.72,3.72,3.87,3.90,3.96,
+4.05,4.11,4.20,4.24,4.37,4.41,4.38,4.45,4.53,4.65,
+4.67,4.78,4.82,4.76,4.91,4.93,5.20,5.23,5.38,5.34,
+5.43,5.38,5.58,5.52,5.60,5.65,5.73,5.71,5.75,5.91,
+6.05,5.94,6.22,6.29,6.32,6.43,6.41,6.59,6.41,6.46,
+6.71,6.76,6.78,6.86,6.94,6.96,6.95,7.20,7.26,7.37,
+7.24,7.50,7.60,7.66,7.76,7.79,7.80,7.87,7.97,7.95,
+8.10,8.00,8.13,8.18,8.39,8.32,8.42,8.57,8.40,8.62,
+8.77,8.84,8.92,8.88,8.94,9.08,9.16,9.10,9.27,9.26,
+9.55,9.54,9.65,9.60,9.68,9.64,9.76,9.85,9.98,10.21,
+10.03,10.12,10.13,10.27,10.31,10.29,10.55,10.48,10.57,10.68,
+10.77,10.77,10.74,11.00,11.10,11.14,11.15,11.25,11.28,11.27,
+11.40,11.41,11.59,11.79,11.62,11.63,11.78,11.76,11.82,12.10,
+12.09,12.08,12.16,12.16,12.43,12.45,12.56,12.32,12.87,12.73,
+12.91,12.85,12.74,12.97,12.97,13.01,13.00,13.27,13.26,13.26,
+13.25,13.54,13.57,13.78,13.65,13.76,13.67,13.84,13.87,14.09,
+13.95,14.08,14.33,14.21,14.50,14.32,14.52,14.68,14.46,14.72,
+14.53,14.87,14.84,14.89,15.05,14.95,15.13,15.13,15.30,15.44,
+15.50,15.38,15.37,15.57,15.70,15.70,15.49,15.68,15.73,15.86,
+16.13,15.97,16.06,16.09,16.16,16.26,16.33,16.42,16.54,16.57,
+16.75,16.86,16.82,16.86,16.90,17.19,16.99,17.38,17.10,17.41,
+17.25,17.36,17.57,17.64,17.84,17.65,17.66,17.82,18.00,17.86,
+18.09,17.96,18.34,18.26,18.20,18.52,18.41,18.50,18.48,18.91,
+18.86,18.84,18.59,18.98,18.86,19.28,19.29,19.18,19.13,19.41,
+19.25,19.38,19.44,19.51,19.78,19.75,19.65,19.83,20.06,19.91,
+0.57,0.61,0.66,0.71,0.76,0.84,0.82,0.89,0.92,0.96,
+1.07,1.14,1.17,1.26,1.36,1.36,1.43,1.43,1.50,1.58,
+1.68,1.67,1.68,1.77,1.79,1.83,1.95,2.03,2.11,2.08,
+2.11,2.17,2.19,2.42,2.30,2.44,2.46,2.56,2.50,2.65,
+2.70,2.77,2.79,2.84,2.84,2.95,2.95,2.95,3.04,3.13,
+3.26,3.31,3.29,3.36,3.36,3.38,3.45,3.54,3.50,3.53,
+3.75,3.77,3.73,3.81,3.89,3.93,4.11,4.05,4.08,4.16,
+4.30,4.25,4.40,4.44,4.55,4.42,4.54,4.62,4.70,4.61,
+4.82,4.82,4.77,4.85,4.80,4.94,5.11,5.02,5.18,5.32,
+5.32,5.39,5.30,5.49,5.50,5.57,5.70,5.66,5.59,5.82,
+5.84,5.88,5.98,5.92,6.08,6.09,6.15,6.08,6.13,6.30,
+6.42,6.41,6.41,6.56,6.54,6.59,6.49,6.55,6.83,6.77,
+6.76,6.97,7.07,7.09,7.07,7.04,7.27,7.20,7.38,7.40,
+7.44,7.49,7.56,7.59,7.77,7.66,7.78,7.88,7.77,7.91,
+7.85,8.03,8.13,8.04,8.00,8.23,8.26,8.24,8.33,8.43,
+8.66,8.49,8.54,8.70,8.89,8.66,8.89,8.93,9.10,8.94,
+9.04,9.08,9.16,9.10,9.11,9.38,9.25,9.47,9.45,9.32,
+9.44,9.59,9.68,9.61,9.72,9.70,9.89,9.93,9.84,10.04,
+10.02,10.20,10.15,10.29,10.27,10.41,10.43,10.46,10.37,10.38,
+10.54,10.82,10.67,10.84,10.81,10.71,10.91,10.98,11.09,11.11,
+11.25,11.17,11.16,11.27,11.28,11.31,11.23,11.36,11.45,11.64,
+11.55,11.63,11.60,11.73,11.79,11.91,12.06,12.05,11.97,12.07,
+12.14,12.03,12.11,12.34,12.28,12.51,12.40,12.40,12.59,12.56,
+12.69,12.72,12.90,12.75,12.88,12.96,12.85,13.08,13.28,13.31,
+13.06,13.12,13.34,13.50,13.49,13.45,13.50,13.75,13.79,13.69,
+13.67,13.91,13.78,13.89,13.79,13.81,14.01,14.06,14.13,14.29,
+14.35,14.30,14.41,14.61,14.41,14.45,14.59,14.81,14.73,14.75,
+14.62,14.74,14.66,14.81,15.22,14.94,14.96,15.61,15.16,15.38,
+15.30,15.36,15.56,15.27,15.62,15.62,15.73,15.82,15.77,15.94,
+0.43,0.48,0.53,0.59,0.62,0.62,0.66,0.69,0.76,0.86,
+0.83,0.90,0.92,0.99,1.07,0.99,1.07,1.16,1.20,1.18,
+1.25,1.34,1.36,1.35,1.39,1.55,1.51,1.56,1.56,1.61,
+1.69,1.77,1.76,1.75,1.85,1.93,1.93,1.90,1.94,2.06,
+2.10,2.14,2.19,2.22,2.31,2.36,2.35,2.41,2.49,2.46,
+2.51,2.47,2.57,2.64,2.61,2.69,2.73,2.83,2.95,2.99,
+2.88,3.09,3.01,3.08,3.13,3.26,3.19,3.21,3.21,3.29,
+3.40,3.31,3.47,3.41,3.48,3.48,3.46,3.54,3.64,3.73,
+3.73,3.78,3.73,3.81,3.95,4.10,3.93,3.94,4.05,4.19,
+4.18,4.20,4.30,4.36,4.26,4.32,4.54,4.56,4.42,4.54,
+4.59,4.69,4.69,4.67,4.81,4.77,4.90,4.89,5.05,5.02,
+5.03,5.07,5.09,5.02,5.11,5.28,5.40,5.26,5.39,5.51,
+5.36,5.38,5.56,5.58,5.55,5.66,5.68,5.59,5.84,5.79,
+5.87,6.03,5.84,6.08,5.98,6.00,6.02,6.10,6.16,6.28,
+6.33,6.31,6.26,6.43,6.53,6.31,6.51,6.58,6.75,6.63,
+6.61,6.71,6.59,6.83,6.88,6.85,6.86,7.06,7.15,7.12,
+7.16,7.24,7.17,7.32,7.22,7.35,7.28,7.43,7.48,7.54,
+7.49,7.55,7.76,7.72,7.71,7.68,7.83,7.79,7.91,8.00,
+7.80,7.83,7.84,8.16,8.08,8.15,8.23,8.19,8.29,8.31,
+8.38,8.27,8.42,8.45,8.58,8.74,8.65,8.62,8.85,8.71,
+8.78,8.63,8.89,8.70,8.96,9.02,9.06,9.20,9.00,9.21,
+9.22,9.13,9.17,9.18,9.52,9.26,9.34,9.37,9.55,9.54,
+9.59,9.65,9.66,9.77,9.68,9.84,9.92,9.85,9.87,10.05,
+10.18,10.08,10.09,10.15,10.20,10.26,10.34,10.24,10.37,10.38,
+10.46,10.41,10.50,10.53,10.44,10.62,10.75,10.66,10.69,10.77,
+10.85,10.74,10.87,10.97,11.09,11.09,11.14,11.14,11.21,11.23,
+11.21,11.28,11.46,11.38,11.38,11.51,11.39,11.68,11.73,11.67,
+11.66,11.80,11.74,11.91,11.89,11.84,11.95,11.97,12.07,12.03,
+12.17,12.11,12.26,12.30,12.33,12.39,12.35,12.49,12.41,12.33,
+0.36,0.39,0.46,0.41,0.47,0.50,0.52,0.58,0.63,0.64,
+0.70,0.74,0.73,0.80,0.79,0.81,0.87,0.92,0.96,0.99,
+0.99,0.99,1.04,1.12,1.15,1.15,1.22,1.20,1.29,1.29,
+1.37,1.33,1.45,1.47,1.40,1.48,1.51,1.56,1.63,1.67,
+1.60,1.67,1.72,1.77,1.77,1.86,1.88,1.92,1.91,2.01,
+1.92,1.94,2.11,2.06,2.10,2.18,2.18,2.24,2.19,2.25,
+2.31,2.35,2.37,2.42,2.37,2.54,2.62,2.58,2.60,2.55,
+2.65,2.71,2.74,2.86,2.70,2.68,2.94,2.85,2.88,2.90,
+2.92,3.01,3.05,3.16,3.18,3.13,3.18,3.21,3.19,3.22,
+3.39,3.35,3.37,3.30,3.35,3.45,3.46,3.49,3.64,3.60,
+3.72,3.62,3.85,3.74,3.85,3.76,3.71,3.88,3.91,4.00,
+3.88,3.94,4.11,4.03,4.07,4.12,4.18,4.14,4.20,4.26,
+4.23,4.32,4.26,4.43,4.41,4.43,4.42,4.52,4.51,4.73,
+4.64,4.77,4.59,4.74,4.83,4.89,4.78,4.91,4.86,4.96,
+4.98,5.04,4.91,5.10,5.21,5.05,5.21,5.14,5.13,5.18,
+5.18,5.28,5.27,5.40,5.44,5.30,5.40,5.48,5.63,5.63,
+5.52,5.71,5.76,5.69,5.78,5.67,5.71,5.90,5.89,5.80,
+5.93,5.83,5.94,6.09,6.10,6.05,6.23,6.18,6.03,6.25,
+6.35,6.30,6.31,6.40,6.49,6.48,6.43,6.48,6.50,6.58,
+6.63,6.72,6.69,6.64,6.73,6.71,6.80,6.70,6.93,6.85,
+6.95,6.89,7.11,7.02,7.04,7.09,7.19,7.04,7.34,7.10,
+7.26,7.18,7.28,7.29,7.46,7.47,7.52,7.42,7.53,7.54,
+7.56,7.56,7.60,7.69,7.80,7.66,7.91,7.79,7.81,7.82,
+7.93,8.00,7.91,8.16,8.04,8.06,8.19,8.19,8.20,8.24,
+8.16,8.10,8.23,8.45,8.38,8.53,8.34,8.50,8.50,8.50,
+8.65,8.57,8.62,8.75,8.53,8.71,8.72,8.90,8.71,8.94,
+8.91,8.94,8.90,8.94,9.07,9.13,9.12,9.13,9.22,9.11,
+9.30,9.08,9.26,9.39,9.26,9.23,9.60,9.53,9.46,9.36,
+9.50,9.52,9.73,9.68,9.70,9.64,9.81,9.74,9.87,9.88,
+0.27,0.31,0.31,0.37,0.39,0.38,0.43,0.43,0.47,0.48,
+0.55,0.52,0.57,0.64,0.63,0.69,0.63,0.71,0.72,0.85,
+0.76,0.80,0.87,0.91,0.89,0.86,0.89,0.91,1.00,1.09,
+1.05,1.08,1.12,1.11,1.08,1.18,1.26,1.24,1.26,1.26,
+1.28,1.33,1.37,1.40,1.40,1.45,1.49,1.50,1.56,1.58,
+1.48,1.59,1.70,1.62,1.66,1.78,1.73,1.74,1.79,1.76,
+1.76,1.83,1.86,1.85,1.85,1.88,1.98,1.99,1.97,2.02,
+2.02,2.14,2.12,2.21,2.28,2.24,2.26,2.34,2.31,2.43,
+2.34,2.39,2.46,2.46,2.47,2.45,2.48,2.54,2.55,2.64,
+2.60,2.65,2.66,2.70,2.76,2.65,2.79,2.85,2.83,2.85,
+2.89,2.90,2.92,2.93,3.03,3.06,3.01,3.15,3.05,3.11,
+3.12,3.19,3.24,3.23,3.28,3.23,3.24,3.20,3.39,3.32,
+3.36,3.40,3.44,3.48,3.49,3.48,3.54,3.49,3.67,3.71,
+3.62,3.70,3.70,3.67,3.82,3.89,3.88,3.83,3.81,3.91,
+3.97,3.93,3.89,3.99,3.96,4.04,4.02,4.19,4.09,4.12,
+4.14,4.24,4.21,4.30,4.27,4.19,4.33,4.31,4.41,4.40,
+4.41,4.50,4.42,4.55,4.45,4.59,4.48,4.67,4.73,4.63,
+4.62,4.72,4.67,4.72,4.90,4.85,4.83,4.82,4.85,4.95,
+4.92,4.98,4.99,4.94,5.14,4.95,5.14,5.16,5.23,5.11,
+5.18,5.24,5.32,5.24,5.33,5.25,5.35,5.34,5.53,5.44,
+5.53,5.49,5.45,5.53,5.55,5.52,5.67,5.59,5.65,5.67,
+5.68,5.75,5.67,5.74,5.81,5.90,5.89,5.93,5.98,6.00,
+6.05,6.07,6.13,6.03,6.12,6.14,6.19,6.24,6.23,6.25,
+6.24,6.13,6.26,6.32,6.50,6.34,6.41,6.44,6.46,6.52,
+6.57,6.53,6.50,6.43,6.58,6.62,6.59,6.72,6.76,6.75,
+6.87,6.78,6.91,6.86,6.79,6.93,7.00,6.95,7.17,7.02,
+7.04,7.13,7.02,7.08,7.12,7.22,7.13,7.03,7.17,7.23,
+7.24,7.29,7.33,7.35,7.30,7.30,7.41,7.60,7.36,7.58,
+7.63,7.50,7.63,7.43,7.57,7.64,7.84,7.71,7.77,7.64,
+0.21,0.26,0.25,0.26,0.29,0.29,0.32,0.36,0.41,0.41,
+0.43,0.42,0.46,0.47,0.49,0.53,0.57,0.53,0.58,0.61,
+0.66,0.67,0.66,0.73,0.73,0.72,0.67,0.78,0.80,0.80,
+0.81,0.87,0.87,0.90,0.90,0.96,0.94,0.94,1.04,1.02,
+1.04,1.09,1.06,1.15,1.13,1.10,1.16,1.15,1.21,1.22,
+1.21,1.25,1.24,1.27,1.34,1.32,1.43,1.40,1.42,1.47,
+1.41,1.48,1.52,1.51,1.51,1.55,1.62,1.59,1.63,1.67,
+1.61,1.68,1.67,1.71,1.71,1.72,1.80,1.74,1.80,1.84,
+1.87,1.86,1.96,1.91,1.95,1.98,2.07,2.00,2.08,2.05,
+2.08,2.04,2.11,2.11,2.07,2.16,2.31,2.25,2.24,2.25,
+2.29,2.33,2.33,2.32,2.41,2.33,2.37,2.45,2.49,2.50,
+2.55,2.57,2.52,2.59,2.58,2.47,2.55,2.66,2.70,2.71,
+2.67,2.65,2.60,2.70,2.77,2.81,2.75,2.75,2.79,2.79,
+2.89,2.90,2.93,2.97,2.92,3.02,2.97,3.02,3.15,3.04,
+3.12,3.01,3.15,3.15,3.15,3.12,3.21,3.24,3.29,3.37,
+3.37,3.41,3.27,3.40,3.38,3.41,3.43,3.51,3.40,3.50,
+3.54,3.50,3.54,3.60,3.55,3.63,3.52,3.65,3.67,3.65,
+3.78,3.64,3.69,3.78,3.85,3.87,3.81,3.89,3.96,3.91,
+3.96,3.92,3.89,3.96,3.93,4.05,4.01,4.14,4.21,4.01,
+4.14,4.05,4.09,4.16,4.20,4.24,4.24,4.13,4.29,4.38,
+4.36,4.36,4.38,4.38,4.44,4.49,4.33,4.43,4.40,4.49,
+4.60,4.53,4.54,4.56,4.63,4.74,4.82,4.62,4.70,4.83,
+4.73,4.63,4.67,4.67,4.84,4.79,4.93,4.82,4.90,5.01,
+4.95,5.04,4.93,5.06,5.05,4.92,5.11,4.91,5.10,5.15,
+5.19,5.20,5.15,5.16,5.33,5.21,5.15,5.25,5.28,5.41,
+5.17,5.35,5.40,5.30,5.37,5.45,5.38,5.51,5.62,5.50,
+5.51,5.59,5.53,5.59,5.63,5.66,5.71,5.82,5.86,5.61,
+5.67,5.89,5.80,5.83,5.85,5.76,5.88,5.91,5.92,6.09,
+6.00,6.03,6.05,5.95,6.11,6.13,6.20,6.13,6.17,6.11,
+0.19,0.19,0.21,0.23,0.23,0.25,0.29,0.27,0.30,0.31,
+0.36,0.36,0.34,0.39,0.39,0.38,0.41,0.46,0.46,0.49,
+0.51,0.51,0.56,0.54,0.54,0.57,0.57,0.64,0.66,0.66,
+0.63,0.67,0.74,0.71,0.71,0.73,0.76,0.81,0.77,0.82,
+0.85,0.85,0.85,0.87,0.92,0.92,0.89,0.90,0.95,0.99,
+0.92,0.98,1.01,1.04,1.03,1.07,1.06,1.09,1.18,1.08,
+1.16,1.17,1.15,1.15,1.20,1.16,1.24,1.28,1.22,1.35,
+1.33,1.31,1.40,1.39,1.31,1.39,1.47,1.39,1.46,1.38,
+1.47,1.42,1.56,1.52,1.57,1.48,1.58,1.57,1.58,1.63,
+1.68,1.67,1.64,1.70,1.69,1.70,1.70,1.75,1.73,1.74,
+1.79,1.81,1.83,1.90,1.83,1.87,1.82,1.86,1.87,1.92,
+1.89,1.94,2.08,2.02,2.06,2.11,2.05,2.01,2.08,2.11,
+2.11,2.15,2.14,2.15,2.26,2.16,2.25,2.22,2.21,2.29,
+2.35,2.21,2.34,2.28,2.29,2.46,2.42,2.33,2.36,2.44,
+2.47,2.48,2.51,2.46,2.60,2.58,2.48,2.59,2.51,2.53,
+2.53,2.63,2.70,2.56,2.62,2.69,2.71,2.71,2.67,2.79,
+2.71,2.85,2.78,2.71,2.84,2.78,2.82,2.85,2.87,2.95,
+3.02,2.85,2.95,2.99,3.00,2.92,3.05,3.08,3.07,3.08,
+3.19,3.12,3.11,3.24,3.15,3.15,3.12,3.12,3.23,3.21,
+3.23,3.26,3.26,3.25,3.29,3.32,3.35,3.36,3.38,3.36,
+3.37,3.45,3.42,3.45,3.58,3.46,3.49,3.53,3.53,3.56,
+3.71,3.54,3.67,3.46,3.71,3.65,3.69,3.71,3.61,3.80,
+3.73,3.68,3.83,3.87,3.80,3.77,3.72,3.86,3.77,3.86,
+3.95,3.87,3.93,3.87,4.03,3.95,3.87,4.13,3.94,4.17,
+4.10,4.05,4.14,4.03,4.08,4.12,4.22,4.09,4.14,4.12,
+4.37,4.23,4.25,4.36,4.40,4.44,4.33,4.35,4.36,4.38,
+4.36,4.43,4.43,4.42,4.40,4.48,4.45,4.48,4.50,4.55,
+4.52,4.61,4.60,4.49,4.62,4.71,4.72,4.66,4.74,4.69,
+4.69,4.73,4.68,4.88,4.72,4.82,4.79,4.79,4.78,4.95,
+0.12,0.15,0.17,0.21,0.17,0.18,0.20,0.22,0.23,0.29,
+0.25,0.27,0.30,0.31,0.30,0.32,0.31,0.34,0.36,0.38,
+0.38,0.39,0.43,0.42,0.43,0.49,0.48,0.49,0.51,0.50,
+0.55,0.54,0.54,0.58,0.59,0.58,0.60,0.59,0.60,0.63,
+0.65,0.62,0.59,0.67,0.75,0.68,0.68,0.71,0.78,0.70,
+0.77,0.81,0.81,0.83,0.86,0.86,0.87,0.84,0.84,0.85,
+0.87,0.90,0.95,0.92,0.90,0.97,1.00,0.97,1.04,1.04,
+1.00,1.06,1.04,1.10,1.08,1.05,1.18,1.07,1.09,1.22,
+1.11,1.16,1.18,1.20,1.23,1.30,1.20,1.30,1.28,1.29,
+1.27,1.31,1.35,1.23,1.36,1.35,1.34,1.40,1.44,1.45,
+1.44,1.39,1.48,1.43,1.45,1.46,1.49,1.49,1.53,1.54,
+1.50,1.58,1.58,1.58,1.61,1.68,1.60,1.64,1.65,1.66,
+1.65,1.65,1.73,1.77,1.76,1.72,1.79,1.79,1.79,1.78,
+1.74,1.74,1.80,1.78,1.82,1.84,1.87,1.85,1.82,1.95,
+2.01,1.97,1.92,1.97,2.03,1.88,1.99,1.99,2.04,2.02,
+2.05,2.06,2.11,2.18,2.09,2.11,2.08,2.10,2.21,2.15,
+2.17,2.18,2.27,2.28,2.20,2.19,2.36,2.19,2.26,2.23,
+2.29,2.29,2.37,2.36,2.40,2.38,2.39,2.47,2.47,2.36,
+2.44,2.49,2.45,2.47,2.51,2.54,2.49,2.51,2.50,2.60,
+2.58,2.54,2.61,2.61,2.60,2.68,2.65,2.63,2.63,2.64,
+2.72,2.72,2.66,2.67,2.82,2.79,2.72,2.71,2.80,2.75,
+2.73,2.82,2.87,2.83,2.88,2.92,2.93,2.94,3.01,2.95,
+2.93,2.93,2.96,2.94,2.96,3.08,3.13,3.00,3.06,3.13,
+3.00,3.09,3.10,3.17,3.06,3.23,3.16,3.21,3.16,3.22,
+3.24,3.14,3.25,3.24,3.22,3.27,3.20,3.30,3.21,3.31,
+3.29,3.33,3.42,3.29,3.35,3.39,3.52,3.38,3.49,3.46,
+3.44,3.48,3.47,3.44,3.57,3.61,3.55,3.51,3.64,3.50,
+3.62,3.67,3.63,3.62,3.58,3.61,3.63,3.67,3.69,3.72,
+3.76,3.64,3.83,3.73,3.75,3.87,3.71,3.83,3.75,3.80,
+0.10,0.10,0.14,0.15,0.15,0.15,0.17,0.15,0.17,0.21,
+0.19,0.23,0.24,0.25,0.26,0.26,0.31,0.28,0.28,0.31,
+0.32,0.30,0.34,0.33,0.35,0.39,0.35,0.41,0.37,0.40,
+0.40,0.44,0.46,0.41,0.46,0.46,0.49,0.49,0.50,0.50,
+0.51,0.57,0.55,0.56,0.58,0.52,0.57,0.57,0.56,0.60,
+0.63,0.66,0.63,0.63,0.69,0.69,0.69,0.70,0.76,0.71,
+0.73,0.65,0.72,0.75,0.77,0.75,0.78,0.78,0.80,0.84,
+0.84,0.80,0.87,0.87,0.86,0.87,0.85,0.88,0.88,0.93,
+0.93,0.96,0.93,0.94,0.92,0.95,0.98,0.92,1.02,0.95,
+1.03,1.06,0.99,1.02,1.08,1.07,1.08,1.08,1.10,1.10,
+1.04,1.15,1.09,1.13,1.15,1.10,1.22,1.18,1.18,1.22,
+1.23,1.23,1.21,1.32,1.30,1.32,1.25,1.30,1.39,1.30,
+1.32,1.31,1.28,1.39,1.33,1.39,1.46,1.39,1.46,1.40,
+1.51,1.43,1.41,1.42,1.43,1.47,1.50,1.45,1.41,1.50,
+1.53,1.51,1.50,1.56,1.57,1.50,1.66,1.63,1.59,1.66,
+1.67,1.63,1.64,1.67,1.63,1.73,1.70,1.62,1.66,1.75,
+1.68,1.72,1.73,1.70,1.80,1.82,1.78,1.82,1.86,1.81,
+1.86,1.82,1.88,1.83,1.88,1.91,1.91,1.90,1.94,1.94,
+2.00,1.94,1.98,2.02,1.96,1.95,2.01,2.00,1.94,2.06,
+2.00,2.16,2.07,2.02,2.15,1.96,2.09,2.03,2.14,2.15,
+2.04,2.18,2.10,2.21,2.22,2.20,2.19,2.26,2.19,2.24,
+2.16,2.25,2.34,2.21,2.29,2.26,2.27,2.34,2.36,2.29,
+2.33,2.36,2.37,2.35,2.37,2.42,2.35,2.33,2.45,2.47,
+2.46,2.32,2.42,2.44,2.52,2.48,2.57,2.52,2.50,2.53,
+2.52,2.58,2.60,2.48,2.60,2.60,2.57,2.59,2.58,2.66,
+2.59,2.58,2.65,2.77,2.65,2.81,2.70,2.71,2.65,2.72,
+2.74,2.67,2.79,2.83,2.68,2.74,2.81,2.74,2.85,2.72,
+2.77,2.79,2.90,2.79,2.91,2.88,2.89,2.90,2.92,2.85,
+2.98,2.85,3.02,2.94,3.06,2.92,2.96,2.94,3.00,3.04,
+0.08,0.09,0.09,0.13,0.11,0.14,0.13,0.14,0.15,0.15,
+0.18,0.19,0.19,0.17,0.21,0.19,0.20,0.22,0.21,0.23,
+0.22,0.23,0.26,0.25,0.27,0.29,0.29,0.27,0.30,0.29,
+0.30,0.35,0.33,0.34,0.35,0.37,0.42,0.38,0.40,0.43,
+0.40,0.40,0.43,0.45,0.41,0.42,0.45,0.45,0.48,0.47,
+0.49,0.50,0.50,0.57,0.52,0.51,0.54,0.55,0.55,0.56,
+0.58,0.60,0.60,0.58,0.59,0.59,0.61,0.63,0.63,0.64,
+0.63,0.64,0.62,0.67,0.67,0.66,0.65,0.64,0.68,0.75,
+0.76,0.73,0.75,0.75,0.66,0.76,0.78,0.78,0.81,0.78,
+0.81,0.81,0.80,0.86,0.85,0.82,0.86,0.87,0.83,0.84,
+0.92,0.88,0.89,0.87,0.92,0.89,0.95,0.93,0.98,0.93,
+0.92,0.95,0.99,1.02,1.00,0.95,0.97,0.96,1.03,0.99,
+1.06,1.05,1.04,1.09,1.07,1.08,1.15,1.12,1.12,1.11,
+1.18,1.11,1.10,1.18,1.19,1.20,1.18,1.16,1.19,1.24,
+1.24,1.20,1.22,1.22,1.23,1.23,1.18,1.25,1.27,1.23,
+1.25,1.31,1.30,1.20,1.30,1.31,1.39,1.42,1.31,1.36,
+1.33,1.32,1.43,1.31,1.37,1.43,1.39,1.38,1.38,1.46,
+1.43,1.44,1.46,1.44,1.42,1.47,1.58,1.50,1.53,1.46,
+1.49,1.52,1.53,1.54,1.53,1.56,1.59,1.57,1.56,1.53,
+1.57,1.59,1.60,1.63,1.64,1.65,1.62,1.73,1.64,1.67,
+1.68,1.65,1.72,1.65,1.70,1.74,1.75,1.70,1.80,1.73,
+1.82,1.80,1.75,1.78,1.87,1.76,1.81,1.84,1.81,1.84,
+1.86,1.84,1.86,1.86,1.91,1.90,1.84,1.90,1.85,1.88,
+1.94,1.94,1.91,1.91,1.96,1.90,1.94,2.01,2.00,2.03,
+1.97,1.99,1.97,2.13,1.99,2.07,2.11,2.07,2.05,2.03,
+2.03,2.07,2.03,2.16,2.17,2.06,2.14,2.15,2.12,2.12,
+2.13,2.21,2.17,2.19,2.22,2.13,2.21,2.20,2.23,2.25,
+2.24,2.34,2.22,2.23,2.27,2.22,2.19,2.30,2.26,2.32,
+2.39,2.29,2.31,2.38,2.26,2.39,2.34,2.31,2.40,2.39,
+2.42,2.71,2.95,3.14,3.35,3.60,3.90,4.12,4.42,4.49,
+4.77,5.01,5.38,5.46,5.79,6.01,6.15,6.41,6.75,6.90,
+7.23,7.45,7.55,7.78,7.95,8.37,8.55,8.85,8.95,9.36,
+9.58,9.78,9.84,10.24,10.46,10.78,11.03,11.23,11.44,11.66,
+11.80,12.03,12.29,12.50,12.80,13.18,13.39,13.57,13.73,14.08,
+14.16,14.38,14.68,14.92,15.23,15.43,15.65,15.72,16.10,16.38,
+16.74,16.81,16.88,17.27,17.51,17.66,18.02,18.07,18.50,18.61,
+18.74,19.23,19.43,19.58,19.66,20.02,20.40,20.76,20.95,20.98,
+21.07,21.62,21.89,22.12,22.26,22.45,22.73,22.91,23.11,23.33,
+23.77,23.79,24.05,24.40,24.64,24.58,25.14,25.05,25.52,25.89,
+25.96,26.33,26.41,26.73,26.98,27.25,27.54,27.62,28.02,28.23,
+28.40,28.80,28.78,29.09,29.22,29.64,29.59,30.14,30.24,30.39,
+30.75,30.97,31.27,31.33,31.62,31.66,32.01,32.34,32.35,33.05,
+33.10,33.26,33.33,33.68,33.98,34.07,34.44,34.71,34.90,35.18,
+35.30,35.50,35.69,36.21,36.22,36.50,36.70,37.05,37.24,37.51,
+37.80,37.94,38.53,38.52,38.66,39.12,38.99,39.23,39.74,39.87,
+39.88,40.16,40.98,40.68,40.95,41.24,41.50,41.73,41.79,42.18,
+42.30,42.81,42.55,43.02,43.21,43.89,43.68,44.24,44.30,44.75,
+45.02,44.92,45.40,45.43,45.94,45.98,46.29,46.24,46.56,46.80,
+47.38,47.43,47.73,47.83,48.15,48.47,48.76,49.28,48.93,49.31,
+49.41,49.86,49.91,50.30,50.40,50.54,50.78,51.38,51.33,51.62,
+52.00,52.08,52.24,52.70,52.88,53.11,53.20,53.45,53.87,54.02,
+54.25,54.12,54.79,55.17,55.49,55.34,55.76,55.92,55.99,56.58,
+56.94,57.01,57.10,57.11,57.58,57.43,58.15,58.18,58.30,58.44,
+58.73,59.13,59.36,59.61,59.70,60.24,60.05,60.50,60.84,61.01,
+61.30,61.76,61.78,62.00,62.50,62.34,62.78,62.73,63.06,63.36,
+63.39,63.90,64.38,64.41,64.72,64.86,65.02,65.33,65.72,66.08,
+66.20,65.95,66.52,66.69,66.81,67.03,67.70,67.39,67.67,68.20,
+68.25,68.31,68.85,69.33,69.61,69.50,69.77,69.84,70.27,70.60,
+1.86,2.11,2.36,2.54,2.77,2.90,3.01,3.23,3.40,3.60,
+3.84,4.03,4.26,4.48,4.58,4.81,4.98,5.16,5.39,5.62,
+5.70,5.93,6.11,6.35,6.42,6.72,6.85,7.11,7.20,7.48,
+7.56,7.85,8.01,8.24,8.44,8.45,8.71,8.84,9.14,9.43,
+9.54,9.59,9.89,10.14,10.19,10.57,10.55,10.77,10.85,11.17,
+11.49,11.61,11.67,11.86,12.07,12.40,12.49,12.60,12.76,13.09,
+13.14,13.42,13.53,13.87,14.05,14.27,14.47,14.38,14.70,14.86,
+15.04,15.45,15.48,15.74,15.88,16.04,16.39,16.33,16.70,16.68,
+17.02,17.33,17.24,17.53,17.86,17.82,18.10,18.39,18.49,18.65,
+18.92,19.11,19.28,19.57,19.76,19.79,20.10,20.25,20.54,20.77,
+20.86,21.07,21.12,21.46,21.23,21.67,21.90,22.13,22.28,22.26,
+22.62,22.85,23.00,23.49,23.33,23.44,23.69,23.90,24.12,24.43,
+24.56,24.67,24.86,25.29,25.17,25.50,25.71,25.89,26.08,25.93,
+26.62,26.57,26.73,27.08,27.31,27.40,27.71,28.01,28.05,28.24,
+28.33,28.50,28.89,28.71,29.19,29.13,29.37,29.61,29.87,29.99,
+30.19,30.49,30.68,30.57,30.86,31.33,31.48,31.75,31.79,31.85,
+31.99,32.60,32.53,32.74,32.81,32.88,33.02,33.16,33.80,33.62,
+34.10,33.87,34.47,34.31,34.72,35.19,35.18,35.49,35.90,35.41,
+35.52,35.85,36.01,36.52,36.52,36.67,36.99,37.13,37.55,37.35,
+37.90,38.00,38.24,38.41,38.36,38.78,38.86,39.22,39.25,39.72,
+39.46,40.09,39.86,40.08,40.44,40.58,40.68,40.83,41.06,41.58,
+41.85,41.77,41.65,42.29,42.32,42.42,42.88,42.66,42.43,43.21,
+43.29,43.45,44.05,44.08,43.96,44.27,44.27,44.54,44.92,45.15,
+45.09,45.63,45.76,45.65,45.99,46.13,46.39,46.37,46.80,46.91,
+47.10,47.57,47.64,47.62,48.23,47.96,48.09,48.27,48.80,48.60,
+49.23,49.19,49.10,49.37,49.73,49.96,50.22,50.31,50.59,50.68,
+50.89,51.12,51.05,50.85,51.44,51.67,52.27,51.99,52.55,52.57,
+52.55,52.76,53.26,53.35,53.40,53.80,54.15,54.19,54.37,54.53,
+55.08,54.97,55.17,55.20,55.23,55.53,56.08,55.71,56.31,56.16,
+1.55,1.66,1.85,2.07,2.21,2.33,2.48,2.59,2.75,2.95,
+3.07,3.21,3.39,3.50,3.68,3.81,3.98,4.09,4.17,4.42,
+4.50,4.68,4.96,5.09,5.29,5.33,5.50,5.59,5.72,5.94,
+6.13,6.18,6.31,6.54,6.69,6.87,7.11,7.09,7.31,7.45,
+7.62,7.77,7.85,7.99,8.30,8.40,8.50,8.62,8.85,9.00,
+8.97,9.18,9.52,9.55,9.59,9.95,9.98,10.21,10.30,10.47,
+10.52,10.85,10.97,11.02,11.04,11.27,11.42,11.60,11.73,11.95,
+12.18,12.35,12.27,12.60,12.72,12.88,13.06,13.17,13.24,13.62,
+13.50,13.87,14.13,14.14,14.19,14.30,14.66,14.74,14.83,15.03,
+14.96,15.36,15.36,15.53,15.76,15.90,16.00,16.24,16.34,16.42,
+16.67,16.71,16.85,17.05,17.32,17.28,17.43,17.79,17.60,18.02,
+18.06,18.30,18.50,18.42,18.94,18.81,19.16,19.36,19.48,19.65,
+19.91,19.72,19.93,20.16,20.15,20.31,20.64,20.75,20.80,20.85,
+21.24,21.29,21.44,21.66,21.64,22.10,22.05,22.11,22.43,22.44,
+22.50,22.72,22.91,23.13,23.11,23.28,23.78,23.69,24.19,24.03,
+24.13,24.23,24.37,24.34,24.57,24.91,25.20,25.32,25.20,25.70,
+25.60,25.86,25.85,26.13,26.25,26.16,26.49,26.77,27.01,26.73,
+27.27,27.01,27.66,27.60,28.22,27.87,27.79,28.16,28.35,28.42,
+28.67,28.82,28.89,29.35,29.33,29.59,29.60,29.60,30.18,29.92,
+30.15,30.51,30.34,30.57,31.00,30.90,31.15,31.34,31.27,31.70,
+31.34,31.78,31.86,32.20,32.33,32.67,32.51,32.99,32.82,32.98,
+33.21,33.42,33.55,33.71,33.85,33.85,33.83,34.16,34.37,34.77,
+34.83,34.71,34.76,35.06,35.13,35.51,35.55,35.72,36.04,36.22,
+36.17,36.48,36.47,36.65,37.12,36.91,37.08,37.15,37.49,37.56,
+37.74,38.20,38.02,38.32,38.29,38.43,38.67,38.91,38.99,39.06,
+39.37,39.17,39.52,39.40,39.81,40.10,40.12,40.48,40.44,40.63,
+40.60,40.98,40.89,41.13,41.37,41.39,41.70,41.62,42.24,42.17,
+42.42,42.33,42.41,42.40,42.81,42.93,43.11,43.58,43.37,43.49,
+43.79,43.70,44.21,44.13,44.35,44.58,44.64,44.61,44.91,45.34,
+1.24,1.38,1.50,1.56,1.77,1.78,2.02,2.16,2.20,2.39,
+2.46,2.57,2.70,2.84,2.94,3.14,3.16,3.28,3.43,3.56,
+3.57,3.85,3.94,4.03,4.06,4.19,4.39,4.64,4.63,4.74,
+4.81,5.01,5.05,5.19,5.38,5.57,5.65,5.65,5.81,5.85,
+6.11,6.17,6.33,6.47,6.63,6.72,6.90,6.94,6.94,7.08,
+7.09,7.40,7.55,7.59,7.77,7.83,8.12,8.13,8.28,8.38,
+8.57,8.54,8.60,8.82,8.96,9.10,9.16,9.34,9.50,9.48,
+9.54,9.98,10.00,9.96,10.26,10.27,10.56,10.61,10.67,10.78,
+10.92,10.98,11.12,11.50,11.40,11.57,11.75,11.71,11.86,11.92,
+12.05,12.36,12.46,12.44,12.75,12.63,12.88,12.88,13.10,13.23,
+13.37,13.40,13.61,13.65,13.98,14.03,14.03,14.21,14.33,14.45,
+14.60,14.65,14.87,14.84,15.12,15.07,15.20,15.30,15.54,15.56,
+15.74,15.79,16.07,16.00,15.93,16.38,16.35,16.52,16.71,16.65,
+17.12,17.15,17.12,17.21,17.31,17.42,17.59,17.87,17.91,17.98,
+18.28,18.26,18.61,18.34,18.68,18.75,18.89,18.86,19.23,19.05,
+19.42,19.30,19.50,19.51,19.59,19.86,20.03,20.33,20.23,20.36,
+20.61,20.47,20.73,20.91,20.95,21.02,21.11,21.25,21.49,21.66,
+21.67,21.75,21.77,22.08,22.22,22.21,22.51,22.65,22.88,22.64,
+22.89,23.08,23.14,23.34,23.52,23.52,23.61,23.64,23.91,23.92,
+24.07,24.37,24.46,24.66,24.54,24.91,24.84,24.81,25.30,25.32,
+25.57,25.31,25.76,25.70,25.71,25.89,26.23,26.31,26.45,26.40,
+26.61,26.55,26.64,26.78,27.00,27.51,27.21,27.35,27.71,27.50,
+28.00,27.87,27.78,28.27,28.28,28.41,28.46,28.71,28.61,28.95,
+28.77,28.99,29.45,29.17,29.33,29.73,29.86,29.65,30.12,30.04,
+30.08,30.27,30.55,30.46,30.68,30.87,30.77,30.77,30.95,31.48,
+31.37,31.52,31.54,31.82,31.56,32.00,32.31,32.25,32.33,32.63,
+32.68,32.49,32.84,33.02,33.16,32.98,33.26,33.23,33.23,33.46,
+33.83,33.83,34.08,34.11,34.39,34.34,34.38,34.66,34.69,34.82,
+34.96,35.01,35.20,35.44,35.51,35.47,35.41,35.87,36.00,35.89,
+1.05,1.09,1.15,1.27,1.34,1.53,1.58,1.68,1.78,1.81,
+1.95,2.10,2.16,2.25,2.33,2.53,2.55,2.75,2.70,2.88,
+2.93,3.05,3.05,3.19,3.27,3.44,3.48,3.73,3.70,3.72,
+3.86,4.03,4.11,4.16,4.26,4.37,4.42,4.56,4.67,4.69,
+4.76,5.01,5.07,5.17,5.24,5.28,5.28,5.53,5.59,5.67,
+5.86,5.93,5.97,6.16,6.12,6.41,6.46,6.45,6.57,6.71,
+6.71,6.96,7.13,7.06,7.21,7.33,7.39,7.52,7.54,7.81,
+7.72,7.66,7.99,8.11,8.27,8.26,8.39,8.39,8.43,8.65,
+8.82,8.82,8.97,9.14,8.98,9.29,9.25,9.21,9.55,9.52,
+9.72,9.90,9.73,10.00,10.04,10.12,10.10,10.36,10.35,10.69,
+10.69,10.67,10.88,11.00,11.21,11.15,11.08,11.35,11.53,11.47,
+11.65,11.71,11.75,11.95,12.05,12.19,12.23,12.09,12.28,12.66,
+12.48,12.74,12.66,12.89,12.86,13.00,13.04,13.48,13.40,13.40,
+13.61,13.68,13.76,13.82,13.82,13.93,14.16,14.21,14.30,14.50,
+14.40,14.69,14.71,14.89,14.85,15.06,14.96,15.16,15.31,15.12,
+15.30,15.43,15.50,15.71,15.88,15.85,15.99,16.38,16.10,16.37,
+16.39,16.64,16.70,16.71,16.90,16.91,17.11,17.22,17.28,17.49,
+17.61,17.47,17.75,17.63,17.87,17.74,18.10,17.90,18.09,18.15,
+18.47,18.30,18.71,18.65,18.88,18.59,19.04,19.04,19.21,19.20,
+19.38,19.37,19.79,19.66,19.40,19.83,20.01,19.98,20.13,19.98,
+20.00,20.47,20.34,20.58,20.72,20.83,20.81,21.04,21.11,21.11,
+21.26,21.24,21.32,21.46,21.47,21.98,22.06,21.92,21.91,22.20,
+21.95,22.41,22.27,22.50,22.47,22.63,22.66,22.64,23.38,22.96,
+23.12,23.17,23.37,23.49,23.49,23.77,23.46,23.93,23.92,24.02,
+24.17,24.00,24.33,24.51,24.67,24.57,24.55,24.78,24.93,25.15,
+25.06,25.32,25.15,25.27,25.73,25.39,25.72,25.79,25.87,26.02,
+26.11,26.03,26.39,26.73,26.67,26.88,26.52,26.70,26.91,26.96,
+26.98,27.07,27.04,27.46,27.52,27.64,27.45,27.52,27.78,28.05,
+28.25,28.25,28.19,28.25,28.38,28.40,28.45,28.66,28.49,28.78,
+0.80,0.87,0.93,1.04,1.14,1.14,1.22,1.36,1.47,1.49,
+1.56,1.60,1.75,1.75,1.82,2.00,2.03,2.15,2.19,2.27,
+2.35,2.50,2.53,2.58,2.61,2.71,2.83,2.88,2.95,3.02,
+3.19,3.24,3.25,3.31,3.41,3.46,3.66,3.67,3.78,3.85,
+3.88,4.04,4.01,4.27,4.26,4.33,4.24,4.36,4.47,4.56,
+4.57,4.83,4.80,4.78,4.92,4.93,5.18,5.18,5.26,5.33,
+5.37,5.56,5.47,5.54,5.80,5.78,5.80,5.91,6.00,6.07,
+6.14,6.30,6.40,6.30,6.47,6.65,6.57,6.79,6.81,6.97,
+7.02,6.93,7.11,7.22,7.34,7.45,7.44,7.48,7.59,7.62,
+7.64,7.62,7.91,7.95,8.16,8.13,8.29,8.39,8.51,8.51,
+8.54,8.64,8.82,8.70,8.95,9.06,8.95,9.05,9.26,9.14,
+9.28,9.34,9.46,9.48,9.54,9.56,9.89,9.91,9.86,10.02,
+10.10,10.28,10.33,10.25,10.62,10.40,10.47,10.62,10.67,10.83,
+10.88,10.73,11.01,11.00,11.17,11.11,11.24,11.39,11.39,11.56,
+11.53,11.62,11.70,11.74,11.94,12.01,12.06,12.19,12.33,12.20,
+12.37,12.42,12.48,12.64,12.68,12.87,12.91,13.04,13.05,13.10,
+13.13,13.08,13.41,13.36,13.37,13.84,13.67,13.74,13.77,13.84,
+13.85,14.02,14.03,14.23,14.24,14.42,14.51,14.37,14.53,14.59,
+14.75,14.73,15.00,14.72,14.86,15.00,15.14,15.12,15.15,15.43,
+15.28,15.56,15.56,15.68,15.77,16.03,15.97,16.09,16.02,16.08,
+16.07,16.48,16.36,16.41,16.50,16.59,16.66,16.69,16.78,16.94,
+16.97,16.89,17.15,17.19,17.38,17.31,17.59,17.62,17.60,17.73,
+17.77,17.95,17.77,18.08,18.02,18.21,18.36,18.19,18.33,18.37,
+18.64,18.83,18.62,18.80,18.79,18.92,19.01,18.82,19.17,19.12,
+19.45,19.25,19.51,19.69,19.74,19.53,19.81,19.83,20.05,20.20,
+20.11,20.08,20.28,20.20,20.34,20.60,20.68,20.67,20.48,20.59,
+20.97,20.90,21.01,21.27,21.36,21.17,21.56,21.43,21.44,21.57,
+21.79,22.02,21.70,21.95,21.92,22.02,22.04,22.15,22.38,22.30,
+22.25,22.40,22.58,22.69,22.75,22.65,22.83,22.95,22.77,23.28,
+0.67,0.68,0.72,0.85,0.86,0.96,0.99,1.06,1.17,1.25,
+1.27,1.34,1.45,1.52,1.51,1.58,1.66,1.62,1.71,1.89,
+1.87,1.89,2.01,2.02,2.10,2.17,2.22,2.30,2.35,2.45,
+2.52,2.52,2.60,2.63,2.67,2.83,2.77,2.96,2.97,3.02,
+3.16,3.10,3.16,3.29,3.30,3.42,3.50,3.59,3.56,3.62,
+3.73,3.76,3.82,3.87,3.90,4.11,4.18,4.08,4.17,4.30,
+4.32,4.47,4.43,4.51,4.60,4.69,4.68,4.71,4.82,4.89,
+4.95,4.96,5.03,5.24,5.14,5.31,5.35,5.36,5.46,5.49,
+5.70,5.58,5.65,5.76,5.80,5.85,6.00,5.96,6.12,6.10,
+6.16,6.16,6.29,6.44,6.44,6.60,6.55,6.62,6.80,6.67,
+6.91,6.80,6.98,7.04,7.07,7.14,7.12,7.21,7.37,7.40,
+7.53,7.52,7.55,7.60,7.70,7.63,7.83,7.76,7.79,8.16,
+8.18,8.00,8.25,8.30,8.31,8.35,8.32,8.45,8.47,8.57,
+8.60,8.63,8.79,8.96,8.85,9.01,9.06,9.14,8.98,9.35,
+9.33,9.43,9.34,9.42,9.44,9.63,9.73,9.72,9.77,9.70,
+9.83,10.01,10.06,10.02,10.39,10.20,10.34,10.27,10.38,10.45,
+10.44,10.50,10.64,10.75,10.79,10.91,10.80,10.88,11.03,11.12,
+11.28,11.22,11.25,11.28,11.45,11.45,11.52,11.68,11.60,11.67,
+11.81,11.82,11.86,11.89,11.78,12.05,11.97,12.20,12.30,12.26,
+12.27,12.36,12.69,12.36,12.51,12.64,12.71,12.93,12.87,12.95,
+13.11,13.06,13.22,13.08,13.23,13.29,13.26,13.55,13.25,13.59,
+13.81,13.65,13.81,13.71,14.10,13.88,13.94,14.13,14.07,14.27,
+14.30,14.34,14.21,14.53,14.52,14.57,14.66,14.61,14.66,14.59,
+14.88,14.78,15.09,14.94,15.23,15.21,15.00,15.28,15.18,15.32,
+15.31,15.63,15.60,15.72,15.59,15.76,15.87,15.72,15.76,16.05,
+16.05,16.31,16.04,16.09,16.31,16.62,16.37,16.56,16.78,16.51,
+16.82,16.72,16.89,16.74,16.90,17.02,16.99,16.91,17.40,17.20,
+17.42,17.35,17.58,17.39,17.66,17.63,17.82,17.75,17.74,17.82,
+17.92,18.09,18.16,18.06,18.17,18.07,18.37,18.41,18.33,18.53,
+0.51,0.58,0.61,0.65,0.70,0.82,0.81,0.89,0.86,0.98,
+0.96,1.05,1.06,1.11,1.22,1.22,1.35,1.31,1.40,1.43,
+1.47,1.54,1.60,1.68,1.73,1.75,1.79,1.83,1.95,1.98,
+1.96,1.99,2.06,2.15,2.14,2.28,2.39,2.32,2.41,2.42,
+2.56,2.46,2.63,2.61,2.73,2.70,2.77,2.85,2.92,2.94,
+2.96,3.06,3.08,3.13,3.08,3.26,3.36,3.36,3.39,3.46,
+3.49,3.45,3.56,3.70,3.61,3.71,3.74,3.77,3.93,3.85,
+3.87,4.05,4.08,4.18,4.26,4.29,4.22,4.25,4.30,4.45,
+4.53,4.52,4.53,4.42,4.66,4.69,4.72,4.85,4.88,4.86,
+5.06,4.97,5.07,5.07,5.18,5.25,5.28,5.32,5.25,5.37,
+5.50,5.49,5.56,5.61,5.68,5.66,5.69,5.77,5.85,5.98,
+5.90,6.17,5.96,6.10,6.15,6.12,6.14,6.22,6.30,6.41,
+6.41,6.58,6.50,6.74,6.60,6.73,6.76,6.83,6.73,6.86,
+6.90,7.04,6.98,7.17,7.16,7.18,7.13,7.34,7.20,7.35,
+7.47,7.45,7.52,7.47,7.55,7.63,7.66,7.77,7.86,7.87,
+7.99,8.02,7.98,8.07,8.00,8.19,8.10,8.49,8.18,8.43,
+8.40,8.55,8.50,8.54,8.44,8.59,8.73,8.98,8.97,8.84,
+8.89,8.92,9.01,9.18,9.24,9.12,9.14,9.32,9.13,9.34,
+9.30,9.49,9.53,9.43,9.62,9.70,9.63,9.76,9.87,9.80,
+9.90,9.93,9.88,9.97,10.09,10.07,10.22,10.38,10.17,10.41,
+10.40,10.49,10.38,10.51,10.50,10.66,10.57,10.82,10.71,10.78,
+10.95,11.11,10.90,11.05,11.12,11.24,11.14,11.41,11.39,11.40,
+11.35,11.42,11.45,11.55,11.68,11.68,11.62,11.70,11.78,11.77,
+11.81,11.96,12.01,11.88,11.88,12.18,12.19,12.12,12.26,12.08,
+12.54,12.41,12.37,12.36,12.47,12.55,12.85,12.62,12.88,12.79,
+12.88,12.87,13.01,12.99,12.99,13.06,13.09,13.28,13.29,13.40,
+13.04,13.31,13.41,13.61,13.53,13.63,13.64,13.64,13.59,13.80,
+13.79,13.94,13.88,13.95,14.20,13.90,14.27,14.27,14.26,14.36,
+14.45,14.26,14.57,14.63,14.42,14.59,14.69,14.72,14.76,14.84,
+0.37,0.41,0.50,0.53,0.58,0.60,0.67,0.71,0.69,0.78,
+0.83,0.85,0.90,0.90,0.96,1.00,1.04,1.05,1.16,1.18,
+1.20,1.21,1.25,1.29,1.31,1.32,1.47,1.41,1.56,1.59,
+1.62,1.65,1.68,1.77,1.78,1.83,1.85,1.85,1.93,1.93,
+1.95,1.95,2.11,2.11,2.12,2.17,2.26,2.28,2.38,2.32,
+2.42,2.50,2.48,2.50,2.52,2.50,2.62,2.68,2.58,2.71,
+2.77,2.85,2.84,2.85,2.87,2.99,2.90,3.10,3.10,3.17,
+3.12,3.23,3.22,3.42,3.45,3.38,3.37,3.45,3.43,3.49,
+3.53,3.58,3.68,3.75,3.80,3.77,3.87,3.83,3.85,3.99,
+3.93,3.99,4.04,3.99,4.11,4.16,4.25,4.17,4.33,4.28,
+4.38,4.30,4.41,4.60,4.47,4.51,4.58,4.69,4.74,4.66,
+4.76,4.79,4.81,4.94,4.90,4.98,5.09,4.97,5.08,5.19,
+5.05,5.13,5.33,5.25,5.38,5.43,5.49,5.36,5.47,5.49,
+5.63,5.56,5.71,5.68,5.52,5.78,5.93,5.89,5.71,5.89,
+5.87,5.98,6.13,6.13,6.12,6.18,6.16,6.14,6.28,6.26,
+6.45,6.53,6.28,6.40,6.37,6.52,6.67,6.64,6.67,6.70,
+6.83,6.79,6.78,6.82,6.80,7.03,6.99,7.12,7.07,6.97,
+7.06,7.26,7.23,7.29,7.33,7.35,7.42,7.40,7.25,7.48,
+7.53,7.63,7.57,7.54,7.73,7.88,7.68,7.93,7.85,7.93,
+7.93,8.03,8.13,7.97,8.10,8.09,8.03,8.24,8.22,8.19,
+8.34,8.31,8.42,8.48,8.61,8.48,8.60,8.52,8.70,8.78,
+8.77,8.80,8.72,8.90,8.77,8.91,8.83,9.09,9.09,9.02,
+9.01,9.26,9.17,9.26,9.25,9.38,9.26,9.35,9.43,9.39,
+9.52,9.53,9.64,9.50,9.71,9.76,9.69,9.87,9.51,9.65,
+10.00,9.99,10.00,9.97,10.06,10.08,10.25,10.05,10.17,10.30,
+10.26,10.46,10.34,10.28,10.48,10.37,10.44,10.44,10.60,10.62,
+10.60,10.50,10.71,10.89,10.86,10.97,10.92,10.95,11.06,11.01,
+10.92,11.04,11.05,11.10,11.27,11.44,11.17,11.43,11.24,11.49,
+11.44,11.41,11.66,11.71,11.62,11.73,11.71,11.63,11.74,11.67,
+0.32,0.35,0.40,0.40,0.49,0.50,0.51,0.55,0.59,0.60,
+0.60,0.67,0.70,0.76,0.79,0.86,0.77,0.85,0.94,0.94,
+0.92,1.00,1.06,1.06,1.11,1.17,1.12,1.25,1.18,1.27,
+1.23,1.27,1.34,1.41,1.39,1.41,1.48,1.49,1.52,1.57,
+1.62,1.61,1.64,1.67,1.75,1.66,1.76,1.78,1.83,1.90,
+1.90,1.91,1.93,2.04,2.09,2.13,2.06,2.19,2.25,2.16,
+2.17,2.28,2.27,2.35,2.35,2.43,2.44,2.48,2.51,2.49,
+2.53,2.57,2.63,2.68,2.67,2.76,2.71,2.79,2.77,2.74,
+2.76,2.79,2.88,2.97,2.97,2.98,3.08,3.12,3.03,3.15,
+3.11,3.15,3.26,3.25,3.27,3.28,3.40,3.36,3.45,3.50,
+3.53,3.51,3.52,3.57,3.68,3.66,3.64,3.58,3.56,3.83,
+3.75,3.76,3.81,3.87,3.98,3.91,4.01,4.00,4.04,4.04,
+4.07,4.16,4.32,4.20,4.18,4.30,4.29,4.34,4.40,4.37,
+4.34,4.48,4.67,4.59,4.60,4.62,4.74,4.71,4.73,4.77,
+4.64,4.81,4.95,4.76,4.95,4.91,4.93,5.06,4.99,5.01,
+5.04,4.99,5.12,5.27,5.04,5.23,5.32,5.33,5.33,5.27,
+5.39,5.33,5.51,5.41,5.44,5.53,5.64,5.63,5.62,5.83,
+5.76,5.70,5.75,5.72,5.91,5.93,5.87,5.91,5.93,5.97,
+5.98,6.07,6.20,6.01,6.06,6.01,6.33,6.20,6.24,6.37,
+6.47,6.39,6.23,6.31,6.38,6.59,6.60,6.44,6.61,6.63,
+6.55,6.62,6.68,6.60,6.80,6.91,6.88,6.83,6.88,7.00,
+7.01,6.97,6.90,6.90,7.04,7.17,7.29,7.21,7.28,7.44,
+7.21,7.43,7.39,7.28,7.57,7.32,7.50,7.67,7.68,7.60,
+7.66,7.53,7.67,7.66,7.65,7.87,7.88,7.75,8.03,7.79,
+7.96,7.79,8.10,8.03,8.20,8.09,8.17,8.17,8.19,8.32,
+8.22,8.30,8.36,8.31,8.33,8.42,8.40,8.32,8.43,8.47,
+8.55,8.56,8.53,8.49,8.73,8.78,8.83,8.64,8.87,8.68,
+8.75,8.76,8.84,8.81,8.95,9.03,9.10,9.15,8.95,9.03,
+9.32,9.27,9.15,9.36,9.37,9.32,9.52,9.57,9.42,9.39,
+0.27,0.29,0.33,0.36,0.37,0.39,0.43,0.45,0.43,0.45,
+0.55,0.54,0.58,0.60,0.62,0.66,0.68,0.67,0.76,0.74,
+0.80,0.76,0.83,0.84,0.86,0.90,0.90,0.94,0.95,0.98,
+1.02,1.03,1.11,1.05,1.17,1.14,1.20,1.18,1.26,1.28,
+1.33,1.27,1.32,1.38,1.30,1.40,1.40,1.41,1.45,1.53,
+1.56,1.44,1.61,1.61,1.57,1.56,1.68,1.70,1.74,1.71,
+1.79,1.84,1.83,1.92,1.90,1.94,1.90,1.95,1.99,1.96,
+1.98,2.05,2.07,2.09,2.14,2.16,2.20,2.17,2.26,2.23,
+2.29,2.37,2.33,2.35,2.42,2.35,2.43,2.42,2.53,2.61,
+2.55,2.61,2.57,2.56,2.70,2.73,2.73,2.71,2.81,2.76,
+2.77,2.84,2.75,2.87,2.90,2.89,2.97,2.97,2.90,3.10,
+3.01,3.08,3.10,3.05,3.16,3.18,3.28,3.21,3.20,3.32,
+3.29,3.35,3.37,3.47,3.34,3.35,3.46,3.43,3.56,3.48,
+3.57,3.54,3.56,3.54,3.64,3.56,3.72,3.75,3.77,3.79,
+3.76,3.84,3.82,3.79,3.90,4.00,3.99,3.83,3.93,4.07,
+4.09,4.06,4.17,4.21,4.23,4.21,4.24,4.27,4.26,4.18,
+4.27,4.33,4.23,4.30,4.44,4.46,4.50,4.45,4.51,4.52,
+4.46,4.57,4.59,4.54,4.69,4.62,4.71,4.74,4.87,4.81,
+4.75,4.86,4.81,4.96,4.88,4.95,5.06,4.98,5.03,5.00,
+4.99,5.03,5.05,5.16,5.19,5.21,5.23,5.31,5.18,5.24,
+5.17,5.24,5.36,5.29,5.44,5.36,5.47,5.53,5.51,5.47,
+5.71,5.53,5.64,5.64,5.58,5.74,5.82,5.63,5.70,5.84,
+5.79,5.88,5.92,5.94,5.94,6.03,5.97,6.04,6.00,6.09,
+6.14,6.23,6.08,6.02,6.16,6.18,6.12,6.25,6.29,6.36,
+6.30,6.41,6.38,6.38,6.46,6.42,6.59,6.47,6.80,6.68,
+6.55,6.58,6.66,6.80,6.69,6.74,6.71,6.81,6.78,6.87,
+7.00,6.76,7.03,7.02,6.99,7.01,6.90,7.00,7.14,7.05,
+7.01,7.17,7.06,7.17,7.06,7.24,7.38,7.21,7.21,7.22,
+7.34,7.50,7.34,7.46,7.45,7.53,7.61,7.40,7.72,7.42,
+0.19,0.26,0.24,0.25,0.30,0.31,0.33,0.35,0.40,0.37,
+0.40,0.45,0.47,0.49,0.52,0.54,0.52,0.57,0.59,0.61,
+0.64,0.60,0.66,0.66,0.67,0.73,0.74,0.72,0.79,0.79,
+0.83,0.85,0.86,0.89,0.89,0.94,0.99,0.95,0.95,1.03,
+1.02,1.02,1.07,1.06,1.10,1.12,1.17,1.14,1.13,1.16,
+1.24,1.23,1.29,1.31,1.32,1.31,1.37,1.35,1.36,1.38,
+1.43,1.46,1.45,1.48,1.49,1.53,1.58,1.57,1.56,1.59,
+1.68,1.62,1.65,1.66,1.78,1.75,1.88,1.75,1.78,1.79,
+1.81,1.91,1.92,1.89,1.91,1.96,1.88,1.99,2.00,2.02,
+1.99,2.03,1.98,2.10,2.10,2.15,2.12,2.18,2.27,2.15,
+2.27,2.24,2.28,2.29,2.32,2.35,2.38,2.30,2.45,2.40,
+2.44,2.54,2.48,2.55,2.49,2.49,2.53,2.53,2.56,2.68,
+2.64,2.65,2.67,2.71,2.64,2.74,2.77,2.91,2.77,2.81,
+2.82,2.92,2.80,2.73,2.91,2.90,2.99,2.98,2.92,3.07,
+3.02,3.04,3.09,3.11,3.17,3.10,3.20,3.21,3.21,3.20,
+3.22,3.27,3.26,3.30,3.29,3.43,3.42,3.46,3.47,3.52,
+3.45,3.38,3.53,3.44,3.58,3.51,3.69,3.54,3.64,3.62,
+3.58,3.58,3.73,3.76,3.81,3.78,3.78,3.81,3.73,3.75,
+3.85,3.92,3.97,4.00,3.96,4.11,3.97,3.99,4.00,3.94,
+4.00,4.11,4.10,4.11,4.10,4.05,4.21,4.18,4.20,4.22,
+4.21,4.27,4.31,4.24,4.38,4.46,4.28,4.34,4.42,4.32,
+4.47,4.45,4.54,4.51,4.45,4.51,4.49,4.57,4.56,4.68,
+4.75,4.74,4.69,4.75,4.77,4.78,4.83,4.69,4.80,4.91,
+4.89,4.91,4.96,4.92,4.94,4.96,4.90,5.07,5.15,4.98,
+5.16,5.02,5.17,5.12,5.13,5.28,5.18,5.22,5.32,5.23,
+5.30,5.30,5.19,5.25,5.28,5.31,5.39,5.50,5.49,5.43,
+5.51,5.50,5.54,5.53,5.59,5.59,5.60,5.61,5.67,5.71,
+5.62,5.55,5.65,5.85,5.69,5.71,5.77,5.80,5.86,5.80,
+5.90,5.90,6.02,6.01,6.00,5.84,6.10,6.03,6.12,6.01,
+0.18,0.17,0.17,0.23,0.24,0.27,0.28,0.29,0.29,0.34,
+0.34,0.33,0.37,0.37,0.39,0.39,0.41,0.43,0.49,0.51,
+0.49,0.46,0.54,0.54,0.54,0.55,0.59,0.61,0.62,0.68,
+0.66,0.71,0.69,0.70,0.74,0.77,0.72,0.78,0.77,0.81,
+0.84,0.83,0.85,0.85,0.83,0.87,0.93,0.90,0.94,0.93,
+0.96,1.03,0.98,1.02,1.08,1.05,1.12,1.15,1.13,1.11,
+1.13,1.17,1.17,1.18,1.23,1.20,1.22,1.24,1.23,1.25,
+1.24,1.32,1.33,1.30,1.35,1.41,1.43,1.38,1.44,1.47,
+1.47,1.46,1.44,1.48,1.53,1.56,1.51,1.57,1.57,1.56,
+1.65,1.67,1.61,1.70,1.74,1.73,1.71,1.72,1.73,1.71,
+1.90,1.76,1.82,1.83,1.89,1.80,1.87,1.91,1.79,1.93,
+2.00,1.93,2.04,1.97,2.09,2.09,2.10,2.10,2.07,2.12,
+2.14,2.15,2.13,2.20,2.18,2.23,2.27,2.16,2.33,2.29,
+2.27,2.33,2.29,2.26,2.37,2.35,2.35,2.36,2.40,2.48,
+2.40,2.47,2.54,2.47,2.50,2.58,2.52,2.50,2.52,2.54,
+2.58,2.60,2.55,2.74,2.70,2.71,2.69,2.76,2.69,2.79,
+2.74,2.86,2.74,2.83,2.73,2.81,2.83,2.89,2.92,2.98,
+2.98,3.00,3.04,2.95,3.11,3.01,3.01,2.91,3.10,3.07,
+3.14,3.13,3.18,3.13,3.15,3.28,3.15,3.25,3.23,3.20,
+3.29,3.20,3.31,3.23,3.43,3.38,3.38,3.42,3.36,3.34,
+3.32,3.43,3.45,3.52,3.40,3.52,3.44,3.52,3.50,3.52,
+3.54,3.47,3.60,3.46,3.63,3.71,3.64,3.71,3.58,3.74,
+3.62,3.80,3.63,3.86,3.77,3.83,3.86,4.00,3.93,3.90,
+3.82,3.92,3.95,3.95,3.85,3.94,3.85,4.02,3.94,4.01,
+4.15,4.13,4.10,4.13,4.14,4.13,4.15,4.16,4.11,4.19,
+4.20,4.35,4.35,4.33,4.33,4.36,4.33,4.34,4.34,4.41,
+4.26,4.46,4.38,4.41,4.30,4.55,4.36,4.62,4.54,4.45,
+4.57,4.54,4.62,4.50,4.63,4.65,4.49,4.62,4.65,4.78,
+4.69,4.67,4.63,4.74,4.73,4.75,4.79,4.78,4.95,4.73,
+0.13,0.14,0.19,0.17,0.18,0.21,0.22,0.21,0.25,0.25,
+0.26,0.25,0.28,0.31,0.32,0.33,0.38,0.34,0.34,0.36,
+0.41,0.42,0.40,0.47,0.46,0.46,0.54,0.50,0.54,0.51,
+0.51,0.56,0.52,0.61,0.59,0.60,0.59,0.65,0.64,0.67,
+0.61,0.64,0.71,0.66,0.67,0.69,0.72,0.70,0.77,0.77,
+0.75,0.86,0.77,0.81,0.79,0.84,0.82,0.88,0.90,0.89,
+0.88,0.92,0.95,0.94,1.00,1.01,0.99,0.96,1.06,1.04,
+1.08,1.05,1.06,1.13,1.11,1.17,1.12,1.13,1.13,1.13,
+1.16,1.19,1.17,1.19,1.17,1.26,1.24,1.23,1.31,1.34,
+1.30,1.29,1.32,1.35,1.35,1.41,1.38,1.47,1.41,1.44,
+1.42,1.43,1.45,1.52,1.52,1.54,1.57,1.56,1.50,1.54,
+1.59,1.54,1.54,1.69,1.57,1.72,1.60,1.69,1.69,1.68,
+1.67,1.70,1.74,1.76,1.71,1.77,1.78,1.75,1.77,1.85,
+1.81,1.87,1.85,1.87,1.89,1.87,1.88,1.92,1.96,1.90,
+1.93,1.97,1.96,1.96,2.01,1.99,2.05,2.04,2.08,2.14,
+2.01,2.08,2.07,2.10,2.08,2.15,2.17,2.12,2.12,2.20,
+2.17,2.21,2.26,2.28,2.37,2.17,2.28,2.29,2.34,2.29,
+2.37,2.43,2.43,2.37,2.46,2.47,2.39,2.39,2.38,2.50,
+2.50,2.47,2.48,2.53,2.54,2.48,2.54,2.58,2.58,2.53,
+2.62,2.54,2.61,2.72,2.58,2.66,2.60,2.55,2.79,2.73,
+2.64,2.78,2.73,2.69,2.75,2.81,2.87,2.88,2.80,2.80,
+2.84,2.88,2.88,2.86,3.01,2.96,2.89,3.04,3.03,3.03,
+2.92,2.86,2.94,3.12,3.11,3.09,3.02,3.15,3.16,3.12,
+3.09,3.18,3.15,3.17,3.15,3.11,3.16,3.21,3.18,3.20,
+3.19,3.15,3.24,3.29,3.44,3.28,3.27,3.33,3.34,3.33,
+3.38,3.41,3.40,3.38,3.42,3.46,3.47,3.54,3.46,3.61,
+3.51,3.44,3.60,3.67,3.56,3.45,3.57,3.58,3.56,3.63,
+3.60,3.53,3.67,3.65,3.70,3.68,3.79,3.77,3.82,3.82,
+3.84,3.83,3.79,3.91,3.77,3.82,3.86,3.77,3.79,3.96,
+0.10,0.14,0.14,0.15,0.15,0.16,0.19,0.19,0.16,0.23,
+0.21,0.21,0.23,0.23,0.23,0.26,0.27,0.25,0.30,0.31,
+0.32,0.30,0.31,0.34,0.36,0.39,0.38,0.38,0.40,0.41,
+0.41,0.42,0.45,0.47,0.42,0.49,0.49,0.47,0.51,0.49,
+0.48,0.52,0.56,0.60,0.61,0.56,0.65,0.62,0.61,0.62,
+0.66,0.67,0.68,0.66,0.61,0.67,0.72,0.71,0.72,0.73,
+0.74,0.76,0.75,0.79,0.76,0.76,0.77,0.84,0.84,0.81,
+0.79,0.89,0.83,0.83,0.91,0.90,0.90,0.91,0.89,0.96,
+0.90,0.99,0.97,0.95,0.96,1.00,0.98,1.03,1.07,1.03,
+1.02,0.98,1.06,1.05,1.14,1.11,1.11,1.12,1.12,1.17,
+1.13,1.18,1.15,1.13,1.13,1.24,1.21,1.20,1.22,1.28,
+1.25,1.25,1.29,1.31,1.28,1.34,1.35,1.35,1.30,1.32,
+1.29,1.30,1.39,1.32,1.35,1.43,1.50,1.43,1.39,1.49,
+1.50,1.48,1.46,1.48,1.51,1.54,1.50,1.49,1.58,1.54,
+1.53,1.60,1.61,1.65,1.57,1.54,1.62,1.56,1.63,1.66,
+1.65,1.73,1.73,1.72,1.71,1.70,1.68,1.77,1.70,1.77,
+1.76,1.78,1.74,1.81,1.77,1.79,1.81,1.83,1.84,1.85,
+1.89,1.83,1.85,1.78,1.95,1.84,1.92,1.91,1.93,1.94,
+1.98,2.00,1.96,2.00,2.03,2.04,2.00,2.09,2.04,2.08,
+2.04,2.10,2.12,2.10,2.13,2.15,2.23,2.09,2.20,2.22,
+2.16,2.09,2.27,2.22,2.17,2.28,2.33,2.25,2.25,2.25,
+2.29,2.31,2.28,2.36,2.30,2.33,2.37,2.41,2.37,2.40,
+2.46,2.45,2.45,2.40,2.46,2.34,2.43,2.44,2.42,2.44,
+2.44,2.56,2.47,2.52,2.50,2.50,2.53,2.51,2.58,2.54,
+2.56,2.53,2.62,2.61,2.58,2.64,2.66,2.83,2.75,2.65,
+2.67,2.77,2.75,2.79,2.67,2.71,2.83,2.73,2.84,2.82,
+2.74,2.79,2.79,2.85,2.83,2.81,2.90,2.90,2.90,2.91,
+2.99,2.93,2.89,2.88,2.94,2.96,2.93,2.92,2.96,2.95,
+3.01,3.12,3.03,3.01,3.06,3.02,3.13,3.11,3.20,3.12,
+2.70,2.92,3.10,3.40,3.62,4.00,4.24,4.42,4.68,4.95,
+5.17,5.45,5.64,5.98,6.19,6.40,6.71,7.05,7.22,7.53,
+7.69,8.00,8.37,8.60,8.73,9.02,9.29,9.46,9.85,10.01,
+10.34,10.57,10.68,11.07,11.16,11.72,11.73,11.99,12.24,12.48,
+12.88,13.08,13.39,13.59,13.88,14.06,14.34,14.48,14.72,15.19,
+15.32,15.44,15.85,16.19,16.31,16.72,16.84,17.19,17.33,17.61,
+17.93,18.10,18.45,18.73,18.81,19.15,19.67,19.59,19.91,20.24,
+20.30,20.73,20.79,21.25,21.20,21.84,22.05,22.09,22.53,22.79,
+22.93,23.27,23.63,23.57,23.95,24.31,24.62,24.72,24.93,25.12,
+25.58,25.63,26.02,26.23,26.39,26.81,26.90,27.10,27.72,27.64,
+28.07,28.30,28.49,28.88,29.25,29.41,29.35,30.00,30.27,30.39,
+30.59,30.86,31.06,31.37,31.66,31.87,32.14,32.27,32.73,32.80,
+33.12,33.34,33.38,33.80,34.36,34.33,34.43,35.02,35.07,35.54,
+35.56,35.94,36.26,36.63,36.89,37.02,37.05,37.41,37.65,37.81,
+38.54,38.61,38.71,38.93,39.11,39.60,39.59,39.82,40.34,40.35,
+40.64,40.89,41.21,41.63,41.73,42.12,42.18,42.56,42.87,43.20,
+43.38,43.26,43.64,43.76,44.30,44.68,44.64,45.20,45.44,45.34,
+45.73,46.14,46.59,46.79,47.06,47.21,47.06,47.34,47.87,48.32,
+48.13,48.51,48.99,49.16,49.12,49.62,49.87,50.26,50.41,50.87,
+50.95,51.00,51.43,51.85,52.00,52.12,52.28,52.80,52.83,53.35,
+53.34,53.61,54.18,54.14,54.19,54.73,54.85,55.32,55.56,55.70,
+55.87,55.99,56.45,57.20,56.98,57.53,57.46,57.59,58.19,58.31,
+58.83,58.71,59.08,59.12,59.69,59.89,60.01,60.42,60.46,60.90,
+61.02,61.27,62.00,61.69,62.23,62.35,62.49,62.61,63.14,63.06,
+63.80,64.10,64.38,64.44,64.55,65.08,65.29,65.60,65.60,65.93,
+66.31,66.38,66.58,66.88,67.16,67.11,67.84,67.90,68.17,68.55,
+68.31,68.95,68.95,69.21,69.53,69.66,70.56,70.53,70.56,71.07,
+71.42,71.34,71.70,71.96,72.00,72.10,72.76,72.96,73.11,73.44,
+73.82,74.47,74.41,74.63,74.66,75.20,75.08,75.39,75.81,75.85,
+2.11,2.38,2.54,2.76,3.00,3.15,3.39,3.56,3.84,3.94,
+4.25,4.38,4.61,4.76,5.07,5.27,5.39,5.70,5.84,6.01,
+6.19,6.51,6.63,6.94,7.02,7.26,7.54,7.61,8.00,8.12,
+8.52,8.44,8.73,8.93,9.04,9.23,9.61,9.74,10.00,10.07,
+10.38,10.58,10.80,10.87,11.27,11.34,11.69,11.64,11.93,12.08,
+12.44,12.64,12.90,13.00,13.34,13.37,13.64,13.98,14.00,14.44,
+14.66,14.83,14.95,15.07,15.33,15.51,15.72,15.91,16.01,16.37,
+16.36,16.76,16.87,17.15,17.42,17.69,17.79,18.00,18.16,18.52,
+18.53,18.81,19.01,19.05,19.39,19.68,19.99,20.02,20.01,20.45,
+20.61,20.91,21.15,21.31,21.49,21.76,22.03,22.07,22.29,22.41,
+22.80,22.86,23.02,23.28,23.66,23.85,23.94,24.16,24.33,24.58,
+24.75,24.91,25.20,25.53,25.44,25.72,26.21,26.28,26.28,26.68,
+26.75,27.11,27.46,27.38,27.62,27.96,28.21,28.24,28.54,28.47,
+28.77,29.18,29.42,29.72,29.63,29.95,30.08,30.49,30.59,30.76,
+30.83,31.31,31.11,31.49,32.07,32.18,32.21,32.49,32.47,32.94,
+33.05,32.99,33.31,33.63,33.93,34.01,34.16,34.58,34.72,34.83,
+35.13,35.57,35.61,35.66,35.87,36.13,36.32,36.41,36.79,37.11,
+36.97,37.54,37.77,37.52,38.01,38.16,38.10,38.48,38.88,39.00,
+39.32,39.45,39.79,39.72,39.86,40.42,40.63,40.51,41.00,40.79,
+41.02,41.42,41.66,41.76,42.30,42.47,42.48,42.86,42.91,43.13,
+43.47,43.61,43.79,43.97,43.86,44.12,44.86,44.70,44.82,45.25,
+45.26,45.38,45.62,45.61,46.12,46.28,46.66,46.46,47.07,47.11,
+47.57,47.32,47.80,48.23,48.34,48.16,48.34,48.77,49.18,49.35,
+49.25,49.63,49.86,49.86,49.92,50.18,50.67,50.65,51.53,51.70,
+51.71,51.65,51.82,52.05,52.34,52.34,52.41,52.76,52.99,53.34,
+53.40,53.79,54.04,54.33,54.30,54.54,55.01,54.97,55.28,55.48,
+55.64,55.68,56.24,56.18,56.72,56.91,56.96,56.87,57.33,57.56,
+57.54,57.75,58.07,58.55,58.37,59.04,59.10,58.99,59.38,59.51,
+59.94,59.88,60.07,60.55,60.26,60.88,61.20,61.34,61.58,61.72,
+1.74,1.92,2.09,2.25,2.40,2.58,2.79,2.89,3.05,3.28,
+3.37,3.54,3.68,3.93,4.14,4.16,4.38,4.50,4.68,4.87,
+5.03,5.25,5.40,5.47,5.87,5.82,6.21,6.23,6.49,6.56,
+6.78,6.86,7.11,7.31,7.29,7.52,7.76,7.85,8.14,8.23,
+8.31,8.46,8.64,8.78,9.08,9.17,9.39,9.62,9.82,9.88,
+10.14,10.15,10.45,10.65,10.89,10.97,11.19,11.16,11.30,11.62,
+11.88,11.96,11.91,12.25,12.37,12.72,12.87,12.83,13.05,13.20,
+13.35,13.62,13.77,13.94,13.91,14.25,14.21,14.38,14.67,14.96,
+15.18,15.11,15.64,15.35,15.72,15.94,16.07,16.06,16.35,16.41,
+16.94,16.79,17.21,17.34,17.39,17.42,17.80,17.77,18.07,18.25,
+18.42,18.32,18.63,18.89,19.13,19.27,19.41,19.57,19.91,19.96,
+19.82,20.25,20.37,20.72,20.77,20.75,21.04,21.25,21.54,21.49,
+21.43,21.98,22.06,22.45,22.47,22.62,22.57,22.92,23.02,23.28,
+23.40,23.39,23.61,23.96,23.95,24.32,24.16,24.26,24.86,25.13,
+25.31,24.98,25.26,25.54,25.71,25.74,26.09,26.29,26.39,26.64,
+26.97,27.06,27.05,27.31,27.45,27.64,27.46,27.97,28.03,28.20,
+28.51,28.47,28.89,28.79,29.23,29.00,29.45,29.44,29.57,29.77,
+30.23,30.31,30.50,30.63,30.88,30.72,31.06,31.21,31.56,31.63,
+31.77,31.73,32.06,32.31,32.08,32.49,32.83,33.16,33.03,33.29,
+33.35,33.87,33.93,33.98,33.89,34.25,34.38,34.44,34.64,35.15,
+35.08,35.24,35.47,35.62,35.55,35.83,35.99,36.26,36.53,36.55,
+36.73,36.85,37.02,37.10,37.37,37.51,37.90,37.44,38.18,38.41,
+38.34,38.42,38.92,38.59,39.21,39.31,39.10,39.53,39.59,39.75,
+40.19,40.30,40.07,40.08,40.93,40.67,41.11,41.07,41.76,41.80,
+41.86,41.67,42.18,42.20,42.32,42.62,42.52,43.16,43.00,43.02,
+43.31,43.47,43.72,44.06,44.30,44.16,44.41,44.49,44.55,44.81,
+45.20,44.86,45.58,45.61,45.90,45.97,46.18,46.37,46.38,46.61,
+46.79,46.80,47.11,47.29,47.44,47.63,47.82,48.05,47.94,48.12,
+48.48,48.74,48.78,49.34,49.18,49.53,49.39,49.75,49.57,50.08,
+1.43,1.55,1.72,1.89,1.95,2.14,2.23,2.40,2.49,2.58,
+2.73,2.95,3.09,3.26,3.38,3.37,3.48,3.61,3.77,3.96,
+4.10,4.27,4.42,4.49,4.77,4.73,4.94,5.05,5.19,5.35,
+5.50,5.57,5.76,5.86,5.98,6.19,6.31,6.39,6.49,6.66,
+6.78,6.89,7.01,7.10,7.30,7.47,7.64,7.63,7.88,8.02,
+8.18,8.29,8.46,8.70,8.70,8.93,8.82,9.20,9.21,9.29,
+9.52,9.65,9.74,10.05,10.09,10.34,10.36,10.38,10.58,10.79,
+10.91,11.01,11.14,11.38,11.35,11.55,11.67,11.68,11.82,11.98,
+12.27,12.42,12.52,12.69,12.69,12.88,13.05,13.08,13.29,13.29,
+13.43,13.77,13.93,13.88,14.03,14.33,14.39,14.49,14.63,14.73,
+14.90,15.22,15.40,15.30,15.31,15.55,15.69,15.79,15.74,16.21,
+16.28,16.36,16.59,16.59,16.61,16.96,17.18,17.09,17.33,17.33,
+17.45,17.82,18.00,18.12,18.04,18.37,18.52,18.50,18.59,18.88,
+18.71,18.98,19.23,19.45,19.60,19.57,19.66,19.79,20.30,20.08,
+20.25,20.41,20.52,20.71,20.47,20.90,21.19,21.23,21.61,21.59,
+21.72,21.47,21.93,22.24,22.11,22.22,22.52,22.57,22.73,22.84,
+23.18,23.39,23.21,23.47,23.68,23.82,23.82,24.00,24.21,24.38,
+24.19,24.55,24.89,24.75,24.75,25.04,25.35,25.35,25.41,25.69,
+25.67,25.91,25.95,26.23,26.17,26.33,26.56,26.69,26.68,26.89,
+26.87,27.20,27.49,27.27,27.44,27.66,28.06,27.73,28.20,28.35,
+28.57,28.47,28.71,28.80,28.93,29.04,29.23,29.45,29.51,29.53,
+29.75,29.71,30.05,29.98,30.46,30.45,30.67,30.72,30.49,30.78,
+31.13,31.52,31.66,31.61,31.86,31.82,32.20,32.29,32.19,32.62,
+32.47,32.59,32.92,32.99,32.82,33.03,33.42,33.22,33.51,33.39,
+33.94,34.15,34.23,34.06,34.40,34.34,34.62,35.21,34.89,34.86,
+35.11,35.31,35.19,35.40,35.86,35.64,35.83,36.14,36.14,36.36,
+36.59,36.67,36.92,36.89,36.79,37.17,37.02,37.11,37.35,37.71,
+37.68,37.72,38.23,38.38,38.26,38.48,38.73,38.99,38.85,39.16,
+38.88,39.58,39.74,39.51,39.65,39.95,40.20,40.07,39.98,40.50,
+1.07,1.32,1.39,1.46,1.54,1.70,1.78,1.85,1.97,2.11,
+2.17,2.37,2.44,2.61,2.69,2.76,2.87,3.01,3.04,3.14,
+3.31,3.38,3.55,3.72,3.77,3.81,3.98,4.02,4.13,4.34,
+4.40,4.46,4.62,4.78,4.86,5.02,5.18,5.10,5.39,5.38,
+5.52,5.62,5.68,5.87,5.94,5.93,6.12,6.36,6.40,6.46,
+6.69,6.79,6.78,6.96,7.07,7.23,7.28,7.31,7.44,7.64,
+7.60,7.83,7.89,8.04,8.15,8.31,8.42,8.61,8.61,8.71,
+8.76,9.02,8.97,9.12,9.36,9.43,9.37,9.61,9.61,9.75,
+9.85,10.10,10.21,10.15,10.40,10.39,10.60,10.76,10.70,10.88,
+11.00,11.07,11.17,11.36,11.46,11.91,11.65,11.87,11.79,12.00,
+12.24,12.17,12.26,12.27,12.56,12.69,12.73,12.85,13.12,13.02,
+13.08,13.38,13.53,13.59,13.51,13.53,13.93,14.00,14.11,14.14,
+14.36,14.45,14.54,14.70,14.71,14.91,15.06,14.90,15.07,15.30,
+15.34,15.40,15.60,15.44,15.74,15.92,15.93,15.90,16.18,16.37,
+16.50,16.44,16.51,16.58,16.85,17.14,17.09,17.34,17.18,17.48,
+17.40,17.65,17.66,17.77,17.96,17.91,18.25,18.36,18.18,18.64,
+18.57,18.62,19.22,18.94,18.99,19.08,19.45,19.33,19.61,19.64,
+19.73,20.03,20.06,20.16,20.21,20.25,20.23,20.48,20.43,20.92,
+20.90,20.78,20.87,21.33,21.22,21.23,21.32,21.46,21.79,21.72,
+21.89,22.07,21.84,22.28,22.53,22.52,22.65,22.50,22.85,22.98,
+22.85,23.12,23.14,23.27,23.22,23.63,23.75,23.58,23.84,23.93,
+24.09,24.30,24.37,24.51,24.32,24.65,24.82,24.80,25.07,24.88,
+25.20,25.15,25.50,25.73,25.43,25.77,25.85,25.83,26.06,26.18,
+25.99,26.18,26.63,26.63,26.81,26.95,26.79,26.97,27.15,27.30,
+27.37,27.59,27.70,27.91,28.02,28.04,28.13,28.14,28.10,28.33,
+28.48,28.73,28.86,28.98,28.91,29.07,29.07,29.34,29.22,29.57,
+29.55,29.73,29.87,29.98,30.33,30.01,30.35,30.44,30.50,30.58,
+30.53,30.85,30.84,31.21,31.16,31.18,31.00,31.43,31.34,31.82,
+31.84,31.88,31.92,32.14,32.25,32.47,32.51,32.55,32.74,32.71,
+0.90,1.03,1.08,1.15,1.30,1.38,1.45,1.55,1.58,1.70,
+1.75,1.97,2.01,2.11,2.15,2.28,2.36,2.40,2.48,2.65,
+2.68,2.80,2.88,2.95,3.08,3.19,3.26,3.27,3.39,3.44,
+3.57,3.65,3.80,3.92,3.93,4.01,4.09,4.36,4.29,4.33,
+4.45,4.53,4.60,4.75,4.84,4.84,5.01,5.05,5.17,5.25,
+5.26,5.48,5.50,5.73,5.73,5.80,5.94,5.94,6.07,6.26,
+6.08,6.25,6.42,6.49,6.55,6.68,6.70,6.89,6.96,7.17,
+7.03,7.22,7.33,7.41,7.50,7.41,7.54,7.72,7.83,7.88,
+8.07,8.01,8.31,8.46,8.22,8.55,8.39,8.66,8.74,8.90,
+8.88,8.97,9.21,9.16,9.26,9.28,9.36,9.55,9.55,9.57,
+9.74,9.88,10.01,10.01,10.18,10.06,10.36,10.43,10.34,10.47,
+10.60,10.64,10.83,11.04,10.95,11.07,11.18,11.26,11.31,11.60,
+11.51,11.66,11.57,11.90,11.87,11.91,12.08,12.18,12.14,12.43,
+12.48,12.57,12.52,12.72,12.88,12.89,12.80,13.22,13.20,13.40,
+13.33,13.49,13.65,13.57,13.65,13.77,13.74,14.00,14.04,14.35,
+14.08,14.38,14.40,14.48,14.62,14.64,14.75,14.88,14.96,15.06,
+15.14,15.16,15.09,15.28,15.42,15.47,15.77,15.79,15.79,15.76,
+15.87,15.95,16.17,16.27,16.18,16.41,16.49,16.57,16.78,16.72,
+16.83,17.09,17.15,17.02,17.32,17.34,17.41,17.41,17.64,17.84,
+17.71,17.90,18.02,18.01,18.10,17.95,18.27,18.31,18.62,18.80,
+18.75,18.69,18.86,18.90,19.01,18.94,19.33,19.19,19.36,19.30,
+19.64,19.45,19.58,19.83,19.87,19.86,20.01,20.17,20.23,20.09,
+20.32,20.46,20.67,20.71,20.70,20.83,21.15,20.90,21.12,21.18,
+21.09,21.60,21.36,21.44,21.42,21.76,21.83,21.66,22.04,22.10,
+22.52,22.07,22.39,22.35,22.71,22.50,22.81,22.73,22.95,23.03,
+23.15,23.04,23.18,23.29,23.47,23.49,23.65,23.52,23.83,23.83,
+23.77,23.82,24.16,24.24,24.05,24.52,24.26,24.78,24.57,24.80,
+24.90,24.84,24.97,25.05,25.24,25.11,25.39,25.25,25.68,25.47,
+25.62,25.57,25.85,26.07,26.04,26.42,26.23,26.26,26.50,26.60,
+0.76,0.85,0.86,0.98,0.99,1.12,1.20,1.26,1.28,1.40,
+1.53,1.56,1.55,1.75,1.78,1.76,1.96,1.95,1.98,2.09,
+2.15,2.21,2.33,2.44,2.50,2.57,2.66,2.69,2.80,2.88,
+2.90,3.08,3.06,3.10,3.20,3.22,3.42,3.40,3.55,3.58,
+3.57,3.74,3.74,3.81,3.84,4.01,4.00,4.12,4.23,4.28,
+4.31,4.45,4.48,4.51,4.56,4.77,4.75,4.93,4.97,5.02,
+5.09,5.20,5.13,5.36,5.25,5.43,5.52,5.53,5.55,5.63,
+5.79,5.78,5.84,6.00,6.00,6.08,6.29,6.27,6.32,6.37,
+6.45,6.59,6.70,6.75,6.77,6.77,6.82,7.05,6.95,7.12,
+7.00,7.23,7.28,7.35,7.42,7.53,7.72,7.75,7.81,7.83,
+7.95,8.04,7.94,8.00,8.16,8.23,8.35,8.43,8.52,8.67,
+8.70,8.69,8.86,9.00,8.90,8.97,9.06,9.10,9.22,9.29,
+9.18,9.33,9.56,9.69,9.72,9.64,9.70,9.84,9.96,9.93,
+10.15,10.28,10.16,10.21,10.22,10.36,10.49,10.59,10.81,10.59,
+10.80,11.06,10.96,10.98,11.01,11.17,11.27,11.22,11.32,11.40,
+11.59,11.56,11.68,11.77,11.67,11.94,12.11,11.85,11.99,12.21,
+12.34,12.18,12.29,12.51,12.63,12.80,12.82,12.91,12.59,12.96,
+13.00,12.91,13.12,13.27,13.27,13.13,13.29,13.33,13.50,13.44,
+13.52,13.92,13.68,14.03,14.02,14.01,14.23,14.06,14.28,14.27,
+14.40,14.34,14.33,14.59,14.78,14.86,14.95,14.82,14.97,15.06,
+14.97,14.92,15.21,15.24,15.18,15.41,15.53,15.56,15.79,15.56,
+15.96,15.76,15.97,15.88,16.25,16.07,16.30,16.35,16.56,16.50,
+16.50,16.69,16.45,16.61,16.74,16.83,16.84,17.25,17.18,17.13,
+17.12,17.35,17.43,17.28,17.65,17.77,17.93,17.57,17.73,18.00,
+18.16,18.06,18.16,18.25,18.18,18.08,18.31,18.48,18.48,18.61,
+18.67,18.91,18.73,18.62,19.02,18.83,19.29,19.11,19.20,19.34,
+19.45,19.57,19.70,19.48,19.62,19.95,19.80,19.92,20.08,20.16,
+19.96,19.92,20.15,20.39,20.37,20.42,20.62,20.45,20.72,20.78,
+20.84,21.01,21.06,20.92,21.11,21.24,21.36,21.42,21.50,21.43,
+0.61,0.65,0.70,0.76,0.81,0.90,0.95,0.99,1.11,1.15,
+1.21,1.27,1.33,1.40,1.44,1.47,1.56,1.56,1.60,1.65,
+1.80,1.87,1.89,1.90,2.00,2.06,2.15,2.16,2.25,2.29,
+2.31,2.40,2.46,2.38,2.64,2.67,2.69,2.79,2.88,2.82,
+2.95,3.00,3.02,3.16,3.23,3.24,3.30,3.39,3.34,3.44,
+3.52,3.51,3.58,3.74,3.73,3.81,3.90,3.93,4.02,4.07,
+4.08,4.15,4.21,4.32,4.32,4.38,4.47,4.41,4.59,4.73,
+4.74,4.71,4.84,4.85,4.84,4.96,5.04,5.01,4.98,5.21,
+5.17,5.36,5.43,5.42,5.45,5.42,5.73,5.73,5.69,5.78,
+5.86,5.83,6.00,6.05,6.05,6.09,6.32,6.28,6.35,6.33,
+6.36,6.35,6.66,6.58,6.65,6.72,6.85,6.79,6.98,6.97,
+6.99,7.03,7.13,7.11,7.18,7.29,7.39,7.32,7.60,7.59,
+7.51,7.62,7.59,7.67,7.87,7.81,7.94,8.04,8.21,7.99,
+8.15,8.20,8.44,8.59,8.35,8.63,8.54,8.61,8.74,8.75,
+8.65,8.91,9.01,8.98,8.92,9.05,9.05,9.08,9.07,9.22,
+9.29,9.37,9.35,9.37,9.46,9.63,9.70,9.65,9.75,9.85,
+9.94,10.08,9.96,10.02,10.15,10.25,10.24,10.28,10.44,10.38,
+10.53,10.50,10.57,10.83,10.71,10.89,11.04,10.90,10.99,11.02,
+11.15,11.29,11.22,11.05,11.19,11.28,11.31,11.59,11.65,11.60,
+11.75,11.66,11.71,11.84,11.88,11.88,12.14,12.12,12.22,12.15,
+12.33,12.27,12.31,12.34,12.39,12.62,12.57,12.62,12.59,12.72,
+12.96,12.88,13.17,12.96,12.99,13.04,13.07,13.22,13.21,13.18,
+13.20,13.49,13.51,13.46,13.65,13.70,13.61,13.75,13.94,13.86,
+13.99,13.93,13.96,14.20,14.31,14.22,14.32,14.51,14.42,14.41,
+14.66,14.58,14.60,14.56,14.84,14.74,14.86,14.96,14.85,14.82,
+15.24,15.11,15.20,15.34,15.52,15.20,15.48,15.54,15.45,15.78,
+15.75,15.94,15.83,15.74,15.94,16.07,16.05,15.85,16.42,16.07,
+16.27,16.57,16.28,16.40,16.43,16.58,16.53,16.67,16.71,16.84,
+16.89,17.00,16.95,16.93,17.16,17.24,17.21,17.03,17.46,17.35,
+0.50,0.52,0.62,0.59,0.67,0.73,0.76,0.83,0.85,0.90,
+0.95,1.02,1.05,1.15,1.18,1.14,1.24,1.28,1.32,1.41,
+1.50,1.46,1.56,1.58,1.59,1.70,1.78,1.75,1.82,1.82,
+1.89,1.97,2.05,2.02,2.02,2.18,2.21,2.20,2.25,2.25,
+2.35,2.39,2.43,2.59,2.56,2.61,2.67,2.74,2.74,2.71,
+2.77,2.84,2.95,2.96,2.94,3.03,3.14,3.16,3.24,3.29,
+3.35,3.38,3.56,3.47,3.48,3.51,3.55,3.73,3.58,3.82,
+3.92,3.89,3.88,3.90,3.98,4.01,4.11,4.11,4.11,4.18,
+4.23,4.24,4.30,4.38,4.38,4.54,4.49,4.67,4.70,4.66,
+4.72,4.82,4.76,4.83,4.89,4.93,5.00,5.04,5.07,5.19,
+5.17,5.24,5.25,5.26,5.30,5.36,5.53,5.40,5.55,5.55,
+5.73,5.62,5.84,5.90,5.89,5.91,5.94,6.03,6.14,6.09,
+6.04,6.28,6.11,6.30,6.26,6.41,6.38,6.47,6.50,6.67,
+6.61,6.67,6.67,6.86,6.78,6.78,6.98,7.02,7.07,7.02,
+7.12,7.16,7.14,7.29,7.26,7.46,7.32,7.41,7.46,7.53,
+7.45,7.62,7.67,7.51,7.67,7.91,7.82,7.80,8.07,7.97,
+8.11,8.18,8.05,8.16,8.17,8.27,8.31,8.30,8.43,8.46,
+8.41,8.48,8.57,8.59,8.66,8.83,8.72,8.64,8.80,8.91,
+8.86,9.06,9.12,9.27,9.13,9.19,9.31,9.39,9.43,9.46,
+9.58,9.52,9.39,9.48,9.69,9.73,9.81,9.79,9.75,9.84,
+9.97,9.98,9.88,10.10,10.19,10.11,10.21,10.21,10.22,10.36,
+10.34,10.32,10.45,10.48,10.57,10.64,10.56,10.70,10.73,10.94,
+10.84,10.77,11.00,11.05,11.11,11.17,11.22,11.22,11.17,11.24,
+11.50,11.48,11.27,11.57,11.50,11.56,11.62,11.53,11.53,11.57,
+11.76,12.07,12.00,11.80,11.93,12.24,12.17,12.14,12.30,12.17,
+12.16,12.45,12.43,12.39,12.46,12.42,12.42,12.63,12.58,12.54,
+12.72,12.75,12.71,12.81,13.07,12.75,13.12,13.27,13.06,13.33,
+13.16,13.07,13.49,13.36,13.50,13.39,13.36,13.51,13.60,13.66,
+13.71,13.94,13.73,13.61,14.06,14.04,14.02,13.87,14.06,14.14,
+0.44,0.42,0.48,0.50,0.55,0.59,0.64,0.68,0.73,0.76,
+0.74,0.80,0.89,0.90,0.94,0.94,1.05,1.06,1.12,1.16,
+1.19,1.19,1.22,1.23,1.31,1.38,1.33,1.41,1.48,1.50,
+1.57,1.54,1.64,1.62,1.66,1.72,1.79,1.87,1.84,1.88,
+1.89,2.00,1.95,2.07,2.01,2.12,2.10,2.19,2.27,2.23,
+2.31,2.31,2.35,2.32,2.46,2.53,2.58,2.59,2.69,2.61,
+2.74,2.58,2.74,2.79,2.81,2.90,2.92,2.92,2.99,2.98,
+3.11,3.15,3.16,3.14,3.19,3.33,3.25,3.30,3.44,3.42,
+3.39,3.48,3.52,3.49,3.54,3.64,3.69,3.73,3.67,3.78,
+3.85,3.90,3.97,3.99,3.98,4.05,4.01,4.06,4.14,4.06,
+4.24,4.25,4.28,4.36,4.38,4.40,4.43,4.43,4.45,4.61,
+4.61,4.66,4.61,4.61,4.75,4.76,4.80,4.94,4.94,5.05,
+5.05,5.09,5.15,5.04,5.09,5.16,5.11,5.27,5.06,5.27,
+5.39,5.38,5.50,5.51,5.48,5.59,5.54,5.63,5.70,5.86,
+5.76,5.87,5.80,5.92,6.03,5.99,6.01,6.07,5.87,6.02,
+6.23,5.98,6.27,6.36,6.25,6.32,6.42,6.45,6.41,6.41,
+6.42,6.48,6.56,6.64,6.63,6.67,6.68,6.83,6.76,6.76,
+7.01,6.92,7.01,6.98,7.01,7.08,7.13,7.09,7.21,7.13,
+7.29,7.30,7.38,7.36,7.38,7.41,7.38,7.41,7.54,7.54,
+7.68,7.76,7.71,7.55,7.65,7.78,7.91,7.93,7.82,8.00,
+7.92,7.88,8.00,8.02,8.26,8.20,8.11,8.37,8.40,8.42,
+8.32,8.57,8.68,8.56,8.61,8.74,8.50,8.53,8.66,8.74,
+8.81,8.90,8.84,8.93,8.79,9.04,9.02,9.07,9.09,9.12,
+9.25,9.26,9.26,9.29,9.28,9.35,9.29,9.41,9.47,9.45,
+9.62,9.42,9.55,9.69,9.66,9.79,9.88,9.97,9.76,9.77,
+9.77,10.11,10.12,10.04,10.27,10.23,10.07,10.21,10.07,10.38,
+10.41,10.41,10.34,10.33,10.38,10.53,10.66,10.70,10.56,10.73,
+10.68,10.65,10.53,10.65,10.64,10.97,10.98,10.70,11.09,11.14,
+11.09,11.09,11.04,11.17,11.39,11.34,11.26,11.14,11.47,11.45,
+0.33,0.37,0.41,0.42,0.47,0.49,0.51,0.55,0.56,0.61,
+0.67,0.65,0.71,0.73,0.77,0.81,0.83,0.90,0.90,0.93,
+0.93,0.98,1.02,1.02,1.08,1.07,1.16,1.21,1.21,1.23,
+1.24,1.27,1.34,1.35,1.40,1.47,1.42,1.42,1.50,1.50,
+1.59,1.58,1.61,1.64,1.57,1.69,1.78,1.73,1.82,1.81,
+1.86,1.89,1.93,1.96,1.97,2.00,2.04,2.10,2.10,2.10,
+2.16,2.15,2.10,2.28,2.25,2.27,2.36,2.45,2.42,2.40,
+2.49,2.56,2.60,2.60,2.57,2.64,2.68,2.69,2.68,2.75,
+2.76,2.84,2.83,2.78,2.94,3.03,2.97,3.02,3.05,2.95,
+3.13,3.17,3.20,3.03,3.21,3.26,3.26,3.42,3.41,3.41,
+3.40,3.46,3.52,3.48,3.54,3.60,3.57,3.63,3.68,3.63,
+3.73,3.69,3.73,3.88,3.86,3.77,4.01,3.83,3.96,4.01,
+4.02,4.09,4.10,4.14,4.14,4.13,4.32,4.30,4.17,4.34,
+4.37,4.39,4.34,4.35,4.44,4.51,4.45,4.52,4.67,4.68,
+4.65,4.63,4.74,4.65,4.84,4.78,4.81,4.88,4.99,5.07,
+4.95,5.01,4.80,5.02,5.01,5.12,5.03,5.22,5.15,5.32,
+5.18,5.37,5.36,5.34,5.39,5.43,5.36,5.52,5.48,5.51,
+5.54,5.58,5.66,5.57,5.76,5.74,5.69,5.75,5.79,5.99,
+5.96,5.86,5.96,5.85,5.98,6.11,6.10,6.27,6.12,6.09,
+6.17,6.31,6.29,6.35,6.33,6.24,6.37,6.39,6.45,6.44,
+6.56,6.57,6.69,6.49,6.66,6.51,6.62,6.76,6.62,6.74,
+6.82,6.77,6.87,6.92,6.91,6.96,6.99,6.98,6.98,7.09,
+7.11,6.97,7.21,7.20,7.21,7.30,7.33,7.45,7.37,7.28,
+7.39,7.41,7.50,7.59,7.66,7.57,7.45,7.81,7.76,7.68,
+7.68,7.75,7.99,7.84,7.81,7.92,7.99,7.91,8.03,8.07,
+8.02,8.09,8.20,8.18,8.23,8.27,8.22,8.14,8.23,8.34,
+8.29,8.34,8.48,8.48,8.38,8.53,8.57,8.59,8.65,8.63,
+8.65,8.63,8.94,8.87,8.66,8.79,8.83,8.96,8.91,8.95,
+8.92,9.05,8.96,9.01,9.20,9.20,9.03,9.15,9.23,9.15,
+0.26,0.28,0.33,0.35,0.33,0.39,0.40,0.46,0.47,0.49,
+0.53,0.53,0.58,0.61,0.63,0.63,0.61,0.70,0.70,0.69,
+0.78,0.76,0.81,0.85,0.89,0.84,0.94,0.91,0.95,0.95,
+0.99,1.11,1.16,1.09,1.16,1.06,1.16,1.22,1.18,1.26,
+1.25,1.27,1.27,1.36,1.32,1.36,1.45,1.44,1.51,1.54,
+1.54,1.60,1.62,1.59,1.64,1.64,1.69,1.64,1.75,1.72,
+1.74,1.86,1.76,1.80,1.85,1.84,1.94,1.90,1.95,1.96,
+1.97,2.07,2.07,2.11,2.12,2.10,2.14,2.24,2.20,2.19,
+2.24,2.19,2.34,2.38,2.43,2.40,2.41,2.45,2.37,2.48,
+2.48,2.70,2.53,2.57,2.60,2.55,2.65,2.61,2.64,2.78,
+2.83,2.73,2.84,2.78,2.90,3.02,2.95,2.82,3.03,3.05,
+3.03,3.06,3.11,3.13,3.17,3.17,3.18,3.18,3.29,3.26,
+3.28,3.32,3.34,3.40,3.31,3.30,3.30,3.45,3.38,3.47,
+3.46,3.40,3.61,3.53,3.73,3.65,3.62,3.67,3.71,3.68,
+3.69,3.80,3.85,3.79,3.90,3.81,3.96,3.97,4.00,4.01,
+4.01,4.09,4.00,4.22,4.22,4.15,4.25,4.17,4.19,4.13,
+4.35,4.35,4.33,4.36,4.44,4.36,4.33,4.46,4.38,4.54,
+4.54,4.64,4.48,4.46,4.54,4.55,4.70,4.81,4.70,4.67,
+4.83,4.85,4.88,4.85,4.88,4.88,4.98,4.91,4.95,4.94,
+4.95,5.05,5.00,5.23,5.15,5.03,5.18,5.20,5.29,5.35,
+5.32,5.34,5.28,5.26,5.34,5.38,5.46,5.35,5.39,5.56,
+5.42,5.53,5.58,5.61,5.57,5.70,5.74,5.68,5.62,5.66,
+5.86,5.75,5.79,5.87,6.00,5.84,5.90,5.90,5.89,5.97,
+6.01,6.14,6.05,6.05,6.13,6.08,6.23,6.17,6.38,6.31,
+6.18,6.35,6.32,6.30,6.52,6.39,6.37,6.49,6.49,6.55,
+6.55,6.38,6.50,6.57,6.59,6.54,6.57,6.67,6.63,6.82,
+6.77,6.78,6.99,6.82,6.94,6.99,6.96,7.01,7.03,7.05,
+6.96,6.94,7.10,7.03,7.19,7.15,7.20,7.13,7.23,7.14,
+7.32,7.32,7.33,7.44,7.40,7.29,7.30,7.49,7.59,7.57,
+0.21,0.22,0.25,0.28,0.31,0.30,0.34,0.31,0.38,0.42,
+0.40,0.45,0.47,0.48,0.52,0.53,0.55,0.57,0.57,0.59,
+0.58,0.66,0.67,0.63,0.67,0.71,0.73,0.74,0.77,0.77,
+0.83,0.84,0.88,0.87,0.92,0.92,0.96,0.91,0.92,1.03,
+1.01,1.05,1.09,1.08,1.09,1.17,1.14,1.18,1.22,1.22,
+1.25,1.26,1.25,1.23,1.30,1.32,1.41,1.35,1.37,1.37,
+1.39,1.44,1.47,1.46,1.52,1.53,1.49,1.54,1.62,1.60,
+1.65,1.64,1.70,1.70,1.73,1.73,1.83,1.80,1.76,1.78,
+1.83,1.86,1.87,1.89,1.95,1.80,1.87,1.92,2.03,2.05,
+2.01,2.04,2.07,2.14,2.13,2.12,2.17,2.15,2.20,2.24,
+2.25,2.26,2.32,2.29,2.32,2.32,2.40,2.34,2.41,2.39,
+2.42,2.40,2.58,2.50,2.47,2.58,2.56,2.56,2.60,2.59,
+2.67,2.67,2.75,2.59,2.70,2.77,2.77,2.78,2.82,2.90,
+2.96,2.80,2.88,2.90,3.02,2.95,2.94,2.94,3.08,2.96,
+3.06,3.12,3.14,3.04,2.98,3.14,3.13,3.33,3.22,3.27,
+3.35,3.33,3.11,3.23,3.30,3.34,3.32,3.46,3.58,3.48,
+3.38,3.57,3.53,3.56,3.53,3.61,3.60,3.54,3.59,3.63,
+3.70,3.77,3.71,3.68,3.83,3.66,3.74,3.85,3.90,3.89,
+3.89,3.80,3.92,3.80,4.00,4.04,4.00,4.04,4.04,3.96,
+3.94,4.09,4.24,4.21,4.20,4.15,4.28,4.22,4.15,4.27,
+4.20,4.27,4.39,4.29,4.35,4.32,4.31,4.45,4.56,4.46,
+4.52,4.42,4.59,4.46,4.44,4.57,4.49,4.59,4.50,4.66,
+4.69,4.64,4.70,4.76,4.73,4.78,4.72,4.89,4.95,4.88,
+4.96,4.82,4.88,4.91,4.86,4.84,5.07,4.98,4.93,5.14,
+4.97,5.03,5.10,5.02,5.11,5.23,5.19,5.26,5.30,5.18,
+5.40,5.35,5.37,5.27,5.35,5.32,5.45,5.44,5.33,5.42,
+5.48,5.63,5.53,5.63,5.52,5.69,5.51,5.65,5.59,5.50,
+5.80,5.69,5.72,5.67,5.84,5.87,5.76,5.77,5.82,5.90,
+5.92,5.92,5.76,5.96,6.04,5.93,5.99,5.82,5.92,5.95,
+0.18,0.19,0.21,0.23,0.24,0.26,0.24,0.28,0.27,0.33,
+0.33,0.36,0.37,0.39,0.40,0.44,0.45,0.45,0.47,0.45,
+0.52,0.52,0.54,0.60,0.59,0.58,0.59,0.66,0.65,0.68,
+0.68,0.67,0.64,0.69,0.80,0.73,0.75,0.81,0.72,0.79,
+0.83,0.86,0.83,0.89,0.93,0.96,0.93,0.91,0.96,0.95,
+0.98,1.05,1.04,1.02,1.00,1.07,1.07,1.14,1.09,1.08,
+1.16,1.19,1.22,1.21,1.23,1.24,1.21,1.39,1.29,1.30,
+1.30,1.33,1.26,1.29,1.45,1.46,1.35,1.50,1.47,1.47,
+1.49,1.49,1.58,1.58,1.53,1.60,1.63,1.66,1.61,1.61,
+1.60,1.60,1.68,1.72,1.65,1.71,1.74,1.75,1.84,1.81,
+1.84,1.76,1.83,1.89,1.82,1.87,1.86,1.96,1.89,1.95,
+1.99,2.08,2.01,1.99,2.09,2.07,2.09,2.03,2.21,2.15,
+2.17,2.13,2.07,2.20,2.12,2.31,2.20,2.17,2.27,2.28,
+2.32,2.30,2.37,2.40,2.36,2.42,2.41,2.44,2.42,2.43,
+2.54,2.52,2.58,2.59,2.59,2.62,2.58,2.56,2.50,2.60,
+2.61,2.57,2.72,2.64,2.66,2.73,2.77,2.74,2.73,2.70,
+2.81,2.78,2.81,2.87,2.87,2.89,2.99,2.89,2.93,2.96,
+2.97,2.86,3.02,3.10,3.00,2.92,2.97,3.09,3.12,3.13,
+3.13,3.13,3.02,3.29,3.27,3.13,3.21,3.19,3.28,3.25,
+3.30,3.23,3.33,3.35,3.51,3.38,3.43,3.46,3.35,3.43,
+3.50,3.57,3.53,3.47,3.55,3.52,3.56,3.56,3.55,3.60,
+3.63,3.60,3.76,3.73,3.63,3.73,3.88,3.72,3.63,3.70,
+3.96,3.85,3.76,3.77,3.82,3.83,3.84,3.89,3.97,3.91,
+3.92,4.07,3.95,4.01,3.93,4.02,4.04,4.14,4.08,4.23,
+4.17,4.10,4.13,4.25,4.16,4.14,4.06,4.18,4.24,4.18,
+4.22,4.38,4.38,4.28,4.30,4.33,4.54,4.42,4.41,4.40,
+4.40,4.46,4.45,4.43,4.51,4.47,4.57,4.55,4.57,4.63,
+4.63,4.58,4.67,4.69,4.55,4.52,4.65,4.70,4.68,4.75,
+4.77,4.71,4.73,4.87,4.76,4.83,4.86,4.91,4.92,4.89,
+0.15,0.15,0.14,0.18,0.19,0.21,0.22,0.25,0.25,0.23,
+0.27,0.28,0.29,0.32,0.33,0.35,0.35,0.39,0.40,0.38,
+0.41,0.44,0.42,0.44,0.47,0.48,0.47,0.48,0.49,0.54,
+0.53,0.59,0.55,0.55,0.61,0.57,0.61,0.66,0.65,0.65,
+0.68,0.68,0.71,0.71,0.73,0.70,0.76,0.78,0.79,0.87,
+0.75,0.88,0.79,0.79,0.94,0.85,0.91,0.90,0.94,0.90,
+0.96,0.90,0.97,0.95,0.98,1.03,1.02,1.02,1.02,1.08,
+1.02,1.07,1.10,1.10,1.12,1.08,1.13,1.16,1.19,1.18,
+1.18,1.31,1.18,1.21,1.29,1.31,1.23,1.30,1.33,1.30,
+1.32,1.37,1.40,1.35,1.40,1.40,1.42,1.48,1.50,1.52,
+1.49,1.47,1.52,1.52,1.57,1.62,1.56,1.48,1.57,1.54,
+1.60,1.63,1.62,1.69,1.70,1.66,1.67,1.69,1.70,1.67,
+1.70,1.79,1.75,1.77,1.84,1.79,1.73,1.89,1.83,1.89,
+1.89,1.89,1.91,1.90,1.91,2.01,1.96,2.05,1.92,1.99,
+1.98,2.04,2.02,2.01,2.13,2.04,2.19,2.08,2.14,2.12,
+2.14,2.14,2.12,2.06,2.19,2.15,2.15,2.29,2.26,2.17,
+2.22,2.24,2.29,2.29,2.35,2.30,2.33,2.39,2.31,2.41,
+2.39,2.35,2.46,2.47,2.48,2.39,2.56,2.58,2.51,2.54,
+2.47,2.48,2.59,2.60,2.56,2.58,2.54,2.67,2.72,2.62,
+2.65,2.66,2.69,2.66,2.73,2.87,2.71,2.79,2.81,2.85,
+2.70,2.79,2.77,2.75,2.77,2.87,2.95,2.82,2.84,2.93,
+2.82,2.84,2.96,2.88,3.05,3.07,3.03,3.10,3.05,3.12,
+3.00,3.18,3.02,3.03,3.05,3.20,3.18,3.19,3.15,3.16,
+3.14,3.23,3.22,3.14,3.26,3.24,3.24,3.27,3.25,3.29,
+3.23,3.35,3.37,3.36,3.32,3.45,3.33,3.40,3.48,3.51,
+3.48,3.46,3.45,3.51,3.52,3.58,3.58,3.54,3.63,3.62,
+3.59,3.64,3.68,3.69,3.60,3.63,3.65,3.63,3.71,3.77,
+3.69,3.75,3.75,3.83,3.71,3.74,3.88,3.74,3.75,3.90,
+3.78,3.95,3.90,3.85,3.90,3.97,4.04,3.91,3.94,3.98,
+2.83,3.11,3.33,3.74,3.90,4.17,4.50,4.90,5.06,5.28,
+5.61,5.71,6.18,6.33,6.75,6.93,7.27,7.39,7.71,7.94,
+8.40,8.57,8.86,9.08,9.46,9.71,9.88,10.30,10.44,10.90,
+10.92,11.17,11.72,11.75,12.22,12.43,12.69,12.96,13.28,13.53,
+13.75,13.98,14.21,14.52,14.91,15.12,15.33,15.61,16.05,16.15,
+16.36,16.73,16.99,17.48,17.61,17.81,18.16,18.46,18.56,19.08,
+19.20,19.36,19.72,20.09,20.36,20.68,20.75,21.16,21.36,21.66,
+22.03,22.38,22.56,22.64,22.95,23.35,23.28,24.00,24.27,24.45,
+24.71,24.87,25.18,25.39,25.78,25.91,26.31,26.70,26.75,27.01,
+27.34,27.74,27.74,27.99,28.48,28.84,29.28,29.30,29.59,29.99,
+30.06,30.24,30.55,30.90,31.35,31.46,31.84,32.05,32.39,32.59,
+32.80,33.27,33.17,33.60,33.76,34.22,34.48,35.14,35.14,35.33,
+35.55,35.96,36.11,36.28,36.59,36.87,37.26,37.59,37.83,37.94,
+38.38,38.66,38.95,39.02,39.16,39.61,40.02,40.34,40.64,40.78,
+40.75,41.43,41.57,41.92,42.02,42.49,42.61,42.81,43.16,43.53,
+43.77,43.91,44.26,44.58,44.90,45.05,45.62,45.53,45.99,46.04,
+46.60,46.85,47.04,47.28,47.41,47.98,48.19,48.46,48.77,49.04,
+48.87,49.41,50.00,50.07,50.64,50.91,50.64,51.00,51.20,51.55,
+52.04,52.12,52.35,52.54,53.00,53.09,53.51,53.51,54.03,54.66,
+54.60,54.99,55.09,55.29,55.97,56.37,56.15,56.66,56.71,56.98,
+57.67,57.51,58.22,58.13,58.65,58.90,58.86,59.05,59.21,59.90,
+60.01,60.02,60.75,61.13,61.35,61.66,61.99,61.90,62.23,62.20,
+62.68,63.16,63.13,63.85,64.08,64.01,64.61,64.63,65.01,65.27,
+65.64,65.76,66.34,66.34,66.53,66.76,67.40,67.30,67.70,68.12,
+68.23,68.70,68.75,68.88,69.32,69.57,70.10,70.22,70.46,70.35,
+70.93,71.42,71.36,71.92,71.88,72.42,73.06,72.55,73.21,73.55,
+73.71,73.76,74.35,74.53,74.82,75.20,75.46,76.46,75.85,76.23,
+76.38,76.78,77.02,77.33,77.48,78.15,78.15,78.17,78.80,78.72,
+79.33,79.71,79.58,79.92,80.29,80.44,80.76,81.09,81.48,81.89,
+2.35,2.63,2.77,3.03,3.19,3.42,3.65,3.89,4.06,4.26,
+4.49,4.82,4.95,5.25,5.51,5.64,5.90,6.16,6.36,6.62,
+6.80,7.12,7.26,7.44,7.72,7.95,8.14,8.36,8.53,8.85,
+9.04,9.29,9.50,9.66,10.00,10.24,10.38,10.46,10.84,11.02,
+11.20,11.55,11.77,11.93,12.21,12.53,12.64,12.73,12.99,13.25,
+13.67,13.80,14.01,14.31,14.48,14.69,14.84,15.18,15.50,15.47,
+15.89,15.91,16.29,16.52,16.50,16.85,17.06,17.25,17.58,17.68,
+17.94,18.20,18.40,18.68,18.80,19.11,19.31,19.55,19.75,20.18,
+20.16,20.60,20.74,20.76,21.06,21.27,21.68,21.77,22.05,22.11,
+22.64,22.48,22.91,22.95,23.35,23.59,23.88,23.81,24.33,24.56,
+24.71,25.00,24.96,25.28,25.53,25.88,25.96,26.32,26.14,26.78,
+27.07,27.23,27.48,27.59,27.87,28.20,28.20,28.47,28.71,28.72,
+29.31,29.35,29.60,29.95,30.10,30.23,30.30,30.66,30.76,31.34,
+31.32,31.55,31.64,31.93,32.51,32.36,32.76,32.85,33.13,33.57,
+33.83,33.74,34.05,34.40,34.30,34.64,34.90,35.20,35.40,35.61,
+36.07,35.97,36.30,36.45,36.55,36.68,37.02,37.46,37.74,37.53,
+38.25,38.38,38.68,38.78,38.86,39.19,39.30,39.75,40.05,40.41,
+40.25,40.47,40.62,40.96,41.25,41.63,41.77,41.86,42.16,42.32,
+42.74,43.07,43.15,43.22,43.36,43.69,44.02,44.01,44.40,44.39,
+44.86,45.04,45.00,45.42,45.73,45.98,46.18,46.45,46.58,46.67,
+47.09,47.32,47.31,47.59,48.00,48.06,48.65,48.23,48.82,49.20,
+49.13,49.25,49.63,49.74,50.05,50.43,50.77,50.92,50.90,51.20,
+51.64,51.74,51.81,52.20,52.60,52.57,52.85,53.27,53.11,53.38,
+53.71,54.03,53.70,54.37,54.71,55.05,55.26,55.14,55.40,55.67,
+56.16,56.18,56.58,56.76,56.97,56.77,57.36,57.50,57.88,57.99,
+58.30,58.36,58.58,58.90,59.31,59.38,59.59,59.69,60.26,60.12,
+60.62,60.43,60.85,60.96,61.40,61.54,61.79,62.00,61.93,62.51,
+62.44,62.74,63.30,63.32,63.68,64.14,63.90,64.33,64.29,64.68,
+65.19,65.12,65.41,65.52,65.86,66.42,66.38,66.47,66.69,66.67,
+1.93,2.06,2.28,2.48,2.58,2.88,3.04,3.09,3.37,3.57,
+3.78,3.91,4.12,4.28,4.47,4.58,4.84,5.01,5.18,5.41,
+5.54,5.88,6.05,6.18,6.42,6.60,6.73,6.80,7.09,7.22,
+7.46,7.71,7.70,8.00,8.18,8.28,8.38,8.71,8.86,9.04,
+9.27,9.35,9.69,9.73,9.91,10.16,10.35,10.55,10.64,11.00,
+10.96,11.21,11.34,11.63,11.76,12.00,12.09,12.41,12.56,12.63,
+12.85,13.18,13.27,13.39,13.83,13.76,13.94,14.11,14.46,14.48,
+14.75,14.72,15.25,15.29,15.59,15.80,15.78,15.99,16.02,16.36,
+16.51,16.98,16.73,17.09,17.32,17.54,17.61,17.70,18.03,18.30,
+18.35,18.75,18.91,18.82,19.11,19.27,19.43,19.72,20.01,19.97,
+20.29,20.43,20.43,20.96,21.08,21.23,21.31,21.49,21.82,21.86,
+21.98,22.22,22.41,22.49,22.94,23.01,23.18,23.51,23.67,23.64,
+23.84,23.97,24.26,24.50,24.73,24.70,25.14,25.18,25.39,25.59,
+25.70,25.84,26.09,26.23,26.52,26.72,26.94,27.07,27.09,27.58,
+27.45,27.58,27.98,28.23,28.26,28.43,28.66,28.73,28.87,29.44,
+29.31,29.69,29.61,29.89,30.03,30.30,30.66,30.65,30.75,30.98,
+31.24,31.56,31.66,31.71,32.02,31.88,32.53,32.54,32.57,32.75,
+32.99,32.81,33.39,33.62,33.67,33.95,34.56,34.43,34.56,34.75,
+35.16,35.27,35.15,35.46,35.91,35.62,35.98,36.25,36.55,36.34,
+36.87,36.85,36.89,37.23,37.04,37.58,37.85,38.05,38.33,38.53,
+38.39,38.71,38.94,39.24,39.01,39.36,39.58,39.69,40.05,40.24,
+40.25,40.38,41.17,41.31,41.20,41.60,41.50,41.61,41.67,41.93,
+42.23,42.30,42.60,42.64,42.96,42.96,43.23,43.72,43.77,44.26,
+44.14,43.94,44.67,44.51,44.74,44.99,45.19,45.61,45.66,45.35,
+45.69,46.00,46.33,46.38,46.43,46.99,47.04,47.25,47.24,47.51,
+47.61,48.00,48.33,48.30,48.19,48.86,48.61,49.23,48.93,49.38,
+49.84,49.66,50.22,50.07,50.15,50.43,50.56,51.09,50.85,51.46,
+51.65,51.49,51.86,51.90,52.05,52.45,52.65,52.56,52.89,53.07,
+52.94,53.46,53.44,53.88,53.77,54.05,54.64,54.41,54.68,54.97,
+1.55,1.80,1.85,2.02,2.21,2.32,2.43,2.56,2.73,2.96,
+3.04,3.22,3.34,3.45,3.62,3.76,4.02,4.03,4.26,4.40,
+4.63,4.71,4.84,5.06,5.12,5.37,5.40,5.58,5.78,6.02,
+6.20,6.21,6.44,6.51,6.71,6.85,6.97,7.13,7.43,7.44,
+7.63,7.73,7.88,8.17,8.31,8.27,8.46,8.64,8.90,8.97,
+9.08,9.36,9.39,9.69,9.71,9.76,10.04,10.16,10.36,10.34,
+10.62,10.75,10.81,11.05,11.27,11.32,11.48,11.64,11.77,12.14,
+12.15,12.18,12.40,12.58,12.90,12.80,13.05,13.05,13.26,13.36,
+13.46,13.69,13.79,14.16,14.20,14.44,14.55,14.73,14.65,15.08,
+15.15,15.21,15.32,15.62,15.48,15.88,15.89,16.07,16.34,16.62,
+16.54,17.03,16.91,16.93,17.30,17.26,17.26,17.74,17.81,18.04,
+18.05,18.13,18.47,18.45,18.82,18.91,19.03,19.31,19.51,19.16,
+19.64,19.90,19.83,19.86,20.10,20.63,20.41,20.59,20.77,20.84,
+21.15,21.21,21.28,21.32,21.51,21.76,21.89,22.40,22.39,22.56,
+22.57,22.77,22.87,23.05,23.28,23.37,23.51,23.51,23.72,23.93,
+24.27,24.07,24.43,24.59,24.69,24.97,25.25,25.11,25.32,25.30,
+25.45,25.64,26.01,25.94,26.32,26.43,26.40,26.75,26.75,27.09,
+27.32,27.34,27.29,27.24,27.74,27.76,28.17,28.28,28.38,28.38,
+29.01,28.74,28.90,29.10,29.18,29.33,29.41,29.77,29.72,29.97,
+30.15,29.98,30.63,30.57,30.49,30.96,30.91,31.42,31.52,31.50,
+31.56,31.87,31.93,31.86,32.27,32.11,32.64,32.62,32.86,33.02,
+33.34,33.51,33.33,33.80,33.83,33.74,34.31,34.34,34.46,34.69,
+34.58,34.83,34.81,35.03,35.10,35.32,35.46,35.43,35.74,36.16,
+36.48,36.26,36.48,36.69,36.64,36.90,36.97,37.12,37.33,37.39,
+37.70,37.72,37.82,38.05,38.31,38.74,38.47,38.50,38.52,39.01,
+39.17,39.29,39.47,39.45,39.83,39.85,39.60,40.48,40.27,40.62,
+40.80,40.62,40.71,41.20,41.44,41.18,41.50,41.89,41.68,42.11,
+41.99,42.24,42.26,42.75,42.82,42.83,42.87,43.33,43.37,43.53,
+43.73,43.91,44.09,44.16,44.20,44.57,44.39,44.84,45.02,44.99,
+1.26,1.42,1.48,1.63,1.78,1.90,2.05,2.13,2.22,2.34,
+2.53,2.66,2.80,2.85,2.99,3.10,3.21,3.46,3.48,3.73,
+3.65,3.94,4.01,4.11,4.25,4.38,4.48,4.56,4.68,4.93,
+4.97,5.04,5.17,5.36,5.47,5.67,5.63,5.87,6.07,6.23,
+6.28,6.31,6.47,6.56,6.78,6.92,6.97,7.07,7.06,7.30,
+7.51,7.59,7.69,7.78,7.89,8.06,8.16,8.32,8.36,8.56,
+8.76,8.73,8.84,8.88,9.05,9.15,9.36,9.62,9.71,9.74,
+9.87,10.13,10.23,10.22,10.41,10.52,10.63,10.72,10.99,11.03,
+11.13,11.13,11.26,11.42,11.66,11.86,11.90,11.90,12.03,12.19,
+12.40,12.54,12.56,12.88,12.91,12.95,13.10,13.37,13.41,13.51,
+13.45,13.53,13.85,13.88,14.14,14.29,14.37,14.44,14.71,14.73,
+14.93,14.92,15.14,15.07,15.32,15.28,15.71,15.69,15.68,15.77,
+16.23,16.39,16.18,16.39,16.79,16.66,17.07,16.90,17.05,17.27,
+17.37,17.43,17.47,17.67,17.84,18.02,18.00,18.32,18.45,18.35,
+18.52,18.68,18.73,18.81,19.06,18.98,19.13,19.42,19.47,19.72,
+19.81,20.07,20.00,20.40,20.23,20.39,20.57,20.84,20.84,20.83,
+21.24,21.15,21.24,21.09,21.46,21.35,21.72,21.93,22.12,22.17,
+22.24,22.39,22.39,22.51,22.74,22.77,23.07,23.14,23.26,23.27,
+23.67,23.48,23.65,23.78,24.33,24.23,24.08,24.17,24.63,24.43,
+24.71,24.72,24.96,25.23,25.20,25.15,25.46,25.66,25.52,26.00,
+25.87,26.15,26.20,26.15,26.48,26.31,26.60,26.87,26.98,27.30,
+27.04,27.45,27.60,27.72,27.77,27.83,27.74,28.25,28.30,28.08,
+28.53,28.48,28.61,28.91,28.84,29.14,29.26,29.65,29.32,29.35,
+29.83,29.84,30.12,30.11,29.99,30.26,30.21,30.46,30.73,30.79,
+31.07,31.21,31.10,31.42,31.41,31.74,31.64,31.80,31.80,32.01,
+32.11,31.91,32.41,32.60,32.81,32.30,32.74,32.84,33.13,33.12,
+33.32,33.38,33.59,33.54,33.58,34.05,34.33,34.22,34.33,34.49,
+34.55,34.58,34.81,35.01,34.82,35.26,35.19,35.38,35.50,35.69,
+35.81,35.88,36.07,36.04,36.45,36.43,36.80,36.38,36.84,36.73,
+1.05,1.15,1.22,1.38,1.43,1.55,1.68,1.74,1.91,2.01,
+2.07,2.21,2.28,2.30,2.43,2.58,2.65,2.84,2.89,2.94,
+3.11,3.02,3.28,3.30,3.55,3.62,3.73,3.83,3.83,4.03,
+4.05,4.20,4.34,4.35,4.62,4.60,4.71,4.82,4.94,4.95,
+5.10,5.19,5.27,5.42,5.59,5.53,5.71,5.85,5.95,5.95,
+6.18,6.26,6.33,6.44,6.55,6.57,6.79,6.86,6.91,6.96,
+7.03,7.27,7.28,7.40,7.50,7.48,7.72,7.82,7.93,8.06,
+8.13,8.15,8.27,8.42,8.63,8.68,8.81,8.94,8.94,8.93,
+9.12,9.29,9.31,9.42,9.47,9.57,9.92,9.78,10.04,9.97,
+10.18,10.13,10.35,10.37,10.58,10.62,10.92,10.75,11.04,11.16,
+11.05,11.39,11.37,11.51,11.59,11.64,11.79,12.17,11.98,12.00,
+12.18,12.28,12.39,12.52,12.51,12.67,12.75,13.00,12.87,12.96,
+13.18,13.35,13.39,13.44,13.69,13.59,13.74,14.07,14.07,14.16,
+14.09,14.31,14.48,14.52,14.57,14.65,14.78,14.73,15.21,15.15,
+15.14,15.26,15.42,15.46,15.42,15.58,15.57,15.71,16.11,16.00,
+16.22,16.33,16.24,16.48,16.61,16.73,16.86,16.78,17.13,17.16,
+17.25,17.41,17.24,17.75,17.70,17.88,17.72,17.91,17.98,18.26,
+18.32,18.49,18.39,18.55,18.48,18.53,18.95,18.89,18.84,19.39,
+19.28,19.14,19.29,19.61,19.79,19.62,20.03,19.90,20.09,20.44,
+20.19,20.37,20.59,20.72,20.76,20.78,20.98,21.16,21.02,21.03,
+21.33,21.18,21.51,21.57,21.52,21.83,21.80,21.86,22.09,22.42,
+22.19,22.27,22.25,22.48,22.48,22.94,23.00,22.84,22.96,23.32,
+23.09,23.45,23.51,23.54,23.65,23.84,23.93,24.12,24.36,24.18,
+24.33,24.38,24.43,24.45,24.79,24.55,25.00,25.11,25.11,25.22,
+25.50,25.49,25.41,25.64,25.79,25.82,25.94,25.86,26.21,26.34,
+26.35,26.36,26.49,26.84,26.70,26.72,26.73,27.21,27.18,27.27,
+27.40,27.76,27.43,27.81,27.65,27.86,27.86,28.18,28.26,28.24,
+28.36,28.24,28.58,28.79,28.71,28.86,29.21,29.06,28.94,29.04,
+29.48,29.45,29.54,29.78,29.98,29.78,30.01,30.02,30.19,30.19,
+0.87,0.97,1.07,1.09,1.14,1.29,1.34,1.41,1.56,1.55,
+1.70,1.77,1.85,1.97,2.04,2.05,2.22,2.28,2.32,2.49,
+2.60,2.60,2.68,2.83,2.87,2.86,3.05,3.12,3.20,3.30,
+3.35,3.49,3.52,3.52,3.68,3.76,3.94,3.94,4.04,4.05,
+4.23,4.23,4.39,4.30,4.47,4.50,4.67,4.71,4.86,4.88,
+4.99,5.04,5.24,5.28,5.36,5.46,5.51,5.60,5.67,5.77,
+5.87,5.99,6.01,6.23,6.14,6.19,6.40,6.37,6.46,6.60,
+6.59,6.71,6.91,6.88,7.05,7.10,7.10,7.29,7.46,7.34,
+7.48,7.63,7.74,7.66,7.84,7.95,8.01,8.01,8.01,8.34,
+8.24,8.35,8.55,8.68,8.71,8.62,8.86,8.77,9.01,9.16,
+9.19,9.24,9.23,9.31,9.71,9.51,9.76,9.64,9.92,9.84,
+9.96,10.06,10.29,10.16,10.34,10.41,10.27,10.59,10.52,10.82,
+10.79,10.93,10.92,10.98,11.18,11.34,11.21,11.44,11.41,11.53,
+11.69,11.61,11.80,11.89,11.93,12.20,12.42,12.46,12.36,12.55,
+12.32,12.64,12.67,12.54,12.83,12.96,12.90,13.09,13.09,13.17,
+13.39,13.34,13.50,13.58,13.55,13.61,13.69,13.92,13.88,14.09,
+14.23,14.16,14.31,14.50,14.50,14.61,14.69,14.88,14.83,14.77,
+14.89,15.10,14.94,15.23,15.48,15.38,15.64,15.44,15.63,15.70,
+15.81,15.79,15.99,15.98,16.26,16.41,16.40,16.43,16.24,16.49,
+16.45,16.84,16.73,16.81,16.94,16.89,17.15,17.20,17.52,17.38,
+17.56,17.39,17.52,17.61,17.81,17.72,18.12,18.22,18.11,18.07,
+18.20,18.37,18.37,18.60,18.52,18.73,18.75,18.79,18.97,19.39,
+19.03,19.37,19.39,19.35,19.48,19.61,19.68,19.65,19.93,19.71,
+20.06,19.85,20.06,20.23,20.41,20.10,20.62,20.45,20.50,20.55,
+20.77,20.71,21.00,21.08,21.18,21.10,21.24,21.45,21.36,21.42,
+21.46,21.69,21.85,21.89,21.82,22.25,21.93,22.09,22.23,22.20,
+22.35,22.42,22.74,22.72,22.93,22.87,22.98,23.15,23.08,23.27,
+23.19,23.26,23.48,23.48,23.56,23.48,23.54,23.94,23.98,23.86,
+24.41,24.15,24.12,24.40,24.32,24.58,24.40,24.62,24.73,24.70,
+0.71,0.80,0.87,0.94,0.95,1.08,1.08,1.24,1.31,1.31,
+1.37,1.42,1.52,1.60,1.64,1.71,1.86,1.86,1.96,1.98,
+2.05,2.17,2.19,2.27,2.36,2.31,2.46,2.57,2.65,2.60,
+2.66,2.88,2.84,2.91,3.05,3.11,3.18,3.23,3.30,3.31,
+3.40,3.51,3.53,3.69,3.66,3.79,3.89,4.01,3.98,3.96,
+4.10,4.22,4.21,4.31,4.31,4.42,4.56,4.55,4.61,4.74,
+4.68,4.83,5.01,5.00,5.10,5.18,5.20,5.29,5.23,5.43,
+5.53,5.58,5.53,5.71,5.71,5.74,5.80,5.98,6.03,6.01,
+6.12,6.27,6.22,6.36,6.46,6.41,6.57,6.62,6.73,6.83,
+6.83,6.73,6.90,7.09,7.16,7.06,7.19,7.38,7.30,7.35,
+7.60,7.55,7.71,7.64,7.74,7.88,7.89,8.00,7.93,8.14,
+8.09,8.26,8.27,8.42,8.56,8.63,8.63,8.65,8.85,8.73,
+8.87,8.90,8.91,9.21,9.21,9.20,9.35,9.44,9.50,9.28,
+9.47,9.45,9.82,9.70,10.01,10.00,9.97,10.01,10.09,10.14,
+10.31,10.29,10.41,10.59,10.66,10.60,10.64,10.63,10.74,10.95,
+10.86,11.02,11.13,11.26,11.01,11.29,11.44,11.41,11.46,11.59,
+11.85,11.85,11.77,11.89,11.84,11.87,11.97,11.92,12.18,12.11,
+12.30,12.32,12.51,12.43,12.40,12.61,12.64,12.61,12.90,13.01,
+12.84,13.00,13.12,13.24,13.14,13.17,13.49,13.43,13.38,13.51,
+13.45,13.72,13.77,13.78,13.87,13.92,13.98,14.02,14.21,14.17,
+14.12,14.43,14.32,14.67,14.46,14.90,14.66,14.77,14.85,14.81,
+15.05,15.01,14.98,15.30,15.24,15.12,15.42,15.56,15.47,15.54,
+15.48,15.84,15.70,15.99,15.82,16.02,16.05,15.98,16.07,16.28,
+16.48,16.38,16.41,16.45,16.66,16.79,16.69,16.86,16.82,16.92,
+17.06,17.07,17.19,17.12,17.41,17.52,17.56,17.57,17.63,17.56,
+17.82,17.90,17.84,17.73,18.17,18.06,18.14,18.33,18.17,18.26,
+18.55,18.47,18.61,18.73,18.66,18.80,18.80,18.64,18.82,18.96,
+18.99,18.99,19.25,19.13,19.34,19.31,19.45,19.46,19.74,19.60,
+19.67,19.86,19.91,19.93,20.20,20.21,19.99,20.20,20.36,20.35,
+0.56,0.65,0.71,0.73,0.81,0.86,0.95,0.98,1.02,1.10,
+1.20,1.25,1.28,1.32,1.35,1.37,1.48,1.49,1.59,1.69,
+1.70,1.72,1.83,1.84,1.92,1.93,1.98,2.07,2.19,2.21,
+2.27,2.28,2.38,2.43,2.45,2.53,2.73,2.65,2.72,2.81,
+2.81,2.99,2.86,3.05,3.09,3.12,3.13,3.20,3.21,3.31,
+3.40,3.42,3.54,3.49,3.59,3.68,3.68,3.74,3.77,3.91,
+3.88,3.92,4.06,4.11,4.16,4.22,4.28,4.39,4.46,4.49,
+4.39,4.45,4.67,4.53,4.70,4.73,4.86,4.84,4.91,5.06,
+5.08,5.14,5.17,5.17,5.34,5.36,5.34,5.43,5.55,5.53,
+5.58,5.59,5.68,5.75,5.75,5.86,6.06,5.94,6.03,6.22,
+5.97,6.18,6.25,6.43,6.42,6.60,6.48,6.50,6.55,6.60,
+6.56,6.74,6.80,6.87,7.01,7.14,6.91,7.13,7.17,7.32,
+7.01,7.31,7.32,7.46,7.38,7.66,7.66,7.63,7.76,7.76,
+7.90,7.75,7.95,7.91,7.96,7.99,8.21,8.05,8.26,8.52,
+8.37,8.33,8.38,8.68,8.57,8.56,8.67,8.84,8.88,8.91,
+9.01,8.92,9.00,9.14,8.93,9.30,9.40,9.33,9.43,9.39,
+9.60,9.57,9.58,9.64,9.71,9.80,9.79,9.87,9.93,9.89,
+10.00,10.26,10.19,10.37,10.34,10.27,10.46,10.54,10.41,10.57,
+10.55,10.65,10.59,10.76,10.84,10.79,11.04,11.03,11.09,11.14,
+11.24,11.27,11.37,11.52,11.39,11.43,11.53,11.56,11.84,11.48,
+11.69,11.77,11.88,11.80,11.84,11.92,12.04,12.18,12.04,12.22,
+12.29,12.38,12.38,12.41,12.67,12.55,12.46,12.77,12.67,12.84,
+13.12,12.78,13.00,13.09,13.07,13.03,13.21,13.18,13.41,13.30,
+13.46,13.29,13.45,13.40,13.74,13.62,13.50,13.80,13.63,13.79,
+13.86,14.09,14.02,14.22,14.20,14.22,14.11,14.34,14.43,14.25,
+14.54,14.55,14.62,14.48,14.66,14.87,14.87,14.98,14.98,14.88,
+15.08,15.00,15.11,15.26,15.39,15.46,15.53,15.43,15.39,15.69,
+15.70,15.93,15.69,15.69,16.10,15.89,15.86,16.08,16.05,16.09,
+16.18,16.26,16.31,16.29,16.35,16.48,16.57,16.62,16.71,16.65,
+0.49,0.51,0.58,0.65,0.69,0.71,0.73,0.83,0.88,0.92,
+0.93,0.97,1.03,1.11,1.13,1.21,1.18,1.25,1.28,1.33,
+1.37,1.42,1.46,1.55,1.52,1.61,1.71,1.78,1.82,1.83,
+1.85,1.85,1.90,2.03,2.08,2.12,2.12,2.17,2.27,2.33,
+2.26,2.32,2.37,2.45,2.53,2.54,2.49,2.63,2.65,2.60,
+2.69,2.83,2.81,2.85,2.98,3.00,3.09,3.13,3.08,3.14,
+3.09,3.26,3.26,3.31,3.44,3.54,3.54,3.66,3.61,3.68,
+3.70,3.74,3.68,3.70,3.73,3.93,3.93,3.97,3.96,4.06,
+4.17,4.11,4.25,4.35,4.39,4.33,4.43,4.41,4.48,4.60,
+4.53,4.67,4.71,4.75,4.83,4.89,4.84,4.88,4.94,4.98,
+4.99,5.11,5.17,5.13,5.25,5.32,5.22,5.39,5.37,5.48,
+5.60,5.51,5.65,5.67,5.76,5.77,5.84,5.79,5.83,5.82,
+5.97,6.05,6.09,6.06,6.18,6.17,6.21,6.21,6.31,6.18,
+6.46,6.50,6.64,6.61,6.57,6.64,6.72,6.77,6.71,6.82,
+6.85,6.96,6.81,7.15,6.99,7.03,7.16,7.23,7.29,7.38,
+7.36,7.28,7.38,7.11,7.51,7.63,7.66,7.55,7.68,7.73,
+7.76,7.77,7.94,8.07,7.95,8.13,8.14,7.98,8.25,8.35,
+8.20,8.24,8.50,8.20,8.37,8.57,8.41,8.70,8.48,8.63,
+8.68,8.78,8.71,8.96,8.86,8.97,8.96,9.06,9.03,9.06,
+9.08,9.28,9.17,9.24,9.36,9.47,9.44,9.43,9.58,9.57,
+9.55,9.77,9.64,9.83,9.67,9.99,9.80,9.97,9.95,10.10,
+10.22,10.19,10.21,10.17,10.21,10.32,10.44,10.52,10.42,10.46,
+10.50,10.61,10.66,10.49,10.84,10.65,10.95,10.85,10.84,11.02,
+11.01,10.97,11.24,11.26,11.15,11.43,11.33,11.38,11.31,11.30,
+11.61,11.61,11.58,11.53,11.70,11.78,11.66,11.72,11.79,11.98,
+11.86,12.01,12.04,11.99,11.99,12.01,12.11,12.24,12.26,12.38,
+12.18,12.27,12.35,12.36,12.40,12.56,12.64,12.54,12.81,12.67,
+12.76,12.91,12.88,12.74,12.95,13.00,12.99,13.06,13.25,13.08,
+13.06,13.41,13.48,13.51,13.69,13.61,13.57,13.51,13.52,13.55,
+0.39,0.42,0.45,0.53,0.53,0.58,0.61,0.68,0.66,0.75,
+0.77,0.81,0.87,0.87,0.88,0.94,0.96,1.04,1.07,1.11,
+1.14,1.21,1.21,1.26,1.31,1.34,1.39,1.39,1.46,1.56,
+1.57,1.61,1.62,1.68,1.65,1.75,1.73,1.83,1.86,1.89,
+1.88,1.88,1.91,2.04,2.08,2.06,2.14,2.15,2.16,2.23,
+2.22,2.32,2.38,2.41,2.37,2.41,2.56,2.53,2.56,2.68,
+2.68,2.60,2.76,2.78,2.74,2.92,2.77,2.97,2.89,2.95,
+3.04,3.04,3.15,3.20,3.13,3.12,3.26,3.32,3.20,3.42,
+3.42,3.38,3.48,3.50,3.50,3.59,3.52,3.73,3.74,3.70,
+3.80,3.83,3.85,3.90,3.89,3.95,4.01,4.14,4.10,3.96,
+4.19,4.09,4.26,4.21,4.35,4.44,4.31,4.41,4.46,4.54,
+4.53,4.53,4.66,4.69,4.67,4.71,4.73,4.78,4.83,4.87,
+4.78,4.92,4.87,5.06,5.01,5.13,5.16,5.24,5.10,5.28,
+5.43,5.26,5.31,5.41,5.49,5.53,5.67,5.42,5.71,5.64,
+5.55,5.65,5.75,5.80,5.83,5.87,5.82,5.92,5.88,6.04,
+6.10,6.01,6.02,6.10,6.07,6.17,6.17,6.32,6.32,6.35,
+6.38,6.45,6.61,6.41,6.46,6.61,6.55,6.61,6.69,6.69,
+6.71,6.73,6.73,6.84,6.88,6.88,6.97,7.12,6.93,7.12,
+7.08,7.01,7.18,7.38,7.37,7.20,7.29,7.22,7.35,7.43,
+7.44,7.56,7.53,7.72,7.61,7.64,7.63,7.75,7.68,7.96,
+7.82,7.81,8.04,8.12,8.01,8.10,8.04,8.10,8.18,8.29,
+8.36,8.22,8.41,8.41,8.41,8.36,8.37,8.51,8.61,8.71,
+8.65,8.56,8.71,8.60,8.74,9.02,9.08,8.79,8.85,8.82,
+8.94,8.95,8.98,9.07,9.04,9.16,9.31,9.10,9.23,9.41,
+9.36,9.60,9.35,9.49,9.74,9.49,9.60,9.70,9.81,9.77,
+9.67,9.77,10.03,9.87,9.83,9.98,9.91,10.08,9.95,10.15,
+10.06,10.15,10.25,10.21,10.26,10.29,10.28,10.42,10.54,10.19,
+10.51,10.66,10.51,10.66,10.60,10.80,10.78,10.94,10.67,10.92,
+10.96,11.03,11.02,11.02,11.03,11.24,11.11,11.22,11.38,11.20,
+0.32,0.34,0.39,0.44,0.43,0.45,0.50,0.54,0.60,0.60,
+0.62,0.68,0.73,0.71,0.80,0.76,0.85,0.85,0.89,0.91,
+0.93,0.97,1.00,1.04,1.04,1.08,1.12,1.15,1.23,1.22,
+1.28,1.28,1.29,1.33,1.34,1.43,1.49,1.49,1.49,1.53,
+1.55,1.63,1.61,1.65,1.66,1.72,1.71,1.74,1.78,1.76,
+1.90,1.79,1.94,1.93,1.92,2.03,2.01,1.98,2.08,2.13,
+2.14,2.31,2.25,2.27,2.28,2.27,2.29,2.45,2.34,2.46,
+2.38,2.57,2.53,2.51,2.58,2.59,2.60,2.71,2.68,2.78,
+2.83,2.79,2.92,2.91,2.86,2.90,2.93,2.95,3.07,3.02,
+3.07,3.07,3.14,3.18,3.13,3.20,3.32,3.35,3.32,3.42,
+3.35,3.45,3.45,3.47,3.52,3.54,3.54,3.69,3.62,3.74,
+3.73,3.82,3.70,3.87,3.87,3.78,3.89,3.90,4.00,3.94,
+4.01,3.95,4.10,4.21,4.04,4.25,4.21,4.20,4.27,4.33,
+4.29,4.33,4.35,4.50,4.39,4.43,4.43,4.51,4.72,4.50,
+4.55,4.65,4.80,4.68,4.65,4.80,4.84,4.82,4.86,4.81,
+5.01,5.16,4.84,5.08,4.96,5.11,5.15,5.04,5.24,5.25,
+5.24,5.21,5.39,5.31,5.48,5.48,5.42,5.45,5.53,5.45,
+5.44,5.56,5.64,5.58,5.68,5.77,5.67,5.74,5.75,5.88,
+5.75,5.89,6.05,5.90,5.81,6.12,5.95,6.09,6.14,6.04,
+6.26,6.16,6.21,6.30,6.20,6.32,6.31,6.45,6.40,6.33,
+6.47,6.43,6.45,6.59,6.67,6.62,6.66,6.63,6.63,6.75,
+6.85,6.89,6.64,6.88,6.81,6.96,6.92,6.94,6.95,7.00,
+7.03,7.11,7.09,7.09,7.13,7.35,7.08,7.43,7.40,7.38,
+7.34,7.48,7.47,7.43,7.60,7.51,7.61,7.58,7.79,7.83,
+7.83,7.69,7.66,7.96,7.91,7.90,8.00,7.89,8.05,8.07,
+8.05,8.03,8.14,8.22,8.15,8.28,8.16,8.14,8.23,8.33,
+8.38,8.53,8.34,8.41,8.47,8.57,8.45,8.47,8.51,8.76,
+8.66,8.68,8.73,8.79,8.80,8.76,8.75,8.93,8.74,8.95,
+8.84,9.02,9.01,8.98,9.28,9.14,9.01,9.10,9.09,9.08,
+0.24,0.29,0.35,0.35,0.36,0.40,0.41,0.46,0.46,0.49,
+0.54,0.55,0.56,0.57,0.65,0.67,0.67,0.71,0.74,0.71,
+0.75,0.82,0.83,0.84,0.90,0.92,0.90,0.93,0.96,0.98,
+1.01,1.05,1.13,1.13,1.11,1.16,1.16,1.15,1.15,1.21,
+1.29,1.27,1.31,1.24,1.39,1.37,1.42,1.47,1.47,1.45,
+1.49,1.56,1.57,1.59,1.68,1.70,1.62,1.70,1.74,1.75,
+1.74,1.75,1.90,1.92,1.91,1.96,1.89,1.96,1.94,1.96,
+2.03,2.00,2.11,2.12,2.12,2.18,2.08,2.24,2.19,2.17,
+2.26,2.28,2.31,2.37,2.40,2.41,2.46,2.49,2.39,2.46,
+2.55,2.52,2.63,2.58,2.59,2.58,2.61,2.73,2.64,2.75,
+2.75,2.90,2.81,2.83,2.84,2.88,2.93,3.05,3.05,3.10,
+3.00,3.15,3.08,3.08,3.16,3.21,3.08,3.23,3.19,3.31,
+3.31,3.35,3.33,3.41,3.44,3.50,3.50,3.42,3.48,3.54,
+3.61,3.64,3.68,3.50,3.75,3.61,3.63,3.71,3.70,3.83,
+3.77,3.88,3.86,3.95,3.85,3.91,3.89,4.01,4.00,3.93,
+4.04,3.96,4.06,4.20,4.24,4.19,4.23,4.25,4.21,4.33,
+4.30,4.25,4.34,4.44,4.34,4.29,4.43,4.41,4.58,4.60,
+4.56,4.57,4.71,4.60,4.65,4.62,4.61,4.68,4.89,4.72,
+4.84,4.80,4.86,4.82,4.88,4.95,4.97,5.00,5.10,5.10,
+5.08,5.08,5.03,5.25,5.17,5.27,5.28,5.19,5.12,5.28,
+5.38,5.32,5.24,5.36,5.30,5.30,5.44,5.51,5.48,5.50,
+5.60,5.55,5.65,5.45,5.67,5.59,5.67,5.68,5.77,5.92,
+5.95,5.59,5.79,5.73,5.87,5.94,5.96,5.94,6.09,6.08,
+6.03,6.11,6.05,6.21,6.10,6.21,6.13,6.38,6.31,6.39,
+6.37,6.28,6.33,6.37,6.45,6.36,6.49,6.57,6.62,6.44,
+6.60,6.62,6.59,6.55,6.60,6.71,6.80,6.74,6.84,6.79,
+6.93,6.81,6.90,6.77,6.82,6.80,6.91,6.97,7.07,7.06,
+7.13,7.02,7.18,7.22,7.03,7.20,7.19,7.24,7.17,7.26,
+7.52,7.40,7.47,7.35,7.47,7.52,7.49,7.68,7.59,7.50,
+0.23,0.25,0.24,0.28,0.28,0.33,0.32,0.39,0.39,0.40,
+0.40,0.47,0.49,0.52,0.47,0.54,0.54,0.56,0.58,0.60,
+0.63,0.63,0.63,0.66,0.73,0.70,0.73,0.77,0.78,0.81,
+0.82,0.83,0.81,0.90,0.89,0.99,0.98,1.00,0.99,0.99,
+1.07,1.06,1.08,1.13,1.17,1.12,1.19,1.18,1.21,1.22,
+1.28,1.29,1.27,1.30,1.31,1.34,1.43,1.44,1.43,1.47,
+1.46,1.47,1.47,1.50,1.57,1.59,1.54,1.61,1.66,1.66,
+1.67,1.70,1.74,1.77,1.72,1.73,1.78,1.74,1.83,1.85,
+1.83,1.90,1.94,1.95,1.99,2.00,1.99,2.04,2.05,2.06,
+2.15,2.01,2.03,2.21,2.18,2.24,2.24,2.26,2.27,2.16,
+2.31,2.29,2.30,2.27,2.29,2.44,2.44,2.36,2.52,2.50,
+2.49,2.53,2.47,2.55,2.52,2.61,2.66,2.61,2.64,2.67,
+2.70,2.68,2.72,2.68,2.78,2.78,2.87,2.81,2.92,2.84,
+2.93,2.93,2.96,3.00,2.98,3.00,3.11,3.06,3.12,3.04,
+3.15,3.08,3.09,3.21,3.21,3.12,3.18,3.28,3.21,3.27,
+3.26,3.27,3.39,3.43,3.41,3.45,3.37,3.56,3.48,3.54,
+3.50,3.56,3.52,3.53,3.64,3.59,3.59,3.59,3.71,3.70,
+3.73,3.74,3.84,3.76,3.90,3.79,3.85,3.94,3.90,3.99,
+4.03,3.86,3.98,4.01,4.00,4.17,4.20,4.11,4.02,4.13,
+4.08,4.05,4.26,4.25,4.26,4.31,4.34,4.33,4.28,4.34,
+4.32,4.42,4.40,4.41,4.42,4.51,4.47,4.53,4.41,4.57,
+4.51,4.52,4.63,4.70,4.53,4.62,4.65,4.62,4.77,4.86,
+4.71,4.71,4.73,4.81,4.88,4.79,4.76,4.86,4.94,4.89,
+5.00,5.02,5.03,5.02,4.85,5.11,5.09,5.20,5.20,5.13,
+5.21,5.14,5.20,5.32,5.24,5.21,5.34,5.40,5.32,5.24,
+5.40,5.38,5.44,5.60,5.45,5.52,5.49,5.58,5.57,5.49,
+5.52,5.66,5.62,5.66,5.60,5.79,5.81,5.76,5.67,5.79,
+5.86,5.93,5.98,5.90,5.86,5.79,5.87,6.07,5.95,6.03,
+5.90,6.14,6.03,6.09,6.03,6.22,6.17,6.06,6.16,6.15,
+0.19,0.19,0.20,0.22,0.28,0.29,0.30,0.28,0.31,0.34,
+0.35,0.36,0.36,0.41,0.40,0.47,0.43,0.44,0.46,0.50,
+0.51,0.55,0.51,0.56,0.56,0.57,0.64,0.65,0.69,0.63,
+0.67,0.69,0.74,0.74,0.79,0.77,0.83,0.84,0.80,0.79,
+0.85,0.85,0.86,0.91,0.89,0.97,0.99,0.96,0.99,1.03,
+0.99,1.04,1.04,1.10,1.10,1.07,1.11,1.10,1.18,1.21,
+1.21,1.20,1.26,1.24,1.26,1.29,1.31,1.29,1.33,1.29,
+1.29,1.32,1.37,1.41,1.38,1.42,1.48,1.49,1.50,1.56,
+1.51,1.58,1.54,1.52,1.53,1.65,1.72,1.64,1.68,1.71,
+1.67,1.67,1.67,1.74,1.72,1.74,1.77,1.77,1.80,1.78,
+1.83,1.89,1.90,1.98,1.94,1.98,1.92,1.92,1.95,2.05,
+2.01,2.04,2.09,2.10,2.07,2.15,2.21,2.19,2.23,2.18,
+2.20,2.26,2.25,2.32,2.11,2.33,2.39,2.32,2.35,2.44,
+2.38,2.49,2.36,2.42,2.42,2.46,2.53,2.48,2.56,2.50,
+2.61,2.62,2.75,2.62,2.63,2.61,2.65,2.66,2.70,2.69,
+2.69,2.75,2.82,2.76,2.78,2.80,2.82,2.88,2.85,2.91,
+2.94,2.84,2.93,3.00,3.03,2.89,2.93,3.01,3.03,3.01,
+3.08,3.07,3.15,3.04,3.05,3.06,3.17,3.21,3.21,3.23,
+3.21,3.34,3.34,3.31,3.27,3.34,3.41,3.25,3.31,3.45,
+3.36,3.40,3.41,3.51,3.51,3.53,3.41,3.43,3.58,3.59,
+3.68,3.60,3.50,3.66,3.69,3.69,3.67,3.61,3.71,3.77,
+3.72,3.75,3.76,3.86,3.81,3.82,3.80,3.97,3.84,3.88,
+3.80,3.92,3.92,4.04,3.89,3.98,3.98,4.01,4.01,4.09,
+4.07,4.15,4.15,4.21,4.22,4.19,4.16,4.11,4.25,4.30,
+4.26,4.30,4.29,4.22,4.42,4.42,4.44,4.26,4.39,4.39,
+4.49,4.42,4.39,4.46,4.40,4.51,4.55,4.49,4.62,4.58,
+4.65,4.49,4.62,4.62,4.61,4.51,4.67,4.70,4.65,4.76,
+4.78,4.73,4.77,4.69,4.83,4.91,4.79,4.90,4.97,5.04,
+4.91,4.90,5.09,4.99,5.11,5.05,4.96,5.15,5.00,5.02,
+3.08,3.34,3.66,3.92,4.25,4.45,4.88,5.05,5.38,5.69,
+5.98,6.23,6.48,6.88,7.13,7.43,7.64,8.01,8.26,8.53,
+8.91,9.14,9.39,9.80,9.92,10.39,10.56,10.97,11.15,11.43,
+11.85,12.05,12.36,12.64,12.78,13.20,13.46,13.78,14.02,14.33,
+14.77,14.96,15.23,15.55,15.88,16.18,16.52,16.91,17.14,17.46,
+17.72,17.82,18.16,18.52,18.61,19.17,19.23,19.48,19.82,20.13,
+20.51,20.97,21.07,21.50,21.75,22.06,22.28,22.45,22.95,23.11,
+23.40,23.77,23.93,24.34,24.59,24.96,25.22,25.44,25.73,25.99,
+26.25,26.66,26.98,27.05,27.32,27.88,28.16,28.33,28.71,29.12,
+29.37,29.71,29.96,30.16,30.14,30.56,30.87,31.28,31.40,31.84,
+32.27,32.62,32.88,33.00,33.43,33.58,33.99,34.24,34.50,34.98,
+35.18,35.47,35.51,36.01,36.13,36.44,36.91,37.35,37.21,37.58,
+37.78,38.28,38.48,39.00,39.08,39.23,39.87,40.32,40.23,40.58,
+40.76,41.25,41.72,41.54,42.06,42.37,42.68,43.06,43.25,43.54,
+43.70,43.90,44.41,44.75,44.64,45.14,45.35,45.85,46.07,46.21,
+46.91,46.98,47.41,47.52,47.58,47.95,48.43,48.88,49.37,49.41,
+49.65,49.62,50.37,50.40,50.71,50.99,51.12,51.81,52.05,52.04,
+52.29,52.79,52.86,53.51,53.67,53.66,54.27,54.73,54.83,55.01,
+55.45,55.71,55.93,56.70,56.62,56.84,57.36,57.71,58.00,58.04,
+58.49,58.54,59.08,59.08,59.37,59.76,60.10,60.51,60.81,60.85,
+61.36,61.50,62.04,61.95,62.47,62.59,63.12,63.63,63.55,63.70,
+64.51,64.64,64.84,65.14,65.00,65.56,66.18,66.42,66.21,66.83,
+66.76,67.10,67.44,67.81,68.22,68.39,68.92,69.06,69.30,69.79,
+70.15,70.19,70.25,70.73,71.19,71.19,71.59,71.95,72.17,72.87,
+73.08,72.90,73.26,73.67,74.44,74.37,74.83,74.82,75.13,75.69,
+75.81,76.16,76.41,76.76,77.23,77.06,77.96,77.68,77.89,78.54,
+78.70,79.15,79.33,79.94,79.91,80.40,80.50,80.85,81.00,81.29,
+81.58,82.04,82.34,82.43,82.77,83.08,83.69,83.50,84.00,84.07,
+84.47,84.45,84.66,85.34,85.65,85.84,86.40,86.71,86.99,87.08,
+2.54,2.76,3.06,3.21,3.56,3.66,3.96,4.15,4.48,4.65,
+5.02,5.13,5.44,5.64,5.90,6.14,6.45,6.53,6.83,7.13,
+7.44,7.71,7.81,8.04,8.30,8.65,8.79,9.07,9.23,9.59,
+9.81,9.98,10.16,10.66,10.82,10.82,11.22,11.49,11.68,11.97,
+12.19,12.33,12.73,12.83,13.16,13.41,13.71,13.87,14.03,14.27,
+14.44,14.82,15.23,15.23,15.68,15.84,16.00,16.30,16.57,16.95,
+17.03,17.27,17.43,17.68,18.16,18.21,18.29,18.78,18.87,19.14,
+19.53,19.70,19.91,20.12,20.52,20.49,20.98,21.17,21.34,21.61,
+21.87,22.21,22.52,22.55,22.99,22.90,23.37,23.57,24.04,24.33,
+24.16,24.48,24.78,24.86,25.01,25.45,25.67,25.93,26.24,26.46,
+26.73,26.88,27.07,27.17,27.57,27.87,28.18,28.60,28.53,29.00,
+29.12,29.36,29.35,29.86,29.99,30.48,30.65,30.68,30.96,31.41,
+31.46,31.62,32.07,32.23,32.42,32.63,32.96,33.11,33.35,33.67,
+33.88,34.18,34.32,34.66,35.08,35.37,35.40,35.58,35.89,36.06,
+36.30,36.50,36.76,37.11,37.31,37.53,37.95,37.93,38.28,38.42,
+38.98,38.89,39.21,39.43,39.75,39.71,40.29,40.58,40.46,41.03,
+41.19,41.25,41.41,42.01,42.49,42.23,42.53,42.74,43.24,43.30,
+43.54,43.98,43.94,44.20,44.52,44.84,45.16,45.44,45.30,45.86,
+46.07,46.54,46.52,46.63,46.67,47.31,47.48,47.54,48.12,48.29,
+48.28,48.59,48.81,48.73,49.22,49.87,50.07,50.15,50.05,50.65,
+51.03,51.11,51.39,51.81,51.65,51.94,52.21,52.78,52.84,52.89,
+53.17,53.89,53.52,53.89,54.30,54.83,54.82,55.02,55.10,55.34,
+55.73,55.69,56.17,56.24,56.37,56.80,57.14,57.43,57.72,57.64,
+58.04,58.31,58.57,58.73,59.16,59.37,59.59,59.95,59.87,60.34,
+60.34,60.91,60.88,61.19,61.14,61.70,62.38,62.26,62.42,62.86,
+62.58,63.23,63.42,63.89,63.62,63.93,64.22,64.69,64.61,64.96,
+65.28,65.91,65.63,66.23,66.33,66.68,66.58,67.00,67.63,67.54,
+68.01,67.86,68.14,68.63,68.58,68.88,68.60,69.36,69.81,69.76,
+70.48,70.57,70.65,70.80,71.15,71.50,71.64,71.75,71.98,72.29,
+2.05,2.38,2.45,2.67,2.89,3.04,3.27,3.52,3.69,3.98,
+4.09,4.38,4.51,4.72,4.89,5.11,5.24,5.44,5.70,5.88,
+6.16,6.25,6.52,6.75,6.90,7.04,7.22,7.54,7.76,8.03,
+8.10,8.37,8.58,8.79,9.00,9.12,9.34,9.57,9.82,9.87,
+10.21,10.31,10.55,10.77,10.98,11.05,11.30,11.51,11.53,11.90,
+12.13,12.32,12.44,12.61,12.95,13.00,13.32,13.56,13.62,13.89,
+14.13,14.45,14.62,14.65,14.91,15.03,15.28,15.52,15.74,16.14,
+16.13,16.36,16.72,16.53,16.76,17.06,17.17,17.59,17.79,17.95,
+18.04,18.36,18.57,18.69,19.06,19.07,19.23,19.34,19.70,19.89,
+20.18,20.29,20.52,20.75,21.08,21.40,21.29,21.62,21.82,21.84,
+22.11,22.41,22.60,22.62,22.99,23.17,23.39,23.40,23.70,23.80,
+24.32,24.28,24.73,24.39,24.94,25.23,25.33,25.65,25.82,25.91,
+26.25,26.31,26.37,26.72,26.96,27.19,27.23,27.53,27.78,27.73,
+28.16,28.17,28.39,28.63,29.05,29.00,29.58,29.61,29.87,29.85,
+30.25,30.52,30.54,30.62,30.62,31.26,31.28,31.49,31.82,31.89,
+32.00,32.48,32.56,32.88,33.16,33.12,33.57,33.63,33.64,34.31,
+34.18,34.48,34.27,34.92,34.91,34.96,35.24,35.62,35.85,35.96,
+36.17,36.45,36.72,36.87,36.87,36.91,37.38,37.65,37.93,37.79,
+38.29,38.41,38.67,38.73,39.19,39.26,39.22,39.33,39.81,39.77,
+40.14,40.53,40.64,40.94,40.88,41.09,41.28,41.66,42.00,41.98,
+42.17,42.53,42.69,42.59,43.24,43.41,43.34,43.44,43.74,44.07,
+44.23,44.34,44.49,44.58,44.98,45.35,45.55,45.71,45.62,46.02,
+46.29,46.71,46.41,46.71,47.05,46.90,47.71,47.83,47.80,48.08,
+48.29,48.73,48.74,48.72,48.91,49.17,49.46,49.42,50.38,50.21,
+50.10,50.67,50.75,50.90,50.87,51.31,51.34,51.43,51.65,52.00,
+52.58,52.49,52.76,52.66,53.01,53.27,53.28,53.19,53.81,53.67,
+54.35,54.47,54.73,54.75,54.93,54.91,55.75,55.69,55.89,56.19,
+56.14,56.62,56.52,56.83,57.32,57.19,57.30,57.57,57.72,57.88,
+58.17,58.44,58.63,58.67,58.62,59.23,59.44,59.78,60.00,60.24,
+1.72,1.89,2.06,2.25,2.42,2.62,2.72,2.98,3.11,3.19,
+3.41,3.58,3.70,3.97,4.10,4.24,4.31,4.57,4.65,4.90,
+5.12,5.28,5.39,5.61,5.74,5.94,6.04,6.27,6.34,6.51,
+6.64,6.95,7.05,7.25,7.36,7.53,7.65,7.86,8.04,8.18,
+8.34,8.44,8.61,8.90,9.02,9.23,9.43,9.65,9.72,9.81,
+10.06,10.20,10.35,10.58,10.74,10.96,11.06,11.30,11.35,11.48,
+11.86,11.86,12.19,12.24,12.44,12.48,12.85,12.96,13.14,13.17,
+13.30,13.65,13.62,13.97,13.95,14.32,14.31,14.68,14.72,14.80,
+15.02,15.25,15.48,15.58,15.79,15.87,16.15,16.29,16.32,16.50,
+16.82,16.95,17.06,17.15,17.39,17.48,17.66,17.98,17.98,18.17,
+18.54,18.72,18.72,18.74,19.19,19.21,19.39,19.64,19.66,19.72,
+19.94,20.24,20.34,20.43,20.76,20.88,20.95,21.07,21.34,21.53,
+21.82,22.02,22.00,22.22,22.38,22.49,22.62,22.69,23.09,23.13,
+23.19,23.60,23.66,23.91,24.00,24.43,24.37,24.35,24.76,24.88,
+25.02,25.02,25.31,25.73,25.82,25.90,25.96,26.25,26.04,26.41,
+26.71,26.96,27.13,27.22,27.00,27.68,27.83,27.88,27.97,28.09,
+28.33,28.50,28.65,28.71,28.88,29.05,29.26,29.50,29.83,29.90,
+30.15,30.15,30.42,30.68,30.36,31.05,31.03,31.24,31.42,31.41,
+31.81,31.77,31.77,31.95,32.30,32.64,32.61,32.87,32.98,33.25,
+33.48,33.60,33.52,33.94,33.97,34.19,34.30,34.52,34.61,34.74,
+34.92,35.19,35.42,35.52,35.67,35.97,36.02,35.96,36.52,36.58,
+36.95,36.83,37.18,37.32,37.35,37.45,37.63,37.74,37.92,38.32,
+38.40,38.72,38.72,38.99,39.15,39.43,39.11,39.51,39.73,39.79,
+39.76,39.98,40.33,40.52,40.61,40.72,40.83,41.11,41.18,41.47,
+41.58,41.75,41.93,42.15,42.15,42.74,42.87,42.90,43.06,42.96,
+43.51,43.70,43.47,43.72,43.99,44.12,44.19,44.59,44.67,44.66,
+44.78,45.02,45.44,45.14,45.57,45.89,46.05,46.09,46.11,46.37,
+46.84,46.83,46.69,47.01,47.35,47.27,47.60,48.12,47.89,48.07,
+48.41,48.45,48.65,48.91,48.73,49.12,48.88,49.45,50.09,50.03,
+1.40,1.59,1.72,1.88,2.00,2.15,2.26,2.40,2.60,2.68,
+2.84,3.01,3.08,3.24,3.31,3.54,3.68,3.77,3.98,4.14,
+4.27,4.29,4.53,4.58,4.71,4.98,4.98,5.24,5.24,5.41,
+5.58,5.62,5.84,6.11,6.15,6.26,6.31,6.48,6.62,6.85,
+7.00,7.06,7.14,7.36,7.45,7.61,7.88,7.88,8.03,8.25,
+8.28,8.59,8.70,8.77,8.95,8.97,9.27,9.43,9.45,9.64,
+9.79,9.87,9.98,10.11,10.27,10.35,10.55,10.59,10.97,11.03,
+11.17,11.19,11.45,11.58,11.72,11.76,11.83,12.09,12.15,12.40,
+12.53,12.68,12.68,12.86,13.02,13.18,13.32,13.46,13.59,13.81,
+13.94,13.87,14.19,14.27,14.60,14.55,14.66,14.86,14.95,15.19,
+15.26,15.30,15.65,15.79,15.86,15.88,15.92,16.27,16.22,16.43,
+16.56,16.75,16.71,17.23,17.13,17.32,17.40,17.64,17.69,18.00,
+17.95,18.18,18.25,18.55,18.49,18.79,18.89,18.97,19.21,19.46,
+19.55,19.63,19.57,19.75,19.77,19.91,20.32,20.40,20.55,20.56,
+20.87,20.57,21.06,21.04,21.07,21.38,21.21,21.91,21.93,21.92,
+22.34,22.34,22.63,22.57,22.72,22.92,22.88,23.09,23.27,23.30,
+23.64,23.63,23.91,23.84,24.02,24.18,24.36,24.82,24.55,24.86,
+25.14,25.25,25.26,25.12,25.52,25.62,25.51,25.82,25.96,26.23,
+26.25,26.49,26.55,26.82,26.86,26.95,27.16,27.10,27.34,27.39,
+27.56,27.96,27.77,28.12,28.13,28.40,28.34,28.51,28.97,29.04,
+29.02,29.11,29.56,29.45,29.54,29.77,29.89,30.02,30.23,30.25,
+30.35,30.68,30.97,30.87,31.01,31.03,31.25,31.47,31.43,31.93,
+31.98,31.66,32.08,31.96,32.20,32.62,32.50,32.64,33.02,33.00,
+33.49,33.43,33.51,33.43,33.57,34.02,34.03,34.17,34.30,34.92,
+34.46,34.44,34.90,34.98,34.95,35.34,35.30,35.47,35.83,36.00,
+35.90,36.27,36.20,36.04,36.49,36.65,36.61,36.94,37.22,37.06,
+37.41,37.35,37.77,37.54,37.87,37.82,38.22,38.12,38.41,38.36,
+38.83,38.98,38.81,38.98,39.21,39.23,39.60,39.44,39.75,40.20,
+40.15,39.78,40.38,40.75,40.92,40.92,40.59,41.14,41.24,41.63,
+1.17,1.31,1.47,1.52,1.69,1.80,1.92,2.04,2.12,2.16,
+2.38,2.43,2.55,2.73,2.76,2.99,3.04,3.19,3.30,3.39,
+3.48,3.66,3.70,3.89,3.90,4.13,4.19,4.30,4.48,4.59,
+4.66,4.83,4.88,4.98,5.04,5.23,5.28,5.39,5.52,5.69,
+5.86,5.84,5.95,6.13,6.25,6.30,6.34,6.56,6.57,6.82,
+6.98,7.11,7.21,7.28,7.44,7.46,7.65,7.69,7.82,8.03,
+8.06,8.17,8.31,8.46,8.53,8.61,8.83,8.69,9.07,9.19,
+9.22,9.27,9.53,9.64,9.71,9.85,9.98,9.98,10.10,10.18,
+10.28,10.35,10.56,10.61,10.76,10.93,11.07,11.09,11.24,11.43,
+11.40,11.62,11.76,11.71,11.98,12.06,12.20,12.39,12.33,12.64,
+12.58,12.78,12.89,12.84,12.96,13.34,13.46,13.50,13.64,13.79,
+13.76,13.87,14.16,14.49,14.10,14.55,14.68,14.64,14.65,14.96,
+14.79,15.10,15.24,15.38,15.27,15.65,15.56,15.91,15.98,15.97,
+16.02,16.29,16.22,16.47,16.59,16.77,16.91,16.87,17.01,16.98,
+17.32,17.64,17.56,17.63,17.60,17.82,18.00,18.09,18.20,18.32,
+18.38,18.57,18.64,18.65,18.88,18.87,19.01,19.22,19.13,19.43,
+19.45,19.62,19.90,19.98,19.86,20.18,20.22,20.09,20.36,20.77,
+20.70,20.89,20.91,20.98,21.15,21.06,21.11,21.50,21.63,21.66,
+21.76,22.21,22.08,22.29,22.32,22.43,22.49,22.76,22.78,23.00,
+23.20,22.88,23.06,23.40,23.45,23.55,23.58,23.82,23.71,23.98,
+24.29,24.13,24.34,24.40,24.70,24.82,24.71,24.93,25.06,25.03,
+25.34,25.23,25.30,25.64,25.81,25.93,25.91,25.88,26.28,26.14,
+26.39,26.64,26.68,26.66,26.92,27.16,27.13,27.19,27.41,27.52,
+27.70,27.82,27.73,28.03,28.04,28.09,28.36,28.28,28.36,28.59,
+28.70,28.73,28.88,28.83,29.26,29.24,29.53,29.23,29.44,29.86,
+29.77,29.71,30.14,30.22,30.08,30.23,30.53,30.50,30.72,30.78,
+30.88,31.26,31.20,31.18,31.33,31.42,31.81,31.72,32.04,31.70,
+32.25,32.15,32.47,32.34,32.58,32.78,32.81,32.97,33.10,33.32,
+32.96,33.07,33.45,33.59,33.77,33.99,34.17,34.23,34.59,34.35,
+1.05,1.11,1.18,1.30,1.42,1.51,1.64,1.69,1.83,1.87,
+1.95,2.07,2.14,2.21,2.28,2.45,2.54,2.60,2.78,2.83,
+2.87,3.04,3.07,3.19,3.34,3.42,3.51,3.49,3.62,3.69,
+3.81,3.88,4.14,4.12,4.20,4.37,4.42,4.42,4.57,4.67,
+4.80,4.94,4.93,5.10,5.11,5.30,5.43,5.37,5.61,5.70,
+5.79,5.82,6.03,6.07,6.16,6.23,6.33,6.41,6.46,6.67,
+6.62,6.64,6.78,7.08,7.10,7.20,7.32,7.42,7.49,7.49,
+7.52,7.72,7.84,8.00,8.14,8.18,8.35,8.33,8.33,8.53,
+8.45,8.62,9.01,8.86,8.93,9.07,9.31,9.32,9.45,9.37,
+9.64,9.69,9.84,9.88,9.94,10.05,10.25,10.25,10.30,10.47,
+10.54,10.65,10.73,10.78,11.05,11.08,10.90,11.15,11.40,11.34,
+11.44,11.59,11.63,11.78,11.83,11.83,12.10,12.12,12.33,12.33,
+12.51,12.53,12.65,12.54,12.61,12.85,12.76,13.24,13.32,13.29,
+13.32,13.46,13.41,13.50,13.57,13.84,13.93,13.95,14.25,14.21,
+14.45,14.35,14.40,14.48,14.59,14.75,14.88,14.79,15.08,15.12,
+15.16,15.46,15.41,15.54,15.68,15.89,15.84,15.87,16.00,16.15,
+16.26,16.45,16.24,16.57,16.61,16.84,16.90,16.93,16.76,16.85,
+17.07,17.24,17.21,17.44,17.64,17.54,17.63,18.02,17.95,18.05,
+18.17,18.37,18.50,18.35,18.30,18.51,18.46,18.74,18.99,18.89,
+19.19,19.11,19.29,19.16,19.52,19.38,19.64,19.63,19.94,19.85,
+20.01,20.22,20.16,20.26,20.46,20.42,20.72,20.76,20.80,20.93,
+21.01,21.08,21.17,21.24,21.45,21.65,21.56,21.53,21.76,21.99,
+21.82,21.94,22.03,22.31,22.14,22.47,22.54,22.61,22.69,22.70,
+22.66,22.87,23.22,23.40,23.29,23.27,23.39,23.66,23.65,23.77,
+23.59,23.93,24.15,24.13,24.18,24.30,24.36,24.30,24.56,24.58,
+24.74,24.85,24.90,24.91,25.08,25.21,25.37,25.40,25.52,25.67,
+25.70,25.81,25.83,26.11,26.08,26.27,26.16,26.38,26.31,26.55,
+26.73,26.82,26.81,26.84,26.91,27.29,27.34,27.29,27.45,27.56,
+27.67,27.66,27.69,27.72,28.27,28.08,28.08,28.40,28.25,28.44,
+0.82,0.91,1.04,1.07,1.12,1.18,1.27,1.38,1.42,1.56,
+1.53,1.74,1.84,1.88,1.90,1.95,1.97,2.26,2.26,2.31,
+2.34,2.49,2.59,2.64,2.80,2.80,2.98,3.04,2.96,3.16,
+3.23,3.26,3.40,3.46,3.50,3.57,3.62,3.72,3.90,3.98,
+3.99,4.10,4.07,4.28,4.32,4.42,4.44,4.45,4.69,4.80,
+4.79,4.86,5.07,5.05,5.22,5.20,5.19,5.17,5.47,5.51,
+5.51,5.62,5.70,5.81,5.86,5.90,6.01,6.16,6.14,6.31,
+6.34,6.37,6.49,6.57,6.72,6.70,6.62,6.95,6.88,7.20,
+7.08,7.29,7.38,7.24,7.55,7.47,7.68,7.81,7.85,7.81,
+7.93,8.10,8.22,8.19,8.24,8.30,8.42,8.48,8.76,8.57,
+8.65,8.68,8.86,8.95,9.01,8.97,9.24,9.25,9.45,9.50,
+9.56,9.81,9.72,9.86,9.72,9.94,10.17,10.14,10.20,10.20,
+10.38,10.44,10.47,10.57,10.78,10.52,10.68,10.95,10.88,11.05,
+11.12,11.09,11.32,11.25,11.49,11.51,11.56,11.76,11.79,11.76,
+11.73,11.97,12.09,12.11,12.15,12.41,12.37,12.57,12.43,12.71,
+12.65,12.71,12.84,12.89,12.87,12.98,13.15,13.27,13.39,13.37,
+13.44,13.73,13.68,13.62,13.93,13.93,14.05,13.94,14.20,14.37,
+14.16,14.27,14.47,14.44,14.55,14.76,14.65,14.78,14.91,15.03,
+15.27,15.11,15.20,15.51,15.22,15.35,15.67,15.55,15.67,15.81,
+15.71,15.93,15.84,16.14,16.12,16.11,16.43,16.32,16.30,16.59,
+16.58,16.79,16.68,17.18,16.82,17.00,17.03,17.24,17.34,17.44,
+17.63,17.38,17.65,17.52,17.81,17.84,18.01,17.82,17.76,18.16,
+18.07,18.14,18.43,18.63,18.46,18.69,18.79,18.98,18.77,18.93,
+18.94,19.06,19.21,19.18,19.32,19.40,19.60,19.58,19.39,19.67,
+19.75,19.82,19.86,20.13,20.03,20.24,20.25,20.21,20.46,20.55,
+20.41,20.43,20.66,20.89,21.07,20.89,20.88,21.23,21.22,21.17,
+21.20,21.46,21.60,21.53,21.57,22.01,21.53,22.07,21.97,22.01,
+22.01,22.29,22.33,22.25,22.34,22.58,22.46,22.75,22.64,23.11,
+22.88,22.96,23.11,23.07,23.31,23.25,23.45,23.46,23.44,23.64,
+0.70,0.76,0.82,0.86,0.93,1.05,1.09,1.11,1.21,1.26,
+1.34,1.43,1.41,1.56,1.63,1.71,1.75,1.76,1.82,1.94,
+2.04,2.07,2.17,2.16,2.22,2.35,2.39,2.41,2.54,2.53,
+2.68,2.84,2.81,2.86,2.90,2.96,3.00,3.15,3.29,3.37,
+3.29,3.39,3.37,3.67,3.49,3.62,3.66,3.71,3.79,3.93,
+4.00,3.98,4.04,4.30,4.20,4.21,4.29,4.49,4.56,4.60,
+4.56,4.63,4.74,4.74,4.98,4.94,5.02,5.07,5.09,5.21,
+5.33,5.28,5.37,5.43,5.49,5.50,5.64,5.77,5.82,5.88,
+5.94,5.90,6.01,6.08,6.14,6.22,6.41,6.39,6.54,6.54,
+6.68,6.75,6.61,6.66,6.85,6.84,6.93,6.98,7.23,7.23,
+7.13,7.24,7.24,7.47,7.37,7.56,7.66,7.77,7.76,8.07,
+7.79,7.99,8.07,8.11,8.12,8.31,8.20,8.30,8.37,8.38,
+8.51,8.52,8.68,8.84,8.81,8.88,9.12,8.91,8.97,9.21,
+9.22,9.29,9.31,9.49,9.58,9.59,9.62,9.69,9.62,9.82,
+9.82,9.87,9.90,10.06,10.14,10.31,10.35,10.54,10.29,10.38,
+10.67,10.50,10.73,10.59,10.90,10.98,10.93,10.98,10.94,11.15,
+11.14,11.23,11.40,11.31,11.51,11.57,11.63,11.72,11.79,11.70,
+11.83,12.03,11.92,12.07,12.10,12.14,12.26,12.28,12.22,12.46,
+12.40,12.46,12.64,12.79,12.79,12.72,12.69,12.95,13.01,13.07,
+13.14,13.17,13.38,13.34,13.43,13.27,13.43,13.56,13.63,13.56,
+13.75,13.96,13.90,14.02,13.91,14.11,14.35,14.24,14.29,14.26,
+14.42,14.35,14.64,14.69,14.55,14.71,14.94,14.68,14.77,14.99,
+15.35,15.17,15.41,15.30,15.40,15.34,15.50,15.53,15.35,15.68,
+15.70,15.79,15.87,15.98,16.08,16.03,16.23,16.25,16.24,16.27,
+16.32,16.45,16.58,16.69,16.63,16.91,16.90,16.88,16.78,17.00,
+17.10,17.16,17.07,17.07,17.32,17.30,17.48,17.58,17.63,17.56,
+17.75,17.70,17.81,17.89,18.03,18.01,17.92,18.31,18.36,18.28,
+18.37,18.50,18.55,18.44,18.56,18.47,18.88,18.71,18.78,19.02,
+19.10,19.11,19.08,19.47,19.04,19.45,19.35,19.38,19.45,19.62,
+0.55,0.61,0.70,0.73,0.78,0.85,0.94,0.97,1.05,1.04,
+1.15,1.14,1.26,1.27,1.36,1.25,1.44,1.48,1.57,1.62,
+1.69,1.74,1.81,1.78,1.84,1.94,2.02,2.05,2.08,2.14,
+2.24,2.19,2.30,2.43,2.42,2.49,2.47,2.55,2.59,2.72,
+2.73,2.84,2.81,2.87,2.92,3.02,3.04,3.14,3.24,3.10,
+3.30,3.35,3.29,3.41,3.46,3.55,3.59,3.62,3.91,3.76,
+3.93,3.99,4.05,3.94,4.09,4.14,4.18,4.22,4.33,4.36,
+4.35,4.36,4.38,4.47,4.58,4.59,4.72,4.72,4.88,4.87,
+5.03,4.97,5.01,5.03,5.25,5.18,5.24,5.36,5.32,5.38,
+5.55,5.50,5.63,5.69,5.67,5.66,5.87,5.86,6.00,5.86,
+6.11,6.04,6.27,6.07,6.13,6.34,6.30,6.39,6.52,6.53,
+6.48,6.50,6.68,6.69,6.79,6.89,7.01,6.90,6.89,7.05,
+7.04,7.27,7.19,7.32,7.20,7.37,7.23,7.41,7.59,7.66,
+7.60,7.74,7.64,7.81,7.88,7.91,8.10,8.12,8.12,8.17,
+8.26,8.31,8.33,8.30,8.39,8.43,8.51,8.68,8.72,8.65,
+8.68,8.85,8.91,8.82,8.88,8.96,9.00,9.10,9.05,9.29,
+9.21,9.28,9.48,9.22,9.47,9.71,9.73,9.71,9.71,9.77,
+9.76,9.76,9.94,9.96,9.94,10.08,10.21,10.23,10.39,10.21,
+10.41,10.37,10.47,10.48,10.53,10.56,10.74,10.77,10.78,10.89,
+10.91,10.92,11.05,10.97,11.21,11.02,11.20,11.43,11.17,11.49,
+11.50,11.47,11.39,11.58,11.61,11.67,11.83,11.79,11.89,11.91,
+12.08,12.09,12.21,12.21,12.11,12.25,12.37,12.26,12.34,12.53,
+12.58,12.57,12.59,12.54,12.80,12.88,12.84,12.78,13.06,13.11,
+13.28,13.06,13.17,13.24,13.38,13.35,13.49,13.34,13.59,13.56,
+13.53,13.54,13.81,13.63,13.79,13.97,14.02,14.07,14.12,13.94,
+14.14,14.33,14.35,14.52,14.40,14.40,14.64,14.70,14.64,14.53,
+14.59,14.69,14.78,14.71,14.94,14.94,15.08,15.19,15.21,15.05,
+15.37,15.16,15.33,15.34,15.44,15.60,15.60,15.57,15.71,15.72,
+15.96,15.96,15.87,15.95,15.99,15.93,16.17,16.07,16.15,16.36,
+0.50,0.52,0.59,0.65,0.66,0.67,0.76,0.77,0.86,0.90,
+0.94,1.01,0.95,1.07,1.07,1.19,1.18,1.27,1.30,1.34,
+1.36,1.41,1.48,1.46,1.56,1.62,1.64,1.74,1.69,1.80,
+1.92,1.89,1.98,2.03,1.98,2.09,2.09,2.11,2.18,2.21,
+2.38,2.34,2.33,2.48,2.41,2.52,2.55,2.56,2.60,2.68,
+2.68,2.83,2.84,2.84,2.90,2.88,3.00,3.04,3.14,3.06,
+3.22,3.19,3.22,3.30,3.37,3.43,3.52,3.50,3.62,3.70,
+3.53,3.62,3.69,3.69,3.84,3.73,3.92,4.03,4.04,4.04,
+4.03,4.12,4.25,4.24,4.31,4.29,4.46,4.49,4.46,4.42,
+4.51,4.59,4.62,4.76,4.72,4.81,4.92,4.88,5.05,4.86,
+4.98,5.05,5.02,5.16,5.27,5.18,5.25,5.37,5.38,5.37,
+5.43,5.45,5.47,5.53,5.46,5.62,5.70,5.67,5.79,5.81,
+5.91,6.10,6.16,6.07,6.02,6.17,6.21,6.08,6.15,6.27,
+6.26,6.45,6.54,6.49,6.46,6.61,6.59,6.78,6.74,6.80,
+6.72,6.98,6.96,6.96,6.99,7.00,7.21,7.07,7.00,7.26,
+7.24,7.33,7.38,7.28,7.33,7.50,7.40,7.63,7.69,7.55,
+7.84,7.60,7.68,7.86,7.88,7.92,7.96,8.21,7.90,8.27,
+8.09,8.13,8.34,8.32,8.39,8.43,8.39,8.42,8.55,8.60,
+8.64,8.56,8.65,8.75,8.73,8.78,8.79,9.03,8.95,8.98,
+9.06,9.08,9.20,9.28,9.25,9.23,9.53,9.35,9.33,9.39,
+9.68,9.65,9.76,9.61,9.49,9.59,9.83,9.68,9.94,9.96,
+10.05,10.07,10.02,10.20,10.08,10.05,10.19,10.09,10.34,10.33,
+10.26,10.38,10.41,10.44,10.54,10.70,10.56,10.65,10.81,10.85,
+10.90,10.94,10.96,10.94,10.95,11.01,11.25,11.09,11.10,11.35,
+11.29,11.25,11.47,11.46,11.48,11.67,11.60,11.69,11.80,11.66,
+11.66,11.90,11.87,11.84,11.81,12.01,11.93,12.30,12.03,12.12,
+12.01,12.35,12.47,12.27,12.24,12.50,12.41,12.39,12.58,12.62,
+12.80,12.49,13.04,12.70,13.05,12.83,12.90,12.89,13.10,13.12,
+13.20,13.16,13.32,13.06,13.12,13.42,13.46,13.37,13.47,13.45,
+0.41,0.46,0.47,0.54,0.53,0.56,0.63,0.65,0.71,0.76,
+0.75,0.78,0.83,0.86,0.93,0.97,1.00,1.00,1.09,1.09,
+1.13,1.15,1.24,1.21,1.30,1.32,1.35,1.38,1.46,1.49,
+1.51,1.58,1.54,1.60,1.68,1.70,1.72,1.76,1.87,1.90,
+1.84,1.92,1.94,2.03,2.02,2.07,2.11,2.08,2.18,2.22,
+2.32,2.33,2.30,2.35,2.40,2.48,2.48,2.48,2.55,2.67,
+2.59,2.69,2.68,2.75,2.85,2.84,2.86,2.91,3.05,2.88,
+2.98,3.09,3.17,3.13,3.21,3.24,3.31,3.31,3.28,3.37,
+3.39,3.33,3.44,3.42,3.48,3.57,3.64,3.64,3.65,3.75,
+3.84,3.83,3.91,3.89,4.01,4.06,4.05,4.09,4.18,4.14,
+4.10,4.09,4.21,4.42,4.29,4.37,4.36,4.42,4.44,4.38,
+4.50,4.51,4.72,4.72,4.66,4.71,4.74,4.73,4.83,4.85,
+4.96,4.93,5.00,4.93,5.09,5.05,5.11,5.15,5.26,5.18,
+5.28,5.21,5.29,5.36,5.47,5.33,5.48,5.51,5.50,5.50,
+5.68,5.67,5.70,5.76,5.76,5.88,5.68,5.76,5.95,5.95,
+5.91,5.98,6.03,6.15,6.13,6.30,6.26,6.17,6.39,6.33,
+6.29,6.34,6.44,6.52,6.54,6.58,6.51,6.58,6.64,6.74,
+6.73,6.66,6.82,6.76,7.00,6.95,6.91,7.14,7.08,7.08,
+7.11,7.13,7.08,7.26,7.22,7.32,7.50,7.43,7.40,7.60,
+7.54,7.55,7.55,7.78,7.81,7.71,7.75,7.65,7.69,7.88,
+7.93,7.90,7.95,7.97,8.06,8.05,7.98,8.24,8.20,8.19,
+8.34,8.40,8.46,8.29,8.35,8.42,8.54,8.41,8.44,8.70,
+8.77,8.63,8.71,8.96,8.78,8.65,8.80,8.85,9.01,9.14,
+8.94,8.92,9.07,9.09,9.26,9.27,9.22,9.30,9.19,9.26,
+9.48,9.43,9.49,9.36,9.44,9.46,9.76,9.64,9.56,9.71,
+9.80,9.83,9.73,9.93,9.82,9.94,10.06,10.07,10.10,10.13,
+10.04,10.22,10.27,10.43,10.30,10.45,10.46,10.30,10.48,10.57,
+10.56,10.48,10.45,10.47,10.58,10.77,10.77,10.82,10.71,10.78,
+11.07,10.99,11.06,10.91,11.12,10.92,11.00,11.19,11.26,11.18,
+0.33,0.38,0.40,0.41,0.47,0.49,0.52,0.53,0.53,0.62,
+0.64,0.63,0.68,0.77,0.78,0.82,0.83,0.88,0.89,0.97,
+0.93,1.05,1.05,1.04,1.08,1.10,1.18,1.13,1.17,1.20,
+1.23,1.26,1.28,1.35,1.40,1.39,1.43,1.41,1.49,1.54,
+1.55,1.57,1.56,1.65,1.73,1.69,1.73,1.79,1.78,1.77,
+1.84,1.90,1.93,1.99,2.03,2.09,2.09,2.08,2.04,2.19,
+2.21,2.17,2.24,2.35,2.29,2.42,2.31,2.45,2.41,2.48,
+2.58,2.48,2.60,2.56,2.57,2.65,2.71,2.72,2.74,2.75,
+2.80,2.88,2.86,2.90,2.98,2.97,2.94,3.11,3.10,3.18,
+3.15,3.09,3.19,3.27,3.20,3.34,3.33,3.37,3.43,3.46,
+3.42,3.43,3.48,3.53,3.55,3.63,3.67,3.65,3.71,3.77,
+3.82,3.76,3.80,3.84,3.79,3.89,4.01,3.91,3.93,4.02,
+4.12,4.08,4.08,4.16,4.21,4.15,4.27,4.31,4.38,4.37,
+4.42,4.34,4.37,4.54,4.59,4.46,4.47,4.49,4.69,4.61,
+4.73,4.60,4.83,4.70,4.82,4.96,4.75,4.92,4.90,4.98,
+4.99,5.06,5.07,5.16,5.18,5.05,5.17,5.21,5.32,5.30,
+5.17,5.34,5.34,5.31,5.28,5.48,5.52,5.42,5.57,5.67,
+5.67,5.42,5.82,5.63,5.75,5.75,5.94,5.82,5.91,5.83,
+5.98,5.87,5.90,6.05,6.04,6.27,6.02,6.01,5.98,6.19,
+6.23,6.35,6.29,6.35,6.43,6.35,6.47,6.45,6.38,6.55,
+6.42,6.55,6.52,6.63,6.64,6.75,6.80,6.72,6.80,6.89,
+6.91,6.88,6.96,6.99,6.98,7.06,6.99,6.92,7.10,7.08,
+7.23,7.17,7.20,7.26,7.26,7.29,7.33,7.43,7.37,7.44,
+7.54,7.46,7.61,7.72,7.56,7.54,7.78,7.74,7.64,7.81,
+7.78,7.85,7.81,7.85,7.69,8.00,7.84,7.94,8.10,8.23,
+8.07,8.13,8.25,8.12,8.26,7.99,8.17,8.41,8.37,8.48,
+8.38,8.42,8.45,8.60,8.46,8.65,8.62,8.64,8.73,8.72,
+8.81,8.81,8.80,8.85,8.88,8.79,8.90,9.02,8.89,9.01,
+8.96,8.97,9.11,8.95,9.10,9.11,9.21,9.29,9.28,9.46,
+0.27,0.32,0.33,0.34,0.36,0.39,0.42,0.45,0.50,0.49,
+0.55,0.54,0.55,0.60,0.55,0.64,0.64,0.72,0.72,0.76,
+0.79,0.77,0.89,0.89,0.87,0.90,0.96,0.95,1.02,1.03,
+1.04,1.04,1.16,1.14,1.10,1.22,1.20,1.20,1.19,1.24,
+1.30,1.32,1.29,1.43,1.47,1.45,1.49,1.48,1.50,1.56,
+1.53,1.59,1.59,1.60,1.68,1.71,1.62,1.79,1.75,1.75,
+1.81,1.88,1.79,1.90,1.99,1.95,2.06,1.96,1.93,2.01,
+2.10,2.10,2.10,2.07,2.17,2.25,2.20,2.34,2.32,2.33,
+2.31,2.33,2.37,2.36,2.46,2.44,2.53,2.44,2.57,2.55,
+2.46,2.65,2.62,2.61,2.69,2.78,2.62,2.76,2.82,2.79,
+2.86,2.86,2.98,2.88,2.99,2.93,3.06,2.97,3.05,3.02,
+3.10,3.11,3.10,3.17,3.19,3.29,3.25,3.22,3.25,3.45,
+3.37,3.52,3.51,3.45,3.56,3.47,3.53,3.49,3.63,3.77,
+3.58,3.50,3.64,3.69,3.80,3.74,3.83,3.87,3.84,3.86,
+3.92,3.88,3.96,3.97,3.96,3.93,4.03,4.12,4.10,4.18,
+4.08,4.14,4.23,4.22,4.23,4.16,4.30,4.40,4.27,4.36,
+4.28,4.36,4.44,4.54,4.58,4.58,4.55,4.58,4.61,4.68,
+4.70,4.64,4.67,4.88,4.80,4.71,4.72,4.81,4.89,4.81,
+4.81,4.95,5.06,4.93,4.96,5.04,5.07,5.25,5.16,5.13,
+5.27,5.20,5.25,5.18,5.34,5.36,5.34,5.36,5.44,5.42,
+5.46,5.43,5.56,5.56,5.59,5.46,5.54,5.60,5.62,5.70,
+5.71,5.63,5.80,5.82,5.78,5.80,5.88,5.84,5.88,5.97,
+5.97,5.88,6.11,6.00,6.05,5.88,6.25,6.18,6.06,6.30,
+6.10,6.29,6.29,6.33,6.29,6.33,6.46,6.27,6.34,6.25,
+6.35,6.43,6.54,6.48,6.65,6.58,6.60,6.54,6.57,6.71,
+6.57,6.67,6.83,6.83,6.84,6.78,6.85,6.90,6.84,6.98,
+7.01,7.06,6.90,7.00,7.00,7.13,7.17,7.11,7.22,7.29,
+7.22,7.26,7.28,7.42,7.24,7.38,7.44,7.53,7.44,7.47,
+7.57,7.63,7.56,7.63,7.67,7.67,7.77,7.56,7.72,7.97,
+0.22,0.25,0.24,0.29,0.31,0.35,0.36,0.38,0.39,0.41,
+0.46,0.44,0.51,0.53,0.50,0.54,0.60,0.58,0.59,0.62,
+0.63,0.63,0.71,0.72,0.75,0.76,0.78,0.83,0.84,0.87,
+0.81,0.92,0.92,0.90,0.98,0.96,0.95,0.97,1.10,1.04,
+1.10,1.12,1.16,1.12,1.15,1.14,1.23,1.25,1.25,1.31,
+1.31,1.30,1.36,1.34,1.35,1.41,1.48,1.43,1.48,1.50,
+1.51,1.53,1.53,1.55,1.58,1.64,1.63,1.68,1.62,1.71,
+1.66,1.77,1.81,1.81,1.78,1.90,1.84,1.89,1.87,1.93,
+1.92,1.95,1.92,2.05,2.02,2.10,2.14,2.09,2.15,2.12,
+2.15,2.23,2.12,2.26,2.29,2.30,2.30,2.26,2.34,2.27,
+2.33,2.31,2.44,2.41,2.41,2.47,2.46,2.53,2.70,2.57,
+2.50,2.65,2.61,2.59,2.58,2.67,2.77,2.70,2.73,2.73,
+2.81,2.83,2.81,2.85,2.93,2.90,2.93,2.91,3.00,2.97,
+2.96,3.01,3.10,3.09,3.02,3.05,3.08,3.17,3.23,3.17,
+3.29,3.25,3.30,3.31,3.47,3.40,3.35,3.36,3.35,3.43,
+3.39,3.40,3.51,3.48,3.49,3.57,3.52,3.50,3.58,3.56,
+3.60,3.70,3.67,3.68,3.69,3.76,3.76,3.86,3.78,3.81,
+3.93,3.89,3.80,3.92,3.96,3.94,3.96,4.05,4.14,4.08,
+4.03,4.06,4.13,4.05,4.14,4.19,4.21,4.14,4.24,4.17,
+4.28,4.29,4.37,4.38,4.34,4.45,4.42,4.42,4.48,4.55,
+4.49,4.49,4.54,4.54,4.64,4.65,4.61,4.62,4.62,4.72,
+4.74,4.82,4.72,4.84,4.80,4.89,4.78,4.89,4.95,5.00,
+4.97,4.91,5.00,4.95,4.99,5.17,5.11,5.06,5.17,5.12,
+5.29,5.19,5.16,5.29,5.26,5.26,5.40,5.31,5.33,5.28,
+5.37,5.30,5.40,5.54,5.41,5.53,5.52,5.42,5.55,5.54,
+5.45,5.55,5.57,5.72,5.71,5.67,5.73,5.73,5.81,5.80,
+5.89,5.75,5.72,5.87,5.85,5.88,5.79,5.91,5.97,5.85,
+6.00,6.08,5.96,6.05,6.01,6.26,5.99,6.10,6.12,6.05,
+6.25,6.18,6.34,6.17,6.37,6.37,6.49,6.44,6.42,6.37,
+3.30,3.61,3.82,4.14,4.40,4.82,5.09,5.49,5.71,6.06,
+6.28,6.75,6.97,7.18,7.59,7.87,8.14,8.56,8.85,9.12,
+9.37,9.69,10.05,10.25,10.67,10.92,11.27,11.68,11.87,12.20,
+12.61,12.85,13.28,13.47,13.83,14.10,14.33,14.71,15.00,15.37,
+15.66,15.89,16.29,16.57,16.87,17.07,17.37,17.83,18.18,18.27,
+18.69,19.09,19.18,19.59,19.90,20.27,20.49,20.87,21.01,21.40,
+21.82,22.09,22.11,22.61,23.00,23.42,23.66,23.97,24.11,24.48,
+24.74,25.01,25.32,25.93,26.16,26.39,26.72,26.86,27.32,27.61,
+28.01,28.26,28.45,28.86,29.22,29.47,29.77,30.24,30.46,30.66,
+31.11,31.34,31.68,31.92,32.29,32.76,33.00,32.94,33.51,33.74,
+33.92,34.56,34.66,35.22,35.13,35.61,36.06,36.39,36.52,36.89,
+37.33,37.42,37.78,38.11,38.34,38.73,38.78,39.49,39.50,39.89,
+40.25,40.76,40.81,41.10,41.41,41.73,41.95,42.19,42.90,42.87,
+43.48,43.81,43.91,44.05,44.66,44.84,44.91,45.63,45.93,46.31,
+46.75,46.84,47.10,47.31,48.00,48.11,48.15,48.44,48.67,49.16,
+49.39,49.84,50.17,50.87,50.81,50.99,51.31,51.81,51.89,52.39,
+52.48,52.81,53.12,53.53,53.56,54.13,54.26,54.85,55.16,55.41,
+55.31,55.99,56.29,56.54,56.95,57.33,57.45,57.92,58.04,58.50,
+58.78,59.05,59.07,59.66,60.26,60.27,60.60,61.06,61.66,61.33,
+61.81,62.16,62.48,62.73,62.80,63.32,63.87,64.07,64.33,64.75,
+65.12,65.50,65.39,65.76,66.48,66.63,66.41,67.43,66.84,67.67,
+68.28,68.54,68.66,69.06,69.53,69.63,69.98,70.35,70.34,70.80,
+70.81,71.35,71.56,72.03,72.46,72.81,72.82,73.19,73.98,73.74,
+73.63,74.55,74.80,75.18,75.09,75.92,75.78,76.31,76.55,76.73,
+77.50,77.66,78.07,78.07,78.46,78.88,79.32,79.29,79.82,80.15,
+80.22,80.73,81.23,81.63,81.72,82.04,82.23,82.42,82.99,83.26,
+83.17,83.90,83.77,84.35,84.59,85.03,85.18,85.55,85.85,86.56,
+86.83,86.97,87.03,87.63,87.42,87.76,88.42,88.62,88.89,89.39,
+89.67,90.25,90.33,90.78,91.03,91.23,91.41,91.76,92.07,92.39,
+2.72,2.95,3.27,3.53,3.85,4.08,4.29,4.60,4.89,5.04,
+5.34,5.56,5.74,6.14,6.32,6.58,6.82,7.03,7.41,7.69,
+7.92,8.13,8.42,8.78,8.97,9.23,9.52,9.79,9.93,10.08,
+10.47,10.67,11.00,11.23,11.55,11.75,12.14,12.33,12.69,12.87,
+13.13,13.40,13.69,13.91,14.26,14.44,14.48,14.96,15.05,15.50,
+15.64,15.90,16.19,16.43,16.83,17.07,17.20,17.53,17.85,18.05,
+18.27,18.63,18.72,19.04,19.33,19.58,19.83,20.09,20.48,20.62,
+20.90,21.12,21.35,21.73,21.88,22.11,22.38,22.68,22.99,23.05,
+23.45,23.61,24.00,24.30,24.48,24.76,25.05,25.48,25.46,25.80,
+26.13,26.31,26.54,27.07,27.03,27.27,27.76,27.74,27.98,28.53,
+28.65,28.83,29.21,29.55,29.71,29.81,30.22,30.51,30.69,30.85,
+31.26,31.61,31.65,32.04,32.29,32.52,32.84,32.88,33.44,33.71,
+34.03,34.15,34.42,34.62,35.04,35.04,35.36,35.66,35.91,36.17,
+36.35,36.69,36.90,36.94,37.51,37.74,38.25,38.24,38.59,38.91,
+38.98,39.39,39.80,39.95,40.11,40.33,40.50,40.95,41.07,41.48,
+41.55,41.89,42.02,42.43,42.63,42.69,43.35,43.46,43.84,44.08,
+44.12,44.35,44.72,45.05,45.44,45.50,45.98,46.11,46.32,46.81,
+47.01,47.25,47.08,47.62,47.89,48.28,48.41,48.62,48.96,49.20,
+49.33,49.62,49.98,50.13,50.39,50.62,50.74,51.19,51.22,51.81,
+52.02,52.01,52.68,52.60,52.88,53.37,53.41,53.65,53.99,54.36,
+54.82,54.95,55.29,55.33,55.92,55.85,56.07,56.31,56.74,56.93,
+57.06,57.60,57.67,58.05,57.85,58.29,58.52,58.92,59.01,59.63,
+59.63,60.01,60.32,60.64,60.58,61.10,61.34,61.44,61.73,62.06,
+62.37,62.44,62.95,63.00,63.29,63.87,63.95,64.01,64.28,64.98,
+65.00,65.04,65.31,65.73,66.04,65.93,66.61,66.60,66.97,67.41,
+67.54,67.70,68.25,68.32,68.59,68.68,69.34,69.31,69.61,70.03,
+70.18,70.39,70.71,71.43,70.97,71.93,71.80,71.74,72.37,72.32,
+72.92,72.92,73.53,73.10,73.86,73.76,74.42,74.60,75.19,74.79,
+75.08,75.49,75.97,75.73,76.56,76.61,77.25,77.46,77.20,77.58,
+2.29,2.55,2.73,2.95,3.18,3.36,3.54,3.84,4.04,4.24,
+4.47,4.67,4.92,5.11,5.38,5.53,5.73,6.05,6.13,6.41,
+6.58,6.81,7.00,7.25,7.58,7.67,7.92,8.21,8.44,8.63,
+8.86,8.90,9.23,9.34,9.71,9.82,10.19,10.28,10.57,10.88,
+11.05,11.28,11.43,11.80,11.87,12.14,12.41,12.60,12.76,13.08,
+13.16,13.51,13.57,13.76,14.05,14.25,14.61,14.65,15.06,15.21,
+15.53,15.69,15.93,16.09,16.24,16.43,16.77,16.74,17.10,17.26,
+17.49,17.69,18.03,18.24,18.49,18.42,19.11,19.08,19.36,19.63,
+19.77,20.07,20.12,20.55,20.71,20.78,20.83,21.31,21.36,21.78,
+21.88,22.06,22.25,22.49,22.82,23.00,23.34,23.31,23.63,23.68,
+24.10,24.30,24.32,24.80,24.91,25.15,25.50,25.81,25.80,26.30,
+26.34,26.59,26.51,26.95,27.16,27.11,27.45,27.84,28.24,28.02,
+28.44,28.79,28.79,28.97,29.39,29.35,29.82,29.81,29.95,30.25,
+30.70,30.93,31.13,31.34,31.45,31.70,31.87,32.28,32.23,32.42,
+32.67,33.06,33.51,33.34,33.65,33.72,34.30,34.26,34.65,34.91,
+34.91,35.03,35.42,35.41,35.97,35.86,36.32,36.39,36.72,37.00,
+36.99,37.36,37.51,37.83,37.97,38.07,38.46,38.72,38.97,39.19,
+39.27,39.57,39.77,40.02,40.29,40.39,40.74,40.73,40.92,41.33,
+41.49,41.62,41.99,42.28,42.40,42.31,42.64,42.73,43.25,43.42,
+43.92,43.89,44.16,44.22,44.36,44.74,44.99,45.13,45.44,45.56,
+45.76,46.03,46.52,46.23,46.50,47.04,47.34,47.71,47.86,47.75,
+47.98,48.20,48.57,48.58,48.86,49.27,49.36,49.69,50.00,49.91,
+50.32,50.13,50.66,50.38,51.08,51.43,51.26,51.81,51.97,51.97,
+52.23,52.43,53.11,52.91,53.06,53.68,53.69,53.96,54.21,54.45,
+54.53,54.99,55.12,54.94,55.62,55.93,55.84,56.00,56.16,56.56,
+57.00,56.93,57.35,57.40,57.50,57.69,58.19,58.21,58.37,58.37,
+58.84,59.20,59.23,59.32,59.68,60.00,60.29,60.62,60.84,60.76,
+61.01,61.19,61.31,61.74,61.95,62.40,62.59,62.78,62.88,63.21,
+63.29,63.15,63.66,63.85,64.60,64.36,64.72,64.64,65.00,64.86,
+1.97,2.08,2.26,2.49,2.71,2.87,2.96,3.28,3.35,3.49,
+3.74,3.98,4.10,4.32,4.49,4.77,4.89,4.99,5.13,5.36,
+5.53,5.89,5.95,6.04,6.23,6.44,6.68,6.93,7.04,7.26,
+7.49,7.63,7.78,7.89,8.08,8.32,8.53,8.74,8.76,9.06,
+9.25,9.61,9.60,9.78,9.91,10.22,10.30,10.61,10.74,10.96,
+11.10,11.27,11.42,11.57,11.64,12.01,12.07,12.35,12.56,12.53,
+12.85,13.06,13.39,13.62,13.52,13.89,13.97,14.16,14.33,14.52,
+14.61,14.87,15.20,15.29,15.47,15.74,15.83,16.07,16.13,16.49,
+16.48,16.64,16.93,17.14,17.18,17.46,17.72,17.73,18.14,18.06,
+18.46,18.44,18.77,18.95,19.21,19.25,19.43,19.70,19.91,20.05,
+20.41,20.52,20.48,20.84,20.91,21.13,21.26,21.69,21.68,21.83,
+22.10,22.31,22.49,22.50,22.83,23.17,23.16,23.23,23.39,23.73,
+23.90,24.05,24.54,24.21,24.49,24.78,24.82,25.03,25.43,25.31,
+25.64,25.88,25.96,26.32,26.49,26.44,26.80,26.90,27.23,27.29,
+27.29,27.65,27.87,27.97,28.30,28.47,28.73,28.87,28.91,29.27,
+29.27,29.39,29.69,29.81,30.15,30.34,30.67,30.59,30.85,31.26,
+31.31,31.24,31.77,31.71,32.08,32.21,32.21,32.55,32.70,32.85,
+32.72,33.28,33.26,33.61,33.82,33.85,34.17,34.48,34.53,34.78,
+34.85,34.85,35.10,35.29,35.62,35.51,35.91,36.02,36.25,36.68,
+36.89,36.74,37.09,37.43,37.41,37.64,37.65,38.01,38.22,38.25,
+38.51,38.94,39.06,39.22,38.94,39.29,39.66,39.78,39.98,40.10,
+40.11,40.88,40.46,40.71,41.06,41.19,41.32,41.50,41.70,42.08,
+42.15,42.36,42.54,42.56,42.98,43.20,43.23,43.38,43.57,44.03,
+43.99,44.34,44.41,44.78,45.04,44.89,45.02,45.41,45.54,45.68,
+45.57,46.05,46.48,46.33,46.44,46.82,46.84,47.01,47.52,47.65,
+47.66,47.76,48.08,48.33,48.20,48.62,48.79,48.96,49.36,49.06,
+49.68,49.80,50.17,49.77,50.46,50.23,50.17,50.98,51.00,51.24,
+51.52,51.38,51.59,51.82,51.91,52.35,52.38,52.74,52.96,53.13,
+53.36,53.64,53.86,53.89,53.90,54.08,54.26,54.32,54.66,54.74,
+1.63,1.76,1.88,2.12,2.23,2.37,2.50,2.68,2.83,2.93,
+3.02,3.29,3.46,3.60,3.72,3.85,4.09,4.33,4.36,4.55,
+4.58,4.78,4.97,5.09,5.38,5.50,5.58,5.77,5.91,6.04,
+6.22,6.38,6.54,6.57,6.87,7.00,7.21,7.31,7.47,7.64,
+7.76,8.01,8.14,8.35,8.27,8.37,8.72,8.82,9.09,9.20,
+9.39,9.56,9.57,9.84,10.03,10.17,10.22,10.53,10.47,10.56,
+10.77,10.85,11.01,11.26,11.43,11.58,11.88,11.98,12.12,12.27,
+12.27,12.55,12.75,12.76,13.03,13.11,13.44,13.56,13.58,13.76,
+14.02,14.07,14.26,14.34,14.68,14.57,14.81,15.07,15.21,15.39,
+15.42,15.60,15.75,15.75,16.03,16.33,16.27,16.54,16.63,16.72,
+16.88,17.05,17.39,17.34,17.55,17.68,17.78,18.07,18.00,18.45,
+18.41,18.59,19.00,18.86,19.19,19.44,19.33,19.59,19.82,19.85,
+20.11,20.46,20.31,20.26,20.57,20.98,20.93,21.33,21.56,21.53,
+21.46,21.81,21.70,22.03,22.26,22.61,22.55,22.61,22.64,22.69,
+23.09,23.41,23.54,23.54,23.83,23.66,24.25,24.23,24.44,24.50,
+24.52,24.84,24.93,25.25,25.25,25.46,25.55,25.78,26.09,26.14,
+26.13,26.30,26.52,26.68,26.65,26.90,27.21,27.05,27.50,27.89,
+27.81,27.82,28.06,28.03,28.34,28.31,28.51,28.70,29.17,28.94,
+29.29,29.51,29.53,29.64,29.96,29.98,30.02,30.34,30.57,30.57,
+30.92,30.93,31.20,31.34,31.44,31.55,31.79,32.15,31.98,32.20,
+32.28,32.41,32.43,32.80,33.14,33.15,33.28,33.37,33.58,33.78,
+33.76,33.99,34.15,34.63,34.61,34.54,34.70,35.04,35.00,35.55,
+35.57,35.61,35.89,35.68,36.13,36.47,36.27,36.26,36.65,36.92,
+37.39,37.02,37.07,37.43,37.30,37.79,37.80,38.16,38.45,38.31,
+38.45,38.84,38.75,39.11,39.22,38.94,39.30,39.69,39.56,40.07,
+39.98,39.85,40.58,40.70,40.87,40.95,40.83,41.35,41.17,41.18,
+41.85,41.77,41.97,42.00,42.21,42.42,42.70,42.77,42.87,42.81,
+43.08,43.10,43.38,43.73,43.53,43.88,44.20,44.15,44.40,44.81,
+44.63,44.89,44.97,45.14,45.57,45.43,45.86,46.02,45.83,45.63,
+1.38,1.45,1.58,1.74,1.86,2.07,2.16,2.25,2.36,2.53,
+2.58,2.79,2.90,3.04,3.19,3.22,3.50,3.58,3.60,3.85,
+3.86,4.07,4.26,4.24,4.44,4.61,4.74,4.90,5.00,5.06,
+5.25,5.43,5.47,5.55,5.79,5.88,5.97,6.10,6.33,6.43,
+6.49,6.76,6.74,6.98,7.08,7.20,7.34,7.44,7.64,7.69,
+7.80,7.76,8.07,8.18,8.42,8.55,8.49,8.67,8.80,8.98,
+9.01,9.31,9.36,9.37,9.57,9.73,9.88,10.22,10.06,10.26,
+10.57,10.42,10.62,10.78,10.81,10.94,11.14,11.33,11.41,11.50,
+11.55,11.86,11.98,12.21,12.32,12.25,12.44,12.47,12.79,12.77,
+12.91,13.16,13.15,13.14,13.79,13.71,13.64,13.98,14.01,14.23,
+14.33,14.38,14.62,14.66,14.84,14.86,14.91,15.10,15.18,15.35,
+15.59,15.68,15.83,15.93,16.18,16.23,16.43,16.52,16.62,16.85,
+16.61,16.88,17.19,17.28,17.13,17.31,17.57,17.82,17.88,17.86,
+18.17,18.40,18.36,18.53,18.51,18.74,18.98,19.10,19.39,19.34,
+19.45,19.62,19.77,19.86,19.89,19.88,20.19,20.24,20.45,20.68,
+20.75,20.90,20.91,21.16,21.23,21.50,21.31,21.64,21.74,21.83,
+22.11,21.96,22.14,22.53,22.70,22.64,22.87,22.82,23.13,23.20,
+23.32,23.46,23.62,23.78,23.56,24.00,24.02,24.23,24.23,24.43,
+24.72,24.79,24.90,24.94,25.04,25.23,25.21,25.59,25.69,25.65,
+25.84,26.11,26.27,26.17,26.35,26.67,26.82,26.77,27.13,26.84,
+26.87,27.54,27.45,27.56,27.51,27.77,27.77,28.24,28.14,28.32,
+28.27,28.45,28.67,28.72,28.86,28.83,29.39,29.43,29.40,29.58,
+29.92,29.82,30.16,30.22,30.27,30.53,30.58,30.32,30.70,30.87,
+31.01,31.17,31.30,31.48,31.82,31.68,31.84,31.86,32.22,32.47,
+32.30,32.43,32.65,32.75,32.92,32.66,33.03,33.49,33.46,33.66,
+33.75,33.90,33.86,33.77,34.38,34.49,34.35,34.43,34.83,34.74,
+35.15,35.13,35.34,35.55,35.39,35.53,35.76,35.74,35.81,35.70,
+36.04,36.57,36.45,36.55,36.62,36.83,36.74,37.20,37.20,37.55,
+37.58,37.67,37.89,37.88,38.16,38.28,38.33,38.24,38.54,38.92,
+1.18,1.22,1.36,1.48,1.61,1.66,1.72,1.92,2.03,2.11,
+2.31,2.36,2.35,2.55,2.63,2.78,2.91,2.93,3.12,3.26,
+3.40,3.41,3.62,3.64,3.81,3.93,3.90,4.09,4.15,4.26,
+4.28,4.54,4.65,4.65,4.74,4.98,5.03,5.10,5.29,5.40,
+5.42,5.50,5.75,5.81,5.91,6.08,6.16,6.35,6.41,6.62,
+6.61,6.68,6.84,6.89,7.00,7.03,7.29,7.27,7.39,7.57,
+7.63,7.75,7.86,7.99,7.88,8.17,8.35,8.45,8.45,8.66,
+8.67,8.87,9.02,9.07,9.02,9.39,9.48,9.53,9.67,9.60,
+9.84,9.95,10.08,10.16,10.15,10.40,10.58,10.50,10.67,10.91,
+10.90,10.98,11.06,11.24,11.35,11.46,11.57,11.70,11.80,11.80,
+12.00,12.17,12.08,12.36,12.54,12.50,12.67,12.77,12.68,12.90,
+12.97,13.14,13.36,13.47,13.35,13.69,13.85,13.72,13.88,13.99,
+13.97,14.25,14.52,14.56,14.57,14.69,14.86,14.92,15.04,15.31,
+15.35,15.18,15.34,15.75,15.54,15.84,15.89,15.89,16.02,16.26,
+16.19,16.40,16.68,16.61,16.63,16.86,17.00,16.98,17.07,17.31,
+17.38,17.56,17.65,17.65,17.78,18.04,18.12,18.22,18.44,18.25,
+18.41,18.60,18.48,18.91,19.05,19.14,19.00,19.11,19.48,19.57,
+19.58,19.61,19.79,19.54,20.07,20.24,20.33,20.44,20.45,20.45,
+20.79,20.73,20.78,20.96,21.00,21.25,21.12,21.54,21.56,21.59,
+21.52,21.87,21.97,22.02,22.24,22.20,22.20,22.64,22.47,22.70,
+22.86,22.82,22.86,23.05,23.36,23.46,23.60,23.73,23.49,24.04,
+23.85,23.91,24.00,24.18,24.27,24.62,24.39,24.81,24.69,24.92,
+25.31,25.13,25.26,25.32,25.25,25.31,25.55,25.88,25.79,25.92,
+25.84,26.34,26.04,26.47,26.47,26.68,26.57,26.75,27.02,26.96,
+27.30,27.19,27.30,27.58,27.64,27.67,27.81,27.83,28.03,28.11,
+28.21,28.60,28.46,28.63,28.88,28.84,28.92,28.87,29.04,29.23,
+29.27,29.23,29.45,29.78,29.75,29.93,29.98,30.16,30.16,30.40,
+30.56,30.34,30.67,31.09,30.92,31.04,30.93,31.09,31.18,31.30,
+31.59,31.79,31.74,31.78,32.02,32.02,32.20,32.06,32.52,32.66,
+0.95,1.06,1.11,1.24,1.37,1.42,1.46,1.62,1.72,1.78,
+1.83,1.97,1.99,2.13,2.17,2.32,2.37,2.58,2.64,2.75,
+2.77,2.94,2.99,3.04,3.15,3.22,3.28,3.39,3.44,3.55,
+3.77,3.71,3.90,3.96,4.14,4.18,4.21,4.32,4.45,4.49,
+4.64,4.73,4.71,4.88,4.92,5.07,5.17,5.20,5.28,5.44,
+5.47,5.61,5.73,5.75,5.89,5.94,6.08,6.12,6.28,6.24,
+6.36,6.46,6.67,6.62,6.82,6.92,7.04,7.12,7.13,7.18,
+7.40,7.36,7.50,7.58,7.78,7.86,7.73,7.87,8.12,8.12,
+8.36,8.21,8.39,8.58,8.58,8.74,8.82,8.98,8.87,9.13,
+9.11,9.32,9.46,9.37,9.49,9.65,9.74,9.86,9.89,9.89,
+10.27,10.12,10.11,10.36,10.41,10.53,10.64,10.62,10.85,10.84,
+11.06,10.96,11.14,11.19,11.40,11.41,11.52,11.64,11.80,11.62,
+11.89,11.96,12.05,12.08,12.24,12.29,12.39,12.69,12.63,12.64,
+12.73,12.77,13.02,13.13,13.28,13.29,13.45,13.51,13.53,13.52,
+13.71,13.63,13.87,13.98,14.21,14.09,14.13,14.26,14.50,14.45,
+14.46,14.45,15.02,14.77,14.65,15.00,15.12,15.31,15.43,15.47,
+15.57,15.66,15.71,15.77,15.87,15.96,16.11,15.98,16.18,16.41,
+16.53,16.55,16.73,16.68,16.89,16.75,17.20,17.06,17.06,17.27,
+17.34,17.57,17.51,17.77,17.63,17.75,17.92,17.93,18.20,18.09,
+18.28,18.24,18.45,18.86,18.48,18.90,18.77,18.98,19.28,19.01,
+19.17,19.24,19.27,19.63,19.61,19.76,19.97,20.00,19.81,20.01,
+20.01,19.78,20.58,20.45,20.29,20.43,20.69,20.76,21.02,20.98,
+21.12,20.93,21.15,21.34,21.25,21.32,21.56,21.77,21.68,21.85,
+22.05,21.91,22.29,22.25,22.28,22.42,22.44,22.55,22.58,22.84,
+22.85,22.88,22.85,22.88,23.26,23.21,23.33,23.59,23.63,23.48,
+23.52,23.81,23.98,23.98,23.96,24.02,24.35,24.36,24.34,24.46,
+24.65,24.66,24.82,25.04,24.96,25.17,25.23,25.19,25.36,25.32,
+25.47,25.88,25.87,25.77,25.89,25.81,26.10,26.10,26.30,26.41,
+26.36,26.85,26.43,26.55,26.93,26.95,26.84,27.17,27.00,27.08,
+0.82,0.85,0.99,1.04,1.10,1.20,1.29,1.28,1.39,1.50,
+1.58,1.58,1.67,1.71,1.94,2.06,2.04,2.14,2.16,2.30,
+2.40,2.44,2.48,2.56,2.68,2.79,2.77,2.88,2.94,2.96,
+3.05,3.18,3.22,3.35,3.42,3.49,3.67,3.66,3.73,3.83,
+3.88,3.94,3.93,4.10,4.12,4.22,4.26,4.29,4.45,4.59,
+4.57,4.77,4.79,4.85,4.98,5.01,5.01,5.24,5.24,5.43,
+5.38,5.48,5.49,5.73,5.67,5.70,5.95,5.92,5.93,6.17,
+6.16,6.22,6.35,6.26,6.44,6.66,6.51,6.78,6.85,6.82,
+7.07,7.11,7.08,7.20,7.22,7.18,7.35,7.47,7.55,7.52,
+7.70,7.76,7.70,7.91,8.03,8.21,8.22,8.21,8.26,8.41,
+8.41,8.46,8.62,8.71,8.69,8.82,8.81,9.00,9.04,9.04,
+9.13,9.32,9.31,9.47,9.53,9.67,9.57,9.66,9.91,9.96,
+10.02,10.15,10.17,10.14,10.29,10.37,10.64,10.44,10.53,10.71,
+10.73,10.87,10.89,10.91,11.11,11.20,11.15,11.20,11.51,11.45,
+11.43,11.42,11.61,11.88,11.74,11.84,11.90,12.02,12.13,12.17,
+12.54,12.38,12.48,12.47,12.66,12.52,12.69,12.90,12.94,12.95,
+13.06,13.13,13.10,13.15,13.30,13.47,13.69,13.68,13.67,13.62,
+13.98,14.08,14.08,14.14,14.14,14.27,14.23,14.24,14.42,14.58,
+14.77,14.86,14.64,14.70,14.95,14.91,15.18,15.08,15.25,15.22,
+15.36,15.38,15.27,15.62,15.57,15.72,15.62,15.93,16.11,16.14,
+16.12,16.13,16.27,16.32,16.39,16.40,16.62,16.89,16.69,16.86,
+16.58,17.07,16.82,16.84,17.11,17.22,17.28,17.39,17.47,17.38,
+17.64,17.62,17.59,17.62,18.10,17.98,18.39,18.11,18.22,18.28,
+18.39,18.51,18.59,18.49,18.64,18.93,18.85,19.02,18.90,19.34,
+19.33,19.44,19.45,19.33,19.54,19.23,19.64,19.52,19.94,19.79,
+19.91,20.07,19.80,20.00,20.32,20.47,20.41,20.70,20.46,20.60,
+20.86,20.95,20.88,20.81,20.76,21.08,21.33,21.35,21.24,21.21,
+21.48,21.62,21.36,21.64,21.67,22.10,21.96,22.11,22.07,22.02,
+22.05,22.24,22.47,22.41,22.56,22.82,22.60,22.75,22.89,22.97,
+0.68,0.75,0.84,0.87,0.97,1.02,1.09,1.16,1.20,1.28,
+1.27,1.36,1.47,1.48,1.62,1.64,1.64,1.78,1.86,1.88,
+1.90,1.97,2.07,2.12,2.25,2.34,2.38,2.41,2.55,2.52,
+2.60,2.62,2.75,2.84,2.92,2.93,2.97,3.03,3.11,3.15,
+3.21,3.32,3.35,3.41,3.51,3.52,3.51,3.69,3.76,3.86,
+3.90,3.89,4.03,4.10,4.07,4.21,4.23,4.33,4.41,4.51,
+4.53,4.66,4.63,4.78,4.80,4.76,4.86,4.83,5.02,5.14,
+5.15,5.24,5.23,5.37,5.33,5.51,5.55,5.63,5.60,5.78,
+5.90,5.96,5.97,5.91,6.05,6.20,6.13,6.21,6.28,6.29,
+6.47,6.48,6.64,6.73,6.74,6.78,6.86,6.79,6.97,7.11,
+7.13,7.19,7.23,7.35,7.36,7.28,7.46,7.63,7.60,7.68,
+7.83,7.82,7.81,7.94,8.07,8.08,8.06,8.17,8.23,8.27,
+8.37,8.44,8.59,8.63,8.76,8.72,8.74,8.85,8.95,8.99,
+9.11,9.04,9.23,9.13,9.28,9.49,9.30,9.53,9.49,9.57,
+9.80,9.72,9.62,9.89,9.91,10.04,10.08,10.20,10.23,10.29,
+10.33,10.44,10.52,10.39,10.59,10.54,10.53,10.88,10.81,10.84,
+11.11,10.97,11.16,11.13,11.33,11.31,11.32,11.44,11.47,11.58,
+11.55,11.71,11.87,11.64,11.71,11.89,12.03,12.15,12.21,12.10,
+12.11,12.25,12.26,12.35,12.40,12.46,12.84,12.82,12.70,12.92,
+12.91,12.94,13.10,13.18,13.05,13.24,13.36,13.43,13.55,13.43,
+13.50,13.58,13.58,13.78,13.93,13.62,13.89,14.03,14.19,13.94,
+14.06,14.22,14.28,14.45,14.51,14.61,14.54,14.58,14.82,14.70,
+14.67,14.86,15.15,14.87,15.18,15.28,15.19,15.37,15.41,15.18,
+15.50,15.44,15.54,15.59,15.66,15.75,15.79,15.86,15.82,16.03,
+16.25,15.95,16.12,16.43,16.30,16.60,16.51,16.52,16.64,16.58,
+16.86,16.65,16.81,17.07,17.00,17.11,17.30,17.44,17.31,17.20,
+17.32,17.63,17.41,17.82,17.68,17.62,17.75,17.84,17.97,17.84,
+18.39,17.93,18.12,18.03,18.34,18.39,18.54,18.21,18.67,18.52,
+18.77,18.92,18.79,18.95,18.90,18.95,19.09,19.09,19.21,19.38,
+0.57,0.61,0.72,0.75,0.83,0.85,0.91,0.99,1.01,1.05,
+1.12,1.16,1.26,1.30,1.31,1.36,1.47,1.40,1.51,1.58,
+1.63,1.68,1.80,1.82,1.92,1.89,1.96,1.98,2.08,2.14,
+2.19,2.22,2.32,2.33,2.43,2.46,2.52,2.49,2.59,2.69,
+2.74,2.72,2.85,2.94,2.98,2.96,3.04,3.07,3.10,3.28,
+3.22,3.33,3.29,3.52,3.47,3.59,3.50,3.62,3.69,3.74,
+3.75,3.85,3.88,3.99,4.01,4.06,4.10,4.20,4.18,4.29,
+4.29,4.36,4.52,4.40,4.49,4.62,4.63,4.83,4.78,4.96,
+4.98,4.92,4.81,5.03,5.22,5.08,5.27,5.26,5.29,5.36,
+5.44,5.52,5.62,5.59,5.65,5.63,5.78,5.80,5.79,6.09,
+5.98,5.94,6.07,6.07,6.16,6.32,6.33,6.28,6.43,6.43,
+6.42,6.60,6.51,6.62,6.67,6.86,6.88,6.75,6.92,6.96,
+6.91,7.08,7.05,7.10,7.20,7.27,7.35,7.48,7.41,7.61,
+7.62,7.79,7.59,7.80,7.62,7.82,8.01,7.96,8.04,8.23,
+8.21,8.32,8.25,8.32,8.46,8.37,8.44,8.56,8.50,8.68,
+8.68,8.71,8.87,8.84,8.69,8.93,9.03,9.12,9.04,9.16,
+9.28,9.21,9.29,9.46,9.37,9.57,9.45,9.60,9.66,9.82,
+9.79,9.92,9.81,9.89,10.03,10.00,10.05,10.16,10.26,10.23,
+10.27,10.41,10.47,10.40,10.39,10.54,10.65,10.60,10.77,10.72,
+10.75,10.88,11.02,10.90,10.90,11.09,11.14,11.09,11.29,11.42,
+11.45,11.31,11.53,11.47,11.48,11.77,11.87,11.70,11.73,11.78,
+12.05,12.07,12.07,12.02,12.12,12.18,12.31,12.12,12.46,12.49,
+12.24,12.60,12.48,12.59,12.78,12.67,12.90,12.96,12.78,12.93,
+13.00,13.09,13.10,13.24,13.24,13.11,13.22,13.33,13.56,13.26,
+13.52,13.51,13.54,13.60,13.79,13.95,13.82,13.90,13.76,13.88,
+14.05,14.08,14.15,14.15,14.35,14.41,14.23,14.45,14.53,14.70,
+14.52,14.72,14.58,14.81,14.68,14.75,15.05,14.91,14.89,14.93,
+15.10,15.12,15.07,15.23,15.35,15.58,15.37,15.48,15.74,15.62,
+15.64,15.76,15.91,16.07,15.87,15.92,16.00,16.03,15.92,16.14,
+0.51,0.56,0.59,0.64,0.65,0.71,0.74,0.83,0.84,0.90,
+0.97,0.99,0.99,1.08,1.15,1.17,1.21,1.25,1.30,1.32,
+1.42,1.43,1.47,1.53,1.59,1.53,1.62,1.73,1.74,1.81,
+1.89,1.89,1.97,2.02,1.99,2.04,2.12,2.13,2.14,2.24,
+2.28,2.38,2.35,2.40,2.48,2.50,2.54,2.60,2.64,2.70,
+2.72,2.82,2.83,2.84,2.89,3.00,3.04,3.02,3.22,3.17,
+3.19,3.35,3.25,3.31,3.32,3.37,3.52,3.46,3.57,3.55,
+3.64,3.73,3.74,3.62,3.90,3.85,3.98,3.88,4.02,4.06,
+4.17,4.05,4.15,4.26,4.39,4.28,4.38,4.49,4.49,4.48,
+4.54,4.62,4.73,4.81,4.77,4.89,4.85,4.84,4.89,4.87,
+4.94,5.04,5.08,5.10,5.16,5.16,5.27,5.42,5.42,5.42,
+5.49,5.46,5.63,5.54,5.65,5.71,5.66,5.70,5.71,5.73,
+5.85,5.94,6.08,6.10,6.12,6.16,6.30,6.22,6.26,6.41,
+6.31,6.42,6.49,6.57,6.42,6.52,6.52,6.72,6.79,6.78,
+6.74,6.94,6.84,6.88,7.03,7.03,7.13,7.17,7.24,7.41,
+7.32,7.37,7.29,7.38,7.34,7.48,7.80,7.64,7.73,7.75,
+7.72,7.76,7.83,7.77,8.01,7.99,8.02,8.15,7.99,8.12,
+8.11,8.19,8.46,8.31,8.26,8.45,8.40,8.38,8.60,8.56,
+8.67,8.57,8.65,8.79,8.74,8.79,8.94,9.09,9.09,9.06,
+9.09,9.22,9.29,9.18,9.42,9.32,9.39,9.31,9.51,9.43,
+9.57,9.51,9.80,9.64,9.67,9.61,9.77,9.77,10.04,10.02,
+9.93,10.21,10.03,10.13,10.02,10.16,10.26,10.43,10.40,10.40,
+10.34,10.48,10.54,10.35,10.57,10.57,10.81,10.65,10.66,10.94,
+10.89,11.10,10.89,11.02,11.04,11.02,11.16,11.29,11.20,11.30,
+11.25,11.38,11.53,11.52,11.59,11.71,11.65,11.75,11.87,11.78,
+11.73,11.60,12.03,11.85,11.98,12.08,12.10,12.15,12.09,12.07,
+12.39,12.17,12.30,12.58,12.44,12.53,12.39,12.68,12.72,12.83,
+12.64,12.81,12.78,12.86,12.93,12.95,13.07,13.13,13.07,13.00,
+13.24,13.11,13.25,13.34,13.51,13.39,13.37,13.35,13.41,13.63,
+0.42,0.45,0.48,0.54,0.55,0.60,0.63,0.69,0.75,0.73,
+0.83,0.87,0.85,0.85,0.87,1.02,1.05,1.07,1.08,1.16,
+1.16,1.18,1.24,1.24,1.29,1.38,1.40,1.39,1.47,1.46,
+1.48,1.58,1.61,1.64,1.71,1.74,1.75,1.80,1.84,1.89,
+1.91,1.91,2.12,2.03,2.08,2.11,2.10,2.17,2.22,2.33,
+2.28,2.32,2.40,2.43,2.36,2.50,2.61,2.58,2.61,2.65,
+2.71,2.73,2.74,2.79,2.92,2.84,2.95,2.92,3.00,3.07,
+2.97,3.12,3.13,3.19,3.21,3.24,3.24,3.38,3.34,3.41,
+3.49,3.52,3.51,3.53,3.57,3.66,3.69,3.66,3.76,3.79,
+3.75,3.88,3.81,3.82,3.92,4.10,4.08,4.11,4.20,4.20,
+4.20,4.19,4.27,4.37,4.32,4.41,4.38,4.45,4.40,4.49,
+4.46,4.61,4.58,4.71,4.72,4.73,4.83,4.91,4.96,4.94,
+5.01,5.05,5.12,5.12,5.02,5.18,5.15,5.22,5.35,5.26,
+5.31,5.35,5.43,5.46,5.39,5.45,5.49,5.57,5.63,5.63,
+5.70,5.94,5.91,5.84,5.91,6.00,6.00,6.01,6.10,6.02,
+6.08,6.21,6.08,6.24,6.22,6.27,6.29,6.42,6.42,6.51,
+6.54,6.53,6.47,6.54,6.66,6.74,6.63,6.87,6.79,6.87,
+6.85,6.75,6.94,7.09,7.04,7.09,7.05,7.20,7.12,7.28,
+7.30,7.39,7.35,7.31,7.39,7.38,7.44,7.53,7.55,7.55,
+7.67,7.75,7.79,7.49,7.77,7.90,8.05,7.84,7.86,8.02,
+8.03,8.14,8.14,8.04,8.07,8.33,8.22,8.39,8.37,8.18,
+8.44,8.44,8.70,8.57,8.61,8.57,8.67,8.66,8.69,8.77,
+8.76,8.72,8.77,8.87,9.01,8.94,9.04,8.91,9.10,9.02,
+9.09,9.31,9.22,9.31,9.26,9.42,9.41,9.26,9.37,9.33,
+9.66,9.60,9.63,9.56,9.64,9.65,9.84,9.79,9.82,9.90,
+9.95,9.94,9.94,10.23,9.95,10.31,10.22,10.17,10.02,10.41,
+10.19,10.24,10.32,10.41,10.44,10.59,10.64,10.54,10.58,10.75,
+10.68,10.43,10.76,10.86,10.89,10.95,10.94,10.86,11.00,11.06,
+11.18,11.20,11.01,11.15,11.17,11.49,11.12,11.21,11.26,11.39,
+0.32,0.37,0.39,0.43,0.47,0.50,0.51,0.55,0.57,0.61,
+0.67,0.69,0.71,0.71,0.81,0.83,0.78,0.88,0.92,0.99,
+0.97,0.97,1.02,1.05,1.08,1.19,1.15,1.20,1.25,1.31,
+1.27,1.29,1.36,1.38,1.47,1.54,1.46,1.51,1.56,1.53,
+1.59,1.60,1.71,1.74,1.71,1.74,1.78,1.85,1.94,1.96,
+1.93,1.93,2.03,2.02,2.11,2.10,2.18,2.23,2.11,2.21,
+2.26,2.36,2.26,2.40,2.41,2.37,2.43,2.48,2.57,2.57,
+2.56,2.51,2.56,2.63,2.73,2.83,2.87,2.85,2.87,2.86,
+2.78,2.84,2.92,2.98,2.97,3.02,3.18,3.09,3.16,3.12,
+3.21,3.35,3.31,3.26,3.32,3.35,3.41,3.50,3.47,3.41,
+3.60,3.53,3.55,3.74,3.69,3.69,3.82,3.77,3.83,3.83,
+3.76,3.89,3.85,3.97,4.02,4.07,4.07,4.14,4.19,4.18,
+4.11,4.22,4.09,4.25,4.33,4.30,4.34,4.36,4.54,4.41,
+4.57,4.51,4.59,4.66,4.67,4.61,4.74,4.66,4.73,4.68,
+4.75,4.86,4.92,4.92,5.05,5.00,5.05,4.94,5.09,4.97,
+5.05,5.06,5.25,5.28,5.38,5.34,5.30,5.32,5.46,5.49,
+5.40,5.44,5.52,5.50,5.60,5.62,5.68,5.62,5.78,5.76,
+5.73,5.77,5.80,5.81,5.91,5.92,5.95,6.11,6.05,6.02,
+6.07,5.98,6.08,6.13,6.30,6.13,6.31,6.42,6.38,6.29,
+6.34,6.45,6.37,6.57,6.58,6.66,6.68,6.67,6.60,6.70,
+6.82,6.68,6.86,6.80,6.88,6.93,6.98,7.02,7.04,6.98,
+7.15,7.20,7.22,7.27,7.21,7.34,7.23,7.47,7.33,7.29,
+7.41,7.44,7.43,7.49,7.51,7.37,7.58,7.62,7.70,7.72,
+7.51,7.71,7.76,7.76,7.86,7.87,7.83,8.07,7.93,7.96,
+7.87,8.02,8.16,8.25,8.07,8.13,8.00,8.25,8.26,8.25,
+8.20,8.49,8.41,8.38,8.37,8.40,8.58,8.59,8.66,8.68,
+8.81,8.51,8.73,8.76,8.77,8.73,8.75,8.99,8.87,8.89,
+9.04,8.86,8.95,9.22,9.08,9.04,9.10,9.02,9.15,9.21,
+9.21,9.33,9.34,9.37,9.38,9.47,9.38,9.41,9.37,9.61,
+0.27,0.32,0.32,0.39,0.39,0.41,0.45,0.49,0.47,0.55,
+0.54,0.55,0.60,0.63,0.69,0.71,0.76,0.77,0.79,0.83,
+0.83,0.84,0.86,0.95,0.94,0.94,0.98,1.02,1.03,1.05,
+1.08,1.11,1.15,1.18,1.22,1.22,1.20,1.31,1.32,1.35,
+1.34,1.40,1.42,1.46,1.46,1.48,1.55,1.63,1.60,1.60,
+1.62,1.71,1.65,1.65,1.70,1.83,1.75,1.85,1.78,1.79,
+1.90,1.92,1.95,1.99,2.03,2.07,2.02,2.17,2.13,2.17,
+2.12,2.20,2.20,2.25,2.30,2.39,2.29,2.28,2.36,2.32,
+2.40,2.47,2.49,2.49,2.67,2.53,2.60,2.60,2.67,2.76,
+2.75,2.66,2.66,2.78,2.77,2.88,2.87,2.85,2.95,2.94,
+3.00,2.99,3.07,3.09,3.16,3.11,3.11,3.17,3.19,3.19,
+3.23,3.19,3.20,3.28,3.38,3.35,3.43,3.39,3.48,3.44,
+3.58,3.44,3.59,3.62,3.54,3.68,3.62,3.79,3.69,3.78,
+3.77,3.66,3.76,3.84,3.89,3.84,3.89,3.90,3.99,3.88,
+4.12,4.00,4.18,4.18,4.18,4.04,4.29,4.28,4.24,4.36,
+4.25,4.32,4.32,4.43,4.39,4.43,4.35,4.44,4.54,4.53,
+4.56,4.66,4.55,4.52,4.70,4.57,4.74,4.68,4.77,4.92,
+4.73,4.91,4.97,4.96,5.10,4.95,4.99,5.14,5.13,5.11,
+5.07,5.20,5.18,5.25,5.20,5.29,5.32,5.30,5.28,5.34,
+5.20,5.45,5.32,5.50,5.55,5.52,5.51,5.53,5.54,5.80,
+5.74,5.83,5.77,5.75,5.90,5.75,5.80,5.86,6.02,5.83,
+5.88,5.82,6.08,5.94,6.03,6.05,5.99,6.11,6.06,6.10,
+6.19,6.22,6.31,6.17,6.33,6.53,6.30,6.33,6.49,6.31,
+6.49,6.35,6.49,6.61,6.67,6.68,6.60,6.67,6.65,6.71,
+6.68,6.67,6.74,6.79,6.78,6.72,7.00,6.96,6.89,7.05,
+6.94,6.82,7.12,7.10,6.92,7.15,7.21,7.14,7.26,7.31,
+7.27,7.24,7.26,7.34,7.36,7.45,7.38,7.46,7.51,7.37,
+7.52,7.69,7.65,7.57,7.67,7.62,7.69,7.67,8.03,7.91,
+7.81,7.70,7.99,7.87,7.86,7.76,8.05,8.03,8.08,8.10,
+3.45,3.82,4.06,4.42,4.74,5.09,5.36,5.81,6.02,6.42,
+6.73,7.01,7.38,7.64,8.00,8.28,8.67,9.04,9.40,9.71,
+9.99,10.23,10.63,11.01,11.21,11.54,11.93,12.23,12.60,12.88,
+13.40,13.50,13.83,14.16,14.42,14.86,15.16,15.50,15.85,16.27,
+16.52,16.94,17.18,17.38,17.84,17.93,18.60,18.92,19.14,19.45,
+19.73,20.08,20.44,20.75,20.92,21.23,21.52,21.79,22.33,22.76,
+22.95,23.23,23.77,24.00,24.39,24.79,24.93,25.29,25.72,25.87,
+26.20,26.50,26.83,27.24,27.45,27.90,28.04,28.68,28.91,29.33,
+29.43,29.83,30.09,30.64,30.70,31.03,31.35,31.73,32.00,32.42,
+32.86,32.99,33.58,33.80,33.85,34.45,34.79,35.11,35.40,35.73,
+36.10,36.32,36.66,36.77,37.33,37.70,37.94,38.12,38.62,38.97,
+39.54,39.45,40.09,40.32,40.50,40.72,41.26,41.55,41.95,42.40,
+42.44,42.86,43.08,43.42,43.63,44.17,44.44,45.05,45.09,45.40,
+45.73,45.87,46.42,46.53,47.07,47.28,47.66,48.10,48.22,48.59,
+48.82,49.35,49.70,50.23,50.58,50.67,50.92,51.41,51.61,51.90,
+52.12,52.47,52.80,53.07,53.53,53.68,54.33,54.68,54.78,55.12,
+55.72,55.86,56.23,56.43,57.18,57.25,57.42,57.87,58.12,58.37,
+58.65,59.01,59.49,59.55,60.17,60.42,60.84,61.15,61.64,61.70,
+62.14,62.52,62.56,62.96,63.19,63.57,64.11,64.47,64.65,64.87,
+65.18,65.56,65.76,66.24,66.45,66.94,67.16,67.29,67.91,68.39,
+68.78,68.84,69.30,69.43,69.80,70.08,70.49,70.70,70.87,71.20,
+71.53,72.06,72.36,72.60,73.04,73.43,73.94,73.95,74.40,74.76,
+75.16,75.26,75.40,75.73,76.26,76.52,76.86,77.17,77.83,77.82,
+78.39,78.71,78.94,79.02,79.88,79.88,80.03,80.54,80.94,81.16,
+81.68,82.14,82.16,82.68,82.89,82.81,83.51,83.84,84.02,84.59,
+84.57,85.19,85.52,86.02,86.07,86.46,86.84,87.01,87.28,87.92,
+88.19,88.82,88.45,89.17,89.47,89.81,90.12,90.23,90.76,90.46,
+91.02,91.67,91.82,92.21,92.71,93.41,93.06,93.46,93.91,93.92,
+94.56,94.98,95.09,95.47,95.58,95.95,96.56,96.70,97.03,97.49,
+2.94,3.17,3.50,3.72,4.09,4.30,4.58,4.87,5.06,5.34,
+5.71,5.97,6.31,6.57,6.72,7.02,7.43,7.58,7.87,8.13,
+8.48,8.74,8.96,9.27,9.54,9.78,10.07,10.55,10.71,10.99,
+11.27,11.51,11.90,12.03,12.47,12.49,12.90,13.22,13.48,13.63,
+13.97,14.23,14.45,14.77,15.16,15.39,15.68,15.79,16.12,16.44,
+16.79,16.83,17.25,17.54,17.94,18.05,18.52,18.68,18.84,19.30,
+19.55,19.81,20.13,20.39,20.48,20.75,21.11,21.51,21.82,21.95,
+22.34,22.62,22.86,23.18,23.29,23.57,23.87,24.17,24.49,24.82,
+24.92,25.21,25.55,25.81,26.39,26.36,26.61,27.10,27.17,27.40,
+27.93,28.04,28.51,28.54,29.00,29.39,29.55,29.69,29.96,30.25,
+30.45,30.73,31.36,31.31,31.70,31.84,32.26,32.24,32.87,33.22,
+33.17,33.43,33.68,34.10,34.60,34.73,34.94,35.17,35.33,35.85,
+35.98,36.27,36.65,36.91,37.22,37.55,38.04,38.29,38.37,38.56,
+39.10,39.08,39.56,39.67,39.82,40.13,40.54,40.78,41.17,41.38,
+41.62,42.05,42.25,42.51,42.91,43.16,43.21,43.60,43.69,44.18,
+44.42,44.81,45.08,44.95,45.20,45.69,45.79,46.51,46.62,47.27,
+47.19,47.49,47.56,47.87,48.27,48.38,48.93,49.23,49.29,49.65,
+50.01,50.16,50.39,50.97,50.77,51.58,51.57,51.96,52.06,52.20,
+52.72,53.10,53.36,53.56,53.68,54.05,54.20,54.56,55.15,55.12,
+55.35,55.82,56.06,56.16,56.29,56.80,57.16,57.48,57.66,58.09,
+58.15,58.45,58.52,59.26,59.35,59.61,59.97,60.53,60.53,60.73,
+61.00,61.53,61.51,61.97,62.20,62.53,62.84,62.80,63.05,63.54,
+63.55,63.65,63.99,64.74,65.14,65.15,65.25,65.63,65.88,66.38,
+66.50,66.65,67.22,67.14,67.44,67.86,68.39,68.52,68.72,69.05,
+69.21,69.89,69.89,70.00,70.64,70.99,71.03,71.01,71.20,71.83,
+71.93,72.33,72.71,72.94,73.35,73.53,73.58,73.90,74.08,74.67,
+75.08,75.23,75.39,75.75,75.86,76.56,76.47,76.72,77.36,77.13,
+77.69,77.45,78.12,78.67,78.78,78.62,78.89,79.57,79.77,80.13,
+80.19,80.67,80.83,81.03,81.58,81.65,82.17,82.47,82.46,82.74,
+2.48,2.74,2.92,3.18,3.37,3.65,3.92,4.13,4.39,4.58,
+4.82,4.98,5.31,5.51,5.72,6.03,6.20,6.54,6.68,6.94,
+7.22,7.50,7.58,7.79,8.25,8.28,8.55,8.70,9.14,9.26,
+9.72,9.71,10.00,10.25,10.28,10.71,11.04,11.20,11.42,11.70,
+11.86,12.21,12.21,12.64,12.86,13.00,13.38,13.43,13.75,14.12,
+14.08,14.40,14.67,14.92,15.23,15.38,15.56,15.92,16.21,16.37,
+16.64,16.88,17.01,17.20,17.47,17.91,18.00,18.20,18.54,18.63,
+19.03,19.20,19.37,19.47,19.78,20.31,20.25,20.55,20.79,21.05,
+21.22,21.50,21.80,21.91,22.48,22.35,22.70,22.95,23.20,23.37,
+23.56,24.02,24.38,24.42,24.59,24.73,25.14,25.23,25.48,25.55,
+26.15,26.20,26.47,26.75,26.89,27.20,27.38,27.81,27.82,28.09,
+28.42,28.54,28.93,29.00,29.43,29.56,30.01,29.93,30.23,30.29,
+30.78,30.77,30.98,31.53,31.59,32.04,32.12,32.56,32.51,32.86,
+32.88,33.37,33.49,33.83,33.93,34.08,34.39,34.63,35.01,35.20,
+35.43,35.70,35.84,36.05,36.44,36.59,36.93,37.20,37.38,37.65,
+37.57,37.92,38.10,38.42,38.71,39.04,39.07,39.51,39.69,39.72,
+40.16,40.53,40.59,40.69,40.87,40.81,41.72,41.65,41.60,42.27,
+42.47,42.61,42.94,43.25,43.14,43.66,43.94,44.03,44.14,44.23,
+44.80,44.97,45.31,45.56,45.79,46.01,46.19,46.35,46.79,46.60,
+47.13,47.67,47.51,47.73,48.48,48.34,48.55,48.87,49.11,49.29,
+49.42,49.64,50.01,50.45,50.40,51.05,50.81,51.09,51.25,51.65,
+51.81,52.12,52.44,52.63,52.86,53.03,53.27,53.57,53.95,54.15,
+54.14,54.33,54.63,54.91,55.25,55.47,55.95,55.84,56.36,56.47,
+56.45,56.79,56.89,57.38,57.54,57.78,57.99,58.22,58.37,58.57,
+58.98,59.17,59.16,59.58,59.68,60.06,60.15,60.31,60.79,61.09,
+61.22,61.24,61.45,61.95,62.26,62.73,62.28,62.89,63.14,63.43,
+63.76,64.02,64.11,64.30,64.58,64.39,64.61,65.18,65.62,65.81,
+66.00,66.04,66.42,66.72,67.02,66.95,67.53,67.74,67.90,68.15,
+68.43,68.35,68.78,69.00,69.06,69.27,69.66,69.60,70.05,69.91,
+2.17,2.29,2.48,2.73,2.94,3.11,3.30,3.46,3.66,3.89,
+4.14,4.33,4.55,4.69,4.83,5.07,5.31,5.51,5.78,5.98,
+6.17,6.35,6.45,6.67,6.98,7.20,7.26,7.49,7.73,7.84,
+8.07,8.30,8.55,8.67,8.81,8.97,9.32,9.44,9.68,9.94,
+10.14,10.20,10.53,10.74,10.97,11.27,11.31,11.41,11.55,11.98,
+12.12,12.27,12.41,12.68,13.10,13.08,13.32,13.71,13.77,13.94,
+14.12,14.32,14.59,14.65,14.77,14.98,15.30,15.51,15.76,15.91,
+16.00,16.27,16.40,16.54,16.80,17.13,17.20,17.39,17.82,17.80,
+18.13,18.23,18.62,18.63,18.99,19.29,19.18,19.57,19.61,19.93,
+20.08,20.31,20.49,20.82,20.99,21.08,21.23,21.70,21.94,21.80,
+22.02,22.32,22.43,22.77,22.90,23.13,23.16,23.51,23.65,23.78,
+24.27,24.27,24.58,24.80,24.97,25.21,25.27,25.56,25.62,25.75,
+26.14,26.16,26.47,26.74,26.84,26.91,27.41,27.21,27.85,27.93,
+27.98,28.21,28.40,28.60,28.91,29.28,29.39,29.45,29.74,30.02,
+30.12,30.42,30.51,30.83,30.73,31.09,31.57,31.52,31.67,31.77,
+32.04,32.08,32.49,32.77,32.87,32.94,33.19,33.38,33.83,33.89,
+34.07,34.11,34.46,34.60,34.94,35.29,35.26,35.28,35.74,35.58,
+36.03,36.37,36.65,36.78,37.09,37.10,37.43,37.55,37.78,38.02,
+38.16,38.52,38.47,38.72,39.01,39.10,39.45,39.53,39.65,39.89,
+40.00,40.17,40.64,40.45,40.78,41.19,41.38,41.45,41.71,41.79,
+41.97,42.30,42.52,42.75,42.69,43.02,43.36,43.34,43.76,43.85,
+43.91,44.51,44.57,44.91,45.03,44.96,45.34,45.41,45.61,46.22,
+46.18,46.30,46.36,46.72,46.88,47.11,47.09,47.35,47.77,47.70,
+47.75,48.25,48.50,48.86,48.76,49.14,49.60,49.66,49.49,49.93,
+50.00,50.24,50.55,50.47,50.53,51.10,51.14,51.56,51.85,51.78,
+51.94,52.15,52.42,52.73,52.53,52.82,53.26,53.37,53.67,53.99,
+54.08,54.32,54.55,54.74,54.79,54.97,55.36,55.32,55.50,55.57,
+56.62,56.49,56.39,56.50,56.86,57.17,57.15,57.24,57.53,57.82,
+58.16,58.51,58.69,58.69,59.03,59.03,59.12,59.37,59.79,59.97,
+1.77,1.95,2.09,2.32,2.53,2.65,2.81,3.02,3.15,3.30,
+3.48,3.69,3.85,4.01,4.13,4.41,4.55,4.65,4.81,5.03,
+5.25,5.35,5.50,5.78,5.85,6.10,6.29,6.32,6.46,6.69,
+6.92,7.00,7.27,7.45,7.58,7.65,7.93,8.12,8.25,8.47,
+8.70,8.61,8.91,9.14,9.22,9.37,9.60,9.77,9.98,10.07,
+10.28,10.41,10.55,10.81,11.02,11.13,11.35,11.45,11.69,11.94,
+11.95,12.20,12.22,12.47,12.61,12.96,13.07,13.19,13.34,13.60,
+13.77,13.83,13.94,14.20,14.25,14.44,14.58,14.83,14.97,15.10,
+15.32,15.57,15.71,15.90,16.05,16.21,16.42,16.72,16.71,16.89,
+17.07,17.26,17.45,17.55,17.68,17.86,18.01,18.18,18.59,18.75,
+18.65,18.94,19.04,19.27,19.39,19.86,19.83,19.90,20.11,20.27,
+20.46,20.52,20.84,20.94,21.16,21.47,21.59,21.64,21.86,21.99,
+22.24,22.35,22.54,22.75,22.69,23.16,23.05,23.51,23.52,23.55,
+23.95,23.84,24.30,24.42,24.54,24.44,24.90,25.17,25.40,25.39,
+25.61,25.62,25.84,26.04,26.17,26.45,26.56,26.92,26.77,27.29,
+27.21,27.60,27.53,27.64,28.15,28.45,27.99,28.27,28.71,28.87,
+28.98,29.01,29.49,29.64,29.64,29.74,29.87,30.16,30.15,30.45,
+30.51,30.88,30.96,31.29,31.51,31.57,31.51,31.88,32.16,32.27,
+32.44,32.29,32.83,32.78,33.12,33.16,33.44,33.45,33.85,34.02,
+33.98,34.19,34.40,34.80,35.13,34.80,35.31,35.21,35.30,35.42,
+35.64,36.03,36.07,36.22,36.19,36.68,36.77,37.14,37.14,37.25,
+37.52,37.49,37.74,37.96,38.00,38.26,38.16,38.67,39.01,39.01,
+39.31,39.18,39.66,39.44,39.95,40.10,40.19,40.38,40.76,40.72,
+41.08,40.87,41.25,41.22,41.58,41.77,42.10,42.01,42.32,42.12,
+42.34,42.86,42.99,43.42,43.39,43.35,43.55,43.66,44.05,44.12,
+44.36,44.35,44.41,44.66,44.82,45.02,45.58,45.10,45.80,45.80,
+45.93,46.31,46.33,46.27,46.69,46.79,47.06,47.55,47.59,47.28,
+47.68,48.15,47.86,48.04,48.52,48.49,48.46,48.88,49.22,49.13,
+49.18,49.57,49.96,50.13,50.17,50.12,50.33,50.41,50.33,51.01,
+1.50,1.65,1.81,1.97,2.17,2.35,2.36,2.56,2.71,2.81,
+2.97,3.09,3.29,3.46,3.60,3.71,3.81,3.96,4.11,4.35,
+4.38,4.52,4.70,4.77,4.96,5.17,5.31,5.40,5.54,5.68,
+5.76,6.08,6.11,6.33,6.39,6.55,6.67,6.79,7.06,7.16,
+7.34,7.55,7.60,7.67,7.90,8.11,8.23,8.31,8.34,8.54,
+8.74,8.74,9.06,9.23,9.43,9.41,9.68,9.70,9.92,10.10,
+10.05,10.29,10.36,10.57,10.76,10.96,11.00,11.27,11.30,11.54,
+11.82,11.73,11.84,12.04,12.14,12.37,12.66,12.62,12.85,12.93,
+12.92,13.28,13.41,13.66,13.57,13.78,13.80,14.18,14.32,14.36,
+14.68,14.76,14.70,15.04,15.23,15.36,15.13,15.47,15.68,15.74,
+15.91,16.23,16.18,16.23,16.71,16.59,16.94,17.17,17.31,17.17,
+17.59,17.60,17.71,17.87,17.65,18.26,18.28,18.28,18.53,18.81,
+18.77,19.04,19.05,19.29,19.47,19.50,19.57,19.96,19.83,20.08,
+20.25,20.45,20.53,20.81,20.66,21.02,21.07,21.23,21.44,21.67,
+21.54,21.97,22.00,22.24,22.26,22.44,22.67,22.75,22.90,23.00,
+23.32,23.45,23.58,23.73,23.90,23.87,24.05,23.98,24.55,24.50,
+24.65,24.81,24.98,24.99,25.10,25.32,25.46,25.42,25.95,25.91,
+26.11,26.19,26.55,26.52,26.63,26.95,26.94,27.10,27.18,27.59,
+27.42,27.62,27.88,28.09,28.04,28.51,28.45,28.42,28.47,28.81,
+28.86,29.14,29.02,29.39,29.75,29.83,30.03,30.19,30.09,30.06,
+30.52,30.49,30.56,30.80,31.14,31.18,31.30,31.41,31.61,31.73,
+31.77,32.24,32.00,32.20,32.48,32.37,32.66,33.20,32.86,32.97,
+33.33,33.22,33.49,33.63,33.84,33.83,33.89,34.17,34.56,34.49,
+34.84,34.79,34.94,35.03,35.15,35.26,35.51,35.77,36.06,35.72,
+36.23,36.43,36.44,36.39,36.77,36.96,37.01,37.00,37.14,37.48,
+37.71,37.85,37.85,38.15,37.98,38.33,38.25,38.62,38.94,38.92,
+38.88,39.33,39.38,39.91,39.74,39.52,39.97,40.37,40.05,40.41,
+40.69,40.63,40.79,40.89,41.34,41.46,41.57,41.34,41.61,41.62,
+41.73,42.05,41.96,42.52,42.31,42.79,42.92,42.90,43.11,43.41,
+1.28,1.48,1.56,1.70,1.79,1.87,1.97,2.14,2.33,2.38,
+2.52,2.68,2.70,2.96,3.05,3.10,3.22,3.43,3.55,3.67,
+3.78,3.82,4.01,4.10,4.25,4.28,4.41,4.54,4.77,4.88,
+5.01,5.19,5.22,5.34,5.53,5.53,5.74,5.84,5.88,6.07,
+6.21,6.42,6.44,6.59,6.58,6.87,7.06,7.12,7.19,7.47,
+7.32,7.54,7.61,7.80,7.96,7.92,8.18,8.31,8.45,8.52,
+8.56,8.65,8.98,9.00,9.19,9.33,9.32,9.38,9.56,9.84,
+9.89,9.95,10.05,10.39,10.44,10.44,10.66,10.81,10.93,10.84,
+11.26,11.27,11.42,11.45,11.56,11.66,11.85,11.98,12.04,12.19,
+12.37,12.41,12.75,12.71,12.92,12.87,13.19,13.24,13.44,13.52,
+13.50,13.75,13.95,14.08,13.96,14.14,14.37,14.51,14.65,14.78,
+14.86,14.87,15.01,15.22,15.23,15.51,15.48,15.61,16.08,15.95,
+16.05,16.04,16.28,16.55,16.63,16.50,16.84,16.82,16.99,17.02,
+17.10,17.46,17.44,17.56,17.84,17.78,18.10,18.15,18.38,18.34,
+18.51,18.68,18.75,18.95,19.07,19.02,19.09,19.31,19.45,19.57,
+19.63,19.75,19.78,20.21,20.22,20.33,20.57,20.51,20.65,20.79,
+20.96,21.24,21.38,21.33,21.48,21.45,21.80,21.84,21.94,22.00,
+22.14,22.32,22.09,22.36,22.52,22.76,22.92,23.04,22.97,23.55,
+23.39,23.57,23.63,23.67,23.84,23.84,24.13,24.14,24.42,24.45,
+24.55,24.80,24.83,24.79,25.29,25.16,25.25,25.41,25.76,25.77,
+25.60,25.85,26.06,26.27,26.35,26.39,26.54,26.75,26.66,26.53,
+27.06,27.08,27.02,27.55,27.60,27.66,27.55,27.98,28.10,28.34,
+28.53,28.35,28.64,28.56,28.56,29.05,28.84,29.34,29.07,29.18,
+29.70,29.46,29.90,30.11,30.30,30.02,30.14,30.30,30.56,30.61,
+30.71,30.91,31.15,31.02,31.07,31.24,31.25,31.52,31.71,31.87,
+31.75,32.16,32.21,32.38,32.60,32.72,32.58,32.76,32.91,33.21,
+33.11,33.05,33.40,33.50,33.73,33.87,33.88,33.95,34.24,34.33,
+34.46,34.33,34.70,34.73,34.97,35.20,35.35,35.43,35.34,35.22,
+35.64,35.71,35.86,35.97,36.30,35.99,36.36,36.53,36.58,36.80,
+1.13,1.26,1.30,1.37,1.51,1.65,1.75,1.84,2.01,2.04,
+2.14,2.25,2.37,2.41,2.59,2.64,2.68,2.86,2.99,3.08,
+3.15,3.35,3.41,3.51,3.50,3.83,3.84,3.85,4.00,4.16,
+4.23,4.29,4.46,4.51,4.55,4.69,4.84,4.98,4.89,5.14,
+5.28,5.39,5.51,5.59,5.66,5.86,5.86,6.10,6.08,6.21,
+6.30,6.41,6.54,6.64,6.73,6.80,6.95,7.11,7.28,7.37,
+7.30,7.43,7.59,7.77,7.75,7.98,7.92,8.17,8.23,8.19,
+8.48,8.33,8.59,8.72,8.70,8.75,8.98,9.19,9.20,9.23,
+9.41,9.43,9.48,9.69,9.89,10.04,10.02,10.11,10.19,10.37,
+10.62,10.58,10.71,10.81,11.06,11.12,11.02,11.34,11.39,11.46,
+11.59,11.63,11.66,11.78,12.07,11.91,12.16,12.29,12.41,12.33,
+12.57,12.66,12.82,12.93,12.95,13.10,13.11,13.31,13.62,13.39,
+13.66,13.79,13.98,13.83,14.08,14.08,14.25,14.38,14.49,14.62,
+14.74,14.74,14.97,14.88,15.00,15.32,15.32,15.15,15.38,15.60,
+15.69,15.88,16.05,16.02,16.09,16.17,16.33,16.48,16.50,16.56,
+16.64,16.64,16.94,17.13,17.04,17.26,17.40,17.34,17.52,17.54,
+17.84,17.92,18.13,18.16,18.25,18.35,18.41,18.66,18.50,18.67,
+18.86,19.06,18.85,19.17,19.27,19.42,19.52,19.79,19.77,19.76,
+19.80,20.03,20.09,20.12,20.43,20.38,20.61,20.70,20.71,20.80,
+20.91,21.02,21.03,21.32,21.21,21.32,21.35,21.67,21.88,21.86,
+22.06,22.15,22.18,22.21,22.45,22.54,22.75,22.76,22.98,23.02,
+22.80,23.05,23.25,22.98,23.35,23.71,23.73,23.83,23.84,24.00,
+24.07,24.22,24.04,24.60,24.81,24.71,24.68,24.89,24.61,25.07,
+25.10,25.47,25.28,25.42,25.26,25.45,25.91,25.76,25.93,26.15,
+26.16,26.36,26.30,26.67,26.50,26.84,26.70,26.78,26.75,27.18,
+27.23,27.04,27.31,27.46,27.45,27.80,27.84,28.04,27.94,28.08,
+28.29,28.36,28.52,28.53,28.52,28.89,28.72,28.85,29.21,29.17,
+29.22,29.51,29.51,29.53,29.69,29.76,29.85,29.87,30.02,30.15,
+30.42,30.34,30.63,30.66,30.76,30.71,31.11,31.06,31.20,31.41,
+0.94,1.04,1.11,1.22,1.26,1.40,1.52,1.60,1.61,1.76,
+1.82,1.87,2.02,2.10,2.18,2.32,2.35,2.45,2.53,2.63,
+2.77,2.79,2.92,3.10,3.06,3.12,3.21,3.25,3.49,3.51,
+3.62,3.60,3.79,3.82,3.95,4.03,4.13,4.15,4.31,4.33,
+4.53,4.54,4.62,4.79,4.86,4.96,5.07,5.05,5.22,5.25,
+5.39,5.49,5.48,5.72,5.75,5.83,5.86,5.92,6.11,6.25,
+6.22,6.25,6.32,6.54,6.58,6.61,6.87,6.96,7.17,7.03,
+7.04,7.17,7.29,7.38,7.40,7.55,7.59,7.83,7.95,8.07,
+8.00,8.14,8.26,8.20,8.35,8.38,8.55,8.54,8.81,8.82,
+8.86,8.91,9.12,9.14,9.25,9.42,9.43,9.53,9.62,9.60,
+9.78,9.75,9.89,10.10,10.02,10.22,10.27,10.35,10.51,10.71,
+10.79,10.68,10.88,11.03,11.04,11.13,11.08,11.33,11.50,11.63,
+11.56,11.60,11.84,11.80,11.91,12.15,12.15,12.22,12.27,12.39,
+12.39,12.54,12.59,12.69,12.96,12.89,12.88,13.09,13.29,13.12,
+13.44,13.31,13.53,13.55,13.74,13.84,13.88,14.13,14.06,14.40,
+14.04,14.32,14.50,14.57,14.64,14.61,14.88,14.86,15.02,14.91,
+15.00,15.32,15.30,15.32,15.42,15.68,15.85,15.58,15.79,15.89,
+15.89,15.95,16.14,16.25,16.27,16.47,16.58,16.70,16.55,16.59,
+16.83,16.95,17.04,16.98,17.13,17.26,17.37,17.45,17.49,17.73,
+17.84,17.89,17.79,17.96,17.98,18.38,18.57,18.32,18.65,18.66,
+18.82,18.81,18.88,18.93,19.24,19.10,19.27,19.22,19.17,19.67,
+19.49,19.86,19.96,19.79,19.95,20.10,20.04,20.10,20.35,20.57,
+20.49,20.67,20.53,20.80,20.70,20.94,20.78,21.23,21.12,21.43,
+21.43,21.46,21.43,21.73,21.73,21.67,21.71,22.01,22.08,21.91,
+22.28,22.29,22.27,22.42,22.32,22.77,22.99,22.89,22.86,22.98,
+22.98,23.21,23.30,23.44,23.27,23.43,23.76,23.79,23.94,23.74,
+24.00,24.09,24.08,24.30,24.33,24.36,24.50,24.65,24.62,24.80,
+24.70,25.04,24.94,25.22,25.36,25.33,25.41,25.37,25.45,25.65,
+25.86,26.04,25.61,26.22,26.21,26.20,26.25,26.53,26.41,26.47,
+0.80,0.88,0.93,0.94,1.09,1.13,1.22,1.29,1.42,1.50,
+1.56,1.62,1.69,1.83,1.90,1.99,1.97,2.05,2.13,2.13,
+2.31,2.42,2.41,2.54,2.58,2.63,2.75,2.76,2.92,3.07,
+3.10,3.19,3.17,3.29,3.43,3.38,3.51,3.65,3.66,3.77,
+3.96,3.91,3.98,4.16,4.11,4.18,4.27,4.34,4.33,4.45,
+4.55,4.62,4.77,4.77,4.86,4.93,5.04,5.11,5.19,5.23,
+5.38,5.42,5.39,5.56,5.71,5.88,5.80,5.89,5.81,6.05,
+6.15,6.29,6.31,6.27,6.33,6.53,6.54,6.71,6.66,6.67,
+6.86,6.90,6.95,6.98,7.04,7.17,7.32,7.43,7.33,7.58,
+7.53,7.51,7.77,7.82,7.90,8.13,7.97,8.03,8.20,8.16,
+8.43,8.44,8.47,8.55,8.73,8.67,8.65,8.93,9.09,8.96,
+9.04,9.25,9.27,9.30,9.36,9.40,9.56,9.60,9.60,9.66,
+9.97,9.82,9.90,10.12,10.11,10.22,10.25,10.20,10.49,10.43,
+10.47,10.56,10.64,10.86,10.97,11.04,11.05,11.31,11.39,11.23,
+11.23,11.46,11.45,11.60,11.79,11.69,11.83,11.86,11.89,12.18,
+12.10,12.19,12.29,12.30,12.29,12.56,12.54,12.63,12.59,12.82,
+12.77,12.78,13.08,13.06,13.25,13.20,13.32,13.43,13.40,13.45,
+13.63,13.55,13.64,13.86,13.69,14.10,13.99,13.96,14.23,14.27,
+14.45,14.37,14.72,14.70,14.41,14.78,14.91,14.85,14.95,15.07,
+15.01,15.16,15.38,15.28,15.59,15.48,15.48,15.77,15.74,15.76,
+15.78,15.81,15.88,16.04,16.00,16.26,16.26,16.43,16.32,16.51,
+16.49,16.77,16.68,16.77,16.88,17.02,17.08,17.08,17.15,17.47,
+16.98,17.51,17.57,17.45,17.80,17.55,17.84,17.77,17.98,17.93,
+18.21,18.07,18.31,18.63,18.29,18.34,18.45,18.61,18.77,18.99,
+18.81,19.07,19.02,19.04,19.16,19.09,19.50,19.45,19.47,19.57,
+19.66,19.56,19.69,19.66,19.77,20.02,20.36,20.24,20.27,20.36,
+20.33,20.62,20.78,20.46,20.87,20.76,20.78,20.78,21.00,21.31,
+21.08,21.24,21.32,21.37,21.24,21.58,21.57,21.75,21.82,21.84,
+21.96,22.05,22.30,22.19,22.29,22.32,22.33,22.24,22.44,22.56,
+0.66,0.73,0.82,0.89,0.99,0.97,1.03,1.12,1.19,1.26,
+1.35,1.38,1.44,1.45,1.64,1.57,1.71,1.80,1.76,1.92,
+2.00,2.06,2.04,2.14,2.31,2.28,2.37,2.37,2.46,2.50,
+2.59,2.68,2.75,2.83,2.79,3.00,2.97,3.09,3.13,3.17,
+3.26,3.29,3.31,3.49,3.46,3.45,3.58,3.67,3.69,3.84,
+3.79,3.88,4.01,4.00,4.12,4.19,4.34,4.27,4.42,4.47,
+4.47,4.53,4.72,4.74,4.69,4.83,4.93,4.83,4.87,5.14,
+5.18,5.21,5.25,5.45,5.40,5.47,5.59,5.72,5.69,5.81,
+5.79,5.91,5.98,5.96,6.06,6.15,6.18,6.07,6.37,6.47,
+6.33,6.49,6.60,6.58,6.62,6.88,6.83,6.78,6.95,7.17,
+7.09,7.13,7.11,7.33,7.20,7.42,7.53,7.41,7.67,7.61,
+7.72,7.81,7.74,7.91,8.06,8.05,8.04,8.21,8.26,8.30,
+8.52,8.28,8.36,8.62,8.55,8.55,8.78,8.94,8.81,8.91,
+9.11,9.14,8.93,9.18,9.27,9.47,9.27,9.57,9.54,9.49,
+9.61,9.72,9.85,9.81,9.79,9.78,10.08,10.16,10.18,10.23,
+10.25,10.43,10.42,10.39,10.60,10.65,10.63,10.74,10.80,10.86,
+10.77,10.96,11.01,11.17,11.24,11.30,11.28,11.38,11.48,11.55,
+11.62,11.48,11.74,11.77,11.76,11.96,12.21,11.98,12.02,12.27,
+12.25,12.20,12.34,12.52,12.58,12.66,12.64,12.75,12.62,12.99,
+12.77,12.86,12.65,13.01,13.26,13.21,13.20,13.35,13.39,13.43,
+13.31,13.52,13.55,13.71,13.75,13.67,13.82,13.84,13.99,14.15,
+14.22,14.17,14.13,14.20,14.24,14.53,14.51,14.54,14.58,14.51,
+14.93,14.80,14.95,14.92,15.00,14.96,15.16,15.27,15.16,15.30,
+15.48,15.53,15.63,15.58,15.69,15.82,15.77,15.96,15.78,16.18,
+15.97,16.07,16.05,16.23,16.35,16.10,16.61,16.43,16.41,16.70,
+16.81,16.71,16.76,16.85,17.05,17.10,17.18,17.15,17.20,17.24,
+17.23,17.37,17.42,17.61,17.75,17.43,17.79,17.88,17.79,18.09,
+17.92,18.17,18.11,18.41,18.11,18.68,18.48,18.36,18.34,18.55,
+18.54,18.51,18.63,18.91,19.05,19.16,19.00,19.04,19.27,19.21,
+0.63,0.66,0.70,0.73,0.77,0.83,0.92,0.96,1.05,1.10,
+1.17,1.14,1.27,1.28,1.41,1.37,1.46,1.49,1.50,1.60,
+1.69,1.73,1.80,1.83,1.88,2.01,2.00,2.02,2.11,2.15,
+2.28,2.32,2.28,2.35,2.44,2.49,2.50,2.56,2.67,2.74,
+2.76,2.85,2.85,2.94,3.06,3.08,3.09,3.20,3.24,3.22,
+3.38,3.31,3.39,3.49,3.49,3.61,3.67,3.79,3.78,3.79,
+3.90,3.94,3.94,4.01,3.95,4.13,4.22,4.11,4.24,4.45,
+4.50,4.43,4.53,4.53,4.56,4.71,4.80,4.71,4.85,4.78,
+4.97,5.06,5.08,5.10,5.19,5.20,5.15,5.23,5.34,5.54,
+5.46,5.51,5.53,5.56,5.55,5.74,5.88,5.86,5.85,6.00,
+6.04,6.10,6.05,6.29,6.23,6.39,6.29,6.35,6.37,6.54,
+6.58,6.66,6.72,6.76,6.71,6.68,6.96,6.84,7.00,7.11,
+7.01,7.14,7.23,7.33,7.37,7.34,7.52,7.57,7.60,7.62,
+7.58,7.55,7.77,7.72,7.83,7.94,7.97,7.97,8.08,8.11,
+8.15,8.28,8.40,8.44,8.35,8.38,8.44,8.58,8.63,8.79,
+8.70,8.71,9.00,8.86,8.94,9.05,9.12,9.09,9.23,9.31,
+9.33,9.28,9.34,9.44,9.53,9.64,9.59,9.52,9.70,9.78,
+9.88,9.73,10.00,9.83,10.12,10.07,10.12,10.19,10.27,10.38,
+10.51,10.27,10.57,10.41,10.74,10.52,10.82,10.70,10.92,10.92,
+10.94,11.28,11.07,10.99,11.20,11.29,11.13,11.32,11.58,11.46,
+11.40,11.58,11.54,11.59,11.64,11.85,11.73,11.93,11.96,11.93,
+12.27,12.10,12.04,12.23,12.17,12.41,12.42,12.38,12.31,12.59,
+12.58,12.57,12.73,12.88,12.76,12.79,12.92,12.69,13.24,12.86,
+13.21,13.27,13.42,13.37,13.35,13.41,13.50,13.70,13.32,13.55,
+13.74,13.67,13.77,13.77,13.90,13.85,13.99,13.99,14.09,14.00,
+14.22,14.12,14.27,14.38,14.37,14.31,14.58,14.62,14.76,14.90,
+14.76,14.64,14.97,14.95,14.87,15.09,15.08,15.16,15.38,15.20,
+15.13,15.47,15.54,15.54,15.47,15.75,15.53,15.64,15.62,15.73,
+15.94,15.90,15.82,15.93,16.13,16.25,16.24,16.22,16.27,16.30,
+0.50,0.54,0.55,0.67,0.66,0.72,0.75,0.87,0.85,0.93,
+0.93,0.97,1.04,1.09,1.11,1.22,1.28,1.23,1.32,1.33,
+1.41,1.42,1.50,1.57,1.62,1.61,1.66,1.70,1.75,1.87,
+1.89,1.95,2.01,2.03,2.10,2.15,2.21,2.21,2.34,2.31,
+2.31,2.37,2.48,2.47,2.44,2.61,2.67,2.63,2.76,2.81,
+2.78,2.86,2.86,2.96,3.03,3.00,3.13,3.08,3.14,3.19,
+3.25,3.40,3.37,3.45,3.44,3.49,3.55,3.58,3.60,3.69,
+3.66,3.84,3.85,3.87,3.86,3.84,4.00,4.15,4.20,4.08,
+4.13,4.22,4.17,4.35,4.36,4.45,4.50,4.60,4.64,4.54,
+4.57,4.54,4.68,4.76,4.82,4.93,4.98,4.94,5.03,5.13,
+5.18,5.03,5.19,5.18,5.21,5.41,5.45,5.38,5.56,5.57,
+5.60,5.73,5.65,5.67,5.75,5.68,5.80,5.92,5.88,6.01,
+6.17,6.03,6.12,6.18,6.21,6.21,6.21,6.42,6.36,6.36,
+6.49,6.54,6.70,6.70,6.71,6.83,6.79,6.83,6.92,6.90,
+7.03,6.97,7.08,7.11,7.20,7.25,7.34,7.26,7.21,7.39,
+7.46,7.52,7.46,7.60,7.58,7.63,7.64,7.72,7.77,7.76,
+7.71,7.93,7.99,8.03,8.08,8.09,8.20,8.16,8.16,8.23,
+8.27,8.53,8.37,8.45,8.55,8.58,8.59,8.73,8.88,8.79,
+8.69,8.85,8.92,8.97,9.00,9.12,9.09,9.13,9.16,9.34,
+9.18,9.35,9.26,9.50,9.49,9.54,9.48,9.65,9.58,9.72,
+9.77,9.75,10.03,9.85,9.88,9.96,10.28,9.95,10.14,10.33,
+10.22,10.24,10.33,10.38,10.40,10.40,10.40,10.49,10.53,10.65,
+10.68,10.67,10.56,10.78,10.95,10.84,10.98,11.03,10.95,11.08,
+11.05,11.17,11.13,11.32,11.30,11.26,11.45,11.35,11.39,11.55,
+11.53,11.68,11.80,11.79,11.75,11.78,11.89,11.92,11.99,11.87,
+12.12,12.24,12.23,12.23,12.36,12.31,12.40,12.25,12.38,12.56,
+12.40,12.51,12.66,12.68,12.65,12.64,12.67,12.93,12.82,13.07,
+12.99,13.05,13.06,13.09,13.15,13.02,13.16,13.44,13.48,13.26,
+13.46,13.55,13.62,13.49,13.48,13.58,13.67,13.89,13.93,13.81,
+0.37,0.48,0.49,0.54,0.57,0.60,0.65,0.71,0.69,0.79,
+0.83,0.84,0.94,0.89,0.93,1.01,1.05,1.05,1.10,1.13,
+1.16,1.22,1.29,1.31,1.36,1.40,1.46,1.51,1.47,1.54,
+1.57,1.62,1.62,1.68,1.80,1.76,1.80,1.92,1.87,1.92,
+1.95,1.98,2.05,2.10,2.09,2.26,2.27,2.27,2.28,2.39,
+2.37,2.46,2.54,2.55,2.50,2.55,2.62,2.67,2.74,2.73,
+2.74,2.74,2.81,2.92,2.88,2.96,3.02,3.16,3.04,3.14,
+3.13,3.24,3.23,3.30,3.42,3.29,3.44,3.39,3.50,3.47,
+3.53,3.67,3.55,3.75,3.78,3.68,3.79,3.75,3.90,4.01,
+3.98,4.14,3.92,4.06,4.20,4.20,4.23,4.19,4.30,4.33,
+4.33,4.28,4.48,4.50,4.49,4.62,4.56,4.67,4.62,4.66,
+4.71,4.77,4.70,4.78,4.84,4.98,4.99,5.06,4.99,5.17,
+5.12,5.21,5.25,5.47,5.22,5.41,5.36,5.44,5.46,5.46,
+5.63,5.55,5.56,5.71,5.69,5.70,5.75,5.94,5.77,5.84,
+5.91,5.91,5.94,6.04,6.14,6.00,6.01,6.19,6.18,6.26,
+6.41,6.25,6.33,6.44,6.47,6.60,6.59,6.62,6.70,6.68,
+6.56,6.66,6.87,6.76,6.95,6.83,6.94,6.93,7.07,7.03,
+7.00,7.12,7.21,7.18,7.35,7.32,7.46,7.40,7.47,7.36,
+7.49,7.54,7.51,7.57,7.74,7.77,7.74,7.88,7.78,7.73,
+7.88,7.88,7.93,8.07,8.04,8.03,8.19,8.12,8.28,8.25,
+8.31,8.33,8.35,8.35,8.40,8.40,8.44,8.54,8.66,8.60,
+8.70,8.77,8.69,8.73,8.81,8.85,8.89,8.80,8.75,8.99,
+9.01,9.15,9.08,9.22,9.29,9.14,9.14,9.27,9.46,9.39,
+9.35,9.41,9.60,9.69,9.80,9.75,9.84,9.77,9.78,9.78,
+9.92,9.98,9.79,9.84,10.02,9.97,10.32,10.19,10.22,10.14,
+10.15,10.22,10.41,10.30,10.37,10.44,10.51,10.49,10.55,10.55,
+10.73,10.84,10.60,10.84,10.68,10.85,10.98,10.81,10.95,10.95,
+11.02,11.16,11.01,11.22,11.27,11.15,11.33,11.29,11.40,11.32,
+11.33,11.28,11.48,11.48,11.56,11.65,11.59,11.80,11.81,11.87,
+0.34,0.39,0.39,0.47,0.47,0.51,0.54,0.56,0.62,0.64,
+0.67,0.69,0.76,0.82,0.84,0.83,0.96,0.89,0.94,0.97,
+1.01,1.06,1.10,1.15,1.18,1.22,1.22,1.22,1.29,1.34,
+1.29,1.38,1.46,1.43,1.45,1.47,1.59,1.65,1.52,1.66,
+1.76,1.66,1.77,1.78,1.79,1.87,1.94,1.96,1.92,2.00,
+2.05,2.04,2.11,2.14,2.16,2.25,2.18,2.33,2.25,2.26,
+2.37,2.35,2.44,2.54,2.47,2.52,2.59,2.61,2.57,2.69,
+2.62,2.70,2.83,2.72,2.77,2.84,2.88,2.84,3.04,2.99,
+2.98,3.04,3.11,3.17,3.25,3.19,3.25,3.24,3.20,3.34,
+3.29,3.34,3.47,3.47,3.58,3.64,3.57,3.61,3.74,3.66,
+3.78,3.65,3.72,3.78,3.92,3.87,3.90,4.01,3.98,3.97,
+4.00,3.96,4.24,4.13,4.18,4.28,4.20,4.23,4.27,4.35,
+4.37,4.35,4.40,4.46,4.49,4.48,4.58,4.63,4.74,4.67,
+4.71,4.75,4.72,4.73,4.80,5.00,4.87,4.85,5.00,4.96,
+5.06,5.05,5.02,5.20,5.06,5.06,5.21,5.32,5.31,5.32,
+5.37,5.35,5.46,5.47,5.49,5.44,5.63,5.67,5.60,5.66,
+5.70,5.77,5.63,5.88,5.94,5.78,5.91,5.91,6.01,6.07,
+5.87,6.04,6.17,6.13,6.15,6.30,6.31,6.31,6.48,6.36,
+6.40,6.48,6.36,6.52,6.58,6.47,6.60,6.60,6.56,6.62,
+6.73,6.74,6.91,6.74,6.74,6.88,7.05,6.91,7.00,6.98,
+7.05,7.05,7.07,7.21,7.24,7.35,7.22,7.25,7.35,7.34,
+7.45,7.37,7.43,7.44,7.49,7.52,7.60,7.54,7.79,7.72,
+7.76,7.84,7.97,7.78,7.96,7.92,7.81,8.02,7.89,7.99,
+8.14,8.06,8.10,8.08,8.21,8.29,8.29,8.38,8.20,8.39,
+8.37,8.46,8.43,8.53,8.26,8.50,8.58,8.59,8.62,8.66,
+8.83,8.75,8.74,8.80,8.82,8.77,8.91,8.83,8.91,8.99,
+9.07,9.10,9.11,9.14,9.22,9.29,9.23,9.29,9.13,9.32,
+9.42,9.33,9.57,9.44,9.63,9.51,9.54,9.53,9.75,9.71,
+9.72,9.80,9.78,9.82,9.80,9.87,9.92,9.98,9.70,10.03,
+3.65,3.96,4.28,4.63,4.98,5.32,5.63,5.98,6.30,6.71,
+7.00,7.40,7.71,8.10,8.44,8.76,8.98,9.30,9.74,10.02,
+10.39,10.77,11.07,11.45,11.76,12.06,12.54,12.80,13.10,13.57,
+13.86,14.17,14.33,15.06,15.21,15.42,15.84,16.23,16.67,16.99,
+17.09,17.62,17.86,18.30,18.59,18.99,19.29,19.61,20.09,20.37,
+20.64,20.97,21.45,21.55,21.98,22.34,22.71,23.03,23.36,23.69,
+23.96,24.37,24.82,25.14,25.54,25.89,25.97,26.56,26.79,27.15,
+27.53,27.79,28.18,28.58,28.75,29.30,29.50,29.89,30.30,30.48,
+30.88,31.24,31.75,31.68,32.19,32.36,32.93,33.27,33.62,33.89,
+34.11,34.56,34.84,35.21,35.66,36.12,36.43,36.59,36.85,37.29,
+37.73,37.81,38.25,38.67,39.10,39.39,39.79,40.00,40.29,40.69,
+41.07,41.55,41.87,42.14,42.51,42.78,43.12,43.58,43.97,44.29,
+44.38,44.74,45.15,45.64,45.82,46.23,46.57,46.82,47.25,47.57,
+47.94,48.43,48.66,48.85,49.38,49.50,49.92,50.02,50.53,50.82,
+51.30,51.43,52.03,52.28,52.84,53.27,53.18,53.72,53.88,54.34,
+54.51,54.89,55.09,55.73,56.05,56.25,56.64,56.85,57.44,57.90,
+58.15,58.44,58.73,59.04,59.44,59.80,60.28,60.29,60.86,61.12,
+61.63,61.94,62.05,62.42,62.86,63.01,63.44,64.00,64.56,64.69,
+65.06,65.09,65.41,66.03,66.19,66.68,67.06,67.27,67.62,68.00,
+68.20,68.53,69.16,69.37,69.75,69.93,70.42,70.90,70.90,71.33,
+71.73,72.08,72.33,72.76,73.14,73.53,73.78,74.05,74.48,74.84,
+75.43,75.33,75.88,76.05,76.67,76.74,77.24,77.38,78.11,78.32,
+78.47,78.96,79.16,79.66,79.95,80.50,80.34,81.01,81.30,81.36,
+81.87,82.23,82.46,82.75,83.27,83.71,84.30,84.57,84.36,84.95,
+85.32,85.83,85.78,86.57,86.71,87.38,87.71,87.50,88.05,88.61,
+88.77,89.12,89.47,89.81,89.79,90.22,91.08,91.28,91.43,92.07,
+92.27,92.54,92.82,93.63,93.89,93.88,94.16,94.28,94.89,95.33,
+95.54,96.37,96.29,96.48,96.75,97.31,97.98,98.38,98.39,98.57,
+98.99,99.46,99.91,100.19,100.79,100.76,101.09,101.62,101.78,102.31,
+3.13,3.40,3.64,4.00,4.30,4.53,4.84,5.17,5.50,5.77,
+6.00,6.34,6.60,6.90,7.23,7.45,7.72,8.12,8.36,8.70,
+9.04,9.21,9.59,9.84,10.09,10.38,10.79,10.94,11.24,11.71,
+11.92,12.15,12.43,12.82,13.02,13.37,13.59,13.87,14.14,14.61,
+14.90,15.14,15.41,15.68,15.90,16.27,16.53,16.88,17.36,17.42,
+17.81,18.06,18.43,18.60,18.91,19.18,19.49,19.84,20.10,20.39,
+20.81,20.95,21.27,21.64,21.85,22.12,22.40,22.64,23.01,23.23,
+23.58,23.80,24.34,24.67,24.77,25.09,25.40,25.56,25.95,26.13,
+26.68,26.75,27.16,27.42,27.65,27.91,28.31,28.65,28.80,29.08,
+29.40,29.79,30.30,30.43,30.56,30.99,31.23,31.84,31.85,32.02,
+32.42,32.87,33.05,33.35,33.66,33.89,34.25,34.60,34.72,34.82,
+35.50,35.56,35.97,36.19,36.66,36.77,37.29,37.63,37.65,37.95,
+38.38,38.67,38.84,39.25,39.48,39.85,40.09,40.46,40.83,40.96,
+41.38,41.58,41.67,42.09,42.35,42.71,43.17,43.21,43.38,44.02,
+44.13,44.35,44.91,44.84,45.46,45.44,45.73,46.38,46.74,46.68,
+47.11,47.22,47.63,47.86,48.17,48.62,48.82,49.26,49.48,49.76,
+50.00,50.29,50.63,51.04,51.37,51.26,51.78,52.01,52.18,52.60,
+52.91,53.07,53.47,53.89,54.18,54.31,54.66,54.93,55.23,55.87,
+55.74,55.92,56.51,56.69,57.21,57.11,57.61,57.80,58.20,58.61,
+58.74,59.11,59.35,59.84,59.81,60.32,60.60,61.05,61.17,61.47,
+61.72,61.95,62.32,62.41,62.76,63.36,63.50,63.78,64.11,64.37,
+64.72,64.71,65.21,65.58,66.11,66.18,66.38,66.69,67.18,67.22,
+67.59,67.80,68.02,68.28,68.88,69.15,69.14,69.62,69.76,70.34,
+70.66,70.49,71.07,71.18,71.59,72.10,72.10,72.80,72.80,73.06,
+73.50,73.81,74.26,74.10,74.57,74.95,75.57,75.59,75.81,76.34,
+76.47,76.65,76.84,77.30,77.56,77.96,78.03,78.62,78.84,79.07,
+79.35,79.64,79.73,80.42,80.68,80.78,80.98,81.42,81.82,81.76,
+82.59,82.61,82.62,83.25,83.62,83.45,84.03,84.38,85.02,85.03,
+84.99,85.36,85.79,86.14,86.12,86.78,86.99,87.24,87.56,87.52,
+2.67,2.89,3.16,3.41,3.67,3.93,4.20,4.41,4.67,4.93,
+5.15,5.53,5.71,6.03,6.20,6.51,6.74,6.99,7.29,7.47,
+7.62,7.99,8.16,8.49,8.78,9.09,9.14,9.59,9.79,9.99,
+10.26,10.41,10.70,11.07,11.24,11.59,11.78,12.03,12.22,12.60,
+12.54,13.06,13.21,13.67,13.82,13.99,14.34,14.53,14.75,14.95,
+15.36,15.51,15.74,16.05,16.38,16.36,16.79,16.90,17.30,17.49,
+17.87,18.07,18.33,18.46,18.78,19.06,19.38,19.58,19.82,20.05,
+20.21,20.58,20.94,21.11,21.35,21.60,21.79,22.22,22.23,22.52,
+22.73,23.16,23.24,23.55,23.75,24.09,24.24,24.62,24.86,25.17,
+25.51,25.66,25.73,26.04,26.34,26.63,26.89,27.23,27.52,27.80,
+27.87,28.10,28.39,28.59,28.95,29.33,29.45,29.78,29.90,30.30,
+30.35,30.51,30.87,31.08,31.31,31.75,31.84,32.19,32.26,32.70,
+32.91,33.18,33.43,33.91,33.96,34.19,34.48,34.83,34.91,35.27,
+35.11,35.52,36.03,36.15,36.47,36.93,36.93,37.16,37.57,37.61,
+38.18,38.19,38.49,38.77,39.04,38.93,39.76,39.89,40.12,40.34,
+40.37,40.61,41.40,41.17,41.53,42.09,42.13,42.52,42.30,42.54,
+43.15,43.18,43.35,43.77,43.99,44.42,44.62,44.95,45.08,45.51,
+45.52,45.89,46.07,46.23,46.50,46.88,46.83,47.27,47.45,47.81,
+48.01,48.45,48.55,48.90,49.12,49.50,49.31,49.82,50.15,50.56,
+50.57,50.87,51.05,51.08,51.33,51.48,51.99,52.48,52.71,52.70,
+52.97,53.14,53.60,53.91,53.93,54.12,54.59,55.03,55.07,55.67,
+55.45,55.77,55.99,56.33,56.39,56.65,57.20,57.50,57.57,57.69,
+58.29,58.35,58.49,58.48,59.20,59.65,59.44,59.94,60.28,60.45,
+60.52,60.94,61.18,61.34,61.44,61.42,62.22,62.38,62.88,62.74,
+63.23,63.43,63.44,63.89,64.09,64.48,64.53,64.93,65.50,65.42,
+65.97,65.85,66.00,66.27,66.92,66.91,67.12,67.61,67.65,67.72,
+68.08,68.60,68.62,69.08,69.06,69.47,69.75,69.91,70.49,70.90,
+70.57,70.89,71.32,71.44,72.00,72.07,72.17,72.34,72.31,73.30,
+73.37,73.53,73.47,73.84,74.35,74.77,74.64,75.06,75.41,75.58,
+2.34,2.50,2.78,2.97,3.18,3.35,3.69,3.84,3.99,4.23,
+4.52,4.68,4.93,5.06,5.35,5.54,5.73,6.02,6.25,6.46,
+6.69,6.86,7.05,7.22,7.42,7.72,7.90,8.22,8.32,8.58,
+8.66,9.00,9.26,9.53,9.57,9.77,10.12,10.27,10.44,10.71,
+10.97,11.09,11.39,11.70,11.91,12.14,12.34,12.57,12.82,12.88,
+13.17,13.34,13.61,13.83,13.99,14.27,14.47,14.65,14.94,15.04,
+15.36,15.46,15.81,15.99,16.22,16.41,16.62,16.79,17.15,17.15,
+17.46,17.81,17.80,18.30,18.28,18.61,18.68,19.05,19.40,19.36,
+19.45,19.86,20.12,20.47,20.53,20.90,21.11,21.12,21.39,21.67,
+21.70,22.09,22.35,22.43,22.75,22.83,23.05,23.25,23.60,23.62,
+23.95,24.18,24.59,24.57,24.91,25.00,25.10,25.59,25.60,25.75,
+26.23,26.16,26.47,26.75,26.96,27.22,27.30,27.56,27.92,28.09,
+28.27,28.54,28.70,28.94,29.26,29.42,29.62,29.87,30.11,30.15,
+30.59,30.69,30.87,31.27,30.93,31.55,31.72,31.96,32.17,32.51,
+32.57,33.07,33.16,33.32,33.55,33.90,34.16,34.08,34.38,34.45,
+34.92,35.16,35.27,35.33,35.86,35.88,36.07,36.30,36.61,36.78,
+36.79,37.29,37.42,37.62,37.91,38.09,38.19,38.38,38.49,39.05,
+39.17,39.39,39.42,39.89,40.28,40.27,40.42,40.70,40.82,41.13,
+41.35,41.70,41.78,41.98,42.19,42.21,42.81,42.83,43.03,43.10,
+43.58,43.87,44.05,44.15,44.35,44.61,44.66,44.67,45.14,45.86,
+45.80,45.80,46.25,46.34,46.48,46.77,46.88,47.23,47.83,47.77,
+47.79,48.06,48.21,48.23,48.55,48.63,49.22,49.43,49.47,49.78,
+49.80,50.00,50.27,50.48,50.90,50.94,51.14,51.45,51.67,51.83,
+52.14,52.45,52.59,52.63,53.26,53.13,53.59,53.66,53.70,54.29,
+54.31,54.58,54.64,54.99,55.21,55.21,55.75,55.67,55.80,56.30,
+56.48,56.58,56.86,57.13,57.36,57.67,57.79,58.26,58.28,58.20,
+58.58,58.65,59.24,59.65,59.59,59.69,59.95,60.03,60.47,60.45,
+60.69,61.43,60.85,61.36,61.94,62.20,62.21,62.32,62.59,62.56,
+62.98,63.35,63.57,63.93,63.64,64.27,64.26,64.56,64.98,65.15,
+2.00,2.23,2.35,2.52,2.70,2.85,3.15,3.27,3.44,3.70,
+3.93,4.03,4.17,4.36,4.60,4.76,5.01,5.11,5.30,5.58,
+5.68,5.93,6.12,6.25,6.37,6.72,6.89,7.16,7.31,7.41,
+7.63,7.71,7.89,8.15,8.30,8.54,8.67,8.96,9.11,9.30,
+9.44,9.59,9.90,10.01,10.18,10.31,10.60,10.85,10.87,11.07,
+11.40,11.52,11.71,11.79,12.03,12.16,12.44,12.54,12.81,12.98,
+13.23,13.22,13.55,13.80,13.96,14.11,14.30,14.51,14.81,14.83,
+15.04,15.32,15.47,15.65,15.82,15.93,15.91,16.33,16.70,16.77,
+16.88,16.99,17.34,17.40,17.84,17.92,17.96,18.11,18.32,18.48,
+18.83,18.83,19.11,19.32,19.58,19.53,19.82,19.98,20.23,20.32,
+20.68,20.71,21.10,21.15,21.20,21.39,21.86,21.77,21.85,22.17,
+22.65,22.74,22.84,23.14,23.27,23.58,23.47,23.77,23.89,24.18,
+24.37,24.59,24.72,25.07,25.26,25.31,25.38,25.77,25.98,26.06,
+26.16,26.37,26.58,26.79,26.94,26.95,27.30,27.54,27.67,27.95,
+27.97,28.09,28.58,28.57,28.79,29.13,29.32,29.17,29.66,29.66,
+29.89,30.16,30.31,30.57,30.76,30.93,31.14,31.37,31.43,31.55,
+31.80,31.94,32.24,32.41,32.48,32.60,32.83,33.21,33.34,33.55,
+33.57,33.96,33.95,34.34,34.40,34.48,35.01,34.92,35.24,35.57,
+35.56,35.66,35.82,36.17,36.34,36.55,36.46,36.76,37.04,37.25,
+37.50,37.59,37.56,38.01,38.17,38.39,38.57,38.60,39.00,39.24,
+39.08,39.29,39.61,39.73,40.17,40.26,40.18,40.60,40.69,40.75,
+40.91,41.18,41.42,41.79,42.18,42.16,42.19,42.79,42.53,42.91,
+42.96,42.89,43.49,43.68,43.68,44.27,44.20,44.44,44.54,44.62,
+44.91,45.28,45.18,45.58,45.30,45.83,46.06,45.95,46.40,46.72,
+46.69,47.13,47.14,47.38,47.51,47.65,47.71,48.29,48.13,48.51,
+48.50,48.88,48.85,48.95,49.30,49.36,49.87,49.82,50.34,50.17,
+50.44,50.54,50.78,51.03,51.05,51.48,51.38,51.76,52.11,52.01,
+52.54,52.58,52.71,52.88,52.83,53.18,52.98,53.89,53.63,53.47,
+54.15,54.53,54.78,54.62,54.92,54.85,55.19,55.31,55.49,55.85,
+1.74,1.87,2.06,2.17,2.31,2.50,2.62,2.89,2.95,3.12,
+3.25,3.38,3.61,3.78,3.99,4.14,4.28,4.40,4.59,4.83,
+4.90,5.05,5.12,5.42,5.44,5.72,5.90,5.94,6.28,6.38,
+6.51,6.68,6.88,6.96,7.21,7.29,7.47,7.61,7.89,8.00,
+8.21,8.33,8.39,8.71,8.76,8.94,9.01,9.20,9.40,9.69,
+9.69,9.76,10.15,10.19,10.36,10.35,10.73,10.78,11.02,11.22,
+11.53,11.59,11.70,11.71,12.07,12.03,12.30,12.32,12.63,12.67,
+12.85,12.88,13.16,13.42,13.71,13.69,13.95,14.10,14.14,14.22,
+14.43,14.62,14.79,14.97,15.23,15.50,15.40,15.72,15.79,16.05,
+16.10,16.16,16.38,16.63,16.92,16.97,17.10,17.03,17.16,17.47,
+17.80,17.83,18.08,18.20,18.50,18.62,18.77,18.68,18.94,19.30,
+19.48,19.76,19.82,19.98,20.10,20.09,20.43,20.59,20.55,20.93,
+20.84,21.06,21.34,21.52,21.58,21.66,21.87,22.12,22.21,22.42,
+22.75,22.64,22.76,23.11,22.98,23.35,23.66,23.62,23.82,23.77,
+24.08,24.05,24.60,24.65,24.69,24.81,25.25,25.10,25.51,25.61,
+25.64,25.94,26.15,26.26,26.30,26.58,26.77,26.94,27.03,27.27,
+27.33,27.56,27.59,27.96,27.94,28.14,28.59,28.40,28.75,28.72,
+29.08,29.30,29.23,29.41,29.70,29.73,30.02,29.84,30.30,30.36,
+30.70,30.78,30.83,31.09,31.15,31.52,31.41,31.63,31.75,31.86,
+32.28,32.40,32.39,32.54,32.80,32.95,33.05,33.30,33.45,33.49,
+33.77,33.85,33.83,34.21,34.24,34.47,34.49,34.93,34.84,35.12,
+35.37,35.66,35.52,35.93,36.16,36.42,36.15,36.53,36.78,36.74,
+36.91,36.85,37.23,37.37,37.48,37.75,37.80,38.23,38.30,38.15,
+38.91,38.86,38.92,38.96,38.96,39.33,39.67,39.91,39.83,40.34,
+40.31,40.49,40.34,40.60,40.81,40.93,41.11,41.44,41.52,41.57,
+41.85,41.94,42.02,42.34,42.54,42.74,42.79,43.01,43.26,43.09,
+43.42,43.28,43.30,43.75,44.40,44.15,44.41,44.58,44.84,44.83,
+44.80,45.30,45.35,45.41,45.81,45.92,46.02,46.03,46.24,46.52,
+46.44,46.92,47.02,47.30,46.97,47.32,47.34,47.76,48.00,47.98,
+1.47,1.58,1.75,1.88,1.98,2.15,2.29,2.49,2.57,2.65,
+2.83,2.98,3.10,3.26,3.43,3.50,3.60,3.83,3.95,3.98,
+4.27,4.34,4.55,4.69,4.78,4.90,5.04,5.15,5.36,5.42,
+5.67,5.80,5.77,5.97,6.25,6.36,6.51,6.50,6.71,6.80,
+6.89,7.11,7.31,7.36,7.62,7.69,7.77,7.91,8.11,8.35,
+8.45,8.42,8.66,8.73,8.95,9.04,9.28,9.41,9.56,9.48,
+9.78,9.93,9.98,10.20,10.21,10.40,10.62,10.61,10.78,10.98,
+11.22,11.27,11.26,11.55,11.61,11.86,11.98,12.22,12.15,12.34,
+12.35,12.77,12.83,12.89,12.96,13.14,13.41,13.46,13.43,13.67,
+13.69,13.95,14.22,14.35,14.54,14.41,14.78,14.86,15.15,15.29,
+15.20,15.39,15.49,15.72,15.69,16.11,15.94,16.16,16.26,16.48,
+16.73,16.82,17.01,16.91,17.34,17.26,17.42,17.53,17.63,17.89,
+17.95,18.13,18.22,18.28,18.55,18.64,18.73,18.98,19.00,19.29,
+19.36,19.39,19.63,19.88,19.75,20.07,20.19,20.23,20.44,20.62,
+20.92,20.78,20.89,21.25,21.39,21.38,21.89,21.79,22.00,22.05,
+22.23,22.12,22.36,22.45,22.56,23.01,22.84,23.24,23.32,23.37,
+23.47,23.53,23.86,24.10,24.13,24.22,24.42,24.75,24.64,24.80,
+24.84,24.98,25.23,25.39,25.50,25.74,25.69,25.82,26.04,26.00,
+26.30,26.48,26.51,26.53,26.85,27.16,27.02,27.33,27.39,27.50,
+27.71,28.18,27.91,28.15,28.38,28.32,28.79,28.61,28.88,28.86,
+28.95,29.00,29.56,29.67,29.50,29.75,29.54,29.83,30.20,30.37,
+30.25,30.38,30.97,30.79,30.89,31.02,31.28,31.48,31.34,31.60,
+31.71,32.11,32.12,32.13,31.86,32.38,32.66,32.77,33.01,33.02,
+33.29,33.38,33.52,33.55,33.72,34.01,33.89,34.04,34.26,34.50,
+34.27,34.64,34.68,34.94,35.20,35.09,35.21,35.38,35.59,35.58,
+35.94,36.19,36.12,36.13,36.56,36.44,36.52,37.24,36.87,37.03,
+37.37,37.35,37.61,38.10,37.72,38.07,38.27,38.28,38.26,38.47,
+38.82,38.68,38.87,39.04,39.05,39.47,39.44,39.83,39.75,40.05,
+39.95,39.99,39.94,40.44,40.77,41.10,40.84,40.99,41.10,41.42,
+1.26,1.39,1.48,1.65,1.75,1.86,1.92,2.16,2.17,2.34,
+2.43,2.56,2.69,2.75,2.89,2.97,3.13,3.30,3.41,3.49,
+3.54,3.74,3.97,3.96,4.10,4.21,4.29,4.46,4.66,4.71,
+4.73,4.93,5.01,5.16,5.36,5.37,5.51,5.76,5.77,5.88,
+5.99,6.15,6.24,6.48,6.55,6.67,6.74,6.88,6.93,7.07,
+7.16,7.27,7.48,7.59,7.61,7.80,7.89,7.90,8.22,8.20,
+8.41,8.42,8.59,8.77,8.76,9.08,9.18,9.22,9.46,9.32,
+9.52,9.70,9.92,9.87,10.10,10.28,10.05,10.40,10.63,10.55,
+10.69,10.96,10.86,11.10,11.19,11.33,11.48,11.52,11.47,11.73,
+11.88,12.06,12.09,12.30,12.31,12.53,12.60,12.82,12.91,13.01,
+13.08,13.12,13.27,13.61,13.50,13.63,13.84,13.95,14.11,14.20,
+14.29,14.43,14.53,14.60,14.64,15.06,15.12,15.30,15.26,15.41,
+15.38,15.58,15.76,15.89,16.01,16.04,16.15,16.40,16.40,16.34,
+16.71,16.88,17.05,17.12,17.36,17.32,17.25,17.56,17.73,17.80,
+17.94,18.10,17.98,18.10,18.49,18.52,18.70,18.70,18.70,19.03,
+19.01,19.10,19.26,19.51,19.48,19.48,19.67,19.88,19.84,20.02,
+20.30,20.09,20.34,20.46,20.62,20.69,20.95,21.06,21.23,21.32,
+21.37,21.55,21.70,21.61,21.90,21.83,22.34,22.16,22.32,22.70,
+22.45,22.76,22.81,22.98,23.08,23.26,23.26,23.84,23.50,23.71,
+23.93,23.93,23.92,24.15,24.37,24.35,24.56,24.79,24.80,24.68,
+24.97,25.04,25.25,25.44,25.39,25.45,25.75,25.72,25.81,25.95,
+26.14,26.02,26.58,26.38,26.70,26.75,26.78,26.83,26.98,27.40,
+27.29,27.65,27.45,27.63,27.91,27.97,27.76,28.12,28.31,28.44,
+28.56,28.43,28.59,28.77,29.09,29.35,29.34,29.33,29.62,29.71,
+29.84,29.48,30.00,30.24,30.27,30.32,30.40,30.57,30.66,30.85,
+30.75,31.07,30.93,31.19,31.63,31.59,31.67,31.57,31.86,32.00,
+31.99,32.17,32.17,32.45,32.59,32.63,32.73,32.83,33.18,33.40,
+33.11,33.26,33.86,33.25,33.69,34.15,34.15,34.00,34.24,34.38,
+34.49,34.66,34.59,34.88,35.03,34.85,35.30,35.33,35.32,35.49,
+1.13,1.13,1.30,1.44,1.42,1.56,1.67,1.75,1.94,1.96,
+2.11,2.19,2.33,2.42,2.48,2.57,2.72,2.79,2.92,3.04,
+3.14,3.18,3.28,3.42,3.56,3.61,3.71,3.81,3.95,4.03,
+4.07,4.19,4.32,4.52,4.65,4.66,4.67,4.83,4.89,5.08,
+5.16,5.24,5.37,5.46,5.47,5.62,5.79,5.90,5.88,6.20,
+6.17,6.32,6.43,6.53,6.59,6.63,6.80,6.88,7.00,7.14,
+7.26,7.39,7.40,7.50,7.59,7.65,7.87,7.89,7.95,8.20,
+8.26,8.31,8.33,8.51,8.68,8.78,8.95,9.02,9.04,9.20,
+9.38,9.31,9.43,9.44,9.71,9.78,9.78,10.04,10.11,10.02,
+10.26,10.38,10.37,10.62,10.78,10.57,10.86,11.04,11.13,11.36,
+11.17,11.47,11.38,11.57,11.77,11.90,11.76,12.12,12.16,12.19,
+12.41,12.45,12.56,12.50,12.62,12.75,12.82,13.12,12.99,13.27,
+13.49,13.35,13.58,13.68,13.58,13.93,14.06,13.93,14.15,14.07,
+14.33,14.33,14.54,14.50,14.59,14.73,14.90,14.84,14.82,15.28,
+15.33,15.46,15.66,15.73,15.76,15.76,16.05,16.12,16.04,16.24,
+16.34,16.48,16.45,16.82,16.89,17.04,17.04,16.98,17.30,17.37,
+17.29,17.56,17.74,17.43,17.61,17.80,18.09,17.97,18.37,18.33,
+18.36,18.59,18.55,18.76,18.82,18.95,19.08,19.18,19.10,19.40,
+19.40,19.51,19.69,19.92,19.89,19.97,20.06,20.16,20.47,20.28,
+20.44,20.61,20.74,20.77,20.91,20.79,20.81,21.05,21.02,21.28,
+21.16,21.57,21.66,21.82,21.65,21.88,22.16,22.26,22.31,22.52,
+22.49,22.48,22.60,22.99,22.89,23.15,23.02,23.16,23.43,23.44,
+23.38,23.57,23.72,24.08,24.03,24.11,24.21,24.18,24.13,24.55,
+24.56,24.58,24.78,24.76,24.84,25.21,25.39,25.19,25.36,25.32,
+25.85,25.42,25.76,25.66,25.90,25.95,26.26,26.25,26.40,26.41,
+26.45,26.84,26.71,26.98,26.94,27.17,27.02,27.19,27.44,27.51,
+27.77,27.72,27.93,27.77,28.10,28.12,28.38,28.40,28.27,28.60,
+28.61,28.71,28.93,29.09,28.95,29.18,29.22,29.17,29.51,29.34,
+29.69,30.00,29.94,29.97,29.88,29.98,29.89,29.99,30.61,30.76,
+0.91,1.05,1.11,1.23,1.32,1.35,1.44,1.55,1.65,1.76,
+1.88,1.83,1.97,2.10,2.12,2.22,2.33,2.41,2.48,2.62,
+2.74,2.74,2.91,2.98,3.02,3.10,3.20,3.21,3.46,3.43,
+3.52,3.57,3.76,3.73,3.98,4.00,4.09,4.12,4.26,4.30,
+4.46,4.43,4.59,4.65,4.67,4.79,4.95,5.08,5.15,5.25,
+5.36,5.45,5.47,5.55,5.66,5.88,5.86,5.88,6.02,6.18,
+6.24,6.21,6.30,6.39,6.65,6.55,6.81,6.63,6.92,6.97,
+7.10,7.09,7.27,7.52,7.57,7.48,7.59,7.72,7.63,7.96,
+8.06,8.13,8.18,8.20,8.42,8.51,8.49,8.59,8.72,8.92,
+8.84,8.84,8.94,8.94,9.15,9.36,9.32,9.39,9.45,9.39,
+9.71,9.70,9.86,10.03,10.00,10.13,10.25,10.29,10.29,10.55,
+10.54,10.60,10.76,10.79,11.01,11.04,11.29,11.28,11.12,11.43,
+11.37,11.58,11.61,11.86,11.79,11.99,11.94,12.03,12.16,12.09,
+12.27,12.44,12.56,12.51,12.50,12.87,12.90,12.99,13.07,13.13,
+13.23,13.29,13.56,13.55,13.49,13.63,13.63,13.87,13.91,14.03,
+13.89,14.20,14.20,14.21,14.38,14.39,14.67,14.76,14.68,14.96,
+14.88,14.90,15.23,15.27,15.44,15.33,15.48,15.74,15.66,15.68,
+16.10,15.84,16.04,16.17,16.09,16.19,16.38,16.46,16.64,16.84,
+16.81,16.63,16.64,16.99,16.98,17.22,17.28,17.42,17.31,17.57,
+17.55,17.66,17.63,17.77,17.74,17.94,18.26,18.35,18.20,18.35,
+18.46,18.48,18.56,18.54,18.96,18.84,18.86,19.12,19.35,19.35,
+19.26,19.39,19.53,19.87,19.66,19.88,19.83,19.97,20.06,20.04,
+20.28,20.31,20.25,20.36,20.58,20.57,21.00,20.74,21.04,21.08,
+21.14,21.20,21.25,21.21,21.49,21.40,21.69,21.69,21.72,21.93,
+22.02,21.96,22.21,22.32,22.09,22.26,22.70,22.61,22.93,22.94,
+22.71,22.78,23.09,23.23,23.07,23.26,23.20,23.49,23.75,23.70,
+23.63,23.70,24.08,24.08,23.99,23.93,24.35,24.18,24.35,24.52,
+24.56,24.64,24.86,24.66,25.02,25.29,25.12,25.18,25.33,25.37,
+25.72,25.82,25.82,25.70,26.16,26.03,26.12,25.77,26.34,26.03,
+0.81,0.82,0.91,1.05,1.08,1.17,1.27,1.29,1.36,1.49,
+1.57,1.65,1.67,1.75,1.79,1.96,1.98,2.09,2.18,2.18,
+2.36,2.40,2.42,2.55,2.56,2.66,2.72,2.88,2.88,2.92,
+3.04,3.11,3.14,3.33,3.36,3.48,3.57,3.59,3.66,3.69,
+3.73,3.93,3.97,4.05,4.16,4.31,4.21,4.42,4.53,4.48,
+4.54,4.67,4.72,4.76,4.92,4.91,5.06,5.08,5.15,5.26,
+5.31,5.29,5.43,5.53,5.62,5.72,5.79,5.79,6.01,6.04,
+5.99,6.04,6.32,6.36,6.39,6.48,6.53,6.61,6.59,6.77,
+6.75,7.00,7.04,7.08,7.13,7.15,7.29,7.49,7.32,7.52,
+7.55,7.62,7.71,7.84,7.92,7.95,8.01,8.19,8.22,8.22,
+8.39,8.57,8.41,8.53,8.67,8.77,8.76,9.06,8.98,9.16,
+9.10,9.11,9.36,9.48,9.31,9.46,9.52,9.69,9.68,9.83,
+9.85,9.96,9.99,10.20,10.27,10.20,10.33,10.50,10.52,10.61,
+10.68,10.61,10.88,10.99,10.99,10.95,11.23,11.09,11.09,11.26,
+11.44,11.39,11.41,11.55,11.65,11.87,11.73,11.90,12.04,11.84,
+12.24,12.21,12.29,12.42,12.38,12.53,12.67,12.67,12.74,12.82,
+12.87,12.98,13.13,13.14,13.20,13.28,13.17,13.47,13.47,13.60,
+13.51,13.79,13.74,13.82,13.95,13.89,14.13,14.20,14.13,14.40,
+14.39,14.39,14.30,14.51,14.65,14.59,14.87,14.98,15.02,14.92,
+15.26,15.11,15.42,15.35,15.46,15.57,15.45,15.74,15.75,15.73,
+15.74,15.80,15.84,16.22,15.96,16.40,16.43,16.37,16.43,16.43,
+16.61,16.73,16.82,16.70,16.85,17.12,16.99,17.33,17.28,17.31,
+17.43,17.23,17.29,17.68,17.70,17.79,17.90,17.92,18.20,18.18,
+18.15,18.18,18.22,18.38,18.54,18.39,18.70,18.82,18.75,18.92,
+18.74,18.94,19.10,19.18,19.23,19.13,19.42,19.53,19.31,19.57,
+19.68,19.72,19.91,19.81,19.96,20.12,20.34,20.04,20.43,20.51,
+20.31,20.50,20.44,20.62,20.91,20.92,20.74,20.93,21.11,21.14,
+21.06,21.27,21.40,21.31,21.46,21.54,21.63,21.61,21.78,21.76,
+21.89,21.96,22.08,22.16,22.27,22.16,22.56,22.34,22.33,22.66,
+0.68,0.74,0.79,0.89,0.97,0.99,1.10,1.18,1.21,1.27,
+1.32,1.46,1.46,1.47,1.61,1.67,1.73,1.80,1.85,1.99,
+1.93,2.00,2.13,2.21,2.27,2.35,2.42,2.30,2.46,2.54,
+2.57,2.73,2.76,2.83,2.90,2.96,3.01,3.12,3.18,3.19,
+3.21,3.38,3.34,3.56,3.47,3.58,3.68,3.81,3.78,3.90,
+3.90,3.90,3.94,4.12,4.08,4.22,4.17,4.44,4.36,4.43,
+4.68,4.74,4.71,4.77,4.88,4.92,4.85,4.96,5.11,5.30,
+5.20,5.28,5.43,5.32,5.60,5.60,5.54,5.68,5.74,5.82,
+5.81,5.92,6.07,6.10,6.28,6.28,6.37,6.30,6.36,6.50,
+6.56,6.55,6.69,6.67,6.94,6.92,7.00,6.96,7.04,7.18,
+7.33,7.16,7.26,7.36,7.48,7.69,7.50,7.63,7.61,7.75,
+7.88,7.75,8.00,7.96,8.24,8.14,8.14,8.29,8.32,8.37,
+8.33,8.45,8.63,8.75,8.70,8.78,8.85,8.96,8.97,9.19,
+9.02,9.18,9.37,9.34,9.40,9.53,9.53,9.59,9.61,9.64,
+9.75,9.71,9.83,10.02,10.06,10.30,10.18,10.22,10.40,10.27,
+10.27,10.40,10.64,10.66,10.71,10.70,10.74,10.88,10.99,10.89,
+11.00,10.99,11.21,11.36,11.42,11.31,11.40,11.51,11.58,11.59,
+11.76,11.69,11.77,11.93,11.97,12.03,12.11,12.13,12.15,12.28,
+12.27,12.44,12.38,12.69,12.44,12.58,12.85,12.83,12.98,12.77,
+13.06,13.24,13.08,13.32,13.28,13.47,13.22,13.48,13.62,13.58,
+13.70,13.57,13.74,13.82,13.84,14.04,13.95,14.19,14.12,14.35,
+14.24,14.51,14.44,14.48,14.46,14.69,14.74,14.74,14.73,14.82,
+14.91,15.11,15.16,15.26,15.35,15.04,15.40,15.55,15.48,15.54,
+15.75,15.50,15.82,15.87,15.95,15.95,16.00,15.85,16.10,16.30,
+16.01,16.35,16.23,16.64,16.52,16.50,16.83,16.87,16.71,16.78,
+16.70,16.89,17.05,17.22,17.12,17.39,17.32,17.25,17.48,17.44,
+17.54,17.65,17.59,17.69,17.69,17.84,18.00,18.20,18.20,18.29,
+18.07,18.25,18.18,18.14,18.43,18.41,18.47,18.57,18.92,18.74,
+18.92,18.95,18.88,18.81,19.07,19.04,19.20,19.23,19.56,19.38,
+0.60,0.69,0.69,0.76,0.78,0.86,0.92,0.94,1.05,1.07,
+1.12,1.25,1.24,1.28,1.35,1.41,1.49,1.61,1.62,1.68,
+1.64,1.71,1.78,1.89,1.95,1.97,2.12,2.07,2.15,2.15,
+2.29,2.36,2.41,2.46,2.52,2.53,2.57,2.65,2.71,2.81,
+2.87,2.93,2.97,3.00,3.06,3.04,3.15,3.21,3.27,3.24,
+3.34,3.43,3.53,3.54,3.71,3.66,3.58,3.74,3.92,3.84,
+3.93,4.00,4.20,4.10,4.17,4.22,4.24,4.28,4.39,4.42,
+4.53,4.58,4.62,4.63,4.76,4.77,4.72,4.83,5.01,5.01,
+5.03,5.00,5.19,5.30,5.25,5.29,5.34,5.34,5.52,5.55,
+5.62,5.63,5.72,5.66,5.81,5.80,6.00,5.90,5.98,6.03,
+6.14,6.10,6.37,6.27,6.39,6.41,6.67,6.67,6.67,6.71,
+6.76,6.83,6.90,6.95,6.93,7.09,7.17,7.08,7.19,7.20,
+7.28,7.24,7.36,7.40,7.48,7.50,7.55,7.71,7.66,7.83,
+7.90,8.05,7.94,7.96,8.21,8.10,8.18,8.42,8.24,8.40,
+8.32,8.44,8.57,8.52,8.56,8.58,8.71,8.71,8.79,8.89,
+8.79,9.15,8.93,8.97,9.27,9.33,9.19,9.39,9.50,9.59,
+9.58,9.54,9.69,9.84,9.76,9.70,9.85,9.81,10.12,9.97,
+9.99,9.98,10.25,10.40,10.30,10.38,10.40,10.52,10.62,10.49,
+10.68,10.78,10.73,10.57,11.09,10.94,10.96,10.89,11.14,11.22,
+11.14,11.17,11.38,11.43,11.47,11.52,11.49,11.73,11.50,11.55,
+11.69,11.85,11.93,12.15,12.13,11.93,12.05,12.34,12.15,12.27,
+12.37,12.44,12.46,12.65,12.45,12.60,12.46,12.59,12.80,12.81,
+12.87,12.76,12.92,13.07,13.10,13.24,13.39,13.19,13.38,13.42,
+13.29,13.62,13.61,13.57,13.77,13.60,13.78,13.70,13.89,14.02,
+13.98,13.82,14.14,14.07,14.03,14.34,14.63,14.46,14.36,14.40,
+14.48,14.67,14.77,14.64,14.64,14.78,14.71,15.06,15.04,14.98,
+15.09,15.28,15.37,15.29,15.14,15.49,15.23,15.48,15.52,15.61,
+15.78,15.86,15.81,15.77,15.80,15.98,16.16,16.21,15.97,16.23,
+16.28,16.37,16.19,16.39,16.31,16.45,16.50,16.49,16.77,16.58,
+0.49,0.58,0.60,0.67,0.73,0.72,0.81,0.81,0.90,0.96,
+1.02,1.07,1.07,1.12,1.17,1.18,1.31,1.32,1.34,1.45,
+1.45,1.51,1.57,1.60,1.58,1.67,1.74,1.80,1.82,1.85,
+1.90,2.03,2.08,2.15,2.03,2.21,2.18,2.29,2.26,2.40,
+2.44,2.42,2.61,2.58,2.61,2.70,2.71,2.71,2.79,2.84,
+2.96,2.92,3.06,3.10,3.08,3.10,3.23,3.24,3.34,3.28,
+3.42,3.40,3.48,3.50,3.64,3.62,3.67,3.61,3.84,3.81,
+3.80,3.88,3.95,4.02,4.10,4.12,4.04,4.28,4.25,4.30,
+4.30,4.42,4.36,4.53,4.62,4.56,4.69,4.72,4.60,4.81,
+4.87,4.81,4.88,4.94,5.05,5.14,5.03,5.10,5.18,5.24,
+5.35,5.34,5.34,5.46,5.38,5.50,5.63,5.70,5.71,5.85,
+5.69,5.86,6.04,5.89,6.01,6.07,5.93,6.14,6.20,6.18,
+6.42,6.29,6.38,6.40,6.55,6.53,6.68,6.52,6.54,6.70,
+6.66,6.77,6.71,6.99,6.87,6.94,7.08,7.10,7.12,7.09,
+7.29,7.23,7.33,7.46,7.35,7.51,7.56,7.58,7.51,7.70,
+7.74,7.78,7.84,7.85,7.79,7.91,7.92,7.85,8.04,7.94,
+8.27,8.15,8.37,8.33,8.26,8.36,8.50,8.57,8.55,8.71,
+8.65,8.83,8.91,8.78,8.94,8.87,8.98,8.92,9.08,8.98,
+9.12,9.17,9.30,9.23,9.34,9.33,9.48,9.46,9.59,9.57,
+9.46,9.75,9.83,9.72,9.73,9.86,9.92,10.01,10.11,9.99,
+10.02,10.20,10.08,10.29,10.37,10.23,10.42,10.48,10.43,10.41,
+10.56,10.57,10.65,10.58,10.71,10.73,11.02,10.95,10.93,11.01,
+10.92,11.13,11.10,11.27,11.25,11.36,11.49,11.47,11.35,11.42,
+11.71,11.47,11.75,11.78,11.69,11.80,11.88,11.83,11.80,11.93,
+12.09,12.00,12.00,12.12,12.19,12.34,12.30,12.47,12.49,12.36,
+12.69,12.52,12.51,12.32,12.72,12.85,12.69,12.83,12.78,12.99,
+13.00,13.12,13.06,13.08,13.02,13.23,13.27,13.37,13.40,13.31,
+13.51,13.51,13.57,13.49,13.70,13.45,13.87,13.90,13.89,14.06,
+13.78,13.99,14.09,14.20,14.15,14.18,14.12,14.27,14.17,14.57,
+0.43,0.48,0.53,0.57,0.62,0.66,0.63,0.69,0.76,0.81,
+0.83,0.88,0.94,1.01,1.08,1.08,1.10,1.11,1.14,1.25,
+1.24,1.31,1.40,1.40,1.38,1.50,1.53,1.58,1.62,1.61,
+1.72,1.75,1.67,1.82,1.84,1.93,1.93,1.98,1.98,2.07,
+2.06,2.13,2.17,2.21,2.29,2.31,2.31,2.40,2.47,2.40,
+2.40,2.58,2.54,2.57,2.67,2.67,2.76,2.80,2.88,2.91,
+2.83,2.96,3.02,3.02,3.07,3.10,3.19,3.19,3.26,3.35,
+3.35,3.37,3.44,3.53,3.44,3.56,3.62,3.64,3.66,3.73,
+3.73,3.83,3.79,3.82,3.87,4.03,3.94,4.16,4.06,4.18,
+4.17,4.17,4.22,4.22,4.33,4.29,4.31,4.36,4.46,4.39,
+4.62,4.67,4.66,4.75,4.67,4.79,4.89,4.82,4.78,4.80,
+5.00,5.08,5.11,5.10,5.06,5.14,5.10,5.14,5.37,5.40,
+5.41,5.46,5.49,5.49,5.67,5.49,5.64,5.70,5.62,5.82,
+5.77,5.85,5.86,6.05,6.10,6.07,6.08,6.11,6.14,6.15,
+6.15,6.24,6.33,6.25,6.38,6.49,6.40,6.62,6.51,6.54,
+6.55,6.64,6.72,6.75,6.66,6.79,6.90,7.00,6.96,6.99,
+7.06,7.01,7.19,7.10,7.32,7.16,7.32,7.42,7.46,7.47,
+7.51,7.62,7.45,7.53,7.58,7.59,7.74,7.66,7.78,7.81,
+7.81,7.95,7.85,7.87,8.17,8.07,8.11,8.21,8.11,8.34,
+8.13,8.31,8.26,8.41,8.35,8.48,8.52,8.55,8.74,8.69,
+8.68,8.75,8.77,8.76,8.79,8.85,8.95,8.89,9.09,9.16,
+8.97,9.20,9.21,9.17,9.35,9.28,9.41,9.40,9.46,9.43,
+9.61,9.51,9.49,9.71,9.71,9.69,9.56,9.81,9.91,10.04,
+9.94,9.99,10.12,10.00,10.11,10.07,10.05,10.41,10.26,10.28,
+10.42,10.41,10.40,10.71,10.47,10.68,10.70,10.48,10.71,10.72,
+10.59,10.89,10.83,10.96,11.01,10.95,11.03,11.07,10.98,11.29,
+10.97,11.08,11.27,11.22,11.42,11.40,11.40,11.55,11.45,11.50,
+11.59,11.66,11.66,11.78,11.92,11.56,11.79,11.75,11.82,11.91,
+11.95,12.16,12.09,12.08,12.21,12.30,12.23,12.03,12.36,12.32,
+3.77,4.12,4.53,4.88,5.27,5.59,5.89,6.20,6.67,7.02,
+7.33,7.59,8.13,8.38,8.72,9.07,9.50,9.87,10.18,10.42,
+10.85,11.29,11.57,11.92,12.20,12.62,13.06,13.32,13.65,14.17,
+14.35,14.74,15.13,15.55,15.83,16.14,16.55,16.82,17.26,17.52,
+18.09,18.47,18.71,18.91,19.19,19.70,20.07,20.37,20.85,21.26,
+21.34,21.87,22.18,22.64,22.87,23.35,23.64,23.87,24.30,24.63,
+25.00,25.27,25.62,26.16,26.45,26.70,27.04,27.55,28.08,28.24,
+28.43,28.91,29.30,29.66,30.03,30.39,30.60,31.07,31.33,31.93,
+32.20,32.44,32.96,33.34,33.27,33.90,34.18,34.40,34.80,35.28,
+35.59,36.12,36.53,36.86,37.15,37.35,37.63,38.20,38.60,38.92,
+38.97,39.53,40.02,40.36,40.84,41.08,41.62,41.72,42.23,42.59,
+42.60,43.06,43.38,43.81,44.24,44.62,44.96,45.27,45.67,46.00,
+46.35,46.42,47.14,47.47,47.59,48.07,48.31,48.70,48.95,49.38,
+49.79,50.15,50.45,50.62,50.99,51.67,51.98,52.28,52.81,52.91,
+53.36,53.83,54.16,54.47,54.93,54.97,55.74,55.70,55.82,56.54,
+57.04,57.33,57.70,57.89,58.33,58.83,59.12,59.84,59.87,60.11,
+60.41,61.05,61.26,61.59,61.93,61.97,62.54,62.95,63.31,63.77,
+63.67,64.41,64.82,65.21,65.48,66.25,66.09,66.43,66.72,67.07,
+67.31,67.60,67.95,68.76,68.82,69.31,69.64,70.40,70.45,70.74,
+71.24,71.45,71.97,71.95,72.44,73.05,73.12,73.65,73.78,74.09,
+74.67,74.86,75.55,75.70,76.19,76.05,76.63,77.27,77.20,77.49,
+78.13,78.44,78.80,79.61,79.53,79.66,80.19,80.65,80.82,81.31,
+81.52,82.07,82.70,82.77,83.27,83.50,83.86,84.20,84.71,84.92,
+85.24,85.49,85.98,86.16,86.82,86.96,87.33,87.59,88.11,88.16,
+88.89,89.30,89.45,89.84,90.48,90.63,90.89,91.18,91.76,91.98,
+92.21,92.74,93.12,93.57,94.11,94.00,94.44,94.71,95.19,95.85,
+95.81,96.25,96.63,96.90,97.60,97.80,98.15,98.41,98.80,99.00,
+99.58,100.05,100.14,100.66,101.07,101.11,101.29,101.81,102.13,102.44,
+102.97,103.30,103.54,103.97,104.15,104.86,105.10,105.36,105.60,106.29,
+3.30,3.64,3.90,4.27,4.47,4.80,5.03,5.43,5.75,6.10,
+6.34,6.65,6.96,7.28,7.53,7.83,8.26,8.55,8.80,9.09,
+9.45,9.79,10.04,10.44,10.72,10.98,11.31,11.60,11.90,12.32,
+12.45,12.86,13.15,13.46,13.73,14.06,14.45,14.69,14.98,15.23,
+15.52,15.91,16.25,16.59,16.85,17.14,17.57,17.79,18.02,18.30,
+18.71,18.93,19.42,19.52,19.81,20.16,20.44,20.85,21.10,21.51,
+21.85,22.22,22.46,22.76,22.91,23.17,23.74,24.02,24.24,24.66,
+24.90,25.09,25.47,25.83,26.09,26.47,26.55,26.94,27.29,27.70,
+27.73,28.26,28.62,28.89,29.12,29.62,29.91,30.17,30.33,31.00,
+31.04,31.30,31.65,31.95,32.19,32.44,32.95,33.25,33.51,33.59,
+34.10,34.45,34.77,35.05,35.23,35.38,35.94,36.08,36.75,36.78,
+37.05,37.38,37.65,38.01,38.44,38.77,39.09,39.35,39.71,39.87,
+40.40,40.50,41.03,41.31,41.60,41.94,42.28,42.49,42.79,42.99,
+43.38,43.51,43.94,44.18,44.64,44.68,45.24,45.47,45.80,46.13,
+46.43,46.67,47.06,47.40,47.88,48.01,48.41,48.60,49.05,48.99,
+49.45,49.89,50.16,50.42,50.77,51.11,51.47,51.81,51.76,52.40,
+52.72,52.75,53.20,53.53,53.87,54.11,54.54,54.79,55.12,55.34,
+55.94,56.15,56.26,56.48,56.82,57.32,57.53,57.88,58.26,58.48,
+58.66,58.74,59.52,59.65,59.94,60.45,60.57,60.79,61.29,61.41,
+61.92,62.13,62.43,62.49,63.21,63.30,63.63,63.91,64.37,64.76,
+64.92,65.13,65.44,65.81,66.27,66.39,66.67,67.33,67.38,67.61,
+68.16,67.96,68.73,69.16,69.14,69.62,69.86,69.94,70.78,70.69,
+71.14,71.35,71.46,71.95,72.37,72.67,72.79,73.31,73.59,74.12,
+73.97,74.59,74.94,75.00,75.51,75.40,76.21,76.06,76.39,76.94,
+77.08,77.51,77.72,78.24,78.50,78.89,79.27,79.72,79.93,80.05,
+80.51,80.70,80.93,81.16,81.84,82.01,82.20,82.49,82.80,83.12,
+83.64,83.45,84.19,84.58,85.05,85.01,85.36,85.68,85.66,86.31,
+86.34,86.65,86.74,87.14,87.75,87.92,88.36,88.53,88.91,89.21,
+89.78,90.09,90.05,90.17,90.98,91.07,91.41,91.76,92.07,92.25,
+2.96,3.15,3.41,3.68,3.99,4.26,4.47,4.74,5.10,5.29,
+5.53,5.75,6.07,6.26,6.57,6.81,7.07,7.39,7.65,7.90,
+8.25,8.43,8.86,8.94,9.28,9.56,9.73,10.11,10.44,10.66,
+10.84,11.28,11.44,11.72,11.99,12.22,12.56,12.93,13.10,13.35,
+13.53,13.81,14.19,14.41,14.65,14.94,15.36,15.49,15.72,15.88,
+16.34,16.44,16.71,16.90,17.38,17.58,17.86,18.23,18.40,18.80,
+18.89,19.23,19.38,19.72,20.06,20.24,20.51,20.73,21.05,21.39,
+21.67,22.00,22.17,22.41,22.86,22.84,23.27,23.32,23.84,23.82,
+24.25,24.61,24.76,25.19,25.18,25.50,26.05,26.22,26.40,26.60,
+27.06,27.24,27.53,27.86,28.09,28.48,28.71,28.87,29.10,29.41,
+29.64,29.97,30.25,30.43,30.77,30.94,31.18,31.39,31.84,32.12,
+32.40,32.65,32.52,33.32,33.48,33.78,33.80,34.56,34.64,34.84,
+35.07,35.43,35.44,35.97,36.24,36.37,36.72,37.01,37.17,37.58,
+37.77,38.26,38.33,38.76,38.70,38.91,39.45,39.57,39.93,40.02,
+40.36,40.60,41.09,41.23,41.51,41.73,42.16,42.10,42.59,42.91,
+43.29,43.64,43.46,43.86,44.03,44.57,44.75,44.85,45.14,45.32,
+45.93,45.91,46.15,46.42,47.15,46.95,47.16,47.67,48.17,48.11,
+48.41,48.62,48.79,49.31,49.61,49.72,50.24,50.25,50.55,50.83,
+51.04,51.43,51.48,51.96,52.17,52.39,52.64,52.91,53.20,53.86,
+53.95,54.19,54.04,54.60,54.84,55.24,55.52,55.58,55.59,56.09,
+56.46,56.86,56.73,57.31,57.28,57.64,58.05,58.48,58.62,59.06,
+59.28,59.33,59.62,60.07,60.30,60.51,60.76,60.97,61.06,61.58,
+61.97,62.11,62.48,62.65,62.90,63.32,63.45,63.76,63.93,64.36,
+64.35,64.78,65.25,65.38,65.33,65.80,66.24,66.19,66.59,67.08,
+67.12,67.43,67.81,67.78,68.36,68.52,68.80,69.05,69.78,69.64,
+69.69,69.99,70.26,70.75,70.92,71.22,71.60,71.92,72.16,72.16,
+72.64,72.88,73.35,73.48,73.82,74.01,74.11,74.11,74.93,74.97,
+75.32,75.78,75.62,76.25,76.48,76.56,76.73,77.27,77.65,77.70,
+78.04,78.23,78.64,78.73,79.34,79.08,79.62,79.63,79.61,80.32,
+2.54,2.72,3.02,3.16,3.42,3.64,3.98,4.16,4.36,4.52,
+4.82,5.10,5.25,5.57,5.74,5.89,6.22,6.49,6.74,7.00,
+7.22,7.53,7.58,7.86,8.19,8.42,8.52,8.74,9.03,9.22,
+9.40,9.67,9.96,10.12,10.42,10.68,10.88,11.07,11.33,11.51,
+11.81,12.07,12.29,12.60,12.71,13.01,13.21,13.48,13.65,13.98,
+14.15,14.33,14.66,14.86,15.08,15.22,15.57,15.84,16.00,16.24,
+16.44,16.85,17.04,17.11,17.46,17.61,18.05,18.15,18.53,18.53,
+18.72,19.05,19.30,19.42,19.82,19.86,20.28,20.43,20.64,20.95,
+21.11,21.46,21.66,21.86,22.15,22.17,22.60,22.95,23.02,22.97,
+23.55,23.68,24.05,24.31,24.47,24.47,24.91,25.19,25.43,25.68,
+25.65,26.07,26.34,26.50,26.69,27.02,27.12,27.70,27.67,27.87,
+28.12,28.21,28.68,29.05,29.36,29.34,29.47,29.79,30.05,30.33,
+30.54,30.81,30.67,31.25,31.47,31.54,31.83,32.07,32.44,32.59,
+33.05,33.02,33.26,33.64,33.77,33.84,34.19,34.41,34.75,35.00,
+35.07,35.15,35.67,35.81,36.19,36.48,36.60,36.94,37.24,37.17,
+37.56,37.92,37.90,38.44,38.33,38.58,38.91,39.28,39.35,39.62,
+39.82,40.08,40.08,40.48,40.62,40.97,41.26,41.31,41.78,41.82,
+42.05,42.16,42.62,42.90,42.92,43.15,43.42,43.63,43.78,44.50,
+44.35,44.91,45.13,45.31,45.49,45.89,45.76,46.18,46.53,46.68,
+46.93,46.97,47.18,47.59,47.70,47.76,48.12,48.33,48.75,49.15,
+49.28,49.40,49.45,49.85,50.25,50.53,50.63,50.73,50.94,51.32,
+51.71,51.70,52.03,52.08,52.20,52.56,52.73,53.03,53.66,53.44,
+53.62,54.08,53.97,54.40,54.80,55.17,55.05,55.20,55.59,56.12,
+56.01,56.09,56.45,56.86,57.20,57.15,57.41,57.48,57.98,58.17,
+58.32,58.75,58.97,58.98,59.52,59.58,60.10,59.94,60.44,60.52,
+60.71,61.09,61.24,61.53,61.74,62.01,62.20,62.24,62.61,62.88,
+63.36,63.19,63.57,63.87,64.18,64.36,64.75,64.75,65.04,65.10,
+65.40,65.68,65.85,66.49,66.41,66.54,67.07,66.61,67.27,67.54,
+67.84,67.90,68.44,68.12,68.88,69.08,68.91,69.62,69.64,69.66,
+2.18,2.39,2.54,2.79,2.99,3.16,3.37,3.56,3.72,4.03,
+4.14,4.40,4.63,4.80,5.10,5.22,5.47,5.56,5.87,5.99,
+6.33,6.47,6.57,6.88,7.03,7.18,7.41,7.62,7.84,8.00,
+8.21,8.55,8.68,8.86,9.05,9.32,9.38,9.66,9.92,10.11,
+10.28,10.33,10.68,11.02,11.10,11.34,11.52,11.71,11.85,12.14,
+12.36,12.57,12.59,12.96,13.09,13.25,13.49,13.72,13.97,14.11,
+14.28,14.54,14.76,15.02,15.07,15.34,15.69,15.75,15.97,16.30,
+16.35,16.71,16.82,16.72,17.31,17.50,17.53,17.95,18.14,18.16,
+18.38,18.52,18.95,18.88,19.21,19.57,19.67,19.79,20.30,20.23,
+20.24,20.70,20.82,20.76,21.30,21.31,21.73,21.77,22.26,22.26,
+22.43,22.73,22.82,23.16,23.22,23.43,23.72,23.95,23.97,24.35,
+24.40,24.74,24.90,25.14,25.35,25.49,25.82,25.93,26.07,26.41,
+26.39,26.73,26.82,27.23,27.27,27.65,27.76,27.77,28.07,28.34,
+28.47,28.79,28.94,29.26,29.32,29.59,29.71,29.88,30.03,30.53,
+30.62,30.62,31.26,31.15,31.55,31.38,31.91,32.03,32.33,32.58,
+32.62,32.73,33.02,33.11,33.49,33.60,33.94,34.02,34.34,34.62,
+34.71,35.01,34.94,35.23,35.42,35.53,35.83,36.31,36.13,36.42,
+36.70,36.69,37.23,37.44,37.51,37.77,38.15,38.01,38.23,38.62,
+38.27,38.89,38.97,39.19,39.56,39.76,39.78,40.22,40.45,40.60,
+40.70,40.97,41.19,41.25,41.44,41.97,41.81,42.12,42.20,42.55,
+42.74,42.92,43.22,43.24,43.52,43.73,43.83,44.37,44.47,44.61,
+44.95,44.99,45.10,45.43,45.83,46.00,45.76,45.91,46.51,46.84,
+46.89,47.15,47.15,47.29,47.73,47.76,48.07,48.27,48.42,48.86,
+48.74,49.13,49.19,49.47,49.55,49.80,50.26,50.08,50.48,50.53,
+50.74,51.25,51.13,51.35,51.74,51.72,52.12,52.55,52.72,52.78,
+52.92,53.28,53.21,53.48,53.89,54.10,54.04,54.00,54.41,54.82,
+54.91,55.24,55.38,55.57,55.80,55.74,56.07,56.38,56.36,56.81,
+57.03,57.17,57.46,57.58,57.92,57.69,58.50,58.40,58.49,58.80,
+58.95,58.96,59.29,59.67,59.79,60.17,60.22,60.42,60.86,60.92,
+1.92,2.08,2.27,2.43,2.53,2.78,2.96,3.11,3.26,3.40,
+3.61,3.79,3.98,4.19,4.41,4.54,4.73,4.96,4.95,5.30,
+5.48,5.57,5.72,6.00,6.13,6.32,6.47,6.70,6.80,6.97,
+7.22,7.41,7.47,7.80,7.91,8.01,8.17,8.44,8.65,8.66,
+8.98,9.24,9.33,9.40,9.67,9.89,9.91,10.12,10.47,10.58,
+10.72,10.84,11.09,11.14,11.40,11.64,11.82,12.02,12.24,12.22,
+12.43,12.67,12.71,12.94,13.10,13.39,13.50,13.59,13.96,13.97,
+14.27,14.38,14.56,14.82,14.96,15.24,15.23,15.44,15.61,16.01,
+16.05,16.14,16.28,16.49,16.70,16.85,17.00,17.34,17.32,17.73,
+17.67,17.81,18.10,18.17,18.34,18.70,18.89,19.09,18.96,19.34,
+19.38,19.57,19.86,20.04,20.19,20.34,20.65,20.82,21.02,21.23,
+21.28,21.62,21.67,21.68,21.95,22.22,22.47,22.62,22.67,22.82,
+23.14,23.17,23.52,23.59,23.91,23.94,24.24,24.32,24.51,24.63,
+24.96,25.12,25.31,25.22,25.64,25.68,25.98,25.97,26.29,26.57,
+26.63,26.76,27.02,27.14,27.37,27.65,27.52,27.88,28.11,28.44,
+28.41,28.51,28.73,28.93,29.19,29.11,29.44,29.56,29.75,29.98,
+30.32,30.37,30.35,30.53,30.70,30.89,31.21,31.55,31.60,31.45,
+32.04,31.82,32.27,32.54,32.43,32.68,32.94,32.96,33.29,33.42,
+33.81,33.75,33.92,34.35,34.31,34.59,34.68,35.21,35.05,35.17,
+35.37,35.69,35.93,36.10,36.20,36.40,36.28,36.79,36.60,37.25,
+37.10,37.27,37.65,37.80,37.83,38.01,38.21,38.62,38.70,38.77,
+38.99,39.17,39.35,39.43,39.71,39.87,39.95,40.32,40.68,40.43,
+40.82,40.88,41.16,41.21,41.34,41.73,41.79,41.88,42.07,42.34,
+42.61,42.69,43.00,42.88,43.23,43.29,43.29,43.82,43.79,44.33,
+44.35,44.58,44.66,44.74,44.81,45.13,45.31,45.73,45.83,46.06,
+46.21,46.45,46.34,46.89,46.54,47.05,46.86,47.45,47.46,47.47,
+47.98,48.00,48.09,48.44,48.69,48.47,48.94,48.91,49.12,49.41,
+49.68,49.79,49.89,49.88,50.06,50.21,50.69,50.47,50.69,51.31,
+51.32,51.43,51.39,51.97,51.88,52.06,52.21,52.21,52.78,53.09,
+1.67,1.82,1.94,2.10,2.23,2.49,2.54,2.77,2.85,2.98,
+3.17,3.39,3.47,3.62,3.78,3.90,4.18,4.22,4.43,4.64,
+4.67,4.81,5.01,5.16,5.27,5.52,5.59,5.90,5.88,6.11,
+6.20,6.43,6.55,6.75,7.00,6.98,7.18,7.37,7.60,7.59,
+7.84,7.91,8.18,8.25,8.36,8.63,8.72,9.04,9.06,9.09,
+9.41,9.44,9.62,9.69,10.03,9.98,10.24,10.54,10.57,10.71,
+10.90,10.90,11.18,11.38,11.50,11.79,11.84,12.13,12.13,12.42,
+12.36,12.47,12.76,12.85,12.94,13.19,13.21,13.33,13.48,13.81,
+14.02,14.06,14.22,14.31,14.55,14.71,14.85,15.14,15.18,15.27,
+15.49,15.54,15.78,16.05,16.15,16.25,16.35,16.50,16.91,16.87,
+16.96,17.26,17.28,17.38,17.57,17.74,17.87,18.07,18.09,18.38,
+18.56,18.84,18.76,18.94,19.34,19.34,19.68,19.66,19.91,19.89,
+19.89,20.19,20.29,20.50,20.43,20.78,21.11,21.21,21.40,21.36,
+21.56,21.78,21.87,21.87,22.20,22.46,22.37,22.47,23.03,22.97,
+23.07,23.37,23.44,23.52,23.77,23.70,24.05,24.18,24.45,24.76,
+24.77,24.88,25.24,25.13,25.18,25.53,25.64,25.67,26.07,26.12,
+26.23,26.32,26.51,26.80,26.89,26.90,27.13,27.29,27.45,27.57,
+27.80,27.87,28.18,28.26,28.27,28.51,28.91,28.63,28.90,29.02,
+29.28,29.40,29.57,29.72,29.79,30.07,30.08,30.34,30.48,30.72,
+30.66,30.97,31.30,31.24,31.48,31.71,31.92,31.84,32.19,32.07,
+32.25,32.64,32.80,32.69,33.14,33.22,33.34,33.36,33.47,33.78,
+33.83,34.15,34.30,34.34,34.33,34.65,34.76,34.95,35.03,35.20,
+35.36,35.72,35.96,36.19,35.83,36.34,36.01,36.36,36.43,36.85,
+36.86,36.98,37.18,37.55,37.62,37.75,37.90,38.04,38.08,38.49,
+38.33,38.81,38.70,38.91,39.45,39.26,39.35,39.55,39.64,39.91,
+40.19,40.00,40.48,40.35,40.60,40.55,40.78,41.10,41.25,41.45,
+41.59,41.67,42.03,42.12,42.03,42.41,42.53,42.52,42.75,42.94,
+42.96,43.29,43.45,43.52,43.48,43.79,44.10,44.08,44.45,44.43,
+44.59,45.02,44.90,45.18,44.95,45.41,45.47,45.75,45.74,46.00,
+1.47,1.53,1.70,1.78,1.95,2.09,2.19,2.32,2.49,2.62,
+2.76,2.94,3.00,3.11,3.35,3.46,3.56,3.69,3.90,3.94,
+4.05,4.23,4.34,4.48,4.71,4.79,4.79,5.06,5.12,5.33,
+5.46,5.53,5.71,5.83,5.92,6.11,6.33,6.41,6.51,6.59,
+6.81,7.09,7.14,7.10,7.36,7.37,7.59,7.67,7.72,7.98,
+8.12,8.25,8.27,8.46,8.64,8.73,9.02,8.92,9.16,9.25,
+9.46,9.59,9.75,9.94,9.93,10.07,10.16,10.46,10.41,10.62,
+10.91,10.88,11.16,11.08,11.32,11.56,11.63,11.68,11.87,11.85,
+12.08,12.14,12.41,12.61,12.61,12.77,12.90,13.02,13.11,13.31,
+13.68,13.55,13.82,13.82,14.03,14.04,14.37,14.32,14.53,14.73,
+14.64,15.05,15.07,15.19,15.35,15.35,15.67,15.84,15.83,16.01,
+16.14,16.20,16.27,16.65,16.53,16.81,16.86,17.24,17.11,17.33,
+17.36,17.38,17.78,17.76,17.95,18.11,18.18,18.27,18.57,18.67,
+18.79,18.84,19.08,19.29,19.52,19.45,19.42,19.98,19.85,19.89,
+20.12,20.21,20.49,20.34,20.74,20.58,20.96,20.94,21.24,21.50,
+21.48,21.74,21.69,22.12,21.97,22.16,22.27,22.33,22.56,22.65,
+22.77,22.88,22.97,23.10,23.47,23.59,23.64,23.74,23.87,24.30,
+23.99,24.21,24.51,24.36,24.51,24.74,25.06,25.14,25.08,25.20,
+25.55,25.62,25.77,26.00,25.91,26.20,26.19,26.41,26.36,26.74,
+26.96,26.76,27.06,27.38,27.11,27.60,27.65,27.71,27.86,28.04,
+28.08,28.42,28.40,28.83,28.51,28.93,28.91,29.06,29.12,29.76,
+29.53,29.52,29.59,29.86,30.16,30.42,30.22,30.62,30.45,30.78,
+30.85,30.70,31.08,31.18,31.30,31.64,31.72,31.69,31.88,31.99,
+32.20,32.31,32.50,32.66,32.67,32.88,32.86,33.19,33.13,33.25,
+33.53,33.72,33.59,33.82,33.95,34.13,34.06,34.43,34.70,34.68,
+34.86,35.12,34.95,35.06,35.47,35.56,35.68,35.77,36.04,36.13,
+36.16,36.31,36.40,36.38,36.64,36.86,36.97,37.34,37.29,37.20,
+37.56,37.75,37.74,38.12,38.01,38.25,38.18,38.40,38.46,38.84,
+38.72,38.70,38.94,38.95,39.32,39.68,39.43,39.60,39.84,40.13,
+1.24,1.32,1.46,1.58,1.72,1.83,1.87,2.02,2.18,2.31,
+2.38,2.48,2.59,2.75,2.90,3.00,3.10,3.18,3.31,3.44,
+3.61,3.63,3.83,3.86,4.04,4.15,4.30,4.42,4.50,4.69,
+4.72,4.84,4.87,5.06,5.13,5.28,5.52,5.57,5.71,5.91,
+5.92,6.03,6.16,6.16,6.34,6.46,6.47,6.62,6.88,6.91,
+7.09,7.05,7.23,7.38,7.45,7.68,7.73,7.79,7.91,8.05,
+8.25,8.20,8.43,8.59,8.68,8.97,9.01,9.05,9.08,9.34,
+9.43,9.59,9.63,9.79,9.86,10.02,9.98,10.41,10.43,10.53,
+10.49,10.60,10.86,10.96,11.04,11.22,11.27,11.37,11.38,11.62,
+11.82,11.82,11.89,12.00,12.13,12.32,12.56,12.58,12.79,12.77,
+12.80,12.98,13.00,13.15,13.33,13.38,13.50,13.68,13.83,13.97,
+14.06,13.95,14.37,14.44,14.62,14.45,14.78,14.86,15.00,14.98,
+15.11,15.29,15.35,15.53,15.85,15.78,15.74,15.94,16.23,16.21,
+16.33,16.50,16.54,16.59,16.74,16.94,16.95,17.08,17.30,17.33,
+17.41,17.68,17.74,17.84,17.99,18.09,18.20,18.35,18.34,18.54,
+18.79,18.96,19.01,19.04,19.28,19.23,19.45,19.33,19.62,19.77,
+19.80,19.97,20.19,20.32,20.30,20.47,20.49,20.67,20.71,21.06,
+21.15,21.16,21.12,21.32,21.48,21.68,21.68,21.69,21.75,22.02,
+22.32,22.34,22.54,22.51,22.70,22.75,22.82,23.07,23.12,23.23,
+23.09,23.45,23.49,23.59,23.69,23.90,24.22,24.18,24.00,24.45,
+24.66,24.57,24.86,24.62,24.90,25.00,25.18,25.41,25.57,25.28,
+25.70,25.87,25.92,26.13,26.30,26.41,26.30,26.28,26.58,26.46,
+26.75,27.07,27.14,27.08,27.29,27.34,27.53,27.51,27.91,28.00,
+27.90,28.25,28.20,28.36,28.38,28.46,28.89,28.65,29.03,28.91,
+28.96,29.53,29.24,29.30,29.80,29.45,29.90,29.94,30.06,30.22,
+30.23,30.50,30.62,30.48,30.57,30.85,30.89,31.13,31.10,31.38,
+31.28,31.61,31.49,31.50,32.04,32.31,32.08,32.46,32.57,32.40,
+32.54,32.72,32.83,33.09,33.13,33.04,33.22,33.46,33.39,33.58,
+33.81,34.02,34.07,34.05,34.36,34.42,34.60,34.52,34.51,34.85,
+1.07,1.20,1.32,1.39,1.51,1.51,1.68,1.82,1.91,2.02,
+2.04,2.16,2.31,2.44,2.53,2.51,2.65,2.79,2.88,2.96,
+3.05,3.19,3.32,3.42,3.60,3.65,3.67,3.74,3.88,4.06,
+4.11,4.22,4.37,4.34,4.55,4.61,4.64,4.80,4.81,5.06,
+5.18,5.14,5.30,5.54,5.61,5.53,5.70,5.89,6.02,6.00,
+6.14,6.30,6.27,6.38,6.42,6.57,6.69,6.87,6.92,7.13,
+7.17,7.25,7.28,7.45,7.56,7.60,7.60,7.87,7.97,8.12,
+8.03,8.19,8.35,8.52,8.53,8.72,8.80,8.94,8.79,9.18,
+9.17,9.24,9.37,9.44,9.71,9.66,9.67,9.81,9.85,9.99,
+10.12,10.29,10.36,10.43,10.45,10.70,10.70,10.92,11.06,11.12,
+11.18,11.28,11.26,11.53,11.55,11.71,11.86,11.93,12.00,12.18,
+12.37,12.31,12.54,12.52,12.71,12.70,12.76,12.93,12.96,13.09,
+13.22,13.19,13.52,13.44,13.83,13.69,13.85,14.04,14.07,14.19,
+14.36,14.28,14.38,14.63,14.70,14.71,14.87,14.88,14.99,15.24,
+15.28,15.36,15.36,15.63,15.58,15.66,15.94,16.31,16.05,16.14,
+16.46,16.41,16.50,16.63,16.56,16.74,16.81,16.95,16.74,17.09,
+17.41,17.41,17.49,17.93,17.75,17.74,17.77,17.93,18.07,18.31,
+18.19,18.32,18.48,18.49,18.68,18.81,18.80,19.18,19.17,19.09,
+19.34,19.38,19.50,19.41,19.65,19.93,20.02,19.92,20.09,20.05,
+20.24,20.43,20.45,20.75,20.74,20.70,20.70,21.07,20.97,21.17,
+21.39,21.61,21.67,21.83,21.67,21.67,21.73,22.01,22.05,22.25,
+22.33,22.28,22.37,22.61,22.70,22.82,22.95,22.86,23.27,23.21,
+23.36,23.57,23.61,23.74,23.85,23.83,24.00,23.89,24.22,24.23,
+24.36,24.42,24.60,24.68,24.80,24.69,24.76,25.16,25.03,25.30,
+25.01,25.56,25.55,25.78,25.79,25.98,25.82,26.00,26.25,26.22,
+26.18,26.72,26.46,26.99,26.77,26.79,26.99,27.03,27.22,27.45,
+27.52,27.77,27.58,27.56,27.86,27.94,27.89,28.15,28.15,28.30,
+28.36,28.53,28.71,28.67,28.85,29.09,28.93,28.93,29.08,29.07,
+29.51,29.40,29.76,29.78,29.40,29.79,30.03,30.14,30.08,30.20,
+0.98,1.04,1.10,1.16,1.33,1.41,1.44,1.57,1.60,1.71,
+1.83,1.93,2.00,2.10,2.17,2.30,2.38,2.55,2.52,2.64,
+2.68,2.74,2.87,3.02,3.02,3.21,3.29,3.36,3.45,3.54,
+3.57,3.60,3.81,3.84,3.91,4.00,4.12,4.21,4.30,4.40,
+4.49,4.62,4.69,4.63,4.80,4.97,4.94,5.06,5.13,5.28,
+5.23,5.35,5.48,5.70,5.68,5.78,5.78,5.96,6.07,6.11,
+6.21,6.31,6.35,6.49,6.57,6.64,6.67,6.86,6.91,7.04,
+7.10,7.16,7.24,7.43,7.33,7.49,7.51,7.74,7.74,7.89,
+7.96,8.02,8.12,8.32,8.32,8.36,8.38,8.55,8.66,8.80,
+8.86,8.93,9.05,9.11,9.13,9.29,9.37,9.47,9.59,9.72,
+9.80,9.73,9.94,9.93,10.18,10.20,10.16,10.47,10.65,10.44,
+10.45,10.77,10.91,10.72,10.98,10.90,11.10,11.05,11.22,11.49,
+11.52,11.47,11.68,11.60,11.87,11.98,12.13,12.04,11.91,12.20,
+12.37,12.36,12.70,12.69,12.65,12.79,12.91,13.04,13.20,13.20,
+13.14,13.12,13.31,13.48,13.59,13.71,13.82,13.90,14.03,13.95,
+14.23,14.32,14.41,14.58,14.52,14.60,14.51,14.74,14.90,14.76,
+14.98,15.08,15.13,15.25,15.27,15.50,15.32,15.58,15.69,15.71,
+15.78,15.98,15.93,16.21,16.24,16.45,16.55,16.50,16.71,16.92,
+16.84,16.77,16.89,16.92,17.01,17.14,17.27,17.47,17.39,17.65,
+17.43,17.66,17.89,18.01,18.21,18.20,18.18,18.25,18.38,18.30,
+18.70,18.69,18.69,18.75,18.83,19.10,19.01,19.20,19.34,19.24,
+19.40,19.36,19.51,19.70,19.65,20.01,19.98,19.83,20.13,20.19,
+20.23,20.54,20.21,20.83,20.49,20.74,20.89,21.03,20.75,20.99,
+21.20,21.13,21.20,21.64,21.54,21.59,21.57,21.61,22.05,22.10,
+22.14,22.03,22.28,22.17,22.41,22.55,22.62,22.79,22.84,22.82,
+22.93,23.09,23.33,23.41,23.24,23.64,23.39,23.75,23.53,23.76,
+23.75,23.86,24.27,24.10,24.22,24.19,24.45,24.55,24.45,24.47,
+24.73,24.64,24.87,24.86,24.91,25.17,25.27,25.30,25.38,25.32,
+25.57,25.67,25.87,25.92,25.67,25.97,26.42,26.22,26.21,26.27,
+0.81,0.90,0.94,1.04,1.11,1.20,1.29,1.35,1.45,1.54,
+1.58,1.70,1.74,1.83,1.91,2.06,2.06,2.10,2.23,2.27,
+2.37,2.36,2.58,2.59,2.65,2.71,2.85,2.89,3.01,3.02,
+3.04,3.22,3.19,3.34,3.35,3.56,3.54,3.67,3.67,3.77,
+3.89,3.91,4.07,4.10,4.20,4.22,4.47,4.36,4.50,4.59,
+4.76,4.70,4.82,4.94,4.83,5.06,4.99,5.22,5.22,5.42,
+5.44,5.53,5.53,5.52,5.83,5.77,5.92,6.00,5.98,6.06,
+6.17,6.21,6.20,6.51,6.49,6.52,6.64,6.76,6.72,6.76,
+6.91,7.07,7.14,7.19,7.26,7.32,7.33,7.62,7.48,7.64,
+7.80,7.76,7.83,7.92,8.02,8.08,8.22,8.31,8.36,8.49,
+8.60,8.60,8.49,8.73,8.75,8.81,8.88,8.97,9.02,9.13,
+9.22,9.20,9.50,9.39,9.53,9.47,9.74,9.63,9.72,9.95,
+10.13,9.88,10.13,10.26,10.40,10.37,10.38,10.49,10.46,10.71,
+10.86,10.99,10.97,10.98,10.97,11.09,11.20,11.18,11.28,11.44,
+11.46,11.71,11.61,11.76,11.97,11.95,12.04,12.15,12.17,12.21,
+12.34,12.26,12.62,12.52,12.58,12.71,12.78,12.84,12.76,12.81,
+13.24,12.99,13.26,13.39,13.20,13.48,13.55,13.46,13.59,13.69,
+13.87,13.80,14.02,13.97,14.12,14.25,14.29,14.44,14.41,14.55,
+14.64,14.71,14.80,14.72,15.07,15.03,15.06,15.07,15.26,15.39,
+15.24,15.44,15.40,15.43,15.65,15.71,15.73,15.95,15.91,16.10,
+16.04,16.12,16.21,16.34,16.54,16.45,16.38,16.79,16.79,16.80,
+16.88,16.92,17.08,16.98,17.41,17.34,17.43,17.51,17.74,17.72,
+17.64,17.63,17.82,17.95,17.96,17.98,18.33,18.19,18.21,18.40,
+18.23,18.29,18.57,18.74,18.62,18.66,19.19,18.85,19.03,18.87,
+19.23,19.08,19.27,19.40,19.44,19.51,19.57,19.64,19.75,19.97,
+19.85,19.96,20.08,20.22,20.35,20.55,20.24,20.54,20.45,20.57,
+20.61,20.73,20.84,21.00,21.03,21.18,21.08,21.31,21.18,21.47,
+21.54,21.31,21.77,21.80,21.75,21.82,21.81,22.15,22.20,22.01,
+22.37,22.43,22.35,22.54,22.49,22.50,22.76,22.97,22.95,22.76,
+0.73,0.76,0.86,0.95,0.93,1.05,1.14,1.19,1.22,1.32,
+1.46,1.45,1.50,1.60,1.65,1.64,1.75,1.83,1.89,1.98,
+2.08,2.05,2.19,2.24,2.31,2.37,2.40,2.54,2.54,2.65,
+2.72,2.79,2.81,2.95,2.96,3.01,3.17,3.17,3.24,3.35,
+3.42,3.39,3.54,3.54,3.69,3.68,3.65,3.84,3.95,3.93,
+4.12,4.14,4.13,4.33,4.33,4.45,4.48,4.49,4.54,4.71,
+4.64,4.83,4.80,4.93,4.96,5.05,5.04,5.16,5.17,5.35,
+5.42,5.43,5.38,5.55,5.61,5.67,5.78,5.93,5.89,6.08,
+5.90,6.00,6.20,6.34,6.29,6.34,6.48,6.54,6.59,6.54,
+6.77,6.78,6.81,6.91,6.88,7.12,6.99,7.25,7.27,7.19,
+7.33,7.50,7.54,7.52,7.60,7.71,7.85,7.91,7.87,8.05,
+8.10,8.09,8.30,8.20,8.41,8.36,8.38,8.62,8.61,8.60,
+8.68,8.72,8.96,8.86,8.93,8.98,8.96,9.13,9.11,9.39,
+9.41,9.37,9.54,9.48,9.70,9.59,9.73,9.76,10.10,9.90,
+10.07,10.10,10.27,10.08,10.40,10.36,10.32,10.51,10.43,10.50,
+10.77,10.84,10.88,11.05,11.08,11.06,11.08,11.20,11.30,11.32,
+11.30,11.47,11.38,11.51,11.66,11.60,11.84,11.67,11.89,11.96,
+11.80,12.28,12.13,12.20,12.22,12.39,12.40,12.46,12.46,12.56,
+12.74,12.72,12.90,12.87,12.98,13.02,13.11,13.16,13.07,13.18,
+13.31,13.47,13.67,13.65,13.59,13.74,13.76,13.92,13.95,14.10,
+13.93,13.95,14.19,14.28,14.19,14.52,14.48,14.55,14.45,14.71,
+14.66,14.71,14.75,14.76,14.96,15.03,14.99,15.22,15.34,15.59,
+15.39,15.37,15.52,15.36,15.37,15.67,15.78,15.93,15.95,15.89,
+15.87,16.09,16.26,16.22,16.50,16.42,16.54,16.35,16.59,16.70,
+16.62,16.99,16.97,16.68,16.97,16.98,16.92,17.40,17.25,17.40,
+17.37,17.47,17.51,17.68,17.60,17.75,17.83,17.80,17.91,18.08,
+18.09,17.92,17.96,18.45,18.29,18.36,18.22,18.40,18.62,18.71,
+18.71,18.64,18.92,19.01,19.03,19.09,19.12,19.23,19.21,19.20,
+19.31,19.38,19.61,19.42,19.53,19.68,19.66,19.74,19.76,20.05,
+0.65,0.63,0.71,0.82,0.89,0.91,0.97,1.06,1.11,1.15,
+1.16,1.26,1.32,1.36,1.51,1.47,1.55,1.60,1.63,1.71,
+1.79,1.85,1.84,1.90,2.03,2.13,2.04,2.16,2.25,2.30,
+2.36,2.46,2.49,2.58,2.55,2.73,2.70,2.79,2.87,2.87,
+2.97,2.90,2.98,3.12,3.13,3.26,3.30,3.33,3.44,3.48,
+3.54,3.51,3.54,3.63,3.71,3.72,3.78,4.01,3.90,4.03,
+4.13,4.16,4.18,4.38,4.35,4.47,4.31,4.49,4.49,4.60,
+4.77,4.87,4.79,4.87,4.92,4.95,5.05,5.01,5.04,5.10,
+5.29,5.31,5.52,5.43,5.51,5.63,5.49,5.63,5.73,5.82,
+5.91,5.88,5.93,5.88,6.17,6.17,6.25,6.19,6.23,6.30,
+6.44,6.46,6.54,6.67,6.62,6.81,6.74,6.85,6.89,6.88,
+6.99,7.05,7.17,7.03,7.25,7.27,7.51,7.29,7.37,7.48,
+7.61,7.59,7.63,7.84,7.95,7.93,7.94,8.10,8.10,8.17,
+8.29,8.06,8.19,8.14,8.41,8.35,8.51,8.48,8.65,8.81,
+8.71,8.75,8.79,8.84,8.86,8.90,8.93,9.25,9.27,9.22,
+9.37,9.37,9.49,9.54,9.47,9.48,9.78,9.81,9.84,9.77,
+9.79,9.92,9.98,10.20,10.12,10.13,10.26,10.45,10.37,10.28,
+10.52,10.43,10.56,10.56,10.76,10.71,10.83,10.96,10.95,10.97,
+11.19,11.13,11.06,11.20,11.37,11.34,11.25,11.25,11.45,11.59,
+11.71,11.71,11.62,11.86,11.82,11.95,11.90,12.01,12.25,12.26,
+12.12,12.35,12.34,12.50,12.49,12.51,12.62,12.69,12.51,12.66,
+12.77,12.98,12.76,12.88,13.01,13.00,13.13,13.32,13.41,13.27,
+13.36,13.36,13.53,13.50,13.53,13.60,13.73,13.71,13.96,14.05,
+14.05,14.22,14.19,14.08,14.15,14.48,14.06,14.30,14.27,14.61,
+14.51,14.51,14.60,14.66,14.84,14.82,14.94,14.90,15.04,14.97,
+15.10,15.22,15.22,15.23,15.36,15.37,15.31,15.48,15.54,15.51,
+15.90,15.79,15.74,15.75,15.89,15.85,16.07,16.00,16.25,16.19,
+16.28,16.44,16.35,16.38,16.59,16.52,16.73,16.80,16.64,16.75,
+16.76,17.00,16.95,16.96,17.09,17.36,17.04,17.43,17.06,17.17,
+0.54,0.61,0.69,0.69,0.76,0.81,0.79,0.93,0.98,0.97,
+1.08,1.09,1.09,1.23,1.28,1.31,1.33,1.43,1.49,1.53,
+1.56,1.61,1.66,1.70,1.80,1.80,1.88,1.93,1.94,2.00,
+2.03,2.10,2.23,2.19,2.24,2.30,2.40,2.37,2.43,2.47,
+2.63,2.63,2.66,2.72,2.71,2.83,2.83,2.89,3.03,3.05,
+3.10,3.09,3.18,3.25,3.25,3.34,3.33,3.36,3.42,3.53,
+3.63,3.60,3.69,3.81,3.87,3.79,3.93,3.86,3.95,3.98,
+3.98,4.17,4.20,4.21,4.25,4.27,4.39,4.42,4.52,4.57,
+4.50,4.56,4.66,4.75,4.76,4.85,4.85,4.93,5.05,4.99,
+4.99,5.10,5.12,5.15,5.24,5.41,5.39,5.37,5.47,5.51,
+5.55,5.59,5.57,5.72,5.73,5.86,5.76,5.80,5.96,5.98,
+5.95,6.10,6.23,6.22,6.37,6.51,6.37,6.40,6.49,6.62,
+6.64,6.71,6.81,6.84,6.73,6.71,6.97,6.85,6.92,6.99,
+7.08,7.11,7.17,7.21,7.30,7.32,7.40,7.49,7.51,7.61,
+7.61,7.73,7.76,7.91,7.91,7.92,7.93,7.88,8.10,8.01,
+8.13,8.04,8.30,8.27,8.31,8.38,8.30,8.40,8.40,8.51,
+8.55,8.62,8.71,8.84,8.86,8.84,9.04,9.06,9.04,9.05,
+9.11,9.15,9.22,9.40,9.29,9.36,9.39,9.63,9.62,9.58,
+9.59,9.68,9.66,9.96,9.85,9.88,9.94,10.03,9.96,10.20,
+10.05,10.24,10.19,10.29,10.29,10.44,10.34,10.50,10.46,10.56,
+10.64,10.76,10.84,10.85,10.89,10.93,10.89,10.79,10.92,11.35,
+11.22,11.14,11.15,11.41,11.21,11.41,11.42,11.39,11.36,11.48,
+11.62,11.78,11.79,11.95,12.01,11.74,12.02,11.83,12.03,12.03,
+12.17,12.26,12.02,12.26,12.43,12.27,12.49,12.49,12.37,12.53,
+12.62,12.67,12.58,12.75,12.75,12.64,13.01,13.13,13.04,13.33,
+13.15,13.24,13.11,13.59,13.26,13.34,13.36,13.50,13.80,13.60,
+13.70,13.56,13.67,13.77,13.64,13.98,13.90,14.00,13.98,14.23,
+14.30,14.20,14.07,14.33,14.33,14.35,14.51,14.51,14.68,14.57,
+14.81,14.87,14.77,14.84,14.93,14.79,14.83,14.97,14.95,15.04,
+3.94,4.30,4.67,4.99,5.40,5.76,6.06,6.53,6.81,7.20,
+7.65,7.89,8.26,8.69,8.96,9.37,9.74,10.20,10.48,10.81,
+11.29,11.71,11.97,12.31,12.80,13.06,13.38,13.81,14.15,14.56,
+14.92,15.37,15.56,15.97,16.43,16.51,17.07,17.36,17.72,18.20,
+18.41,18.87,19.21,19.67,19.90,20.50,20.67,21.31,21.43,21.80,
+22.20,22.41,22.94,23.20,23.61,24.28,24.36,24.83,25.05,25.47,
+25.83,26.11,26.51,26.91,27.37,27.61,28.10,28.33,28.73,28.95,
+29.56,29.80,30.15,30.55,30.96,31.36,31.79,32.12,32.48,32.84,
+33.10,33.48,33.91,34.06,34.54,35.17,35.23,35.76,36.18,36.40,
+36.76,37.19,37.62,37.78,38.39,38.73,38.93,39.26,39.87,40.16,
+40.41,40.84,41.31,41.51,41.84,42.28,42.65,42.92,43.37,43.65,
+44.06,44.35,44.78,45.07,45.57,45.99,46.15,46.67,46.92,47.10,
+47.81,48.23,48.48,48.82,49.30,49.47,50.12,50.49,50.84,51.19,
+51.37,51.96,52.42,52.56,52.93,53.21,53.48,53.88,54.48,54.58,
+55.08,55.58,55.92,56.05,56.55,57.10,57.17,57.44,57.87,58.51,
+58.83,59.11,59.32,59.89,60.03,60.72,60.94,61.41,61.38,62.10,
+62.32,62.70,63.25,63.66,63.74,64.34,64.49,64.96,65.36,65.58,
+65.87,66.44,66.66,67.48,67.58,67.92,68.46,68.58,68.92,69.74,
+69.59,70.02,70.16,70.86,71.11,71.54,71.52,72.38,72.89,73.20,
+72.89,73.47,74.03,74.30,74.58,75.03,75.50,75.66,76.03,76.74,
+77.06,77.18,77.70,78.19,78.36,78.72,79.38,79.48,80.11,80.44,
+80.73,80.81,81.27,81.69,81.95,82.21,82.82,82.86,83.66,83.94,
+84.33,84.69,85.06,85.19,85.77,86.08,86.24,86.89,87.26,87.50,
+88.23,87.85,88.76,88.97,89.44,89.70,90.20,90.59,90.76,91.10,
+91.72,92.08,92.33,92.65,93.05,93.62,93.77,93.92,94.21,94.96,
+95.13,95.39,95.96,96.40,96.89,97.32,97.23,98.05,97.84,98.56,
+98.86,99.30,99.67,99.97,100.27,100.84,100.88,101.25,101.51,101.88,
+102.59,102.85,103.61,103.53,103.88,104.32,104.99,104.97,105.32,105.53,
+106.26,106.45,106.92,107.33,107.92,108.02,108.34,108.49,109.05,109.70,
+3.49,3.79,4.11,4.39,4.70,5.00,5.42,5.58,5.98,6.35,
+6.68,6.94,7.31,7.67,7.98,8.31,8.56,8.94,9.14,9.59,
+9.84,10.27,10.50,10.80,11.21,11.48,11.78,12.17,12.34,12.69,
+13.01,13.40,13.60,14.11,14.46,14.66,14.98,15.26,15.62,15.96,
+16.34,16.59,17.15,17.25,17.75,17.90,18.31,18.64,18.82,19.08,
+19.51,19.99,20.21,20.44,20.83,21.22,21.24,21.71,22.28,22.50,
+22.67,23.20,23.28,23.65,24.10,24.56,24.61,25.09,25.25,25.49,
+25.95,26.26,26.55,26.90,27.32,27.64,27.81,28.19,28.52,28.88,
+29.25,29.40,29.83,30.33,30.52,30.68,31.04,31.33,31.76,32.41,
+32.36,32.65,33.08,33.26,33.62,33.81,34.18,34.65,34.88,35.38,
+35.77,35.95,36.14,36.64,36.75,37.16,37.55,37.86,38.12,38.56,
+38.79,39.01,39.28,39.79,40.16,40.40,40.66,41.05,41.33,41.77,
+41.96,42.18,42.73,43.09,43.37,43.63,43.96,44.26,44.38,44.97,
+45.21,45.59,45.89,46.23,46.45,46.98,47.14,47.47,47.63,48.22,
+48.37,48.67,49.07,49.47,49.73,50.10,50.35,50.97,51.34,51.43,
+51.87,52.01,52.38,52.62,52.90,53.23,53.54,54.13,54.04,54.68,
+54.69,55.03,55.67,55.76,56.28,56.54,56.82,57.24,57.23,57.80,
+58.27,58.36,58.81,59.12,59.43,59.66,60.31,60.41,60.61,61.31,
+61.48,61.57,61.80,62.30,62.51,62.65,63.27,63.38,64.01,64.34,
+64.58,64.86,65.26,65.55,65.62,66.23,66.48,66.82,66.88,67.23,
+67.85,67.97,68.25,68.41,68.97,69.31,69.69,69.99,70.36,70.79,
+70.79,71.22,71.61,71.80,72.16,72.66,73.03,73.28,73.52,73.63,
+74.13,74.42,75.16,75.04,75.58,75.53,76.44,76.26,76.51,77.37,
+77.36,77.84,77.89,78.36,78.46,79.12,79.11,79.99,79.95,79.96,
+80.92,80.94,81.31,81.41,81.67,82.31,82.73,82.86,83.35,83.34,
+83.66,84.04,84.64,84.77,85.26,85.30,85.96,86.25,86.39,86.70,
+87.05,87.55,87.70,87.71,88.62,88.45,88.98,89.34,89.66,89.99,
+90.24,90.44,90.81,91.03,91.45,91.95,92.07,92.51,92.89,93.45,
+93.34,93.72,94.19,94.44,94.76,95.16,95.54,95.02,95.96,96.45,
+3.03,3.32,3.66,3.95,4.14,4.39,4.79,4.96,5.28,5.68,
+5.89,6.16,6.41,6.70,6.98,7.25,7.64,7.80,8.14,8.48,
+8.73,8.94,9.38,9.53,9.93,10.16,10.27,10.71,11.01,11.27,
+11.52,11.74,12.14,12.45,12.64,12.91,13.30,13.53,13.85,14.11,
+14.32,14.75,14.94,15.19,15.53,15.81,16.17,16.31,16.72,16.68,
+17.18,17.34,17.84,18.03,18.33,18.59,18.83,19.11,19.45,19.67,
+20.03,20.33,20.74,20.75,21.05,21.50,21.72,21.98,22.27,22.54,
+22.84,23.11,23.48,23.71,23.89,24.06,24.61,24.90,24.93,25.42,
+25.40,25.75,26.22,26.54,26.82,26.97,27.49,27.63,28.05,28.18,
+28.51,28.86,29.01,29.24,29.62,29.97,30.43,30.48,30.72,30.91,
+31.40,31.52,31.86,32.31,32.40,32.77,32.96,33.25,33.52,33.71,
+34.15,34.59,34.85,34.95,35.14,35.62,35.82,36.30,36.43,36.69,
+37.14,37.32,37.49,37.83,38.30,38.37,38.76,39.00,39.09,39.57,
+39.76,40.03,40.31,40.49,40.95,41.06,41.48,41.92,41.86,42.21,
+42.67,43.09,43.37,43.65,43.96,43.88,44.18,44.60,44.98,45.12,
+45.41,45.82,46.03,46.35,46.66,46.65,47.33,47.39,47.87,47.96,
+48.30,48.42,49.03,49.20,49.30,49.62,50.03,50.34,50.49,50.79,
+51.15,51.46,51.79,51.85,52.56,52.39,52.77,53.25,53.43,53.77,
+54.03,54.15,54.85,54.67,55.19,55.26,55.57,56.21,56.26,56.75,
+56.59,57.12,57.27,57.41,58.26,58.43,58.59,58.57,59.10,59.39,
+59.43,59.99,60.45,60.30,60.65,61.32,61.03,61.58,61.79,62.11,
+62.46,62.54,62.94,63.38,63.93,64.16,64.23,64.53,64.86,65.04,
+65.45,65.49,65.55,66.00,66.35,66.80,66.78,67.17,67.84,67.95,
+68.15,68.34,68.54,69.07,69.02,69.55,69.63,70.13,70.38,70.23,
+70.76,70.99,71.29,71.55,72.23,72.61,72.55,73.16,73.47,73.25,
+73.59,73.95,74.44,74.44,74.78,74.97,75.37,75.79,75.76,76.09,
+76.62,76.79,77.02,77.28,77.84,78.10,78.11,78.52,78.85,79.14,
+79.21,79.63,80.03,80.16,80.56,80.87,80.97,81.47,81.67,82.04,
+82.26,82.57,83.06,83.14,83.41,84.00,83.87,84.34,84.55,85.02,
+2.63,2.93,3.16,3.48,3.74,3.92,4.12,4.35,4.69,4.93,
+5.19,5.39,5.66,5.89,6.19,6.44,6.65,6.84,7.18,7.33,
+7.74,7.92,8.11,8.44,8.64,8.85,9.21,9.35,9.67,9.79,
+10.02,10.42,10.72,10.91,11.24,11.47,11.52,11.88,12.24,12.30,
+12.61,12.87,13.05,13.40,13.59,14.00,14.19,14.30,14.61,14.83,
+15.21,15.42,15.59,15.85,16.23,16.43,16.75,16.97,17.21,17.51,
+17.49,17.86,18.14,18.36,18.54,18.94,19.14,19.33,19.60,19.86,
+20.13,20.37,20.78,20.89,20.97,21.28,21.52,21.92,21.88,22.27,
+22.48,22.82,23.07,23.29,23.65,23.99,23.99,24.40,24.73,24.72,
+24.94,25.33,25.46,25.88,26.27,26.36,26.68,26.84,27.03,27.33,
+27.59,27.82,27.92,28.28,28.48,28.79,29.03,29.04,29.59,29.89,
+30.01,30.05,30.52,30.95,31.06,31.42,31.50,31.80,31.98,32.36,
+32.58,32.74,32.87,33.31,33.51,33.99,34.18,34.25,34.50,34.71,
+35.07,35.53,35.36,35.68,36.17,36.25,36.51,36.83,37.08,37.26,
+37.72,37.76,38.15,38.11,38.70,38.84,39.11,39.20,39.40,39.81,
+39.77,40.03,40.52,40.62,41.00,41.20,41.38,41.73,41.99,42.48,
+42.62,42.74,43.01,43.10,43.54,43.44,44.17,44.10,44.52,44.81,
+45.08,45.28,45.77,45.61,46.01,46.05,46.44,46.90,46.91,47.30,
+47.43,47.71,47.93,48.39,48.27,48.61,49.05,49.11,49.23,49.66,
+50.13,50.23,50.31,50.77,50.87,51.10,51.24,51.55,51.90,52.15,
+52.47,52.58,52.81,53.46,53.40,53.77,53.83,54.19,54.47,54.82,
+55.07,55.19,55.53,55.81,55.89,55.99,56.27,56.63,56.91,57.33,
+57.63,57.91,57.76,58.11,58.46,58.73,58.84,59.37,59.48,59.94,
+59.94,60.42,60.18,60.84,60.57,61.01,61.26,61.84,61.69,62.17,
+62.01,62.89,62.70,63.28,63.13,63.54,63.84,64.14,64.30,64.67,
+64.61,65.10,65.33,66.04,65.77,66.17,66.45,66.38,66.91,67.15,
+67.75,67.75,67.87,68.33,68.53,68.66,68.75,68.97,69.30,69.68,
+69.85,69.94,70.89,70.36,71.01,70.92,71.25,71.86,71.88,72.21,
+72.42,72.70,72.63,73.38,73.06,73.94,74.25,73.96,74.44,74.76,
+2.39,2.62,2.80,2.98,3.25,3.38,3.71,3.85,4.06,4.32,
+4.58,4.76,4.97,5.15,5.43,5.65,5.88,6.16,6.32,6.52,
+6.73,7.05,7.08,7.45,7.58,7.85,7.98,8.26,8.53,8.76,
+8.99,9.03,9.37,9.57,9.83,10.05,10.28,10.49,10.60,10.79,
+10.98,11.27,11.62,11.80,12.05,12.12,12.38,12.66,12.78,13.12,
+13.25,13.52,13.68,13.95,14.27,14.28,14.63,14.87,15.00,15.41,
+15.43,15.65,15.83,16.10,16.50,16.62,16.74,16.99,17.26,17.51,
+17.73,17.80,18.29,18.40,18.59,18.86,18.90,19.30,19.42,19.78,
+19.92,20.08,20.34,20.64,20.69,21.04,21.16,21.41,21.64,21.73,
+21.79,22.34,22.48,22.61,23.11,23.14,23.42,23.71,23.87,23.98,
+24.29,24.46,24.82,24.85,24.95,25.59,25.54,25.94,25.98,26.26,
+26.53,26.65,27.01,27.05,27.39,27.60,27.74,27.98,28.07,28.54,
+28.66,28.82,29.18,29.29,29.62,29.68,29.82,30.21,30.37,30.56,
+30.79,31.10,31.14,31.41,31.78,31.95,32.12,32.35,32.41,32.77,
+33.06,32.98,33.48,33.71,33.92,34.15,34.34,34.48,34.90,34.95,
+35.21,35.39,35.60,35.83,36.15,36.18,36.66,36.70,36.90,37.27,
+37.58,37.76,37.84,38.11,38.38,38.72,38.66,38.94,39.17,39.17,
+39.66,40.04,40.10,40.24,40.98,40.90,40.95,41.02,41.40,41.60,
+41.85,42.18,42.23,42.49,42.56,42.75,43.11,43.11,43.64,43.69,
+43.98,44.16,44.18,44.72,44.65,45.17,45.51,45.18,45.72,45.97,
+46.18,46.39,46.52,46.71,46.77,47.33,47.57,47.62,48.13,48.17,
+48.26,48.62,48.87,48.99,49.29,49.61,49.65,49.96,49.97,50.42,
+50.72,50.65,50.94,51.60,51.46,51.58,51.99,52.08,52.01,52.73,
+52.34,52.85,52.93,53.30,53.57,53.91,54.07,54.18,54.53,54.68,
+55.04,55.14,55.42,55.31,55.73,55.96,56.09,56.56,56.62,57.03,
+56.96,57.41,57.67,57.89,57.83,58.26,58.53,58.78,58.99,59.44,
+59.41,59.69,59.90,60.12,59.96,60.45,60.60,60.71,61.26,61.19,
+61.44,61.74,61.67,62.17,62.42,62.62,62.66,63.29,63.30,63.47,
+63.86,63.86,64.33,64.50,64.47,64.94,64.93,64.97,65.59,65.83,
+2.09,2.25,2.46,2.67,2.85,2.97,3.29,3.45,3.60,3.77,
+4.03,4.23,4.36,4.60,4.73,4.97,5.18,5.33,5.63,5.65,
+5.92,6.14,6.30,6.48,6.73,6.90,7.01,7.32,7.58,7.65,
+7.81,8.02,8.21,8.45,8.71,8.74,8.91,9.19,9.44,9.59,
+9.78,9.90,10.12,10.37,10.45,10.80,11.06,11.08,11.25,11.50,
+11.76,11.98,12.28,12.19,12.58,12.63,12.80,13.02,13.38,13.46,
+13.57,13.83,14.07,14.23,14.38,14.57,14.77,14.84,15.06,15.32,
+15.66,15.73,15.97,16.18,16.35,16.49,16.67,17.05,17.14,17.50,
+17.42,17.83,17.89,17.99,18.32,18.37,18.68,18.96,19.07,19.10,
+19.32,19.55,19.79,20.12,20.16,20.43,20.60,20.77,20.96,21.26,
+21.38,21.46,21.70,22.05,22.11,22.18,22.69,22.75,23.01,22.97,
+23.35,23.51,23.71,23.85,24.25,24.11,24.36,24.58,24.64,25.03,
+25.29,25.32,25.58,25.75,26.00,26.32,26.39,26.61,26.60,26.82,
+26.99,27.43,27.57,27.80,28.02,28.19,28.40,28.55,28.90,28.98,
+28.97,29.31,29.47,29.71,29.66,29.84,30.22,30.59,30.81,30.97,
+31.14,31.12,31.54,31.66,31.73,32.06,32.15,32.16,32.59,32.66,
+32.86,33.20,33.09,33.58,33.58,34.02,34.05,34.36,34.41,34.73,
+34.87,35.06,35.24,35.40,35.63,36.01,36.07,36.19,36.15,36.66,
+36.71,36.75,37.20,37.34,37.72,37.86,37.89,37.83,38.46,38.44,
+38.80,38.85,39.20,39.31,39.35,39.84,39.87,39.96,40.26,40.64,
+40.75,40.78,40.92,41.22,41.46,41.73,41.80,42.01,42.06,42.55,
+42.52,42.56,42.88,43.23,43.23,43.60,43.62,44.02,43.87,44.30,
+44.57,44.81,44.73,45.03,45.27,45.56,45.60,45.71,45.97,46.30,
+46.37,46.58,47.05,47.06,47.25,47.42,47.92,47.64,47.96,47.98,
+48.35,48.95,48.77,49.14,49.19,49.33,49.32,49.57,49.97,49.98,
+50.31,50.57,50.71,50.83,50.79,51.10,51.32,51.41,51.99,52.17,
+52.01,52.28,52.11,52.64,52.87,52.93,53.31,53.63,53.71,53.75,
+53.92,54.31,54.49,54.56,54.95,55.00,55.17,55.46,55.79,55.70,
+56.14,56.31,56.36,56.67,56.97,57.06,57.26,57.76,57.66,57.45,
+1.76,2.00,2.21,2.36,2.53,2.66,2.79,3.06,3.21,3.31,
+3.47,3.74,3.83,3.96,4.18,4.37,4.54,4.75,4.92,5.04,
+5.29,5.34,5.59,5.76,5.81,6.04,6.29,6.34,6.67,6.64,
+6.94,7.07,7.30,7.43,7.67,7.67,8.02,8.14,8.22,8.54,
+8.68,8.81,8.93,9.14,9.29,9.47,9.57,9.79,9.91,10.12,
+10.39,10.39,10.72,10.79,10.99,11.38,11.35,11.51,11.64,11.73,
+12.06,12.19,12.44,12.43,12.76,12.71,13.03,13.26,13.46,13.49,
+13.62,13.90,14.24,14.15,14.32,14.45,14.73,14.92,14.92,15.20,
+15.35,15.58,15.65,15.93,16.03,16.17,16.30,16.63,16.75,16.84,
+16.97,17.35,17.41,17.67,17.86,17.93,18.18,18.29,18.57,18.55,
+18.83,19.05,19.18,19.32,19.41,19.63,19.82,19.89,20.16,20.11,
+20.46,20.66,20.95,21.23,21.15,21.14,21.55,21.60,21.89,22.03,
+22.11,22.34,22.37,22.64,22.76,23.11,23.31,23.28,23.72,23.78,
+23.84,24.01,24.29,24.40,24.58,24.86,24.96,25.19,25.33,25.44,
+25.58,25.89,25.68,26.06,26.51,26.33,26.50,26.76,26.86,27.16,
+27.07,27.48,27.48,27.77,28.05,28.13,28.29,28.52,28.66,28.86,
+28.99,29.10,29.35,29.47,29.46,29.78,30.03,30.16,30.42,30.45,
+30.81,30.86,31.07,31.11,31.38,31.48,31.72,31.58,32.21,32.29,
+32.25,32.41,32.62,32.79,32.82,33.11,33.33,33.50,33.81,33.75,
+33.93,34.12,34.39,34.76,34.69,34.98,35.08,35.27,35.63,35.43,
+35.65,36.02,36.13,36.16,36.29,36.43,36.72,37.02,37.16,37.18,
+37.36,37.51,37.73,38.13,37.78,38.35,38.45,38.65,38.82,38.94,
+39.15,39.27,39.41,39.72,39.67,39.99,40.34,40.30,40.35,40.68,
+40.91,40.79,41.19,41.45,41.46,41.73,41.66,42.20,42.05,42.28,
+42.45,42.50,42.76,43.09,43.06,43.35,43.77,43.78,44.08,44.00,
+44.26,44.27,44.57,44.52,44.82,44.85,45.31,45.18,45.69,45.83,
+45.92,46.10,46.05,46.40,46.59,46.62,47.10,46.85,47.29,47.12,
+47.55,47.83,47.87,47.96,48.43,48.52,48.59,48.56,48.85,48.94,
+49.44,49.32,49.61,49.81,50.31,50.31,50.25,50.68,50.77,50.88,
+1.58,1.76,1.95,2.01,2.21,2.38,2.53,2.69,2.86,2.97,
+3.12,3.23,3.35,3.56,3.75,3.88,3.97,4.21,4.29,4.41,
+4.60,4.64,4.89,5.10,5.21,5.33,5.49,5.70,5.74,5.93,
+6.09,6.19,6.35,6.56,6.69,6.82,6.93,7.04,7.24,7.33,
+7.57,7.73,7.91,7.97,8.19,8.27,8.55,8.68,8.75,8.96,
+9.06,9.17,9.27,9.54,9.60,9.80,10.04,10.15,10.13,10.53,
+10.48,10.54,10.76,10.92,11.03,11.46,11.34,11.54,11.84,11.88,
+12.07,12.24,12.27,12.55,12.74,12.86,13.06,13.21,13.19,13.34,
+13.64,13.84,13.77,14.09,14.00,14.26,14.57,14.49,14.74,14.85,
+15.10,15.21,15.36,15.43,15.65,15.72,16.02,16.23,16.32,16.42,
+16.64,16.70,16.81,16.91,17.07,17.33,17.34,17.67,17.70,17.74,
+17.91,18.09,18.28,18.51,18.69,18.78,19.00,19.02,19.35,19.32,
+19.64,19.56,19.91,19.68,20.39,20.22,20.48,20.73,20.76,20.88,
+20.95,21.00,21.30,21.42,21.46,21.74,21.83,21.94,22.24,22.52,
+22.54,22.60,22.74,22.97,23.06,23.18,23.41,23.53,23.70,23.82,
+23.84,24.21,24.48,24.41,24.68,24.87,24.78,24.96,25.26,25.42,
+25.50,25.74,25.68,26.07,26.12,26.21,26.35,26.61,26.54,26.92,
+27.08,27.01,27.33,27.35,27.52,27.61,27.83,28.18,28.08,28.48,
+28.62,28.54,28.57,28.87,29.04,29.18,29.23,29.58,29.83,29.79,
+30.04,30.08,30.14,30.63,30.47,30.70,30.90,30.96,31.38,31.45,
+31.53,31.68,31.63,31.85,32.03,31.98,32.23,32.22,32.52,32.59,
+32.87,32.92,33.29,33.33,33.62,33.83,33.86,33.96,34.12,34.25,
+34.55,34.55,34.47,34.76,35.02,34.92,35.50,35.35,35.61,35.63,
+35.80,36.05,36.26,36.44,36.41,36.57,36.72,36.91,37.04,37.23,
+37.42,37.90,37.70,37.74,38.07,38.09,38.29,38.70,38.63,38.71,
+38.94,39.04,39.22,39.31,39.46,39.99,40.25,39.66,40.13,40.16,
+40.50,40.47,40.54,40.96,40.91,41.25,41.42,41.78,41.68,41.90,
+41.85,42.10,42.10,42.38,42.38,42.84,42.46,42.80,43.16,43.15,
+43.36,43.55,43.49,44.14,43.81,44.25,44.35,44.21,44.35,44.70,
+1.37,1.53,1.71,1.80,1.94,2.06,2.23,2.33,2.46,2.58,
+2.75,2.87,3.00,3.10,3.28,3.34,3.47,3.58,3.72,3.84,
+4.04,4.18,4.29,4.40,4.49,4.76,4.83,4.87,5.08,5.19,
+5.28,5.51,5.62,5.78,5.92,6.01,6.20,6.21,6.43,6.55,
+6.69,6.77,6.87,6.99,7.29,7.26,7.46,7.59,7.68,7.71,
+7.98,8.03,8.14,8.36,8.52,8.60,8.73,8.93,9.00,9.13,
+9.23,9.50,9.55,9.72,9.78,9.96,10.06,10.12,10.29,10.50,
+10.55,10.85,10.90,11.07,11.26,11.12,11.25,11.48,11.66,11.96,
+11.81,12.12,12.23,12.37,12.39,12.49,12.49,12.74,13.00,13.08,
+13.36,13.40,13.46,13.66,13.79,13.77,14.01,14.14,14.32,14.37,
+14.45,14.68,14.81,15.04,15.05,15.11,15.37,15.44,15.49,15.69,
+15.91,16.06,16.12,16.29,16.44,16.43,16.69,16.77,16.93,17.02,
+17.33,17.36,17.52,17.43,17.66,17.88,17.99,18.03,18.26,18.28,
+18.40,18.53,18.73,18.90,18.94,19.08,19.32,19.37,19.66,19.73,
+19.76,19.97,19.89,20.02,20.24,20.56,20.38,20.69,20.90,20.99,
+21.23,21.21,21.43,21.54,21.80,21.81,21.92,22.05,22.17,22.44,
+22.49,22.50,22.76,22.78,23.02,23.24,23.13,23.34,23.59,23.43,
+23.92,23.82,23.94,24.07,24.22,24.53,24.57,24.74,24.75,24.88,
+25.18,25.09,25.29,25.33,25.74,25.83,25.86,25.83,26.09,26.23,
+26.36,26.55,26.50,26.77,26.71,26.91,27.27,27.23,27.50,27.42,
+27.72,27.77,28.08,28.01,28.26,28.31,28.24,28.47,28.95,28.87,
+28.82,29.01,29.23,29.26,29.59,29.68,29.80,29.85,30.19,30.19,
+30.47,30.15,30.40,30.81,30.81,30.91,31.16,31.16,31.60,31.45,
+31.63,31.66,31.63,32.12,32.00,32.29,32.46,32.45,32.69,32.64,
+32.97,33.15,33.06,33.21,33.39,33.56,33.75,33.98,33.99,34.08,
+34.17,34.76,34.47,34.57,34.89,34.85,34.88,35.26,35.33,35.16,
+35.43,35.36,35.53,35.82,36.13,36.27,36.50,36.44,36.69,36.83,
+37.06,36.99,37.18,37.19,37.29,37.67,37.82,37.79,37.80,37.97,
+38.39,38.47,38.22,38.79,38.89,39.04,38.95,38.95,39.47,39.25,
+1.22,1.37,1.48,1.57,1.68,1.84,1.84,2.07,2.12,2.27,
+2.34,2.51,2.64,2.68,2.90,3.03,3.06,3.20,3.36,3.43,
+3.56,3.68,3.78,3.79,3.94,4.15,4.29,4.42,4.44,4.64,
+4.75,4.85,4.94,5.05,5.10,5.26,5.42,5.57,5.56,5.75,
+5.92,5.99,6.07,6.21,6.23,6.47,6.57,6.82,6.86,6.85,
+7.04,7.12,7.33,7.49,7.51,7.61,7.72,7.80,7.94,8.05,
+8.28,8.36,8.44,8.48,8.69,8.73,8.92,8.99,9.21,9.26,
+9.38,9.40,9.48,9.65,9.68,9.87,10.15,10.26,10.32,10.52,
+10.50,10.67,10.72,10.79,10.91,10.99,11.25,11.34,11.41,11.41,
+11.78,11.69,11.87,11.92,12.01,12.21,12.31,12.48,12.68,12.77,
+12.74,12.82,13.02,13.20,13.14,13.30,13.55,13.61,13.80,13.78,
+13.82,14.13,14.16,14.33,14.37,14.58,14.68,14.74,14.84,14.88,
+15.16,15.29,15.45,15.34,15.64,15.71,15.73,16.03,15.88,16.13,
+16.28,16.33,16.53,16.73,16.74,16.76,16.98,17.00,17.32,17.23,
+17.29,17.58,17.52,17.81,17.96,17.99,18.24,18.22,18.27,18.35,
+18.55,18.60,18.79,19.02,19.00,19.11,19.16,19.40,19.51,19.67,
+19.68,19.70,19.94,20.12,20.10,20.37,20.46,20.55,20.57,20.87,
+20.93,21.05,20.89,21.32,21.41,21.55,21.61,21.67,21.86,21.93,
+22.28,22.20,22.34,22.56,22.61,22.67,22.61,23.07,22.88,23.01,
+23.14,23.43,23.43,23.54,23.54,23.81,23.99,24.04,23.96,24.41,
+24.31,24.58,24.53,24.75,24.78,24.95,25.08,25.11,25.09,25.50,
+25.52,25.88,25.69,25.96,25.70,26.13,26.20,26.17,26.46,26.27,
+26.69,26.90,26.80,26.94,26.94,27.22,27.39,27.39,27.57,27.68,
+27.60,27.81,28.05,28.06,28.27,28.46,28.38,28.68,28.50,28.96,
+28.98,29.31,29.16,29.32,29.37,29.33,29.66,29.53,29.99,29.97,
+30.41,30.47,30.28,30.41,30.74,30.69,30.86,30.98,31.27,31.20,
+31.27,31.50,31.65,31.52,31.64,31.72,31.92,32.15,32.30,32.54,
+32.27,32.49,32.73,32.99,32.90,32.92,33.28,33.16,33.29,33.59,
+33.63,33.61,33.63,34.02,34.09,33.99,34.38,34.30,34.72,34.68,
+1.12,1.19,1.28,1.40,1.55,1.59,1.69,1.83,1.89,1.99,
+2.17,2.21,2.30,2.41,2.54,2.70,2.74,2.86,2.89,3.05,
+3.08,3.23,3.32,3.46,3.52,3.65,3.78,3.88,4.00,4.08,
+4.13,4.23,4.32,4.44,4.53,4.64,4.70,4.88,4.96,5.03,
+5.17,5.26,5.45,5.52,5.50,5.71,5.70,5.83,5.90,6.12,
+6.11,6.25,6.32,6.41,6.56,6.75,6.77,6.88,6.98,7.09,
+7.13,7.40,7.33,7.45,7.53,7.73,7.75,7.96,7.99,8.03,
+8.27,8.29,8.25,8.48,8.49,8.71,8.80,8.93,8.98,9.15,
+9.23,9.19,9.43,9.50,9.66,9.64,9.86,9.88,10.09,10.08,
+10.36,10.30,10.56,10.56,10.55,10.70,10.86,10.81,11.24,11.21,
+11.20,11.29,11.52,11.66,11.67,11.71,11.90,11.97,12.00,12.32,
+12.12,12.39,12.50,12.56,12.71,12.83,12.94,13.00,13.37,13.02,
+13.25,13.63,13.61,13.59,13.74,13.93,13.83,14.07,14.07,14.38,
+14.17,14.37,14.49,14.63,14.90,14.89,14.98,14.90,14.98,15.11,
+15.27,15.38,15.60,15.79,15.82,15.87,15.90,16.07,16.19,16.18,
+16.43,16.46,16.65,16.71,16.79,16.83,16.94,17.12,17.24,17.13,
+17.50,17.42,17.61,17.82,17.73,17.75,18.08,18.03,18.12,18.12,
+18.44,18.55,18.57,18.73,18.93,18.99,18.94,19.08,19.27,19.26,
+19.44,19.54,19.48,19.74,19.68,20.07,20.03,20.10,20.10,20.35,
+20.48,20.45,20.83,20.56,20.69,20.91,21.06,21.18,21.07,21.16,
+21.43,21.63,21.53,21.72,21.78,21.94,22.10,22.24,22.33,22.47,
+22.53,22.52,22.43,22.73,22.67,22.75,23.16,23.04,23.42,23.18,
+23.64,23.51,23.63,23.82,23.98,23.89,23.95,24.13,24.24,24.40,
+24.31,24.73,24.95,24.82,24.81,25.05,25.20,25.37,25.45,25.58,
+25.34,25.76,25.95,25.68,25.80,26.11,26.13,26.31,26.23,26.55,
+26.44,26.65,26.75,26.78,26.85,27.03,27.06,27.33,27.05,27.51,
+27.50,27.59,27.75,27.78,27.85,28.22,27.93,28.17,28.43,28.60,
+28.59,28.59,28.66,28.88,29.16,29.08,29.06,29.26,29.39,29.59,
+29.59,30.00,29.83,29.94,30.05,29.98,30.09,30.13,30.29,30.80,
+0.96,1.09,1.15,1.20,1.32,1.46,1.47,1.60,1.66,1.75,
+1.88,1.95,1.99,2.07,2.22,2.31,2.42,2.44,2.56,2.68,
+2.80,2.85,2.88,3.06,3.12,3.23,3.26,3.29,3.43,3.53,
+3.62,3.81,3.85,3.97,3.99,4.16,4.18,4.27,4.39,4.50,
+4.62,4.63,4.69,4.91,4.84,4.99,5.13,5.17,5.32,5.38,
+5.35,5.51,5.71,5.75,5.85,5.87,6.07,6.15,6.19,6.25,
+6.39,6.45,6.63,6.59,6.70,6.78,6.94,7.03,7.09,7.12,
+7.21,7.30,7.34,7.50,7.55,7.62,7.70,7.83,7.99,8.06,
+7.96,8.21,8.38,8.29,8.42,8.51,8.69,8.69,8.79,8.82,
+9.00,9.11,9.26,9.16,9.41,9.33,9.53,9.54,9.66,9.73,
+9.93,10.11,10.18,10.32,10.22,10.30,10.46,10.56,10.73,10.93,
+10.77,10.81,11.00,11.24,11.07,11.21,11.34,11.40,11.55,11.63,
+11.71,11.95,11.70,12.06,12.19,12.20,12.37,12.46,12.38,12.29,
+12.66,12.85,12.83,12.89,13.02,12.97,13.21,13.15,13.09,13.33,
+13.47,13.58,13.54,13.80,13.72,14.00,14.08,14.18,14.21,14.35,
+14.42,14.60,14.71,14.57,14.79,14.86,14.67,15.03,15.06,15.22,
+15.33,15.31,15.58,15.56,15.60,15.66,15.84,15.99,16.01,15.99,
+16.16,16.21,16.31,16.54,16.60,16.76,16.90,16.69,16.86,16.95,
+17.02,17.01,17.03,17.36,17.32,17.58,17.52,17.57,18.03,17.92,
+17.89,17.92,18.09,18.16,18.34,18.56,18.61,18.50,18.91,18.74,
+18.93,18.86,19.11,18.91,19.20,19.37,19.29,19.57,19.78,19.71,
+19.57,19.88,19.87,20.00,20.14,20.07,20.47,20.18,20.57,20.58,
+20.74,20.86,20.86,21.09,20.83,21.01,21.10,21.31,21.26,21.65,
+21.51,21.54,21.46,21.75,21.84,21.79,22.12,22.13,22.34,22.41,
+22.44,22.56,22.70,22.59,22.79,22.88,22.89,22.90,23.15,23.43,
+23.39,23.34,23.73,23.76,23.86,24.00,23.98,24.09,23.86,24.18,
+24.08,24.30,24.52,24.39,24.71,24.77,24.55,24.94,24.96,25.16,
+25.35,25.43,25.31,25.32,25.57,25.54,25.57,25.77,26.08,25.89,
+26.06,26.10,26.10,26.34,26.53,26.65,26.59,26.68,26.75,26.96,
+0.89,0.96,1.01,1.06,1.18,1.27,1.28,1.37,1.52,1.60,
+1.59,1.76,1.80,1.88,1.98,2.04,2.08,2.17,2.27,2.31,
+2.44,2.60,2.58,2.64,2.70,2.81,2.83,2.96,3.04,3.12,
+3.19,3.35,3.38,3.42,3.44,3.61,3.69,3.81,3.82,3.86,
+4.07,4.07,4.13,4.19,4.27,4.51,4.44,4.60,4.56,4.70,
+4.74,4.83,4.90,5.08,5.24,5.13,5.34,5.41,5.31,5.49,
+5.60,5.63,5.70,5.83,5.91,6.05,6.00,6.14,6.34,6.22,
+6.34,6.43,6.62,6.56,6.80,6.80,6.84,6.90,6.97,7.12,
+7.11,7.25,7.36,7.58,7.55,7.57,7.56,7.83,7.78,7.88,
+8.07,8.10,8.02,8.03,8.27,8.41,8.43,8.53,8.65,8.68,
+8.84,8.79,8.91,8.98,9.23,9.14,9.22,9.16,9.31,9.31,
+9.48,9.52,9.65,9.65,9.88,9.95,10.00,10.03,10.08,10.28,
+10.28,10.42,10.48,10.56,10.60,10.58,10.74,10.92,10.82,10.92,
+11.04,11.22,11.20,11.25,11.43,11.59,11.51,11.69,11.77,11.92,
+11.94,11.97,12.10,12.23,12.07,12.27,12.43,12.27,12.34,12.68,
+12.68,12.77,12.77,12.76,12.90,13.02,13.14,13.20,13.29,13.35,
+13.40,13.54,13.64,13.77,13.89,13.81,13.95,13.76,14.03,14.21,
+14.38,14.29,14.47,14.59,14.53,14.64,14.72,14.94,14.90,14.94,
+15.10,15.10,15.26,15.38,15.21,15.48,15.57,15.58,15.71,15.61,
+15.95,16.04,15.93,16.02,16.11,16.22,16.40,16.16,16.63,16.53,
+16.45,16.66,16.84,16.83,16.74,16.92,16.93,17.16,17.17,17.37,
+17.44,17.54,17.58,17.86,17.76,17.83,17.84,17.78,17.87,18.27,
+17.94,18.07,18.32,18.44,18.57,18.66,18.65,18.73,18.74,18.90,
+18.89,19.08,19.02,19.37,19.15,19.37,19.41,19.50,19.37,19.66,
+19.68,19.72,20.01,20.05,20.00,20.14,20.09,20.25,20.54,20.33,
+20.46,20.67,20.68,20.69,20.95,20.69,21.02,21.07,21.20,21.39,
+21.40,21.27,21.52,21.64,21.69,21.76,22.07,21.98,22.00,22.05,
+22.04,22.42,22.43,22.36,22.45,22.38,22.55,22.63,22.74,22.60,
+22.84,22.67,23.13,23.05,23.20,23.39,23.34,23.37,23.40,23.55,
+0.72,0.80,0.91,0.96,1.00,1.10,1.15,1.24,1.27,1.32,
+1.46,1.47,1.52,1.63,1.70,1.79,1.90,1.96,2.03,2.16,
+2.12,2.25,2.28,2.37,2.36,2.46,2.55,2.62,2.68,2.83,
+2.75,2.87,3.00,3.04,3.06,3.15,3.20,3.35,3.39,3.40,
+3.48,3.62,3.77,3.74,3.82,3.77,3.91,4.04,4.18,4.00,
+4.27,4.26,4.38,4.42,4.45,4.53,4.67,4.70,4.69,4.74,
+4.97,5.01,5.01,5.09,5.27,5.21,5.26,5.38,5.43,5.50,
+5.62,5.72,5.73,5.76,5.85,5.88,5.91,6.05,6.11,6.28,
+6.42,6.37,6.41,6.57,6.56,6.63,6.67,6.85,6.88,7.05,
+7.03,6.97,7.16,7.13,7.32,7.25,7.53,7.45,7.58,7.59,
+7.69,7.84,7.84,7.86,7.97,8.11,8.00,8.16,8.37,8.22,
+8.39,8.45,8.53,8.59,8.47,8.72,8.77,8.84,9.09,9.03,
+9.10,9.21,9.23,9.31,9.33,9.31,9.54,9.54,9.58,9.69,
+9.77,9.86,9.96,10.07,10.26,10.17,10.17,10.20,10.32,10.21,
+10.34,10.48,10.69,10.71,10.79,10.68,10.85,10.77,11.02,11.12,
+10.98,11.13,11.38,11.29,11.42,11.50,11.61,11.76,11.71,11.74,
+11.87,11.96,12.13,11.98,12.10,12.22,12.13,12.36,12.34,12.39,
+12.46,12.55,12.66,12.69,12.99,12.80,12.76,13.11,13.17,13.12,
+13.07,13.24,13.42,13.39,13.55,13.68,13.57,13.59,13.95,13.66,
+13.69,13.93,14.13,14.00,14.01,14.11,14.39,14.38,14.45,14.62,
+14.64,14.61,14.76,14.90,14.94,14.98,15.18,15.05,14.97,15.26,
+15.23,15.19,15.49,15.63,15.49,15.58,15.64,15.84,15.79,16.05,
+16.05,16.09,16.03,16.22,16.39,16.28,16.45,16.46,16.51,16.66,
+16.74,16.56,16.90,16.86,17.05,17.01,17.04,17.17,17.17,17.42,
+17.48,17.49,17.35,17.53,17.70,17.68,17.84,17.93,17.81,17.84,
+18.00,18.20,18.17,18.32,18.41,18.32,18.37,18.73,18.67,18.63,
+18.75,18.80,18.90,18.83,19.13,19.18,19.27,19.43,19.45,19.25,
+19.49,19.57,19.75,19.62,19.75,19.82,20.08,20.20,19.84,20.16,
+20.25,20.14,20.44,20.29,20.34,20.56,20.51,20.80,20.52,20.88,
+0.60,0.72,0.79,0.87,0.89,0.99,1.04,1.11,1.13,1.21,
+1.24,1.34,1.47,1.43,1.49,1.60,1.67,1.75,1.73,1.82,
+1.95,1.97,2.03,2.00,2.12,2.25,2.23,2.32,2.35,2.42,
+2.52,2.52,2.57,2.66,2.75,2.85,2.82,2.94,2.99,3.03,
+3.13,3.10,3.17,3.32,3.29,3.42,3.50,3.49,3.62,3.67,
+3.68,3.84,3.83,3.88,3.99,4.04,4.22,4.09,4.17,4.25,
+4.37,4.50,4.46,4.56,4.54,4.54,4.55,4.73,4.77,4.92,
+5.04,4.92,5.04,5.03,5.12,5.24,5.33,5.28,5.45,5.43,
+5.44,5.52,5.63,5.82,5.74,5.88,5.84,5.94,6.06,6.01,
+6.06,6.33,6.15,6.29,6.44,6.40,6.47,6.49,6.67,6.74,
+6.87,6.87,6.88,6.90,7.04,6.94,7.12,7.06,7.36,7.27,
+7.38,7.58,7.64,7.69,7.58,7.78,7.70,7.79,7.96,7.97,
+8.14,8.01,8.13,8.13,8.20,8.30,8.36,8.46,8.43,8.57,
+8.60,8.72,8.73,8.72,9.04,8.72,8.97,9.10,9.00,9.02,
+9.23,9.21,9.28,9.25,9.52,9.61,9.52,9.59,9.62,9.61,
+9.69,9.73,9.99,9.99,10.05,10.21,10.23,10.26,10.36,10.24,
+10.39,10.53,10.64,10.62,10.59,10.55,10.64,10.79,11.04,11.03,
+11.12,11.08,11.12,11.24,11.29,11.33,11.27,11.60,11.28,11.65,
+11.84,11.71,11.69,11.68,11.81,12.08,12.02,12.02,12.20,12.21,
+12.36,12.21,12.28,12.41,12.42,12.56,12.69,12.72,12.74,12.90,
+12.76,12.88,12.94,13.05,13.29,13.29,13.20,13.56,13.37,13.46,
+13.45,13.37,13.55,13.77,13.57,13.76,13.79,13.80,14.04,14.27,
+13.96,14.27,14.19,14.38,14.45,14.38,14.46,14.36,14.47,14.49,
+14.60,14.81,14.76,14.96,14.80,15.01,14.96,15.09,15.19,15.11,
+15.37,15.31,15.40,15.48,15.61,15.58,15.59,15.72,15.76,15.88,
+15.98,16.08,15.90,16.12,16.02,16.03,16.17,16.20,16.28,16.28,
+16.49,16.49,16.70,16.93,16.83,16.82,16.98,17.02,17.05,17.03,
+17.15,17.24,17.33,17.17,17.38,17.45,17.35,17.41,17.45,17.72,
+17.71,17.72,17.82,17.96,17.93,17.91,18.21,18.09,18.33,18.44,
+3.97,4.46,4.79,5.06,5.55,5.94,6.26,6.67,7.03,7.40,
+7.80,8.17,8.43,8.86,9.22,9.55,9.98,10.40,10.70,11.04,
+11.55,11.94,12.18,12.59,12.94,13.45,13.77,14.10,14.48,14.75,
+15.13,15.70,15.90,16.29,16.72,17.07,17.49,17.93,18.20,18.67,
+18.84,19.36,19.59,20.00,20.50,20.76,21.17,21.57,21.88,22.29,
+22.75,23.01,23.50,23.83,24.09,24.52,24.87,25.27,25.45,26.00,
+26.46,26.78,27.34,27.61,27.95,28.43,28.61,28.96,29.54,29.76,
+30.21,30.64,31.09,31.25,31.76,32.04,32.22,32.80,33.07,33.53,
+33.81,34.31,34.48,34.98,35.39,35.82,36.17,36.36,36.93,37.20,
+37.53,37.99,38.23,38.77,39.08,39.41,39.80,40.06,40.61,41.11,
+41.37,41.92,42.11,42.58,42.74,43.17,43.83,44.03,44.28,44.72,
+44.94,45.37,45.78,46.08,46.67,47.08,47.38,47.73,48.15,48.36,
+48.77,48.98,49.48,49.97,50.59,50.69,51.00,51.48,51.88,51.90,
+52.61,52.85,53.30,53.95,54.12,54.64,54.72,55.14,55.57,56.03,
+56.33,56.83,56.97,57.27,57.76,58.24,58.49,58.77,59.46,59.73,
+60.16,60.33,60.84,61.21,61.51,62.08,62.41,62.31,63.02,63.20,
+63.73,63.98,64.28,64.95,65.42,65.57,66.11,66.35,66.79,67.16,
+67.45,68.05,68.42,68.48,68.75,69.17,69.45,69.98,70.54,70.81,
+71.21,71.63,71.89,72.19,72.57,73.12,73.67,73.89,74.25,74.43,
+74.99,75.42,75.44,76.14,76.19,76.92,77.32,77.52,77.89,78.27,
+78.31,78.96,79.54,80.03,80.07,80.45,80.93,81.39,81.55,82.18,
+82.33,82.83,83.09,83.55,83.85,84.47,84.51,85.25,85.31,85.98,
+86.19,86.59,86.83,87.31,87.77,87.91,88.71,88.71,89.29,89.64,
+90.11,90.39,90.42,91.08,91.70,91.97,92.05,92.26,93.04,93.24,
+93.58,93.95,94.45,94.99,94.99,95.62,95.76,96.38,96.59,96.74,
+97.31,97.89,98.01,98.75,98.87,99.20,99.38,100.07,100.40,100.76,
+101.17,101.47,101.97,102.23,102.78,103.06,103.23,103.39,103.94,104.59,
+104.59,105.29,105.80,105.63,106.39,106.43,107.47,107.34,107.80,108.14,
+108.57,108.92,109.32,109.11,110.03,110.51,111.02,111.18,111.47,111.81,
+3.62,3.89,4.24,4.63,4.86,5.24,5.62,5.93,6.28,6.60,
+6.87,7.26,7.55,7.95,8.25,8.60,8.84,9.37,9.45,9.99,
+10.17,10.66,10.92,11.12,11.64,11.89,12.26,12.51,12.88,13.19,
+13.63,13.88,14.23,14.62,14.93,15.13,15.43,15.80,16.24,16.49,
+16.91,17.30,17.55,17.86,18.07,18.54,18.89,19.21,19.71,19.85,
+20.25,20.63,20.81,21.05,21.53,21.88,22.20,22.53,22.88,23.24,
+23.43,23.84,24.16,24.53,24.85,25.27,25.63,25.87,26.33,26.60,
+26.76,27.20,27.61,27.76,28.18,28.46,28.63,29.14,29.32,29.85,
+30.08,30.49,30.81,31.17,31.36,31.84,32.24,32.52,32.77,33.19,
+33.64,33.95,34.16,34.58,34.75,35.11,35.49,35.73,36.13,36.55,
+36.80,37.22,37.61,37.67,37.87,38.48,38.75,39.12,39.53,39.96,
+40.05,40.59,40.61,41.08,41.41,41.77,42.28,42.55,42.80,43.12,
+43.45,44.14,44.19,44.37,44.80,45.09,45.40,45.62,46.10,46.63,
+46.95,47.19,47.35,47.76,48.06,48.36,48.70,49.39,49.56,49.72,
+49.94,50.43,50.79,50.93,51.74,51.63,52.06,52.39,52.78,52.94,
+53.63,53.76,54.06,54.37,54.67,55.08,55.24,56.20,56.12,56.45,
+56.87,57.13,57.37,57.66,58.03,58.28,58.64,59.00,59.41,59.78,
+60.18,60.55,60.52,61.12,61.02,61.83,61.95,62.19,62.79,62.93,
+63.37,63.70,64.13,64.40,64.83,65.32,65.42,65.71,65.98,66.27,
+66.78,67.30,67.51,67.81,68.10,68.16,68.71,69.24,69.40,69.82,
+70.26,70.50,70.53,71.10,71.43,71.46,71.99,72.22,72.92,72.91,
+73.37,73.55,73.88,74.63,74.60,74.74,75.70,75.54,76.09,76.65,
+76.71,77.08,77.46,77.58,77.92,78.48,78.62,79.03,79.50,79.57,
+80.09,80.56,80.85,80.90,81.19,81.66,82.06,82.27,82.50,83.04,
+83.37,83.62,84.08,84.05,84.58,85.02,85.30,85.63,85.97,86.37,
+86.59,87.00,87.56,87.58,88.06,88.32,88.37,89.07,89.46,89.62,
+90.12,90.17,90.96,91.22,91.11,91.65,92.12,92.34,92.60,92.98,
+93.30,93.54,93.90,94.43,94.52,95.19,95.34,95.47,96.01,96.35,
+96.42,96.82,97.27,97.49,97.84,98.36,98.67,98.82,99.34,99.40,
+3.16,3.52,3.74,4.04,4.41,4.64,4.93,5.28,5.58,5.89,
+6.21,6.49,6.71,7.00,7.37,7.58,8.06,8.22,8.53,8.77,
+9.16,9.35,9.69,10.08,10.37,10.57,10.75,11.11,11.49,11.87,
+12.09,12.43,12.62,12.93,13.16,13.57,13.76,14.10,14.33,14.74,
+15.11,15.37,15.69,16.01,16.21,16.46,16.77,17.17,17.46,17.67,
+18.04,18.30,18.45,18.72,19.08,19.49,19.80,19.96,20.27,20.68,
+20.99,21.35,21.34,21.79,22.12,22.49,22.59,22.93,23.29,23.63,
+23.91,24.20,24.60,24.71,25.21,25.39,25.80,25.98,26.15,26.55,
+26.85,26.98,27.31,27.94,27.98,28.34,28.64,28.94,29.17,29.57,
+29.93,30.04,30.53,30.66,30.95,31.32,31.77,31.99,32.34,32.32,
+32.73,33.09,33.30,33.55,33.95,34.11,34.74,34.88,35.16,35.38,
+35.70,36.04,36.26,36.65,36.87,37.20,37.54,37.83,38.05,38.34,
+38.64,39.11,39.40,39.64,39.92,40.15,40.39,40.53,40.97,41.44,
+41.53,41.89,42.23,42.76,42.86,43.16,43.37,43.91,44.12,44.27,
+44.40,44.84,45.21,45.54,45.80,45.92,46.24,46.78,46.97,47.35,
+47.44,47.86,48.19,48.44,48.74,49.15,49.18,49.61,49.76,50.06,
+50.44,50.62,51.02,51.42,51.68,51.78,52.54,52.53,52.89,52.99,
+53.54,53.70,54.19,54.28,54.70,54.67,55.36,55.55,55.75,56.18,
+56.40,56.71,57.17,57.49,57.64,57.77,58.22,58.81,58.65,59.26,
+59.31,59.68,59.83,60.17,60.70,61.00,61.21,61.65,61.85,62.09,
+62.36,62.68,63.19,63.31,63.49,63.93,64.29,64.74,64.77,65.11,
+65.35,65.30,65.85,65.97,66.67,66.91,67.16,67.45,67.56,68.08,
+68.22,68.33,69.10,69.08,69.58,69.72,70.10,70.11,70.60,70.88,
+71.18,71.49,71.88,71.98,72.37,72.81,72.94,72.98,73.43,73.89,
+74.11,74.54,74.81,75.08,75.22,75.62,75.84,76.50,76.46,76.83,
+77.03,77.41,77.74,77.81,78.62,78.66,78.79,79.21,79.30,79.83,
+79.89,80.31,80.48,80.88,81.31,81.54,81.94,82.22,82.28,82.81,
+83.17,83.55,83.37,84.08,84.06,84.38,84.80,85.06,85.37,85.40,
+85.86,86.30,86.75,87.06,87.03,87.36,87.85,88.28,88.52,88.43,
+2.81,3.09,3.41,3.62,3.85,4.15,4.41,4.72,4.96,5.22,
+5.40,5.73,6.11,6.24,6.56,6.79,7.11,7.33,7.65,7.82,
+8.09,8.36,8.66,8.98,9.12,9.49,9.76,9.88,10.28,10.36,
+10.68,11.04,11.23,11.56,11.85,11.95,12.31,12.66,12.85,13.10,
+13.43,13.69,13.84,14.16,14.39,14.55,15.02,15.24,15.47,15.72,
+16.01,16.23,16.46,16.74,17.08,17.36,17.55,17.89,18.29,18.39,
+18.61,18.95,19.22,19.25,19.61,19.98,20.19,20.56,20.82,20.97,
+21.26,21.51,21.80,22.07,22.32,22.65,22.86,23.01,23.29,23.78,
+24.04,24.15,24.48,24.54,24.99,25.11,25.39,25.79,26.04,26.28,
+26.59,26.70,27.16,27.32,27.57,27.89,27.96,28.32,28.66,28.84,
+29.23,29.38,29.68,29.85,30.34,30.38,30.75,30.97,31.33,31.52,
+31.88,32.03,32.46,32.60,33.10,33.10,33.58,33.63,33.99,34.23,
+34.55,34.60,34.96,35.13,35.47,35.89,36.04,36.40,36.47,36.73,
+37.08,37.22,37.52,37.88,38.18,38.30,38.55,38.61,39.32,39.36,
+39.79,40.12,40.22,40.43,40.68,40.99,41.34,41.44,41.60,42.15,
+42.41,42.62,42.90,43.18,43.61,43.59,43.82,44.25,44.58,44.74,
+45.08,45.32,45.45,45.64,46.25,46.29,46.48,46.87,47.32,47.35,
+47.71,47.87,48.03,48.40,48.61,49.08,49.29,49.47,49.54,49.78,
+50.27,50.35,50.90,51.10,51.08,51.59,51.60,51.74,52.14,52.33,
+52.65,53.17,53.20,53.36,53.91,54.07,54.44,54.59,55.13,55.39,
+55.55,55.60,56.12,56.41,56.50,56.89,57.17,57.20,57.72,57.85,
+58.24,58.16,58.78,58.69,59.44,59.46,59.80,59.80,60.16,60.55,
+60.71,61.15,61.43,61.44,61.91,61.93,62.38,62.75,62.77,63.00,
+63.53,63.60,63.87,64.14,64.40,64.70,64.84,65.44,65.60,65.71,
+65.98,66.29,66.51,66.68,67.22,67.64,67.53,67.89,67.90,68.10,
+68.58,69.07,69.15,69.51,69.69,69.98,69.98,70.36,71.02,70.93,
+71.20,71.63,71.65,72.06,72.37,72.40,73.04,73.08,73.47,73.77,
+73.49,74.39,74.44,74.84,75.05,75.12,75.72,75.54,76.03,76.04,
+76.52,76.95,77.21,77.17,77.64,77.90,78.11,78.93,78.76,78.84,
+2.56,2.76,3.05,3.22,3.48,3.67,3.98,4.18,4.31,4.73,
+4.88,5.09,5.34,5.62,5.89,6.08,6.30,6.53,6.70,7.01,
+7.25,7.30,7.63,7.87,8.22,8.29,8.58,8.79,9.12,9.16,
+9.59,9.77,10.05,10.29,10.59,10.70,10.97,11.09,11.48,11.66,
+11.90,12.08,12.33,12.64,12.80,13.03,13.32,13.62,13.77,14.01,
+14.30,14.46,14.71,14.88,15.23,15.37,15.73,15.89,16.15,16.43,
+16.62,16.82,17.05,17.43,17.52,17.81,17.98,18.04,18.49,18.70,
+18.81,19.18,19.28,19.74,19.74,20.14,20.43,20.53,20.73,21.10,
+21.20,21.58,21.75,21.94,22.18,22.50,22.66,22.77,23.13,23.50,
+23.56,23.83,24.03,24.13,24.46,24.75,25.05,25.17,25.30,25.73,
+25.88,26.34,26.36,26.79,26.78,27.28,27.50,27.61,27.79,28.12,
+28.32,28.61,28.64,28.91,29.14,29.59,29.75,29.95,30.11,30.43,
+30.59,30.71,31.12,31.39,31.62,32.00,32.19,32.26,32.54,32.82,
+33.04,33.20,33.45,33.65,34.00,34.01,34.27,34.60,34.84,35.03,
+35.31,35.61,35.77,36.07,36.09,36.54,36.63,36.71,37.15,37.24,
+37.74,37.99,38.15,38.20,38.57,38.84,39.09,39.49,39.40,39.86,
+40.00,40.32,40.27,40.72,40.75,41.22,41.54,41.41,41.82,42.08,
+42.39,42.56,42.69,43.18,43.41,43.42,43.83,43.90,44.12,44.38,
+44.77,44.88,45.23,45.51,45.59,45.89,46.30,46.28,46.44,46.99,
+47.16,47.15,47.59,47.70,48.05,48.06,48.48,48.68,48.66,49.19,
+49.38,49.54,49.55,50.05,50.34,50.82,50.74,51.07,51.37,51.58,
+51.73,51.70,52.25,52.33,52.70,52.97,53.13,53.58,53.71,53.99,
+53.80,54.13,54.51,54.77,55.10,55.11,55.36,55.85,56.00,56.12,
+56.19,56.68,56.63,57.18,57.42,57.52,57.78,57.86,58.20,58.63,
+58.63,58.82,59.32,59.42,59.58,59.83,59.91,60.38,60.59,60.77,
+61.12,61.04,61.22,61.81,61.90,62.34,62.36,62.91,63.08,63.25,
+63.34,63.66,63.99,64.32,64.40,64.57,64.49,65.39,65.06,65.66,
+65.73,66.08,66.19,66.52,66.75,66.86,67.03,67.64,67.46,67.92,
+68.35,68.68,68.63,69.12,68.73,69.21,69.59,69.89,70.18,70.01,
+2.27,2.43,2.74,2.89,3.04,3.29,3.56,3.75,3.95,4.13,
+4.37,4.60,4.85,4.97,5.15,5.38,5.67,5.78,6.01,6.22,
+6.45,6.66,6.83,7.10,7.30,7.42,7.73,7.77,7.98,8.21,
+8.59,8.61,8.97,9.12,9.32,9.54,9.91,9.95,10.15,10.41,
+10.60,10.79,11.04,11.30,11.39,11.77,11.88,12.05,12.18,12.54,
+12.71,12.85,13.05,13.41,13.38,13.73,13.98,14.14,14.39,14.57,
+14.83,14.93,15.25,15.22,15.53,15.84,16.07,16.23,16.49,16.58,
+16.96,17.01,17.29,17.34,17.60,17.89,18.09,18.33,18.45,18.65,
+19.08,19.11,19.40,19.64,19.74,20.05,20.16,20.42,20.51,20.80,
+20.98,21.35,21.39,21.67,21.88,21.91,22.21,22.51,22.64,23.10,
+23.03,23.36,23.40,23.76,24.04,24.25,24.46,24.53,24.73,24.81,
+25.01,25.12,25.51,25.73,26.04,26.20,26.57,26.67,26.83,27.11,
+27.16,27.48,27.51,27.68,27.95,28.37,28.50,28.49,28.84,29.24,
+29.20,29.73,29.61,30.04,30.07,30.32,30.51,30.74,30.99,31.37,
+31.42,31.82,31.85,32.17,32.11,32.42,32.70,33.05,33.09,33.27,
+33.52,33.72,34.20,34.19,34.30,34.44,34.83,35.02,35.26,35.28,
+35.75,35.72,35.97,36.25,36.56,36.67,36.92,37.20,37.10,37.53,
+37.53,37.74,38.13,38.60,38.59,38.58,39.11,39.20,39.32,39.67,
+39.89,40.10,40.13,40.60,40.55,40.87,41.03,41.33,41.33,41.91,
+41.91,42.09,41.91,42.53,42.78,42.96,42.97,43.26,43.37,43.75,
+44.22,43.98,44.44,44.47,44.87,44.97,44.98,45.38,45.51,45.69,
+46.04,46.17,46.26,46.56,46.95,47.01,47.43,47.61,47.63,48.00,
+48.02,48.21,48.26,48.84,49.07,49.16,49.35,49.35,49.89,49.94,
+50.24,50.41,50.80,50.96,50.89,51.41,51.68,51.65,51.92,51.96,
+52.26,52.67,52.77,52.89,53.31,53.41,53.56,53.81,53.84,54.16,
+54.23,54.39,54.87,55.05,55.01,55.55,55.58,55.72,56.04,56.14,
+56.45,56.80,56.96,57.39,57.09,57.38,57.55,58.00,58.13,58.20,
+58.71,58.75,59.01,59.06,59.53,59.64,59.39,59.74,60.19,60.41,
+60.68,60.64,60.75,61.30,61.33,61.69,62.00,62.07,62.30,62.43,
+2.01,2.21,2.38,2.60,2.76,2.90,3.18,3.34,3.44,3.68,
+3.86,4.05,4.27,4.42,4.64,4.72,5.07,5.20,5.34,5.56,
+5.71,5.95,6.08,6.21,6.46,6.69,6.81,6.97,7.23,7.37,
+7.57,7.75,8.00,8.06,8.37,8.53,8.77,8.86,8.99,9.19,
+9.32,9.62,9.74,10.04,10.21,10.35,10.51,10.77,10.88,11.16,
+11.28,11.44,11.54,11.87,12.05,12.34,12.26,12.61,12.78,12.88,
+13.16,13.29,13.47,13.71,13.79,14.06,14.25,14.43,14.55,14.77,
+14.85,15.30,15.39,15.52,15.65,15.91,16.18,16.21,16.52,16.84,
+16.82,17.03,17.09,17.44,17.71,17.82,18.03,18.09,18.39,18.46,
+18.70,18.92,18.95,19.45,19.24,19.50,19.91,20.00,20.14,20.33,
+20.58,20.68,20.89,21.08,21.31,21.57,21.65,21.86,22.01,22.19,
+22.29,22.75,22.88,23.05,23.22,23.28,23.60,23.77,23.93,23.96,
+24.27,24.34,24.83,24.79,24.97,25.22,25.40,25.69,25.94,25.92,
+26.18,26.23,26.62,26.86,27.11,27.12,27.13,27.30,27.35,27.82,
+28.05,28.37,28.42,28.47,28.64,29.08,29.13,29.39,29.54,29.73,
+29.72,29.89,30.15,30.37,30.74,30.82,30.96,31.19,31.40,31.45,
+31.86,31.81,32.16,32.22,32.39,32.69,32.81,33.17,33.00,33.11,
+33.58,33.74,33.92,34.17,34.30,34.32,34.43,34.96,34.98,35.28,
+35.56,35.61,35.79,35.89,36.11,36.52,36.39,36.69,36.76,37.08,
+37.22,37.36,37.68,37.85,37.88,38.23,38.51,38.72,38.73,38.81,
+39.08,39.34,39.32,39.61,39.85,40.09,40.37,40.49,40.56,40.70,
+40.98,41.13,41.29,41.47,41.28,41.84,41.84,42.06,42.52,42.59,
+42.60,42.78,43.23,43.50,43.55,43.75,43.82,44.28,43.87,44.50,
+44.70,44.79,45.03,45.41,45.26,45.71,45.87,46.21,46.03,46.46,
+46.50,46.49,46.99,46.98,47.31,47.53,47.53,47.76,48.25,48.07,
+48.31,48.68,48.72,48.77,49.28,49.43,49.54,49.78,49.77,50.07,
+50.08,50.42,50.78,50.69,51.04,51.25,51.52,51.54,51.68,51.73,
+52.19,52.48,52.22,52.53,52.72,53.40,53.21,53.43,53.78,53.60,
+54.11,53.99,54.48,54.50,54.63,54.70,55.15,55.41,55.48,55.30,
+1.76,1.94,2.17,2.25,2.43,2.56,2.70,2.96,3.05,3.27,
+3.47,3.61,3.72,4.00,4.06,4.30,4.35,4.56,4.78,4.89,
+5.04,5.21,5.43,5.65,5.74,5.91,6.13,6.25,6.33,6.49,
+6.75,6.91,7.14,7.12,7.47,7.49,7.81,7.92,8.07,8.20,
+8.43,8.52,8.74,8.77,9.06,9.29,9.39,9.57,9.67,9.86,
+10.01,10.11,10.34,10.38,10.68,10.83,10.92,11.26,11.44,11.55,
+11.72,11.74,11.96,12.22,12.38,12.39,12.60,12.87,13.06,13.09,
+13.26,13.67,13.77,13.58,14.17,14.19,14.24,14.43,14.69,14.76,
+15.03,15.21,15.19,15.51,15.71,15.76,15.94,16.12,16.21,16.52,
+16.56,16.84,17.05,17.18,17.36,17.51,17.66,17.91,17.91,18.17,
+18.37,18.42,18.67,18.97,19.05,19.21,19.40,19.45,19.70,19.80,
+19.92,20.18,20.26,20.49,20.63,20.50,20.79,20.96,21.15,21.21,
+21.41,21.73,21.88,22.08,22.30,22.44,22.77,22.63,22.98,23.17,
+23.30,23.40,23.78,23.66,23.96,24.20,24.25,24.47,24.45,24.77,
+25.03,25.12,25.20,25.31,25.66,25.68,25.83,26.01,26.16,26.27,
+26.65,26.85,26.89,27.08,27.17,27.23,27.52,27.72,27.82,28.04,
+28.32,28.29,28.45,28.64,28.84,29.10,29.08,29.11,29.55,29.75,
+29.94,30.03,30.36,30.23,30.54,30.65,30.95,31.12,31.28,31.48,
+31.53,31.75,31.82,31.99,31.92,32.40,32.66,32.60,32.71,32.88,
+33.24,33.48,33.41,33.55,33.80,33.97,34.02,34.36,34.42,34.63,
+34.70,35.14,35.22,35.43,35.39,35.62,35.79,36.01,36.15,36.35,
+36.56,36.60,36.79,37.20,37.06,37.19,37.70,37.49,37.71,37.94,
+38.32,38.40,38.53,38.88,38.58,39.06,39.05,39.15,39.46,39.57,
+39.61,39.99,40.17,40.21,40.21,40.58,40.80,40.71,41.12,41.35,
+41.44,41.46,41.70,41.97,42.07,42.08,42.13,42.57,42.74,42.84,
+43.06,43.12,43.20,43.53,43.60,43.98,44.24,44.18,44.43,44.59,
+44.81,44.96,45.07,45.47,45.50,45.37,46.03,45.86,46.22,46.23,
+46.32,46.58,46.54,46.72,47.09,47.02,47.27,47.58,47.51,47.99,
+48.17,48.17,48.49,48.55,48.76,48.99,48.88,49.12,49.30,49.44,
+1.58,1.75,1.84,2.02,2.14,2.30,2.47,2.63,2.70,2.89,
+3.03,3.21,3.30,3.48,3.62,3.80,4.00,4.16,4.23,4.45,
+4.54,4.59,4.80,4.99,5.12,5.22,5.38,5.63,5.72,5.83,
+6.00,6.20,6.18,6.44,6.52,6.78,6.94,6.99,7.11,7.37,
+7.52,7.67,7.75,7.85,8.06,8.33,8.35,8.46,8.56,8.86,
+8.95,9.09,9.24,9.45,9.49,9.66,9.83,9.94,10.24,10.30,
+10.42,10.63,10.85,10.80,10.96,11.11,11.32,11.44,11.70,11.65,
+11.87,12.19,12.15,12.27,12.45,12.68,12.80,12.90,12.85,13.29,
+13.36,13.57,13.60,13.82,13.89,14.21,14.16,14.52,14.48,14.77,
+14.74,15.06,15.27,15.11,15.34,15.55,15.83,15.94,15.87,16.08,
+16.45,16.51,16.59,16.65,16.93,16.85,17.08,17.27,17.44,17.73,
+17.77,18.07,17.96,18.20,18.40,18.51,18.78,18.74,19.06,18.97,
+19.33,19.44,19.51,19.62,19.95,19.96,20.21,20.32,20.38,20.57,
+20.62,20.74,20.95,21.28,21.36,21.52,21.55,21.59,21.61,22.14,
+22.19,22.14,22.52,22.71,22.87,22.72,23.02,23.23,23.38,23.39,
+23.65,23.72,23.77,24.06,24.23,24.30,24.36,24.64,24.74,24.92,
+25.06,25.36,25.33,25.53,25.74,25.90,26.08,26.08,26.14,26.50,
+26.64,26.76,26.66,27.05,27.09,27.11,27.41,27.64,28.03,27.76,
+28.10,28.41,28.36,28.32,28.62,28.89,28.97,29.18,29.22,29.40,
+29.89,29.47,29.86,30.00,30.20,30.32,30.43,30.45,30.68,30.90,
+31.14,31.05,31.23,31.44,31.46,31.77,31.93,32.06,32.18,31.94,
+32.60,32.58,32.90,32.76,32.90,33.10,33.42,33.70,33.49,33.85,
+33.88,34.26,34.07,34.42,34.62,34.55,34.75,34.90,35.05,35.25,
+35.41,35.63,35.71,35.65,35.89,36.30,36.29,36.49,36.66,36.87,
+36.72,36.88,37.24,37.28,37.54,37.55,37.72,38.13,38.11,38.14,
+38.07,38.38,38.62,38.99,38.90,39.17,39.32,39.41,39.66,39.86,
+39.81,39.81,40.30,40.03,40.59,40.71,40.67,40.86,40.60,41.29,
+41.37,41.48,41.44,41.71,41.79,42.09,41.92,42.22,42.35,42.56,
+42.65,43.08,43.08,43.34,43.24,43.42,43.49,43.53,43.82,43.91,
+1.40,1.54,1.64,1.80,1.94,2.04,2.22,2.22,2.48,2.66,
+2.81,2.87,2.98,3.18,3.26,3.35,3.49,3.57,3.78,3.92,
+4.04,4.19,4.37,4.43,4.58,4.68,4.87,4.92,5.13,5.25,
+5.30,5.50,5.63,5.72,5.83,6.11,6.21,6.33,6.38,6.46,
+6.59,6.82,6.98,7.14,7.20,7.17,7.40,7.64,7.84,7.83,
+7.82,8.16,8.17,8.38,8.53,8.57,8.73,8.79,9.03,9.25,
+9.28,9.43,9.47,9.79,9.82,9.88,10.05,10.08,10.30,10.35,
+10.65,10.77,10.83,10.93,11.11,11.18,11.27,11.53,11.58,11.66,
+11.85,12.03,12.14,12.36,12.50,12.65,12.63,12.87,12.90,13.00,
+13.17,13.27,13.42,13.48,13.73,13.73,14.12,14.02,14.30,14.41,
+14.34,14.52,14.80,15.06,15.03,15.12,15.25,15.55,15.55,15.81,
+15.97,15.99,16.00,16.21,16.26,16.41,16.62,16.64,16.77,17.00,
+17.22,17.20,17.39,17.49,17.50,17.84,18.11,18.00,18.03,18.34,
+18.43,18.51,18.70,18.88,18.92,19.05,19.26,19.35,19.34,19.75,
+19.76,19.83,19.97,20.17,20.12,20.57,20.59,20.68,20.71,20.77,
+20.99,21.15,21.41,21.29,21.67,21.70,21.85,21.92,22.06,22.24,
+22.26,22.50,22.44,22.62,23.14,22.89,22.97,23.17,23.60,23.65,
+23.63,23.56,23.76,24.19,24.07,24.03,24.48,24.60,24.78,24.77,
+24.94,25.07,25.30,25.41,25.55,25.66,25.77,25.86,25.97,26.35,
+26.17,26.20,26.38,26.62,26.94,27.13,27.16,27.43,27.27,27.31,
+27.70,27.59,27.79,27.93,28.17,28.11,28.26,28.63,28.74,28.65,
+28.77,28.85,29.24,29.46,29.29,29.81,29.58,29.67,29.89,30.10,
+30.23,30.33,30.58,30.55,30.86,30.95,30.94,31.16,31.23,31.31,
+31.51,31.50,31.66,31.67,31.95,32.16,32.22,32.38,32.36,32.79,
+32.71,32.94,33.14,33.17,33.21,33.27,33.64,33.80,34.02,34.02,
+34.03,34.40,34.34,34.57,34.48,34.59,34.67,35.12,35.34,35.12,
+35.39,35.54,35.77,35.84,36.06,36.17,36.30,36.25,36.50,36.45,
+36.69,36.64,36.91,37.10,37.01,37.45,37.47,37.37,37.76,37.64,
+38.03,38.02,38.26,38.53,38.35,38.66,38.63,38.81,39.23,39.28,
+1.24,1.45,1.48,1.58,1.76,1.82,1.97,2.07,2.21,2.28,
+2.40,2.54,2.65,2.76,2.88,3.01,3.11,3.20,3.36,3.50,
+3.57,3.76,3.83,3.84,3.97,4.24,4.13,4.40,4.52,4.63,
+4.68,4.83,5.05,5.05,5.20,5.36,5.38,5.50,5.77,5.71,
+5.90,5.99,6.16,6.22,6.40,6.62,6.52,6.72,6.98,6.99,
+7.05,7.23,7.30,7.39,7.61,7.60,7.71,7.90,8.01,7.97,
+8.23,8.45,8.36,8.56,8.68,8.93,8.98,9.22,9.15,9.23,
+9.41,9.51,9.63,9.70,10.02,10.02,10.09,10.25,10.32,10.46,
+10.43,10.62,10.76,10.89,11.12,11.10,11.26,11.44,11.54,11.68,
+11.76,11.97,11.82,12.07,12.10,12.40,12.33,12.57,12.69,12.87,
+12.82,13.12,13.29,13.23,13.45,13.53,13.79,13.64,13.79,14.01,
+13.94,14.14,14.38,14.44,14.46,14.64,14.79,14.92,15.07,15.15,
+15.23,15.32,15.61,15.63,15.73,15.85,16.06,16.05,16.20,16.24,
+16.27,16.52,16.75,16.68,16.84,16.93,17.08,17.12,17.42,17.60,
+17.54,17.59,17.75,17.93,17.87,18.12,18.28,18.56,18.45,18.55,
+18.75,18.91,18.97,19.07,19.16,19.21,19.41,19.52,19.62,19.74,
+19.83,19.86,20.07,20.27,20.36,20.63,20.56,20.92,20.90,20.91,
+21.03,21.07,21.12,21.43,21.56,21.58,21.82,21.59,21.95,22.15,
+22.20,22.02,22.54,22.56,22.68,22.72,22.75,23.00,23.12,23.33,
+23.34,23.47,23.62,23.98,23.96,23.98,23.95,24.24,24.32,24.29,
+24.40,24.80,24.93,24.99,24.96,25.12,25.25,25.30,25.14,25.80,
+25.70,25.76,25.79,26.16,26.08,26.32,26.81,26.61,26.64,26.77,
+26.83,26.96,26.85,27.11,27.54,27.50,27.55,27.58,27.79,27.75,
+28.05,27.99,28.27,28.50,28.62,28.42,28.68,28.72,28.98,29.33,
+29.40,29.43,29.29,29.59,29.48,29.73,30.03,30.05,30.22,30.04,
+30.19,30.47,30.50,30.63,30.87,30.92,31.23,31.18,31.26,31.40,
+31.66,31.52,31.70,31.88,31.88,32.17,32.29,32.41,32.10,32.83,
+32.74,32.81,32.99,33.03,33.23,33.28,33.53,33.38,33.50,33.94,
+33.88,34.03,34.43,34.15,34.29,34.28,34.58,34.43,34.76,34.83,
+1.15,1.22,1.38,1.38,1.57,1.58,1.78,1.81,1.93,2.01,
+2.15,2.29,2.31,2.48,2.55,2.67,2.68,2.92,3.02,3.04,
+3.15,3.28,3.38,3.49,3.60,3.62,3.88,3.94,4.00,4.11,
+4.13,4.32,4.44,4.53,4.56,4.80,4.87,4.99,4.96,5.16,
+5.29,5.34,5.48,5.56,5.74,5.75,5.98,6.01,6.12,6.13,
+6.29,6.41,6.47,6.52,6.62,6.78,6.93,6.97,7.21,7.19,
+7.29,7.53,7.51,7.63,7.91,7.92,7.85,8.12,8.12,8.28,
+8.35,8.48,8.56,8.69,8.77,8.96,8.99,9.07,9.29,9.29,
+9.36,9.45,9.61,9.66,9.91,9.75,9.96,10.04,10.30,10.18,
+10.56,10.60,10.50,10.80,10.94,10.97,11.00,11.11,11.14,11.40,
+11.41,11.58,11.69,11.73,11.97,12.06,12.06,12.22,12.22,12.43,
+12.55,12.63,12.60,12.80,12.98,12.98,13.08,13.31,13.22,13.65,
+13.54,13.78,13.74,13.86,13.94,14.20,14.17,14.36,14.39,14.37,
+14.78,14.74,14.86,14.87,14.85,15.11,15.31,15.29,15.42,15.50,
+15.44,15.68,15.99,15.99,16.05,16.06,16.29,16.22,16.41,16.75,
+16.50,16.75,16.79,16.91,17.15,17.14,17.35,17.42,17.45,17.74,
+17.82,17.91,18.01,17.96,17.94,18.35,18.35,18.62,18.68,18.70,
+18.90,18.73,18.97,19.06,19.21,19.15,19.33,19.54,19.41,19.80,
+19.74,19.82,20.09,19.95,20.08,20.35,20.42,20.69,20.52,20.59,
+20.69,21.10,21.04,21.08,21.17,21.31,21.37,21.38,21.71,21.85,
+21.78,22.11,22.12,22.35,22.34,22.52,22.71,22.64,22.40,22.94,
+22.82,22.95,23.10,23.16,23.29,23.21,23.57,23.61,23.62,23.76,
+23.94,23.93,24.12,24.12,24.10,24.43,24.49,24.65,24.80,24.75,
+24.90,25.01,25.04,25.12,25.39,25.23,25.71,25.79,25.67,26.08,
+25.91,26.06,26.33,26.36,26.39,26.53,26.62,26.79,26.77,27.00,
+27.12,27.03,27.31,27.30,27.44,27.46,27.80,27.76,27.91,27.89,
+27.99,28.12,28.37,28.39,28.33,28.61,28.83,28.68,28.86,29.02,
+29.10,29.12,29.28,29.47,29.45,29.62,29.52,29.66,29.93,30.06,
+30.04,30.05,30.47,30.21,30.61,30.68,30.60,30.81,31.24,30.91,
+1.00,1.09,1.20,1.24,1.40,1.43,1.50,1.64,1.67,1.84,
+2.01,1.98,2.08,2.12,2.24,2.31,2.50,2.54,2.64,2.69,
+2.85,2.98,2.98,3.10,3.10,3.22,3.38,3.53,3.60,3.70,
+3.73,3.97,3.93,3.99,4.12,4.31,4.39,4.49,4.46,4.55,
+4.68,4.80,4.83,5.00,5.12,5.17,5.32,5.29,5.46,5.47,
+5.61,5.72,5.88,5.85,5.97,6.10,6.27,6.22,6.28,6.44,
+6.48,6.57,6.69,6.79,6.81,7.00,7.07,7.16,7.37,7.30,
+7.43,7.61,7.71,7.74,7.79,7.94,8.01,8.11,8.17,8.13,
+8.41,8.47,8.56,8.69,8.75,8.72,8.92,9.13,9.12,9.06,
+9.26,9.37,9.46,9.58,9.54,9.80,9.92,9.81,10.09,10.19,
+10.19,10.39,10.34,10.33,10.46,10.73,10.81,10.81,11.04,11.10,
+11.10,11.18,11.38,11.47,11.39,11.71,11.62,11.79,12.02,11.92,
+12.12,12.08,12.32,12.23,12.44,12.44,12.53,12.77,12.71,12.71,
+12.97,13.11,13.19,13.05,13.44,13.53,13.68,13.55,13.66,13.77,
+13.99,14.08,14.07,13.95,14.10,14.41,14.48,14.49,14.64,14.73,
+14.78,14.74,15.04,15.21,15.28,15.19,15.34,15.32,15.64,15.78,
+15.70,15.92,15.96,15.94,16.12,16.18,16.48,16.49,16.57,16.44,
+16.87,16.68,16.93,16.91,16.88,17.21,17.16,17.26,17.47,17.60,
+17.53,17.76,17.48,17.93,17.98,17.96,18.04,18.29,18.36,18.51,
+18.65,18.75,18.70,18.90,18.92,18.91,19.21,19.28,19.39,19.41,
+19.43,19.51,19.64,19.82,19.88,19.86,19.92,20.00,20.26,20.24,
+20.37,20.43,20.61,20.54,20.69,20.75,20.88,21.06,21.23,21.20,
+21.23,21.36,21.59,21.60,21.45,21.83,21.82,21.84,21.96,22.04,
+22.29,22.10,22.34,22.50,22.65,22.66,22.75,22.81,22.97,23.07,
+23.16,23.25,23.12,23.37,23.42,23.56,23.64,23.83,23.75,24.18,
+24.07,23.95,24.32,24.48,24.35,24.64,24.41,24.63,24.60,24.85,
+25.09,24.97,25.17,25.47,25.34,25.48,25.53,25.47,25.59,25.62,
+25.85,25.87,26.15,26.06,26.12,26.24,26.64,26.37,26.68,26.73,
+26.75,26.87,26.93,27.12,27.12,27.41,27.45,27.45,27.48,27.57,
+0.91,0.98,1.05,1.14,1.18,1.33,1.39,1.47,1.58,1.66,
+1.73,1.82,1.90,2.00,2.01,2.09,2.24,2.27,2.30,2.48,
+2.49,2.59,2.69,2.74,2.87,3.03,3.14,3.09,3.21,3.29,
+3.32,3.35,3.46,3.67,3.68,3.75,3.82,3.90,4.06,4.17,
+4.19,4.32,4.35,4.46,4.40,4.52,4.70,4.67,4.87,4.94,
+5.00,4.99,5.18,5.21,5.33,5.36,5.49,5.64,5.63,5.63,
+5.83,5.81,5.88,5.97,6.26,6.25,6.38,6.39,6.43,6.57,
+6.68,6.77,6.96,6.84,6.96,7.00,7.10,7.28,7.26,7.34,
+7.61,7.52,7.43,7.60,7.73,7.78,8.05,7.92,8.13,8.27,
+8.30,8.33,8.45,8.48,8.71,8.70,8.77,8.83,8.97,8.97,
+9.00,9.10,9.30,9.15,9.33,9.46,9.61,9.69,9.88,9.71,
+9.98,9.82,10.06,10.16,10.33,10.37,10.39,10.61,10.61,10.71,
+10.74,10.86,10.93,10.89,11.01,11.24,11.22,11.36,11.42,11.52,
+11.43,11.58,11.76,11.85,11.97,11.79,12.05,12.13,12.45,12.40,
+12.20,12.46,12.56,12.77,12.71,12.72,12.90,12.90,12.97,13.06,
+13.20,13.13,13.27,13.41,13.60,13.49,13.61,13.69,14.08,13.80,
+14.20,14.09,14.32,14.32,14.29,14.28,14.50,14.50,14.59,14.80,
+15.03,15.02,14.95,14.95,15.26,15.39,15.36,15.57,15.37,15.49,
+15.46,15.70,15.74,15.65,15.94,15.91,16.08,16.37,16.22,16.45,
+16.50,16.69,16.59,16.65,16.74,16.86,16.96,17.28,17.39,17.30,
+17.41,17.38,17.45,17.54,17.61,17.67,17.86,18.01,17.96,18.10,
+18.04,18.17,18.38,18.57,18.50,18.46,18.74,18.70,18.68,18.75,
+18.79,19.01,19.03,19.16,19.36,19.42,19.39,19.61,19.57,19.56,
+19.77,19.82,19.89,20.02,20.29,20.30,20.19,20.42,20.57,20.47,
+20.75,20.52,20.77,20.88,21.00,21.06,21.09,21.30,21.14,21.38,
+21.31,21.56,21.49,21.65,21.80,21.94,21.80,21.98,22.33,22.25,
+22.14,22.31,22.32,22.45,22.71,22.75,22.85,22.62,22.88,22.73,
+23.12,23.10,23.33,23.15,23.70,23.62,23.52,23.41,23.83,23.72,
+23.93,23.99,23.84,24.24,24.08,24.16,24.11,24.38,24.46,24.75,
+0.84,0.83,0.93,1.02,1.13,1.13,1.23,1.25,1.42,1.48,
+1.50,1.62,1.70,1.76,1.86,1.85,1.99,1.97,2.09,2.15,
+2.23,2.26,2.44,2.53,2.64,2.63,2.73,2.66,2.83,2.89,
+3.01,3.09,3.16,3.17,3.25,3.34,3.36,3.53,3.51,3.69,
+3.71,3.74,3.92,3.99,4.01,4.04,4.16,4.20,4.28,4.38,
+4.47,4.53,4.55,4.62,4.71,4.73,4.83,4.99,5.02,5.06,
+5.23,5.26,5.29,5.48,5.51,5.53,5.73,5.78,5.70,5.76,
+5.88,5.92,5.96,6.10,6.21,6.23,6.36,6.48,6.60,6.69,
+6.61,6.59,6.82,6.84,6.90,6.85,7.09,7.10,7.17,7.29,
+7.35,7.47,7.35,7.66,7.68,7.56,7.81,7.88,7.97,7.97,
+8.01,8.12,8.38,8.33,8.38,8.42,8.49,8.57,8.66,8.92,
+8.87,8.94,9.03,9.04,9.10,9.09,9.26,9.28,9.34,9.58,
+9.45,9.56,9.90,9.88,9.89,9.95,9.83,10.08,9.94,10.23,
+10.35,10.35,10.38,10.47,10.66,10.60,10.61,10.92,10.80,10.86,
+10.89,11.05,11.18,11.35,11.18,11.34,11.39,11.54,11.69,11.80,
+11.60,11.60,11.97,12.06,12.02,12.09,12.04,12.19,12.29,12.34,
+12.44,12.51,12.59,12.54,12.61,12.88,12.84,13.01,13.01,13.24,
+13.05,13.36,13.34,13.40,13.46,13.65,13.66,13.74,13.79,13.74,
+13.95,14.05,14.03,14.16,14.34,14.34,14.48,14.37,14.59,14.59,
+14.55,14.73,14.88,14.77,14.99,15.14,14.94,14.99,15.33,15.31,
+15.36,15.37,15.67,15.57,15.60,15.67,15.74,16.15,15.96,16.13,
+16.26,16.26,16.24,16.10,16.42,16.44,16.52,16.73,16.65,16.83,
+16.98,16.89,16.74,16.85,17.37,17.19,17.32,17.27,17.36,17.36,
+17.57,17.59,17.56,17.80,17.95,17.94,18.09,18.07,18.18,18.14,
+18.39,18.33,18.35,18.65,18.77,18.70,18.94,18.94,18.82,19.08,
+19.11,19.15,19.15,19.06,19.24,19.39,19.34,19.56,19.89,20.02,
+19.88,19.82,20.12,20.07,20.11,20.13,20.29,20.31,20.43,20.70,
+20.50,20.50,20.59,20.85,20.96,20.82,21.03,21.02,21.16,21.00,
+21.27,21.66,21.35,21.50,21.42,21.66,21.71,21.65,21.79,21.85,
+4.12,4.46,4.97,5.23,5.62,6.08,6.33,6.72,7.09,7.54,
+7.91,8.28,8.64,9.00,9.48,9.78,10.15,10.52,10.88,11.27,
+11.70,12.01,12.57,12.78,13.14,13.60,13.98,14.32,14.62,15.08,
+15.45,15.87,16.13,16.72,17.00,17.36,17.68,18.02,18.46,18.98,
+19.27,19.61,20.01,20.37,20.82,21.16,21.52,21.95,22.23,22.85,
+23.10,23.39,23.82,23.98,24.43,24.92,25.09,25.57,26.10,26.30,
+26.88,27.12,27.46,27.99,28.28,28.64,28.93,29.41,29.70,30.10,
+30.68,30.89,31.57,31.65,32.19,32.48,32.80,33.23,33.77,33.99,
+34.21,34.74,35.17,35.36,35.95,36.27,36.80,36.89,37.23,37.70,
+38.28,38.44,38.94,39.26,39.60,39.95,40.37,40.69,41.16,41.38,
+41.93,42.11,42.67,42.90,43.37,43.74,44.11,44.50,44.98,45.21,
+45.69,45.99,46.47,46.76,47.25,47.56,47.89,48.26,48.72,49.00,
+49.43,49.69,50.31,50.63,50.91,51.40,51.85,52.31,52.49,52.88,
+53.30,53.78,54.02,54.22,54.55,54.99,55.56,55.80,56.27,56.93,
+56.88,57.29,57.80,58.17,58.62,58.91,59.32,59.65,60.13,60.23,
+60.81,60.98,61.33,61.79,62.29,62.77,63.10,63.42,63.76,64.09,
+64.62,65.01,65.32,65.67,65.98,66.47,66.74,67.11,67.51,68.07,
+68.28,68.64,68.98,69.47,69.79,70.01,70.69,70.72,71.37,71.49,
+72.15,72.65,72.84,73.35,73.73,73.84,74.34,74.80,75.11,75.25,
+75.98,76.43,76.62,77.13,77.30,77.87,78.01,78.49,78.88,79.64,
+79.63,79.94,80.64,80.77,80.99,81.60,81.89,82.32,82.54,83.05,
+83.33,83.60,84.24,84.51,84.75,85.32,85.53,86.08,86.69,86.84,
+87.23,87.72,87.84,88.44,88.42,88.85,89.37,89.43,90.20,90.88,
+90.77,91.42,91.68,92.31,92.38,92.95,93.38,93.49,93.89,94.30,
+94.80,95.19,95.25,95.93,96.27,96.25,96.92,97.47,98.02,98.16,
+98.70,98.96,99.25,99.64,100.01,100.33,100.64,101.05,101.36,101.62,
+102.06,102.50,103.13,103.33,103.61,103.89,104.67,105.01,105.53,105.73,
+105.98,106.66,106.61,107.17,107.53,108.23,108.61,108.97,109.22,109.42,
+109.95,110.23,110.39,110.64,111.31,111.72,112.07,112.21,112.89,113.16,
+3.73,4.11,4.39,4.74,5.04,5.37,5.76,6.14,6.46,6.73,
+7.14,7.49,7.76,8.11,8.38,8.77,9.06,9.50,9.76,10.18,
+10.46,10.84,11.10,11.54,11.81,12.20,12.44,12.85,13.11,13.57,
+13.87,14.25,14.48,14.88,15.23,15.71,16.06,16.31,16.55,16.89,
+17.21,17.69,18.05,18.28,18.64,19.11,19.38,19.56,20.03,20.36,
+20.74,20.97,21.43,21.91,22.09,22.37,22.75,23.16,23.30,23.67,
+23.95,24.45,24.76,25.14,25.50,25.94,26.04,26.40,26.74,27.23,
+27.36,27.67,28.12,28.49,28.72,29.13,29.46,29.93,30.24,30.50,
+31.17,31.22,31.43,32.04,32.24,32.67,32.98,33.42,33.62,33.87,
+34.56,34.64,34.92,35.11,35.49,35.77,36.40,36.64,37.01,37.39,
+37.58,38.05,38.44,38.68,39.04,39.42,39.70,40.08,40.44,40.61,
+41.22,41.37,41.74,42.20,42.61,42.71,43.10,43.35,43.91,43.83,
+44.39,44.81,45.02,45.38,45.98,46.25,46.60,47.06,47.23,47.57,
+47.77,48.20,48.54,48.76,49.26,49.77,50.02,50.33,50.72,51.08,
+51.46,51.73,51.73,52.03,52.58,52.93,53.35,53.77,54.11,54.52,
+54.83,54.86,55.40,55.83,56.05,56.49,56.88,57.02,57.51,57.82,
+58.11,58.34,58.82,58.87,59.27,59.74,60.22,60.35,60.83,60.96,
+61.38,61.95,61.91,62.38,62.96,63.29,63.52,63.81,64.31,64.29,
+64.88,65.21,65.60,65.96,66.27,66.79,66.79,67.30,67.55,67.82,
+68.15,68.52,68.74,69.31,69.58,69.91,70.09,70.64,70.55,71.29,
+71.59,72.05,72.58,72.69,72.90,73.52,73.70,74.17,74.36,75.04,
+75.12,75.40,75.84,76.16,76.39,76.66,77.07,77.57,77.90,78.23,
+78.57,78.82,79.18,79.59,80.10,80.09,80.39,81.02,81.36,81.42,
+82.02,82.28,82.40,82.89,83.16,83.66,84.33,83.97,84.53,84.86,
+85.25,85.55,86.14,86.30,86.76,86.88,87.22,87.61,88.14,88.47,
+88.71,89.11,89.42,89.64,89.78,90.37,90.90,91.23,91.08,91.71,
+92.22,92.31,92.61,93.20,93.41,93.71,94.28,94.60,94.86,95.35,
+95.72,95.92,96.32,96.49,97.07,97.07,97.55,98.14,98.05,98.66,
+99.12,99.41,99.35,100.04,100.17,100.39,100.96,101.31,101.48,101.78,
+3.34,3.67,3.94,4.30,4.57,4.83,5.22,5.45,5.79,6.12,
+6.41,6.74,7.00,7.27,7.55,7.94,8.27,8.42,8.81,9.06,
+9.44,9.65,10.07,10.35,10.65,11.02,11.35,11.42,11.90,12.25,
+12.48,12.73,13.08,13.43,13.62,14.04,14.35,14.57,14.82,15.22,
+15.55,16.02,16.23,16.60,16.77,17.24,17.49,17.72,18.12,18.29,
+18.55,18.86,19.17,19.55,20.04,20.07,20.50,20.86,21.08,21.29,
+21.54,21.95,22.22,22.63,22.86,23.27,23.54,23.98,24.01,24.33,
+24.73,25.18,25.38,25.77,25.95,26.31,26.59,26.70,27.25,27.46,
+27.84,28.00,28.46,28.76,29.15,29.21,29.59,30.05,30.06,30.69,
+30.90,31.20,31.51,31.78,32.20,32.44,32.63,33.01,33.31,33.71,
+33.80,34.26,34.59,34.97,35.14,35.34,35.79,36.05,36.19,36.73,
+36.89,37.37,37.55,37.92,38.37,38.37,38.87,39.09,39.56,39.88,
+40.08,40.20,40.62,41.18,41.25,41.51,41.77,42.25,42.67,42.68,
+43.27,43.40,43.84,43.99,44.36,44.41,44.93,45.20,45.63,45.90,
+46.07,46.49,46.58,47.27,47.34,47.59,47.90,48.36,48.48,49.06,
+49.09,49.40,50.06,49.92,50.46,50.91,51.08,51.26,51.73,51.87,
+52.23,52.39,52.87,53.24,53.19,53.82,54.00,54.49,54.53,55.04,
+55.24,55.50,55.77,56.45,56.60,57.01,57.19,57.44,57.84,58.16,
+58.48,58.55,58.96,59.32,59.66,59.88,60.25,60.60,61.04,61.05,
+61.57,61.59,61.88,62.44,62.53,63.16,63.14,63.60,64.09,64.11,
+64.45,64.97,65.01,65.26,65.93,66.13,66.28,66.53,67.06,67.23,
+67.61,67.83,68.07,68.43,68.80,69.36,69.44,69.77,70.19,70.28,
+70.86,70.79,71.22,71.61,71.66,72.32,72.34,72.76,72.92,73.53,
+73.67,73.93,74.24,74.40,74.72,75.28,75.70,75.89,76.08,76.68,
+76.65,76.86,77.11,77.87,77.79,78.58,78.64,79.12,79.41,79.42,
+79.89,80.11,80.26,80.65,80.88,81.15,81.50,81.96,82.21,82.35,
+83.04,82.96,83.12,83.83,83.98,84.24,84.81,84.86,84.88,85.35,
+85.95,86.41,86.45,86.73,87.13,87.41,87.84,87.87,88.31,88.62,
+89.00,89.30,89.56,90.05,90.29,90.42,90.88,90.94,91.82,91.88,
+3.04,3.24,3.55,3.84,4.04,4.37,4.67,4.92,5.21,5.50,
+5.75,6.02,6.34,6.61,6.83,7.09,7.44,7.66,8.04,8.26,
+8.44,8.69,9.03,9.26,9.59,9.85,10.16,10.38,10.68,10.88,
+11.18,11.64,11.77,12.10,12.37,12.76,12.91,13.11,13.40,13.72,
+13.97,14.36,14.51,14.86,15.15,15.33,15.81,16.01,16.26,16.41,
+16.81,17.04,17.28,17.58,17.78,18.20,18.41,18.71,18.98,19.23,
+19.64,19.83,20.09,20.30,20.72,20.92,21.08,21.29,21.71,21.62,
+22.14,22.50,22.92,23.21,23.32,23.74,24.03,24.09,24.50,24.80,
+25.00,25.32,25.61,25.92,26.23,26.28,26.63,27.02,27.22,27.57,
+27.80,28.14,28.08,28.49,28.77,29.20,29.37,29.82,30.04,30.25,
+30.73,30.88,31.09,31.43,31.48,32.02,32.23,32.39,32.66,32.82,
+33.36,33.43,33.91,34.02,34.45,34.61,34.83,35.18,35.42,35.78,
+36.05,36.42,36.68,36.91,37.23,37.48,37.76,37.87,38.23,38.50,
+38.92,38.99,39.36,39.55,39.76,40.14,40.37,40.69,40.87,41.22,
+41.63,41.73,42.12,42.19,42.77,43.02,43.33,43.60,43.98,43.92,
+44.10,44.56,44.86,45.38,45.44,45.96,46.13,46.33,46.58,46.78,
+47.05,47.30,47.51,47.91,47.83,48.33,48.75,48.90,49.31,49.48,
+49.66,49.84,50.27,50.77,50.93,51.15,51.28,51.70,52.16,52.30,
+52.51,52.78,53.01,53.10,53.63,54.06,54.45,54.81,54.76,55.16,
+55.27,55.40,55.86,56.19,56.41,56.68,57.04,57.40,57.25,57.70,
+58.08,58.43,58.45,58.98,59.15,59.47,59.69,59.91,60.25,60.52,
+60.71,61.09,61.41,61.66,62.06,62.21,62.67,62.98,62.99,63.67,
+63.47,63.95,64.18,64.44,64.56,65.11,65.32,65.46,65.78,65.98,
+66.47,66.60,66.82,67.37,67.41,67.58,67.92,68.21,68.33,69.09,
+69.13,69.47,69.57,69.67,70.11,70.31,70.77,71.21,71.35,71.50,
+71.86,72.16,72.29,72.81,73.02,73.34,73.44,73.68,73.89,74.64,
+74.65,74.72,75.14,75.24,75.72,75.76,76.27,76.80,76.77,76.96,
+77.40,77.65,77.89,77.98,78.66,78.91,78.92,79.15,79.34,79.80,
+80.11,80.32,80.66,80.82,81.26,81.79,81.46,82.42,82.25,82.69,
+2.76,2.98,3.18,3.43,3.72,3.96,4.21,4.33,4.67,4.90,
+5.15,5.44,5.62,5.95,6.21,6.30,6.66,6.94,7.12,7.37,
+7.60,7.91,8.10,8.46,8.58,8.89,9.17,9.42,9.53,9.83,
+10.11,10.28,10.48,10.92,11.07,11.45,11.63,11.87,12.08,12.34,
+12.62,12.92,13.01,13.28,13.53,13.89,14.03,14.30,14.67,14.74,
+15.08,15.48,15.52,15.69,15.95,16.48,16.68,16.78,17.13,17.19,
+17.61,17.80,17.99,18.27,18.51,18.77,18.94,19.33,19.52,19.89,
+20.01,20.16,20.39,20.70,21.04,21.27,21.64,21.68,22.14,22.32,
+22.60,22.76,23.12,23.15,23.43,23.66,24.04,24.25,24.38,24.67,
+24.89,25.29,25.45,25.84,25.99,26.34,26.50,26.78,26.90,27.12,
+27.41,27.72,28.12,28.15,28.37,28.56,28.97,29.22,29.42,29.62,
+29.93,30.05,30.33,30.62,31.07,31.21,31.36,31.71,31.86,32.12,
+32.39,32.76,33.03,33.31,33.51,33.59,33.95,34.18,34.44,34.93,
+35.02,35.10,35.29,35.65,35.88,36.33,36.20,36.71,36.95,37.40,
+37.37,37.40,37.81,38.23,38.27,38.58,38.77,38.99,39.51,39.71,
+39.86,40.13,40.31,40.47,40.73,41.13,41.40,41.41,42.00,42.12,
+42.37,42.47,42.87,43.09,43.42,43.56,44.00,44.10,44.38,44.48,
+44.69,45.21,45.30,45.40,45.89,46.13,46.23,46.62,46.76,47.09,
+47.17,47.51,47.71,47.76,48.24,48.52,48.86,49.13,49.38,49.59,
+49.74,49.93,50.19,50.58,50.66,51.18,51.54,51.25,51.81,51.90,
+52.25,52.52,52.82,53.09,53.33,53.36,53.64,54.05,54.31,54.47,
+54.91,55.15,55.17,55.60,55.92,55.99,56.17,56.55,56.76,57.16,
+57.07,57.29,57.81,58.06,58.06,58.23,58.65,58.69,58.78,59.45,
+59.70,60.07,60.29,60.24,60.61,60.98,61.27,61.42,61.61,61.92,
+62.16,62.58,62.65,62.98,63.04,63.25,63.59,63.75,63.94,64.34,
+64.67,64.91,65.31,65.38,65.76,65.78,66.06,66.56,66.65,66.90,
+67.03,67.50,67.80,68.05,68.20,68.32,68.54,69.06,69.36,69.24,
+69.55,69.67,70.11,70.31,70.57,71.06,70.92,71.51,71.42,71.67,
+72.30,72.28,72.30,72.71,72.92,73.23,73.70,73.63,74.01,74.17,
+2.44,2.66,2.86,3.11,3.34,3.56,3.72,3.98,4.28,4.41,
+4.66,4.93,5.08,5.32,5.58,5.79,5.97,6.32,6.47,6.69,
+6.88,7.17,7.28,7.53,7.73,7.99,8.24,8.51,8.74,8.93,
+9.05,9.38,9.57,9.76,10.04,10.20,10.42,10.69,10.87,11.13,
+11.39,11.58,11.86,11.98,12.26,12.51,12.71,12.91,13.18,13.43,
+13.66,13.88,13.99,14.14,14.49,14.78,15.01,15.16,15.35,15.68,
+15.78,16.11,16.22,16.40,16.88,16.93,17.05,17.21,17.50,17.83,
+18.07,18.21,18.50,18.75,18.80,19.09,19.31,19.59,19.84,20.00,
+20.20,20.47,20.59,21.16,21.14,21.29,21.62,21.83,22.04,22.41,
+22.63,22.59,22.94,23.20,23.30,23.60,23.87,24.09,24.38,24.50,
+24.57,24.95,25.21,25.42,25.64,25.89,26.16,26.40,26.61,26.77,
+26.91,27.19,27.37,27.54,27.85,28.20,28.45,28.40,28.65,28.93,
+29.23,29.47,29.68,29.96,30.23,30.22,30.70,30.67,30.90,31.04,
+31.36,31.53,32.04,32.05,32.27,32.63,32.71,32.96,33.12,33.45,
+33.68,33.99,34.03,34.22,34.30,34.75,34.91,34.91,35.46,35.71,
+35.95,36.03,36.50,36.56,36.81,37.00,37.16,37.51,37.70,37.86,
+38.11,38.09,38.71,38.61,39.19,39.15,39.45,39.64,39.82,40.38,
+40.48,40.42,40.68,40.89,41.09,41.28,41.79,41.78,42.18,42.35,
+42.64,42.90,42.84,43.40,43.78,43.85,43.84,44.22,44.44,44.34,
+44.69,44.91,45.12,45.42,45.44,45.89,46.38,46.28,46.51,46.74,
+47.18,47.17,47.39,47.55,47.90,48.06,48.41,48.48,48.66,49.04,
+49.33,49.35,49.70,50.19,50.12,50.17,50.53,50.84,51.09,51.25,
+51.53,51.68,51.90,52.22,52.29,52.61,52.91,53.16,53.15,53.42,
+53.84,54.03,54.18,54.32,54.49,54.77,54.79,55.20,55.50,55.90,
+55.77,56.06,56.35,56.83,56.60,56.99,57.38,57.52,57.53,57.97,
+58.21,58.54,58.72,58.62,59.15,58.99,59.63,59.92,59.98,60.29,
+60.40,60.66,60.71,61.07,61.35,61.33,61.83,62.04,62.19,62.26,
+62.49,62.62,63.12,63.37,63.61,63.78,64.19,64.00,64.50,64.28,
+64.89,65.25,65.37,65.31,65.59,65.91,66.10,66.42,66.54,66.51,
+2.16,2.39,2.64,2.74,3.01,3.23,3.45,3.55,3.83,3.98,
+4.13,4.30,4.62,4.83,4.97,5.23,5.34,5.62,5.76,6.06,
+6.17,6.42,6.63,6.88,7.02,7.26,7.39,7.63,7.79,8.01,
+8.16,8.37,8.58,8.82,9.02,9.29,9.37,9.61,9.81,9.95,
+10.29,10.55,10.67,10.84,10.92,11.22,11.40,11.68,11.79,11.93,
+12.30,12.40,12.68,12.80,13.07,13.16,13.48,13.67,13.87,14.11,
+14.21,14.44,14.68,14.79,15.06,15.24,15.46,15.69,15.88,16.06,
+16.35,16.43,16.64,16.75,16.99,17.29,17.43,17.69,17.67,18.03,
+18.32,18.43,18.60,18.93,18.92,19.38,19.66,19.79,19.79,20.11,
+20.15,20.51,20.61,20.84,21.18,21.22,21.44,21.55,21.84,21.92,
+22.15,22.39,22.70,22.96,23.09,23.26,23.46,23.64,24.04,24.10,
+23.98,24.38,24.80,24.90,25.13,25.25,25.48,25.66,25.70,26.09,
+26.34,26.42,26.60,26.77,27.02,27.32,27.38,27.71,27.85,28.04,
+28.18,28.64,28.64,28.89,29.03,29.18,29.51,29.79,29.84,30.14,
+30.27,30.50,30.60,30.83,31.24,31.19,31.41,31.57,31.93,32.19,
+32.26,32.62,32.65,33.02,32.88,33.23,33.64,33.82,33.89,34.09,
+34.36,34.73,34.79,34.92,35.07,35.25,35.55,35.73,35.77,36.13,
+36.32,36.67,36.58,36.85,37.24,37.30,37.41,37.71,38.00,38.12,
+38.45,38.49,38.80,39.17,39.08,39.46,39.39,39.66,40.00,40.00,
+40.27,40.51,40.76,41.17,41.20,41.45,41.66,41.84,41.81,42.06,
+42.29,42.42,42.82,43.08,43.04,43.37,43.44,43.90,44.13,43.84,
+44.44,44.54,44.71,44.97,45.35,45.32,45.27,45.58,46.23,46.09,
+46.12,46.59,46.59,47.00,47.16,47.49,47.46,47.75,47.79,47.98,
+48.30,48.58,48.77,49.11,49.12,49.24,49.59,49.83,49.97,50.38,
+50.27,50.59,50.82,50.83,51.17,51.08,51.46,51.75,52.05,52.37,
+52.53,52.63,52.68,52.94,53.22,53.44,53.65,53.55,53.93,54.10,
+54.38,54.57,54.58,55.04,55.17,55.28,55.61,55.50,56.22,56.28,
+56.31,56.74,56.56,56.88,56.97,57.06,57.57,57.66,58.18,58.18,
+58.41,58.33,58.87,59.24,59.09,59.59,59.33,59.46,59.94,59.79,
+2.02,2.19,2.32,2.51,2.69,2.92,3.06,3.20,3.36,3.63,
+3.82,3.90,4.18,4.28,4.55,4.72,4.85,5.02,5.33,5.44,
+5.58,5.73,5.94,6.20,6.33,6.43,6.63,6.81,7.00,7.30,
+7.36,7.62,7.76,7.83,8.10,8.33,8.48,8.69,8.85,8.97,
+9.13,9.42,9.59,9.71,9.98,10.18,10.21,10.50,10.68,10.83,
+10.97,11.15,11.32,11.69,11.66,11.90,12.07,12.29,12.58,12.72,
+12.85,13.04,13.16,13.26,13.69,13.71,13.87,14.21,14.38,14.44,
+14.57,14.70,14.94,14.98,15.44,15.52,15.73,15.91,16.16,16.33,
+16.31,16.64,16.79,16.98,17.08,17.30,17.54,17.61,17.87,18.00,
+18.14,18.24,18.71,18.80,18.87,19.10,19.28,19.36,19.77,19.83,
+19.98,20.25,20.36,20.67,20.66,21.01,21.15,21.32,21.32,21.66,
+21.87,22.04,22.26,22.37,22.50,22.69,22.98,23.27,23.30,23.57,
+23.63,23.72,24.02,24.16,24.43,24.74,24.85,25.15,25.02,25.34,
+25.39,25.64,25.77,26.05,26.32,26.62,26.66,26.74,26.65,27.00,
+27.27,27.64,27.74,27.86,28.00,28.02,28.35,28.50,28.63,28.92,
+29.10,29.39,29.52,29.46,29.85,30.01,30.15,30.23,30.48,30.61,
+30.99,30.98,31.22,31.29,31.63,31.72,31.89,31.90,32.20,32.55,
+32.61,32.94,33.30,33.07,33.46,33.48,33.74,34.09,34.07,34.33,
+34.59,34.67,35.05,35.27,35.18,35.49,35.31,35.63,36.15,35.94,
+36.38,36.42,36.65,36.90,36.97,37.15,37.35,37.58,37.59,37.70,
+38.01,37.99,38.47,38.65,39.01,39.07,39.03,39.54,39.42,39.77,
+39.81,39.98,40.10,40.38,40.52,40.90,40.99,41.10,41.09,41.65,
+41.54,41.95,42.25,42.26,42.50,42.62,42.60,43.03,43.21,43.41,
+43.85,43.70,43.98,44.27,44.26,44.50,44.66,44.95,45.04,45.34,
+45.44,45.69,45.76,45.71,45.83,46.13,46.39,46.27,46.78,46.94,
+47.18,47.21,47.64,47.90,47.73,48.19,48.18,48.45,48.19,48.66,
+49.12,49.10,49.24,49.32,49.59,49.77,50.04,50.34,50.32,50.67,
+50.93,51.01,51.32,51.27,51.42,51.59,52.09,51.97,52.26,52.45,
+52.62,52.54,52.90,53.00,53.24,53.62,53.20,53.71,54.05,54.09,
+1.81,1.88,2.03,2.24,2.41,2.59,2.77,2.90,3.04,3.22,
+3.38,3.58,3.64,3.92,4.06,4.16,4.49,4.53,4.71,4.85,
+4.92,5.14,5.38,5.60,5.62,5.83,5.93,6.13,6.38,6.49,
+6.64,6.72,7.00,6.99,7.38,7.43,7.71,7.90,7.97,8.04,
+8.35,8.44,8.61,8.69,8.87,9.16,9.20,9.38,9.55,9.82,
+10.10,10.03,10.15,10.44,10.50,10.74,10.93,11.10,11.25,11.24,
+11.46,11.74,11.88,12.01,12.15,12.25,12.58,12.78,12.77,12.98,
+13.12,13.38,13.39,13.60,13.77,13.98,14.10,14.28,14.40,14.64,
+14.93,14.93,14.97,15.20,15.45,15.50,15.74,15.83,16.07,16.30,
+16.33,16.70,16.70,16.81,16.93,17.38,17.40,17.37,17.63,17.84,
+17.93,18.24,18.38,18.52,18.73,18.80,18.91,18.94,19.50,19.53,
+19.58,19.81,19.98,20.20,20.32,20.34,20.57,20.82,21.16,21.13,
+21.24,21.43,21.76,21.73,21.90,22.10,22.30,22.27,22.62,22.68,
+22.85,23.09,23.19,23.44,23.62,23.82,23.82,23.84,24.12,24.27,
+24.56,24.64,24.81,24.83,24.96,25.33,25.37,25.75,25.77,26.09,
+26.22,26.37,26.48,26.53,26.87,27.12,27.17,27.34,27.51,27.66,
+27.68,28.20,28.06,28.18,28.26,28.59,28.90,28.81,29.08,29.16,
+29.41,29.48,29.66,29.93,30.12,30.25,30.45,30.63,30.60,31.12,
+31.02,31.07,31.19,31.23,31.89,31.99,32.08,32.36,32.26,32.61,
+32.85,32.80,33.04,32.99,33.10,33.48,33.56,33.86,33.84,34.20,
+34.31,34.51,34.72,34.97,35.10,34.92,35.22,35.45,35.73,35.35,
+36.01,35.98,36.30,36.48,36.50,36.51,36.71,37.11,37.28,37.26,
+37.41,37.59,37.85,37.72,38.16,38.28,38.77,38.96,38.86,39.21,
+39.30,39.51,39.33,39.89,39.92,39.85,39.93,40.28,40.33,40.58,
+40.68,41.07,40.97,41.18,41.54,41.52,41.79,42.04,42.11,42.48,
+42.30,42.85,42.78,42.91,43.04,43.21,43.37,43.54,43.33,43.82,
+43.93,44.00,44.45,44.36,44.85,44.92,44.93,45.09,45.21,45.53,
+45.52,45.87,45.97,45.83,46.65,46.47,46.64,46.87,47.01,47.18,
+47.36,47.34,47.78,47.83,47.80,48.01,48.16,48.17,48.63,48.88,
+1.62,1.75,1.88,2.06,2.17,2.37,2.45,2.65,2.76,2.91,
+3.02,3.16,3.35,3.52,3.61,3.80,3.90,4.10,4.25,4.33,
+4.55,4.61,4.78,4.94,5.05,5.19,5.33,5.61,5.63,5.88,
+5.95,6.06,6.21,6.40,6.60,6.71,6.86,6.90,7.11,7.27,
+7.54,7.53,7.70,7.84,8.13,8.25,8.47,8.40,8.68,8.77,
+9.00,9.11,9.25,9.39,9.59,9.67,9.83,9.89,10.02,10.24,
+10.36,10.52,10.73,10.79,10.92,11.10,11.25,11.36,11.61,11.74,
+11.90,11.99,12.19,12.27,12.33,12.51,12.67,12.91,13.03,13.13,
+13.17,13.49,13.62,13.65,13.81,14.06,14.14,14.21,14.43,14.42,
+14.71,14.92,14.94,15.19,15.50,15.49,15.62,15.70,16.06,16.04,
+16.35,16.35,16.49,16.69,16.86,16.91,17.14,17.24,17.41,17.48,
+17.51,17.93,18.10,18.18,18.38,18.47,18.58,18.86,19.00,19.06,
+19.08,19.34,19.40,19.50,19.73,19.90,19.91,20.26,20.34,20.38,
+20.50,20.80,20.75,21.00,21.16,21.38,21.57,21.55,21.91,21.82,
+22.10,22.19,22.38,22.55,22.63,22.64,22.87,23.25,23.28,23.25,
+23.72,23.83,23.83,23.94,24.11,24.17,24.44,24.63,24.80,24.80,
+24.91,25.18,25.40,25.36,25.61,26.04,26.00,25.87,26.11,26.21,
+26.45,26.64,26.72,26.81,26.93,27.09,27.24,27.30,27.42,27.82,
+27.93,28.07,28.29,28.62,28.57,28.70,28.86,28.90,29.15,29.18,
+29.47,29.51,29.59,29.67,29.96,30.16,30.21,30.41,30.34,30.71,
+31.09,31.16,31.11,31.28,31.34,31.32,31.52,31.87,31.94,32.03,
+32.27,32.49,32.69,32.62,32.99,33.07,33.00,33.24,33.40,33.69,
+33.98,33.99,33.88,34.08,34.55,34.30,34.72,35.02,34.97,35.30,
+35.31,35.25,35.32,35.88,35.83,35.75,36.11,36.31,36.43,36.64,
+36.75,36.69,37.14,37.07,37.35,37.43,37.61,37.53,38.05,37.67,
+38.07,38.33,38.60,38.81,38.77,38.94,39.09,39.31,39.30,39.56,
+39.56,39.84,39.78,40.09,40.20,40.38,40.38,40.72,41.05,40.86,
+41.21,41.40,41.50,41.35,41.70,41.63,41.93,42.30,42.39,42.41,
+42.57,43.01,42.92,42.95,43.38,43.14,43.45,43.71,43.68,44.10,
+1.43,1.51,1.66,1.85,1.98,2.14,2.19,2.31,2.47,2.63,
+2.76,2.96,3.04,3.18,3.22,3.31,3.62,3.70,3.80,3.98,
+4.06,4.24,4.32,4.44,4.55,4.77,4.92,5.01,5.19,5.20,
+5.41,5.42,5.64,5.75,5.94,6.06,6.14,6.38,6.45,6.59,
+6.70,6.87,6.86,7.16,7.26,7.32,7.53,7.59,7.76,7.88,
+8.05,8.18,8.27,8.34,8.54,8.68,8.84,8.94,8.98,9.17,
+9.35,9.46,9.59,9.77,9.88,9.95,10.17,10.21,10.46,10.58,
+10.51,10.76,10.97,10.89,11.04,11.39,11.48,11.39,11.66,11.89,
+12.02,12.13,12.20,12.40,12.44,12.78,12.93,12.83,12.93,13.24,
+13.31,13.37,13.52,13.77,13.89,13.97,14.04,14.19,14.43,14.52,
+14.56,14.69,14.92,14.96,15.11,15.29,15.47,15.38,15.70,15.83,
+15.89,16.06,16.08,16.16,16.44,16.68,16.74,16.66,16.95,17.15,
+17.20,17.34,17.64,17.64,17.77,17.88,17.96,18.28,18.40,18.39,
+18.75,18.79,18.80,18.84,19.20,19.30,19.60,19.45,19.77,19.69,
+19.77,20.09,20.31,20.39,20.45,20.41,20.68,20.89,20.99,21.17,
+21.09,21.23,21.38,21.40,21.46,21.87,21.97,22.27,22.20,22.50,
+22.33,22.55,22.70,22.79,23.05,23.09,23.22,23.45,23.71,23.75,
+23.91,24.05,23.94,24.25,24.32,24.66,24.72,24.75,24.95,24.94,
+25.18,25.16,25.59,25.49,25.66,25.90,25.93,26.09,26.22,26.36,
+26.31,26.47,26.64,26.96,26.94,27.06,27.33,27.32,27.38,27.78,
+27.76,27.58,27.95,28.38,28.37,28.37,28.31,28.54,28.92,28.91,
+29.07,29.10,29.16,29.38,29.76,29.72,29.91,29.95,30.05,30.33,
+30.38,30.52,30.40,30.57,30.67,31.02,31.24,30.99,31.46,31.50,
+31.85,31.64,32.01,32.01,32.34,32.38,32.62,32.71,32.62,33.13,
+33.37,32.95,33.33,33.22,33.68,33.87,33.81,33.93,34.09,34.22,
+34.32,34.76,34.65,34.75,34.97,35.01,35.22,35.32,35.68,35.61,
+35.61,35.73,35.94,36.14,36.23,36.30,36.49,36.46,37.20,36.82,
+36.97,36.84,37.34,37.37,37.54,37.85,37.78,37.92,38.00,38.25,
+38.31,38.29,38.59,38.37,38.84,38.85,38.99,39.22,39.45,39.83,
+1.29,1.40,1.55,1.66,1.78,1.95,2.04,2.15,2.30,2.37,
+2.45,2.64,2.71,2.85,2.95,3.07,3.31,3.32,3.45,3.56,
+3.61,3.81,3.92,4.04,4.20,4.28,4.44,4.52,4.62,4.74,
+4.85,4.99,4.99,5.22,5.31,5.41,5.61,5.67,5.79,6.09,
+5.92,6.12,6.28,6.45,6.56,6.62,6.71,6.78,6.96,7.06,
+7.31,7.41,7.51,7.59,7.77,7.88,7.84,7.96,8.18,8.28,
+8.53,8.52,8.54,8.82,9.00,9.03,8.98,9.30,9.26,9.43,
+9.54,9.63,9.78,9.85,10.10,10.16,10.27,10.39,10.55,10.59,
+10.75,10.79,11.00,11.11,11.26,11.43,11.45,11.54,11.79,11.79,
+11.89,12.00,12.28,12.43,12.42,12.55,12.74,12.74,12.85,12.93,
+13.10,13.43,13.30,13.45,13.46,13.72,13.85,13.99,14.23,14.22,
+14.33,14.49,14.53,14.76,14.73,14.90,15.00,15.08,15.24,15.35,
+15.44,15.56,15.79,15.92,15.96,16.10,16.14,16.35,16.21,16.46,
+16.63,16.80,16.93,17.10,17.33,17.29,17.34,17.46,17.70,17.89,
+17.92,17.87,18.31,18.16,18.41,18.50,18.68,18.67,18.71,18.97,
+19.11,19.21,19.45,19.58,19.50,19.55,19.59,19.75,20.12,20.29,
+20.02,20.24,20.45,20.74,20.54,20.82,20.86,21.01,21.21,21.13,
+21.34,21.64,21.69,21.79,21.86,22.12,22.05,22.08,22.30,22.57,
+22.66,22.74,22.94,22.90,23.16,23.01,23.43,23.41,23.60,23.47,
+23.77,23.96,24.04,24.33,24.38,24.34,24.39,24.55,24.71,24.74,
+25.14,25.30,25.25,25.23,25.33,25.44,25.60,25.99,26.03,25.93,
+26.24,26.37,26.46,26.57,26.62,26.75,26.97,26.97,27.26,27.34,
+27.71,27.62,27.59,27.99,27.85,28.07,28.00,28.03,28.16,28.44,
+28.44,28.62,28.70,28.89,29.09,29.20,29.38,29.42,29.41,29.62,
+30.05,29.92,30.03,30.19,30.14,30.18,30.54,30.51,30.66,30.71,
+31.03,30.99,31.08,31.38,31.37,31.56,31.70,31.82,31.82,31.87,
+32.11,32.29,32.16,32.54,32.47,32.47,32.81,32.91,33.23,33.19,
+33.49,33.57,33.60,33.56,33.64,34.00,34.09,34.36,34.10,34.55,
+34.67,34.55,34.67,34.94,34.96,34.95,35.37,35.52,35.17,35.40,
+1.19,1.29,1.42,1.49,1.59,1.72,1.76,1.89,2.01,2.08,
+2.25,2.36,2.41,2.55,2.68,2.80,2.88,2.98,3.12,3.14,
+3.35,3.45,3.60,3.62,3.79,3.83,3.88,4.09,4.11,4.20,
+4.31,4.47,4.55,4.58,4.82,4.99,4.95,5.02,5.26,5.30,
+5.48,5.51,5.75,5.84,5.88,5.93,5.99,6.13,6.27,6.39,
+6.47,6.58,6.64,6.81,6.92,6.99,7.17,7.25,7.41,7.47,
+7.53,7.69,7.84,7.91,7.95,8.13,8.15,8.31,8.44,8.50,
+8.73,8.70,8.88,8.82,9.09,9.26,9.29,9.45,9.42,9.62,
+9.73,9.69,9.94,9.97,10.15,10.08,10.24,10.46,10.61,10.63,
+10.79,10.87,10.88,11.02,11.16,11.14,11.41,11.57,11.60,11.84,
+11.90,11.93,12.03,12.04,12.07,12.15,12.36,12.65,12.67,12.79,
+12.87,12.96,13.10,13.29,13.38,13.38,13.54,13.63,13.73,14.08,
+13.95,14.04,14.19,14.32,14.28,14.53,14.53,14.72,14.97,14.96,
+15.00,15.07,15.21,15.36,15.57,15.48,15.63,15.82,15.93,15.92,
+16.02,16.25,16.44,16.43,16.55,16.66,16.64,16.85,16.85,17.10,
+17.18,17.36,17.38,17.23,17.53,17.68,17.70,17.98,18.06,18.05,
+18.18,18.28,18.30,18.56,18.74,18.67,18.95,19.02,19.07,19.14,
+19.25,19.31,19.56,19.45,19.77,19.66,20.00,20.16,20.04,20.32,
+20.34,20.53,20.66,20.66,20.65,20.83,20.87,21.14,21.24,21.32,
+21.50,21.60,21.71,21.77,21.92,21.88,21.98,22.34,22.22,22.47,
+22.46,22.48,22.49,22.77,22.81,23.13,23.18,23.30,23.56,23.38,
+23.62,23.81,23.63,23.68,23.99,24.17,24.15,24.17,24.51,24.45,
+24.71,24.73,24.80,24.76,25.03,25.06,25.31,25.09,25.55,25.57,
+25.67,25.77,25.92,26.21,26.23,26.19,26.27,26.39,26.62,26.71,
+26.65,26.89,26.99,27.07,27.07,27.30,27.50,27.50,27.57,27.65,
+27.98,28.05,27.99,28.12,28.36,28.25,28.49,28.38,28.65,29.02,
+28.70,28.90,29.06,29.03,29.22,29.56,29.56,29.66,29.65,29.63,
+30.13,30.00,30.16,30.32,30.58,30.89,30.65,30.71,30.66,30.95,
+31.12,31.05,31.41,31.23,31.25,31.67,31.59,31.90,31.65,32.02,
+1.02,1.15,1.29,1.37,1.46,1.52,1.59,1.72,1.77,1.95,
+1.99,2.11,2.23,2.31,2.41,2.47,2.57,2.70,2.77,2.85,
+2.91,3.14,3.14,3.27,3.36,3.42,3.56,3.58,3.70,3.82,
+3.90,4.01,4.07,4.13,4.38,4.45,4.46,4.64,4.68,4.82,
+4.87,5.04,5.10,5.12,5.35,5.39,5.60,5.56,5.65,5.79,
+5.86,5.96,5.99,6.19,6.28,6.27,6.33,6.60,6.56,6.70,
+6.87,6.96,7.08,7.07,7.12,7.31,7.35,7.54,7.52,7.66,
+7.71,7.93,7.93,7.90,8.04,8.21,8.30,8.56,8.46,8.55,
+8.79,8.90,8.83,8.99,9.12,9.22,9.34,9.36,9.48,9.54,
+9.70,9.73,9.86,9.91,10.19,10.22,10.26,10.33,10.41,10.54,
+10.64,10.73,10.79,11.01,11.00,11.08,11.27,11.24,11.40,11.71,
+11.58,11.61,11.78,12.07,11.99,12.14,12.33,12.30,12.36,12.37,
+12.64,12.67,12.77,12.88,13.00,13.05,13.04,13.10,13.34,13.48,
+13.50,13.53,13.64,13.71,13.93,13.94,14.05,14.27,14.19,14.41,
+14.60,14.63,14.75,14.70,14.99,14.79,14.95,15.12,15.10,15.46,
+15.52,15.45,15.56,15.75,15.93,16.12,16.10,16.02,16.24,16.38,
+16.34,16.49,16.71,16.62,16.81,16.91,16.95,16.93,17.15,17.31,
+17.37,17.45,17.42,17.69,17.48,17.81,17.95,18.14,18.13,18.27,
+18.32,18.45,18.54,18.48,18.65,18.86,18.78,19.13,18.96,19.34,
+19.20,19.24,19.50,19.53,19.88,19.77,19.87,19.93,20.12,20.36,
+20.24,20.36,20.32,20.57,20.63,20.49,20.89,21.20,21.05,21.05,
+21.22,21.13,21.38,21.59,21.62,21.58,21.79,21.94,21.83,22.05,
+22.28,22.39,22.12,22.32,22.55,22.73,22.78,22.91,22.80,23.05,
+23.23,23.22,23.62,23.47,23.52,23.57,23.64,23.73,23.86,24.04,
+24.06,24.25,24.22,24.36,24.43,24.58,24.82,24.78,24.98,24.83,
+25.00,24.99,25.30,25.37,25.28,25.53,25.53,25.74,25.74,25.82,
+26.07,25.99,26.39,26.20,26.34,26.62,26.47,26.65,26.83,27.10,
+27.07,27.17,27.34,27.16,27.42,27.37,27.85,27.67,27.57,27.81,
+28.08,28.09,28.21,28.21,28.46,28.75,28.66,28.95,28.66,28.94,
+0.92,1.00,1.14,1.18,1.31,1.34,1.41,1.53,1.71,1.67,
+1.77,1.91,1.98,2.15,2.17,2.26,2.27,2.39,2.56,2.54,
+2.71,2.74,2.86,2.89,3.00,3.17,3.15,3.30,3.32,3.40,
+3.54,3.60,3.74,3.80,3.84,4.00,4.11,4.12,4.18,4.26,
+4.39,4.48,4.54,4.71,4.74,4.90,4.95,4.98,5.02,5.10,
+5.31,5.26,5.46,5.57,5.41,5.72,5.88,5.90,5.91,5.97,
+6.07,6.16,6.29,6.36,6.44,6.65,6.54,6.69,6.91,6.85,
+6.99,7.13,7.17,7.25,7.37,7.38,7.49,7.56,7.67,7.83,
+7.78,7.97,8.08,8.04,8.23,8.29,8.46,8.52,8.58,8.63,
+8.59,8.79,8.80,8.95,8.99,9.13,9.09,9.32,9.43,9.53,
+9.48,9.63,9.84,9.79,9.84,9.92,10.08,10.06,10.36,10.42,
+10.48,10.51,10.70,10.77,10.82,11.04,10.94,11.15,11.24,11.06,
+11.40,11.53,11.54,11.47,11.57,11.95,11.88,12.06,11.96,12.20,
+12.18,12.20,12.50,12.59,12.55,12.64,12.75,12.94,12.70,12.78,
+12.77,13.07,13.23,13.30,13.31,13.32,13.67,13.48,13.81,13.91,
+13.87,14.07,14.09,14.03,14.25,14.35,14.42,14.24,14.73,14.66,
+14.82,14.71,14.80,15.16,15.00,15.34,15.15,15.43,15.48,15.56,
+15.73,15.76,15.86,15.93,16.09,16.00,16.06,16.49,16.26,16.47,
+16.50,16.60,16.76,16.76,16.73,17.00,17.10,17.11,17.13,17.37,
+17.33,17.46,17.49,17.86,17.77,17.70,17.92,18.12,17.90,18.01,
+18.14,18.25,18.44,18.35,18.71,18.77,18.70,18.86,18.85,19.06,
+18.96,19.15,19.20,19.34,19.46,19.69,19.79,19.62,19.77,19.79,
+19.89,19.90,20.18,20.13,20.07,20.53,20.45,20.39,20.58,21.04,
+20.67,20.96,20.89,20.93,21.09,21.18,21.28,21.36,21.35,21.66,
+21.80,21.68,21.62,21.98,22.02,22.10,22.03,22.40,22.25,22.64,
+22.48,22.47,22.59,22.77,22.92,22.95,22.83,23.20,23.30,23.21,
+23.36,23.41,23.54,23.82,23.88,24.03,23.84,24.18,24.00,24.19,
+24.39,24.27,24.33,24.42,24.64,24.52,24.83,24.69,24.88,25.04,
+25.24,25.17,25.14,25.50,25.62,25.45,25.61,25.86,25.93,25.94,
+4.19,4.57,4.90,5.29,5.67,5.98,6.44,6.78,7.14,7.49,
+7.98,8.28,8.70,9.03,9.51,9.86,10.11,10.50,10.95,11.35,
+11.69,12.05,12.49,12.76,13.27,13.63,14.10,14.23,14.74,15.13,
+15.58,15.83,16.16,16.64,16.99,17.33,17.69,18.20,18.45,19.01,
+19.35,19.76,19.96,20.33,20.75,21.11,21.48,21.75,22.13,22.67,
+22.89,23.39,23.68,24.12,24.51,25.06,25.26,25.59,25.93,26.51,
+26.73,27.10,27.42,27.95,28.38,28.67,29.09,29.43,29.76,30.18,
+30.52,31.06,31.19,31.70,31.97,32.56,32.79,33.11,33.48,33.89,
+34.41,34.69,35.05,35.57,35.80,36.22,36.60,37.02,37.55,38.04,
+38.19,38.38,38.89,39.32,39.88,40.21,40.27,40.87,41.20,41.28,
+41.83,42.43,42.83,42.88,43.55,43.67,44.09,44.65,44.84,45.18,
+45.75,45.97,46.41,46.82,46.98,47.53,47.98,48.31,48.70,49.34,
+49.32,49.79,50.27,50.78,50.74,51.13,51.66,52.31,52.68,52.80,
+53.12,53.60,53.88,54.60,54.48,55.08,55.55,55.85,56.33,56.69,
+57.13,57.16,57.83,58.33,58.51,58.84,59.33,59.63,60.02,60.37,
+60.81,61.25,61.35,61.80,62.07,62.70,63.13,63.18,63.81,64.00,
+64.54,65.04,65.23,65.52,65.88,66.42,66.78,66.92,67.20,67.83,
+68.37,68.69,69.25,69.38,69.92,70.34,70.61,71.09,71.36,71.77,
+72.23,72.50,72.72,73.46,73.63,73.87,74.36,74.78,74.94,75.43,
+75.82,76.44,76.56,76.92,77.49,77.75,78.27,78.23,78.85,79.24,
+79.56,80.16,80.33,80.76,81.24,81.47,81.71,82.50,82.69,83.10,
+83.34,83.91,84.37,84.76,85.17,85.48,85.62,86.17,86.20,86.84,
+87.22,87.31,88.06,88.31,88.49,88.81,89.30,89.95,90.36,90.48,
+90.97,91.30,91.53,92.14,92.24,92.79,93.27,93.79,93.78,94.31,
+94.84,94.98,95.44,95.99,96.29,96.56,97.00,97.29,97.39,98.27,
+98.56,98.81,99.09,99.72,99.76,100.40,100.83,100.96,101.89,101.96,
+102.39,102.56,103.18,103.34,103.80,104.04,104.37,105.00,105.14,105.69,
+105.80,106.14,107.07,107.32,107.51,107.77,108.25,108.47,109.12,109.53,
+109.99,110.06,110.68,110.79,111.56,111.80,112.05,112.32,112.95,113.54,
+3.77,4.11,4.47,4.78,5.21,5.50,5.79,6.09,6.55,6.90,
+7.27,7.62,7.97,8.24,8.64,8.81,9.30,9.57,9.90,10.28,
+10.58,10.97,11.31,11.70,12.04,12.40,12.65,13.13,13.44,13.73,
+13.98,14.44,14.84,15.16,15.57,15.84,16.23,16.60,16.69,17.17,
+17.45,17.75,18.22,18.45,18.82,19.29,19.50,19.82,20.34,20.72,
+20.96,21.38,21.70,21.92,22.33,22.84,23.17,23.35,23.67,24.02,
+24.38,24.72,25.05,25.30,25.79,26.14,26.54,26.76,27.14,27.46,
+27.65,28.29,28.61,28.80,29.23,29.57,29.72,30.15,30.66,30.88,
+31.28,31.52,31.93,32.29,32.62,32.94,33.36,33.64,34.06,34.28,
+34.67,35.03,35.32,35.55,36.07,36.50,36.72,37.19,37.46,37.80,
+38.16,38.63,38.90,39.25,39.41,39.73,40.16,40.59,40.83,41.32,
+41.61,41.90,42.20,42.46,42.92,43.18,43.62,44.14,44.22,44.40,
+44.97,45.24,45.61,45.91,46.47,46.73,47.11,47.54,47.62,48.02,
+48.40,48.72,49.20,49.52,49.76,50.12,50.55,50.79,51.13,51.35,
+51.91,52.36,52.52,52.89,53.16,53.77,53.81,54.32,54.41,54.87,
+55.26,55.58,55.82,56.31,56.67,56.88,57.24,57.96,57.97,58.32,
+58.64,58.95,59.18,59.75,60.14,60.45,60.96,61.10,61.24,61.80,
+62.38,62.44,62.71,63.33,63.41,64.16,64.33,64.29,64.83,65.42,
+65.76,65.92,66.25,66.35,66.87,67.33,67.60,68.08,68.40,68.77,
+69.26,69.43,69.63,69.88,70.50,70.76,71.05,71.40,71.70,72.28,
+72.44,72.80,73.30,73.41,73.87,74.31,74.61,74.89,75.09,75.40,
+76.08,76.16,76.49,76.87,77.24,77.65,77.97,78.17,79.07,79.04,
+79.38,79.80,79.79,80.35,80.67,80.99,81.42,81.79,82.12,82.28,
+83.03,82.99,83.38,83.92,83.92,84.40,84.87,85.02,85.43,85.87,
+86.19,86.43,86.89,87.16,87.60,87.99,88.27,88.56,88.83,89.29,
+89.98,89.92,90.42,90.65,90.98,91.46,91.64,92.14,92.17,92.73,
+93.06,93.38,93.56,94.23,94.64,94.87,95.50,95.33,95.89,96.19,
+96.50,96.62,97.43,97.31,97.75,98.16,98.60,98.89,99.39,99.72,
+100.25,100.10,100.40,100.89,101.17,101.92,101.72,102.43,102.64,103.14,
+3.46,3.73,4.08,4.36,4.71,4.94,5.30,5.62,6.04,6.18,
+6.51,6.84,7.12,7.50,7.80,8.12,8.50,8.79,9.12,9.38,
+9.73,9.96,10.27,10.45,10.97,11.14,11.52,11.92,12.12,12.60,
+12.67,13.18,13.46,13.75,14.10,14.42,14.70,15.10,15.41,15.62,
+15.94,16.18,16.61,16.92,17.24,17.40,17.85,18.14,18.43,18.80,
+19.06,19.47,19.64,20.14,20.38,20.56,20.89,21.16,21.65,21.85,
+22.15,22.53,22.83,23.22,23.52,23.79,24.00,24.33,24.75,24.94,
+25.35,25.54,25.98,26.22,26.61,26.79,27.27,27.50,27.86,28.10,
+28.38,28.91,29.16,29.35,29.66,29.94,30.32,30.64,30.80,31.18,
+31.46,31.84,32.05,32.49,32.87,33.06,33.53,33.84,34.27,34.36,
+34.77,35.07,35.40,35.55,35.98,36.09,36.61,36.85,37.19,37.51,
+37.91,38.11,38.66,38.66,38.97,39.58,39.65,39.79,40.34,40.62,
+40.88,41.43,41.73,41.91,42.12,42.55,42.63,43.15,43.56,43.79,
+44.00,44.40,44.62,45.06,45.41,45.65,46.02,46.18,46.81,46.94,
+47.21,47.51,47.63,48.06,48.40,48.89,49.12,49.44,49.59,49.91,
+50.38,50.58,51.06,51.26,51.75,51.85,52.28,52.47,52.80,53.25,
+53.41,53.77,53.91,54.46,54.64,54.95,55.06,55.68,56.01,56.38,
+56.48,57.17,57.28,57.35,57.95,58.06,58.53,58.63,59.05,59.40,
+59.71,59.95,60.23,60.39,60.98,61.37,61.69,61.72,62.13,62.57,
+62.90,63.27,63.25,63.69,64.20,64.45,64.77,64.92,65.20,65.65,
+65.97,66.26,66.61,67.00,67.28,67.32,67.97,67.98,68.47,68.97,
+68.92,69.43,69.65,69.82,70.36,70.71,71.01,71.12,71.96,72.24,
+72.07,72.21,72.55,73.23,73.42,73.64,74.02,74.47,74.86,74.95,
+75.39,75.70,75.85,76.29,76.65,77.11,77.13,77.37,77.78,78.03,
+78.16,78.71,79.22,79.42,79.69,79.96,80.46,80.59,80.98,81.33,
+81.39,82.04,82.01,82.74,82.93,83.13,83.67,83.55,84.10,84.40,
+84.65,85.04,85.42,85.93,85.94,86.73,86.57,86.89,87.53,87.41,
+87.66,88.04,88.27,88.80,89.11,89.45,89.65,89.86,90.07,90.58,
+90.75,91.29,91.35,91.69,92.35,92.53,92.88,92.99,93.45,93.67,
+3.16,3.44,3.68,3.95,4.24,4.55,4.84,5.11,5.40,5.71,
+6.01,6.19,6.62,6.82,7.09,7.42,7.64,7.98,8.25,8.52,
+8.80,9.16,9.33,9.61,9.87,10.17,10.54,10.82,11.13,11.37,
+11.69,11.95,12.24,12.40,12.71,13.07,13.32,13.68,13.91,14.20,
+14.44,14.81,15.09,15.45,15.71,15.97,16.15,16.49,16.78,17.07,
+17.34,17.69,17.97,18.34,18.53,18.82,19.11,19.40,19.54,19.84,
+20.16,20.50,20.74,20.97,21.31,21.70,22.03,22.30,22.43,22.78,
+23.05,23.24,23.57,23.86,24.31,24.36,24.65,24.94,25.36,25.66,
+26.00,25.99,26.54,26.75,27.07,27.22,27.65,27.86,28.16,28.27,
+28.50,28.99,29.27,29.54,29.72,30.18,30.54,30.87,31.15,31.26,
+31.77,31.89,32.13,32.58,32.55,33.01,33.38,33.53,33.71,34.03,
+34.38,34.54,34.91,35.34,35.44,35.69,36.26,36.34,36.91,36.86,
+37.35,37.66,37.79,38.17,38.25,38.65,38.89,39.42,39.51,39.78,
+40.19,40.22,40.60,40.95,41.21,41.58,42.00,42.14,42.40,42.71,
+42.87,43.27,43.35,43.81,44.01,44.50,44.61,44.88,45.13,45.41,
+45.83,46.17,46.34,46.85,46.99,47.17,47.53,47.86,48.12,48.37,
+48.72,48.99,49.10,49.32,49.63,50.03,50.56,50.55,50.80,51.17,
+51.37,51.79,52.07,52.41,52.57,53.05,53.05,53.37,53.77,54.05,
+54.39,54.55,54.87,54.94,55.44,55.85,56.06,56.28,56.45,56.83,
+56.92,57.43,57.51,58.21,58.37,58.56,58.77,59.31,59.55,59.72,
+60.24,60.36,60.43,60.84,61.19,61.38,61.38,62.20,62.42,62.52,
+62.59,63.05,63.38,63.54,64.05,64.12,64.59,64.79,64.99,65.70,
+65.79,65.85,66.36,66.66,66.87,67.21,67.47,67.86,67.79,68.36,
+68.62,68.93,68.94,69.64,69.72,70.23,70.31,70.59,70.87,71.01,
+71.16,71.57,71.88,72.41,72.57,72.54,72.98,73.45,73.96,73.90,
+74.22,74.74,74.70,75.03,75.27,75.73,75.98,76.14,76.30,76.99,
+76.72,77.41,77.67,78.02,78.10,78.27,78.89,79.05,79.70,79.56,
+79.93,80.12,80.64,80.77,81.15,81.35,81.49,81.78,82.46,82.70,
+82.75,83.07,83.19,83.64,84.06,84.00,84.60,84.86,84.79,85.43,
+2.85,3.18,3.33,3.66,3.84,4.27,4.38,4.62,4.89,5.25,
+5.49,5.72,5.98,6.21,6.46,6.67,6.94,7.19,7.52,7.69,
+7.98,8.33,8.56,8.73,9.13,9.44,9.63,9.88,10.03,10.41,
+10.56,10.91,11.14,11.43,11.62,11.90,12.22,12.41,12.71,13.01,
+13.16,13.40,13.69,13.95,14.22,14.51,14.82,15.02,15.24,15.51,
+15.69,16.15,16.28,16.56,16.91,17.07,17.27,17.44,17.78,18.14,
+18.36,18.68,18.99,19.07,19.40,19.68,19.95,19.97,20.35,20.72,
+21.05,21.18,21.49,21.73,21.99,22.22,22.56,22.71,23.05,23.30,
+23.50,23.79,24.05,24.36,24.49,24.92,25.01,25.42,25.55,25.88,
+25.96,26.16,26.64,26.89,27.19,27.35,27.74,28.03,28.19,28.50,
+28.59,28.92,29.14,29.51,29.82,30.06,30.21,30.44,30.78,30.98,
+31.55,31.54,31.90,31.99,32.46,32.53,32.74,33.24,33.38,33.65,
+33.83,34.12,34.38,34.85,34.95,35.43,35.56,35.73,35.97,36.38,
+36.40,36.65,36.85,37.23,37.61,37.66,37.97,38.33,38.49,38.84,
+39.02,39.39,39.54,40.01,40.05,40.37,40.85,40.92,41.15,41.42,
+41.48,41.80,42.23,42.53,42.69,43.26,43.35,43.27,43.72,44.10,
+44.31,44.62,44.85,44.73,45.35,45.46,45.95,46.14,46.27,46.60,
+46.79,47.08,47.50,47.57,47.78,48.18,48.17,48.99,49.09,49.23,
+49.44,49.83,49.92,50.16,50.56,50.63,51.20,51.19,51.67,51.78,
+51.83,52.22,52.48,52.89,52.93,53.25,53.76,53.91,53.97,54.41,
+54.60,54.72,54.99,55.32,55.55,55.75,56.21,56.52,56.73,56.82,
+57.15,57.28,57.71,57.87,58.09,58.58,58.70,58.95,59.31,59.58,
+59.80,59.99,60.32,60.42,60.79,61.26,61.45,61.79,61.80,61.97,
+62.12,62.71,62.83,63.01,63.43,63.82,63.88,64.07,64.45,64.47,
+64.92,65.31,65.31,65.56,65.97,66.49,66.65,66.70,67.05,67.67,
+67.61,67.76,68.23,68.31,68.64,68.54,69.15,69.56,69.53,69.69,
+70.34,70.54,70.62,71.02,71.05,71.46,71.65,72.09,72.17,72.73,
+73.00,73.04,73.31,73.64,73.64,74.15,74.28,74.61,74.78,75.01,
+75.28,75.81,75.76,76.06,76.38,76.67,76.70,77.14,77.57,77.60,
+2.57,2.83,3.02,3.36,3.56,3.76,4.07,4.16,4.49,4.69,
+4.91,5.19,5.48,5.66,5.92,6.13,6.29,6.54,6.83,7.18,
+7.31,7.59,7.72,7.98,8.26,8.34,8.78,8.93,9.09,9.40,
+9.61,9.91,10.14,10.31,10.68,10.86,11.01,11.38,11.55,11.79,
+12.03,12.28,12.53,12.69,12.90,13.17,13.50,13.62,13.88,14.12,
+14.34,14.65,14.86,15.05,15.22,15.48,15.82,16.01,16.26,16.55,
+16.67,17.08,17.12,17.45,17.81,17.82,18.10,18.44,18.66,18.77,
+18.99,19.15,19.50,19.70,20.04,20.18,20.51,20.65,20.88,21.35,
+21.53,21.68,21.89,22.11,22.30,22.60,22.90,22.99,23.12,23.51,
+23.90,24.14,24.15,24.44,24.69,25.14,25.26,25.43,25.65,25.98,
+26.19,26.43,26.69,26.95,27.14,27.31,27.83,27.78,28.14,28.38,
+28.46,28.64,28.83,29.28,29.45,29.74,29.88,30.18,30.41,30.58,
+30.80,31.12,31.32,31.69,31.79,32.00,32.21,32.42,32.86,33.16,
+33.34,33.43,33.77,33.91,34.11,34.28,34.71,34.81,35.13,35.27,
+35.50,35.90,36.19,36.24,36.62,36.84,36.91,37.12,37.41,37.84,
+37.84,38.13,38.47,38.56,38.80,39.11,39.41,39.48,39.96,40.07,
+40.18,40.55,40.79,41.23,41.40,41.64,41.63,41.97,42.01,42.46,
+42.80,42.82,43.01,43.34,43.73,43.94,43.98,44.47,44.40,44.70,
+44.99,45.31,45.35,45.72,45.96,46.40,46.31,46.90,46.88,47.10,
+47.50,47.45,47.79,47.84,48.34,48.50,48.82,48.88,49.45,49.26,
+49.73,49.82,50.06,50.32,50.53,50.62,51.25,51.21,51.59,51.83,
+52.01,52.03,52.53,52.62,53.15,53.20,53.26,53.67,53.89,54.12,
+54.43,54.71,54.76,55.08,55.20,55.55,55.87,56.03,56.25,56.60,
+56.82,56.91,57.22,57.55,57.84,58.24,58.03,58.28,58.70,58.84,
+59.02,59.43,59.43,59.90,59.86,60.17,60.36,60.76,61.08,61.28,
+61.56,61.70,62.03,61.88,62.34,63.02,63.09,63.31,63.29,63.39,
+63.94,64.08,64.35,64.89,64.56,65.11,65.35,65.43,65.76,66.08,
+66.48,66.38,66.67,66.88,67.18,67.26,67.36,67.65,68.18,68.30,
+68.49,68.58,69.14,69.23,69.22,69.79,69.95,70.07,70.42,70.51,
+2.38,2.56,2.80,3.04,3.25,3.48,3.65,3.88,4.03,4.28,
+4.52,4.74,4.93,5.16,5.28,5.55,5.71,5.98,6.18,6.38,
+6.55,6.84,7.02,7.21,7.39,7.76,7.94,8.07,8.42,8.64,
+8.85,8.94,9.17,9.41,9.71,9.99,10.15,10.19,10.58,10.66,
+10.90,11.14,11.34,11.59,11.83,12.01,12.10,12.35,12.61,12.83,
+13.17,13.26,13.51,13.76,13.85,14.24,14.34,14.52,14.75,15.08,
+15.11,15.30,15.69,15.94,16.02,16.36,16.51,16.79,16.98,17.11,
+17.45,17.52,17.76,18.10,18.22,18.48,18.63,18.94,19.08,19.18,
+19.51,19.65,19.89,20.15,20.32,20.62,20.69,21.06,21.23,21.34,
+21.53,21.84,22.31,22.27,22.51,22.68,23.05,23.16,23.41,23.62,
+23.74,23.84,24.04,24.39,24.55,24.86,25.25,25.35,25.51,25.61,
+25.90,26.08,26.27,26.57,26.85,27.02,27.21,27.52,27.67,27.96,
+28.02,28.40,28.48,28.78,28.91,29.16,29.40,29.55,29.82,30.04,
+30.18,30.24,30.80,30.84,30.99,31.26,31.36,31.83,31.72,32.09,
+32.51,32.48,32.85,33.08,33.11,33.32,33.58,33.73,34.06,34.14,
+34.36,34.86,34.86,35.38,35.40,35.53,35.86,36.03,36.07,36.45,
+36.63,36.89,37.16,37.32,37.66,37.66,38.02,38.12,38.46,38.53,
+38.71,39.16,39.38,39.51,39.64,39.70,40.23,40.32,40.46,40.84,
+41.02,40.98,41.50,41.63,41.82,41.94,42.17,42.48,42.60,42.66,
+43.20,43.28,43.38,43.92,43.68,44.21,44.47,44.71,44.79,44.97,
+45.25,45.48,45.58,45.82,45.95,46.26,46.66,46.88,46.80,47.20,
+47.15,47.48,48.01,47.92,48.37,48.45,48.65,48.70,49.00,49.40,
+49.88,49.72,50.00,50.16,50.27,50.60,50.71,51.04,51.25,51.23,
+51.73,52.02,52.01,52.33,52.54,52.81,52.88,53.20,53.46,53.36,
+53.65,54.01,54.22,54.39,54.67,54.83,54.94,55.30,55.40,55.76,
+56.14,56.16,56.04,56.65,56.77,56.95,57.15,57.32,57.54,57.51,
+58.14,58.19,58.48,58.63,59.05,59.24,59.45,59.43,59.81,60.15,
+60.45,60.52,60.83,60.79,61.01,61.27,61.54,61.82,61.84,62.12,
+62.49,62.43,62.81,62.79,63.45,63.39,63.54,64.32,64.23,64.29,
+2.12,2.34,2.55,2.78,3.02,3.12,3.29,3.44,3.69,3.90,
+4.13,4.36,4.54,4.62,4.89,5.08,5.24,5.47,5.67,5.88,
+6.11,6.31,6.47,6.62,6.83,6.93,7.20,7.54,7.62,7.80,
+8.09,8.20,8.30,8.50,8.83,8.97,9.27,9.48,9.57,9.75,
+9.96,10.10,10.32,10.54,10.74,10.86,11.10,11.42,11.49,11.76,
+11.84,11.98,12.29,12.53,12.74,12.87,13.14,13.23,13.45,13.60,
+13.75,14.01,14.26,14.49,14.53,14.88,14.91,15.23,15.36,15.74,
+15.75,15.88,16.13,16.32,16.41,16.89,16.96,17.22,17.37,17.42,
+17.68,18.00,18.02,18.37,18.52,18.70,18.76,19.12,19.31,19.41,
+19.74,19.81,19.95,20.20,20.47,20.73,20.99,21.01,21.13,21.52,
+21.74,21.84,22.08,22.17,22.33,22.60,22.88,23.09,23.22,23.48,
+23.62,23.77,23.99,24.08,24.32,24.62,24.83,25.09,24.95,25.41,
+25.48,25.71,25.77,26.23,26.46,26.58,26.67,26.89,27.01,27.42,
+27.52,27.65,27.96,28.12,28.23,28.50,28.71,28.82,29.07,29.24,
+29.40,29.60,30.05,30.15,30.12,30.36,30.68,30.80,30.89,31.31,
+31.43,31.65,31.78,32.00,32.12,32.32,32.68,32.84,33.13,33.05,
+33.40,33.51,33.74,33.71,33.93,34.44,34.50,34.73,34.91,35.17,
+35.36,35.62,35.78,36.04,36.26,36.38,36.55,36.62,36.95,37.17,
+37.18,37.39,37.68,37.91,38.37,38.35,38.35,38.52,38.83,38.89,
+39.28,39.45,39.83,39.75,39.95,40.16,40.40,40.54,40.79,40.90,
+41.21,41.28,41.57,41.79,41.84,41.94,42.22,42.66,42.93,43.12,
+42.98,43.42,43.79,43.81,43.92,44.07,44.44,44.57,44.61,44.89,
+45.03,45.37,45.37,45.55,45.81,45.91,46.17,46.21,46.60,46.70,
+46.94,47.38,47.48,47.81,47.75,47.76,48.20,48.26,48.62,48.46,
+49.02,49.24,49.27,49.54,49.92,49.91,50.03,50.40,50.34,50.74,
+51.01,51.23,51.05,51.66,51.74,51.80,52.23,52.30,52.38,52.57,
+52.63,53.00,53.45,53.61,53.47,54.05,53.92,53.92,54.47,54.68,
+54.93,55.20,55.20,55.35,55.56,55.75,56.08,55.96,56.55,56.65,
+56.80,57.06,57.30,57.46,57.33,57.60,57.97,58.17,58.31,58.41,
+1.98,2.10,2.33,2.53,2.64,2.84,3.01,3.17,3.37,3.56,
+3.75,3.87,4.12,4.25,4.42,4.68,4.78,5.00,5.12,5.39,
+5.57,5.72,5.83,6.01,6.26,6.38,6.61,6.84,6.99,7.01,
+7.29,7.45,7.65,7.74,8.00,8.11,8.35,8.48,8.73,8.77,
+9.04,9.30,9.23,9.61,9.79,9.90,10.14,10.22,10.49,10.64,
+10.85,11.05,11.21,11.40,11.63,11.71,11.93,12.09,12.29,12.36,
+12.57,12.89,12.99,13.08,13.30,13.42,13.59,13.84,14.04,14.23,
+14.38,14.54,14.85,14.91,15.05,15.31,15.54,15.71,15.77,15.92,
+16.22,16.31,16.42,16.54,16.75,16.98,17.22,17.27,17.50,17.74,
+17.91,18.24,18.41,18.61,18.63,18.79,18.96,19.17,19.24,19.51,
+19.64,19.74,20.03,20.16,20.44,20.68,20.73,21.16,21.19,21.29,
+21.55,21.69,21.84,21.97,22.14,22.36,22.59,22.79,23.13,22.97,
+23.13,23.54,23.66,23.77,23.93,24.12,24.42,24.39,24.92,24.75,
+24.95,25.10,25.30,25.59,25.48,26.03,26.05,26.15,26.39,26.59,
+26.78,26.92,27.07,27.17,27.46,27.72,27.63,28.02,28.09,28.36,
+28.78,28.76,28.96,28.94,29.41,29.26,29.73,29.73,29.90,30.46,
+30.32,30.38,30.71,30.72,31.01,31.27,31.55,31.54,31.53,31.99,
+32.07,32.08,32.72,32.66,32.73,33.02,33.10,33.25,33.53,33.63,
+33.85,34.05,34.21,34.53,34.68,34.77,34.55,35.16,35.33,35.41,
+35.68,35.73,36.00,35.91,36.22,36.68,36.98,36.99,37.34,37.10,
+37.32,37.77,37.76,37.98,38.31,38.45,38.29,38.77,38.87,38.92,
+39.46,39.19,39.53,39.62,40.00,40.02,40.45,40.37,40.85,40.80,
+40.88,40.87,41.39,41.57,41.77,41.88,42.10,42.10,42.50,42.55,
+42.94,42.99,43.39,43.33,43.61,43.50,43.61,44.10,44.24,44.20,
+44.44,44.64,44.80,45.07,45.23,45.44,45.65,45.87,46.15,46.24,
+46.50,46.52,46.73,46.93,47.06,47.14,47.54,47.49,47.76,47.95,
+48.27,48.34,48.42,48.49,48.74,49.23,49.27,49.32,49.41,49.55,
+50.01,49.98,50.40,50.57,50.59,50.85,50.88,51.00,51.22,51.42,
+51.70,52.03,52.25,52.19,52.29,52.60,52.67,52.84,52.82,53.32,
+1.80,2.00,2.07,2.26,2.45,2.58,2.79,2.96,3.02,3.19,
+3.45,3.53,3.79,3.87,4.02,4.25,4.38,4.60,4.64,4.88,
+5.02,5.16,5.34,5.54,5.63,5.72,5.97,6.17,6.37,6.55,
+6.61,6.79,6.94,7.12,7.20,7.47,7.52,7.65,7.92,8.05,
+8.20,8.46,8.57,8.70,8.91,9.01,9.21,9.45,9.54,9.71,
+9.86,10.14,10.26,10.27,10.50,10.61,10.89,11.04,11.09,11.15,
+11.35,11.69,11.74,11.96,12.09,12.31,12.43,12.66,12.68,12.90,
+13.10,13.19,13.41,13.52,13.71,13.93,14.02,14.29,14.30,14.62,
+14.65,14.92,14.98,15.10,15.25,15.51,15.65,15.74,15.90,16.18,
+16.38,16.52,16.48,16.78,17.06,17.00,17.22,17.37,17.71,17.58,
+17.96,18.10,18.28,18.55,18.73,18.68,19.02,18.99,19.35,19.41,
+19.54,19.61,19.71,19.81,20.14,20.46,20.50,20.74,20.75,21.07,
+21.27,21.39,21.58,21.57,21.67,22.05,22.17,22.25,22.43,22.54,
+22.59,23.08,23.08,23.24,23.36,23.66,23.79,23.96,23.80,24.12,
+24.51,24.57,24.61,24.62,24.88,25.06,25.21,25.60,25.83,25.74,
+26.09,26.13,26.38,26.59,26.61,26.98,27.02,27.12,27.25,27.33,
+27.46,27.66,27.81,28.27,28.16,28.34,28.61,28.80,28.90,29.18,
+29.33,29.40,29.56,29.82,29.96,30.09,30.10,30.39,30.48,30.83,
+30.92,31.01,31.14,31.07,31.59,31.76,31.76,31.99,32.29,32.37,
+32.52,32.67,32.87,32.99,33.19,33.38,33.39,33.53,33.95,33.90,
+34.14,34.20,34.53,34.59,34.81,34.72,35.20,35.11,35.48,35.48,
+35.69,35.70,36.10,36.20,36.34,36.43,36.70,36.75,37.06,37.19,
+37.13,37.44,37.41,37.72,37.67,37.92,38.21,38.49,38.54,38.73,
+38.99,39.03,39.02,39.30,39.53,39.81,39.80,39.72,40.27,40.31,
+40.54,40.90,40.95,40.98,41.23,41.36,41.55,41.65,41.75,41.99,
+42.01,42.27,42.57,42.58,42.79,42.72,43.43,43.38,43.48,43.76,
+43.85,44.23,44.21,44.10,44.22,44.56,45.10,44.98,45.04,45.42,
+45.49,45.77,45.93,45.80,46.05,46.07,46.18,46.52,46.83,46.75,
+47.02,47.21,47.42,47.44,47.63,47.87,48.10,48.15,48.16,48.49,
+1.62,1.78,1.91,2.05,2.25,2.41,2.49,2.66,2.79,2.94,
+3.03,3.23,3.36,3.51,3.64,3.76,4.01,4.09,4.36,4.46,
+4.53,4.74,4.88,5.05,5.00,5.30,5.50,5.61,5.73,5.86,
+6.02,6.18,6.29,6.49,6.66,6.68,6.87,7.06,7.15,7.37,
+7.36,7.73,7.78,7.88,8.11,8.26,8.28,8.60,8.70,8.73,
+9.02,9.18,9.28,9.31,9.55,9.74,9.74,9.99,10.13,10.34,
+10.44,10.66,10.62,10.87,10.95,11.19,11.40,11.46,11.61,11.71,
+11.96,12.02,12.20,12.44,12.46,12.70,12.88,12.86,13.15,13.29,
+13.46,13.70,13.73,13.78,14.12,14.22,14.28,14.45,14.44,14.69,
+14.86,15.06,15.28,15.22,15.36,15.51,15.96,15.92,16.00,16.26,
+16.46,16.57,16.69,16.92,16.83,17.06,17.14,17.43,17.63,17.72,
+17.65,17.95,18.11,18.07,18.33,18.52,18.69,18.70,18.84,18.94,
+19.13,19.39,19.65,19.66,19.72,20.06,20.15,20.32,20.46,20.59,
+20.71,20.78,20.97,21.18,21.25,21.35,21.67,21.73,21.93,22.06,
+22.14,22.27,22.57,22.71,22.91,22.96,23.33,23.19,23.19,23.34,
+23.62,23.75,23.93,24.38,24.15,24.38,24.62,24.77,24.91,24.77,
+25.24,25.28,25.47,25.63,25.81,26.16,25.97,26.05,26.17,26.52,
+26.54,27.00,26.77,27.04,27.02,27.26,27.48,27.60,27.88,27.86,
+28.20,28.24,28.27,28.61,28.48,28.75,28.75,29.05,29.33,29.31,
+29.56,29.70,29.61,29.96,30.28,30.14,30.51,30.45,30.49,30.97,
+30.92,31.00,31.04,31.64,31.88,31.70,31.95,32.14,32.16,32.35,
+32.51,32.62,32.78,32.95,32.97,33.28,33.27,33.68,33.57,33.75,
+33.96,34.03,34.28,34.41,34.47,34.95,34.80,34.88,35.02,35.32,
+35.38,35.79,35.62,35.86,36.02,36.23,36.15,36.47,36.32,36.89,
+36.87,36.97,37.55,37.33,37.70,37.56,37.75,38.28,38.07,38.26,
+38.37,38.44,38.81,38.78,38.84,39.18,39.36,39.35,39.64,39.57,
+39.86,39.91,40.05,40.21,40.31,40.76,40.60,40.80,41.02,41.26,
+41.25,41.53,41.54,41.65,41.77,41.90,42.02,42.07,42.38,42.63,
+42.86,42.91,43.19,42.94,43.17,43.49,43.76,43.86,43.66,44.02,
+1.46,1.62,1.76,1.91,2.03,2.10,2.29,2.35,2.54,2.74,
+2.84,2.91,3.09,3.28,3.30,3.46,3.68,3.71,3.87,4.01,
+4.10,4.28,4.44,4.58,4.67,4.75,4.90,5.02,5.31,5.32,
+5.54,5.62,5.73,6.04,6.06,6.20,6.32,6.43,6.58,6.66,
+6.76,6.97,7.07,7.22,7.33,7.46,7.61,7.81,7.86,8.00,
+8.13,8.36,8.38,8.47,8.78,8.72,8.93,9.16,9.09,9.41,
+9.46,9.71,9.68,9.91,10.04,10.16,10.22,10.44,10.56,10.63,
+10.80,10.93,11.18,11.22,11.53,11.55,11.54,11.85,11.93,12.03,
+12.18,12.18,12.38,12.57,12.72,12.65,13.00,13.10,13.21,13.44,
+13.64,13.58,13.82,13.87,14.12,14.22,14.20,14.31,14.44,14.71,
+14.79,14.91,15.11,15.18,15.49,15.49,15.75,15.73,15.97,16.00,
+16.20,16.40,16.28,16.58,16.51,16.81,17.09,17.20,17.37,17.48,
+17.38,17.65,17.70,17.94,18.12,18.10,18.25,18.46,18.51,18.73,
+18.79,19.05,19.21,19.32,19.32,19.69,19.73,19.87,19.95,20.18,
+20.03,20.42,20.32,20.66,20.80,21.04,21.00,21.25,21.38,21.59,
+21.63,21.68,21.86,21.85,22.14,22.18,22.45,22.46,22.63,22.88,
+22.92,22.91,23.32,23.36,23.54,23.58,23.68,23.68,24.01,24.16,
+24.28,24.40,24.52,24.63,24.84,24.83,24.93,25.14,25.25,25.39,
+25.45,25.60,25.82,26.09,26.25,26.32,26.29,26.69,26.73,26.71,
+26.70,26.98,27.11,27.13,27.65,27.47,27.57,27.79,27.80,27.95,
+28.20,28.31,28.43,28.41,28.63,28.85,29.02,29.08,29.19,29.48,
+29.53,29.86,29.79,30.10,30.13,30.16,30.34,30.38,30.68,30.81,
+30.86,31.00,31.16,31.34,31.43,31.61,31.86,31.77,32.06,32.14,
+32.13,32.44,32.64,32.67,32.91,32.92,33.19,33.03,33.19,33.08,
+33.45,33.73,33.66,33.78,34.09,34.15,34.40,34.33,34.60,34.54,
+34.84,34.89,35.13,35.34,35.46,35.44,35.65,35.81,35.93,36.31,
+36.05,36.45,36.49,36.67,36.74,36.87,37.05,37.27,37.16,37.60,
+37.52,37.82,37.51,37.98,37.94,38.17,38.32,38.46,38.71,38.82,
+39.02,39.20,39.28,39.53,39.30,39.46,39.88,39.79,40.22,40.08,
+1.32,1.46,1.61,1.69,1.80,1.96,2.09,2.25,2.34,2.40,
+2.59,2.69,2.78,2.85,3.02,3.16,3.22,3.32,3.51,3.67,
+3.71,3.85,4.02,4.11,4.23,4.39,4.45,4.64,4.68,4.92,
+4.97,5.20,5.28,5.39,5.44,5.57,5.70,5.80,5.91,5.93,
+6.23,6.42,6.44,6.54,6.72,6.85,6.97,7.09,7.21,7.27,
+7.36,7.52,7.66,7.80,7.84,8.09,8.19,8.12,8.37,8.54,
+8.70,8.75,8.83,9.02,9.10,9.21,9.36,9.53,9.60,9.71,
+9.87,9.91,10.14,10.23,10.40,10.38,10.56,10.76,10.85,11.02,
+11.04,11.27,11.25,11.46,11.43,11.67,11.78,11.91,12.21,12.16,
+12.30,12.47,12.64,12.67,12.78,12.94,12.88,13.13,13.25,13.34,
+13.52,13.55,13.79,13.84,14.10,14.26,14.31,14.29,14.38,14.59,
+14.68,14.84,14.94,15.07,15.17,15.39,15.43,15.53,15.63,15.85,
+15.92,15.99,16.18,16.44,16.41,16.58,16.91,16.78,16.86,17.06,
+17.17,17.38,17.48,17.62,17.77,17.70,17.81,18.05,17.98,18.19,
+18.41,18.48,18.51,18.56,18.90,18.91,19.02,19.18,19.26,19.53,
+19.44,19.77,19.73,19.95,19.91,20.15,20.44,20.43,20.58,20.53,
+20.80,20.95,21.07,21.11,21.26,21.44,21.45,21.56,21.70,21.78,
+22.03,22.14,22.29,22.57,22.45,22.62,22.83,22.74,23.07,23.29,
+23.30,23.33,23.44,23.69,23.79,23.90,24.05,24.09,24.21,24.13,
+24.48,24.57,24.80,24.83,24.87,25.14,25.12,25.29,25.34,25.53,
+25.93,25.90,25.85,25.97,26.34,26.32,26.35,26.75,26.55,26.82,
+26.86,26.97,27.25,27.34,27.28,27.69,27.68,27.88,27.91,28.16,
+27.92,28.10,28.34,28.56,28.85,28.68,28.69,28.91,28.92,29.00,
+29.38,29.47,29.46,29.76,29.88,29.95,30.11,30.06,30.36,30.22,
+30.57,30.36,30.96,30.80,31.06,31.26,31.25,31.53,31.50,31.69,
+31.86,31.81,32.04,32.16,32.18,32.49,32.60,32.62,32.86,32.63,
+32.99,33.26,33.35,33.29,33.25,33.71,33.52,33.99,33.96,34.15,
+34.11,34.21,34.49,34.36,34.66,34.62,34.95,34.96,35.08,35.26,
+35.39,35.55,35.76,35.71,35.81,36.06,36.15,36.21,36.61,36.61,
+1.20,1.36,1.47,1.60,1.67,1.75,1.92,2.00,2.09,2.24,
+2.35,2.46,2.53,2.63,2.80,2.83,3.04,3.06,3.13,3.29,
+3.45,3.54,3.66,3.74,3.91,3.93,4.15,4.27,4.33,4.36,
+4.55,4.74,4.69,4.86,4.95,5.14,5.31,5.25,5.42,5.61,
+5.69,5.80,5.96,6.04,6.06,6.10,6.34,6.45,6.44,6.73,
+6.81,6.89,6.97,7.08,7.26,7.31,7.46,7.60,7.59,7.78,
+7.77,7.91,8.12,8.18,8.34,8.59,8.41,8.60,8.79,8.89,
+8.88,9.14,9.21,9.17,9.38,9.51,9.49,9.74,9.82,10.00,
+10.06,10.22,10.32,10.51,10.57,10.65,10.66,10.72,10.91,11.04,
+11.33,11.34,11.54,11.50,11.66,11.65,11.81,11.93,12.15,12.09,
+12.18,12.26,12.62,12.72,12.74,12.83,12.95,13.18,13.11,13.28,
+13.31,13.54,13.56,13.72,13.96,13.99,14.13,14.23,14.35,14.45,
+14.59,14.51,14.88,14.94,14.89,15.23,15.17,15.22,15.52,15.55,
+15.57,15.63,15.78,15.98,16.11,16.27,16.46,16.27,16.54,16.70,
+16.70,16.69,17.05,17.19,17.04,17.28,17.30,17.50,17.68,17.77,
+17.88,18.01,18.07,18.23,18.05,18.55,18.47,18.61,18.70,18.72,
+18.92,18.98,19.04,19.26,19.60,19.61,19.64,19.65,20.04,19.78,
+20.01,20.16,20.33,20.34,20.56,20.54,20.65,20.92,20.95,21.20,
+21.14,21.36,21.34,21.43,21.84,21.70,21.68,21.89,21.98,22.03,
+22.13,22.51,22.40,22.54,22.64,22.90,22.78,23.08,23.09,23.15,
+23.39,23.45,23.64,23.74,23.79,23.75,24.14,24.00,24.28,24.36,
+24.53,24.58,24.62,24.79,24.90,25.02,25.11,25.34,25.52,25.67,
+25.55,25.65,25.92,26.01,26.08,26.15,26.36,26.27,26.59,26.48,
+26.73,26.66,26.65,27.18,27.15,26.94,27.65,27.58,27.54,27.68,
+27.82,28.03,28.09,28.14,28.33,28.33,28.42,28.70,28.93,29.02,
+28.91,29.12,29.06,29.37,29.27,29.53,29.57,29.80,29.70,30.03,
+30.06,30.23,30.20,30.57,30.64,30.49,30.63,30.76,30.92,31.18,
+30.96,31.21,31.29,31.52,31.57,31.67,31.76,31.84,32.00,31.92,
+32.36,32.22,32.53,32.51,32.52,32.70,32.65,32.94,32.94,33.38,
+1.12,1.21,1.33,1.38,1.46,1.61,1.67,1.83,1.90,2.01,
+2.10,2.19,2.37,2.45,2.51,2.61,2.73,2.80,2.93,2.99,
+3.12,3.25,3.36,3.42,3.53,3.54,3.63,3.74,3.88,4.07,
+4.14,4.23,4.29,4.41,4.57,4.61,4.75,4.83,4.99,5.08,
+5.15,5.25,5.34,5.49,5.48,5.67,5.68,5.82,6.09,6.07,
+6.08,6.16,6.30,6.50,6.51,6.67,6.72,6.86,6.93,7.13,
+7.24,7.33,7.41,7.43,7.57,7.70,7.70,7.85,7.88,8.00,
+8.03,8.29,8.25,8.53,8.58,8.60,8.67,8.87,8.98,9.06,
+9.17,9.26,9.36,9.42,9.52,9.69,9.73,9.99,10.08,10.07,
+10.20,10.40,10.37,10.57,10.64,10.64,10.84,10.88,10.87,11.07,
+11.18,11.19,11.38,11.57,11.72,11.84,11.78,11.98,11.97,12.04,
+12.13,12.39,12.35,12.61,12.63,12.63,12.80,12.95,13.07,12.95,
+13.14,13.40,13.33,13.47,13.77,13.84,13.79,13.84,14.03,13.99,
+14.02,14.30,14.35,14.54,14.62,14.82,14.85,14.96,15.07,15.19,
+15.19,15.38,15.44,15.54,15.53,15.77,15.83,15.99,16.03,16.14,
+16.22,16.41,16.42,16.60,16.55,16.68,16.77,16.85,17.07,17.13,
+17.31,17.39,17.43,17.63,17.69,17.70,17.81,17.91,18.07,18.22,
+18.19,18.46,18.41,18.56,18.67,18.76,18.91,18.99,19.11,19.15,
+19.35,19.35,19.44,19.54,19.70,19.81,19.75,19.81,19.91,20.06,
+20.10,20.36,20.44,20.59,20.64,20.64,20.92,21.15,21.07,21.10,
+21.12,21.35,21.40,21.52,21.63,21.65,21.70,22.07,22.15,21.91,
+22.27,22.42,22.53,22.57,22.56,23.01,22.81,23.03,23.08,23.38,
+23.26,23.20,23.73,23.60,23.71,23.96,24.07,23.90,24.14,24.10,
+24.44,24.48,24.54,24.51,24.68,24.68,24.83,24.93,25.20,25.35,
+25.13,25.60,25.50,25.44,25.71,25.90,26.07,26.00,25.93,26.28,
+26.25,26.55,26.34,26.64,26.59,26.64,26.82,26.75,27.02,27.46,
+27.27,27.44,27.46,27.69,27.68,27.71,27.79,28.23,28.14,28.36,
+28.21,28.76,28.27,28.47,28.88,28.96,28.95,28.94,29.10,29.04,
+29.48,29.53,29.70,29.58,29.48,29.86,29.82,30.11,30.24,30.15,
+4.15,4.46,4.87,5.29,5.62,6.08,6.41,6.73,7.15,7.56,
+7.86,8.22,8.53,8.98,9.44,9.68,10.17,10.51,10.84,11.22,
+11.52,12.01,12.27,12.60,13.04,13.46,13.71,14.22,14.55,14.97,
+15.28,15.75,16.03,16.50,16.76,17.20,17.50,17.86,18.33,18.73,
+19.04,19.42,19.68,20.14,20.55,20.85,21.32,21.58,21.95,22.24,
+22.77,23.04,23.68,23.84,24.14,24.53,25.02,25.32,25.89,26.02,
+26.57,26.80,27.09,27.52,28.06,28.41,28.87,29.03,29.30,29.91,
+30.19,30.53,30.82,31.38,31.56,32.04,32.49,32.74,33.03,33.73,
+34.02,34.20,34.60,35.02,35.46,35.82,35.97,36.53,36.97,37.35,
+37.65,38.00,38.40,38.67,39.02,39.82,39.77,40.25,40.69,40.98,
+41.24,41.88,42.04,42.51,42.60,43.18,43.69,43.91,44.18,44.72,
+44.95,45.26,46.04,46.02,46.31,46.85,47.40,47.60,48.01,48.52,
+48.79,49.05,49.44,49.78,50.33,50.51,51.01,51.37,51.88,52.29,
+52.54,52.83,53.29,53.74,53.92,54.19,54.47,55.00,55.27,55.67,
+56.48,56.58,56.81,57.31,57.69,58.06,58.57,58.78,58.95,59.57,
+60.07,60.12,60.62,61.10,61.53,61.74,62.47,62.52,62.84,62.90,
+63.91,63.99,64.34,64.78,65.03,65.54,66.00,66.20,66.56,66.89,
+67.27,67.61,68.32,68.39,68.84,69.20,69.50,69.92,70.29,70.73,
+71.09,71.64,71.90,72.04,72.53,73.03,73.26,73.66,74.18,74.26,
+74.77,75.25,75.71,75.58,76.30,76.68,77.11,77.42,77.90,78.31,
+78.56,78.80,79.31,79.75,80.00,80.45,80.79,81.14,81.39,81.65,
+82.41,82.54,83.06,83.20,83.92,84.10,84.38,84.81,85.50,85.70,
+86.09,86.36,86.70,87.09,87.42,87.91,88.29,88.42,88.95,89.52,
+89.67,89.94,90.18,90.71,91.33,91.68,91.73,92.34,92.49,92.73,
+93.15,94.04,94.41,94.58,94.91,95.30,95.38,96.03,96.45,96.70,
+96.90,97.80,97.68,98.06,98.85,99.28,99.35,99.62,100.23,100.12,
+100.90,101.20,101.46,102.01,102.59,102.64,102.94,103.51,103.63,104.08,
+104.41,105.01,105.40,105.73,106.14,106.57,106.91,106.76,107.44,107.79,
+108.51,108.61,109.23,109.14,109.54,110.11,110.66,111.19,111.60,111.73,
+3.80,4.17,4.47,4.83,5.12,5.48,5.92,6.24,6.50,6.91,
+7.21,7.51,7.88,8.32,8.51,8.91,9.30,9.62,9.92,10.24,
+10.63,11.06,11.28,11.58,12.14,12.34,12.71,13.05,13.29,13.75,
+14.12,14.48,14.75,15.17,15.41,15.82,16.21,16.42,16.87,17.24,
+17.59,17.83,18.22,18.47,18.88,19.15,19.53,19.90,20.11,20.54,
+20.89,21.26,21.62,21.96,22.20,22.55,22.80,23.44,23.60,24.08,
+24.18,24.67,24.95,25.49,25.64,26.05,26.32,26.73,27.00,27.45,
+27.73,28.26,28.61,28.67,28.95,29.57,29.92,30.05,30.45,30.81,
+31.17,31.71,32.00,32.15,32.63,32.92,33.01,33.63,34.10,34.31,
+34.58,34.90,35.44,35.77,36.04,36.41,36.57,37.14,37.26,37.66,
+38.04,38.41,38.46,38.98,39.43,39.63,40.07,40.56,40.83,41.12,
+41.22,41.60,41.99,42.43,42.79,43.16,43.38,43.81,44.49,44.55,
+44.64,45.38,45.68,45.99,46.21,46.60,46.97,47.16,47.74,47.72,
+48.34,48.47,48.90,49.39,49.70,50.02,50.19,50.70,50.88,51.30,
+51.81,52.18,52.27,52.71,53.04,53.34,53.91,53.97,54.65,54.63,
+55.17,55.45,55.66,56.26,56.65,56.85,57.02,57.35,57.82,58.32,
+58.64,58.87,59.27,59.55,60.16,60.06,60.65,61.01,61.16,61.88,
+62.00,62.03,62.56,62.93,63.00,63.71,64.14,64.25,64.81,65.15,
+65.46,65.98,66.28,66.41,66.59,66.96,67.13,67.65,67.95,68.54,
+68.83,69.26,69.49,69.91,70.00,70.83,70.83,71.05,71.60,72.01,
+72.16,72.50,72.89,73.20,73.71,73.97,74.40,74.75,74.98,75.27,
+75.65,75.90,76.40,76.64,76.94,77.27,77.70,78.10,78.31,79.06,
+79.36,79.39,80.02,80.45,80.55,81.05,81.16,81.42,81.74,82.42,
+82.57,82.80,83.16,83.57,83.80,84.05,84.41,84.51,85.11,85.67,
+86.13,86.32,86.25,86.97,87.31,87.59,87.92,88.56,88.42,89.11,
+89.30,89.59,89.93,90.33,90.56,90.94,91.66,91.77,92.30,92.12,
+93.04,92.93,93.31,94.19,94.27,94.22,95.24,95.31,95.47,95.62,
+96.03,96.62,96.64,97.19,97.65,97.70,98.02,98.54,98.83,99.49,
+99.91,99.95,100.35,100.82,101.08,101.38,101.79,101.92,102.00,102.56,
+3.49,3.88,4.17,4.45,4.81,5.05,5.39,5.65,5.98,6.32,
+6.64,6.96,7.28,7.61,7.95,8.20,8.46,8.84,9.19,9.56,
+9.83,10.22,10.44,10.77,11.06,11.44,11.67,12.05,12.24,12.67,
+13.01,13.16,13.50,13.88,14.26,14.57,14.86,15.10,15.42,15.77,
+16.08,16.36,16.81,16.99,17.35,17.82,17.80,18.37,18.75,18.87,
+19.37,19.62,19.88,20.27,20.47,20.91,21.29,21.42,21.65,22.18,
+22.38,22.77,22.92,23.25,23.74,23.98,24.26,24.57,24.93,25.11,
+25.48,25.89,26.01,26.31,26.75,27.16,27.56,27.77,27.95,28.50,
+28.69,28.98,29.44,29.61,29.99,30.30,30.57,30.92,31.18,31.50,
+31.82,32.04,32.42,32.77,33.20,33.46,33.80,34.04,34.23,34.60,
+35.04,35.32,35.65,36.03,36.17,36.54,36.85,37.25,37.56,37.96,
+38.08,38.48,38.55,39.11,39.42,39.60,39.88,40.35,40.54,41.07,
+41.37,41.65,41.87,42.37,42.62,43.02,43.26,43.60,43.84,43.99,
+44.46,44.84,44.84,45.39,45.73,46.33,46.29,46.61,47.03,47.29,
+47.51,47.97,48.19,48.63,48.66,49.20,49.61,49.64,49.91,50.44,
+50.54,50.85,51.23,51.57,52.04,52.13,52.70,52.83,53.13,53.62,
+53.85,54.02,54.35,54.73,55.15,55.32,55.70,55.82,56.53,56.85,
+57.21,57.00,57.77,58.10,58.31,58.58,58.86,59.17,59.56,59.77,
+60.08,60.40,60.78,61.35,61.57,61.74,62.09,62.54,62.55,62.85,
+63.14,63.64,63.99,64.24,64.57,64.92,65.17,65.48,65.87,66.10,
+66.52,66.71,67.11,67.53,67.70,68.01,68.54,69.00,69.01,69.53,
+69.39,69.96,70.21,70.33,70.89,71.09,71.82,71.68,71.88,72.59,
+72.87,73.07,73.39,73.91,73.97,74.48,74.71,75.22,75.23,75.63,
+75.88,75.97,76.52,77.04,76.86,77.50,77.47,78.26,78.39,78.80,
+78.97,79.24,79.56,80.07,80.20,80.44,80.91,81.32,81.71,81.90,
+82.27,82.56,82.78,83.22,83.53,83.73,84.45,84.32,84.46,85.16,
+85.36,85.85,85.92,86.27,86.62,86.97,86.93,87.59,87.90,88.37,
+88.31,88.72,89.22,89.11,89.71,90.05,90.26,90.53,90.94,91.06,
+91.54,91.97,92.46,92.64,92.79,92.95,93.49,93.46,94.22,94.36,
+3.24,3.49,3.83,4.03,4.38,4.63,4.92,5.29,5.57,5.87,
+6.12,6.45,6.72,6.97,7.31,7.58,7.82,8.21,8.44,8.70,
+9.03,9.25,9.59,9.87,10.21,10.52,10.74,11.08,11.41,11.70,
+11.79,12.18,12.48,12.71,13.20,13.29,13.70,13.97,14.16,14.44,
+14.81,15.05,15.35,15.71,15.96,16.28,16.48,16.98,17.05,17.43,
+17.69,18.09,18.21,18.55,18.82,19.27,19.51,19.78,20.11,20.31,
+20.66,20.90,21.13,21.50,21.67,21.97,22.34,22.57,22.86,23.16,
+23.59,23.72,24.21,24.38,24.78,25.00,25.12,25.58,25.70,26.09,
+26.47,26.56,26.97,27.18,27.58,27.91,28.15,28.39,28.63,28.93,
+29.36,29.47,29.94,30.38,30.43,30.71,30.98,31.41,31.58,31.89,
+32.30,32.45,32.86,33.04,33.26,33.47,33.92,34.11,34.60,34.90,
+35.24,35.29,35.70,35.78,36.27,36.57,36.92,37.06,37.43,37.76,
+37.90,38.28,38.39,38.73,39.21,39.52,39.57,39.96,40.31,40.51,
+41.02,41.14,41.36,41.90,42.02,42.27,42.59,42.82,43.10,43.46,
+43.85,44.05,44.39,44.73,44.85,45.18,45.57,45.78,46.03,46.48,
+46.85,46.80,47.30,47.47,47.84,48.05,48.53,48.84,49.06,49.33,
+49.53,49.89,50.19,50.47,50.63,50.97,51.25,51.52,51.80,52.25,
+52.27,52.69,53.17,53.49,53.34,53.77,54.13,54.51,54.90,54.90,
+55.36,55.32,55.79,56.05,56.46,56.86,57.02,57.41,57.55,58.13,
+58.49,58.65,58.89,59.16,59.26,59.81,60.01,60.32,60.37,60.76,
+61.05,61.39,61.82,62.06,62.41,62.41,62.71,63.06,63.54,63.74,
+64.29,64.47,64.58,64.78,65.28,65.41,66.02,66.20,66.47,66.70,
+66.90,67.05,67.48,67.59,67.99,68.39,68.60,68.89,69.47,69.61,
+69.78,70.16,70.60,70.78,70.97,71.29,71.56,71.86,72.15,72.62,
+72.67,72.99,73.36,73.64,74.00,74.38,74.42,74.81,75.17,75.39,
+75.26,75.88,76.05,76.39,76.79,77.19,77.28,77.74,78.01,78.21,
+78.54,78.95,78.97,79.43,79.72,79.81,79.96,80.65,80.65,81.35,
+81.29,81.53,82.00,82.11,82.59,82.74,83.40,83.60,83.50,84.05,
+84.36,84.56,85.04,85.14,85.44,85.40,85.89,86.38,86.39,87.02,
+2.98,3.28,3.46,3.81,4.03,4.37,4.62,4.85,5.06,5.38,
+5.63,5.85,6.12,6.34,6.65,6.99,7.16,7.54,7.75,8.05,
+8.27,8.59,8.93,9.00,9.34,9.65,9.87,10.16,10.43,10.71,
+10.96,11.09,11.52,11.71,12.09,12.24,12.50,12.75,13.08,13.40,
+13.67,13.90,14.19,14.44,14.62,14.89,15.16,15.53,15.69,16.02,
+16.23,16.69,16.88,17.06,17.29,17.51,17.93,18.15,18.34,18.69,
+18.96,19.25,19.53,19.60,19.94,20.32,20.49,20.75,21.16,21.43,
+21.58,21.86,22.14,22.47,22.66,23.00,23.33,23.51,23.89,23.94,
+24.09,24.66,24.77,24.99,25.34,25.68,25.82,26.34,26.30,26.62,
+26.82,27.23,27.42,27.59,28.02,28.17,28.50,28.69,29.09,29.26,
+29.65,29.75,30.28,30.36,30.72,30.87,31.15,31.43,31.66,32.03,
+32.33,32.55,32.82,33.18,33.19,33.51,33.95,34.24,34.38,34.54,
+34.95,35.34,35.48,35.68,35.98,36.17,36.50,36.85,36.95,37.23,
+37.54,38.00,38.05,38.43,38.52,38.90,39.30,39.39,39.81,40.23,
+40.15,40.59,40.83,41.04,41.43,41.64,41.90,42.28,42.54,42.73,
+42.72,43.09,43.58,43.55,43.92,44.26,44.66,44.92,45.27,45.50,
+45.69,45.88,46.03,46.28,46.73,46.95,47.23,47.39,47.62,47.95,
+48.24,48.58,48.80,49.06,49.53,49.59,49.80,49.93,50.23,50.60,
+50.93,51.11,51.34,51.56,52.21,52.07,52.51,52.63,53.02,53.21,
+53.38,53.92,54.06,54.30,54.67,54.92,55.04,55.62,55.69,55.85,
+56.32,56.43,56.85,56.87,57.36,57.63,57.90,58.24,58.43,58.37,
+58.82,59.14,59.44,59.69,59.96,60.25,60.50,60.67,61.01,61.30,
+61.53,61.78,62.25,62.23,62.60,63.11,63.27,63.32,63.86,64.06,
+64.36,64.45,64.78,65.13,65.03,65.60,66.03,66.04,66.29,66.59,
+66.94,66.95,67.42,67.60,68.04,68.32,68.41,68.66,69.31,69.08,
+69.82,69.69,70.18,70.05,70.39,70.91,71.08,71.59,71.77,72.13,
+72.35,72.61,72.58,73.18,73.26,73.73,73.92,73.75,74.34,74.40,
+75.08,75.22,75.42,75.73,75.88,76.22,76.55,76.52,77.00,77.55,
+77.39,77.90,78.07,78.12,78.67,79.07,79.48,79.23,79.71,80.08,
+2.73,2.96,3.19,3.44,3.74,3.96,4.20,4.43,4.78,4.94,
+5.24,5.35,5.78,5.94,6.15,6.34,6.64,6.89,7.12,7.33,
+7.64,7.89,8.02,8.44,8.60,8.91,9.10,9.38,9.62,9.79,
+10.16,10.32,10.60,10.78,11.02,11.25,11.52,11.69,12.02,12.30,
+12.63,12.82,13.05,13.15,13.46,13.71,14.02,14.22,14.55,14.67,
+15.07,15.31,15.47,15.82,15.82,16.23,16.43,16.69,16.93,17.16,
+17.30,17.75,17.99,18.20,18.45,18.75,18.92,19.03,19.29,19.60,
+19.87,19.99,20.44,20.73,20.95,21.22,21.23,21.46,21.85,22.11,
+22.31,22.67,22.92,23.05,23.54,23.61,23.86,24.07,24.27,24.45,
+24.87,25.05,25.26,25.48,25.67,26.09,26.31,26.65,26.71,26.97,
+27.29,27.51,27.79,27.83,28.29,28.36,28.63,29.07,29.23,29.46,
+29.80,29.92,30.29,30.40,30.69,30.86,31.01,31.29,31.67,32.02,
+32.37,32.53,32.67,32.79,33.15,33.36,33.56,33.75,34.15,34.31,
+34.62,34.75,35.22,35.61,35.67,35.90,36.05,36.33,36.55,36.86,
+37.16,37.27,37.54,37.90,38.04,38.24,38.50,38.77,38.98,39.31,
+39.59,39.73,39.83,40.26,40.34,40.65,41.01,41.10,41.52,41.93,
+42.07,42.23,42.41,42.78,42.94,43.26,43.45,43.75,44.05,43.85,
+44.32,44.68,44.78,45.24,45.37,45.63,45.71,46.09,46.47,46.62,
+47.03,46.89,47.36,47.71,47.88,48.20,48.46,48.58,48.74,49.40,
+49.29,49.70,49.92,50.15,50.45,50.29,50.67,50.93,51.25,51.72,
+51.92,52.15,52.23,52.40,52.62,52.98,53.23,53.47,53.74,53.98,
+54.14,54.55,54.81,54.75,55.19,55.24,55.52,56.06,56.15,56.40,
+56.88,56.96,57.18,57.27,57.72,57.90,58.20,58.39,58.31,58.93,
+59.17,59.30,59.52,59.76,59.91,60.24,60.72,60.77,61.14,61.66,
+61.64,61.83,62.01,62.08,62.20,62.72,63.11,63.29,63.58,63.76,
+63.97,64.26,64.55,64.70,64.93,65.20,65.31,65.99,65.91,66.22,
+66.40,66.55,66.89,67.18,67.42,67.73,67.99,67.98,68.36,68.92,
+68.92,69.19,69.61,69.46,69.79,69.94,70.43,70.71,70.76,71.09,
+71.43,71.66,71.81,72.05,72.25,72.52,72.74,73.12,73.56,73.39,
+2.51,2.71,2.99,3.18,3.41,3.62,3.81,4.14,4.29,4.53,
+4.80,5.05,5.21,5.50,5.62,5.88,6.16,6.33,6.61,6.79,
+7.04,7.26,7.46,7.68,7.91,8.09,8.38,8.56,8.87,9.08,
+9.21,9.56,9.73,9.96,10.17,10.44,10.58,10.78,11.07,11.33,
+11.63,11.84,12.02,12.20,12.45,12.61,12.82,13.13,13.29,13.65,
+13.75,13.96,14.17,14.41,14.76,14.95,15.21,15.43,15.48,15.83,
+16.11,16.25,16.59,16.78,16.98,17.21,17.44,17.64,17.71,18.05,
+18.27,18.66,18.73,18.92,19.24,19.51,19.50,19.95,20.05,20.36,
+20.56,20.64,21.07,21.21,21.38,21.80,21.81,22.14,22.42,22.51,
+22.92,23.23,23.44,23.67,23.69,24.03,24.23,24.51,24.66,24.86,
+25.10,25.37,25.56,25.62,26.00,26.28,26.44,26.60,26.93,27.17,
+27.47,27.56,27.86,27.92,28.11,28.54,28.52,28.87,29.11,29.28,
+29.51,29.93,30.08,30.23,30.41,30.66,31.09,31.16,31.37,31.61,
+31.56,32.13,32.41,32.48,32.85,32.90,33.08,33.41,33.61,33.73,
+34.11,34.29,34.45,34.73,34.83,35.20,35.20,35.68,35.87,36.38,
+36.28,36.48,37.01,37.01,37.29,37.45,37.78,37.97,38.20,38.38,
+38.63,39.00,39.09,39.24,39.43,39.83,40.18,40.03,40.36,40.73,
+40.94,40.96,41.36,41.53,41.67,42.05,42.05,42.48,42.59,42.91,
+43.23,43.47,43.47,43.99,44.12,44.23,44.28,44.46,44.92,45.09,
+45.32,45.42,45.78,46.01,46.22,46.39,46.53,47.06,47.21,47.25,
+47.74,47.84,48.02,48.20,48.45,48.80,48.94,49.22,49.34,49.35,
+49.84,50.13,50.46,50.53,50.62,51.11,51.27,51.26,51.80,51.83,
+52.12,52.65,52.56,52.84,53.08,53.17,53.41,53.59,54.01,54.08,
+54.28,54.51,54.88,55.07,55.38,55.60,55.75,55.73,56.19,56.45,
+56.41,56.94,56.95,57.60,57.41,57.70,57.99,58.25,58.17,58.59,
+59.15,59.11,59.25,59.35,59.94,59.86,60.20,60.43,60.77,60.82,
+61.18,61.39,61.73,61.75,61.75,62.23,62.67,63.01,62.93,63.23,
+63.37,63.59,63.93,64.06,64.27,64.49,64.52,65.09,65.13,65.44,
+65.70,66.00,66.20,66.35,66.50,66.76,67.10,67.24,67.56,67.54,
+2.33,2.49,2.71,2.91,3.12,3.37,3.51,3.72,3.93,4.16,
+4.39,4.63,4.80,4.94,5.21,5.44,5.58,5.84,6.08,6.28,
+6.45,6.69,6.90,7.12,7.38,7.54,7.80,7.94,8.16,8.34,
+8.50,8.72,8.93,9.14,9.43,9.64,9.82,9.94,10.29,10.40,
+10.54,11.00,11.01,11.23,11.34,11.68,12.00,12.05,12.35,12.55,
+12.70,12.95,13.17,13.16,13.50,13.60,13.95,14.14,14.40,14.62,
+14.85,15.04,15.16,15.35,15.67,15.70,16.01,16.33,16.33,16.53,
+16.77,17.03,17.18,17.47,17.79,17.87,17.91,18.20,18.53,18.63,
+18.90,19.23,19.18,19.60,19.73,20.07,20.08,20.30,20.58,20.71,
+21.07,21.22,21.32,21.73,21.83,22.00,22.08,22.37,22.63,22.92,
+23.15,23.31,23.52,23.66,23.92,24.22,24.33,24.60,24.60,24.84,
+25.26,25.35,25.51,25.79,25.89,26.26,26.44,26.72,26.86,27.13,
+27.19,27.31,27.72,27.82,27.85,28.23,28.65,28.70,28.75,29.07,
+29.30,29.39,29.72,29.88,30.09,30.42,30.45,30.76,30.95,30.97,
+31.36,31.46,31.72,31.83,32.21,32.34,32.69,32.77,32.91,33.26,
+33.45,33.78,33.92,34.00,34.18,34.52,34.76,34.81,34.94,35.39,
+35.53,35.78,35.99,36.05,36.50,36.58,36.85,37.03,37.24,37.36,
+37.67,37.88,37.98,38.05,38.28,38.55,38.83,39.07,39.20,39.41,
+39.62,39.82,40.30,40.30,40.46,40.90,40.99,41.06,41.26,41.47,
+41.69,41.85,41.99,42.10,42.51,42.66,43.05,43.17,43.34,43.80,
+43.80,43.87,44.39,44.33,44.47,44.88,44.96,45.19,45.45,45.90,
+46.08,46.16,46.61,46.62,46.55,47.06,47.12,47.19,47.39,47.52,
+47.71,48.05,48.27,48.75,49.13,49.14,49.06,49.32,49.65,49.71,
+50.03,50.00,50.57,50.76,50.92,50.90,51.26,51.39,51.63,51.55,
+52.21,52.32,52.74,52.72,52.94,53.15,53.16,53.96,53.68,54.17,
+54.17,54.57,54.52,54.95,54.92,55.31,55.52,55.56,55.87,56.09,
+56.44,56.67,56.97,56.82,56.83,57.13,57.71,57.77,57.93,58.11,
+58.23,58.61,58.91,59.15,59.31,59.38,59.44,59.82,59.85,60.23,
+60.62,60.65,60.80,61.07,61.06,61.27,61.81,61.68,62.00,62.10,
+2.11,2.33,2.47,2.73,2.88,3.11,3.27,3.47,3.67,3.83,
+4.02,4.21,4.35,4.64,4.81,5.00,5.13,5.37,5.55,5.74,
+5.94,6.15,6.38,6.50,6.69,6.91,7.10,7.31,7.52,7.67,
+7.84,8.02,8.15,8.53,8.53,8.81,9.02,9.25,9.38,9.57,
+9.76,9.95,10.17,10.25,10.54,10.58,10.92,11.06,11.32,11.44,
+11.62,11.87,11.96,12.20,12.37,12.69,12.82,13.00,13.23,13.47,
+13.58,13.85,13.99,14.14,14.22,14.48,14.80,14.94,15.10,15.32,
+15.53,15.64,15.84,15.93,16.21,16.53,16.68,16.83,16.95,17.16,
+17.28,17.57,17.89,17.95,18.06,18.35,18.45,18.88,18.86,19.30,
+19.21,19.48,19.76,20.07,19.91,20.20,20.44,20.44,21.06,20.99,
+21.22,21.44,21.53,21.77,22.10,22.31,22.36,22.58,22.82,22.90,
+23.13,23.30,23.53,23.70,23.90,24.28,24.21,24.33,24.61,24.83,
+24.99,25.14,25.45,25.47,25.80,26.16,26.35,26.46,26.55,26.83,
+26.89,27.24,27.47,27.73,27.82,27.88,28.10,28.34,28.30,28.83,
+28.77,28.96,29.22,29.50,29.69,29.95,30.05,30.11,30.40,30.62,
+30.70,30.83,31.17,31.36,31.69,31.63,31.97,31.89,32.43,32.63,
+32.51,32.64,32.99,33.12,33.52,33.71,33.87,33.86,34.18,34.33,
+34.38,34.99,35.04,35.15,35.53,35.44,35.62,35.98,36.12,36.23,
+36.41,36.75,36.82,36.95,37.28,37.49,37.72,37.81,37.84,38.05,
+38.40,38.58,38.70,38.89,39.18,39.26,39.61,39.64,39.78,40.11,
+40.40,40.66,40.84,40.73,41.12,41.22,41.41,41.33,41.77,41.95,
+42.33,42.27,42.70,42.77,43.01,43.03,43.58,43.52,43.66,44.02,
+44.25,44.43,44.47,44.54,45.11,44.92,45.27,45.18,45.59,45.58,
+46.02,46.28,46.58,46.56,46.67,46.94,47.11,47.17,47.60,47.78,
+47.67,48.29,48.36,48.48,48.81,48.71,49.17,49.17,49.47,49.56,
+49.80,50.04,50.36,50.52,50.72,50.87,51.00,51.44,51.38,51.48,
+51.75,52.06,51.87,52.31,52.45,52.60,52.94,53.23,53.14,53.40,
+53.51,53.71,54.21,54.42,54.54,54.62,54.95,55.05,55.09,55.22,
+55.40,55.76,55.84,55.92,56.46,56.50,56.68,57.03,57.02,57.45,
+1.94,2.11,2.31,2.47,2.53,2.87,2.99,3.23,3.43,3.48,
+3.71,3.89,4.00,4.26,4.41,4.61,4.75,4.91,5.16,5.31,
+5.48,5.68,5.86,5.99,6.16,6.26,6.42,6.72,6.92,7.03,
+7.20,7.40,7.57,7.75,7.92,8.01,8.28,8.39,8.54,8.72,
+9.03,9.16,9.31,9.43,9.63,9.84,10.12,10.21,10.39,10.52,
+10.77,10.89,11.09,11.29,11.51,11.64,11.83,12.05,12.13,12.29,
+12.43,12.64,12.80,13.09,13.12,13.28,13.65,13.66,13.81,14.09,
+14.30,14.46,14.69,14.83,15.00,14.99,15.36,15.42,15.67,15.81,
+16.07,16.32,16.54,16.57,16.68,16.94,17.09,17.24,17.41,17.57,
+17.70,18.02,18.20,18.27,18.49,18.70,18.72,19.21,19.18,19.39,
+19.54,19.63,19.91,20.10,20.20,20.37,20.66,20.63,20.98,21.07,
+21.44,21.23,21.60,21.77,22.01,22.01,22.37,22.46,22.73,22.75,
+22.96,23.27,23.35,23.47,23.73,24.08,24.12,24.21,24.37,24.51,
+24.69,24.77,25.18,25.32,25.41,25.60,25.98,26.10,26.01,26.35,
+26.53,26.84,26.96,26.98,27.16,27.45,27.67,27.82,27.77,28.04,
+28.15,28.59,28.70,28.68,28.99,29.34,29.33,29.49,29.79,29.88,
+30.02,30.17,30.58,30.45,30.75,30.83,31.07,31.24,31.40,31.50,
+31.69,31.97,32.08,32.39,32.46,32.70,32.80,33.11,33.24,33.44,
+33.41,33.67,33.69,34.21,34.15,34.38,34.65,34.82,34.96,35.22,
+35.43,35.41,35.68,35.89,36.00,36.25,36.42,36.57,36.68,36.75,
+37.21,37.18,37.41,37.72,37.70,37.81,38.19,38.43,38.34,38.74,
+38.67,39.00,39.25,39.43,39.59,39.54,39.81,40.11,40.05,40.39,
+40.74,40.85,41.22,41.26,41.39,41.37,41.80,41.74,41.88,42.38,
+42.46,42.59,42.73,43.10,43.18,43.33,43.51,43.55,43.85,43.85,
+44.27,44.41,44.57,44.62,44.64,45.01,45.21,45.68,45.58,45.47,
+46.03,46.27,46.36,46.52,46.63,46.43,46.88,47.17,47.49,47.57,
+47.66,47.74,48.16,48.23,48.56,48.63,48.57,48.99,49.09,49.23,
+49.40,49.57,49.85,49.71,50.19,50.38,50.62,50.62,50.91,51.01,
+51.09,51.46,51.56,51.76,51.65,51.87,52.10,52.35,52.53,52.48,
+1.82,1.94,2.12,2.28,2.49,2.62,2.73,2.91,3.03,3.28,
+3.35,3.57,3.69,3.87,4.04,4.21,4.34,4.53,4.74,4.80,
+4.97,5.23,5.36,5.48,5.72,5.79,6.01,6.14,6.39,6.49,
+6.66,6.86,6.90,7.18,7.24,7.43,7.65,7.72,7.90,8.07,
+8.20,8.44,8.58,8.73,8.97,9.03,9.18,9.24,9.56,9.73,
+9.91,10.04,10.16,10.37,10.44,10.72,10.82,10.97,11.12,11.23,
+11.59,11.68,11.73,11.93,12.08,12.25,12.47,12.65,12.90,12.86,
+13.07,13.29,13.52,13.69,13.71,13.93,14.10,14.21,14.41,14.59,
+14.62,14.91,15.18,15.22,15.37,15.69,15.71,15.94,16.03,16.16,
+16.42,16.59,16.59,16.77,17.02,17.06,17.36,17.48,17.70,17.90,
+17.98,18.01,18.33,18.33,18.64,18.89,19.02,18.94,19.18,19.34,
+19.64,19.70,19.89,20.11,20.00,20.37,20.48,20.71,20.83,20.89,
+21.08,21.17,21.47,21.69,21.81,22.05,22.33,22.25,22.39,22.62,
+22.73,22.97,23.20,23.22,23.32,23.71,23.75,23.91,24.04,24.18,
+24.46,24.44,24.64,24.84,25.20,25.13,25.36,25.53,25.66,25.89,
+26.18,26.28,26.31,26.59,26.82,26.87,27.03,27.21,27.20,27.51,
+27.64,27.80,28.00,28.18,28.14,28.49,28.79,28.91,29.11,29.08,
+29.14,29.34,29.66,29.85,29.84,30.25,30.38,30.59,30.49,30.79,
+30.62,30.97,31.15,31.30,31.41,31.77,31.83,31.92,32.21,32.33,
+32.62,32.59,32.89,32.86,33.00,33.34,33.45,33.77,33.78,33.92,
+34.08,34.46,34.47,34.55,34.72,34.85,35.12,35.25,35.38,35.49,
+35.70,35.87,36.08,36.00,36.44,36.63,36.63,36.86,37.12,37.18,
+37.39,37.42,37.60,37.91,37.88,38.11,38.47,38.47,38.56,39.05,
+38.98,39.07,39.31,39.27,39.50,39.74,40.02,39.95,40.32,40.42,
+40.41,40.64,40.90,41.02,41.35,41.33,41.85,41.67,41.78,42.11,
+42.21,42.27,42.73,42.69,43.12,42.92,43.21,43.29,43.41,43.61,
+43.72,43.63,44.05,44.15,44.55,44.64,44.86,44.99,45.12,45.47,
+45.34,45.51,45.71,45.83,46.00,46.33,46.48,46.34,46.71,46.97,
+46.98,47.17,47.21,47.37,47.76,47.91,47.87,48.05,48.27,48.38,
+1.66,1.85,1.96,2.08,2.24,2.32,2.56,2.71,2.80,2.93,
+3.16,3.33,3.48,3.57,3.65,3.89,3.98,4.18,4.33,4.44,
+4.63,4.76,4.93,5.07,5.25,5.37,5.46,5.66,5.81,6.03,
+6.16,6.29,6.43,6.45,6.58,6.86,7.01,7.21,7.27,7.46,
+7.63,7.71,7.84,8.06,8.22,8.35,8.46,8.67,8.86,8.93,
+9.26,9.30,9.35,9.50,9.63,9.89,9.98,10.25,10.17,10.34,
+10.53,10.80,10.85,11.13,11.10,11.30,11.51,11.67,11.80,11.95,
+12.05,12.29,12.45,12.53,12.79,12.90,12.87,13.19,13.24,13.58,
+13.59,13.54,13.80,14.07,14.08,14.34,14.44,14.61,14.68,14.86,
+14.94,15.17,15.38,15.51,15.63,15.81,15.93,16.19,16.28,16.56,
+16.55,16.56,16.83,17.08,17.12,17.27,17.53,17.58,17.65,17.95,
+18.06,18.20,18.27,18.45,18.64,18.76,18.82,19.06,19.22,19.31,
+19.44,19.59,19.78,20.09,20.14,20.27,20.46,20.57,20.80,20.98,
+21.02,21.05,21.34,21.41,21.39,21.69,21.94,22.15,22.19,22.29,
+22.55,22.62,22.72,22.84,23.00,23.32,23.38,23.78,23.77,23.85,
+24.04,23.93,24.22,24.41,24.67,24.68,24.88,24.85,25.20,25.19,
+25.46,25.58,25.84,25.97,25.98,26.14,26.41,26.34,26.53,26.90,
+26.98,26.98,27.14,27.41,27.46,27.62,27.89,28.03,28.11,28.10,
+28.39,28.63,28.71,28.98,28.77,29.12,29.22,29.43,29.57,29.76,
+29.79,30.02,30.17,30.21,30.48,30.48,30.71,30.96,31.10,31.36,
+31.47,31.56,31.59,31.68,32.08,32.12,32.24,32.31,32.54,32.77,
+32.91,33.10,33.07,33.39,33.59,33.67,33.66,33.87,34.16,34.26,
+34.38,34.58,34.81,34.76,34.93,35.16,35.28,35.25,35.74,35.74,
+35.85,36.03,35.99,36.23,36.45,36.52,36.77,36.92,37.08,37.09,
+37.36,37.48,37.60,37.71,37.71,38.08,38.18,38.32,38.57,38.70,
+38.56,38.96,39.07,39.12,39.37,39.93,39.67,39.91,39.96,40.03,
+40.35,40.55,40.57,40.91,41.01,41.13,41.15,41.26,41.59,41.74,
+41.70,41.95,42.16,42.48,42.61,42.49,42.77,42.95,43.02,43.08,
+43.29,43.36,43.55,43.64,43.95,44.09,44.03,44.32,44.42,44.52,
+1.57,1.62,1.80,1.92,2.03,2.24,2.30,2.47,2.61,2.74,
+2.87,3.03,3.17,3.27,3.44,3.59,3.77,3.88,3.95,4.10,
+4.29,4.37,4.51,4.67,4.83,4.89,5.08,5.16,5.45,5.57,
+5.53,5.75,5.98,5.99,6.18,6.29,6.44,6.55,6.70,6.86,
+7.07,7.06,7.28,7.37,7.52,7.68,7.85,7.94,8.15,8.27,
+8.33,8.53,8.62,8.78,8.88,9.09,9.16,9.44,9.52,9.60,
+9.66,9.90,9.94,10.19,10.24,10.27,10.57,10.66,10.79,11.01,
+11.09,11.33,11.45,11.60,11.63,11.70,11.83,11.99,12.38,12.37,
+12.43,12.60,12.64,12.91,13.03,13.16,13.34,13.54,13.41,13.60,
+13.76,13.89,14.07,14.22,14.42,14.44,14.78,14.71,14.90,15.16,
+15.11,15.29,15.34,15.54,15.73,15.84,16.10,16.23,16.54,16.41,
+16.50,16.73,16.83,16.99,17.07,17.22,17.34,17.61,17.65,17.81,
+17.96,18.14,18.09,18.42,18.48,18.59,18.91,18.75,18.95,19.09,
+19.29,19.54,19.54,19.68,19.76,20.10,20.01,20.21,20.42,20.56,
+20.63,20.82,20.73,21.22,21.06,21.24,21.62,21.63,21.64,21.78,
+22.08,22.20,22.31,22.43,22.64,22.78,22.90,23.00,23.21,23.09,
+23.32,23.44,23.61,23.72,23.83,24.05,24.15,24.32,24.61,24.56,
+24.68,24.83,24.90,25.14,25.25,25.34,25.62,25.77,25.98,26.11,
+26.02,26.10,26.32,26.74,26.74,26.86,26.88,27.09,27.28,27.53,
+27.55,27.61,27.98,27.79,28.06,28.16,28.15,28.54,28.70,28.75,
+28.82,29.23,29.11,29.50,29.30,29.47,29.72,29.65,30.05,30.05,
+30.29,30.52,30.61,30.55,30.90,30.94,31.04,31.07,31.32,31.55,
+31.67,31.88,31.88,32.03,32.21,32.22,32.50,32.25,32.51,32.82,
+33.02,33.01,33.33,33.40,33.74,33.73,33.71,34.15,33.98,34.18,
+34.36,34.39,34.66,34.98,34.97,34.86,35.38,35.23,35.20,35.47,
+35.80,36.03,35.92,36.08,36.30,36.18,36.44,36.75,36.86,36.76,
+37.18,37.16,37.26,37.27,37.66,37.81,37.66,38.06,38.24,38.31,
+38.52,38.53,38.91,38.73,39.07,38.81,39.40,39.30,39.57,39.58,
+39.70,39.91,40.38,40.20,40.11,40.44,40.60,40.94,40.74,41.09,
+1.44,1.56,1.60,1.77,1.95,2.02,2.14,2.26,2.40,2.51,
+2.66,2.77,2.88,3.04,3.21,3.31,3.44,3.50,3.72,3.80,
+3.95,4.06,4.16,4.33,4.47,4.58,4.70,4.68,4.88,4.99,
+5.16,5.24,5.39,5.55,5.72,5.76,5.92,6.14,6.25,6.39,
+6.39,6.47,6.68,6.83,6.88,7.00,7.05,7.30,7.39,7.55,
+7.52,7.88,7.83,8.02,8.20,8.26,8.39,8.63,8.55,8.82,
+8.99,9.05,9.26,9.35,9.52,9.49,9.87,9.80,9.90,10.17,
+10.05,10.27,10.40,10.62,10.57,10.79,10.96,11.04,11.27,11.29,
+11.45,11.59,11.79,11.87,11.89,12.03,12.09,12.38,12.47,12.50,
+12.74,12.87,12.86,13.19,13.26,13.51,13.46,13.55,13.68,13.70,
+13.92,14.03,14.16,14.30,14.47,14.58,14.68,14.97,14.92,15.13,
+15.30,15.38,15.57,15.67,15.76,15.80,15.98,16.11,16.23,16.46,
+16.50,16.62,16.76,16.77,16.94,17.28,17.16,17.41,17.44,17.48,
+17.68,18.01,18.02,18.11,18.23,18.42,18.42,18.73,18.73,18.84,
+18.83,19.02,19.20,19.39,19.54,19.59,19.84,20.04,19.99,20.14,
+20.15,20.31,20.50,20.66,21.05,20.95,20.97,21.00,21.34,21.42,
+21.55,21.60,21.82,21.95,21.98,22.16,22.46,22.34,22.68,22.70,
+22.74,22.84,23.13,23.16,23.32,23.42,23.57,23.56,23.70,23.77,
+24.09,24.15,24.14,24.16,24.37,24.85,24.88,24.90,24.96,24.97,
+25.46,25.63,25.66,25.58,25.75,26.05,26.00,26.18,26.37,26.39,
+26.60,26.52,26.85,26.67,27.06,27.09,27.36,27.42,27.73,27.78,
+27.75,27.82,27.84,28.34,28.58,28.48,28.48,28.65,28.53,28.86,
+29.23,29.22,29.22,29.54,29.68,29.59,29.85,29.98,29.75,30.45,
+30.20,30.38,30.43,30.71,30.80,31.15,31.18,31.15,31.38,31.54,
+31.42,31.83,31.81,31.76,32.23,32.27,32.24,32.31,32.74,32.65,
+32.91,33.02,33.23,33.31,33.27,33.44,33.39,33.56,33.78,34.01,
+33.92,34.17,34.27,34.55,34.67,34.61,35.08,35.03,35.13,35.05,
+35.30,35.39,35.83,35.84,35.94,35.97,36.42,36.24,36.40,36.45,
+36.73,36.57,36.96,37.10,37.35,37.15,37.27,37.44,37.70,37.72,
+1.31,1.45,1.56,1.67,1.79,1.86,1.99,2.15,2.21,2.30,
+2.41,2.58,2.67,2.77,2.87,3.00,3.14,3.29,3.42,3.50,
+3.58,3.72,3.82,3.93,4.05,4.18,4.24,4.42,4.53,4.67,
+4.78,4.85,5.03,5.10,5.32,5.31,5.42,5.66,5.64,5.83,
+5.94,6.09,6.25,6.14,6.40,6.42,6.58,6.71,6.79,6.90,
+7.05,7.25,7.42,7.39,7.53,7.68,7.78,7.77,8.01,8.11,
+8.18,8.34,8.46,8.66,8.65,8.85,8.91,9.10,9.16,9.19,
+9.43,9.55,9.67,9.69,9.81,9.96,10.15,10.19,10.33,10.47,
+10.52,10.62,10.69,10.87,10.94,11.17,11.29,11.27,11.58,11.53,
+11.70,11.78,11.75,12.08,12.27,12.30,12.24,12.67,12.70,12.77,
+12.90,12.89,13.12,13.23,13.21,13.53,13.63,13.80,13.95,13.94,
+14.06,13.99,14.28,14.51,14.46,14.52,14.73,14.83,15.00,15.09,
+15.20,15.31,15.47,15.66,15.59,15.85,15.90,15.98,16.20,16.31,
+16.31,16.43,16.49,16.63,16.83,16.88,17.06,17.06,17.28,17.43,
+17.55,17.54,17.83,17.76,18.12,17.89,18.39,18.28,18.55,18.57,
+18.63,18.87,19.01,19.00,19.07,19.20,19.25,19.46,19.53,19.54,
+19.76,20.00,20.05,20.21,20.34,20.41,20.54,20.70,20.68,21.02,
+20.85,21.01,21.29,21.45,21.40,21.61,21.75,21.79,21.82,22.19,
+22.18,22.28,22.42,22.37,22.61,22.51,22.66,22.85,22.97,23.00,
+23.08,23.47,23.59,23.72,23.91,23.85,24.05,24.16,24.36,24.34,
+24.12,24.50,24.67,24.81,24.89,25.21,25.11,25.24,25.52,25.33,
+25.55,25.73,25.89,25.80,25.91,26.13,26.39,26.33,26.53,26.68,
+26.56,27.13,26.98,27.01,27.14,27.23,27.30,27.44,27.61,27.70,
+27.68,28.23,28.13,28.49,28.55,28.43,28.56,28.52,28.71,29.01,
+29.24,29.20,29.36,29.59,29.28,29.64,29.85,29.67,30.12,30.03,
+30.34,30.37,30.52,30.36,30.69,31.07,30.90,31.01,31.01,31.31,
+31.24,31.48,31.71,31.62,31.87,32.16,32.22,32.27,32.46,32.56,
+32.41,32.58,32.82,32.87,32.86,33.15,33.29,33.34,33.36,33.50,
+33.68,33.80,33.87,33.90,34.05,34.32,34.39,34.48,34.44,34.61,
+4.08,4.42,4.74,5.17,5.48,5.92,6.20,6.63,6.94,7.33,
+7.61,8.05,8.44,8.76,9.03,9.41,9.85,10.23,10.54,10.84,
+11.21,11.60,12.07,12.40,12.79,13.08,13.54,13.73,14.20,14.48,
+14.90,15.20,15.55,15.85,16.31,16.75,17.10,17.55,17.80,18.22,
+18.53,18.71,19.21,19.62,20.04,20.17,20.68,21.03,21.35,21.71,
+22.14,22.57,22.84,23.03,23.47,24.07,24.22,24.56,25.00,25.27,
+25.86,26.12,26.34,26.91,27.10,27.53,27.84,28.13,28.66,28.83,
+29.19,29.72,29.81,30.43,30.70,31.12,31.48,31.98,32.10,32.63,
+32.77,33.29,33.72,33.95,34.14,34.63,35.16,35.33,35.80,36.21,
+36.49,36.93,37.12,37.54,37.74,38.20,38.66,39.07,39.30,39.56,
+40.14,40.60,40.97,41.32,41.44,41.84,42.34,42.72,43.09,43.14,
+43.67,43.93,44.60,44.77,45.03,45.56,45.80,46.12,46.67,47.04,
+47.11,47.36,47.99,48.18,48.74,49.16,49.41,49.78,50.11,50.61,
+50.87,51.18,51.47,51.90,52.27,52.54,52.97,53.49,53.82,54.15,
+54.74,54.71,55.08,55.51,55.94,56.24,56.48,57.29,57.24,57.84,
+58.22,58.47,58.94,59.27,59.56,59.85,60.18,60.80,60.91,61.33,
+61.71,61.98,62.54,62.70,62.94,63.15,63.78,64.22,64.50,65.00,
+65.19,65.48,66.16,66.48,66.87,67.17,67.36,67.66,68.07,68.50,
+68.73,69.36,69.46,70.09,70.34,70.66,70.94,71.37,71.69,72.12,
+72.64,72.92,73.16,73.66,73.93,74.15,74.63,75.18,75.40,75.83,
+76.08,76.56,76.75,77.36,77.49,78.17,78.28,78.66,78.70,79.37,
+79.63,79.92,80.77,80.86,81.05,81.66,81.91,82.39,82.78,82.83,
+83.45,83.70,83.81,84.48,84.87,85.21,85.31,85.63,86.16,86.33,
+86.99,86.85,87.68,87.99,88.15,88.69,88.88,89.57,89.64,90.14,
+90.42,90.77,91.20,91.52,91.85,92.39,92.67,92.72,93.30,93.67,
+94.07,94.36,94.73,95.29,95.39,95.95,96.29,96.51,96.64,97.73,
+97.61,98.17,98.59,98.55,98.74,99.70,99.84,100.16,100.38,100.61,
+101.54,101.57,102.31,102.20,102.68,102.96,103.43,103.71,104.05,104.53,
+105.07,105.02,105.73,105.80,106.50,106.20,107.17,107.73,107.71,107.97,
+3.76,4.11,4.52,4.88,5.12,5.47,5.75,6.13,6.51,6.81,
+7.13,7.55,7.76,8.10,8.44,8.84,9.12,9.46,9.88,10.16,
+10.38,10.85,11.21,11.52,11.87,12.11,12.52,12.88,13.19,13.46,
+13.88,14.16,14.47,14.83,15.20,15.53,15.81,16.22,16.57,16.91,
+17.10,17.68,17.87,18.18,18.43,18.71,19.10,19.58,19.88,20.19,
+20.68,20.92,21.05,21.55,21.88,22.09,22.61,22.85,23.36,23.67,
+23.81,24.25,24.46,24.72,25.19,25.58,25.88,26.23,26.46,26.88,
+27.22,27.64,27.89,28.38,28.47,29.07,29.26,29.54,29.79,30.29,
+30.64,30.93,31.18,31.67,31.84,32.41,32.83,32.78,33.36,33.66,
+33.82,34.36,34.60,35.00,35.23,35.48,35.77,36.40,36.65,36.85,
+37.06,37.54,37.75,38.37,38.47,39.10,39.28,39.77,39.93,40.09,
+40.60,40.95,41.30,41.44,41.98,42.28,42.64,42.83,43.34,43.70,
+44.06,44.40,44.53,44.82,45.41,45.42,45.96,46.25,46.83,46.84,
+47.49,47.58,48.12,48.40,48.48,49.13,49.40,49.74,50.19,50.25,
+50.79,51.23,51.50,51.70,51.86,52.36,52.73,53.02,53.16,53.72,
+53.89,54.36,54.70,55.12,55.43,55.57,56.12,56.35,56.69,56.92,
+57.37,57.84,58.16,58.38,58.83,59.19,59.64,59.64,60.21,60.13,
+60.56,61.03,61.36,61.70,62.07,62.29,62.80,63.14,63.45,63.76,
+64.16,64.36,64.84,65.21,65.42,65.75,66.18,66.53,66.72,66.76,
+67.65,67.88,68.09,68.39,68.44,69.21,69.39,69.61,70.37,70.29,
+70.75,71.34,71.64,71.85,72.09,72.24,72.74,73.19,73.39,73.48,
+74.27,74.30,74.63,75.22,75.66,75.83,76.05,76.56,76.70,77.31,
+77.49,77.79,78.30,78.50,78.61,78.97,79.55,79.83,80.13,80.40,
+80.67,81.04,81.32,81.52,82.06,82.50,82.85,83.28,83.74,83.50,
+84.11,84.53,84.68,85.04,85.47,85.82,86.13,86.48,86.76,87.23,
+87.47,87.77,88.15,88.48,88.77,89.35,89.28,89.79,90.22,90.68,
+90.89,91.16,91.60,91.97,92.15,92.51,92.71,93.12,93.53,94.25,
+94.08,94.70,94.75,95.12,95.49,95.91,96.16,96.83,97.04,97.30,
+97.54,97.60,98.09,98.31,98.47,99.15,99.63,99.76,100.41,100.57,
+3.48,3.84,4.09,4.51,4.82,5.08,5.37,5.66,6.06,6.27,
+6.65,6.95,7.32,7.54,7.95,8.17,8.58,8.82,9.11,9.42,
+9.65,10.15,10.25,10.63,11.00,11.20,11.61,11.98,12.26,12.54,
+12.93,13.18,13.44,13.70,14.11,14.40,14.79,15.13,15.36,15.67,
+16.08,16.35,16.65,16.82,17.20,17.60,17.76,18.17,18.66,18.78,
+19.10,19.47,19.64,20.14,20.38,20.78,20.95,21.26,21.61,21.99,
+22.32,22.53,22.86,23.05,23.31,23.69,24.17,24.45,24.77,24.97,
+25.09,25.72,25.84,26.15,26.45,26.75,27.22,27.57,27.87,28.26,
+28.45,28.81,29.16,29.27,29.64,29.98,30.34,30.51,30.93,31.21,
+31.58,31.71,32.31,32.38,32.74,33.07,33.39,33.77,34.16,34.29,
+34.84,34.98,35.31,35.60,35.95,36.20,36.54,37.13,37.17,37.36,
+37.84,38.13,38.49,38.82,39.02,39.33,39.72,39.94,40.22,40.61,
+40.87,40.85,41.48,41.82,42.03,42.48,42.66,42.94,43.45,43.70,
+44.10,44.46,44.86,44.85,45.38,45.50,45.81,46.19,46.61,46.87,
+47.20,47.62,47.77,47.99,48.19,48.99,49.24,49.28,49.51,50.05,
+50.07,50.66,50.78,51.03,51.62,51.92,52.17,52.54,52.76,53.02,
+53.51,53.72,54.00,54.33,54.72,54.83,55.32,55.41,55.79,56.07,
+56.46,56.66,57.09,57.28,57.78,58.08,58.27,58.74,59.18,59.18,
+59.72,60.06,60.07,60.57,60.89,61.17,61.37,61.60,62.16,62.13,
+62.79,63.28,63.34,63.74,63.84,64.26,64.57,64.88,65.32,65.54,
+65.68,65.85,66.47,66.75,67.00,67.61,67.86,67.88,68.23,68.55,
+68.97,69.39,69.44,69.76,70.33,70.56,70.84,71.19,71.18,71.58,
+72.20,72.34,72.48,72.95,73.09,73.29,73.81,74.25,74.72,75.25,
+75.31,75.20,75.54,76.00,76.31,76.93,77.02,77.33,77.48,77.76,
+78.31,78.44,78.70,79.12,79.44,79.74,80.26,80.27,80.70,80.88,
+81.46,81.62,81.91,82.16,82.65,83.22,83.03,83.43,83.80,84.46,
+84.53,84.70,84.96,85.28,85.88,86.24,86.20,86.83,87.06,87.19,
+87.19,87.58,88.49,88.69,88.95,89.17,89.20,89.72,90.15,90.66,
+90.60,91.12,91.32,91.64,92.00,92.26,92.33,92.64,93.30,93.43,
+3.31,3.56,3.87,4.13,4.40,4.72,5.03,5.37,5.54,5.91,
+6.20,6.43,6.71,7.01,7.38,7.56,7.95,8.14,8.45,8.83,
+9.07,9.43,9.57,9.90,10.22,10.55,10.87,11.11,11.42,11.73,
+11.98,12.27,12.49,12.74,13.06,13.47,13.78,13.99,14.18,14.63,
+14.88,15.08,15.47,15.75,16.08,16.34,16.63,16.90,17.19,17.53,
+17.82,18.03,18.42,18.76,19.02,19.11,19.63,19.74,20.10,20.38,
+20.69,21.03,21.28,21.46,21.79,22.14,22.32,22.83,23.03,23.20,
+23.50,23.88,24.15,24.34,24.66,25.05,25.34,25.60,25.88,26.15,
+26.35,26.61,26.94,27.42,27.45,27.96,28.15,28.57,28.70,29.13,
+29.36,29.59,29.79,30.16,30.45,30.83,31.20,31.49,31.78,31.80,
+32.12,32.51,32.94,33.10,33.32,33.53,34.23,34.41,34.52,35.01,
+35.19,35.35,35.81,36.04,36.36,36.59,36.87,37.17,37.45,37.71,
+38.07,38.22,38.58,38.80,39.18,39.44,39.82,40.08,40.41,40.55,
+40.61,41.24,41.51,41.82,42.19,42.49,42.66,43.00,43.19,43.41,
+43.87,44.10,44.27,44.96,44.97,45.31,45.76,45.85,46.42,46.25,
+46.69,47.08,47.24,47.63,47.91,48.10,48.52,48.76,49.12,49.27,
+49.38,49.92,50.22,50.41,50.84,51.21,51.41,51.70,51.86,52.25,
+52.49,52.63,53.12,53.34,53.58,54.19,54.53,54.49,54.73,55.14,
+55.58,55.58,55.89,56.34,56.39,56.93,57.34,57.38,57.69,57.97,
+58.22,58.79,58.87,59.32,59.46,59.89,59.94,60.38,60.55,61.00,
+60.98,61.46,61.99,62.26,62.41,62.51,62.81,63.21,63.53,63.69,
+64.08,64.32,64.89,65.07,65.26,65.74,65.84,65.92,66.44,66.79,
+67.04,67.34,67.61,67.94,68.21,68.32,68.62,69.22,69.40,69.58,
+69.96,70.31,70.52,70.61,71.15,71.44,71.86,71.87,72.35,72.48,
+72.84,73.19,73.15,73.69,73.93,74.29,74.37,74.61,74.99,75.54,
+75.90,76.14,76.26,76.45,76.94,77.14,77.28,77.54,77.74,78.14,
+78.55,78.96,79.18,79.36,79.66,80.25,80.46,80.69,80.88,80.99,
+81.31,81.70,82.00,82.55,82.69,82.94,83.33,83.34,83.83,84.10,
+84.53,84.55,85.28,85.17,85.58,85.88,85.87,86.35,86.78,87.01,
+3.09,3.29,3.61,3.88,4.17,4.43,4.68,4.95,5.18,5.42,
+5.72,5.98,6.30,6.52,6.82,7.12,7.42,7.65,7.99,8.08,
+8.47,8.64,8.94,9.20,9.40,9.74,10.10,10.31,10.62,10.88,
+11.10,11.40,11.68,11.92,12.17,12.46,12.72,13.12,13.41,13.63,
+13.81,14.06,14.41,14.61,14.95,15.12,15.51,15.65,15.96,16.29,
+16.54,16.84,17.09,17.31,17.55,17.83,17.99,18.37,18.65,19.04,
+19.16,19.31,19.77,19.93,20.30,20.67,20.77,21.09,21.44,21.64,
+21.96,22.09,22.51,22.66,23.06,23.18,23.49,23.82,24.07,24.36,
+24.56,24.72,25.15,25.36,25.67,25.91,26.21,26.62,26.59,27.03,
+27.39,27.64,27.92,28.15,28.41,28.66,28.87,29.17,29.28,29.74,
+30.19,30.35,30.68,30.73,30.97,31.29,31.64,31.94,32.17,32.13,
+32.58,32.89,33.20,33.32,33.70,34.12,34.27,34.58,34.93,35.16,
+35.40,35.70,35.97,36.11,36.15,36.57,36.80,37.21,37.52,37.75,
+38.10,38.31,38.56,38.80,39.12,39.55,39.68,40.11,40.16,40.56,
+40.73,41.11,41.27,41.42,41.89,42.02,42.31,42.70,42.89,43.00,
+43.69,43.85,44.09,44.17,44.50,44.69,44.90,45.41,45.43,45.75,
+46.24,46.37,46.68,46.80,47.11,47.49,47.34,48.18,48.30,48.51,
+49.05,49.22,49.29,49.68,49.90,50.17,50.45,50.70,51.12,51.38,
+51.51,51.82,51.94,52.39,52.62,52.80,53.27,53.54,53.82,54.01,
+54.35,54.47,54.95,55.07,55.40,55.84,55.76,56.00,56.38,56.65,
+56.84,57.13,57.50,57.75,57.90,58.19,58.65,58.72,59.26,59.37,
+59.76,59.90,59.98,60.14,60.74,61.10,61.21,61.51,61.88,62.13,
+62.35,62.60,62.81,62.88,63.53,63.53,64.04,64.12,64.42,64.58,
+64.96,65.19,65.41,65.82,66.05,66.35,66.64,66.92,67.23,67.15,
+67.51,68.04,68.37,68.48,68.65,68.89,69.45,69.62,69.62,69.88,
+70.58,70.78,70.95,71.19,71.89,71.59,71.97,72.14,72.63,72.76,
+73.10,73.38,73.66,73.79,74.52,74.42,74.79,75.03,75.11,75.70,
+75.67,75.87,76.27,76.89,76.78,77.12,77.40,77.74,77.86,78.46,
+78.45,78.97,79.10,79.30,79.78,79.72,80.24,80.34,80.53,81.07,
+2.80,3.10,3.33,3.65,3.85,4.06,4.36,4.59,4.81,5.15,
+5.33,5.56,5.82,6.09,6.32,6.58,6.82,7.09,7.27,7.57,
+7.86,8.08,8.36,8.57,8.81,9.09,9.39,9.59,9.90,10.17,
+10.42,10.66,10.82,11.15,11.24,11.53,11.87,12.06,12.33,12.66,
+12.91,13.11,13.30,13.51,13.98,14.12,14.35,14.54,14.87,14.99,
+15.35,15.64,15.83,16.09,16.45,16.62,16.82,17.26,17.30,17.59,
+17.90,18.10,18.29,18.51,18.83,19.21,19.33,19.77,19.89,20.13,
+20.35,20.66,20.89,21.07,21.36,21.69,21.85,22.04,22.36,22.64,
+22.86,23.15,23.50,23.64,23.87,24.01,24.25,24.68,24.86,25.14,
+25.47,25.65,25.80,26.02,26.45,26.60,26.80,27.12,27.42,27.55,
+27.91,27.94,28.43,28.49,28.88,29.22,29.54,29.80,29.77,30.00,
+30.38,30.73,30.67,31.10,31.45,31.66,31.77,32.01,32.48,32.84,
+33.01,33.27,33.43,33.67,33.95,34.34,34.44,34.63,34.87,35.03,
+35.42,35.83,35.88,36.21,36.40,36.60,36.84,37.34,37.37,37.70,
+38.04,38.14,38.43,38.79,38.88,39.19,39.50,39.63,39.98,40.18,
+40.41,40.51,41.16,41.25,41.34,41.60,41.89,42.13,42.32,42.63,
+42.87,43.08,43.44,43.72,43.80,44.28,44.37,44.40,45.01,45.12,
+45.41,45.59,46.05,46.08,46.50,46.71,46.98,47.19,47.48,47.70,
+47.92,48.23,48.62,48.66,48.84,49.28,49.54,49.94,50.03,50.14,
+50.40,50.73,50.93,51.28,51.42,51.71,51.91,52.14,52.45,52.42,
+52.85,53.06,53.22,53.57,53.95,54.22,54.48,54.66,55.08,55.33,
+55.45,55.69,55.97,56.24,56.36,56.63,56.77,57.22,57.54,57.76,
+57.77,58.35,58.58,58.45,59.01,59.13,59.25,59.89,59.82,60.06,
+60.43,60.74,60.86,61.16,61.29,61.71,62.06,61.95,62.45,62.68,
+62.86,63.32,63.26,63.89,64.06,64.34,64.19,64.81,65.04,65.11,
+65.63,65.91,65.95,66.14,66.68,66.74,66.93,67.23,67.46,67.56,
+68.02,68.30,68.20,68.54,68.95,69.34,69.46,69.76,69.89,70.16,
+70.47,70.58,71.18,71.12,71.73,71.54,71.91,72.10,72.34,72.77,
+73.04,73.44,73.38,73.61,73.90,74.12,74.14,74.63,74.94,75.19,
+2.65,2.85,3.09,3.33,3.54,3.83,4.04,4.34,4.53,4.70,
+4.94,5.16,5.41,5.73,5.88,6.16,6.41,6.60,6.84,7.05,
+7.26,7.51,7.75,8.03,8.23,8.50,8.68,8.99,9.22,9.42,
+9.66,9.84,10.01,10.38,10.56,10.74,10.91,11.34,11.56,11.60,
+11.83,12.22,12.39,12.69,12.84,13.13,13.42,13.61,13.82,14.11,
+14.28,14.59,14.62,14.97,15.19,15.46,15.71,15.87,16.16,16.42,
+16.71,16.76,17.07,17.36,17.59,17.71,17.96,18.14,18.55,18.61,
+19.05,19.23,19.39,19.57,19.83,20.12,20.29,20.43,20.82,21.12,
+21.26,21.39,21.71,21.94,22.26,22.61,22.68,22.95,23.11,23.39,
+23.50,23.94,23.90,24.45,24.64,24.76,25.14,25.29,25.45,25.73,
+25.93,26.10,26.48,26.54,26.87,27.16,27.42,27.62,27.83,28.03,
+28.21,28.61,28.62,28.91,29.07,29.50,29.72,29.87,30.26,30.30,
+30.47,30.73,31.12,31.30,31.59,31.68,31.97,32.25,32.42,32.73,
+33.18,33.15,33.48,33.37,33.80,34.16,34.31,34.52,34.83,35.06,
+35.16,35.55,35.78,35.73,36.35,36.57,36.79,36.82,36.97,37.11,
+37.47,37.84,37.90,38.32,38.61,38.77,38.97,39.32,39.39,39.81,
+39.81,39.99,40.46,40.39,41.09,40.88,41.23,41.57,41.89,41.92,
+42.12,42.34,42.73,42.79,43.30,43.27,43.83,43.97,44.19,44.46,
+44.66,44.76,45.16,45.20,45.66,45.92,46.01,46.17,46.44,46.78,
+47.04,47.37,47.26,47.74,47.93,47.97,48.30,48.51,48.90,49.02,
+49.27,49.35,49.67,49.90,50.22,50.37,50.59,51.05,51.05,51.35,
+51.63,51.68,51.80,52.17,52.59,52.86,52.87,53.14,53.47,53.65,
+53.84,54.24,54.23,54.59,54.73,54.87,55.37,55.51,55.60,56.03,
+56.23,56.56,56.78,56.95,57.12,57.46,57.45,58.02,58.14,58.30,
+58.61,58.65,59.02,59.37,59.49,59.73,59.66,60.27,60.30,60.55,
+60.90,60.77,61.29,61.43,61.78,61.92,61.87,62.42,62.88,62.87,
+63.10,63.45,63.65,63.94,64.03,64.52,64.87,64.85,65.05,64.97,
+65.72,65.97,66.12,65.95,66.60,66.45,66.88,67.22,67.22,67.62,
+68.04,67.87,68.35,68.56,68.94,69.07,69.45,69.65,69.68,69.95,
+2.48,2.65,2.88,3.08,3.32,3.54,3.74,3.97,4.18,4.50,
+4.64,4.82,5.08,5.31,5.44,5.69,5.89,6.06,6.39,6.58,
+6.79,7.08,7.20,7.44,7.77,7.80,8.01,8.33,8.50,8.71,
+8.96,9.20,9.41,9.55,9.82,9.97,10.30,10.54,10.58,10.89,
+11.16,11.32,11.66,11.72,12.01,12.36,12.43,12.62,12.85,12.93,
+13.35,13.51,13.71,13.90,14.17,14.45,14.58,14.81,15.04,15.26,
+15.43,15.57,15.92,16.21,16.27,16.53,16.77,17.06,17.15,17.31,
+17.54,17.93,18.00,18.19,18.49,18.74,18.91,19.20,19.33,19.59,
+19.70,20.04,20.17,20.49,20.64,20.91,21.14,21.46,21.51,21.66,
+22.02,22.24,22.36,22.59,22.62,23.14,23.29,23.58,23.60,23.92,
+24.16,24.26,24.60,24.76,24.83,25.20,25.25,25.63,25.76,26.36,
+26.30,26.52,26.80,26.83,27.05,27.35,27.59,27.82,28.05,28.32,
+28.46,28.73,28.90,29.22,29.35,29.50,29.81,29.88,30.10,30.37,
+30.58,30.88,31.20,31.26,31.60,31.56,31.98,32.10,32.35,32.60,
+32.94,32.95,33.14,33.29,33.61,33.86,34.16,34.40,34.53,34.69,
+34.90,35.20,35.28,35.76,35.87,35.91,36.17,36.26,36.96,37.02,
+37.11,37.26,37.58,37.56,37.93,38.26,38.23,38.75,38.86,39.04,
+39.36,39.66,39.63,40.14,40.04,40.33,40.47,40.63,41.05,41.31,
+41.50,41.64,41.97,42.14,42.36,42.45,42.86,43.00,43.30,43.40,
+43.60,43.95,43.81,44.17,44.47,44.83,44.89,45.12,45.43,45.55,
+45.55,45.93,46.07,46.50,46.64,47.03,47.13,47.25,47.25,47.84,
+48.01,48.28,48.37,48.84,48.87,48.97,49.09,49.47,49.54,49.79,
+49.99,50.32,50.73,50.83,51.01,51.12,51.52,51.57,51.67,52.15,
+52.44,52.58,52.52,52.79,53.17,53.53,53.81,53.82,54.07,54.28,
+54.45,54.66,54.79,55.10,55.41,55.60,56.10,55.88,56.15,56.40,
+56.66,57.05,57.11,57.14,57.45,57.60,57.97,58.15,58.46,58.63,
+58.83,58.91,59.25,59.64,59.69,60.13,60.17,60.52,60.64,60.74,
+60.90,61.09,61.42,61.79,61.90,62.12,62.17,62.37,62.54,62.99,
+63.01,63.32,63.64,63.89,63.89,63.99,64.34,64.62,64.89,65.11,
+2.25,2.50,2.70,2.88,3.07,3.35,3.49,3.69,3.85,4.07,
+4.29,4.53,4.71,4.92,5.13,5.26,5.49,5.72,5.91,6.12,
+6.26,6.53,6.71,6.93,7.14,7.25,7.55,7.66,7.95,8.18,
+8.34,8.49,8.75,8.91,9.13,9.38,9.48,9.71,9.86,10.14,
+10.32,10.49,10.76,11.07,11.15,11.24,11.55,11.80,11.90,12.20,
+12.46,12.53,12.78,13.04,13.14,13.28,13.54,13.81,14.01,14.15,
+14.33,14.58,14.85,14.95,15.26,15.39,15.61,15.86,15.98,16.20,
+16.38,16.64,16.74,16.96,17.16,17.27,17.60,17.77,18.07,18.11,
+18.40,18.69,18.86,19.01,19.24,19.59,19.64,19.73,19.97,20.21,
+20.44,20.55,20.94,21.12,21.30,21.44,21.57,21.85,22.17,22.35,
+22.46,22.51,22.90,22.96,23.22,23.38,23.48,23.78,23.99,24.35,
+24.48,24.64,24.85,24.91,25.28,25.49,25.63,25.82,25.93,26.22,
+26.40,26.72,26.90,27.00,27.26,27.32,27.63,27.81,28.14,28.13,
+28.52,28.69,28.82,29.20,29.29,29.59,29.60,29.86,29.98,30.26,
+30.51,30.76,30.85,30.95,31.43,31.62,31.79,31.74,31.93,32.40,
+32.35,32.63,32.98,33.14,33.35,33.54,33.69,33.99,34.01,34.34,
+34.34,34.83,35.02,35.32,35.33,35.44,35.58,35.95,36.04,36.28,
+36.46,36.88,36.87,37.14,37.26,37.58,37.76,37.91,38.08,38.41,
+38.65,38.68,39.03,39.19,39.34,39.77,39.64,39.91,40.13,40.27,
+40.70,40.81,40.91,41.13,41.27,41.84,41.72,41.97,42.09,42.37,
+42.61,42.60,42.89,43.10,43.46,43.64,43.77,43.99,44.14,44.29,
+44.53,44.78,44.75,45.41,45.48,45.70,45.88,45.87,46.22,46.41,
+46.56,46.78,46.90,47.30,47.33,47.69,47.83,48.13,48.31,48.40,
+48.52,48.97,48.97,49.13,49.46,49.79,49.71,49.80,50.19,50.39,
+50.52,50.84,51.13,51.43,51.45,51.78,51.87,51.96,52.48,52.75,
+52.61,52.82,53.06,53.25,53.60,53.56,53.88,54.02,54.36,54.42,
+54.71,54.89,55.16,55.26,55.63,55.55,55.80,55.96,56.43,56.60,
+56.58,57.01,57.20,57.37,57.54,57.73,57.87,57.92,58.19,58.47,
+58.67,58.79,59.03,59.45,59.62,59.54,60.09,60.12,60.26,60.46,
+2.12,2.29,2.49,2.68,2.91,3.08,3.23,3.49,3.61,3.81,
+4.04,4.15,4.40,4.53,4.74,4.92,5.11,5.30,5.53,5.66,
+5.84,6.05,6.27,6.48,6.64,6.79,6.96,7.14,7.38,7.49,
+7.70,7.95,8.11,8.31,8.61,8.59,8.79,9.06,9.20,9.42,
+9.64,9.80,10.08,10.17,10.36,10.63,10.76,10.86,11.06,11.38,
+11.47,11.68,12.01,12.02,12.25,12.50,12.75,12.77,12.95,13.20,
+13.36,13.53,13.73,13.90,14.07,14.39,14.47,14.76,14.79,15.00,
+15.28,15.44,15.72,15.73,15.83,16.20,16.38,16.50,16.70,17.02,
+17.08,17.31,17.48,17.68,17.82,18.11,18.29,18.43,18.68,18.71,
+18.94,19.23,19.28,19.56,19.60,19.86,20.05,20.32,20.72,20.53,
+20.82,20.89,21.43,21.42,21.72,21.79,21.86,22.20,22.28,22.53,
+22.69,22.89,23.13,23.28,23.53,23.80,23.96,24.09,24.21,24.37,
+24.54,24.67,25.04,25.05,25.28,25.56,25.85,25.93,26.29,26.13,
+26.61,26.61,26.94,26.92,27.43,27.44,27.53,27.81,28.02,28.16,
+28.22,28.55,28.84,29.16,29.12,29.20,29.47,29.65,29.73,30.07,
+30.25,30.58,30.67,30.84,31.09,31.08,31.32,31.40,31.78,31.93,
+32.19,32.38,32.47,32.62,32.78,32.90,33.25,33.19,33.50,33.73,
+34.03,34.23,34.22,34.52,34.80,34.73,35.07,35.17,35.64,35.62,
+35.97,36.20,36.33,36.37,36.64,36.77,36.86,37.06,37.34,37.56,
+37.81,37.88,38.00,38.39,38.42,38.52,38.90,39.04,39.21,39.41,
+39.57,39.82,39.82,40.07,40.37,40.56,40.75,40.97,41.16,41.34,
+41.48,41.74,41.97,42.00,42.22,42.46,42.63,42.80,43.13,43.27,
+43.25,43.44,43.74,43.73,44.07,44.14,44.49,44.82,44.79,45.00,
+45.38,45.51,45.60,45.76,45.95,46.05,46.48,46.51,46.55,46.84,
+47.29,47.28,47.53,47.84,47.94,47.94,48.25,48.43,48.54,48.73,
+48.96,49.25,49.25,49.40,49.53,50.05,50.39,50.21,50.59,50.62,
+50.83,51.05,51.30,51.70,51.54,51.82,52.10,52.22,52.61,52.47,
+52.77,52.91,53.25,53.30,53.34,53.75,53.92,53.97,54.53,54.04,
+54.33,54.79,55.14,55.28,55.34,55.45,55.95,55.81,56.13,56.10,
+1.96,2.18,2.31,2.44,2.75,2.85,3.06,3.17,3.40,3.66,
+3.76,3.89,4.01,4.15,4.43,4.63,4.77,5.00,5.09,5.26,
+5.48,5.57,5.80,6.05,6.12,6.30,6.48,6.61,6.93,7.01,
+7.24,7.39,7.50,7.75,7.90,8.05,8.21,8.45,8.55,8.81,
+8.93,9.05,9.32,9.50,9.63,9.90,9.98,10.20,10.29,10.43,
+10.75,10.76,10.98,11.28,11.38,11.57,11.70,11.79,12.12,12.26,
+12.43,12.63,12.86,13.11,13.17,13.24,13.30,13.73,13.86,14.20,
+14.15,14.49,14.54,14.71,14.82,15.04,15.28,15.36,15.68,15.71,
+15.96,16.18,16.15,16.44,16.65,16.69,16.86,17.14,17.31,17.44,
+17.71,17.82,18.09,18.15,18.34,18.58,18.61,18.81,19.03,19.23,
+19.34,19.58,19.78,19.92,20.14,20.33,20.45,20.65,20.74,21.02,
+21.21,21.27,21.39,21.58,21.76,21.98,22.12,22.34,22.65,22.76,
+22.76,23.14,23.26,23.41,23.50,23.63,23.95,24.02,24.22,24.50,
+24.67,24.97,24.83,25.19,25.39,25.51,25.62,25.71,26.14,26.30,
+26.35,26.53,26.69,26.89,26.95,27.36,27.34,27.57,27.68,27.97,
+28.21,28.34,28.31,28.51,28.77,28.88,29.13,29.25,29.54,29.69,
+29.86,30.04,30.16,30.38,30.46,30.60,30.88,31.24,31.32,31.40,
+31.52,31.66,31.94,32.13,32.40,32.47,32.57,33.00,33.09,33.26,
+33.51,33.44,33.68,33.86,33.99,34.22,34.32,34.27,34.60,34.87,
+35.13,35.13,35.38,35.56,35.90,36.12,36.24,36.30,36.49,36.59,
+36.78,37.04,37.15,37.52,37.59,37.64,37.99,38.06,38.27,38.44,
+38.49,38.75,38.85,39.22,39.12,39.46,39.44,39.72,39.80,40.01,
+40.31,40.46,40.64,40.72,41.02,41.09,41.33,41.52,41.84,41.59,
+42.00,42.25,42.45,42.84,42.78,43.14,43.18,43.22,43.37,43.60,
+43.66,43.91,44.08,44.37,44.35,44.64,44.88,45.13,45.04,45.35,
+45.51,45.64,46.03,46.12,46.35,46.52,46.46,46.97,47.10,47.20,
+47.46,47.51,47.48,47.91,48.13,47.94,48.30,48.50,48.53,48.87,
+49.20,49.23,49.44,49.52,49.72,50.03,49.84,50.41,50.65,50.64,
+50.71,50.80,51.18,51.22,51.47,51.64,51.71,52.03,52.25,52.26,
+1.85,1.98,2.20,2.29,2.48,2.64,2.79,2.99,3.14,3.28,
+3.46,3.65,3.79,3.89,4.13,4.27,4.44,4.64,4.73,4.92,
+5.09,5.25,5.42,5.67,5.76,5.89,6.00,6.21,6.45,6.54,
+6.65,6.80,7.08,7.19,7.42,7.48,7.60,7.71,8.03,8.11,
+8.27,8.43,8.73,8.87,8.81,9.18,9.26,9.33,9.60,9.78,
+9.86,10.11,10.17,10.42,10.56,10.84,10.88,11.04,11.24,11.37,
+11.58,11.80,11.89,11.97,12.19,12.28,12.48,12.66,12.84,13.07,
+13.16,13.36,13.64,13.79,13.89,14.08,14.17,14.24,14.40,14.55,
+14.79,15.02,15.24,15.29,15.44,15.54,15.86,15.95,16.10,16.38,
+16.59,16.53,16.63,16.87,17.13,17.12,17.27,17.67,17.82,17.94,
+17.94,18.14,18.33,18.47,18.76,18.95,18.99,19.15,19.44,19.38,
+19.71,19.72,20.00,20.10,20.48,20.46,20.54,20.65,20.94,21.28,
+21.20,21.50,21.61,21.75,21.88,22.12,22.43,22.53,22.60,22.77,
+22.91,23.03,23.23,23.45,23.61,23.66,23.99,23.87,24.20,24.33,
+24.65,24.75,24.92,24.77,25.04,25.39,25.52,25.62,25.88,25.90,
+26.12,26.28,26.53,26.53,26.65,27.05,27.05,27.30,27.42,27.85,
+27.85,27.85,28.02,28.32,28.48,28.63,28.82,28.89,28.95,29.21,
+29.56,29.56,29.55,29.95,30.19,30.11,30.25,30.53,30.58,30.63,
+31.30,31.07,31.29,31.50,31.58,31.84,31.93,32.07,32.40,32.45,
+32.62,32.86,32.91,33.08,33.31,33.42,33.69,33.76,33.77,34.08,
+34.25,34.32,34.60,34.61,35.15,34.94,35.36,35.54,35.41,35.77,
+36.01,35.96,36.27,36.22,36.59,36.79,36.83,36.83,37.44,37.44,
+37.36,37.59,37.88,37.96,37.95,38.04,38.32,38.53,38.76,38.88,
+39.10,39.35,39.50,39.58,39.84,39.88,39.95,40.29,40.27,40.44,
+40.56,40.84,41.03,41.27,41.36,41.59,41.74,42.08,42.00,42.18,
+42.34,42.35,42.62,42.71,43.06,42.97,43.13,43.54,43.54,44.15,
+43.89,44.10,44.23,44.30,44.59,44.76,45.11,45.20,45.24,45.47,
+45.74,45.92,46.01,46.22,46.21,46.79,46.57,46.79,47.08,47.02,
+47.38,47.38,47.67,47.67,47.99,47.97,48.14,48.39,48.68,48.68,
+1.65,1.84,2.01,2.13,2.27,2.45,2.54,2.75,2.88,3.03,
+3.25,3.27,3.46,3.70,3.84,3.96,4.18,4.22,4.47,4.59,
+4.80,4.88,4.95,5.17,5.31,5.42,5.56,5.78,5.96,6.09,
+6.18,6.37,6.66,6.67,6.85,6.95,7.13,7.23,7.47,7.61,
+7.74,7.92,8.08,8.20,8.37,8.48,8.65,8.78,9.00,9.10,
+9.28,9.37,9.46,9.64,9.83,9.91,10.14,10.21,10.41,10.67,
+10.81,10.86,11.04,11.23,11.36,11.52,11.71,11.80,11.94,12.11,
+12.25,12.40,12.52,12.73,12.93,12.98,13.18,13.32,13.62,13.57,
+13.80,13.89,14.03,14.27,14.45,14.47,14.52,14.88,14.88,15.13,
+15.32,15.43,15.64,15.78,15.91,16.00,16.26,16.40,16.53,16.71,
+16.74,16.90,17.13,17.22,17.35,17.52,17.59,17.77,18.07,18.05,
+18.26,18.36,18.51,18.59,18.83,18.95,19.21,19.34,19.35,19.61,
+19.80,19.93,19.99,20.10,20.49,20.59,20.62,20.90,21.05,21.05,
+21.30,21.48,21.77,21.83,21.85,22.02,22.20,22.33,22.53,22.58,
+22.80,22.94,23.17,23.18,23.47,23.47,23.61,23.83,23.89,23.99,
+24.27,24.45,24.62,24.83,24.85,25.05,25.22,25.30,25.55,25.67,
+25.77,25.92,26.20,26.50,26.32,26.55,26.77,27.02,26.96,27.23,
+27.23,27.53,27.52,27.87,27.89,28.19,28.32,28.35,28.58,28.72,
+28.85,28.92,29.19,29.00,29.42,29.54,29.65,29.94,29.91,30.14,
+30.41,30.61,30.53,30.66,30.96,31.06,31.30,31.36,31.54,31.66,
+31.85,32.11,32.20,32.54,32.46,32.62,32.64,32.89,32.98,33.08,
+33.30,33.62,33.47,33.76,34.05,33.87,34.36,34.23,34.46,34.74,
+34.85,34.97,35.12,35.45,35.62,35.40,35.68,35.96,36.00,36.17,
+36.28,36.72,36.55,36.94,37.11,37.12,37.44,37.48,37.76,37.59,
+37.90,37.96,38.24,38.07,38.53,38.79,38.65,38.81,39.05,39.35,
+39.51,39.45,39.61,39.74,39.72,40.31,40.15,40.44,40.64,40.91,
+40.96,41.24,41.24,41.35,41.69,41.67,41.80,41.91,41.90,42.16,
+42.22,42.55,42.53,43.08,43.08,43.23,43.45,43.71,43.76,43.83,
+44.03,44.02,44.11,44.33,44.50,44.73,44.80,44.98,45.29,45.26,
+1.59,1.76,1.87,1.98,2.19,2.30,2.43,2.59,2.69,2.86,
+3.01,3.16,3.26,3.33,3.52,3.68,3.82,3.98,4.11,4.19,
+4.39,4.51,4.55,4.80,4.99,5.09,5.20,5.41,5.63,5.58,
+5.76,5.84,6.11,6.15,6.35,6.50,6.56,6.83,6.97,7.12,
+7.16,7.31,7.51,7.66,7.79,8.00,8.10,8.20,8.20,8.60,
+8.68,8.70,8.93,9.03,9.21,9.27,9.42,9.64,9.72,9.84,
+10.04,10.12,10.35,10.43,10.47,10.75,10.88,10.96,11.23,11.18,
+11.33,11.52,11.70,11.80,12.06,12.09,12.21,12.38,12.49,12.63,
+12.78,12.94,13.03,13.23,13.40,13.43,13.52,13.87,13.80,14.05,
+14.26,14.34,14.57,14.59,14.68,14.74,15.02,15.12,15.31,15.48,
+15.58,15.84,15.73,16.07,16.21,16.29,16.40,16.60,16.82,16.88,
+17.05,17.13,17.28,17.46,17.59,17.68,17.78,17.92,18.13,18.23,
+18.46,18.62,18.64,18.75,18.95,19.05,19.24,19.17,19.54,19.62,
+19.80,20.03,20.02,20.18,20.46,20.49,20.58,20.69,20.95,21.04,
+21.12,21.36,21.47,21.46,21.74,21.83,22.07,22.13,22.48,22.66,
+22.76,22.71,22.87,22.99,23.14,23.27,23.45,23.64,23.80,23.70,
+24.12,24.21,24.29,24.68,24.65,24.80,24.78,25.04,25.05,25.21,
+25.53,25.66,25.63,25.72,26.03,26.15,26.07,26.05,26.44,26.89,
+26.81,26.82,27.12,27.16,27.32,27.60,27.67,27.99,27.90,28.03,
+28.03,28.34,28.49,28.55,28.93,28.97,29.17,29.06,29.12,29.49,
+29.68,29.78,29.84,29.98,30.24,30.15,30.39,30.55,30.66,31.03,
+30.95,30.98,31.28,31.67,31.55,31.64,31.98,32.11,32.14,32.27,
+32.42,32.60,32.83,32.83,32.91,33.10,33.31,33.30,33.40,33.77,
+33.84,34.05,34.22,34.18,34.54,34.62,34.66,34.78,34.90,35.05,
+35.30,35.49,35.40,35.66,35.96,35.76,36.19,36.49,36.26,36.60,
+36.70,37.00,36.76,37.12,37.15,37.20,37.45,37.56,37.67,38.06,
+38.12,38.10,38.14,38.46,38.41,38.76,38.70,38.89,39.32,39.22,
+39.68,39.43,39.85,39.95,39.96,40.21,40.38,40.20,40.58,40.68,
+41.05,40.91,41.23,41.36,41.42,41.60,41.53,41.91,41.98,42.28,
+1.47,1.62,1.76,1.83,1.96,2.07,2.26,2.42,2.52,2.57,
+2.79,2.97,3.08,3.14,3.27,3.38,3.53,3.70,3.83,3.94,
+4.07,4.16,4.36,4.44,4.61,4.71,4.83,5.00,5.17,5.25,
+5.36,5.44,5.62,5.76,6.02,6.01,6.13,6.29,6.37,6.54,
+6.76,6.83,6.88,7.04,7.19,7.30,7.36,7.67,7.75,7.88,
+7.98,8.05,8.18,8.37,8.46,8.67,8.78,8.99,9.11,9.11,
+9.29,9.44,9.58,9.61,9.82,9.97,10.04,10.25,10.17,10.54,
+10.61,10.80,10.95,11.03,11.13,11.25,11.36,11.51,11.64,11.87,
+11.83,11.96,12.21,12.29,12.45,12.56,12.83,12.84,12.94,13.00,
+13.31,13.27,13.55,13.64,13.71,13.91,13.95,14.14,14.21,14.36,
+14.54,14.80,14.62,14.85,15.01,15.06,15.23,15.53,15.38,15.67,
+15.94,15.99,16.13,16.21,16.43,16.48,16.69,16.78,16.84,17.08,
+17.26,17.20,17.37,17.42,17.71,17.78,17.84,17.98,18.20,18.12,
+18.26,18.61,18.75,18.87,19.13,19.20,19.28,19.31,19.39,19.53,
+19.70,19.86,19.83,20.02,20.34,20.40,20.46,20.70,20.81,20.85,
+21.08,21.09,21.32,21.59,21.57,21.62,21.95,21.99,22.09,22.07,
+22.22,22.53,22.70,22.58,22.78,22.89,23.14,23.37,23.36,23.47,
+23.67,23.67,23.84,24.03,24.30,24.31,24.51,24.52,24.71,24.75,
+24.98,25.00,25.12,25.39,25.51,25.68,25.81,25.91,26.04,26.00,
+26.26,26.48,26.52,26.82,26.69,26.88,27.13,27.23,27.23,27.44,
+27.55,27.80,27.84,28.09,28.03,28.19,28.27,28.30,28.51,28.93,
+28.96,29.09,29.10,29.04,29.33,29.67,29.69,29.71,29.77,30.08,
+30.06,30.34,30.38,30.64,30.48,30.84,31.04,31.17,31.30,31.27,
+31.44,31.56,31.46,31.78,32.00,32.04,32.14,32.33,32.57,32.57,
+32.85,32.93,33.08,33.17,33.10,33.34,33.40,33.83,33.87,34.04,
+34.12,34.28,34.38,34.49,34.65,34.80,34.88,35.09,35.19,35.43,
+35.45,35.47,35.66,35.80,35.89,36.09,36.21,36.32,36.45,36.69,
+36.84,36.94,36.96,36.90,37.17,37.16,37.44,37.48,37.70,37.82,
+37.98,38.17,38.36,38.33,38.34,38.71,38.95,38.92,38.99,39.08,
+3.97,4.34,4.68,4.96,5.41,5.64,5.97,6.31,6.71,7.03,
+7.41,7.66,8.05,8.38,8.72,8.97,9.46,9.74,9.99,10.38,
+10.81,11.06,11.50,11.79,12.11,12.42,12.87,13.12,13.40,13.93,
+14.04,14.57,14.79,15.18,15.58,15.79,16.12,16.57,16.89,17.22,
+17.60,17.95,18.31,18.59,18.84,19.41,19.77,19.93,20.34,20.64,
+21.03,21.35,21.64,21.95,22.22,22.52,22.97,23.19,23.66,24.09,
+24.35,24.77,24.97,25.46,25.83,26.06,26.35,26.74,27.22,27.39,
+27.77,28.20,28.23,28.94,29.18,29.60,29.86,30.32,30.52,30.84,
+31.23,31.76,32.23,32.28,32.75,33.08,33.17,33.75,33.82,34.22,
+34.75,34.83,35.26,35.84,36.09,36.50,36.72,36.92,37.28,37.72,
+37.98,38.56,38.81,39.04,39.51,39.83,40.00,40.43,40.78,41.22,
+41.32,41.74,42.03,42.41,42.56,43.32,43.52,43.75,43.96,44.47,
+45.00,45.19,45.41,45.96,46.21,46.39,47.03,47.33,47.62,47.50,
+47.90,48.77,48.80,49.30,49.80,49.95,50.14,50.62,51.20,51.42,
+51.86,52.03,52.28,52.74,53.11,53.48,53.71,54.21,54.56,54.83,
+55.20,55.26,55.72,56.19,56.53,56.70,56.88,57.59,57.76,57.89,
+58.74,58.67,59.14,59.44,60.16,60.31,60.62,60.67,61.31,61.24,
+61.82,62.12,62.47,62.95,63.18,63.58,64.10,64.05,64.68,64.82,
+65.18,65.69,65.77,66.31,66.58,66.97,67.00,67.62,67.98,68.55,
+68.84,69.10,69.34,69.74,70.08,70.41,70.73,70.73,71.55,71.82,
+71.86,72.49,72.81,73.15,73.31,74.01,74.19,74.20,74.90,75.28,
+75.47,75.95,76.15,76.70,76.55,77.23,77.51,78.16,78.00,78.30,
+79.03,79.26,79.69,80.19,80.09,80.56,81.11,81.74,81.63,82.19,
+82.04,82.78,82.98,83.22,83.61,83.89,84.29,84.76,84.87,85.69,
+85.72,86.25,86.44,86.72,86.93,87.60,87.83,88.12,88.59,88.78,
+89.47,89.19,90.16,90.22,90.53,91.00,91.44,91.40,91.87,92.01,
+92.72,92.95,93.27,93.62,94.05,93.96,94.50,95.21,95.13,95.46,
+96.04,96.08,96.38,97.45,97.50,97.69,97.72,98.27,98.91,99.42,
+99.41,99.27,100.42,100.37,100.69,101.15,101.60,101.83,102.13,102.61,
+3.74,4.07,4.42,4.68,5.06,5.34,5.60,5.98,6.27,6.60,
+6.97,7.27,7.48,7.87,8.09,8.53,8.79,9.21,9.52,9.83,
+10.15,10.54,10.89,11.04,11.34,11.67,12.05,12.38,12.55,12.93,
+13.22,13.69,13.97,14.22,14.62,14.89,15.06,15.47,15.98,16.30,
+16.50,16.87,17.16,17.48,17.88,18.11,18.30,18.75,19.03,19.38,
+19.82,19.97,20.37,20.70,21.09,21.20,21.76,21.95,22.32,22.69,
+22.92,23.40,23.62,23.90,24.19,24.31,24.84,25.01,25.50,26.00,
+26.10,26.40,26.70,27.08,27.61,27.71,28.14,28.41,28.79,29.17,
+29.51,29.80,29.84,30.36,30.65,31.09,31.32,31.49,31.92,32.23,
+32.53,32.94,33.23,33.49,33.88,34.09,34.35,34.83,35.16,35.43,
+35.67,36.10,36.39,36.48,36.98,37.48,37.59,38.00,38.26,38.69,
+39.11,39.31,39.74,39.96,40.05,40.64,41.03,41.14,41.56,41.89,
+42.34,42.43,42.86,42.81,43.56,43.64,44.12,44.26,44.56,45.21,
+45.37,45.74,46.14,46.39,46.64,47.12,47.26,47.57,47.98,48.34,
+48.68,48.82,49.33,49.30,49.89,50.33,50.47,50.63,51.16,51.44,
+51.81,51.85,52.37,52.80,53.28,53.11,53.81,53.95,54.46,54.86,
+54.93,55.08,55.73,55.73,56.18,56.70,56.82,57.17,57.74,58.11,
+58.02,58.70,58.96,59.14,59.55,59.82,60.33,60.20,60.72,61.12,
+61.13,61.43,62.19,62.54,62.48,62.81,63.17,63.40,63.47,64.28,
+64.55,64.97,65.12,65.59,65.83,66.38,66.59,66.73,67.12,67.48,
+67.78,68.27,68.34,68.84,69.19,69.57,69.54,69.80,70.48,70.84,
+70.77,71.44,71.53,71.99,72.15,72.85,72.69,73.13,73.70,73.68,
+74.42,74.47,74.81,75.17,75.65,75.96,76.11,76.42,76.73,77.12,
+77.41,77.86,78.28,78.27,78.67,78.73,79.38,79.55,80.08,80.55,
+80.56,80.80,81.37,81.55,81.83,82.24,82.38,82.86,82.95,83.65,
+83.69,84.16,84.06,84.86,85.40,85.55,85.80,85.93,86.40,86.61,
+86.99,87.53,87.89,88.16,88.03,88.50,89.32,89.30,89.28,89.83,
+90.18,90.50,90.62,91.59,91.49,91.54,92.05,92.71,92.95,92.78,
+93.26,93.74,94.18,94.28,94.94,95.03,95.05,95.69,95.59,96.35,
+3.46,3.78,4.07,4.43,4.69,5.01,5.37,5.59,5.90,6.22,
+6.51,6.80,7.19,7.38,7.67,7.98,8.31,8.62,8.91,9.25,
+9.52,9.81,10.08,10.43,10.68,11.01,11.33,11.64,11.95,12.31,
+12.53,12.92,13.13,13.45,13.73,14.02,14.29,14.68,14.99,15.15,
+15.46,15.85,16.17,16.42,16.68,16.99,17.19,17.67,17.81,18.42,
+18.57,18.88,19.21,19.46,19.83,20.06,20.38,20.67,20.98,21.20,
+21.58,21.99,22.07,22.48,22.83,23.14,23.38,23.73,23.92,24.41,
+24.52,24.79,25.20,25.35,25.68,26.17,26.54,26.66,27.04,27.11,
+27.71,27.82,28.03,28.58,28.80,29.07,29.39,29.64,30.07,30.27,
+30.34,30.90,31.20,31.45,31.88,32.24,32.41,32.63,32.91,33.25,
+33.52,33.92,34.23,34.45,34.80,35.03,35.36,35.58,35.93,36.23,
+36.60,36.94,37.31,37.42,37.62,38.29,38.32,38.70,38.84,39.54,
+39.60,39.96,40.20,40.71,40.86,41.21,41.43,41.81,42.02,42.42,
+42.64,42.84,43.31,43.48,44.20,44.14,44.53,44.74,45.27,45.27,
+45.49,45.76,46.15,46.66,46.74,47.14,47.68,47.69,48.13,48.29,
+48.70,48.87,49.15,49.60,49.85,50.30,50.33,50.69,51.02,51.32,
+51.68,52.03,52.16,52.79,52.89,53.20,53.35,53.86,53.92,54.41,
+54.73,55.23,55.49,55.69,55.72,55.88,56.55,56.60,57.05,57.34,
+57.83,57.73,58.36,58.74,59.08,59.15,59.48,59.71,60.26,60.12,
+60.62,60.96,61.35,61.73,61.86,62.07,62.46,62.72,63.23,63.37,
+63.73,64.03,64.36,64.81,65.06,65.22,65.67,65.92,65.83,66.68,
+66.72,67.04,67.16,67.72,68.06,68.36,68.30,68.72,69.12,69.68,
+69.68,70.16,70.54,70.91,70.94,71.28,71.46,71.83,72.38,72.50,
+72.94,73.19,73.53,73.44,74.13,73.99,74.85,74.81,75.22,75.68,
+75.76,75.86,76.32,76.60,77.14,77.46,77.40,77.85,78.31,78.52,
+78.95,78.94,79.22,79.77,80.18,80.41,80.78,80.66,81.05,81.22,
+81.72,82.43,82.49,82.73,82.98,83.46,83.60,84.18,84.21,84.78,
+84.64,84.88,85.62,86.07,85.85,86.16,86.48,86.72,87.44,87.44,
+87.81,88.08,88.44,89.08,89.08,89.49,89.45,89.94,90.13,90.73,
+3.25,3.58,3.85,4.08,4.42,4.72,4.93,5.24,5.54,5.90,
+6.09,6.35,6.70,6.91,7.26,7.48,7.81,8.14,8.35,8.65,
+9.00,9.17,9.54,9.78,10.04,10.37,10.61,10.98,11.29,11.48,
+11.77,12.10,12.33,12.60,12.99,13.25,13.56,13.74,13.99,14.22,
+14.64,14.87,15.17,15.50,15.79,15.96,16.43,16.59,16.87,17.18,
+17.38,17.81,18.02,18.40,18.62,18.80,19.23,19.42,19.66,19.91,
+20.31,20.55,20.79,21.15,21.28,21.62,21.92,22.34,22.55,22.67,
+23.17,23.35,23.75,23.89,24.07,24.61,24.95,25.01,25.54,25.73,
+25.88,26.25,26.41,26.80,27.07,27.35,27.70,27.81,28.19,28.56,
+28.76,29.07,29.33,29.64,29.87,30.14,30.42,30.73,31.02,31.36,
+31.61,31.89,32.18,32.31,32.75,32.93,33.42,33.41,33.73,34.08,
+34.45,34.80,35.16,35.14,35.62,35.86,36.16,36.35,36.64,36.98,
+37.24,37.53,37.96,38.06,38.49,38.79,39.04,39.18,39.53,39.88,
+39.99,40.37,40.98,40.95,41.17,41.23,41.93,42.00,42.31,42.53,
+42.81,43.15,43.49,43.85,44.03,44.22,44.48,44.90,45.29,45.46,
+45.80,45.95,46.30,46.43,46.89,47.15,47.41,47.85,48.08,48.40,
+48.57,48.98,49.27,49.49,49.71,49.81,50.41,50.48,50.88,51.01,
+51.41,51.82,51.99,52.35,52.70,52.73,53.33,53.18,53.55,53.89,
+54.21,54.48,55.02,55.14,55.42,55.74,55.84,56.24,56.62,56.68,
+57.10,57.07,57.62,57.97,58.42,58.58,58.79,59.08,59.21,59.59,
+59.78,60.10,60.38,60.76,61.20,61.33,61.71,61.82,61.95,62.52,
+62.57,63.00,63.25,63.48,63.72,64.08,64.54,64.81,65.08,65.52,
+65.51,65.91,66.19,66.63,66.91,67.15,67.27,67.49,67.94,67.98,
+68.39,68.76,68.71,69.40,69.65,69.74,69.88,70.16,70.61,71.15,
+71.53,71.22,71.71,72.23,72.47,72.74,72.71,73.26,73.52,73.61,
+74.22,74.32,74.76,74.97,75.20,75.63,75.84,76.17,76.39,76.57,
+76.94,77.05,77.50,77.65,77.81,78.23,78.81,78.84,79.39,79.26,
+79.66,79.83,80.49,80.46,80.71,81.19,81.44,81.75,82.09,82.03,
+82.67,82.90,83.26,83.35,83.44,83.60,84.17,84.54,85.03,85.24,
+3.09,3.33,3.67,3.90,4.17,4.43,4.63,4.89,5.20,5.43,
+5.75,6.02,6.35,6.49,6.86,7.14,7.26,7.58,7.83,8.16,
+8.35,8.74,9.02,9.22,9.43,9.71,10.02,10.20,10.54,10.77,
+11.01,11.32,11.66,11.87,12.05,12.46,12.67,12.77,13.20,13.45,
+13.71,14.01,14.22,14.49,14.80,15.08,15.29,15.50,15.75,16.09,
+16.36,16.70,16.80,17.18,17.46,17.68,17.97,18.24,18.49,18.84,
+19.00,19.26,19.54,19.82,20.10,20.50,20.56,21.06,21.18,21.41,
+21.65,22.02,22.25,22.62,22.79,23.19,23.28,23.48,23.84,24.19,
+24.30,24.79,24.87,25.25,25.30,25.72,25.95,26.18,26.51,26.84,
+26.86,27.14,27.64,27.67,28.01,28.34,28.68,28.88,29.10,29.51,
+29.60,29.91,30.40,30.40,30.76,31.12,31.28,31.62,31.77,32.06,
+32.25,32.71,32.82,33.12,33.45,33.92,34.06,34.38,34.51,34.88,
+35.09,35.25,35.69,35.99,36.10,36.32,36.71,36.97,37.02,37.35,
+37.60,38.08,38.15,38.34,38.80,38.89,39.29,39.59,39.81,39.90,
+40.30,40.41,40.86,41.04,41.58,41.68,42.01,42.13,42.59,42.78,
+43.07,43.10,43.61,43.69,44.09,44.45,44.67,45.12,45.03,45.51,
+45.76,45.53,46.22,46.34,46.77,46.85,47.04,47.49,48.02,48.13,
+48.23,48.66,48.81,48.96,49.45,49.91,49.94,50.09,50.44,50.61,
+51.05,51.29,51.70,51.82,52.05,52.48,52.32,52.86,53.12,53.55,
+53.67,53.86,54.10,54.37,54.84,55.02,55.35,55.48,55.74,56.19,
+56.18,56.47,56.67,57.07,57.31,57.55,57.96,58.10,58.44,58.72,
+59.04,59.20,59.52,59.71,59.97,60.22,60.41,60.92,61.08,61.30,
+61.70,61.99,62.26,62.30,62.70,63.00,63.40,63.44,63.93,64.08,
+64.35,64.68,64.72,65.07,65.28,65.64,65.81,66.08,66.39,66.80,
+66.91,67.12,67.57,67.99,68.14,68.31,68.71,68.65,69.12,69.40,
+69.64,69.60,70.30,70.55,70.76,70.87,71.27,71.52,71.95,72.25,
+72.18,72.47,72.90,73.33,73.50,73.71,73.79,74.26,74.64,74.93,
+74.86,75.17,75.59,76.00,76.08,76.46,76.49,76.87,77.11,77.23,
+77.92,77.74,78.11,78.36,78.85,79.07,79.06,79.48,79.92,79.91,
+2.93,3.14,3.38,3.64,3.92,4.19,4.41,4.60,4.89,5.14,
+5.41,5.71,5.93,6.17,6.37,6.57,6.88,7.16,7.41,7.65,
+7.82,8.16,8.45,8.64,8.92,9.21,9.46,9.63,9.88,10.20,
+10.51,10.62,10.88,11.20,11.34,11.73,11.87,12.13,12.38,12.65,
+12.92,13.24,13.41,13.65,13.90,14.20,14.43,14.52,14.86,15.12,
+15.48,15.66,15.85,16.27,16.30,16.55,16.94,17.25,17.41,17.74,
+17.91,18.24,18.46,18.53,18.88,19.11,19.45,19.77,19.89,20.16,
+20.43,20.61,20.87,21.10,21.42,21.61,21.92,22.20,22.46,22.63,
+22.98,23.17,23.38,23.65,23.86,24.10,24.31,24.54,24.91,25.17,
+25.36,25.57,26.01,26.16,26.35,26.71,26.98,27.20,27.40,27.80,
+27.92,28.16,28.36,28.64,28.84,29.09,29.50,29.66,30.10,30.29,
+30.46,30.63,30.88,31.29,31.37,31.51,31.94,32.33,32.41,32.52,
+32.95,33.15,33.36,33.78,33.98,34.05,34.62,34.74,34.82,35.21,
+35.54,35.71,35.89,36.06,36.45,36.65,36.91,36.97,37.40,37.55,
+37.94,38.17,38.45,38.69,38.92,39.18,39.40,39.73,39.97,40.35,
+40.44,40.74,41.05,41.07,41.33,41.59,41.95,42.22,42.41,42.61,
+42.91,43.23,43.33,43.64,43.95,44.20,44.44,44.77,44.75,45.22,
+45.40,45.69,46.08,46.08,46.58,46.73,46.88,47.41,47.59,47.72,
+47.79,48.03,48.47,48.57,48.90,49.00,49.32,49.58,50.17,50.01,
+50.52,50.92,50.95,51.30,51.42,51.58,51.86,52.18,52.49,52.55,
+52.84,53.02,53.41,53.66,53.74,53.96,54.50,54.76,54.94,55.23,
+55.48,55.72,55.92,56.23,56.32,56.56,56.71,57.23,57.48,57.77,
+57.80,57.92,58.39,58.75,58.90,59.12,59.44,59.41,60.05,60.34,
+60.31,60.47,60.96,61.13,61.51,61.69,62.05,62.12,62.40,62.77,
+62.99,63.24,63.35,63.73,63.91,64.00,64.70,64.76,64.81,65.01,
+65.54,65.55,66.13,66.17,66.59,66.86,66.81,67.22,67.45,67.48,
+67.99,68.15,68.62,68.61,68.93,69.43,69.44,69.92,69.83,70.25,
+70.47,70.62,70.76,71.08,71.53,71.71,71.92,72.18,72.44,72.65,
+73.26,73.34,73.22,73.77,74.06,74.31,74.34,74.76,75.10,75.26,
+2.73,3.04,3.17,3.41,3.65,3.91,4.13,4.38,4.53,4.85,
+5.13,5.27,5.63,5.79,6.02,6.19,6.47,6.69,6.94,7.18,
+7.43,7.68,7.87,8.08,8.41,8.58,8.82,9.08,9.31,9.57,
+9.81,10.09,10.24,10.60,10.65,10.92,11.13,11.46,11.67,11.98,
+12.17,12.36,12.65,12.76,13.08,13.28,13.55,13.76,14.01,14.14,
+14.49,14.71,14.95,15.22,15.47,15.74,15.90,16.08,16.35,16.62,
+16.83,17.08,17.30,17.43,17.73,18.07,18.29,18.38,18.71,18.84,
+19.18,19.40,19.70,20.00,20.11,20.35,20.56,20.89,21.12,21.23,
+21.53,21.79,21.99,22.23,22.51,22.82,22.93,23.21,23.34,23.67,
+24.00,23.95,24.29,24.72,24.93,25.12,25.35,25.57,25.70,26.06,
+26.20,26.31,26.60,26.89,27.28,27.32,27.67,28.00,28.14,28.34,
+28.61,28.80,28.97,29.26,29.50,29.90,29.98,30.16,30.39,30.82,
+31.00,31.24,31.45,31.72,31.99,32.24,32.42,32.62,32.98,33.21,
+33.40,33.55,33.82,33.97,34.13,34.66,34.55,34.99,35.27,35.35,
+35.72,35.89,36.05,36.13,36.72,36.95,36.73,37.18,37.60,37.83,
+38.00,38.51,38.45,38.60,38.92,39.09,39.48,39.70,39.88,39.90,
+40.46,40.46,40.86,41.03,41.29,41.73,41.77,42.01,42.36,42.55,
+42.68,42.93,43.41,43.44,43.53,44.05,44.03,44.34,44.71,44.68,
+44.91,45.30,45.74,45.75,46.11,46.28,46.32,46.79,46.94,47.04,
+47.46,47.62,47.97,48.03,48.16,48.61,48.76,48.94,49.22,49.45,
+49.60,50.05,50.30,50.17,50.97,50.80,51.02,51.62,51.68,51.69,
+52.20,52.35,52.67,52.86,53.02,53.36,53.39,53.77,53.90,54.21,
+54.41,54.76,54.89,55.20,55.26,55.57,56.06,56.11,56.23,56.62,
+56.95,57.06,57.39,57.34,57.60,58.07,58.38,58.45,58.88,58.97,
+59.08,59.46,60.02,59.90,59.86,60.26,60.54,60.99,60.95,61.55,
+61.65,61.71,62.07,62.06,62.52,62.44,63.15,63.06,63.40,63.64,
+64.02,63.95,64.44,64.52,64.65,65.10,65.32,65.66,65.75,65.98,
+66.06,66.29,66.85,66.91,67.21,67.32,67.45,68.09,68.01,68.35,
+68.59,68.61,69.00,69.11,69.79,69.77,69.96,70.45,70.25,70.75,
+2.56,2.76,3.01,3.20,3.45,3.65,3.89,4.12,4.37,4.55,
+4.82,5.03,5.27,5.42,5.64,5.88,6.15,6.34,6.52,6.78,
+6.96,7.19,7.35,7.67,7.85,8.03,8.27,8.55,8.78,8.88,
+9.28,9.43,9.57,9.92,10.10,10.25,10.56,10.75,11.03,11.12,
+11.41,11.57,11.84,12.11,12.17,12.55,12.86,13.02,13.15,13.40,
+13.68,13.86,13.97,14.29,14.50,14.74,14.94,15.07,15.47,15.66,
+15.84,16.07,16.38,16.59,16.66,16.93,17.11,17.27,17.68,17.81,
+18.06,18.24,18.37,18.65,18.91,19.01,19.34,19.62,19.79,20.00,
+20.26,20.46,20.82,20.96,21.12,21.34,21.65,21.79,21.97,22.24,
+22.53,22.79,22.94,23.16,23.38,23.67,23.84,24.01,24.25,24.55,
+24.76,24.86,25.17,25.41,25.59,25.83,26.07,26.14,26.42,26.54,
+26.88,27.06,27.46,27.55,27.75,27.87,28.15,28.42,28.69,28.90,
+29.03,29.23,29.57,29.66,30.13,30.21,30.41,30.79,30.78,31.07,
+31.26,31.49,31.82,31.75,32.28,32.26,32.67,32.80,33.15,33.29,
+33.53,33.69,33.77,34.11,34.31,34.78,34.80,35.07,35.25,35.58,
+35.67,35.89,36.10,36.46,36.63,36.93,36.98,37.13,37.55,37.76,
+37.89,38.09,38.32,38.70,38.99,39.05,39.33,39.54,39.77,40.12,
+40.04,40.57,40.53,40.87,40.96,41.27,41.48,41.59,41.97,42.23,
+42.38,42.60,42.73,43.10,43.19,43.36,43.67,43.91,44.06,44.40,
+44.41,44.69,44.91,45.19,45.34,45.70,45.84,46.12,46.37,46.46,
+46.96,47.16,47.15,47.41,47.82,47.93,48.00,48.48,48.39,48.92,
+48.94,49.22,49.34,49.76,49.78,50.04,50.56,50.47,50.70,51.05,
+51.10,51.21,51.49,51.81,52.10,52.36,52.60,52.68,53.02,53.01,
+53.47,53.48,54.05,54.11,54.24,54.36,54.77,54.87,55.09,55.58,
+55.42,55.83,55.97,56.35,56.63,56.53,56.97,57.17,57.35,57.54,
+57.98,57.93,58.40,58.77,58.67,58.74,59.13,59.47,59.59,59.69,
+59.91,60.35,60.58,60.88,60.91,61.20,61.42,61.72,61.84,62.12,
+62.24,62.33,62.67,62.88,63.02,63.24,63.62,63.76,63.97,64.02,
+64.68,64.59,64.98,65.03,65.46,65.58,65.70,65.96,66.22,66.37,
+2.40,2.63,2.84,3.03,3.16,3.44,3.67,3.86,4.04,4.29,
+4.45,4.73,4.90,5.11,5.37,5.49,5.78,5.93,6.08,6.31,
+6.52,6.80,6.96,7.18,7.39,7.59,7.84,7.98,8.21,8.43,
+8.62,8.86,9.08,9.25,9.51,9.61,9.73,10.21,10.37,10.55,
+10.73,10.94,11.23,11.31,11.61,11.78,11.88,12.24,12.30,12.65,
+12.70,12.90,13.17,13.37,13.69,13.83,13.99,14.32,14.52,14.66,
+14.96,15.08,15.39,15.64,15.75,15.95,16.11,16.28,16.64,16.76,
+16.94,17.18,17.49,17.56,17.69,18.03,18.13,18.41,18.51,18.94,
+19.03,19.14,19.38,19.69,19.75,20.09,20.19,20.59,20.70,20.75,
+21.07,21.31,21.51,21.84,21.91,22.04,22.38,22.46,22.81,22.86,
+23.07,23.36,23.50,23.79,24.01,24.22,24.45,24.78,24.90,25.06,
+25.13,25.52,25.80,25.93,25.95,26.39,26.55,26.81,26.80,27.17,
+27.29,27.65,27.74,27.88,28.15,28.41,28.71,28.93,29.02,29.27,
+29.42,29.53,29.84,30.00,30.33,30.43,30.51,30.77,30.93,31.36,
+31.56,31.46,32.02,32.21,32.28,32.42,32.70,32.82,33.09,33.52,
+33.66,33.66,33.97,34.01,34.43,34.82,34.78,35.09,34.92,35.41,
+35.60,35.85,36.15,36.43,36.55,36.68,36.98,37.12,37.34,37.74,
+37.66,37.94,38.15,38.36,38.60,38.75,38.90,39.30,39.49,39.49,
+39.77,40.10,40.25,40.58,40.52,40.78,41.08,41.29,41.63,41.84,
+41.86,42.10,42.31,42.47,42.68,43.00,43.31,43.40,43.55,43.83,
+43.82,44.02,44.42,44.66,44.67,45.09,45.10,45.35,45.51,46.00,
+46.09,46.14,46.21,46.61,46.99,47.02,47.43,47.61,47.68,47.81,
+48.21,48.49,48.40,48.92,48.95,49.19,49.26,49.45,49.73,49.97,
+50.26,50.36,50.65,50.96,50.93,51.12,51.20,51.65,51.71,52.26,
+52.39,52.47,52.67,53.00,53.10,53.14,53.37,53.76,53.91,54.08,
+54.48,54.54,54.88,55.05,55.13,55.37,55.66,55.69,55.78,56.20,
+56.42,56.70,56.58,56.99,57.27,57.53,57.85,57.98,58.15,58.37,
+58.50,58.48,58.64,59.48,59.41,59.73,59.51,59.93,60.05,60.30,
+60.52,60.70,60.94,61.41,61.29,61.67,61.77,61.92,62.51,62.51,
+2.27,2.45,2.65,2.85,3.08,3.23,3.45,3.65,3.79,4.02,
+4.19,4.40,4.58,4.82,5.04,5.15,5.40,5.58,5.74,6.02,
+6.16,6.33,6.58,6.75,6.92,7.13,7.38,7.53,7.67,8.00,
+8.03,8.22,8.54,8.62,8.94,9.07,9.25,9.63,9.63,9.80,
+10.07,10.27,10.53,10.65,10.95,11.11,11.27,11.38,11.59,11.82,
+12.11,12.27,12.41,12.64,12.79,13.10,13.29,13.30,13.56,13.81,
+13.99,14.20,14.32,14.57,14.68,14.85,15.16,15.35,15.48,15.76,
+16.01,16.02,16.32,16.53,16.77,16.90,17.11,17.21,17.47,17.80,
+17.90,18.08,18.30,18.48,18.77,18.95,19.05,19.41,19.51,19.59,
+19.85,20.03,19.94,20.43,20.57,20.81,21.10,21.32,21.36,21.54,
+21.71,22.05,22.28,22.43,22.49,22.77,23.16,23.11,23.38,23.59,
+23.70,23.83,24.09,24.32,24.48,24.73,24.93,25.20,25.32,25.53,
+25.72,25.95,26.02,26.37,26.62,26.63,26.84,27.23,27.38,27.43,
+27.59,27.86,28.08,28.22,28.50,28.43,28.82,28.93,29.22,29.37,
+29.69,29.72,29.94,30.22,30.33,30.53,30.92,30.96,31.20,31.40,
+31.49,31.95,32.03,32.05,32.29,32.35,32.68,33.03,33.13,33.32,
+33.44,33.77,33.93,34.13,34.25,34.45,34.67,34.94,35.18,35.32,
+35.59,35.59,35.88,36.13,36.38,36.51,36.58,36.92,37.15,37.31,
+37.46,37.50,37.79,38.02,38.13,38.46,38.47,38.84,39.17,39.07,
+39.39,39.58,39.78,39.94,40.06,40.60,40.56,40.82,40.88,41.08,
+41.40,41.62,41.72,41.93,42.33,42.34,42.52,42.64,42.88,43.12,
+43.24,43.31,43.77,43.85,43.97,44.01,44.45,44.60,45.02,45.18,
+45.10,45.38,45.66,45.88,46.13,46.15,46.41,46.53,47.05,47.06,
+47.38,47.48,47.51,47.73,48.22,48.21,48.25,48.42,48.61,48.99,
+49.15,49.36,49.52,49.69,49.91,50.19,50.24,50.39,50.85,50.91,
+51.11,51.31,51.46,51.54,51.93,52.04,52.33,52.61,52.56,52.99,
+53.12,53.37,53.36,54.01,54.04,53.91,54.09,54.53,54.61,54.68,
+55.09,55.35,55.31,55.61,55.80,55.88,55.97,56.22,56.47,56.58,
+57.09,57.37,57.28,57.63,57.54,57.71,58.12,58.28,58.35,58.64,
+2.16,2.28,2.47,2.73,2.84,3.05,3.23,3.44,3.56,3.75,
+3.95,4.17,4.35,4.46,4.78,4.93,5.08,5.23,5.45,5.58,
+5.71,5.94,6.16,6.35,6.58,6.68,6.94,7.00,7.23,7.48,
+7.69,7.76,8.01,8.16,8.31,8.59,8.77,8.93,9.13,9.33,
+9.50,9.65,9.84,10.01,10.20,10.37,10.56,10.74,11.02,11.15,
+11.34,11.50,11.70,11.83,12.15,12.22,12.29,12.52,12.79,12.98,
+13.14,13.28,13.52,13.59,13.82,14.07,14.22,14.35,14.65,14.83,
+15.01,15.08,15.43,15.59,15.75,15.87,16.05,16.23,16.31,16.70,
+16.87,16.94,17.16,17.34,17.63,17.69,17.91,18.10,18.29,18.48,
+18.56,18.80,19.03,19.24,19.53,19.52,19.79,19.85,20.04,20.28,
+20.47,20.60,20.91,21.09,21.18,21.44,21.55,21.79,21.98,22.09,
+22.34,22.55,22.57,22.88,23.16,23.28,23.40,23.61,23.78,23.99,
+24.22,24.22,24.59,24.61,24.99,25.07,25.29,25.34,25.61,26.03,
+25.89,26.12,26.34,26.48,26.81,27.01,27.18,27.27,27.51,27.77,
+27.69,27.95,28.19,28.42,28.54,28.86,28.93,28.93,29.24,29.47,
+29.66,29.82,29.92,30.21,30.37,30.63,30.79,30.83,31.41,31.10,
+31.56,31.66,31.92,32.14,32.15,32.54,32.71,32.69,33.09,33.36,
+33.48,33.43,33.93,33.92,34.12,34.32,34.54,34.64,34.79,34.94,
+35.21,35.24,35.65,35.66,35.85,36.10,36.33,36.39,36.79,36.89,
+36.97,37.15,37.25,37.58,37.78,38.02,38.09,38.59,38.66,38.61,
+38.71,39.16,39.35,39.39,39.55,39.83,39.98,40.32,40.28,40.54,
+40.62,40.71,41.15,41.23,41.19,41.60,41.85,41.98,42.09,42.35,
+42.52,42.43,42.87,43.19,43.30,43.35,43.64,43.74,43.65,44.30,
+44.29,44.58,44.77,44.73,45.17,45.28,45.63,45.68,45.83,46.11,
+46.44,46.37,46.48,46.81,46.90,47.32,47.40,47.36,47.62,47.93,
+47.90,48.15,48.41,48.58,48.77,48.93,49.11,49.32,49.56,49.59,
+49.94,50.17,50.11,50.29,50.63,50.61,51.05,51.01,51.30,51.67,
+51.77,51.91,52.05,52.18,52.35,52.60,52.93,52.83,53.22,53.48,
+53.68,53.72,53.82,54.10,54.18,54.38,54.84,54.76,54.99,55.38,
+1.94,2.12,2.37,2.53,2.72,2.84,3.01,3.14,3.38,3.52,
+3.69,3.87,4.04,4.19,4.47,4.58,4.79,4.92,5.10,5.24,
+5.46,5.70,5.73,5.98,6.12,6.21,6.51,6.71,6.83,7.08,
+7.17,7.26,7.55,7.67,7.79,8.04,8.19,8.38,8.54,8.78,
+8.90,9.09,9.32,9.42,9.61,9.78,9.97,10.10,10.32,10.43,
+10.74,10.75,10.95,11.16,11.32,11.54,11.64,11.90,11.91,12.22,
+12.46,12.40,12.70,12.79,13.09,13.19,13.39,13.59,13.69,13.89,
+14.14,14.23,14.30,14.69,14.76,14.94,15.06,15.38,15.46,15.59,
+15.75,16.05,16.22,16.26,16.45,16.77,16.89,17.04,17.20,17.29,
+17.64,17.74,17.98,18.06,18.26,18.37,18.57,18.71,18.81,19.13,
+19.46,19.47,19.49,19.78,20.02,20.06,20.18,20.45,20.59,20.83,
+21.12,21.18,21.40,21.50,21.65,21.76,22.05,22.31,22.38,22.62,
+22.72,22.92,23.01,23.08,23.45,23.56,23.70,23.84,24.17,24.35,
+24.39,24.50,24.90,24.88,25.28,25.29,25.57,25.79,25.77,26.03,
+26.33,26.33,26.51,26.69,27.02,27.08,27.06,27.35,27.55,27.58,
+27.93,28.14,28.11,28.48,28.47,28.76,28.93,29.25,29.33,29.39,
+29.55,29.89,29.95,30.04,30.27,30.38,30.81,30.86,30.86,31.16,
+31.44,31.53,31.69,31.81,32.19,32.15,32.38,32.47,32.70,32.84,
+33.20,33.32,33.42,33.55,33.77,34.03,34.05,34.36,34.61,34.56,
+34.78,34.87,35.17,35.33,35.50,35.64,35.80,35.78,36.00,36.27,
+36.58,36.66,37.02,37.13,37.19,37.56,37.70,37.59,37.86,38.25,
+38.25,38.34,38.42,38.79,39.08,39.13,39.24,39.39,39.46,39.67,
+39.97,40.17,40.16,40.50,40.67,40.93,41.03,41.13,41.35,41.66,
+41.72,41.72,42.05,42.13,42.35,42.39,42.56,43.04,43.26,43.30,
+43.27,43.74,43.73,43.80,44.11,44.41,44.44,44.56,44.71,45.21,
+45.26,45.44,45.61,45.56,45.61,46.01,46.18,46.19,46.41,46.70,
+46.81,47.16,47.28,47.58,47.59,47.66,47.87,48.25,48.40,48.39,
+48.61,48.70,49.06,49.26,49.37,49.63,49.66,49.74,50.10,50.20,
+50.49,50.69,50.50,50.79,50.92,51.10,51.37,51.55,51.76,51.77,
+1.87,2.06,2.22,2.39,2.57,2.68,2.87,3.01,3.20,3.29,
+3.50,3.65,3.79,4.00,4.18,4.30,4.48,4.69,4.77,4.91,
+5.08,5.33,5.45,5.53,5.76,6.04,6.09,6.27,6.38,6.63,
+6.72,6.96,7.08,7.32,7.35,7.67,7.72,7.92,8.09,8.17,
+8.35,8.53,8.75,8.95,9.07,9.20,9.32,9.43,9.78,9.82,
+10.02,10.09,10.35,10.49,10.60,10.79,10.94,11.15,11.28,11.46,
+11.65,11.82,11.95,12.10,12.20,12.37,12.58,12.77,12.93,13.06,
+13.20,13.44,13.53,13.71,13.97,14.09,14.17,14.46,14.73,14.76,
+14.86,15.05,15.18,15.24,15.54,15.68,15.82,15.96,16.17,16.27,
+16.51,16.75,16.85,16.78,17.15,17.39,17.41,17.66,17.76,17.97,
+18.11,18.41,18.60,18.62,18.82,18.97,19.00,19.27,19.39,19.61,
+19.72,19.72,20.00,20.21,20.54,20.50,20.53,20.87,21.02,21.05,
+21.22,21.51,21.63,21.93,22.10,22.22,22.40,22.48,22.71,22.83,
+22.96,23.21,23.38,23.48,23.59,23.80,24.02,24.11,24.39,24.34,
+24.72,24.69,24.94,25.20,25.29,25.38,25.62,25.72,25.91,25.95,
+26.12,26.46,26.52,26.74,26.90,26.89,27.19,27.40,27.65,27.62,
+27.77,28.03,28.14,28.19,28.71,28.62,28.77,28.90,29.15,29.53,
+29.66,29.56,29.71,30.04,30.07,30.20,30.45,30.68,31.02,31.12,
+31.14,31.24,31.41,31.55,31.86,31.86,32.05,32.28,32.47,32.49,
+32.70,32.83,32.87,33.06,33.48,33.41,33.71,33.89,34.02,34.22,
+34.30,34.27,34.58,34.67,34.90,35.20,35.24,35.39,35.65,35.88,
+36.08,36.10,36.30,36.29,36.62,36.69,36.99,36.95,37.17,37.56,
+37.53,37.59,37.88,37.98,38.20,38.31,38.54,38.56,38.98,38.91,
+39.19,39.31,39.57,39.63,39.88,40.23,40.12,40.43,40.39,40.73,
+40.60,40.99,41.07,41.46,41.60,41.66,41.87,41.93,42.16,42.25,
+42.43,42.63,42.97,43.04,43.10,43.19,43.56,43.63,43.60,43.93,
+43.90,44.23,44.30,44.58,44.62,44.76,45.06,45.09,45.45,45.60,
+45.63,45.98,46.05,46.23,46.47,46.55,46.88,46.69,47.13,46.92,
+47.48,47.48,47.63,47.47,47.86,47.95,48.11,48.45,48.30,48.82,
+1.77,1.91,2.11,2.22,2.35,2.56,2.63,2.85,3.00,3.16,
+3.32,3.43,3.60,3.74,3.95,4.00,4.18,4.40,4.54,4.72,
+4.78,4.98,5.10,5.30,5.42,5.59,5.74,5.86,6.07,6.15,
+6.30,6.47,6.67,6.80,6.90,7.13,7.16,7.40,7.55,7.78,
+7.91,7.95,8.11,8.44,8.53,8.64,8.76,8.97,9.05,9.23,
+9.43,9.51,9.71,9.86,10.05,10.19,10.29,10.53,10.57,10.72,
+10.99,11.03,11.15,11.43,11.59,11.58,11.79,11.92,12.16,12.46,
+12.48,12.51,12.73,12.90,13.06,13.16,13.47,13.50,13.76,13.85,
+13.90,14.16,14.21,14.44,14.69,14.76,14.85,15.13,15.15,15.21,
+15.56,15.64,15.90,15.96,16.09,16.28,16.53,16.62,16.71,16.87,
+17.02,17.20,17.38,17.47,17.56,17.76,17.83,18.16,18.15,18.33,
+18.47,18.83,18.79,19.00,19.26,19.26,19.50,19.64,19.86,19.95,
+20.03,20.15,20.44,20.53,20.63,20.86,20.94,21.19,21.26,21.38,
+21.70,21.66,21.93,22.12,22.20,22.28,22.50,22.77,22.70,22.80,
+23.25,23.21,23.24,23.54,23.71,23.87,24.05,24.31,24.25,24.63,
+24.47,24.84,25.01,25.01,25.48,25.49,25.43,25.77,25.92,25.97,
+26.20,26.33,26.41,26.49,26.84,26.83,26.95,27.30,27.40,27.56,
+27.80,27.93,28.13,28.05,28.18,28.69,28.45,28.69,28.96,29.02,
+29.08,29.34,29.40,29.73,29.62,29.88,30.19,30.03,30.26,30.43,
+30.88,30.97,31.06,31.25,31.44,31.58,31.63,31.84,32.08,32.15,
+32.35,32.41,32.63,32.75,32.94,33.10,33.15,33.35,33.38,33.44,
+33.92,34.08,34.14,34.19,34.32,34.47,34.72,34.87,35.15,35.15,
+35.42,35.36,35.68,35.65,35.98,36.12,36.28,36.37,36.59,36.69,
+36.87,37.00,37.14,37.30,37.72,37.71,37.79,37.80,38.07,38.25,
+38.34,38.39,38.78,38.84,38.98,39.06,38.96,39.36,39.56,39.74,
+40.01,40.04,40.40,40.47,40.50,40.71,40.71,40.93,41.09,41.18,
+41.44,41.57,41.83,41.98,41.92,42.25,42.30,42.44,42.58,42.89,
+42.83,43.01,43.21,43.41,43.50,43.54,43.76,44.12,44.36,44.09,
+44.40,44.67,44.73,44.83,45.12,45.20,45.59,45.59,45.85,45.94,
+1.66,1.78,1.93,2.13,2.22,2.36,2.47,2.67,2.79,3.02,
+3.02,3.23,3.40,3.53,3.65,3.88,3.94,4.13,4.21,4.33,
+4.49,4.70,4.79,4.95,5.12,5.22,5.42,5.56,5.62,5.85,
+6.03,6.16,6.30,6.39,6.55,6.66,6.89,6.94,7.15,7.25,
+7.41,7.51,7.69,7.81,7.93,8.11,8.20,8.44,8.52,8.66,
+8.84,8.89,9.13,9.18,9.36,9.54,9.71,9.88,10.00,10.02,
+10.25,10.32,10.58,10.69,10.88,10.94,11.17,11.25,11.40,11.59,
+11.65,11.86,11.92,12.17,12.40,12.36,12.59,12.68,12.85,13.02,
+13.16,13.27,13.38,13.66,13.72,13.81,13.99,14.15,14.16,14.33,
+14.53,14.58,14.90,14.97,15.09,15.47,15.44,15.63,15.66,15.73,
+16.06,16.13,16.32,16.42,16.46,16.78,16.82,16.86,17.12,17.23,
+17.45,17.52,17.75,17.96,17.88,18.24,18.17,18.43,18.64,18.60,
+18.88,19.02,19.27,19.30,19.57,19.53,19.81,19.67,19.93,20.18,
+20.21,20.31,20.57,20.78,20.72,21.10,21.08,21.33,21.40,21.61,
+21.77,21.98,22.12,22.07,22.19,22.38,22.51,22.84,22.90,22.93,
+23.27,23.19,23.39,23.68,23.79,23.77,24.09,24.00,24.31,24.51,
+24.59,24.67,24.87,25.07,25.14,25.33,25.47,25.66,25.75,26.07,
+25.89,26.24,26.21,26.53,26.55,26.75,27.02,27.03,27.25,27.55,
+27.52,27.70,27.79,27.83,28.02,27.95,28.40,28.61,28.62,28.74,
+28.92,29.15,29.15,29.45,29.48,29.56,29.79,29.66,30.23,30.34,
+30.30,30.56,30.66,30.54,30.90,30.98,31.18,31.46,31.54,31.72,
+31.64,31.98,31.99,32.04,32.36,32.64,32.70,32.78,33.07,32.94,
+33.31,33.34,33.38,33.54,33.86,33.73,33.93,34.23,34.47,34.59,
+34.68,34.64,34.85,35.06,35.16,35.39,35.59,35.60,35.78,35.83,
+36.18,36.36,36.36,36.28,36.48,36.83,37.00,37.02,37.22,37.24,
+37.70,37.60,37.81,37.83,37.99,38.27,38.45,38.51,38.55,38.72,
+38.80,39.09,39.01,39.34,39.61,39.68,39.66,39.88,40.20,40.24,
+40.34,40.53,40.64,40.80,40.88,41.08,41.25,41.42,41.45,41.68,
+41.80,42.02,42.01,42.13,42.54,42.53,42.72,42.60,43.03,43.10
+};
+
+static float sdNumAnchors[] = {
+0.82,0.86,0.94,0.98,0.98,1.02,1.10,1.11,1.12,1.12,
+1.16,1.25,1.26,1.24,1.32,1.36,1.32,1.34,1.44,1.41,
+1.47,1.50,1.48,1.54,1.53,1.60,1.62,1.62,1.61,1.72,
+1.67,1.69,1.74,1.73,1.72,1.74,1.71,1.79,1.85,1.79,
+1.93,2.01,1.98,1.98,1.97,1.91,1.93,2.03,1.95,2.06,
+2.14,2.05,2.00,2.12,2.14,2.15,2.14,2.15,2.20,2.23,
+2.27,2.26,2.26,2.26,2.30,2.26,2.22,2.27,2.38,2.32,
+2.30,2.40,2.39,2.41,2.40,2.48,2.53,2.52,2.42,2.45,
+2.49,2.57,2.48,2.48,2.60,2.54,2.65,2.67,2.61,2.63,
+2.78,2.79,2.70,2.67,2.69,2.68,2.75,2.64,2.70,2.80,
+2.83,2.80,2.73,2.71,2.83,2.92,2.93,2.80,2.83,2.93,
+2.81,3.00,2.93,2.87,2.92,2.92,3.01,2.87,2.91,3.08,
+3.07,3.18,3.02,3.04,3.09,3.15,3.09,3.08,3.14,3.05,
+3.07,3.18,3.10,3.17,3.17,3.08,3.16,3.22,3.30,3.24,
+3.23,3.31,3.35,3.39,3.34,3.31,3.41,3.23,3.34,3.37,
+3.38,3.38,3.29,3.47,3.44,3.41,3.35,3.52,3.45,3.57,
+3.51,3.45,3.46,3.30,3.47,3.54,3.45,3.45,3.53,3.53,
+3.58,3.50,3.53,3.61,3.56,3.54,3.64,3.64,3.53,3.64,
+3.78,3.69,3.70,3.69,3.78,3.74,3.71,3.86,3.68,3.62,
+3.76,3.63,3.79,3.69,3.80,3.70,3.76,3.87,3.88,3.88,
+3.95,4.02,3.75,3.87,3.88,3.92,3.88,3.92,3.94,3.92,
+3.92,4.01,4.01,4.12,3.93,4.07,3.95,4.10,3.98,3.88,
+4.04,4.09,3.96,4.12,4.10,4.23,4.10,4.12,4.26,4.08,
+4.37,4.16,4.30,4.12,4.31,4.23,4.27,4.11,4.30,4.08,
+4.17,4.08,4.16,4.13,4.22,4.23,4.39,4.26,4.22,4.16,
+4.31,4.08,4.23,4.11,4.23,4.15,4.22,4.23,4.31,4.26,
+4.37,4.42,4.42,4.36,4.50,4.40,4.28,4.27,4.51,4.37,
+4.36,4.45,4.52,4.51,4.41,4.56,4.47,4.58,4.45,4.58,
+4.48,4.53,4.68,4.61,4.70,4.54,4.76,4.55,4.74,4.58,
+0.72,0.75,0.81,0.84,0.84,0.84,0.92,0.93,1.00,0.99,
+1.04,1.01,1.06,1.07,1.15,1.14,1.18,1.19,1.19,1.22,
+1.28,1.27,1.33,1.32,1.31,1.38,1.35,1.39,1.40,1.43,
+1.42,1.47,1.41,1.48,1.53,1.54,1.58,1.59,1.55,1.55,
+1.58,1.65,1.68,1.62,1.66,1.67,1.64,1.68,1.81,1.71,
+1.72,1.79,1.72,1.80,1.86,1.74,1.90,1.84,1.92,1.88,
+1.84,1.94,1.98,1.89,1.91,1.98,1.96,1.95,1.96,1.99,
+2.02,2.09,2.08,2.10,2.08,2.02,2.08,2.13,2.19,2.14,
+2.19,2.17,2.16,2.22,2.23,2.16,2.25,2.33,2.23,2.34,
+2.28,2.29,2.36,2.29,2.22,2.41,2.27,2.36,2.34,2.39,
+2.43,2.41,2.49,2.44,2.51,2.48,2.43,2.39,2.54,2.40,
+2.47,2.42,2.56,2.58,2.53,2.49,2.47,2.62,2.57,2.64,
+2.61,2.63,2.69,2.65,2.61,2.83,2.69,2.58,2.77,2.73,
+2.67,2.67,2.75,2.78,2.67,2.65,2.73,2.75,2.78,2.79,
+2.86,2.81,2.77,2.74,2.86,2.75,2.90,2.76,2.86,2.76,
+2.90,2.88,2.85,2.78,2.90,2.92,2.89,2.84,3.11,2.99,
+3.02,2.97,2.92,2.99,2.99,3.09,2.88,2.94,3.08,3.02,
+3.02,3.08,3.15,3.10,3.14,3.12,3.15,3.11,3.08,3.16,
+3.27,3.26,3.14,3.01,3.17,3.21,3.34,3.02,3.23,3.14,
+3.23,3.25,3.23,3.07,3.20,3.25,3.30,3.23,3.24,3.37,
+3.24,3.22,3.24,3.29,3.39,3.25,3.31,3.45,3.38,3.33,
+3.27,3.45,3.41,3.30,3.41,3.36,3.46,3.40,3.40,3.30,
+3.39,3.27,3.39,3.45,3.54,3.43,3.37,3.52,3.48,3.50,
+3.48,3.49,3.43,3.63,3.47,3.47,3.59,3.49,3.63,3.60,
+3.61,3.59,3.53,3.47,3.59,3.59,3.60,3.55,3.54,3.73,
+3.71,3.49,3.66,3.69,3.69,3.71,3.83,3.78,3.75,3.84,
+3.69,3.74,3.66,3.78,3.71,3.87,3.84,3.72,3.80,3.80,
+3.72,3.69,3.80,3.83,3.86,3.91,3.74,3.94,3.95,3.88,
+3.78,3.94,3.86,3.97,4.07,3.82,3.97,3.96,4.08,3.91,
+0.61,0.64,0.67,0.71,0.71,0.73,0.76,0.83,0.84,0.84,
+0.85,0.90,0.88,0.88,0.96,1.00,0.96,1.00,1.02,1.02,
+1.05,1.03,1.13,1.04,1.14,1.12,1.14,1.17,1.17,1.23,
+1.20,1.22,1.21,1.26,1.30,1.31,1.32,1.37,1.36,1.34,
+1.41,1.38,1.41,1.41,1.44,1.42,1.42,1.40,1.50,1.39,
+1.50,1.46,1.49,1.48,1.57,1.55,1.52,1.53,1.57,1.58,
+1.65,1.67,1.66,1.59,1.68,1.65,1.65,1.67,1.74,1.79,
+1.71,1.73,1.76,1.81,1.72,1.78,1.81,1.77,1.81,1.82,
+1.84,1.79,1.80,1.90,1.94,1.87,1.97,1.93,1.85,1.93,
+1.93,1.93,1.93,1.95,1.98,2.02,1.98,2.00,2.00,2.00,
+2.02,2.04,1.97,2.12,2.02,1.99,2.10,2.05,2.06,2.05,
+2.12,2.17,2.15,2.18,2.21,2.21,2.31,2.25,2.21,2.25,
+2.15,2.27,2.30,2.23,2.30,2.29,2.19,2.35,2.24,2.33,
+2.19,2.38,2.21,2.25,2.41,2.25,2.37,2.42,2.31,2.43,
+2.36,2.47,2.37,2.30,2.36,2.44,2.42,2.49,2.41,2.48,
+2.44,2.45,2.52,2.43,2.47,2.43,2.52,2.46,2.55,2.45,
+2.48,2.50,2.42,2.54,2.42,2.59,2.53,2.49,2.70,2.60,
+2.58,2.59,2.61,2.59,2.57,2.74,2.58,2.66,2.59,2.67,
+2.63,2.66,2.63,2.63,2.64,2.70,2.64,2.79,2.53,2.67,
+2.68,2.72,2.79,2.79,2.73,2.74,2.73,2.80,2.82,2.75,
+2.73,2.76,2.77,2.87,2.76,2.89,2.79,2.77,2.77,2.78,
+2.89,2.83,2.97,2.92,2.85,2.97,2.86,2.93,2.86,2.85,
+2.84,2.94,2.87,2.98,2.85,3.01,2.94,2.96,3.09,3.06,
+3.01,2.94,2.92,2.91,3.07,3.06,3.08,2.98,3.01,3.01,
+3.06,3.05,3.12,3.15,3.07,2.93,3.12,3.11,3.03,3.12,
+3.13,3.15,3.16,3.08,3.11,3.22,3.11,3.12,3.17,3.16,
+3.10,3.25,3.19,3.12,3.16,3.17,3.33,3.06,3.16,3.13,
+3.34,3.31,3.35,3.19,3.30,3.22,3.39,3.26,3.28,3.25,
+3.21,3.33,3.38,3.27,3.29,3.28,3.36,3.26,3.36,3.37,
+0.51,0.56,0.58,0.60,0.61,0.66,0.68,0.66,0.69,0.71,
+0.76,0.75,0.77,0.74,0.82,0.79,0.77,0.85,0.88,0.90,
+0.90,0.93,0.95,0.92,0.98,0.96,1.03,0.96,1.02,1.10,
+1.04,1.04,1.00,1.05,1.07,1.12,1.12,1.13,1.15,1.15,
+1.20,1.15,1.18,1.16,1.21,1.18,1.26,1.21,1.25,1.20,
+1.24,1.26,1.29,1.29,1.33,1.32,1.34,1.31,1.29,1.33,
+1.39,1.36,1.36,1.42,1.43,1.46,1.43,1.46,1.51,1.46,
+1.41,1.48,1.45,1.43,1.50,1.46,1.52,1.53,1.57,1.56,
+1.57,1.54,1.68,1.61,1.59,1.58,1.63,1.61,1.58,1.60,
+1.68,1.64,1.69,1.67,1.74,1.62,1.75,1.67,1.71,1.66,
+1.75,1.75,1.77,1.70,1.72,1.82,1.77,1.77,1.77,1.78,
+1.77,1.79,1.89,1.88,1.82,1.76,1.80,1.91,1.84,1.84,
+1.79,1.89,1.90,1.90,1.91,1.86,1.93,1.91,1.90,1.88,
+1.97,1.98,1.92,1.93,2.07,2.01,1.99,1.95,1.97,1.94,
+2.06,2.03,2.07,2.06,2.07,2.09,2.01,2.01,2.03,2.06,
+2.02,2.07,2.17,2.09,2.15,2.00,2.09,2.07,2.09,2.08,
+2.16,2.16,2.19,2.10,2.23,2.13,2.14,2.18,2.05,2.31,
+2.20,2.20,2.22,2.26,2.19,2.17,2.16,2.30,2.15,2.11,
+2.20,2.34,2.23,2.28,2.28,2.28,2.24,2.25,2.32,2.29,
+2.23,2.35,2.43,2.32,2.32,2.34,2.24,2.30,2.32,2.32,
+2.36,2.34,2.41,2.46,2.43,2.38,2.39,2.43,2.37,2.40,
+2.44,2.33,2.29,2.55,2.49,2.45,2.40,2.44,2.43,2.45,
+2.53,2.55,2.48,2.46,2.58,2.53,2.51,2.54,2.50,2.44,
+2.61,2.53,2.62,2.55,2.48,2.50,2.56,2.56,2.54,2.49,
+2.55,2.58,2.67,2.62,2.58,2.55,2.66,2.60,2.46,2.51,
+2.57,2.53,2.66,2.75,2.68,2.63,2.69,2.68,2.68,2.66,
+2.63,2.57,2.71,2.78,2.77,2.74,2.79,2.76,2.63,2.70,
+2.64,2.57,2.74,2.72,2.63,2.69,2.90,2.77,2.78,2.79,
+2.75,2.74,2.76,2.78,2.74,2.74,2.88,2.80,2.78,2.78,
+0.44,0.46,0.46,0.50,0.51,0.54,0.59,0.58,0.62,0.64,
+0.64,0.63,0.66,0.66,0.69,0.68,0.71,0.71,0.74,0.75,
+0.77,0.73,0.80,0.81,0.84,0.76,0.89,0.87,0.91,0.87,
+0.83,0.92,0.91,0.90,0.97,0.91,0.95,0.94,0.96,1.00,
+0.98,0.96,0.99,1.01,1.00,1.01,1.01,1.01,1.05,1.07,
+1.11,1.08,1.11,1.07,1.12,1.13,1.11,1.16,1.13,1.19,
+1.12,1.15,1.14,1.17,1.17,1.18,1.19,1.21,1.22,1.18,
+1.25,1.19,1.27,1.22,1.26,1.28,1.33,1.31,1.26,1.30,
+1.31,1.27,1.32,1.29,1.34,1.38,1.35,1.36,1.38,1.37,
+1.37,1.41,1.33,1.41,1.41,1.44,1.37,1.41,1.44,1.41,
+1.45,1.44,1.45,1.47,1.44,1.42,1.43,1.48,1.50,1.55,
+1.48,1.48,1.53,1.58,1.53,1.56,1.55,1.58,1.60,1.62,
+1.60,1.52,1.55,1.60,1.63,1.61,1.55,1.60,1.62,1.67,
+1.61,1.60,1.68,1.62,1.67,1.69,1.65,1.66,1.68,1.64,
+1.71,1.69,1.68,1.79,1.74,1.71,1.79,1.73,1.70,1.77,
+1.76,1.80,1.78,1.74,1.78,1.77,1.82,1.78,1.78,1.73,
+1.83,1.85,1.80,1.83,1.91,1.82,1.81,1.78,1.77,1.93,
+1.88,1.80,1.88,1.79,1.88,1.81,1.85,1.89,1.82,1.84,
+1.90,1.91,1.93,1.84,1.89,1.97,1.92,1.94,1.91,1.94,
+1.94,1.94,1.96,2.09,1.91,2.00,1.97,2.06,2.02,2.01,
+2.07,2.04,2.03,1.94,2.01,1.94,2.13,2.02,2.09,2.07,
+2.09,2.03,1.97,1.99,1.94,1.99,2.04,2.04,2.03,2.10,
+2.10,2.03,2.03,2.19,2.10,2.03,2.05,2.09,2.04,2.11,
+2.08,2.11,2.15,2.17,2.10,2.20,2.16,2.20,2.10,2.28,
+2.24,2.18,2.22,2.30,2.20,2.21,2.30,2.20,2.26,2.25,
+2.21,2.22,2.18,2.23,2.31,2.16,2.28,2.23,2.25,2.37,
+2.25,2.31,2.24,2.32,2.26,2.34,2.24,2.26,2.28,2.40,
+2.34,2.30,2.23,2.31,2.33,2.24,2.23,2.34,2.34,2.41,
+2.37,2.36,2.35,2.37,2.34,2.51,2.36,2.32,2.33,2.49,
+0.36,0.38,0.39,0.43,0.42,0.46,0.47,0.48,0.48,0.54,
+0.54,0.52,0.51,0.57,0.58,0.61,0.58,0.62,0.61,0.64,
+0.64,0.65,0.65,0.66,0.67,0.69,0.70,0.70,0.69,0.72,
+0.71,0.75,0.73,0.83,0.78,0.80,0.79,0.79,0.82,0.79,
+0.81,0.80,0.84,0.81,0.83,0.87,0.87,0.84,0.88,0.85,
+0.89,0.92,0.93,0.94,0.89,0.92,0.96,0.98,0.97,0.97,
+0.96,0.99,0.99,1.03,0.98,0.97,1.05,1.05,1.00,1.03,
+1.05,1.02,1.05,1.04,1.10,1.09,1.04,1.08,1.03,1.10,
+1.12,1.10,1.12,1.07,1.12,1.14,1.15,1.19,1.12,1.18,
+1.18,1.16,1.21,1.21,1.17,1.24,1.22,1.18,1.23,1.22,
+1.23,1.21,1.22,1.26,1.25,1.21,1.25,1.35,1.27,1.22,
+1.26,1.23,1.25,1.31,1.31,1.30,1.21,1.29,1.32,1.30,
+1.31,1.35,1.37,1.38,1.34,1.33,1.32,1.34,1.37,1.40,
+1.41,1.41,1.37,1.46,1.48,1.41,1.39,1.44,1.43,1.40,
+1.41,1.43,1.46,1.51,1.42,1.51,1.46,1.41,1.49,1.51,
+1.48,1.44,1.46,1.48,1.48,1.53,1.50,1.44,1.46,1.49,
+1.49,1.61,1.52,1.57,1.53,1.52,1.59,1.56,1.60,1.58,
+1.49,1.55,1.53,1.51,1.58,1.52,1.61,1.59,1.59,1.60,
+1.59,1.62,1.60,1.59,1.65,1.61,1.65,1.61,1.60,1.69,
+1.63,1.67,1.64,1.70,1.66,1.66,1.66,1.67,1.63,1.66,
+1.69,1.67,1.68,1.75,1.71,1.64,1.75,1.70,1.67,1.71,
+1.74,1.73,1.75,1.79,1.74,1.70,1.79,1.76,1.78,1.73,
+1.77,1.75,1.78,1.71,1.82,1.80,1.74,1.82,1.79,1.83,
+1.79,1.83,1.82,1.72,1.75,1.81,1.81,1.82,1.85,1.75,
+1.87,1.84,1.78,1.87,1.83,1.81,1.80,1.87,1.83,1.87,
+1.82,1.87,1.86,1.85,1.99,1.84,1.85,1.80,1.89,1.94,
+1.90,1.87,1.89,1.90,1.95,1.99,1.92,1.94,1.96,1.87,
+1.95,1.97,1.95,1.88,2.00,1.92,2.03,2.01,1.97,2.00,
+2.01,1.94,1.99,2.03,2.02,2.01,1.92,2.04,2.00,2.09,
+0.28,0.33,0.34,0.37,0.37,0.36,0.39,0.41,0.43,0.43,
+0.43,0.44,0.47,0.48,0.49,0.47,0.49,0.51,0.50,0.54,
+0.52,0.53,0.58,0.55,0.57,0.57,0.54,0.62,0.56,0.62,
+0.58,0.63,0.67,0.63,0.62,0.65,0.68,0.69,0.69,0.64,
+0.67,0.69,0.70,0.75,0.71,0.72,0.73,0.77,0.74,0.75,
+0.75,0.72,0.78,0.75,0.82,0.83,0.79,0.81,0.82,0.80,
+0.85,0.82,0.81,0.84,0.81,0.83,0.83,0.85,0.84,0.85,
+0.87,0.90,0.88,0.88,0.87,0.85,0.91,0.89,0.91,0.90,
+0.91,0.94,0.93,0.90,0.96,0.95,0.96,0.95,0.98,0.91,
+0.97,1.02,0.97,0.94,0.99,1.01,0.99,0.99,1.01,0.94,
+1.05,1.07,1.02,1.02,1.08,1.08,1.08,1.03,1.10,1.04,
+1.09,1.09,1.06,1.08,1.12,1.08,1.12,1.07,1.16,1.13,
+1.13,1.11,1.12,1.10,1.10,1.12,1.14,1.12,1.19,1.10,
+1.19,1.11,1.17,1.18,1.14,1.18,1.21,1.18,1.22,1.21,
+1.19,1.20,1.20,1.19,1.22,1.20,1.21,1.20,1.27,1.19,
+1.25,1.25,1.24,1.21,1.30,1.26,1.27,1.27,1.30,1.28,
+1.24,1.25,1.28,1.27,1.31,1.29,1.26,1.34,1.28,1.36,
+1.26,1.29,1.32,1.31,1.31,1.37,1.35,1.36,1.31,1.36,
+1.31,1.37,1.31,1.36,1.37,1.32,1.41,1.39,1.32,1.31,
+1.44,1.40,1.45,1.32,1.44,1.42,1.39,1.39,1.38,1.46,
+1.40,1.43,1.47,1.38,1.44,1.44,1.45,1.49,1.44,1.55,
+1.47,1.45,1.49,1.46,1.45,1.53,1.47,1.49,1.48,1.53,
+1.47,1.54,1.53,1.44,1.51,1.46,1.58,1.46,1.58,1.51,
+1.50,1.51,1.47,1.53,1.49,1.49,1.56,1.58,1.54,1.53,
+1.56,1.57,1.60,1.55,1.54,1.54,1.53,1.61,1.65,1.49,
+1.59,1.55,1.63,1.56,1.67,1.60,1.55,1.64,1.59,1.57,
+1.59,1.57,1.52,1.62,1.58,1.58,1.61,1.56,1.64,1.57,
+1.63,1.66,1.60,1.61,1.68,1.62,1.64,1.66,1.59,1.68,
+1.69,1.75,1.62,1.59,1.61,1.71,1.67,1.72,1.70,1.76,
+0.25,0.28,0.27,0.30,0.31,0.34,0.36,0.31,0.34,0.38,
+0.41,0.41,0.36,0.40,0.39,0.40,0.44,0.41,0.45,0.45,
+0.47,0.46,0.48,0.48,0.48,0.49,0.47,0.50,0.52,0.51,
+0.56,0.47,0.52,0.54,0.50,0.57,0.57,0.55,0.56,0.58,
+0.57,0.62,0.61,0.59,0.56,0.63,0.65,0.63,0.65,0.62,
+0.64,0.64,0.63,0.66,0.68,0.69,0.68,0.70,0.71,0.65,
+0.69,0.71,0.72,0.68,0.70,0.69,0.74,0.76,0.74,0.70,
+0.75,0.75,0.71,0.74,0.72,0.79,0.78,0.74,0.77,0.77,
+0.77,0.79,0.78,0.77,0.83,0.79,0.80,0.79,0.81,0.83,
+0.81,0.83,0.82,0.85,0.85,0.81,0.87,0.85,0.86,0.83,
+0.87,0.88,0.87,0.88,0.88,0.84,0.88,0.95,0.95,0.91,
+0.90,0.90,0.91,0.94,0.88,0.94,0.94,0.95,0.91,0.91,
+0.95,0.93,0.92,0.97,0.98,0.95,0.94,1.04,0.90,0.98,
+0.99,0.98,0.96,1.01,1.02,1.00,0.98,0.99,1.04,1.06,
+0.98,1.01,0.97,0.97,1.07,1.05,0.98,0.98,1.01,1.05,
+1.02,1.01,1.07,1.09,1.00,1.03,1.08,1.06,1.07,1.03,
+1.09,1.08,1.08,1.06,1.08,1.05,1.14,1.12,1.06,1.13,
+1.10,1.14,1.08,1.12,1.14,1.15,1.16,1.09,1.07,1.16,
+1.12,1.10,1.07,1.13,1.15,1.20,1.17,1.19,1.17,1.18,
+1.13,1.17,1.16,1.15,1.24,1.19,1.18,1.15,1.22,1.21,
+1.18,1.24,1.20,1.17,1.18,1.23,1.16,1.20,1.23,1.20,
+1.19,1.26,1.21,1.23,1.26,1.26,1.23,1.25,1.32,1.25,
+1.27,1.27,1.28,1.24,1.21,1.29,1.26,1.27,1.22,1.23,
+1.27,1.24,1.30,1.26,1.27,1.29,1.35,1.29,1.29,1.32,
+1.31,1.31,1.31,1.31,1.30,1.35,1.29,1.29,1.31,1.32,
+1.31,1.35,1.31,1.27,1.31,1.38,1.35,1.39,1.32,1.33,
+1.33,1.38,1.30,1.39,1.34,1.33,1.37,1.38,1.32,1.33,
+1.35,1.37,1.41,1.33,1.43,1.38,1.40,1.38,1.42,1.39,
+1.39,1.43,1.46,1.46,1.43,1.48,1.42,1.44,1.42,1.46,
+0.21,0.21,0.25,0.24,0.28,0.29,0.30,0.26,0.29,0.33,
+0.30,0.30,0.32,0.32,0.35,0.33,0.37,0.35,0.34,0.39,
+0.39,0.37,0.38,0.40,0.44,0.40,0.41,0.40,0.40,0.42,
+0.45,0.45,0.47,0.44,0.46,0.45,0.45,0.49,0.49,0.47,
+0.47,0.51,0.50,0.53,0.54,0.50,0.55,0.53,0.52,0.55,
+0.53,0.52,0.56,0.55,0.54,0.51,0.54,0.55,0.55,0.57,
+0.59,0.57,0.57,0.58,0.57,0.58,0.61,0.63,0.61,0.61,
+0.62,0.64,0.62,0.60,0.62,0.66,0.65,0.64,0.66,0.66,
+0.68,0.65,0.66,0.65,0.62,0.70,0.70,0.67,0.69,0.69,
+0.66,0.73,0.72,0.71,0.72,0.72,0.68,0.69,0.70,0.75,
+0.71,0.74,0.71,0.73,0.71,0.74,0.79,0.77,0.78,0.75,
+0.72,0.74,0.78,0.73,0.76,0.74,0.81,0.76,0.79,0.76,
+0.83,0.82,0.76,0.81,0.79,0.81,0.75,0.84,0.83,0.80,
+0.82,0.80,0.79,0.84,0.85,0.85,0.79,0.83,0.87,0.84,
+0.87,0.84,0.84,0.86,0.85,0.86,0.89,0.83,0.84,0.88,
+0.87,0.86,0.87,0.84,0.88,0.87,0.93,0.93,0.91,0.85,
+0.89,0.89,0.89,0.93,0.93,0.94,0.92,0.95,0.95,0.96,
+0.91,0.95,0.96,0.97,0.88,0.97,0.98,0.94,0.94,0.95,
+0.94,0.97,0.93,1.01,0.93,1.00,0.92,0.93,0.91,0.94,
+0.95,0.98,0.96,1.00,0.99,0.98,1.02,1.04,1.01,1.03,
+1.02,0.99,1.01,1.04,1.01,0.98,0.95,1.01,1.01,1.05,
+1.03,1.07,0.99,1.00,0.98,1.04,1.04,1.04,1.04,0.97,
+1.04,1.04,1.07,1.03,1.02,1.03,0.98,1.01,1.12,1.09,
+1.11,1.04,1.05,1.07,1.07,1.08,1.06,1.08,1.06,1.08,
+1.08,1.15,1.09,1.05,1.08,1.09,1.14,1.13,1.13,1.10,
+1.07,1.15,1.09,1.11,1.08,1.09,1.11,1.14,1.14,1.12,
+1.16,1.18,1.13,1.14,1.14,1.14,1.15,1.15,1.15,1.18,
+1.15,1.16,1.13,1.19,1.20,1.19,1.16,1.15,1.21,1.18,
+1.12,1.19,1.20,1.19,1.24,1.24,1.18,1.14,1.20,1.19,
+0.19,0.21,0.20,0.20,0.22,0.23,0.24,0.22,0.21,0.24,
+0.25,0.28,0.28,0.25,0.28,0.26,0.29,0.28,0.30,0.33,
+0.34,0.32,0.32,0.36,0.37,0.34,0.36,0.36,0.38,0.38,
+0.38,0.36,0.37,0.38,0.40,0.41,0.39,0.39,0.40,0.40,
+0.40,0.42,0.42,0.44,0.44,0.41,0.44,0.45,0.41,0.43,
+0.44,0.47,0.48,0.46,0.48,0.46,0.45,0.46,0.52,0.46,
+0.46,0.50,0.52,0.51,0.49,0.53,0.48,0.49,0.56,0.49,
+0.54,0.53,0.51,0.52,0.50,0.54,0.55,0.56,0.53,0.52,
+0.59,0.55,0.58,0.58,0.58,0.54,0.59,0.56,0.56,0.60,
+0.60,0.59,0.58,0.58,0.59,0.60,0.59,0.62,0.58,0.61,
+0.63,0.61,0.58,0.59,0.64,0.63,0.62,0.61,0.63,0.60,
+0.61,0.64,0.59,0.63,0.63,0.66,0.69,0.64,0.64,0.65,
+0.67,0.68,0.63,0.66,0.65,0.70,0.69,0.69,0.64,0.66,
+0.66,0.70,0.66,0.68,0.69,0.69,0.71,0.70,0.68,0.69,
+0.72,0.72,0.74,0.68,0.72,0.74,0.72,0.73,0.71,0.68,
+0.76,0.74,0.75,0.72,0.73,0.73,0.75,0.72,0.71,0.74,
+0.74,0.80,0.77,0.76,0.77,0.79,0.78,0.79,0.77,0.75,
+0.82,0.77,0.73,0.75,0.76,0.76,0.81,0.79,0.82,0.81,
+0.77,0.78,0.81,0.81,0.83,0.79,0.79,0.81,0.83,0.79,
+0.80,0.78,0.84,0.80,0.81,0.80,0.79,0.82,0.87,0.85,
+0.82,0.85,0.87,0.86,0.86,0.84,0.86,0.88,0.86,0.87,
+0.91,0.87,0.85,0.85,0.83,0.85,0.86,0.88,0.87,0.84,
+0.83,0.87,0.84,0.88,0.89,0.89,0.89,0.89,0.90,0.94,
+0.86,0.90,0.90,0.91,0.91,0.87,0.90,0.90,0.96,0.88,
+0.94,0.91,0.94,0.92,0.90,0.88,0.94,0.92,0.96,0.91,
+0.90,0.95,0.92,0.92,0.92,0.95,0.95,0.95,0.95,0.95,
+0.90,0.92,0.93,0.93,0.95,0.97,0.98,0.92,0.98,0.98,
+0.99,0.97,0.97,0.98,1.03,0.97,0.95,1.02,1.00,0.95,
+0.99,1.00,0.96,1.01,1.04,1.02,0.96,1.01,1.01,0.99,
+0.15,0.18,0.16,0.17,0.19,0.17,0.21,0.19,0.22,0.23,
+0.23,0.21,0.25,0.22,0.24,0.24,0.24,0.27,0.26,0.23,
+0.27,0.27,0.27,0.29,0.26,0.29,0.27,0.30,0.29,0.28,
+0.31,0.33,0.31,0.31,0.32,0.31,0.32,0.33,0.33,0.34,
+0.35,0.33,0.35,0.39,0.39,0.36,0.33,0.38,0.40,0.38,
+0.37,0.41,0.38,0.40,0.42,0.37,0.39,0.38,0.40,0.37,
+0.39,0.40,0.41,0.43,0.42,0.44,0.41,0.39,0.42,0.47,
+0.43,0.42,0.43,0.45,0.42,0.46,0.48,0.46,0.45,0.46,
+0.47,0.49,0.47,0.48,0.46,0.47,0.43,0.48,0.50,0.46,
+0.50,0.50,0.47,0.47,0.46,0.49,0.51,0.48,0.48,0.51,
+0.48,0.52,0.51,0.50,0.53,0.51,0.54,0.53,0.53,0.51,
+0.52,0.54,0.53,0.52,0.54,0.56,0.52,0.55,0.54,0.54,
+0.57,0.57,0.56,0.56,0.54,0.57,0.56,0.57,0.58,0.57,
+0.57,0.55,0.58,0.59,0.57,0.57,0.59,0.57,0.63,0.57,
+0.56,0.62,0.59,0.63,0.61,0.62,0.65,0.65,0.61,0.63,
+0.61,0.60,0.62,0.61,0.62,0.61,0.64,0.64,0.59,0.64,
+0.63,0.60,0.65,0.62,0.67,0.61,0.66,0.62,0.64,0.68,
+0.68,0.66,0.64,0.68,0.69,0.65,0.68,0.66,0.69,0.69,
+0.68,0.68,0.64,0.69,0.66,0.67,0.67,0.68,0.67,0.69,
+0.71,0.69,0.66,0.72,0.70,0.65,0.69,0.71,0.70,0.69,
+0.72,0.70,0.67,0.70,0.70,0.73,0.72,0.72,0.75,0.73,
+0.75,0.71,0.70,0.71,0.75,0.73,0.72,0.74,0.74,0.70,
+0.72,0.75,0.75,0.72,0.72,0.70,0.74,0.76,0.74,0.72,
+0.75,0.77,0.77,0.80,0.74,0.72,0.73,0.78,0.75,0.74,
+0.74,0.74,0.78,0.76,0.75,0.78,0.77,0.77,0.79,0.78,
+0.79,0.78,0.77,0.83,0.78,0.79,0.76,0.79,0.80,0.81,
+0.85,0.84,0.77,0.80,0.82,0.82,0.78,0.79,0.82,0.74,
+0.77,0.76,0.84,0.85,0.79,0.78,0.82,0.78,0.81,0.80,
+0.84,0.83,0.88,0.87,0.82,0.79,0.85,0.83,0.83,0.82,
+0.12,0.16,0.13,0.15,0.16,0.17,0.18,0.17,0.17,0.17,
+0.21,0.19,0.18,0.19,0.22,0.19,0.18,0.21,0.21,0.20,
+0.24,0.22,0.22,0.20,0.24,0.26,0.28,0.24,0.22,0.23,
+0.24,0.25,0.26,0.28,0.27,0.28,0.30,0.29,0.29,0.28,
+0.27,0.30,0.29,0.30,0.30,0.30,0.29,0.33,0.31,0.31,
+0.31,0.32,0.33,0.31,0.31,0.33,0.32,0.33,0.33,0.33,
+0.34,0.36,0.34,0.36,0.35,0.35,0.35,0.35,0.34,0.35,
+0.37,0.36,0.39,0.38,0.37,0.39,0.39,0.38,0.39,0.39,
+0.40,0.38,0.40,0.39,0.40,0.40,0.41,0.39,0.41,0.39,
+0.42,0.41,0.43,0.40,0.40,0.40,0.42,0.41,0.40,0.42,
+0.43,0.43,0.42,0.45,0.43,0.43,0.46,0.45,0.45,0.43,
+0.44,0.45,0.45,0.44,0.45,0.46,0.46,0.44,0.46,0.46,
+0.45,0.48,0.46,0.46,0.47,0.45,0.47,0.46,0.51,0.49,
+0.48,0.50,0.46,0.49,0.45,0.47,0.48,0.46,0.49,0.50,
+0.48,0.48,0.48,0.49,0.51,0.50,0.47,0.54,0.50,0.51,
+0.52,0.53,0.52,0.54,0.55,0.55,0.49,0.51,0.51,0.53,
+0.53,0.53,0.55,0.52,0.52,0.56,0.56,0.58,0.57,0.56,
+0.53,0.54,0.55,0.54,0.53,0.53,0.56,0.57,0.53,0.56,
+0.57,0.56,0.58,0.53,0.55,0.57,0.56,0.54,0.57,0.57,
+0.56,0.58,0.56,0.58,0.62,0.57,0.57,0.56,0.60,0.57,
+0.59,0.57,0.57,0.57,0.58,0.61,0.59,0.59,0.61,0.59,
+0.55,0.63,0.64,0.61,0.59,0.60,0.59,0.60,0.62,0.60,
+0.63,0.64,0.61,0.60,0.62,0.63,0.63,0.62,0.60,0.63,
+0.63,0.62,0.65,0.61,0.60,0.64,0.61,0.63,0.70,0.67,
+0.67,0.63,0.60,0.63,0.65,0.67,0.67,0.65,0.68,0.62,
+0.65,0.62,0.66,0.70,0.72,0.70,0.68,0.65,0.66,0.66,
+0.69,0.69,0.68,0.65,0.68,0.67,0.63,0.69,0.68,0.67,
+0.65,0.69,0.63,0.66,0.68,0.68,0.68,0.64,0.68,0.69,
+0.70,0.74,0.71,0.68,0.70,0.69,0.69,0.71,0.69,0.69,
+0.14,0.12,0.12,0.11,0.12,0.15,0.09,0.15,0.15,0.15,
+0.14,0.15,0.18,0.17,0.16,0.21,0.16,0.17,0.19,0.15,
+0.20,0.22,0.21,0.21,0.20,0.22,0.22,0.27,0.21,0.22,
+0.20,0.25,0.23,0.21,0.21,0.23,0.23,0.24,0.26,0.23,
+0.27,0.26,0.28,0.27,0.26,0.21,0.27,0.28,0.24,0.26,
+0.25,0.31,0.27,0.26,0.27,0.29,0.28,0.32,0.29,0.31,
+0.27,0.28,0.30,0.29,0.28,0.27,0.28,0.28,0.31,0.30,
+0.31,0.31,0.28,0.31,0.29,0.34,0.34,0.29,0.27,0.32,
+0.31,0.31,0.35,0.30,0.34,0.35,0.34,0.33,0.32,0.34,
+0.35,0.32,0.36,0.32,0.37,0.36,0.34,0.34,0.37,0.35,
+0.36,0.34,0.35,0.35,0.35,0.34,0.37,0.36,0.35,0.37,
+0.36,0.35,0.38,0.40,0.36,0.38,0.36,0.36,0.39,0.38,
+0.42,0.38,0.41,0.39,0.42,0.38,0.39,0.40,0.41,0.40,
+0.42,0.41,0.38,0.42,0.44,0.41,0.40,0.39,0.38,0.42,
+0.43,0.41,0.42,0.41,0.41,0.44,0.44,0.41,0.44,0.46,
+0.43,0.45,0.42,0.41,0.43,0.42,0.44,0.43,0.43,0.45,
+0.48,0.43,0.44,0.44,0.47,0.48,0.50,0.46,0.45,0.45,
+0.47,0.46,0.47,0.46,0.48,0.46,0.46,0.46,0.49,0.47,
+0.47,0.47,0.45,0.47,0.47,0.48,0.45,0.50,0.50,0.48,
+0.50,0.49,0.50,0.50,0.52,0.51,0.48,0.48,0.47,0.47,
+0.48,0.51,0.48,0.48,0.49,0.52,0.49,0.49,0.53,0.50,
+0.51,0.53,0.54,0.50,0.52,0.52,0.55,0.52,0.53,0.55,
+0.50,0.53,0.49,0.53,0.53,0.57,0.52,0.53,0.56,0.54,
+0.53,0.53,0.56,0.54,0.53,0.52,0.56,0.56,0.55,0.50,
+0.58,0.56,0.51,0.54,0.51,0.52,0.52,0.53,0.53,0.59,
+0.52,0.60,0.52,0.56,0.55,0.54,0.54,0.53,0.56,0.54,
+0.53,0.56,0.57,0.53,0.59,0.58,0.58,0.59,0.59,0.57,
+0.56,0.59,0.59,0.56,0.58,0.60,0.56,0.57,0.61,0.61,
+0.60,0.60,0.57,0.60,0.56,0.57,0.63,0.61,0.57,0.61,
+0.09,0.09,0.12,0.08,0.10,0.11,0.08,0.10,0.12,0.11,
+0.15,0.12,0.10,0.11,0.13,0.15,0.16,0.16,0.15,0.14,
+0.15,0.18,0.18,0.17,0.17,0.17,0.19,0.18,0.16,0.18,
+0.19,0.18,0.20,0.19,0.18,0.16,0.21,0.19,0.24,0.15,
+0.20,0.21,0.19,0.22,0.19,0.21,0.21,0.23,0.21,0.25,
+0.18,0.23,0.27,0.25,0.24,0.23,0.21,0.22,0.26,0.24,
+0.25,0.23,0.28,0.24,0.23,0.22,0.25,0.24,0.25,0.28,
+0.27,0.22,0.28,0.27,0.29,0.27,0.26,0.28,0.28,0.25,
+0.28,0.31,0.26,0.28,0.27,0.25,0.29,0.27,0.27,0.27,
+0.30,0.29,0.32,0.27,0.29,0.30,0.30,0.29,0.30,0.27,
+0.28,0.31,0.29,0.31,0.32,0.35,0.29,0.31,0.30,0.29,
+0.32,0.31,0.30,0.31,0.35,0.31,0.34,0.33,0.31,0.34,
+0.31,0.33,0.31,0.33,0.35,0.32,0.31,0.34,0.33,0.36,
+0.36,0.35,0.31,0.34,0.34,0.37,0.37,0.33,0.34,0.35,
+0.35,0.34,0.36,0.36,0.34,0.37,0.33,0.34,0.32,0.34,
+0.36,0.36,0.38,0.34,0.36,0.36,0.39,0.39,0.36,0.36,
+0.37,0.35,0.37,0.37,0.38,0.39,0.36,0.37,0.39,0.41,
+0.39,0.39,0.35,0.39,0.40,0.37,0.39,0.40,0.42,0.40,
+0.41,0.42,0.38,0.40,0.39,0.40,0.41,0.42,0.44,0.41,
+0.43,0.40,0.41,0.41,0.42,0.40,0.38,0.41,0.38,0.42,
+0.42,0.41,0.41,0.41,0.41,0.44,0.42,0.40,0.43,0.42,
+0.44,0.39,0.46,0.43,0.42,0.40,0.44,0.43,0.45,0.44,
+0.42,0.45,0.44,0.44,0.45,0.46,0.45,0.43,0.43,0.44,
+0.44,0.47,0.44,0.44,0.42,0.48,0.43,0.43,0.48,0.44,
+0.43,0.44,0.43,0.47,0.48,0.46,0.44,0.47,0.46,0.47,
+0.45,0.47,0.46,0.45,0.48,0.47,0.47,0.46,0.44,0.45,
+0.46,0.44,0.44,0.48,0.48,0.48,0.47,0.43,0.51,0.48,
+0.48,0.50,0.45,0.47,0.44,0.50,0.45,0.51,0.46,0.45,
+0.47,0.48,0.48,0.48,0.51,0.46,0.48,0.51,0.47,0.50,
+0.05,0.10,0.08,0.05,0.09,0.09,0.09,0.10,0.10,0.12,
+0.10,0.10,0.10,0.10,0.11,0.09,0.14,0.13,0.13,0.11,
+0.14,0.15,0.13,0.12,0.11,0.18,0.12,0.14,0.14,0.14,
+0.11,0.18,0.14,0.14,0.16,0.19,0.16,0.18,0.21,0.16,
+0.18,0.16,0.17,0.17,0.18,0.16,0.16,0.19,0.19,0.19,
+0.18,0.16,0.19,0.18,0.18,0.19,0.18,0.19,0.18,0.18,
+0.20,0.20,0.19,0.22,0.23,0.21,0.19,0.21,0.22,0.22,
+0.21,0.22,0.22,0.23,0.21,0.21,0.23,0.21,0.23,0.25,
+0.21,0.18,0.23,0.22,0.22,0.23,0.23,0.24,0.22,0.23,
+0.22,0.25,0.23,0.26,0.24,0.22,0.26,0.23,0.23,0.25,
+0.26,0.26,0.27,0.23,0.26,0.25,0.28,0.26,0.27,0.24,
+0.25,0.24,0.29,0.27,0.25,0.25,0.26,0.26,0.26,0.28,
+0.27,0.27,0.26,0.30,0.28,0.27,0.26,0.32,0.26,0.28,
+0.25,0.31,0.28,0.29,0.29,0.28,0.30,0.29,0.30,0.28,
+0.28,0.29,0.29,0.31,0.29,0.28,0.31,0.29,0.28,0.29,
+0.29,0.31,0.31,0.32,0.30,0.30,0.32,0.33,0.28,0.30,
+0.33,0.33,0.30,0.31,0.34,0.31,0.29,0.31,0.34,0.33,
+0.32,0.31,0.31,0.32,0.32,0.33,0.32,0.34,0.30,0.31,
+0.31,0.35,0.33,0.36,0.34,0.30,0.35,0.35,0.34,0.35,
+0.37,0.31,0.33,0.32,0.34,0.32,0.33,0.32,0.37,0.35,
+0.34,0.33,0.37,0.36,0.36,0.35,0.35,0.37,0.35,0.37,
+0.34,0.37,0.32,0.35,0.35,0.33,0.35,0.36,0.33,0.35,
+0.35,0.37,0.35,0.34,0.35,0.35,0.34,0.35,0.36,0.38,
+0.38,0.34,0.36,0.39,0.34,0.38,0.38,0.39,0.37,0.36,
+0.37,0.37,0.34,0.34,0.36,0.40,0.36,0.39,0.37,0.37,
+0.38,0.38,0.36,0.38,0.38,0.38,0.37,0.41,0.38,0.36,
+0.38,0.40,0.41,0.40,0.40,0.41,0.39,0.40,0.43,0.40,
+0.39,0.42,0.42,0.41,0.38,0.39,0.40,0.38,0.41,0.38,
+0.37,0.44,0.41,0.41,0.43,0.46,0.42,0.40,0.42,0.42,
+0.89,0.93,0.98,1.01,1.08,1.09,1.11,1.15,1.19,1.19,
+1.22,1.26,1.25,1.32,1.37,1.41,1.40,1.40,1.51,1.49,
+1.53,1.56,1.64,1.63,1.68,1.72,1.70,1.71,1.68,1.74,
+1.80,1.79,1.78,1.85,1.89,1.85,1.91,2.01,2.00,2.00,
+2.01,1.87,2.07,2.01,2.01,2.12,2.13,2.13,2.14,2.14,
+2.12,2.19,2.15,2.27,2.22,2.29,2.26,2.25,2.34,2.30,
+2.32,2.30,2.46,2.38,2.33,2.37,2.38,2.61,2.44,2.51,
+2.47,2.46,2.44,2.62,2.45,2.59,2.60,2.69,2.53,2.60,
+2.59,2.57,2.70,2.68,2.68,2.80,2.70,2.59,2.71,2.68,
+2.75,2.72,2.78,2.97,2.82,2.89,2.77,2.82,2.84,2.85,
+2.78,2.89,2.95,3.07,2.93,2.92,2.93,3.11,2.91,2.99,
+3.06,2.93,3.20,3.09,3.23,3.20,3.02,3.03,3.20,3.27,
+3.14,3.14,3.17,3.24,3.14,3.37,3.28,3.19,3.35,3.26,
+3.22,3.36,3.26,3.37,3.44,3.31,3.38,3.30,3.42,3.39,
+3.37,3.39,3.46,3.58,3.50,3.50,3.46,3.52,3.46,3.54,
+3.58,3.55,3.43,3.50,3.51,3.67,3.60,3.70,3.68,3.63,
+3.58,3.77,3.61,3.97,3.77,3.58,3.86,3.60,3.63,3.69,
+3.74,3.74,3.67,3.81,3.76,3.72,3.60,3.75,3.86,3.69,
+3.97,4.00,3.82,3.93,3.92,4.12,3.83,3.92,4.21,3.71,
+3.95,3.90,3.99,4.07,4.00,4.06,3.85,4.00,3.81,4.13,
+4.05,3.99,4.07,4.01,4.10,4.09,4.02,4.01,4.18,4.16,
+4.00,4.02,4.07,4.24,4.20,4.11,4.38,4.25,4.18,4.19,
+4.14,4.25,4.18,4.33,4.23,4.23,4.32,4.40,4.19,4.37,
+4.28,4.28,4.32,4.34,4.24,4.31,4.38,4.41,4.43,4.42,
+4.25,4.24,4.33,4.47,4.42,4.30,4.44,4.44,4.78,4.50,
+4.53,4.45,4.47,4.48,4.59,4.67,4.43,4.49,4.42,4.52,
+4.78,4.55,4.57,4.56,4.68,4.71,4.70,4.36,4.72,4.60,
+4.66,4.74,4.64,4.56,4.71,4.63,4.78,4.60,4.82,4.80,
+4.69,4.91,4.67,4.67,4.65,4.79,4.89,4.92,4.79,4.70,
+0.77,0.83,0.83,0.87,0.91,0.92,0.94,1.00,1.06,1.04,
+1.09,1.08,1.13,1.12,1.12,1.20,1.20,1.24,1.31,1.35,
+1.32,1.33,1.30,1.37,1.40,1.44,1.50,1.49,1.48,1.49,
+1.50,1.54,1.55,1.64,1.61,1.66,1.63,1.62,1.67,1.66,
+1.68,1.75,1.69,1.68,1.78,1.79,1.73,1.83,1.80,1.86,
+1.79,1.74,1.95,1.95,1.83,1.91,2.05,2.03,1.98,1.88,
+2.06,2.00,2.05,2.05,2.03,2.07,2.20,2.11,2.17,2.11,
+2.18,2.16,2.18,2.22,2.20,2.10,2.15,2.24,2.17,2.22,
+2.27,2.31,2.28,2.37,2.36,2.26,2.39,2.36,2.42,2.42,
+2.31,2.43,2.46,2.46,2.48,2.47,2.46,2.49,2.54,2.53,
+2.56,2.51,2.54,2.62,2.59,2.62,2.53,2.67,2.68,2.66,
+2.67,2.64,2.66,2.61,2.82,2.68,2.63,2.69,2.76,2.77,
+2.70,2.77,2.81,2.89,2.83,2.78,2.77,2.89,2.72,2.80,
+2.85,2.82,2.81,2.84,2.93,2.83,2.77,2.99,2.97,2.86,
+2.98,2.97,2.92,2.95,2.98,3.05,2.90,3.03,3.04,3.07,
+2.98,3.14,3.03,3.00,3.13,3.08,3.13,3.19,3.11,3.14,
+3.13,3.19,3.12,3.21,3.22,3.12,3.16,3.13,3.18,3.24,
+3.25,3.14,3.22,3.22,3.24,3.34,3.31,3.20,3.38,3.41,
+3.37,3.28,3.40,3.41,3.31,3.25,3.30,3.36,3.41,3.47,
+3.37,3.40,3.62,3.52,3.46,3.57,3.47,3.56,3.39,3.47,
+3.47,3.48,3.47,3.46,3.43,3.46,3.48,3.70,3.65,3.62,
+3.53,3.61,3.55,3.57,3.73,3.57,3.70,3.54,3.60,3.78,
+3.69,3.66,3.70,3.74,3.62,3.76,3.63,3.77,3.74,3.63,
+3.74,3.64,3.64,3.79,3.71,3.72,3.74,3.73,3.98,3.79,
+3.81,4.00,4.02,3.80,3.84,3.79,3.75,3.99,3.80,4.04,
+3.85,3.91,3.72,4.02,3.83,3.98,3.93,3.85,3.88,3.94,
+3.92,4.02,3.97,4.00,4.02,3.80,3.97,4.12,3.87,4.04,
+3.91,4.02,4.04,3.99,3.98,3.96,4.12,4.02,4.15,4.08,
+3.96,4.19,4.12,4.02,4.16,4.08,4.11,4.19,3.98,4.13,
+0.72,0.69,0.75,0.76,0.81,0.81,0.87,0.88,0.90,0.88,
+0.90,0.96,0.98,1.01,0.99,1.04,1.08,1.09,1.17,1.12,
+1.15,1.18,1.19,1.21,1.20,1.17,1.24,1.26,1.25,1.29,
+1.32,1.35,1.35,1.33,1.37,1.35,1.41,1.39,1.39,1.45,
+1.46,1.45,1.46,1.47,1.57,1.47,1.57,1.57,1.58,1.49,
+1.57,1.55,1.67,1.57,1.59,1.68,1.65,1.61,1.72,1.65,
+1.72,1.76,1.82,1.79,1.77,1.81,1.81,1.78,1.87,1.88,
+1.89,1.77,1.86,1.83,1.85,1.92,1.94,1.93,1.86,1.94,
+1.94,2.04,1.96,1.95,1.97,2.02,2.00,2.00,2.08,1.97,
+2.04,2.10,2.14,2.08,2.10,2.14,2.18,2.12,2.06,2.19,
+2.20,2.16,2.16,2.16,2.21,2.17,2.31,2.25,2.31,2.34,
+2.28,2.25,2.18,2.22,2.36,2.26,2.24,2.32,2.31,2.34,
+2.27,2.40,2.36,2.38,2.38,2.38,2.35,2.36,2.43,2.43,
+2.48,2.48,2.46,2.54,2.44,2.43,2.52,2.51,2.51,2.50,
+2.66,2.50,2.47,2.50,2.55,2.67,2.58,2.53,2.56,2.53,
+2.60,2.75,2.64,2.64,2.61,2.63,2.59,2.73,2.63,2.65,
+2.78,2.61,2.64,2.70,2.77,2.76,2.72,2.84,2.80,2.75,
+2.78,2.78,2.73,2.65,2.79,2.85,2.94,2.85,2.80,2.75,
+2.89,2.93,2.78,2.89,2.79,2.83,2.81,2.87,3.03,2.98,
+2.83,2.92,2.80,3.03,2.90,2.89,2.87,3.03,3.08,2.95,
+2.92,3.09,2.99,2.95,2.94,2.87,3.05,3.09,3.17,3.01,
+3.11,3.05,3.07,3.13,3.15,3.18,3.14,3.13,3.10,3.10,
+3.12,3.06,3.16,3.17,3.05,3.14,3.30,3.17,3.25,3.26,
+3.22,3.21,3.14,3.20,3.16,3.39,3.31,3.32,3.04,3.20,
+3.28,3.22,3.44,3.30,3.27,3.24,3.38,3.25,3.26,3.37,
+3.33,3.36,3.35,3.43,3.33,3.29,3.42,3.39,3.43,3.42,
+3.32,3.39,3.52,3.34,3.38,3.38,3.31,3.41,3.37,3.47,
+3.32,3.47,3.44,3.45,3.37,3.37,3.62,3.50,3.51,3.56,
+3.47,3.61,3.43,3.30,3.54,3.69,3.64,3.66,3.51,3.54,
+0.54,0.60,0.64,0.61,0.67,0.69,0.75,0.71,0.72,0.79,
+0.81,0.82,0.79,0.85,0.86,0.88,0.89,0.88,0.96,1.01,
+0.98,0.98,1.01,0.99,1.03,1.06,1.06,1.08,1.06,1.11,
+1.10,1.11,1.16,1.16,1.21,1.20,1.23,1.17,1.13,1.25,
+1.24,1.31,1.25,1.25,1.29,1.33,1.37,1.31,1.36,1.36,
+1.33,1.34,1.35,1.39,1.47,1.42,1.37,1.47,1.45,1.49,
+1.45,1.52,1.49,1.53,1.47,1.48,1.48,1.50,1.52,1.64,
+1.57,1.64,1.57,1.60,1.65,1.64,1.64,1.63,1.65,1.67,
+1.67,1.67,1.67,1.68,1.67,1.78,1.73,1.67,1.78,1.75,
+1.81,1.71,1.75,1.82,1.76,1.84,1.82,1.91,1.79,1.86,
+1.81,1.88,1.86,1.81,1.90,1.89,1.90,1.94,1.93,1.94,
+1.88,1.94,1.89,2.01,1.98,1.93,1.93,1.98,2.10,1.94,
+1.98,2.04,2.01,2.03,2.02,2.05,2.13,2.04,2.10,2.14,
+2.15,2.08,2.08,2.08,2.14,2.12,2.10,2.22,2.17,2.15,
+2.15,2.16,2.22,2.13,2.15,2.14,2.21,2.20,2.23,2.26,
+2.23,2.11,2.15,2.19,2.23,2.29,2.22,2.34,2.26,2.28,
+2.19,2.28,2.26,2.31,2.38,2.27,2.37,2.31,2.33,2.34,
+2.38,2.34,2.23,2.41,2.40,2.43,2.43,2.50,2.43,2.51,
+2.45,2.45,2.41,2.35,2.62,2.48,2.43,2.45,2.49,2.46,
+2.49,2.45,2.42,2.54,2.56,2.48,2.54,2.63,2.56,2.48,
+2.55,2.52,2.59,2.46,2.67,2.67,2.69,2.55,2.65,2.66,
+2.63,2.69,2.63,2.59,2.64,2.63,2.72,2.69,2.59,2.65,
+2.63,2.66,2.70,2.68,2.65,2.69,2.69,2.66,2.67,2.73,
+2.78,2.68,2.78,2.71,2.83,2.86,2.93,2.76,2.76,2.73,
+2.84,2.73,2.79,2.80,2.74,2.77,2.85,2.88,2.77,2.83,
+2.79,2.81,2.83,2.76,2.91,2.86,2.90,2.83,2.83,2.80,
+2.84,2.85,2.85,3.05,3.00,2.91,3.00,3.01,2.96,3.11,
+2.82,3.03,3.02,2.99,2.81,2.96,3.01,3.03,3.05,2.96,
+2.91,2.96,2.92,2.92,3.02,2.96,3.12,3.00,2.97,2.93,
+0.45,0.47,0.52,0.53,0.58,0.55,0.59,0.64,0.62,0.69,
+0.70,0.66,0.70,0.72,0.72,0.75,0.78,0.78,0.78,0.79,
+0.88,0.86,0.86,0.87,0.91,0.86,0.94,0.92,0.95,0.95,
+0.99,0.95,0.97,0.99,1.00,0.99,1.03,0.99,1.02,1.04,
+1.07,1.07,1.08,1.15,1.11,1.14,1.18,1.13,1.14,1.12,
+1.20,1.23,1.15,1.18,1.21,1.21,1.20,1.21,1.23,1.26,
+1.25,1.27,1.23,1.30,1.26,1.29,1.37,1.34,1.28,1.33,
+1.34,1.43,1.35,1.34,1.37,1.44,1.37,1.46,1.37,1.39,
+1.41,1.46,1.47,1.39,1.43,1.47,1.48,1.48,1.49,1.48,
+1.53,1.55,1.56,1.49,1.57,1.54,1.49,1.57,1.57,1.60,
+1.60,1.53,1.54,1.63,1.65,1.63,1.64,1.59,1.64,1.69,
+1.69,1.68,1.65,1.68,1.67,1.65,1.59,1.67,1.64,1.74,
+1.71,1.78,1.67,1.77,1.75,1.78,1.72,1.78,1.88,1.72,
+1.84,1.80,1.79,1.83,1.81,1.76,1.78,1.82,1.80,1.79,
+1.82,1.88,1.80,1.90,1.91,1.92,1.91,1.89,1.89,1.88,
+1.92,1.92,1.96,1.92,1.94,1.92,1.91,1.89,1.98,1.87,
+1.92,1.90,1.95,1.99,1.94,1.96,2.04,1.99,2.01,2.06,
+2.07,2.01,2.08,2.09,2.01,2.08,2.03,2.10,1.97,2.07,
+2.02,2.13,2.02,2.03,2.01,2.15,2.11,2.05,2.07,2.12,
+2.06,2.18,2.17,2.07,2.19,2.12,2.16,2.20,2.18,2.16,
+2.18,2.16,2.13,2.12,2.20,2.16,2.19,2.24,2.14,2.17,
+2.18,2.36,2.33,2.27,2.40,2.20,2.30,2.35,2.22,2.35,
+2.14,2.29,2.26,2.30,2.34,2.30,2.22,2.35,2.33,2.29,
+2.32,2.36,2.28,2.40,2.35,2.33,2.28,2.40,2.41,2.33,
+2.27,2.34,2.33,2.32,2.32,2.50,2.35,2.36,2.41,2.31,
+2.43,2.36,2.39,2.46,2.38,2.46,2.40,2.39,2.46,2.49,
+2.40,2.44,2.33,2.36,2.49,2.41,2.55,2.47,2.51,2.53,
+2.49,2.52,2.55,2.43,2.55,2.50,2.56,2.45,2.55,2.58,
+2.49,2.62,2.53,2.55,2.55,2.51,2.58,2.63,2.62,2.61,
+0.38,0.43,0.43,0.48,0.48,0.51,0.48,0.53,0.54,0.55,
+0.57,0.55,0.58,0.61,0.65,0.64,0.69,0.66,0.70,0.68,
+0.70,0.74,0.73,0.75,0.75,0.74,0.76,0.77,0.79,0.82,
+0.75,0.82,0.84,0.83,0.85,0.93,0.85,0.91,0.83,0.92,
+0.90,0.93,0.92,0.93,0.91,0.91,0.95,0.99,0.96,1.00,
+0.99,0.97,0.96,1.00,1.02,1.02,1.04,1.10,1.03,1.00,
+1.11,1.10,1.10,1.05,1.10,1.11,1.10,1.11,1.08,1.16,
+1.18,1.13,1.14,1.11,1.12,1.15,1.19,1.16,1.17,1.21,
+1.20,1.20,1.20,1.20,1.27,1.24,1.23,1.29,1.23,1.29,
+1.28,1.21,1.31,1.29,1.29,1.28,1.33,1.33,1.30,1.34,
+1.36,1.34,1.29,1.33,1.37,1.38,1.39,1.35,1.34,1.36,
+1.38,1.44,1.49,1.40,1.37,1.41,1.42,1.45,1.44,1.45,
+1.46,1.47,1.40,1.52,1.52,1.40,1.43,1.53,1.54,1.54,
+1.53,1.44,1.50,1.56,1.60,1.57,1.60,1.57,1.54,1.58,
+1.61,1.51,1.59,1.62,1.55,1.58,1.62,1.59,1.64,1.60,
+1.61,1.65,1.61,1.66,1.63,1.71,1.60,1.62,1.64,1.67,
+1.62,1.63,1.72,1.71,1.65,1.63,1.67,1.66,1.70,1.71,
+1.67,1.73,1.72,1.73,1.79,1.75,1.66,1.73,1.77,1.83,
+1.81,1.74,1.72,1.81,1.88,1.71,1.77,1.77,1.70,1.69,
+1.72,1.87,1.82,1.82,1.86,1.80,1.89,1.83,1.78,1.80,
+1.79,1.98,1.83,1.85,1.83,1.85,1.92,1.89,1.96,1.83,
+1.84,1.89,1.89,1.90,1.90,1.85,1.97,1.93,1.95,1.90,
+1.88,1.97,1.98,1.95,1.93,1.95,2.01,1.94,2.00,1.99,
+2.00,1.96,1.98,2.08,1.96,2.02,2.00,1.97,2.08,2.03,
+1.98,2.03,1.99,2.09,2.02,2.08,2.01,2.02,1.96,2.01,
+2.04,2.03,2.06,2.09,2.11,2.09,2.10,2.08,2.10,2.13,
+2.14,2.05,2.09,2.16,2.14,2.19,2.18,2.17,2.18,2.08,
+2.08,2.18,2.13,2.12,2.09,2.21,2.07,2.18,2.24,2.21,
+2.24,2.10,2.20,2.22,2.11,2.25,2.21,2.14,2.23,2.21,
+0.33,0.34,0.36,0.39,0.41,0.42,0.43,0.45,0.46,0.46,
+0.48,0.50,0.51,0.52,0.54,0.56,0.56,0.58,0.59,0.56,
+0.61,0.59,0.64,0.65,0.61,0.67,0.62,0.68,0.66,0.68,
+0.69,0.72,0.74,0.71,0.71,0.75,0.71,0.77,0.77,0.73,
+0.74,0.76,0.76,0.81,0.80,0.81,0.82,0.79,0.85,0.80,
+0.83,0.87,0.81,0.86,0.84,0.89,0.89,0.91,0.89,0.93,
+0.88,0.93,0.89,0.90,0.89,0.98,0.94,0.97,0.98,0.96,
+0.96,0.98,1.01,1.05,1.00,0.96,0.97,1.07,1.02,1.03,
+1.03,1.00,1.10,1.04,1.09,1.00,1.08,1.06,1.06,1.09,
+1.06,1.05,1.05,1.08,1.07,1.08,1.13,1.11,1.15,1.09,
+1.09,1.09,1.19,1.14,1.19,1.13,1.16,1.18,1.16,1.14,
+1.11,1.19,1.17,1.21,1.20,1.19,1.26,1.25,1.26,1.22,
+1.21,1.25,1.27,1.26,1.29,1.27,1.28,1.25,1.29,1.23,
+1.30,1.28,1.31,1.31,1.33,1.30,1.29,1.30,1.25,1.33,
+1.32,1.31,1.28,1.37,1.34,1.34,1.38,1.33,1.42,1.43,
+1.36,1.36,1.38,1.38,1.40,1.37,1.41,1.41,1.29,1.38,
+1.34,1.43,1.40,1.44,1.39,1.48,1.45,1.44,1.45,1.44,
+1.50,1.42,1.50,1.50,1.42,1.46,1.47,1.52,1.50,1.51,
+1.53,1.49,1.47,1.43,1.57,1.47,1.53,1.51,1.52,1.53,
+1.53,1.54,1.52,1.51,1.53,1.53,1.49,1.55,1.58,1.51,
+1.63,1.66,1.59,1.56,1.59,1.64,1.61,1.64,1.62,1.60,
+1.64,1.62,1.61,1.58,1.61,1.59,1.59,1.62,1.65,1.63,
+1.60,1.72,1.60,1.62,1.55,1.67,1.64,1.66,1.68,1.66,
+1.68,1.75,1.70,1.74,1.68,1.77,1.72,1.66,1.75,1.71,
+1.70,1.71,1.71,1.69,1.74,1.67,1.75,1.70,1.77,1.75,
+1.80,1.72,1.75,1.78,1.78,1.74,1.70,1.78,1.78,1.74,
+1.72,1.85,1.77,1.71,1.84,1.74,1.81,1.82,1.80,1.77,
+1.85,1.89,1.88,1.79,1.81,1.73,1.78,1.84,1.84,1.81,
+1.85,1.86,1.86,1.84,1.82,1.86,1.91,1.88,1.83,1.82,
+0.26,0.27,0.32,0.31,0.37,0.38,0.37,0.38,0.40,0.37,
+0.43,0.43,0.44,0.45,0.44,0.45,0.46,0.48,0.45,0.50,
+0.55,0.50,0.50,0.54,0.54,0.58,0.55,0.53,0.56,0.57,
+0.61,0.58,0.57,0.58,0.61,0.57,0.57,0.63,0.66,0.60,
+0.64,0.65,0.66,0.66,0.67,0.69,0.67,0.71,0.70,0.72,
+0.74,0.71,0.72,0.75,0.71,0.71,0.74,0.79,0.73,0.77,
+0.78,0.72,0.80,0.82,0.78,0.79,0.80,0.77,0.81,0.79,
+0.79,0.82,0.83,0.79,0.83,0.82,0.84,0.84,0.86,0.84,
+0.85,0.91,0.90,0.92,0.90,0.85,0.88,0.92,0.92,0.93,
+0.90,0.87,0.89,0.90,0.90,0.92,0.96,0.96,0.92,0.98,
+0.95,0.99,0.97,1.01,0.97,0.98,1.05,0.97,1.00,1.03,
+1.02,1.01,1.03,1.01,1.04,0.99,1.02,1.01,1.01,1.06,
+1.10,1.06,1.06,1.07,1.14,1.04,1.04,1.06,1.08,1.07,
+1.09,1.07,1.09,1.04,1.10,1.13,1.13,1.13,1.12,1.11,
+1.12,1.12,1.10,1.11,1.15,1.15,1.19,1.15,1.18,1.10,
+1.18,1.15,1.16,1.18,1.17,1.16,1.18,1.19,1.23,1.17,
+1.21,1.24,1.22,1.22,1.21,1.21,1.16,1.20,1.23,1.20,
+1.27,1.20,1.21,1.24,1.22,1.23,1.23,1.22,1.23,1.26,
+1.23,1.23,1.26,1.30,1.33,1.28,1.26,1.27,1.31,1.30,
+1.24,1.28,1.29,1.36,1.33,1.27,1.31,1.32,1.33,1.29,
+1.29,1.30,1.31,1.33,1.36,1.30,1.32,1.39,1.37,1.26,
+1.39,1.35,1.33,1.36,1.40,1.36,1.35,1.42,1.36,1.37,
+1.37,1.41,1.41,1.45,1.38,1.39,1.45,1.38,1.42,1.39,
+1.43,1.47,1.38,1.45,1.46,1.46,1.39,1.44,1.41,1.44,
+1.43,1.46,1.47,1.47,1.44,1.43,1.51,1.49,1.38,1.47,
+1.48,1.46,1.45,1.48,1.47,1.52,1.54,1.46,1.45,1.52,
+1.46,1.52,1.44,1.52,1.52,1.49,1.46,1.54,1.54,1.53,
+1.55,1.54,1.57,1.52,1.56,1.50,1.53,1.51,1.54,1.55,
+1.59,1.61,1.53,1.54,1.57,1.53,1.59,1.57,1.56,1.58,
+0.27,0.24,0.28,0.28,0.30,0.32,0.31,0.33,0.31,0.33,
+0.37,0.32,0.36,0.36,0.37,0.38,0.39,0.40,0.40,0.43,
+0.42,0.45,0.47,0.45,0.46,0.48,0.46,0.47,0.45,0.49,
+0.46,0.52,0.46,0.49,0.55,0.53,0.52,0.52,0.54,0.54,
+0.57,0.54,0.53,0.57,0.57,0.56,0.59,0.63,0.64,0.59,
+0.59,0.60,0.62,0.63,0.64,0.61,0.65,0.67,0.62,0.63,
+0.67,0.65,0.63,0.66,0.70,0.70,0.68,0.70,0.67,0.73,
+0.72,0.68,0.72,0.71,0.71,0.71,0.73,0.70,0.74,0.69,
+0.71,0.72,0.74,0.72,0.75,0.78,0.79,0.79,0.83,0.76,
+0.76,0.81,0.78,0.78,0.76,0.77,0.76,0.81,0.83,0.85,
+0.80,0.79,0.78,0.78,0.80,0.81,0.77,0.88,0.81,0.81,
+0.81,0.83,0.84,0.89,0.86,0.88,0.85,0.86,0.88,0.83,
+0.88,0.88,0.85,0.88,0.88,0.87,0.91,0.93,0.90,0.83,
+0.87,0.92,0.91,0.91,0.96,0.92,0.91,0.97,0.94,0.94,
+0.95,0.95,0.98,0.97,0.95,0.95,0.94,0.91,0.96,0.96,
+0.94,0.97,0.94,0.95,0.99,1.01,1.00,0.97,0.96,1.01,
+1.02,1.02,0.98,1.01,1.02,0.96,1.04,1.02,1.05,1.07,
+1.04,1.07,1.01,0.97,1.02,1.03,1.06,1.08,1.04,1.04,
+1.07,1.08,1.11,1.07,1.03,1.08,1.12,1.05,1.09,1.04,
+1.01,1.09,1.09,1.13,1.07,1.11,1.11,1.15,1.16,1.06,
+1.13,1.17,1.14,1.12,1.20,1.16,1.11,1.11,1.17,1.13,
+1.14,1.18,1.15,1.18,1.17,1.12,1.15,1.17,1.21,1.18,
+1.14,1.17,1.20,1.15,1.20,1.19,1.18,1.23,1.26,1.23,
+1.11,1.17,1.18,1.21,1.19,1.23,1.20,1.23,1.23,1.22,
+1.22,1.24,1.20,1.23,1.20,1.21,1.21,1.26,1.20,1.27,
+1.25,1.24,1.21,1.21,1.26,1.23,1.29,1.25,1.31,1.29,
+1.29,1.30,1.33,1.31,1.26,1.26,1.29,1.27,1.32,1.28,
+1.33,1.31,1.30,1.29,1.31,1.31,1.26,1.36,1.31,1.38,
+1.30,1.32,1.29,1.31,1.35,1.30,1.30,1.34,1.35,1.29,
+0.21,0.19,0.24,0.25,0.28,0.26,0.26,0.28,0.31,0.30,
+0.29,0.31,0.28,0.32,0.31,0.36,0.33,0.35,0.35,0.34,
+0.34,0.39,0.39,0.38,0.36,0.34,0.39,0.41,0.39,0.41,
+0.38,0.44,0.41,0.41,0.44,0.45,0.45,0.46,0.47,0.48,
+0.45,0.48,0.48,0.49,0.49,0.51,0.51,0.50,0.50,0.49,
+0.52,0.55,0.52,0.52,0.54,0.53,0.52,0.57,0.57,0.53,
+0.55,0.53,0.56,0.56,0.60,0.58,0.56,0.61,0.54,0.59,
+0.58,0.59,0.62,0.59,0.61,0.58,0.61,0.61,0.62,0.62,
+0.58,0.60,0.65,0.61,0.66,0.64,0.60,0.63,0.67,0.62,
+0.68,0.65,0.68,0.68,0.61,0.67,0.68,0.65,0.67,0.69,
+0.70,0.74,0.70,0.71,0.69,0.70,0.71,0.70,0.70,0.73,
+0.68,0.73,0.75,0.74,0.70,0.69,0.73,0.71,0.73,0.74,
+0.72,0.72,0.72,0.73,0.73,0.79,0.76,0.79,0.76,0.77,
+0.76,0.77,0.79,0.80,0.77,0.80,0.83,0.80,0.80,0.81,
+0.78,0.82,0.81,0.79,0.75,0.80,0.81,0.82,0.85,0.85,
+0.78,0.82,0.85,0.83,0.84,0.85,0.85,0.83,0.85,0.87,
+0.85,0.86,0.86,0.87,0.87,0.86,0.89,0.87,0.86,0.90,
+0.86,0.91,0.85,0.92,0.89,0.89,0.88,0.91,0.90,0.92,
+0.90,0.90,0.93,0.90,0.92,0.93,0.92,0.92,0.91,0.93,
+0.88,0.93,0.97,0.97,0.93,0.91,0.95,0.95,0.95,0.94,
+0.90,0.96,0.98,1.01,0.94,0.97,0.98,1.04,0.95,1.00,
+0.98,0.97,1.02,0.98,1.03,1.03,0.95,0.98,1.01,0.99,
+1.00,1.04,0.97,0.99,0.96,1.02,1.02,0.96,0.96,1.03,
+1.00,1.01,1.10,1.00,1.00,1.06,1.02,1.02,1.08,1.03,
+1.02,1.04,1.07,1.03,1.07,1.07,1.03,1.06,1.05,1.07,
+1.09,1.07,1.05,1.06,1.09,1.05,1.05,1.05,1.07,1.04,
+1.12,1.10,1.03,1.05,1.04,1.06,1.04,1.06,1.05,1.10,
+1.08,1.09,1.08,1.04,1.06,1.08,1.12,1.13,1.08,1.09,
+1.11,1.18,1.14,1.11,1.11,1.09,1.12,1.13,1.11,1.15,
+0.21,0.19,0.22,0.18,0.23,0.22,0.23,0.21,0.26,0.25,
+0.28,0.28,0.24,0.26,0.27,0.27,0.29,0.28,0.30,0.32,
+0.30,0.31,0.32,0.30,0.32,0.31,0.32,0.38,0.37,0.35,
+0.34,0.36,0.36,0.34,0.35,0.39,0.39,0.39,0.41,0.41,
+0.40,0.41,0.37,0.42,0.45,0.42,0.42,0.46,0.42,0.41,
+0.42,0.48,0.46,0.43,0.46,0.45,0.45,0.49,0.45,0.50,
+0.47,0.46,0.51,0.46,0.46,0.46,0.47,0.52,0.50,0.48,
+0.50,0.49,0.53,0.50,0.52,0.49,0.49,0.51,0.49,0.51,
+0.52,0.53,0.52,0.52,0.52,0.54,0.54,0.54,0.55,0.56,
+0.55,0.56,0.61,0.56,0.53,0.58,0.53,0.56,0.57,0.58,
+0.59,0.59,0.57,0.62,0.63,0.59,0.61,0.59,0.57,0.59,
+0.56,0.64,0.58,0.62,0.63,0.63,0.61,0.62,0.61,0.64,
+0.64,0.64,0.63,0.62,0.66,0.63,0.63,0.71,0.66,0.66,
+0.68,0.67,0.63,0.66,0.70,0.66,0.66,0.67,0.68,0.70,
+0.68,0.68,0.67,0.68,0.70,0.68,0.65,0.70,0.67,0.70,
+0.72,0.71,0.68,0.69,0.67,0.72,0.71,0.70,0.75,0.69,
+0.73,0.74,0.72,0.71,0.67,0.73,0.71,0.74,0.70,0.72,
+0.74,0.75,0.75,0.76,0.79,0.73,0.72,0.75,0.78,0.78,
+0.77,0.76,0.76,0.74,0.76,0.78,0.81,0.80,0.77,0.74,
+0.79,0.77,0.77,0.82,0.77,0.77,0.78,0.77,0.80,0.77,
+0.81,0.84,0.82,0.80,0.83,0.80,0.82,0.86,0.79,0.80,
+0.80,0.83,0.84,0.80,0.86,0.84,0.86,0.80,0.81,0.86,
+0.84,0.84,0.85,0.85,0.82,0.85,0.85,0.86,0.89,0.85,
+0.86,0.92,0.84,0.86,0.79,0.88,0.86,0.84,0.90,0.88,
+0.85,0.88,0.84,0.91,0.88,0.88,0.87,0.88,0.86,0.88,
+0.88,0.89,0.90,0.91,0.92,0.96,0.96,0.88,0.93,0.89,
+0.92,0.92,0.90,0.82,0.89,0.90,0.96,0.92,0.90,0.90,
+0.91,0.94,0.90,0.93,0.93,0.98,0.92,0.99,0.99,0.88,
+0.94,0.92,0.93,0.97,0.93,0.92,0.94,0.92,0.91,0.96,
+0.16,0.16,0.16,0.16,0.20,0.19,0.21,0.21,0.20,0.19,
+0.22,0.22,0.21,0.23,0.24,0.24,0.20,0.24,0.23,0.25,
+0.24,0.24,0.26,0.29,0.25,0.28,0.27,0.30,0.28,0.29,
+0.33,0.31,0.34,0.30,0.32,0.30,0.34,0.31,0.32,0.33,
+0.33,0.31,0.33,0.34,0.36,0.34,0.34,0.34,0.32,0.33,
+0.34,0.39,0.38,0.36,0.37,0.39,0.38,0.38,0.40,0.39,
+0.40,0.39,0.36,0.41,0.39,0.40,0.42,0.39,0.44,0.40,
+0.40,0.40,0.44,0.42,0.45,0.43,0.42,0.38,0.43,0.43,
+0.46,0.45,0.45,0.46,0.45,0.46,0.48,0.48,0.46,0.47,
+0.46,0.46,0.48,0.48,0.50,0.47,0.48,0.50,0.48,0.52,
+0.48,0.52,0.49,0.53,0.49,0.49,0.54,0.51,0.52,0.51,
+0.49,0.51,0.51,0.50,0.49,0.51,0.53,0.52,0.52,0.53,
+0.53,0.53,0.55,0.56,0.53,0.51,0.53,0.53,0.58,0.55,
+0.55,0.53,0.59,0.54,0.56,0.55,0.58,0.59,0.56,0.59,
+0.58,0.55,0.55,0.57,0.58,0.57,0.55,0.61,0.60,0.57,
+0.59,0.60,0.60,0.57,0.58,0.61,0.61,0.61,0.63,0.61,
+0.62,0.60,0.66,0.58,0.62,0.61,0.60,0.63,0.65,0.64,
+0.64,0.65,0.62,0.66,0.63,0.65,0.63,0.65,0.68,0.63,
+0.63,0.67,0.66,0.63,0.66,0.63,0.62,0.63,0.65,0.69,
+0.63,0.64,0.68,0.71,0.66,0.67,0.64,0.67,0.67,0.69,
+0.70,0.69,0.67,0.66,0.68,0.68,0.65,0.66,0.68,0.70,
+0.69,0.72,0.65,0.72,0.76,0.70,0.69,0.69,0.71,0.69,
+0.71,0.75,0.71,0.69,0.71,0.71,0.69,0.74,0.74,0.73,
+0.75,0.72,0.76,0.73,0.71,0.72,0.74,0.75,0.75,0.75,
+0.77,0.74,0.78,0.74,0.76,0.71,0.76,0.74,0.73,0.74,
+0.76,0.75,0.78,0.79,0.72,0.74,0.76,0.75,0.74,0.74,
+0.79,0.77,0.77,0.74,0.77,0.76,0.79,0.76,0.70,0.80,
+0.77,0.80,0.80,0.74,0.80,0.74,0.77,0.81,0.81,0.75,
+0.78,0.82,0.78,0.78,0.80,0.78,0.83,0.81,0.83,0.85,
+0.11,0.16,0.16,0.16,0.16,0.15,0.16,0.16,0.18,0.18,
+0.17,0.20,0.15,0.18,0.19,0.18,0.20,0.23,0.20,0.21,
+0.22,0.21,0.24,0.21,0.24,0.25,0.23,0.24,0.24,0.27,
+0.24,0.24,0.29,0.26,0.29,0.22,0.29,0.25,0.30,0.26,
+0.26,0.31,0.29,0.28,0.32,0.28,0.31,0.27,0.29,0.29,
+0.34,0.32,0.30,0.31,0.33,0.31,0.32,0.33,0.33,0.35,
+0.31,0.32,0.36,0.34,0.33,0.33,0.33,0.36,0.34,0.37,
+0.37,0.35,0.34,0.36,0.35,0.36,0.38,0.34,0.37,0.38,
+0.38,0.40,0.35,0.41,0.40,0.36,0.38,0.42,0.43,0.39,
+0.41,0.40,0.38,0.39,0.43,0.39,0.40,0.38,0.42,0.39,
+0.40,0.41,0.39,0.41,0.42,0.43,0.44,0.40,0.39,0.43,
+0.44,0.43,0.44,0.41,0.43,0.43,0.46,0.42,0.45,0.42,
+0.46,0.46,0.44,0.45,0.46,0.46,0.48,0.45,0.46,0.44,
+0.45,0.46,0.47,0.45,0.47,0.46,0.48,0.43,0.47,0.50,
+0.47,0.49,0.49,0.46,0.49,0.46,0.49,0.50,0.50,0.52,
+0.49,0.49,0.51,0.48,0.53,0.50,0.52,0.49,0.51,0.48,
+0.50,0.54,0.50,0.52,0.54,0.54,0.53,0.54,0.53,0.53,
+0.57,0.51,0.52,0.50,0.53,0.53,0.52,0.53,0.54,0.52,
+0.51,0.56,0.56,0.56,0.53,0.54,0.52,0.58,0.54,0.54,
+0.55,0.58,0.57,0.52,0.55,0.54,0.59,0.59,0.55,0.57,
+0.55,0.59,0.56,0.59,0.56,0.53,0.58,0.56,0.57,0.56,
+0.61,0.60,0.56,0.57,0.61,0.60,0.59,0.59,0.59,0.61,
+0.61,0.59,0.60,0.61,0.60,0.63,0.58,0.64,0.60,0.63,
+0.60,0.62,0.61,0.61,0.63,0.61,0.63,0.61,0.64,0.65,
+0.59,0.61,0.63,0.63,0.64,0.61,0.63,0.64,0.62,0.61,
+0.62,0.60,0.68,0.63,0.63,0.64,0.67,0.59,0.62,0.61,
+0.67,0.63,0.65,0.67,0.62,0.64,0.68,0.68,0.67,0.69,
+0.64,0.68,0.63,0.67,0.66,0.70,0.65,0.69,0.67,0.65,
+0.68,0.68,0.65,0.69,0.67,0.67,0.65,0.67,0.67,0.70,
+0.12,0.10,0.12,0.13,0.11,0.15,0.12,0.12,0.12,0.13,
+0.13,0.16,0.15,0.15,0.13,0.15,0.15,0.18,0.17,0.17,
+0.20,0.18,0.18,0.23,0.20,0.18,0.22,0.19,0.19,0.22,
+0.22,0.21,0.22,0.22,0.21,0.21,0.23,0.24,0.20,0.23,
+0.22,0.25,0.23,0.22,0.26,0.23,0.26,0.26,0.22,0.26,
+0.25,0.29,0.27,0.26,0.25,0.25,0.28,0.28,0.28,0.26,
+0.28,0.28,0.30,0.29,0.28,0.31,0.29,0.29,0.29,0.31,
+0.30,0.28,0.31,0.28,0.30,0.32,0.29,0.33,0.32,0.31,
+0.31,0.32,0.31,0.30,0.34,0.30,0.33,0.33,0.31,0.34,
+0.32,0.33,0.31,0.32,0.36,0.35,0.35,0.32,0.34,0.33,
+0.36,0.35,0.35,0.38,0.34,0.37,0.36,0.33,0.31,0.35,
+0.34,0.37,0.37,0.35,0.37,0.38,0.38,0.37,0.38,0.39,
+0.36,0.39,0.42,0.39,0.41,0.39,0.41,0.36,0.40,0.39,
+0.41,0.40,0.37,0.41,0.37,0.39,0.38,0.39,0.42,0.39,
+0.42,0.41,0.40,0.40,0.42,0.39,0.41,0.42,0.43,0.39,
+0.42,0.40,0.40,0.41,0.41,0.42,0.40,0.43,0.44,0.44,
+0.44,0.45,0.43,0.45,0.44,0.45,0.45,0.48,0.44,0.44,
+0.42,0.44,0.44,0.49,0.47,0.42,0.48,0.43,0.47,0.48,
+0.46,0.45,0.43,0.50,0.44,0.46,0.47,0.49,0.46,0.50,
+0.45,0.45,0.49,0.49,0.46,0.47,0.47,0.47,0.47,0.48,
+0.48,0.46,0.47,0.49,0.50,0.48,0.47,0.51,0.49,0.48,
+0.49,0.52,0.49,0.49,0.51,0.51,0.50,0.52,0.53,0.47,
+0.48,0.47,0.50,0.51,0.51,0.48,0.51,0.46,0.51,0.46,
+0.51,0.48,0.52,0.51,0.54,0.53,0.57,0.52,0.51,0.49,
+0.53,0.49,0.52,0.52,0.49,0.53,0.54,0.53,0.53,0.56,
+0.55,0.49,0.53,0.58,0.55,0.54,0.58,0.50,0.58,0.55,
+0.56,0.57,0.53,0.55,0.52,0.51,0.54,0.57,0.52,0.58,
+0.56,0.56,0.52,0.57,0.58,0.58,0.54,0.54,0.53,0.53,
+0.58,0.57,0.55,0.57,0.58,0.57,0.57,0.55,0.58,0.59,
+0.08,0.09,0.11,0.10,0.09,0.11,0.14,0.12,0.11,0.14,
+0.13,0.12,0.11,0.10,0.14,0.13,0.13,0.16,0.16,0.15,
+0.16,0.14,0.13,0.15,0.19,0.19,0.15,0.18,0.16,0.18,
+0.17,0.15,0.16,0.18,0.18,0.19,0.20,0.20,0.21,0.21,
+0.20,0.18,0.21,0.21,0.21,0.19,0.22,0.20,0.22,0.23,
+0.22,0.20,0.21,0.22,0.24,0.20,0.23,0.21,0.25,0.21,
+0.23,0.22,0.23,0.27,0.25,0.25,0.24,0.23,0.22,0.23,
+0.26,0.26,0.26,0.27,0.28,0.25,0.24,0.25,0.25,0.28,
+0.25,0.24,0.28,0.26,0.28,0.26,0.25,0.27,0.28,0.25,
+0.28,0.27,0.29,0.30,0.30,0.30,0.29,0.28,0.31,0.30,
+0.28,0.32,0.30,0.29,0.28,0.30,0.28,0.30,0.30,0.32,
+0.33,0.30,0.33,0.33,0.34,0.34,0.29,0.29,0.30,0.30,
+0.32,0.27,0.33,0.31,0.32,0.30,0.34,0.35,0.31,0.36,
+0.36,0.31,0.36,0.36,0.35,0.37,0.36,0.35,0.32,0.34,
+0.36,0.35,0.32,0.39,0.36,0.35,0.31,0.38,0.35,0.36,
+0.37,0.36,0.35,0.35,0.32,0.36,0.36,0.37,0.32,0.36,
+0.35,0.35,0.35,0.36,0.37,0.37,0.35,0.36,0.39,0.35,
+0.36,0.39,0.37,0.43,0.37,0.39,0.36,0.38,0.40,0.39,
+0.38,0.40,0.41,0.40,0.35,0.37,0.39,0.40,0.38,0.40,
+0.38,0.41,0.40,0.38,0.41,0.42,0.42,0.43,0.39,0.40,
+0.43,0.41,0.42,0.41,0.41,0.40,0.44,0.42,0.40,0.43,
+0.43,0.41,0.37,0.40,0.44,0.43,0.41,0.44,0.40,0.47,
+0.45,0.40,0.45,0.44,0.44,0.44,0.43,0.44,0.44,0.45,
+0.42,0.42,0.45,0.44,0.44,0.42,0.44,0.43,0.43,0.44,
+0.44,0.44,0.44,0.42,0.45,0.44,0.45,0.44,0.47,0.45,
+0.42,0.43,0.45,0.44,0.44,0.45,0.46,0.43,0.48,0.42,
+0.50,0.44,0.46,0.46,0.50,0.47,0.47,0.49,0.47,0.46,
+0.47,0.46,0.50,0.48,0.48,0.47,0.51,0.46,0.49,0.48,
+0.48,0.50,0.48,0.48,0.46,0.47,0.50,0.51,0.47,0.49,
+0.91,0.94,0.97,1.10,1.13,1.11,1.16,1.20,1.26,1.29,
+1.28,1.36,1.38,1.44,1.44,1.45,1.50,1.47,1.51,1.57,
+1.50,1.65,1.66,1.75,1.62,1.71,1.69,1.80,1.78,1.86,
+1.87,1.86,1.86,1.89,1.89,1.97,1.91,2.01,1.98,2.02,
+2.04,2.11,2.06,2.12,2.11,2.19,2.11,2.19,2.23,2.26,
+2.33,2.22,2.26,2.24,2.34,2.23,2.36,2.36,2.40,2.45,
+2.47,2.39,2.40,2.44,2.50,2.56,2.43,2.59,2.55,2.59,
+2.63,2.68,2.69,2.68,2.64,2.65,2.72,2.67,2.71,2.79,
+2.86,2.72,2.65,2.83,2.82,2.92,2.89,2.88,2.88,2.81,
+3.01,3.05,2.95,2.90,2.95,3.11,2.89,3.04,3.04,3.12,
+3.05,2.93,3.10,3.09,3.13,3.17,3.17,3.29,3.10,3.21,
+3.04,3.18,3.22,3.19,3.34,3.39,3.37,3.24,3.26,3.22,
+3.43,3.36,3.40,3.34,3.25,3.42,3.44,3.39,3.35,3.28,
+3.29,3.39,3.51,3.50,3.48,3.53,3.41,3.51,3.51,3.62,
+3.57,3.48,3.80,3.55,3.68,3.57,3.66,3.69,3.74,3.68,
+3.70,3.64,3.81,3.71,3.73,3.72,3.67,3.76,3.75,3.84,
+3.89,3.85,3.72,3.85,3.82,3.83,4.00,3.92,3.86,3.82,
+3.99,3.80,3.80,3.77,3.94,3.92,4.02,4.02,3.89,4.02,
+3.94,3.94,4.11,4.01,4.11,4.10,4.29,4.08,3.96,4.24,
+4.08,4.10,4.09,4.18,4.00,4.12,4.18,4.11,4.16,4.28,
+4.16,4.10,4.24,4.31,4.17,4.23,4.06,4.25,4.28,4.33,
+4.51,4.28,4.39,4.28,4.39,4.41,4.41,4.27,4.33,4.31,
+4.37,4.41,4.25,4.29,4.36,4.42,4.62,4.30,4.42,4.34,
+4.58,4.26,4.44,4.45,4.53,4.60,4.44,4.55,4.60,4.53,
+4.54,4.59,4.58,4.56,4.80,4.57,4.67,4.57,4.58,4.64,
+4.65,4.70,4.76,4.78,4.66,4.62,4.81,4.77,4.62,4.70,
+4.89,4.63,4.65,4.95,4.75,4.72,4.91,4.62,4.69,4.70,
+4.66,4.88,4.86,4.99,5.14,5.03,4.85,4.74,4.91,5.06,
+4.95,4.85,4.87,4.99,4.95,4.90,5.10,5.00,5.02,5.17,
+0.77,0.88,0.89,0.97,0.98,0.95,1.00,1.04,1.11,1.12,
+1.14,1.16,1.16,1.19,1.22,1.29,1.29,1.38,1.34,1.36,
+1.35,1.43,1.44,1.45,1.46,1.51,1.59,1.54,1.52,1.61,
+1.54,1.62,1.67,1.73,1.70,1.69,1.77,1.75,1.76,1.72,
+1.76,1.75,1.82,1.83,1.84,1.94,1.88,1.94,1.93,1.99,
+2.09,2.02,2.01,2.01,2.05,1.93,2.07,2.04,2.01,2.14,
+2.12,2.10,2.16,2.20,2.24,2.31,2.17,2.22,2.23,2.25,
+2.22,2.27,2.20,2.32,2.40,2.42,2.32,2.33,2.38,2.35,
+2.48,2.51,2.44,2.46,2.47,2.41,2.47,2.48,2.59,2.51,
+2.49,2.61,2.55,2.62,2.61,2.50,2.70,2.59,2.59,2.61,
+2.63,2.59,2.64,2.60,2.68,2.74,2.77,2.67,2.80,2.69,
+2.72,2.83,2.77,2.83,2.73,2.95,2.81,3.01,2.96,2.88,
+2.86,2.85,2.95,2.90,2.90,3.00,3.02,2.90,3.04,3.09,
+2.98,3.00,2.96,2.99,3.13,3.13,3.13,3.18,3.16,3.13,
+3.05,3.02,3.13,3.09,3.07,3.17,3.03,3.21,3.29,3.29,
+3.03,3.25,3.18,3.23,3.13,3.33,3.23,3.28,3.15,3.42,
+3.45,3.30,3.42,3.42,3.48,3.37,3.35,3.40,3.36,3.43,
+3.36,3.25,3.49,3.45,3.45,3.43,3.38,3.39,3.35,3.48,
+3.51,3.40,3.51,3.44,3.51,3.54,3.59,3.66,3.62,3.59,
+3.57,3.56,3.54,3.72,3.56,3.73,3.86,3.72,3.52,3.47,
+3.60,3.66,3.66,3.63,3.83,3.83,3.59,3.80,3.69,3.95,
+3.73,3.71,3.83,3.71,3.77,3.81,3.73,3.77,3.86,3.83,
+3.98,3.83,4.00,3.83,4.02,3.90,4.03,3.83,4.03,3.91,
+4.04,3.86,3.89,4.11,3.97,3.91,3.87,3.76,3.93,4.07,
+3.85,3.94,4.05,4.14,3.98,4.03,4.03,4.17,4.04,4.03,
+3.98,4.15,4.31,4.18,4.09,4.22,4.12,4.25,4.14,4.06,
+4.08,4.22,4.14,4.05,4.41,4.24,4.24,4.22,4.21,4.20,
+4.30,4.16,4.38,4.18,4.16,4.30,4.25,4.41,4.34,4.40,
+4.24,4.34,4.29,4.27,4.28,4.36,4.27,4.31,4.40,4.55,
+0.70,0.76,0.77,0.78,0.82,0.87,0.92,0.94,0.94,0.94,
+0.98,1.04,1.00,1.06,1.06,1.05,1.12,1.11,1.20,1.16,
+1.19,1.27,1.24,1.32,1.24,1.32,1.29,1.28,1.37,1.36,
+1.42,1.47,1.45,1.50,1.39,1.45,1.50,1.54,1.53,1.54,
+1.60,1.57,1.58,1.64,1.61,1.66,1.60,1.59,1.70,1.65,
+1.66,1.71,1.79,1.77,1.83,1.85,1.76,1.81,1.83,1.86,
+1.84,1.94,1.88,1.84,1.86,1.88,1.92,1.99,1.95,1.92,
+1.91,2.03,1.98,2.01,1.97,2.13,2.05,2.01,2.03,2.07,
+2.06,2.04,2.06,2.06,2.14,2.23,2.11,2.16,2.15,2.22,
+2.18,2.21,2.19,2.30,2.20,2.22,2.33,2.31,2.25,2.28,
+2.31,2.41,2.31,2.32,2.41,2.32,2.28,2.41,2.36,2.48,
+2.58,2.45,2.50,2.46,2.50,2.49,2.51,2.43,2.55,2.47,
+2.51,2.54,2.50,2.54,2.56,2.64,2.51,2.60,2.58,2.52,
+2.60,2.56,2.58,2.60,2.66,2.62,2.62,2.55,2.70,2.75,
+2.64,2.70,2.76,2.78,2.72,2.63,2.70,2.77,2.83,2.83,
+2.75,2.87,2.82,2.76,2.72,2.88,2.76,2.79,2.80,2.76,
+2.83,2.86,2.92,2.98,2.79,2.95,2.84,2.97,2.82,3.02,
+2.87,2.90,2.97,2.99,3.03,2.99,2.87,3.05,2.96,3.05,
+3.07,2.98,3.03,3.01,3.01,3.10,3.02,3.15,3.12,3.13,
+3.13,3.15,3.07,3.04,3.09,3.07,3.13,3.15,3.13,3.12,
+3.14,3.19,3.16,3.24,3.16,3.24,3.17,3.25,3.18,3.25,
+3.33,3.12,3.27,3.26,3.27,3.39,3.37,3.24,3.37,3.28,
+3.23,3.30,3.33,3.31,3.36,3.38,3.39,3.38,3.38,3.44,
+3.37,3.52,3.54,3.36,3.21,3.39,3.48,3.51,3.37,3.38,
+3.40,3.55,3.51,3.48,3.49,3.58,3.57,3.54,3.49,3.48,
+3.73,3.49,3.56,3.50,3.55,3.64,3.47,3.73,3.52,3.70,
+3.62,3.69,3.59,3.61,3.70,3.54,3.76,3.62,3.78,3.62,
+3.55,3.74,3.59,3.85,3.74,3.70,3.78,3.71,3.67,3.70,
+3.71,3.57,3.80,3.95,3.83,3.75,3.77,3.93,3.86,3.90,
+0.58,0.64,0.66,0.68,0.72,0.79,0.76,0.82,0.81,0.84,
+0.88,0.87,0.85,0.85,0.90,0.95,0.97,1.03,1.04,1.01,
+1.05,1.05,1.06,1.08,1.17,1.12,1.14,1.12,1.16,1.14,
+1.26,1.17,1.21,1.23,1.24,1.22,1.28,1.30,1.31,1.36,
+1.30,1.41,1.34,1.36,1.34,1.38,1.40,1.44,1.43,1.45,
+1.45,1.51,1.49,1.42,1.51,1.51,1.60,1.53,1.56,1.52,
+1.58,1.71,1.62,1.64,1.66,1.65,1.67,1.73,1.65,1.66,
+1.65,1.66,1.74,1.73,1.73,1.71,1.74,1.76,1.76,1.74,
+1.79,1.77,1.84,1.80,1.86,1.84,1.80,1.81,1.88,1.97,
+1.97,1.91,1.85,1.93,1.94,1.94,2.02,1.96,2.00,1.97,
+1.96,2.02,1.98,1.97,2.00,2.06,2.00,2.11,2.07,2.05,
+2.17,2.06,1.94,2.14,2.10,2.10,2.15,2.17,2.18,2.19,
+2.13,2.23,2.22,2.20,2.29,2.23,2.27,2.24,2.23,2.20,
+2.34,2.27,2.26,2.31,2.26,2.31,2.35,2.28,2.35,2.30,
+2.39,2.22,2.38,2.22,2.35,2.41,2.41,2.40,2.36,2.34,
+2.46,2.51,2.47,2.50,2.48,2.43,2.57,2.46,2.44,2.52,
+2.46,2.46,2.48,2.52,2.55,2.54,2.51,2.48,2.44,2.57,
+2.46,2.56,2.59,2.63,2.66,2.58,2.60,2.58,2.66,2.58,
+2.58,2.64,2.73,2.65,2.69,2.66,2.58,2.74,2.74,2.65,
+2.65,2.70,2.64,2.57,2.69,2.65,2.75,2.80,2.68,2.66,
+2.69,2.79,2.77,2.66,2.81,2.78,2.74,2.66,2.82,2.80,
+2.84,2.83,2.79,2.89,2.92,2.78,2.90,2.84,2.83,2.80,
+2.84,2.87,2.90,2.85,2.81,2.85,2.83,2.85,2.93,2.99,
+2.86,2.83,2.95,2.80,3.00,2.88,2.91,2.94,3.08,3.05,
+3.00,3.02,3.02,3.06,2.98,2.97,3.09,2.95,3.03,2.99,
+2.98,3.04,3.01,2.99,3.09,3.09,2.97,3.11,3.15,3.13,
+3.18,3.12,3.11,3.28,3.16,3.12,3.15,3.18,3.15,3.08,
+3.07,3.27,3.05,3.28,3.17,3.23,3.27,3.25,3.19,3.19,
+3.24,3.24,3.20,3.19,3.27,3.27,3.27,3.32,3.15,3.41,
+0.54,0.54,0.53,0.62,0.62,0.66,0.61,0.69,0.67,0.73,
+0.76,0.74,0.78,0.78,0.80,0.84,0.84,0.83,0.88,0.90,
+0.89,0.92,0.92,0.89,0.96,0.95,0.98,1.00,1.03,0.99,
+1.03,1.03,1.09,1.07,1.09,1.11,1.10,1.10,1.13,1.11,
+1.11,1.18,1.15,1.16,1.20,1.19,1.23,1.21,1.26,1.24,
+1.28,1.28,1.28,1.32,1.32,1.31,1.30,1.32,1.33,1.29,
+1.35,1.34,1.38,1.41,1.37,1.38,1.46,1.40,1.38,1.42,
+1.47,1.49,1.48,1.53,1.48,1.46,1.50,1.45,1.54,1.51,
+1.58,1.64,1.51,1.58,1.54,1.51,1.55,1.58,1.56,1.66,
+1.63,1.63,1.52,1.61,1.73,1.68,1.75,1.71,1.70,1.64,
+1.72,1.63,1.72,1.67,1.72,1.65,1.77,1.78,1.73,1.81,
+1.75,1.76,1.78,1.84,1.73,1.83,1.77,1.80,1.88,1.84,
+1.84,1.85,1.89,1.89,1.83,1.94,1.86,1.94,1.92,1.98,
+1.90,1.86,1.96,1.89,1.95,1.85,1.97,2.04,1.92,1.92,
+1.96,2.04,2.05,2.01,1.96,2.01,2.07,1.97,2.06,2.02,
+1.98,2.06,2.11,2.04,2.19,2.08,2.00,2.11,2.10,2.07,
+2.12,2.02,2.15,2.15,2.05,2.11,2.20,2.17,2.21,2.21,
+2.22,2.19,2.19,2.17,2.26,2.12,2.28,2.18,2.20,2.22,
+2.14,2.14,2.21,2.30,2.35,2.32,2.32,2.22,2.35,2.37,
+2.32,2.31,2.35,2.26,2.35,2.32,2.28,2.34,2.33,2.25,
+2.29,2.36,2.34,2.36,2.37,2.36,2.38,2.51,2.30,2.43,
+2.46,2.38,2.45,2.53,2.53,2.41,2.38,2.46,2.44,2.53,
+2.43,2.39,2.54,2.37,2.65,2.44,2.49,2.51,2.59,2.53,
+2.49,2.54,2.54,2.52,2.49,2.56,2.53,2.50,2.58,2.50,
+2.57,2.52,2.52,2.49,2.60,2.54,2.67,2.61,2.61,2.53,
+2.62,2.62,2.58,2.61,2.62,2.72,2.58,2.60,2.62,2.63,
+2.64,2.58,2.73,2.64,2.70,2.55,2.74,2.62,2.69,2.70,
+2.74,2.77,2.64,2.79,2.79,2.76,2.79,2.71,2.83,2.80,
+2.77,2.81,2.75,2.68,2.72,2.80,2.79,2.90,2.81,2.87,
+0.47,0.44,0.46,0.51,0.55,0.55,0.57,0.61,0.59,0.62,
+0.63,0.65,0.66,0.67,0.68,0.70,0.69,0.73,0.75,0.74,
+0.83,0.81,0.77,0.81,0.80,0.85,0.84,0.86,0.85,0.89,
+0.91,0.90,0.91,0.88,0.94,0.95,0.94,0.99,0.97,0.95,
+0.97,1.02,0.95,1.04,1.06,1.01,1.07,1.06,1.07,1.13,
+1.07,1.07,1.06,1.13,1.10,1.14,1.14,1.15,1.15,1.20,
+1.10,1.14,1.22,1.18,1.26,1.16,1.23,1.24,1.17,1.24,
+1.25,1.25,1.26,1.26,1.25,1.25,1.31,1.32,1.34,1.21,
+1.38,1.44,1.39,1.31,1.34,1.38,1.38,1.39,1.33,1.33,
+1.45,1.40,1.43,1.42,1.40,1.36,1.43,1.43,1.46,1.47,
+1.46,1.47,1.52,1.57,1.47,1.48,1.45,1.57,1.58,1.50,
+1.56,1.52,1.46,1.57,1.62,1.56,1.61,1.55,1.63,1.54,
+1.60,1.57,1.60,1.69,1.62,1.64,1.65,1.61,1.65,1.73,
+1.68,1.70,1.63,1.66,1.67,1.68,1.67,1.63,1.69,1.77,
+1.65,1.72,1.75,1.75,1.75,1.73,1.72,1.78,1.79,1.76,
+1.76,1.79,1.80,1.79,1.78,1.81,1.84,1.83,1.76,1.88,
+1.76,1.84,1.83,1.80,1.81,1.87,1.81,1.79,1.84,1.87,
+1.88,1.91,1.81,1.98,1.89,1.90,1.83,1.81,1.92,1.91,
+1.91,1.91,1.97,1.95,1.92,1.96,1.91,1.95,2.02,1.97,
+2.00,1.95,2.08,1.96,2.05,1.98,2.05,2.01,2.02,2.01,
+2.02,2.07,2.04,2.05,2.02,2.02,2.12,2.01,2.09,2.07,
+2.05,2.09,2.08,2.09,2.05,1.99,2.08,2.14,2.07,2.09,
+2.18,2.10,2.13,2.05,2.14,2.20,2.12,2.13,2.11,2.17,
+2.14,2.17,2.11,2.10,2.12,2.16,2.15,2.25,2.19,2.17,
+2.25,2.25,2.19,2.30,2.27,2.32,2.08,2.19,2.22,2.23,
+2.28,2.24,2.26,2.26,2.21,2.29,2.29,2.26,2.25,2.33,
+2.33,2.23,2.39,2.30,2.27,2.28,2.29,2.34,2.43,2.39,
+2.35,2.27,2.34,2.23,2.41,2.28,2.34,2.36,2.40,2.37,
+2.38,2.42,2.33,2.36,2.37,2.26,2.46,2.44,2.40,2.39,
+0.38,0.41,0.43,0.44,0.45,0.47,0.47,0.49,0.52,0.53,
+0.51,0.56,0.55,0.56,0.57,0.59,0.61,0.63,0.64,0.60,
+0.65,0.65,0.67,0.67,0.70,0.72,0.71,0.72,0.76,0.73,
+0.79,0.77,0.78,0.78,0.76,0.82,0.84,0.83,0.87,0.84,
+0.86,0.86,0.89,0.83,0.87,0.86,0.88,0.88,0.93,0.96,
+0.89,0.91,0.93,0.93,0.92,0.93,0.97,0.97,1.05,0.99,
+1.02,1.01,1.02,1.04,1.02,1.01,1.00,1.06,1.04,1.04,
+1.06,1.10,1.05,1.09,1.13,1.07,1.12,1.17,1.11,1.12,
+1.14,1.14,1.14,1.10,1.16,1.16,1.19,1.19,1.19,1.14,
+1.17,1.14,1.22,1.18,1.18,1.27,1.26,1.25,1.21,1.20,
+1.22,1.25,1.28,1.35,1.25,1.26,1.27,1.31,1.29,1.31,
+1.30,1.31,1.33,1.29,1.34,1.40,1.34,1.34,1.37,1.36,
+1.34,1.45,1.38,1.37,1.36,1.39,1.39,1.36,1.38,1.39,
+1.38,1.45,1.42,1.42,1.43,1.42,1.45,1.42,1.46,1.55,
+1.48,1.45,1.43,1.47,1.53,1.57,1.50,1.48,1.48,1.47,
+1.53,1.50,1.54,1.57,1.51,1.50,1.55,1.59,1.57,1.54,
+1.54,1.60,1.58,1.59,1.55,1.64,1.59,1.54,1.56,1.59,
+1.68,1.65,1.62,1.61,1.63,1.63,1.73,1.66,1.59,1.67,
+1.60,1.66,1.70,1.75,1.67,1.70,1.74,1.70,1.74,1.64,
+1.61,1.76,1.67,1.64,1.73,1.68,1.80,1.68,1.71,1.66,
+1.71,1.72,1.74,1.72,1.75,1.72,1.72,1.73,1.73,1.75,
+1.78,1.79,1.77,1.79,1.81,1.81,1.79,1.86,1.89,1.81,
+1.75,1.87,1.78,1.87,1.94,1.79,1.88,1.85,1.90,1.82,
+1.86,1.88,1.96,1.84,1.95,1.88,1.80,1.86,1.89,1.91,
+1.95,1.81,1.84,1.85,1.85,1.91,1.87,1.97,1.95,1.93,
+1.99,1.89,1.91,1.90,1.92,1.90,1.91,2.00,1.94,1.94,
+1.95,1.96,1.91,1.90,1.98,1.90,1.97,1.98,2.02,2.02,
+1.97,2.06,2.06,2.00,1.91,2.04,2.05,2.02,2.06,2.09,
+2.01,2.00,2.09,2.09,2.01,2.17,2.05,1.99,2.10,1.97,
+0.34,0.33,0.37,0.40,0.38,0.42,0.42,0.41,0.48,0.45,
+0.47,0.44,0.51,0.49,0.49,0.55,0.50,0.51,0.55,0.53,
+0.56,0.54,0.55,0.60,0.58,0.63,0.61,0.66,0.64,0.62,
+0.63,0.69,0.65,0.65,0.69,0.69,0.71,0.68,0.71,0.70,
+0.70,0.74,0.71,0.74,0.75,0.72,0.81,0.76,0.77,0.76,
+0.77,0.80,0.78,0.78,0.81,0.78,0.87,0.86,0.84,0.84,
+0.85,0.85,0.87,0.83,0.84,0.86,0.91,0.87,0.93,0.87,
+0.89,0.88,0.94,0.93,0.95,0.91,0.91,0.93,0.98,0.90,
+0.98,0.93,0.97,0.98,1.00,0.99,0.99,0.97,1.01,1.00,
+1.08,1.03,1.02,1.05,1.05,1.05,1.00,1.05,1.05,1.06,
+1.10,1.05,1.06,1.09,1.06,1.12,1.09,1.08,1.08,1.10,
+1.12,1.08,1.12,1.17,1.17,1.14,1.14,1.15,1.16,1.15,
+1.17,1.13,1.15,1.11,1.15,1.22,1.17,1.20,1.16,1.19,
+1.23,1.15,1.21,1.22,1.18,1.23,1.19,1.23,1.24,1.22,
+1.19,1.23,1.21,1.30,1.19,1.22,1.30,1.26,1.24,1.31,
+1.27,1.31,1.36,1.26,1.31,1.28,1.26,1.32,1.33,1.30,
+1.34,1.33,1.38,1.31,1.30,1.38,1.41,1.33,1.36,1.39,
+1.36,1.31,1.34,1.38,1.41,1.39,1.36,1.38,1.40,1.39,
+1.37,1.41,1.38,1.42,1.44,1.45,1.39,1.48,1.45,1.43,
+1.43,1.50,1.46,1.44,1.46,1.47,1.44,1.48,1.44,1.48,
+1.46,1.37,1.51,1.46,1.55,1.52,1.52,1.54,1.53,1.51,
+1.50,1.52,1.50,1.58,1.50,1.54,1.54,1.55,1.54,1.52,
+1.57,1.67,1.60,1.60,1.49,1.61,1.59,1.50,1.57,1.61,
+1.58,1.53,1.62,1.59,1.56,1.60,1.65,1.56,1.60,1.58,
+1.59,1.62,1.65,1.65,1.63,1.64,1.65,1.59,1.69,1.60,
+1.60,1.72,1.66,1.62,1.72,1.62,1.67,1.66,1.69,1.66,
+1.65,1.73,1.67,1.73,1.76,1.65,1.67,1.70,1.72,1.68,
+1.71,1.68,1.75,1.68,1.67,1.71,1.74,1.79,1.77,1.73,
+1.70,1.75,1.77,1.80,1.73,1.69,1.78,1.69,1.74,1.77,
+0.28,0.28,0.29,0.30,0.36,0.31,0.36,0.34,0.36,0.41,
+0.40,0.40,0.39,0.41,0.44,0.43,0.43,0.45,0.47,0.47,
+0.47,0.49,0.50,0.52,0.51,0.50,0.49,0.53,0.53,0.57,
+0.56,0.54,0.54,0.59,0.58,0.59,0.59,0.58,0.57,0.61,
+0.60,0.63,0.60,0.62,0.63,0.66,0.65,0.67,0.64,0.66,
+0.69,0.69,0.65,0.70,0.70,0.72,0.73,0.72,0.70,0.73,
+0.73,0.76,0.70,0.77,0.70,0.72,0.72,0.76,0.79,0.76,
+0.75,0.78,0.78,0.81,0.82,0.77,0.78,0.82,0.83,0.83,
+0.80,0.82,0.87,0.79,0.80,0.83,0.88,0.85,0.84,0.89,
+0.85,0.88,0.91,0.89,0.87,0.86,0.91,0.90,0.94,0.96,
+0.91,0.94,0.91,0.92,0.93,0.92,0.98,0.92,0.92,0.93,
+0.95,0.85,0.94,0.93,0.97,1.00,0.97,0.98,0.94,1.00,
+0.98,0.98,1.00,0.96,0.99,1.01,1.05,0.97,1.01,1.05,
+1.00,1.01,1.00,0.99,1.07,0.97,1.05,1.02,1.08,1.03,
+1.09,1.03,1.04,1.06,1.06,1.08,1.12,1.06,1.07,1.10,
+1.16,1.13,1.11,1.11,1.07,1.17,1.15,1.06,1.13,1.15,
+1.13,1.09,1.07,1.12,1.11,1.15,1.13,1.16,1.15,1.13,
+1.18,1.15,1.14,1.21,1.18,1.19,1.16,1.21,1.16,1.21,
+1.16,1.19,1.19,1.18,1.20,1.25,1.20,1.26,1.23,1.18,
+1.22,1.24,1.25,1.27,1.22,1.27,1.23,1.21,1.20,1.15,
+1.29,1.26,1.23,1.26,1.24,1.23,1.29,1.30,1.28,1.28,
+1.32,1.30,1.27,1.32,1.30,1.33,1.26,1.27,1.32,1.30,
+1.34,1.27,1.30,1.33,1.30,1.38,1.36,1.32,1.43,1.31,
+1.29,1.41,1.33,1.32,1.32,1.34,1.33,1.44,1.34,1.38,
+1.38,1.36,1.39,1.38,1.39,1.34,1.36,1.43,1.38,1.41,
+1.43,1.40,1.35,1.39,1.44,1.43,1.39,1.39,1.47,1.43,
+1.44,1.50,1.38,1.52,1.42,1.43,1.48,1.45,1.39,1.44,
+1.47,1.48,1.41,1.49,1.43,1.41,1.48,1.47,1.38,1.40,
+1.47,1.54,1.45,1.48,1.47,1.49,1.48,1.53,1.47,1.49,
+0.24,0.25,0.26,0.30,0.26,0.30,0.28,0.31,0.33,0.33,
+0.32,0.35,0.36,0.32,0.37,0.40,0.41,0.39,0.36,0.41,
+0.40,0.43,0.43,0.42,0.43,0.45,0.42,0.45,0.45,0.47,
+0.46,0.45,0.47,0.48,0.48,0.52,0.50,0.52,0.50,0.52,
+0.48,0.53,0.53,0.53,0.53,0.56,0.54,0.54,0.55,0.60,
+0.57,0.54,0.62,0.59,0.60,0.59,0.61,0.63,0.62,0.63,
+0.63,0.65,0.61,0.62,0.65,0.66,0.64,0.65,0.63,0.64,
+0.62,0.68,0.68,0.67,0.68,0.72,0.63,0.68,0.70,0.72,
+0.69,0.73,0.70,0.72,0.75,0.69,0.75,0.72,0.78,0.74,
+0.75,0.74,0.74,0.74,0.78,0.78,0.80,0.73,0.79,0.79,
+0.77,0.79,0.79,0.79,0.82,0.76,0.78,0.76,0.80,0.78,
+0.78,0.81,0.82,0.83,0.82,0.85,0.85,0.85,0.83,0.89,
+0.81,0.83,0.83,0.82,0.87,0.89,0.84,0.86,0.91,0.89,
+0.87,0.88,0.91,0.89,0.90,0.89,0.89,0.89,0.90,0.90,
+0.88,0.92,0.88,0.90,0.89,0.89,0.88,0.90,0.90,0.96,
+0.92,0.94,0.96,0.93,0.92,0.93,0.96,0.87,0.98,0.97,
+0.99,0.98,0.95,0.99,0.98,1.00,0.97,1.00,1.01,1.00,
+1.00,0.99,0.99,1.01,1.00,1.02,0.99,0.99,0.96,1.06,
+1.02,1.03,1.01,1.03,1.06,1.04,1.00,1.05,1.01,1.02,
+1.07,0.98,1.07,1.06,1.05,1.04,1.09,1.05,1.07,1.02,
+1.09,1.12,1.09,1.08,1.07,1.06,1.10,1.10,1.05,1.12,
+1.13,1.10,1.12,1.09,1.05,1.13,1.12,1.10,1.08,1.10,
+1.10,1.18,1.14,1.11,1.12,1.16,1.12,1.15,1.11,1.16,
+1.14,1.15,1.19,1.17,1.18,1.15,1.18,1.15,1.15,1.16,
+1.15,1.15,1.18,1.12,1.20,1.11,1.17,1.17,1.17,1.21,
+1.22,1.22,1.26,1.22,1.30,1.24,1.23,1.19,1.27,1.20,
+1.21,1.19,1.18,1.24,1.21,1.20,1.27,1.19,1.25,1.23,
+1.24,1.31,1.21,1.27,1.26,1.29,1.27,1.25,1.24,1.19,
+1.27,1.31,1.30,1.25,1.30,1.30,1.24,1.30,1.27,1.32,
+0.21,0.20,0.22,0.23,0.24,0.26,0.25,0.25,0.29,0.25,
+0.29,0.30,0.26,0.31,0.32,0.30,0.31,0.32,0.32,0.33,
+0.35,0.33,0.37,0.35,0.39,0.37,0.37,0.37,0.40,0.39,
+0.43,0.41,0.40,0.40,0.48,0.42,0.43,0.40,0.43,0.45,
+0.46,0.45,0.45,0.46,0.46,0.43,0.50,0.44,0.48,0.49,
+0.49,0.48,0.47,0.52,0.49,0.53,0.50,0.49,0.50,0.49,
+0.51,0.51,0.51,0.55,0.52,0.55,0.56,0.56,0.53,0.55,
+0.54,0.53,0.57,0.55,0.56,0.53,0.58,0.56,0.63,0.58,
+0.58,0.61,0.62,0.61,0.64,0.61,0.61,0.59,0.64,0.57,
+0.58,0.60,0.62,0.63,0.65,0.66,0.63,0.68,0.65,0.68,
+0.67,0.66,0.65,0.70,0.62,0.69,0.66,0.68,0.72,0.70,
+0.70,0.70,0.72,0.70,0.71,0.69,0.72,0.75,0.70,0.71,
+0.70,0.70,0.71,0.74,0.75,0.72,0.75,0.72,0.74,0.74,
+0.72,0.75,0.76,0.74,0.76,0.73,0.73,0.76,0.75,0.76,
+0.77,0.74,0.79,0.77,0.76,0.74,0.80,0.81,0.86,0.76,
+0.79,0.82,0.78,0.81,0.79,0.81,0.82,0.77,0.81,0.79,
+0.83,0.77,0.78,0.83,0.84,0.86,0.80,0.84,0.86,0.85,
+0.83,0.86,0.84,0.84,0.88,0.83,0.83,0.83,0.84,0.89,
+0.86,0.84,0.84,0.89,0.89,0.87,0.90,0.89,0.87,0.91,
+0.87,0.89,0.94,0.85,0.94,0.91,0.87,0.89,0.92,0.96,
+0.86,0.93,0.96,0.88,0.94,0.92,0.91,0.93,0.87,0.89,
+0.94,0.91,0.93,0.98,0.94,0.99,0.91,0.95,0.95,0.98,
+0.97,0.96,0.94,0.94,0.95,0.94,0.95,0.94,0.91,1.01,
+0.99,0.94,0.96,0.95,1.01,0.94,0.99,0.96,0.98,1.05,
+0.96,0.98,0.97,0.97,0.99,1.02,1.02,1.04,1.00,0.98,
+1.01,0.97,1.04,1.05,1.02,0.99,1.02,1.07,1.08,1.07,
+1.03,1.04,1.04,1.04,1.02,1.01,1.03,1.06,1.02,1.01,
+1.07,1.03,1.02,1.10,1.07,1.03,1.08,1.07,1.05,1.07,
+1.08,1.01,1.08,1.11,1.10,1.09,1.06,1.03,1.08,1.10,
+0.15,0.13,0.17,0.18,0.21,0.24,0.21,0.22,0.22,0.26,
+0.21,0.24,0.24,0.25,0.27,0.28,0.28,0.26,0.26,0.26,
+0.30,0.30,0.31,0.32,0.31,0.31,0.32,0.32,0.34,0.35,
+0.34,0.33,0.35,0.33,0.35,0.32,0.35,0.35,0.36,0.34,
+0.41,0.40,0.40,0.38,0.38,0.37,0.40,0.38,0.40,0.42,
+0.41,0.41,0.43,0.43,0.40,0.43,0.43,0.44,0.44,0.42,
+0.46,0.43,0.45,0.45,0.50,0.47,0.44,0.43,0.46,0.50,
+0.47,0.46,0.51,0.51,0.48,0.50,0.48,0.51,0.52,0.48,
+0.51,0.53,0.52,0.52,0.50,0.53,0.50,0.52,0.52,0.52,
+0.54,0.54,0.54,0.54,0.55,0.54,0.59,0.61,0.55,0.56,
+0.55,0.54,0.57,0.55,0.60,0.56,0.61,0.60,0.58,0.60,
+0.55,0.59,0.60,0.61,0.62,0.59,0.63,0.59,0.62,0.62,
+0.60,0.58,0.63,0.60,0.60,0.66,0.64,0.63,0.61,0.66,
+0.66,0.63,0.64,0.64,0.62,0.65,0.61,0.65,0.66,0.65,
+0.67,0.63,0.62,0.68,0.65,0.65,0.65,0.64,0.64,0.67,
+0.70,0.66,0.64,0.73,0.69,0.68,0.65,0.69,0.70,0.67,
+0.70,0.70,0.69,0.70,0.69,0.69,0.69,0.69,0.69,0.76,
+0.72,0.75,0.73,0.72,0.72,0.70,0.73,0.71,0.73,0.76,
+0.75,0.72,0.74,0.80,0.74,0.76,0.75,0.77,0.76,0.77,
+0.76,0.77,0.79,0.76,0.78,0.80,0.78,0.83,0.81,0.79,
+0.76,0.79,0.78,0.77,0.79,0.82,0.81,0.82,0.82,0.76,
+0.78,0.80,0.78,0.83,0.78,0.78,0.79,0.76,0.80,0.78,
+0.77,0.83,0.83,0.80,0.78,0.83,0.81,0.83,0.83,0.83,
+0.88,0.86,0.89,0.83,0.82,0.84,0.85,0.82,0.81,0.84,
+0.88,0.85,0.84,0.88,0.91,0.89,0.85,0.86,0.84,0.88,
+0.83,0.87,0.88,0.94,0.87,0.89,0.88,0.84,0.86,0.87,
+0.92,0.87,0.85,0.87,0.91,0.88,0.88,0.91,0.91,0.89,
+0.91,0.89,0.86,0.90,0.87,0.91,0.92,0.92,0.97,0.90,
+0.92,0.90,0.88,0.93,0.89,0.95,0.86,0.92,0.94,0.95,
+0.16,0.15,0.18,0.16,0.18,0.20,0.20,0.20,0.21,0.18,
+0.20,0.21,0.18,0.22,0.20,0.23,0.21,0.25,0.22,0.26,
+0.27,0.24,0.27,0.29,0.26,0.28,0.30,0.29,0.31,0.27,
+0.29,0.30,0.28,0.30,0.31,0.32,0.34,0.33,0.30,0.31,
+0.31,0.34,0.34,0.34,0.30,0.35,0.32,0.32,0.34,0.35,
+0.34,0.37,0.32,0.37,0.34,0.39,0.38,0.40,0.40,0.36,
+0.36,0.39,0.39,0.41,0.38,0.41,0.41,0.38,0.45,0.40,
+0.39,0.40,0.41,0.43,0.39,0.40,0.40,0.44,0.46,0.43,
+0.42,0.42,0.41,0.40,0.43,0.45,0.41,0.42,0.45,0.48,
+0.46,0.47,0.44,0.48,0.48,0.45,0.49,0.46,0.41,0.48,
+0.45,0.47,0.46,0.47,0.49,0.52,0.47,0.48,0.49,0.49,
+0.50,0.49,0.51,0.48,0.51,0.49,0.50,0.51,0.53,0.54,
+0.49,0.49,0.53,0.56,0.56,0.50,0.51,0.55,0.57,0.56,
+0.54,0.54,0.56,0.52,0.55,0.56,0.59,0.55,0.58,0.55,
+0.52,0.57,0.56,0.56,0.56,0.56,0.54,0.56,0.55,0.56,
+0.58,0.55,0.57,0.57,0.59,0.59,0.60,0.58,0.58,0.58,
+0.60,0.58,0.61,0.60,0.61,0.60,0.61,0.58,0.59,0.62,
+0.61,0.61,0.62,0.63,0.64,0.62,0.62,0.62,0.62,0.61,
+0.60,0.64,0.60,0.69,0.64,0.64,0.66,0.60,0.60,0.58,
+0.68,0.63,0.66,0.65,0.66,0.66,0.69,0.61,0.64,0.62,
+0.68,0.68,0.64,0.67,0.70,0.66,0.67,0.69,0.64,0.68,
+0.64,0.70,0.67,0.69,0.72,0.68,0.68,0.70,0.68,0.70,
+0.68,0.71,0.68,0.69,0.71,0.72,0.73,0.71,0.68,0.72,
+0.69,0.72,0.71,0.70,0.70,0.70,0.70,0.75,0.69,0.73,
+0.74,0.72,0.72,0.72,0.72,0.72,0.77,0.74,0.75,0.73,
+0.74,0.70,0.74,0.74,0.70,0.70,0.75,0.70,0.70,0.73,
+0.71,0.79,0.76,0.74,0.77,0.75,0.77,0.74,0.74,0.75,
+0.77,0.74,0.78,0.78,0.79,0.75,0.76,0.80,0.74,0.76,
+0.78,0.75,0.77,0.75,0.76,0.81,0.78,0.80,0.85,0.81,
+0.09,0.12,0.13,0.14,0.14,0.17,0.13,0.12,0.20,0.18,
+0.17,0.19,0.17,0.19,0.18,0.19,0.22,0.22,0.18,0.21,
+0.21,0.22,0.22,0.25,0.23,0.21,0.24,0.23,0.24,0.25,
+0.23,0.25,0.27,0.29,0.26,0.25,0.26,0.28,0.26,0.23,
+0.27,0.30,0.27,0.27,0.28,0.27,0.28,0.28,0.28,0.28,
+0.31,0.32,0.29,0.27,0.31,0.31,0.33,0.30,0.33,0.34,
+0.32,0.31,0.33,0.32,0.33,0.34,0.34,0.35,0.33,0.35,
+0.33,0.35,0.35,0.37,0.37,0.37,0.36,0.36,0.38,0.37,
+0.42,0.36,0.34,0.39,0.38,0.40,0.38,0.38,0.37,0.38,
+0.40,0.39,0.41,0.38,0.38,0.38,0.40,0.42,0.41,0.40,
+0.38,0.40,0.44,0.40,0.40,0.40,0.40,0.43,0.42,0.45,
+0.44,0.43,0.42,0.43,0.47,0.44,0.43,0.41,0.43,0.46,
+0.46,0.43,0.46,0.46,0.44,0.46,0.46,0.43,0.45,0.47,
+0.46,0.49,0.46,0.48,0.47,0.49,0.46,0.49,0.51,0.47,
+0.48,0.46,0.48,0.50,0.49,0.50,0.47,0.52,0.47,0.48,
+0.48,0.49,0.49,0.52,0.48,0.47,0.54,0.51,0.46,0.49,
+0.48,0.53,0.52,0.52,0.50,0.52,0.50,0.53,0.50,0.51,
+0.50,0.55,0.50,0.52,0.52,0.54,0.52,0.51,0.56,0.50,
+0.51,0.54,0.52,0.52,0.55,0.54,0.55,0.55,0.52,0.58,
+0.54,0.49,0.55,0.55,0.54,0.57,0.60,0.53,0.55,0.54,
+0.57,0.56,0.54,0.56,0.55,0.59,0.54,0.60,0.58,0.57,
+0.59,0.56,0.57,0.60,0.61,0.60,0.60,0.60,0.60,0.60,
+0.58,0.58,0.60,0.59,0.56,0.60,0.59,0.59,0.61,0.58,
+0.60,0.56,0.60,0.61,0.60,0.61,0.60,0.62,0.60,0.60,
+0.60,0.64,0.62,0.63,0.61,0.60,0.59,0.62,0.58,0.63,
+0.60,0.63,0.63,0.60,0.64,0.59,0.65,0.64,0.60,0.60,
+0.63,0.61,0.62,0.64,0.62,0.64,0.68,0.63,0.59,0.64,
+0.64,0.64,0.67,0.65,0.65,0.66,0.64,0.64,0.67,0.68,
+0.67,0.63,0.67,0.67,0.68,0.66,0.64,0.62,0.67,0.63,
+0.09,0.12,0.11,0.13,0.11,0.09,0.14,0.14,0.14,0.13,
+0.14,0.13,0.17,0.14,0.15,0.14,0.16,0.16,0.15,0.17,
+0.18,0.19,0.20,0.21,0.19,0.20,0.21,0.19,0.19,0.25,
+0.21,0.20,0.19,0.22,0.23,0.19,0.22,0.21,0.23,0.23,
+0.22,0.28,0.23,0.27,0.25,0.22,0.23,0.25,0.26,0.26,
+0.26,0.27,0.27,0.24,0.28,0.27,0.24,0.26,0.30,0.28,
+0.25,0.29,0.27,0.27,0.31,0.30,0.30,0.33,0.30,0.28,
+0.28,0.29,0.29,0.30,0.31,0.29,0.29,0.31,0.29,0.28,
+0.34,0.32,0.28,0.34,0.32,0.35,0.30,0.30,0.33,0.31,
+0.32,0.32,0.31,0.33,0.32,0.30,0.35,0.32,0.34,0.33,
+0.36,0.35,0.33,0.34,0.35,0.35,0.37,0.35,0.35,0.37,
+0.35,0.37,0.36,0.37,0.38,0.35,0.36,0.36,0.36,0.40,
+0.39,0.36,0.36,0.40,0.38,0.39,0.37,0.37,0.39,0.39,
+0.39,0.40,0.40,0.38,0.39,0.40,0.37,0.42,0.43,0.39,
+0.43,0.41,0.41,0.37,0.43,0.40,0.42,0.42,0.41,0.48,
+0.40,0.41,0.40,0.43,0.46,0.42,0.42,0.44,0.41,0.45,
+0.41,0.40,0.43,0.46,0.43,0.42,0.45,0.42,0.44,0.43,
+0.43,0.46,0.44,0.43,0.43,0.41,0.48,0.45,0.45,0.43,
+0.44,0.46,0.45,0.47,0.47,0.47,0.44,0.45,0.47,0.50,
+0.45,0.44,0.46,0.50,0.46,0.46,0.45,0.48,0.48,0.44,
+0.50,0.47,0.49,0.50,0.51,0.49,0.49,0.49,0.47,0.46,
+0.48,0.49,0.49,0.52,0.46,0.48,0.46,0.50,0.50,0.49,
+0.50,0.47,0.49,0.49,0.46,0.47,0.51,0.53,0.51,0.53,
+0.50,0.51,0.52,0.53,0.51,0.55,0.47,0.48,0.50,0.53,
+0.54,0.52,0.51,0.55,0.54,0.56,0.53,0.50,0.52,0.48,
+0.51,0.49,0.53,0.54,0.54,0.54,0.59,0.56,0.54,0.55,
+0.57,0.53,0.55,0.51,0.55,0.54,0.55,0.55,0.55,0.57,
+0.60,0.54,0.53,0.56,0.57,0.54,0.56,0.54,0.57,0.57,
+0.55,0.56,0.58,0.55,0.57,0.57,0.55,0.53,0.55,0.55,
+0.99,1.02,1.11,1.13,1.18,1.24,1.28,1.27,1.33,1.33,
+1.41,1.48,1.38,1.49,1.44,1.54,1.57,1.54,1.54,1.61,
+1.64,1.64,1.68,1.74,1.73,1.82,1.84,1.91,1.84,1.96,
+1.86,1.94,1.98,2.01,2.01,2.02,2.03,2.15,2.20,2.08,
+2.19,2.13,2.23,2.24,2.25,2.26,2.31,2.38,2.23,2.34,
+2.37,2.37,2.42,2.46,2.56,2.39,2.43,2.52,2.53,2.54,
+2.51,2.58,2.47,2.67,2.67,2.55,2.67,2.62,2.66,2.77,
+2.69,2.71,2.72,2.71,2.71,2.75,2.77,2.77,2.86,2.96,
+2.80,2.97,2.88,2.80,2.92,2.95,2.97,2.96,3.00,3.16,
+2.93,2.98,3.03,3.09,3.09,2.99,3.18,3.04,3.23,3.22,
+3.18,3.22,3.18,3.26,3.18,3.36,3.18,3.33,3.25,3.26,
+3.40,3.28,3.34,3.44,3.48,3.44,3.44,3.39,3.31,3.35,
+3.51,3.46,3.43,3.35,3.49,3.53,3.59,3.64,3.48,3.38,
+3.46,3.72,3.73,3.70,3.69,3.77,3.79,3.78,3.70,3.61,
+3.74,3.74,3.70,3.94,3.80,3.78,3.83,3.88,3.69,3.83,
+3.77,3.83,3.81,3.74,3.99,3.83,3.92,4.10,3.76,3.78,
+3.86,4.01,4.06,4.09,3.83,3.99,4.07,4.18,4.06,3.99,
+4.08,4.06,3.99,4.13,4.05,3.89,4.05,4.11,3.96,4.22,
+4.25,4.23,4.06,4.06,4.09,4.35,4.26,4.23,4.27,4.14,
+4.32,4.38,4.43,4.37,4.36,4.42,4.21,4.46,4.32,4.54,
+4.46,4.49,4.63,4.45,4.41,4.55,4.34,4.40,4.52,4.38,
+4.39,4.55,4.55,4.64,4.69,4.54,4.51,4.61,4.50,4.59,
+4.58,4.39,4.61,4.43,4.58,4.58,4.74,4.63,4.59,4.83,
+4.41,4.85,4.55,4.68,4.72,4.96,4.64,4.86,4.77,4.74,
+4.97,4.95,4.67,4.95,4.87,4.75,4.98,4.75,5.02,5.17,
+4.84,4.82,4.89,4.99,4.99,5.05,4.82,4.82,4.88,4.86,
+4.99,4.80,5.19,4.89,5.09,5.04,5.01,5.13,5.17,5.15,
+5.05,4.88,5.04,5.09,4.89,5.23,4.94,5.21,5.03,5.27,
+5.04,5.25,5.21,5.09,5.19,5.03,5.30,5.30,5.21,5.24,
+0.83,0.87,0.96,0.99,1.00,1.04,1.04,1.11,1.15,1.19,
+1.19,1.27,1.29,1.33,1.29,1.33,1.34,1.40,1.44,1.46,
+1.48,1.47,1.47,1.52,1.55,1.59,1.62,1.64,1.66,1.73,
+1.63,1.67,1.72,1.73,1.82,1.84,1.73,1.89,1.95,1.90,
+1.88,1.81,1.97,1.91,1.95,2.02,2.02,1.98,1.99,1.99,
+2.02,2.09,2.13,2.07,2.13,2.18,2.16,2.08,2.25,2.24,
+2.24,2.33,2.30,2.29,2.26,2.33,2.32,2.38,2.49,2.32,
+2.37,2.49,2.37,2.47,2.49,2.40,2.44,2.56,2.47,2.55,
+2.54,2.46,2.43,2.56,2.54,2.59,2.64,2.65,2.71,2.66,
+2.71,2.61,2.73,2.67,2.75,2.74,2.72,2.67,2.75,2.80,
+2.76,2.88,2.80,2.79,2.81,2.91,2.88,2.89,2.84,2.88,
+2.84,2.91,3.00,3.03,2.91,3.14,3.00,2.93,3.12,3.07,
+3.10,2.90,3.09,3.08,3.16,3.01,3.02,3.09,3.12,3.12,
+3.05,3.14,3.14,3.09,3.30,3.14,3.10,3.19,3.27,3.35,
+3.32,3.11,3.25,3.23,3.30,3.22,3.26,3.30,3.33,3.41,
+3.49,3.45,3.29,3.47,3.37,3.53,3.36,3.40,3.47,3.46,
+3.57,3.56,3.42,3.67,3.58,3.51,3.52,3.60,3.45,3.55,
+3.49,3.58,3.65,3.47,3.71,3.73,3.64,3.70,3.56,3.69,
+3.73,3.60,3.51,3.67,3.69,3.66,3.85,3.77,3.76,3.81,
+3.88,3.69,3.86,3.67,3.80,3.60,3.84,3.80,4.04,3.88,
+3.93,3.80,3.93,3.85,4.00,3.98,3.95,3.90,3.98,4.06,
+4.06,3.85,3.93,3.88,4.04,3.92,3.94,3.98,3.99,3.97,
+4.21,4.00,3.90,3.96,3.98,4.06,4.31,4.05,4.16,4.18,
+4.08,4.10,4.11,4.10,4.35,4.11,4.32,4.11,4.23,4.16,
+4.12,4.28,4.23,4.26,4.15,4.31,4.37,4.25,4.41,4.07,
+4.40,4.36,4.39,4.35,4.40,4.44,4.39,4.33,4.33,4.29,
+4.37,4.31,4.36,4.37,4.40,4.48,4.33,4.57,4.41,4.39,
+4.55,4.44,4.56,4.22,4.43,4.50,4.35,4.61,4.55,4.45,
+4.64,4.49,4.44,4.55,4.57,4.51,4.71,4.52,4.65,4.68,
+0.75,0.81,0.79,0.84,0.89,0.90,0.94,0.92,1.04,1.03,
+1.05,1.05,1.07,1.12,1.14,1.19,1.21,1.22,1.27,1.26,
+1.31,1.30,1.34,1.34,1.35,1.41,1.44,1.37,1.43,1.45,
+1.51,1.48,1.49,1.55,1.56,1.60,1.58,1.63,1.58,1.60,
+1.67,1.64,1.68,1.72,1.74,1.69,1.75,1.80,1.77,1.76,
+1.84,1.77,1.84,1.84,1.89,1.82,1.89,1.90,1.94,1.89,
+2.03,1.98,1.97,2.00,2.01,1.98,2.00,1.97,2.12,1.98,
+2.09,2.14,2.15,2.15,2.16,2.14,2.18,2.11,2.09,2.27,
+2.28,2.19,2.33,2.15,2.25,2.20,2.24,2.20,2.38,2.28,
+2.24,2.33,2.43,2.32,2.42,2.36,2.37,2.40,2.43,2.38,
+2.48,2.43,2.45,2.46,2.52,2.59,2.63,2.61,2.55,2.63,
+2.53,2.47,2.50,2.57,2.56,2.59,2.66,2.66,2.58,2.66,
+2.69,2.68,2.71,2.62,2.72,2.73,2.70,2.74,2.74,2.74,
+2.74,2.75,2.83,2.73,2.83,2.78,2.86,2.66,2.83,2.85,
+2.80,2.86,2.78,2.80,2.96,2.89,2.93,2.88,2.88,2.86,
+2.89,2.92,3.06,3.04,3.01,3.01,2.99,2.99,3.06,3.09,
+3.02,2.99,2.96,3.11,3.08,2.95,3.03,3.08,3.09,3.10,
+3.19,3.09,3.23,3.17,3.29,3.14,3.32,3.25,3.22,3.15,
+3.25,3.16,3.33,3.36,3.28,3.45,3.21,3.30,3.29,3.25,
+3.19,3.41,3.20,3.37,3.42,3.36,3.50,3.27,3.37,3.39,
+3.36,3.45,3.31,3.45,3.43,3.46,3.43,3.62,3.41,3.34,
+3.41,3.50,3.50,3.46,3.56,3.40,3.45,3.40,3.56,3.57,
+3.55,3.48,3.45,3.46,3.51,3.68,3.73,3.67,3.66,3.59,
+3.66,3.64,3.70,3.65,3.49,3.67,3.67,3.66,3.65,3.62,
+3.72,3.60,3.60,3.75,3.68,3.74,3.81,3.68,3.73,3.80,
+3.76,3.70,3.92,3.81,3.72,3.73,3.79,3.79,3.82,3.94,
+3.93,3.70,3.71,3.83,3.85,3.83,3.93,3.96,3.91,3.91,
+4.00,3.82,3.85,3.87,3.85,3.91,3.97,3.91,3.72,4.02,
+4.02,3.98,4.00,3.97,4.05,3.94,4.12,3.72,4.19,3.95,
+0.64,0.70,0.71,0.73,0.80,0.80,0.81,0.85,0.87,0.90,
+0.93,0.98,0.97,1.00,0.98,1.00,1.05,1.07,1.06,1.09,
+1.14,1.09,1.17,1.15,1.18,1.19,1.22,1.27,1.26,1.30,
+1.28,1.28,1.29,1.37,1.29,1.33,1.41,1.41,1.39,1.40,
+1.39,1.43,1.46,1.50,1.43,1.52,1.46,1.48,1.55,1.54,
+1.58,1.56,1.53,1.59,1.65,1.61,1.70,1.65,1.64,1.68,
+1.69,1.72,1.62,1.81,1.68,1.78,1.71,1.86,1.76,1.84,
+1.84,1.85,1.94,1.85,1.89,1.82,1.88,1.97,1.93,1.90,
+1.89,1.94,2.00,1.99,1.93,2.03,1.99,2.03,1.91,2.11,
+2.02,2.04,2.02,2.04,2.06,2.12,2.06,2.06,2.05,2.09,
+2.13,2.12,2.21,2.17,2.10,2.14,2.19,2.19,2.20,2.20,
+2.18,2.25,2.16,2.24,2.28,2.31,2.22,2.30,2.20,2.24,
+2.30,2.34,2.30,2.40,2.41,2.46,2.34,2.35,2.38,2.27,
+2.38,2.42,2.37,2.39,2.49,2.46,2.35,2.60,2.39,2.45,
+2.56,2.58,2.50,2.47,2.52,2.45,2.55,2.45,2.58,2.62,
+2.71,2.62,2.48,2.67,2.58,2.64,2.57,2.64,2.70,2.72,
+2.68,2.57,2.65,2.68,2.77,2.72,2.70,2.67,2.62,2.69,
+2.71,2.73,2.71,2.75,2.76,2.78,2.68,2.66,2.80,2.81,
+2.83,2.81,2.94,2.75,2.80,2.73,2.87,2.89,2.84,2.85,
+2.98,2.87,2.81,2.91,3.06,2.99,2.94,3.02,2.84,2.89,
+2.95,2.89,2.96,2.97,2.98,2.99,2.99,2.87,2.97,2.99,
+2.99,2.97,3.13,2.95,3.05,3.13,3.04,3.05,3.09,3.01,
+3.00,3.07,2.95,3.09,3.11,3.13,3.17,3.18,3.23,3.05,
+3.12,3.11,3.12,3.13,3.07,3.10,3.34,3.20,3.24,3.17,
+3.20,3.33,3.22,3.28,3.30,3.21,3.25,3.30,3.31,3.40,
+3.24,3.26,3.32,3.42,3.50,3.21,3.38,3.28,3.18,3.33,
+3.28,3.29,3.28,3.30,3.52,3.26,3.33,3.47,3.38,3.36,
+3.29,3.49,3.36,3.26,3.32,3.49,3.47,3.43,3.37,3.45,
+3.51,3.38,3.60,3.51,3.55,3.36,3.59,3.36,3.58,3.59,
+0.57,0.61,0.63,0.63,0.66,0.74,0.74,0.73,0.75,0.79,
+0.79,0.83,0.84,0.84,0.86,0.86,0.92,0.90,0.95,0.93,
+0.98,0.97,0.96,1.05,1.04,1.05,1.10,1.07,1.08,1.13,
+1.11,1.10,1.11,1.16,1.16,1.15,1.23,1.18,1.21,1.29,
+1.25,1.28,1.26,1.24,1.30,1.27,1.29,1.31,1.34,1.33,
+1.36,1.37,1.43,1.39,1.45,1.38,1.42,1.45,1.46,1.49,
+1.41,1.53,1.43,1.54,1.53,1.52,1.52,1.54,1.53,1.73,
+1.54,1.55,1.60,1.59,1.61,1.56,1.62,1.64,1.66,1.67,
+1.59,1.68,1.79,1.69,1.77,1.71,1.69,1.67,1.75,1.75,
+1.74,1.85,1.84,1.85,1.79,1.79,1.77,1.84,1.89,1.83,
+1.85,1.79,1.85,1.91,1.91,1.90,1.84,1.91,1.78,1.93,
+1.98,1.96,1.94,1.97,2.01,1.93,1.92,1.99,1.97,1.97,
+2.00,2.08,2.01,1.98,2.14,2.05,2.02,2.05,2.05,2.03,
+2.09,2.06,2.03,2.11,2.13,2.12,2.09,2.16,2.14,2.18,
+2.21,2.03,2.17,2.18,2.11,2.12,2.15,2.25,2.26,2.18,
+2.17,2.26,2.23,2.22,2.19,2.16,2.23,2.23,2.36,2.17,
+2.32,2.34,2.27,2.31,2.25,2.35,2.37,2.40,2.37,2.29,
+2.31,2.39,2.40,2.32,2.30,2.35,2.40,2.39,2.37,2.42,
+2.37,2.49,2.45,2.40,2.39,2.36,2.43,2.58,2.53,2.43,
+2.49,2.51,2.45,2.47,2.39,2.45,2.62,2.57,2.57,2.69,
+2.49,2.59,2.51,2.48,2.48,2.52,2.47,2.58,2.61,2.59,
+2.49,2.65,2.66,2.63,2.77,2.60,2.62,2.67,2.60,2.63,
+2.70,2.66,2.68,2.68,2.64,2.74,2.70,2.82,2.69,2.76,
+2.74,2.81,2.81,2.77,2.70,2.80,2.75,2.84,2.71,2.77,
+2.94,2.79,2.71,2.95,2.76,2.78,2.80,2.89,2.96,2.85,
+2.85,2.88,2.82,2.90,2.87,2.91,2.87,2.91,2.85,2.88,
+2.90,2.96,2.76,2.86,2.85,2.83,2.86,3.00,3.00,2.89,
+2.96,2.92,2.86,3.00,2.99,2.97,2.89,3.01,2.83,3.03,
+2.91,2.96,3.00,3.01,3.05,2.95,3.02,3.01,3.11,3.00,
+0.50,0.51,0.49,0.55,0.57,0.61,0.61,0.62,0.64,0.63,
+0.67,0.72,0.72,0.77,0.76,0.78,0.79,0.79,0.80,0.81,
+0.84,0.86,0.86,0.87,0.91,0.90,0.92,0.92,0.96,0.95,
+0.95,1.00,1.01,1.01,1.01,1.04,1.10,1.03,1.05,1.09,
+1.07,1.10,1.12,1.11,1.14,1.15,1.14,1.11,1.11,1.18,
+1.19,1.22,1.19,1.18,1.19,1.27,1.22,1.26,1.25,1.25,
+1.26,1.23,1.32,1.26,1.33,1.32,1.35,1.32,1.35,1.39,
+1.35,1.31,1.32,1.40,1.36,1.40,1.40,1.44,1.42,1.44,
+1.46,1.44,1.46,1.49,1.54,1.43,1.43,1.52,1.45,1.51,
+1.52,1.58,1.51,1.52,1.59,1.53,1.57,1.61,1.57,1.59,
+1.61,1.59,1.63,1.65,1.60,1.67,1.58,1.70,1.68,1.71,
+1.69,1.70,1.70,1.65,1.68,1.66,1.68,1.68,1.70,1.71,
+1.68,1.73,1.73,1.77,1.75,1.77,1.75,1.72,1.87,1.78,
+1.81,1.76,1.86,1.76,1.84,1.83,1.83,1.80,1.81,1.90,
+1.74,1.88,1.80,1.86,1.84,1.88,1.90,1.86,1.95,1.98,
+1.91,1.94,1.92,1.87,1.96,2.01,1.98,1.89,1.87,1.91,
+1.90,1.94,2.02,2.01,1.95,2.01,2.01,1.99,2.07,2.02,
+2.05,1.98,2.00,2.16,2.06,2.06,2.05,2.08,2.05,2.08,
+2.14,2.06,2.08,2.15,2.05,2.12,2.10,2.17,2.15,2.19,
+2.13,2.12,2.25,2.16,2.15,2.14,2.05,2.12,2.19,2.16,
+2.18,2.30,2.16,2.28,2.14,2.32,2.33,2.25,2.24,2.27,
+2.27,2.30,2.33,2.33,2.22,2.36,2.22,2.28,2.36,2.30,
+2.40,2.35,2.36,2.34,2.34,2.31,2.26,2.33,2.36,2.37,
+2.43,2.39,2.38,2.39,2.31,2.33,2.33,2.33,2.43,2.35,
+2.30,2.38,2.33,2.37,2.46,2.52,2.43,2.43,2.44,2.54,
+2.40,2.60,2.45,2.43,2.46,2.51,2.38,2.54,2.44,2.51,
+2.55,2.50,2.40,2.54,2.52,2.43,2.50,2.47,2.48,2.55,
+2.49,2.56,2.56,2.61,2.56,2.59,2.60,2.52,2.56,2.63,
+2.56,2.48,2.65,2.63,2.56,2.58,2.63,2.62,2.75,2.68,
+0.41,0.45,0.47,0.48,0.46,0.51,0.52,0.53,0.59,0.56,
+0.59,0.62,0.63,0.68,0.63,0.67,0.70,0.68,0.71,0.72,
+0.74,0.76,0.74,0.74,0.76,0.76,0.80,0.76,0.81,0.78,
+0.80,0.81,0.89,0.86,0.89,0.90,0.85,0.89,0.94,0.97,
+0.96,0.91,0.97,0.93,0.98,0.96,0.96,0.99,0.98,0.99,
+1.03,1.08,1.05,1.04,1.03,1.04,1.06,1.08,1.05,1.16,
+1.13,1.12,1.12,1.09,1.11,1.15,1.19,1.12,1.15,1.13,
+1.18,1.14,1.14,1.21,1.18,1.15,1.25,1.23,1.25,1.25,
+1.25,1.24,1.26,1.34,1.24,1.29,1.27,1.30,1.27,1.30,
+1.39,1.34,1.32,1.32,1.38,1.32,1.35,1.33,1.35,1.36,
+1.39,1.37,1.40,1.33,1.40,1.41,1.34,1.44,1.37,1.45,
+1.38,1.45,1.47,1.44,1.45,1.44,1.50,1.48,1.53,1.48,
+1.48,1.52,1.51,1.43,1.50,1.56,1.56,1.58,1.56,1.47,
+1.56,1.56,1.54,1.55,1.64,1.62,1.55,1.58,1.64,1.63,
+1.58,1.64,1.49,1.62,1.66,1.58,1.62,1.63,1.68,1.62,
+1.63,1.72,1.60,1.73,1.64,1.65,1.75,1.71,1.77,1.76,
+1.74,1.73,1.71,1.79,1.75,1.75,1.70,1.79,1.70,1.81,
+1.80,1.83,1.74,1.77,1.78,1.78,1.75,1.73,1.81,1.87,
+1.76,1.83,1.81,1.75,1.76,1.79,1.86,1.80,1.85,1.85,
+1.83,1.84,1.96,1.87,1.96,1.79,1.90,1.91,1.90,1.91,
+1.86,1.90,1.89,1.85,1.90,1.98,1.90,1.84,1.83,1.91,
+2.01,1.97,1.92,1.99,1.94,1.97,1.97,1.95,2.06,2.04,
+2.01,1.91,2.04,2.02,2.02,2.06,2.00,1.98,1.94,1.98,
+1.96,2.07,2.03,2.05,2.01,2.03,2.02,2.01,2.13,2.08,
+2.02,2.07,2.19,2.07,2.10,2.05,2.11,2.11,2.05,2.13,
+2.13,2.17,2.13,2.14,2.09,2.04,2.06,2.13,2.14,2.13,
+2.11,2.18,2.16,2.25,2.22,2.20,2.14,2.09,2.18,2.23,
+2.16,2.19,2.20,2.24,2.21,2.21,2.19,2.23,2.24,2.22,
+2.24,2.29,2.22,2.23,2.27,2.25,2.23,2.27,2.34,2.28,
+0.37,0.37,0.39,0.40,0.42,0.46,0.45,0.46,0.46,0.51,
+0.51,0.52,0.50,0.53,0.57,0.57,0.59,0.57,0.56,0.64,
+0.64,0.61,0.63,0.67,0.65,0.67,0.69,0.72,0.72,0.69,
+0.72,0.71,0.75,0.75,0.73,0.73,0.76,0.77,0.75,0.82,
+0.79,0.80,0.82,0.84,0.85,0.80,0.84,0.91,0.88,0.89,
+0.91,0.86,0.94,0.91,0.94,0.91,0.94,0.87,0.92,0.94,
+0.95,0.95,1.01,0.97,1.00,0.98,0.95,1.00,1.03,1.04,
+1.02,1.02,1.01,1.00,1.06,0.99,1.01,1.03,1.08,1.10,
+1.09,1.09,1.04,1.06,1.17,1.13,1.08,1.09,1.13,1.10,
+1.14,1.14,1.16,1.08,1.15,1.18,1.18,1.16,1.19,1.22,
+1.20,1.15,1.24,1.17,1.21,1.20,1.19,1.26,1.22,1.24,
+1.26,1.29,1.26,1.28,1.28,1.30,1.22,1.27,1.27,1.30,
+1.31,1.31,1.28,1.27,1.28,1.26,1.32,1.28,1.38,1.33,
+1.35,1.30,1.36,1.39,1.37,1.39,1.41,1.33,1.36,1.41,
+1.34,1.47,1.32,1.37,1.42,1.42,1.42,1.38,1.42,1.37,
+1.44,1.41,1.44,1.43,1.42,1.47,1.40,1.49,1.52,1.47,
+1.48,1.47,1.53,1.46,1.45,1.54,1.48,1.53,1.47,1.42,
+1.47,1.50,1.53,1.48,1.56,1.59,1.49,1.54,1.52,1.55,
+1.60,1.56,1.62,1.52,1.62,1.52,1.58,1.56,1.66,1.64,
+1.55,1.58,1.70,1.58,1.66,1.58,1.63,1.66,1.55,1.63,
+1.59,1.66,1.54,1.63,1.62,1.61,1.60,1.58,1.66,1.72,
+1.60,1.65,1.70,1.69,1.68,1.73,1.68,1.64,1.68,1.64,
+1.72,1.71,1.67,1.71,1.77,1.75,1.73,1.77,1.70,1.77,
+1.73,1.70,1.79,1.78,1.76,1.78,1.79,1.84,1.81,1.76,
+1.80,1.69,1.82,1.70,1.85,1.81,1.76,1.87,1.75,1.83,
+1.84,1.78,1.82,1.79,1.78,1.84,1.81,1.77,1.80,1.86,
+1.87,1.84,1.81,1.92,1.79,1.89,1.83,1.79,1.92,1.86,
+1.93,1.90,1.90,1.84,1.89,1.90,1.88,1.99,1.99,1.89,
+1.85,1.88,1.96,2.00,1.93,1.89,2.01,1.95,1.94,1.86,
+0.29,0.33,0.32,0.37,0.35,0.37,0.38,0.40,0.39,0.45,
+0.43,0.46,0.43,0.48,0.47,0.51,0.51,0.50,0.53,0.51,
+0.54,0.54,0.56,0.57,0.53,0.59,0.58,0.56,0.61,0.59,
+0.61,0.60,0.66,0.63,0.63,0.65,0.64,0.67,0.67,0.67,
+0.70,0.68,0.69,0.72,0.70,0.73,0.73,0.76,0.74,0.74,
+0.75,0.72,0.78,0.78,0.76,0.81,0.79,0.81,0.81,0.82,
+0.84,0.82,0.84,0.82,0.81,0.85,0.83,0.87,0.91,0.86,
+0.86,0.88,0.87,0.87,0.90,0.91,0.91,0.90,0.92,0.93,
+0.88,0.93,0.92,0.96,0.95,0.95,0.93,0.99,0.93,1.00,
+0.96,0.98,0.96,0.95,0.95,0.99,1.01,1.01,1.04,0.97,
+1.04,1.02,1.03,0.99,1.02,1.05,1.07,1.10,1.05,1.08,
+1.04,1.02,1.09,1.15,1.07,1.06,1.07,1.10,1.03,1.08,
+1.11,1.14,1.09,1.09,1.14,1.12,1.16,1.13,1.15,1.14,
+1.16,1.12,1.16,1.14,1.21,1.20,1.21,1.16,1.20,1.14,
+1.24,1.19,1.17,1.21,1.16,1.16,1.21,1.24,1.19,1.26,
+1.21,1.22,1.18,1.28,1.26,1.23,1.24,1.30,1.24,1.26,
+1.29,1.28,1.35,1.19,1.28,1.32,1.25,1.30,1.34,1.29,
+1.32,1.26,1.32,1.30,1.37,1.29,1.26,1.40,1.29,1.38,
+1.31,1.32,1.35,1.34,1.32,1.34,1.35,1.42,1.37,1.46,
+1.36,1.42,1.37,1.39,1.32,1.38,1.41,1.39,1.33,1.41,
+1.44,1.41,1.36,1.48,1.43,1.44,1.36,1.45,1.38,1.43,
+1.42,1.41,1.43,1.48,1.42,1.47,1.40,1.43,1.53,1.47,
+1.45,1.46,1.43,1.40,1.49,1.44,1.54,1.44,1.46,1.47,
+1.50,1.47,1.45,1.53,1.58,1.48,1.52,1.51,1.54,1.55,
+1.53,1.55,1.51,1.55,1.58,1.54,1.55,1.54,1.55,1.61,
+1.58,1.54,1.58,1.57,1.56,1.51,1.53,1.54,1.63,1.58,
+1.59,1.62,1.55,1.68,1.60,1.65,1.66,1.60,1.58,1.61,
+1.57,1.61,1.64,1.60,1.69,1.63,1.61,1.62,1.68,1.60,
+1.62,1.63,1.76,1.65,1.62,1.61,1.65,1.67,1.64,1.68,
+0.25,0.30,0.30,0.31,0.29,0.31,0.32,0.32,0.36,0.36,
+0.37,0.36,0.39,0.39,0.43,0.43,0.43,0.41,0.47,0.41,
+0.42,0.44,0.47,0.46,0.46,0.51,0.46,0.52,0.54,0.54,
+0.52,0.55,0.54,0.57,0.54,0.54,0.57,0.59,0.59,0.58,
+0.59,0.57,0.60,0.61,0.62,0.59,0.61,0.59,0.63,0.66,
+0.65,0.64,0.66,0.66,0.66,0.67,0.68,0.67,0.66,0.73,
+0.68,0.69,0.72,0.69,0.70,0.70,0.72,0.71,0.75,0.76,
+0.72,0.73,0.74,0.79,0.78,0.78,0.78,0.76,0.74,0.79,
+0.81,0.79,0.82,0.81,0.77,0.82,0.86,0.77,0.84,0.82,
+0.81,0.82,0.89,0.86,0.81,0.84,0.83,0.87,0.82,0.88,
+0.88,0.86,0.89,0.92,0.88,0.88,0.92,0.93,0.90,0.92,
+0.88,0.88,0.91,0.93,0.95,0.85,0.95,0.93,0.96,0.97,
+0.92,0.97,0.96,0.94,0.97,0.93,0.95,0.93,0.93,1.00,
+0.96,0.94,1.02,1.02,0.99,0.97,1.00,0.98,1.00,1.02,
+0.99,1.02,1.02,1.03,1.02,1.03,1.07,1.06,1.02,1.07,
+1.10,1.04,1.06,1.08,1.07,1.06,1.07,1.08,1.08,1.06,
+1.10,1.11,1.12,1.09,1.09,1.07,1.11,1.16,1.06,1.09,
+1.16,1.08,1.08,1.10,1.19,1.13,1.15,1.15,1.11,1.13,
+1.12,1.10,1.18,1.18,1.16,1.14,1.13,1.18,1.17,1.20,
+1.14,1.20,1.15,1.16,1.23,1.17,1.17,1.23,1.21,1.22,
+1.20,1.18,1.26,1.21,1.24,1.23,1.22,1.22,1.25,1.26,
+1.16,1.24,1.25,1.22,1.32,1.28,1.26,1.24,1.26,1.24,
+1.20,1.24,1.28,1.27,1.28,1.25,1.32,1.29,1.27,1.31,
+1.31,1.29,1.30,1.29,1.33,1.32,1.32,1.30,1.31,1.31,
+1.36,1.35,1.33,1.33,1.35,1.38,1.32,1.26,1.29,1.34,
+1.32,1.36,1.34,1.33,1.31,1.31,1.35,1.35,1.37,1.35,
+1.36,1.43,1.34,1.32,1.37,1.34,1.38,1.30,1.37,1.40,
+1.43,1.39,1.41,1.40,1.42,1.38,1.41,1.38,1.38,1.43,
+1.41,1.40,1.36,1.39,1.42,1.39,1.45,1.43,1.40,1.50,
+0.22,0.25,0.23,0.24,0.27,0.28,0.31,0.31,0.27,0.30,
+0.30,0.33,0.30,0.34,0.38,0.37,0.38,0.36,0.39,0.39,
+0.40,0.41,0.44,0.40,0.41,0.42,0.43,0.42,0.48,0.43,
+0.46,0.44,0.48,0.48,0.46,0.46,0.48,0.48,0.49,0.47,
+0.49,0.53,0.49,0.52,0.49,0.52,0.53,0.54,0.56,0.54,
+0.53,0.57,0.58,0.55,0.53,0.61,0.60,0.58,0.57,0.60,
+0.62,0.60,0.57,0.60,0.58,0.61,0.64,0.64,0.65,0.61,
+0.66,0.63,0.62,0.64,0.64,0.63,0.65,0.67,0.66,0.68,
+0.67,0.72,0.64,0.70,0.71,0.67,0.74,0.68,0.70,0.69,
+0.71,0.75,0.71,0.70,0.71,0.75,0.73,0.75,0.79,0.74,
+0.75,0.75,0.78,0.77,0.73,0.75,0.77,0.76,0.77,0.76,
+0.78,0.81,0.79,0.81,0.79,0.77,0.81,0.78,0.83,0.80,
+0.86,0.82,0.83,0.83,0.84,0.83,0.82,0.86,0.86,0.86,
+0.86,0.85,0.87,0.84,0.82,0.86,0.92,0.84,0.90,0.84,
+0.90,0.88,0.88,0.87,0.87,0.87,0.90,0.85,0.90,0.93,
+0.88,0.89,0.90,0.87,0.92,0.93,0.91,0.90,0.89,0.97,
+0.97,0.91,0.93,0.96,0.92,0.96,0.97,0.91,0.91,0.95,
+0.98,0.97,0.96,0.95,0.94,1.00,0.94,0.95,0.98,0.96,
+1.03,0.98,0.93,1.03,1.00,0.97,0.96,1.02,1.02,1.00,
+1.00,1.03,0.98,1.01,1.03,1.00,1.05,1.05,0.96,1.04,
+1.03,1.02,1.05,1.06,1.06,1.03,1.07,1.06,1.02,1.07,
+1.03,1.06,1.06,1.03,1.06,1.10,1.09,1.06,1.05,1.04,
+1.05,1.09,1.06,1.08,1.11,1.05,1.19,1.09,1.10,1.10,
+1.14,1.04,1.14,1.09,1.11,1.13,1.10,1.14,1.11,1.10,
+1.12,1.17,1.11,1.13,1.13,1.12,1.13,1.17,1.15,1.20,
+1.13,1.10,1.17,1.12,1.18,1.19,1.13,1.22,1.17,1.14,
+1.12,1.15,1.15,1.14,1.16,1.15,1.15,1.18,1.16,1.24,
+1.18,1.15,1.17,1.15,1.24,1.24,1.21,1.23,1.19,1.19,
+1.18,1.20,1.26,1.21,1.23,1.22,1.24,1.20,1.24,1.19,
+0.20,0.19,0.24,0.21,0.24,0.23,0.25,0.21,0.21,0.28,
+0.28,0.30,0.29,0.31,0.28,0.33,0.29,0.34,0.33,0.36,
+0.35,0.34,0.35,0.33,0.35,0.39,0.38,0.35,0.37,0.37,
+0.39,0.41,0.38,0.41,0.38,0.42,0.41,0.40,0.40,0.41,
+0.42,0.44,0.43,0.44,0.44,0.46,0.45,0.47,0.49,0.46,
+0.45,0.49,0.48,0.46,0.49,0.50,0.49,0.47,0.52,0.53,
+0.50,0.52,0.53,0.51,0.52,0.54,0.52,0.52,0.53,0.54,
+0.53,0.55,0.57,0.59,0.55,0.55,0.56,0.59,0.57,0.59,
+0.54,0.58,0.56,0.61,0.57,0.61,0.62,0.58,0.58,0.62,
+0.61,0.61,0.63,0.63,0.68,0.62,0.63,0.64,0.64,0.68,
+0.61,0.63,0.64,0.65,0.63,0.65,0.65,0.65,0.68,0.69,
+0.63,0.68,0.64,0.68,0.65,0.66,0.68,0.66,0.69,0.66,
+0.65,0.70,0.69,0.69,0.72,0.69,0.74,0.74,0.74,0.69,
+0.70,0.74,0.71,0.69,0.71,0.71,0.74,0.75,0.76,0.75,
+0.72,0.77,0.76,0.74,0.74,0.78,0.74,0.76,0.79,0.79,
+0.78,0.78,0.73,0.72,0.80,0.78,0.76,0.79,0.80,0.80,
+0.80,0.78,0.80,0.80,0.81,0.76,0.79,0.80,0.79,0.83,
+0.84,0.83,0.83,0.83,0.83,0.80,0.84,0.86,0.81,0.84,
+0.87,0.83,0.84,0.83,0.85,0.86,0.84,0.85,0.92,0.85,
+0.83,0.86,0.84,0.85,0.86,0.89,0.89,0.88,0.88,0.87,
+0.84,0.87,0.92,0.89,0.88,0.92,0.95,0.91,0.89,0.92,
+0.89,0.96,0.87,0.95,0.97,0.87,0.90,0.92,0.90,0.92,
+0.93,0.92,0.94,0.91,0.93,0.90,0.91,0.88,0.96,0.91,
+0.95,0.95,0.89,0.94,0.97,0.96,0.94,0.91,0.96,0.95,
+0.90,0.94,0.97,0.97,1.00,0.94,0.99,0.96,1.01,0.94,
+0.97,0.99,1.03,1.02,0.95,1.02,1.01,0.94,0.98,0.96,
+1.00,1.01,0.99,1.00,1.03,1.02,1.02,0.98,1.01,0.98,
+0.99,1.02,1.03,1.07,1.05,1.02,1.04,1.03,1.08,1.00,
+1.02,1.07,1.07,1.05,1.03,1.06,1.04,1.05,1.05,1.05,
+0.18,0.16,0.18,0.15,0.19,0.18,0.21,0.20,0.22,0.22,
+0.24,0.23,0.26,0.26,0.24,0.26,0.25,0.27,0.26,0.28,
+0.26,0.27,0.30,0.30,0.29,0.28,0.31,0.32,0.35,0.35,
+0.32,0.35,0.32,0.34,0.33,0.33,0.35,0.39,0.37,0.38,
+0.37,0.37,0.33,0.37,0.35,0.34,0.38,0.40,0.40,0.38,
+0.40,0.39,0.42,0.41,0.44,0.41,0.44,0.42,0.42,0.46,
+0.41,0.46,0.46,0.45,0.45,0.44,0.47,0.48,0.47,0.46,
+0.47,0.46,0.47,0.47,0.46,0.50,0.47,0.48,0.51,0.51,
+0.56,0.48,0.50,0.51,0.50,0.53,0.49,0.48,0.52,0.53,
+0.52,0.53,0.52,0.53,0.51,0.55,0.54,0.51,0.58,0.54,
+0.54,0.56,0.56,0.55,0.57,0.59,0.56,0.55,0.55,0.56,
+0.56,0.56,0.56,0.58,0.59,0.58,0.58,0.58,0.57,0.62,
+0.61,0.61,0.60,0.57,0.58,0.61,0.61,0.61,0.61,0.61,
+0.60,0.67,0.59,0.64,0.60,0.62,0.61,0.65,0.62,0.61,
+0.64,0.67,0.66,0.66,0.64,0.63,0.63,0.68,0.66,0.68,
+0.66,0.68,0.62,0.71,0.68,0.65,0.70,0.66,0.70,0.69,
+0.71,0.71,0.72,0.66,0.68,0.66,0.67,0.70,0.71,0.74,
+0.68,0.71,0.72,0.69,0.68,0.69,0.69,0.70,0.70,0.74,
+0.69,0.73,0.75,0.74,0.71,0.72,0.73,0.74,0.77,0.76,
+0.73,0.75,0.75,0.73,0.77,0.73,0.75,0.71,0.76,0.77,
+0.77,0.75,0.79,0.77,0.78,0.74,0.75,0.75,0.81,0.75,
+0.79,0.81,0.77,0.77,0.79,0.75,0.84,0.82,0.79,0.79,
+0.77,0.75,0.79,0.79,0.75,0.81,0.81,0.78,0.83,0.79,
+0.80,0.85,0.84,0.80,0.83,0.78,0.84,0.82,0.84,0.80,
+0.86,0.84,0.83,0.86,0.81,0.84,0.84,0.81,0.82,0.85,
+0.84,0.83,0.86,0.88,0.84,0.85,0.82,0.84,0.84,0.85,
+0.85,0.88,0.88,0.91,0.86,0.86,0.86,0.87,0.87,0.92,
+0.88,0.91,0.86,0.83,0.87,0.87,0.91,0.89,0.89,0.89,
+0.87,0.89,0.85,0.90,0.96,0.90,0.90,0.88,0.91,0.88,
+0.11,0.15,0.16,0.17,0.15,0.16,0.16,0.20,0.20,0.17,
+0.21,0.19,0.21,0.23,0.24,0.18,0.24,0.23,0.24,0.23,
+0.24,0.26,0.27,0.28,0.26,0.26,0.28,0.29,0.24,0.29,
+0.30,0.28,0.29,0.27,0.29,0.29,0.31,0.30,0.31,0.29,
+0.32,0.33,0.31,0.32,0.34,0.30,0.33,0.33,0.33,0.32,
+0.34,0.33,0.35,0.36,0.36,0.33,0.36,0.37,0.40,0.36,
+0.35,0.37,0.42,0.39,0.39,0.39,0.42,0.39,0.40,0.41,
+0.38,0.38,0.39,0.41,0.43,0.39,0.41,0.40,0.40,0.41,
+0.45,0.41,0.43,0.43,0.42,0.44,0.43,0.40,0.43,0.46,
+0.43,0.45,0.42,0.46,0.46,0.44,0.49,0.48,0.46,0.48,
+0.48,0.49,0.46,0.51,0.50,0.47,0.47,0.48,0.47,0.49,
+0.49,0.46,0.46,0.48,0.49,0.53,0.52,0.48,0.51,0.49,
+0.48,0.49,0.49,0.52,0.51,0.52,0.53,0.56,0.51,0.54,
+0.53,0.51,0.53,0.53,0.54,0.53,0.55,0.54,0.56,0.57,
+0.58,0.53,0.57,0.54,0.51,0.54,0.57,0.56,0.59,0.56,
+0.56,0.57,0.54,0.56,0.62,0.59,0.57,0.62,0.58,0.58,
+0.59,0.59,0.60,0.58,0.58,0.59,0.57,0.57,0.58,0.60,
+0.57,0.58,0.62,0.60,0.60,0.60,0.63,0.58,0.62,0.65,
+0.58,0.60,0.59,0.67,0.65,0.61,0.60,0.65,0.66,0.64,
+0.61,0.66,0.62,0.65,0.68,0.65,0.60,0.64,0.61,0.66,
+0.63,0.64,0.64,0.67,0.66,0.62,0.66,0.66,0.68,0.65,
+0.67,0.69,0.66,0.66,0.66,0.71,0.66,0.70,0.67,0.70,
+0.68,0.65,0.70,0.71,0.69,0.66,0.71,0.66,0.72,0.70,
+0.68,0.65,0.68,0.65,0.69,0.70,0.70,0.65,0.65,0.71,
+0.70,0.70,0.71,0.72,0.75,0.71,0.69,0.71,0.73,0.72,
+0.70,0.72,0.73,0.70,0.75,0.69,0.73,0.71,0.75,0.73,
+0.73,0.70,0.73,0.74,0.70,0.72,0.75,0.73,0.74,0.73,
+0.73,0.75,0.76,0.81,0.77,0.76,0.71,0.79,0.73,0.76,
+0.74,0.77,0.75,0.79,0.75,0.76,0.79,0.75,0.75,0.79,
+0.11,0.11,0.11,0.13,0.15,0.16,0.16,0.16,0.16,0.19,
+0.19,0.19,0.18,0.15,0.18,0.21,0.18,0.20,0.22,0.21,
+0.20,0.22,0.19,0.21,0.21,0.22,0.26,0.23,0.24,0.23,
+0.25,0.25,0.26,0.25,0.25,0.25,0.25,0.25,0.26,0.28,
+0.24,0.25,0.29,0.25,0.27,0.30,0.29,0.29,0.27,0.29,
+0.30,0.31,0.30,0.31,0.30,0.28,0.28,0.33,0.30,0.30,
+0.32,0.32,0.33,0.30,0.35,0.32,0.31,0.33,0.30,0.37,
+0.37,0.31,0.32,0.36,0.34,0.36,0.30,0.32,0.36,0.34,
+0.37,0.38,0.36,0.36,0.38,0.39,0.38,0.36,0.38,0.39,
+0.37,0.42,0.39,0.36,0.39,0.37,0.37,0.36,0.40,0.40,
+0.38,0.38,0.43,0.40,0.39,0.41,0.40,0.42,0.41,0.38,
+0.43,0.39,0.45,0.44,0.44,0.42,0.43,0.44,0.46,0.42,
+0.43,0.46,0.42,0.47,0.43,0.44,0.43,0.45,0.42,0.46,
+0.47,0.46,0.47,0.48,0.46,0.44,0.50,0.45,0.47,0.48,
+0.43,0.45,0.44,0.46,0.48,0.48,0.47,0.50,0.48,0.47,
+0.50,0.52,0.50,0.51,0.48,0.50,0.50,0.52,0.54,0.47,
+0.48,0.50,0.52,0.50,0.52,0.49,0.49,0.49,0.52,0.49,
+0.49,0.49,0.52,0.53,0.50,0.54,0.52,0.53,0.54,0.52,
+0.50,0.52,0.51,0.52,0.53,0.55,0.54,0.56,0.54,0.54,
+0.51,0.53,0.56,0.58,0.59,0.57,0.56,0.53,0.57,0.55,
+0.55,0.55,0.58,0.59,0.53,0.57,0.55,0.57,0.58,0.55,
+0.57,0.58,0.61,0.57,0.54,0.58,0.60,0.56,0.60,0.54,
+0.57,0.58,0.60,0.63,0.58,0.59,0.56,0.56,0.60,0.58,
+0.59,0.61,0.56,0.61,0.61,0.59,0.61,0.61,0.60,0.64,
+0.55,0.61,0.60,0.61,0.61,0.58,0.63,0.59,0.57,0.61,
+0.63,0.60,0.63,0.61,0.60,0.61,0.61,0.62,0.66,0.64,
+0.66,0.63,0.62,0.63,0.62,0.63,0.59,0.64,0.63,0.62,
+0.67,0.64,0.60,0.63,0.67,0.62,0.66,0.67,0.63,0.64,
+0.66,0.65,0.63,0.66,0.64,0.66,0.67,0.66,0.65,0.69,
+1.02,1.06,1.08,1.15,1.23,1.24,1.24,1.32,1.31,1.36,
+1.45,1.41,1.51,1.56,1.62,1.59,1.64,1.72,1.69,1.73,
+1.74,1.71,1.75,1.81,1.90,1.81,1.91,1.95,1.97,1.97,
+1.99,2.02,2.01,2.07,2.05,2.11,2.06,2.21,2.18,2.15,
+2.33,2.21,2.19,2.23,2.32,2.43,2.34,2.42,2.46,2.53,
+2.46,2.51,2.44,2.52,2.52,2.57,2.46,2.52,2.68,2.65,
+2.64,2.56,2.72,2.75,2.69,2.69,2.78,2.75,2.80,2.74,
+2.89,2.66,2.81,2.89,2.83,2.85,2.92,2.94,2.99,2.95,
+3.03,2.99,2.98,3.01,3.08,3.04,3.13,3.16,3.15,3.12,
+3.16,3.09,3.25,3.12,3.30,3.10,3.15,3.24,3.30,3.36,
+3.41,3.28,3.28,3.48,3.29,3.35,3.38,3.52,3.29,3.36,
+3.41,3.42,3.55,3.41,3.45,3.37,3.56,3.71,3.54,3.49,
+3.45,3.48,3.72,3.57,3.65,3.49,3.62,3.68,3.57,3.68,
+3.64,3.83,3.80,3.76,3.71,3.75,3.79,3.80,3.99,3.78,
+3.84,3.77,3.83,3.72,3.95,3.89,3.97,3.92,3.93,4.19,
+4.04,3.95,4.09,4.11,3.98,3.99,4.05,3.97,4.11,4.07,
+4.09,3.99,4.02,4.10,4.15,4.34,4.10,4.35,4.13,4.25,
+4.35,4.23,4.14,4.18,4.46,4.24,4.27,4.46,4.12,4.48,
+4.32,4.44,4.15,4.33,4.31,4.25,4.44,4.32,4.42,4.46,
+4.34,4.25,4.32,4.44,4.47,4.38,4.41,4.60,4.50,4.48,
+4.43,4.66,4.48,4.67,4.51,4.59,4.63,4.76,4.66,4.57,
+4.76,4.78,4.77,4.62,4.75,4.97,4.85,4.75,4.55,4.66,
+4.85,4.77,4.60,4.64,4.65,4.85,4.80,4.79,4.77,4.85,
+4.82,4.83,4.80,4.96,4.83,5.06,4.93,4.85,5.08,4.81,
+4.95,4.90,4.97,4.99,4.88,4.91,5.12,5.11,5.11,5.02,
+5.20,5.02,5.08,4.91,4.98,5.18,5.15,5.07,5.16,5.17,
+5.06,5.17,5.23,5.33,5.24,5.06,5.31,5.06,5.29,5.37,
+5.14,5.46,5.14,5.39,5.23,5.35,5.60,5.28,5.41,5.35,
+5.37,5.40,5.29,5.49,5.57,5.19,5.48,5.47,5.24,5.65,
+0.90,0.88,0.93,1.01,1.05,1.10,1.14,1.22,1.15,1.22,
+1.25,1.26,1.34,1.38,1.39,1.41,1.47,1.50,1.51,1.48,
+1.61,1.59,1.59,1.59,1.62,1.68,1.67,1.79,1.72,1.77,
+1.83,1.75,1.79,1.91,1.81,1.93,1.90,1.96,1.90,1.95,
+2.02,2.05,1.99,2.05,2.03,2.15,2.17,2.15,2.13,2.20,
+2.12,2.18,2.23,2.20,2.17,2.22,2.32,2.29,2.22,2.33,
+2.31,2.39,2.47,2.33,2.44,2.40,2.36,2.45,2.59,2.58,
+2.49,2.52,2.49,2.50,2.60,2.67,2.61,2.68,2.56,2.61,
+2.61,2.74,2.73,2.80,2.68,2.67,2.81,2.68,2.86,2.64,
+2.81,2.93,2.83,2.89,2.87,2.90,2.89,2.84,2.94,2.81,
+2.95,2.99,2.78,3.04,2.95,2.97,3.04,2.94,3.06,3.18,
+3.21,3.14,3.01,3.09,3.20,3.07,3.12,3.07,3.21,3.26,
+3.21,3.21,3.12,3.31,3.16,3.28,3.26,3.34,3.39,3.35,
+3.37,3.40,3.41,3.30,3.36,3.41,3.35,3.38,3.39,3.43,
+3.41,3.39,3.56,3.49,3.45,3.48,3.61,3.28,3.39,3.43,
+3.50,3.44,3.55,3.43,3.55,3.66,3.56,3.60,3.81,3.66,
+3.69,3.70,3.52,3.55,3.61,3.83,3.55,3.72,3.75,3.67,
+3.63,3.89,3.82,3.79,3.70,3.81,3.65,3.88,3.86,3.83,
+3.85,3.79,3.84,3.83,3.72,3.82,4.13,3.87,3.91,3.97,
+4.06,3.91,4.00,3.92,4.07,3.95,4.01,3.92,4.08,3.90,
+4.05,3.98,4.29,4.00,4.08,4.09,4.15,4.01,4.09,4.17,
+4.18,4.16,4.19,4.25,4.21,4.27,4.15,4.26,4.17,4.14,
+4.38,4.36,4.13,4.23,4.22,4.24,4.55,4.27,4.32,4.18,
+4.35,4.33,4.36,4.39,4.35,4.46,4.52,4.35,4.48,4.46,
+4.45,4.64,4.36,4.39,4.40,4.44,4.55,4.34,4.43,4.61,
+4.30,4.50,4.50,4.62,4.54,4.34,4.67,4.48,4.75,4.48,
+4.68,4.75,4.54,4.64,4.61,4.56,4.68,4.56,4.49,4.74,
+4.67,4.68,4.66,4.60,4.48,4.62,4.74,4.85,4.68,4.74,
+4.57,4.61,4.73,4.71,4.79,4.66,4.79,4.71,4.70,4.74,
+0.80,0.85,0.84,0.91,0.92,0.96,0.97,1.02,1.11,1.06,
+1.16,1.10,1.18,1.13,1.22,1.28,1.24,1.27,1.30,1.34,
+1.36,1.38,1.38,1.43,1.41,1.43,1.50,1.53,1.49,1.55,
+1.56,1.57,1.68,1.64,1.64,1.62,1.67,1.68,1.74,1.68,
+1.77,1.81,1.74,1.83,1.78,1.75,1.83,1.87,1.90,1.89,
+1.94,1.95,1.90,1.95,1.98,2.00,2.02,2.01,2.01,2.11,
+2.12,2.10,2.07,2.18,2.12,2.22,2.21,2.21,2.25,2.15,
+2.16,2.20,2.22,2.31,2.27,2.25,2.34,2.21,2.35,2.40,
+2.30,2.31,2.47,2.35,2.43,2.42,2.40,2.45,2.60,2.47,
+2.51,2.38,2.46,2.46,2.41,2.54,2.58,2.48,2.55,2.58,
+2.56,2.62,2.62,2.58,2.64,2.58,2.67,2.79,2.71,2.75,
+2.78,2.76,2.70,2.68,2.76,2.63,2.64,2.73,2.66,2.77,
+2.72,2.77,2.83,2.82,2.85,2.88,2.88,2.94,2.89,2.99,
+2.84,2.91,2.93,2.93,2.92,3.06,2.91,2.99,2.96,3.02,
+3.03,3.05,3.01,3.17,3.10,2.99,3.03,3.15,3.09,3.16,
+3.11,3.18,3.06,3.10,3.37,3.27,3.30,3.18,3.18,3.20,
+3.28,3.18,3.17,3.31,3.41,3.28,3.24,3.30,3.20,3.33,
+3.20,3.33,3.15,3.34,3.45,3.35,3.29,3.32,3.38,3.64,
+3.44,3.40,3.43,3.36,3.42,3.43,3.53,3.38,3.37,3.53,
+3.56,3.52,3.52,3.52,3.60,3.61,3.60,3.53,3.51,3.56,
+3.49,3.59,3.51,3.58,3.58,3.62,3.47,3.53,3.56,3.67,
+3.66,3.75,3.55,3.61,3.59,3.74,3.74,3.78,3.80,3.72,
+3.68,3.83,3.88,3.81,3.72,3.71,3.83,3.61,3.92,3.78,
+3.81,3.67,3.81,3.88,3.84,3.92,3.95,3.92,3.85,3.93,
+3.78,3.93,3.91,3.89,4.00,4.10,3.91,3.91,3.99,3.86,
+3.99,3.93,4.02,4.01,3.98,4.02,3.97,4.00,3.94,3.93,
+4.01,3.97,4.04,4.30,4.04,4.03,4.12,4.01,4.32,4.31,
+4.12,4.15,4.25,4.22,4.03,3.98,4.13,4.19,4.25,4.05,
+4.20,4.31,4.22,4.29,4.17,4.13,4.22,4.22,4.27,4.40,
+0.71,0.74,0.77,0.82,0.85,0.88,0.88,0.91,0.92,0.95,
+0.97,0.96,1.04,0.99,1.05,1.09,1.08,1.15,1.15,1.18,
+1.21,1.20,1.26,1.26,1.29,1.28,1.34,1.33,1.32,1.37,
+1.31,1.44,1.39,1.43,1.45,1.45,1.48,1.46,1.52,1.53,
+1.52,1.51,1.54,1.65,1.63,1.54,1.66,1.71,1.64,1.77,
+1.70,1.68,1.67,1.72,1.70,1.79,1.86,1.78,1.78,1.84,
+1.86,1.82,1.80,1.84,1.85,1.85,1.90,1.90,1.90,1.86,
+1.90,1.98,1.96,1.99,1.93,1.91,2.04,2.05,2.01,2.02,
+2.09,2.03,2.07,2.10,2.16,2.02,2.14,2.09,2.09,2.13,
+2.22,2.16,2.16,2.16,2.22,2.29,2.21,2.34,2.32,2.13,
+2.24,2.31,2.31,2.32,2.33,2.31,2.35,2.41,2.37,2.35,
+2.39,2.48,2.38,2.38,2.43,2.41,2.35,2.48,2.46,2.45,
+2.42,2.56,2.40,2.40,2.52,2.61,2.45,2.52,2.47,2.65,
+2.47,2.57,2.60,2.57,2.57,2.62,2.66,2.71,2.65,2.67,
+2.65,2.76,2.78,2.62,2.65,2.70,2.74,2.71,2.73,2.80,
+2.76,2.62,2.83,2.78,2.75,2.83,2.79,2.72,2.80,2.71,
+2.82,2.83,2.83,3.00,2.85,2.86,2.88,2.97,2.90,2.92,
+2.89,3.04,2.97,2.99,2.81,2.83,2.92,3.04,2.97,2.96,
+3.06,3.02,2.92,2.99,3.22,3.06,3.06,3.01,3.10,3.01,
+3.12,3.21,3.15,3.02,2.98,3.18,3.10,3.05,3.01,3.16,
+3.19,3.18,3.15,3.16,3.29,3.25,3.06,3.16,3.25,3.13,
+3.29,3.14,3.12,3.17,3.19,3.30,3.19,3.26,3.19,3.21,
+3.30,3.29,3.24,3.39,3.31,3.55,3.36,3.25,3.36,3.35,
+3.41,3.34,3.34,3.46,3.51,3.42,3.49,3.52,3.38,3.42,
+3.30,3.38,3.44,3.37,3.43,3.63,3.47,3.56,3.66,3.56,
+3.58,3.52,3.60,3.52,3.53,3.51,3.60,3.53,3.57,3.50,
+3.55,3.49,3.49,3.46,3.45,3.51,3.51,3.66,3.64,3.56,
+3.59,3.59,3.57,3.55,3.67,3.58,3.77,3.67,3.56,3.66,
+3.72,3.66,3.66,3.85,3.53,3.82,3.79,3.90,3.82,3.68,
+0.59,0.64,0.69,0.69,0.74,0.74,0.77,0.80,0.80,0.83,
+0.88,0.89,0.89,0.92,0.95,0.97,0.99,1.00,0.98,1.09,
+1.03,1.04,1.05,1.12,1.13,1.09,1.13,1.21,1.23,1.15,
+1.19,1.27,1.22,1.24,1.21,1.27,1.25,1.34,1.29,1.27,
+1.35,1.41,1.39,1.40,1.43,1.33,1.43,1.43,1.45,1.51,
+1.40,1.43,1.44,1.48,1.50,1.55,1.56,1.52,1.55,1.63,
+1.59,1.58,1.63,1.62,1.67,1.59,1.63,1.66,1.69,1.61,
+1.66,1.74,1.67,1.79,1.73,1.71,1.81,1.83,1.79,1.83,
+1.76,1.84,1.73,1.78,1.83,1.89,1.89,1.81,1.85,1.89,
+1.88,1.81,1.89,1.93,1.95,1.91,1.93,1.92,1.97,2.02,
+2.03,2.04,2.00,2.11,2.05,2.04,2.09,2.07,2.05,2.09,
+2.06,2.10,2.17,2.14,2.24,2.14,2.10,2.16,2.11,2.14,
+2.13,2.22,2.20,2.15,2.21,2.27,2.29,2.22,2.26,2.22,
+2.13,2.27,2.24,2.23,2.25,2.31,2.37,2.32,2.33,2.34,
+2.34,2.31,2.31,2.31,2.28,2.41,2.30,2.42,2.44,2.35,
+2.46,2.45,2.43,2.34,2.50,2.52,2.51,2.45,2.47,2.35,
+2.51,2.53,2.48,2.51,2.41,2.61,2.57,2.49,2.56,2.54,
+2.64,2.45,2.60,2.50,2.55,2.56,2.60,2.47,2.65,2.54,
+2.61,2.77,2.66,2.64,2.69,2.72,2.73,2.66,2.76,2.71,
+2.61,2.59,2.63,2.90,2.76,2.66,2.91,2.72,2.68,2.72,
+2.68,2.72,2.73,2.77,2.71,2.80,2.82,2.81,2.84,2.72,
+2.76,2.99,2.88,2.66,2.93,2.86,2.88,2.81,2.94,2.90,
+2.96,2.98,2.91,2.82,3.02,3.00,2.86,2.91,2.86,2.97,
+3.04,2.98,2.87,3.04,3.00,3.03,3.04,3.01,2.97,2.96,
+3.00,3.00,3.02,3.18,2.97,3.00,3.07,2.95,2.95,2.97,
+3.02,3.01,3.12,3.20,3.15,3.02,2.96,3.17,3.12,3.08,
+3.01,3.07,2.91,3.08,3.16,3.21,3.03,3.16,3.19,3.14,
+3.02,3.26,3.25,3.17,3.17,3.24,3.24,3.17,3.33,3.22,
+3.39,3.30,3.27,3.30,3.21,3.22,3.24,3.24,2.99,3.29,
+0.52,0.54,0.59,0.60,0.63,0.66,0.71,0.69,0.71,0.72,
+0.77,0.77,0.74,0.79,0.78,0.83,0.86,0.87,0.83,0.87,
+0.90,0.96,1.00,0.93,0.95,0.95,0.96,1.01,1.00,1.03,
+1.02,1.00,1.01,1.07,1.11,1.12,1.13,1.11,1.15,1.16,
+1.19,1.19,1.20,1.20,1.18,1.21,1.22,1.20,1.24,1.21,
+1.25,1.20,1.26,1.37,1.35,1.36,1.32,1.32,1.40,1.34,
+1.43,1.41,1.41,1.40,1.41,1.46,1.49,1.45,1.43,1.48,
+1.49,1.49,1.50,1.52,1.58,1.49,1.54,1.60,1.54,1.64,
+1.55,1.56,1.57,1.64,1.60,1.64,1.67,1.64,1.62,1.61,
+1.64,1.62,1.67,1.67,1.70,1.62,1.75,1.70,1.64,1.64,
+1.74,1.67,1.75,1.72,1.75,1.80,1.79,1.73,1.80,1.78,
+1.73,1.78,1.85,1.85,1.85,1.84,1.91,1.89,1.87,1.79,
+1.90,1.93,1.85,1.91,1.95,1.95,1.94,1.88,1.98,1.92,
+1.97,2.01,2.05,1.94,1.94,2.05,1.95,2.04,2.07,1.98,
+2.06,1.98,2.07,2.02,2.07,2.02,2.02,2.06,2.12,2.08,
+2.03,2.05,2.11,2.19,2.17,2.13,2.08,2.06,2.19,2.16,
+2.20,2.13,2.16,2.17,2.09,2.17,2.17,2.18,2.13,2.16,
+2.27,2.21,2.20,2.18,2.20,2.22,2.19,2.22,2.26,2.32,
+2.17,2.24,2.21,2.31,2.24,2.39,2.26,2.23,2.42,2.16,
+2.40,2.44,2.24,2.32,2.39,2.46,2.30,2.30,2.40,2.41,
+2.45,2.47,2.43,2.33,2.38,2.42,2.41,2.50,2.43,2.55,
+2.41,2.46,2.45,2.43,2.45,2.55,2.45,2.48,2.43,2.47,
+2.49,2.46,2.57,2.67,2.57,2.58,2.49,2.63,2.65,2.46,
+2.48,2.58,2.38,2.50,2.60,2.63,2.57,2.63,2.64,2.63,
+2.66,2.59,2.81,2.53,2.58,2.64,2.64,2.61,2.68,2.60,
+2.55,2.69,2.60,2.79,2.81,2.67,2.67,2.71,2.76,2.71,
+2.79,2.70,2.64,2.82,2.75,2.60,2.84,2.73,2.84,2.74,
+2.71,2.67,2.80,2.83,2.73,2.89,2.73,2.68,2.80,2.74,
+2.77,2.85,2.82,2.82,2.78,2.92,2.77,2.79,2.96,2.77,
+0.47,0.49,0.50,0.54,0.49,0.56,0.60,0.61,0.62,0.62,
+0.63,0.67,0.68,0.64,0.68,0.70,0.74,0.76,0.81,0.75,
+0.78,0.79,0.80,0.85,0.83,0.85,0.90,0.88,0.88,0.90,
+0.88,0.93,0.97,0.93,0.91,0.96,0.98,1.00,0.98,1.00,
+0.99,1.02,1.05,1.06,1.06,1.08,1.06,1.13,1.14,1.12,
+1.07,1.14,1.15,1.15,1.13,1.21,1.10,1.17,1.22,1.22,
+1.17,1.21,1.24,1.17,1.28,1.26,1.24,1.26,1.29,1.30,
+1.29,1.33,1.27,1.27,1.33,1.28,1.31,1.31,1.33,1.37,
+1.38,1.35,1.39,1.37,1.42,1.33,1.43,1.42,1.41,1.44,
+1.44,1.46,1.47,1.51,1.45,1.48,1.48,1.46,1.52,1.50,
+1.46,1.52,1.46,1.52,1.63,1.49,1.57,1.53,1.55,1.57,
+1.53,1.53,1.52,1.61,1.61,1.55,1.66,1.58,1.68,1.60,
+1.63,1.71,1.68,1.61,1.64,1.65,1.69,1.65,1.70,1.68,
+1.67,1.72,1.74,1.66,1.66,1.75,1.72,1.66,1.80,1.73,
+1.73,1.68,1.77,1.80,1.72,1.71,1.82,1.86,1.75,1.86,
+1.78,1.91,1.77,1.88,1.85,1.81,1.83,1.80,1.82,1.87,
+1.85,1.89,1.90,1.93,1.89,1.93,1.86,1.86,1.96,1.93,
+1.82,1.89,1.89,1.87,2.03,1.91,1.99,1.99,2.01,1.97,
+1.97,1.95,2.02,1.96,1.96,2.03,2.03,2.02,1.99,2.06,
+2.00,2.13,2.08,2.09,2.14,2.05,2.06,2.11,2.12,2.12,
+1.99,2.07,2.11,2.04,2.09,2.03,2.06,2.08,2.11,2.13,
+2.09,2.15,2.12,2.15,2.19,2.14,2.18,2.24,2.07,2.10,
+2.22,2.25,2.24,2.16,2.19,2.24,2.28,2.22,2.21,2.15,
+2.30,2.22,2.18,2.24,2.18,2.29,2.19,2.24,2.29,2.19,
+2.23,2.32,2.30,2.29,2.28,2.31,2.24,2.33,2.25,2.35,
+2.24,2.33,2.35,2.27,2.31,2.34,2.32,2.38,2.40,2.38,
+2.36,2.42,2.38,2.38,2.38,2.33,2.37,2.36,2.44,2.41,
+2.39,2.38,2.31,2.39,2.33,2.53,2.35,2.36,2.47,2.49,
+2.45,2.49,2.47,2.45,2.50,2.48,2.49,2.37,2.46,2.50,
+0.41,0.43,0.44,0.48,0.44,0.50,0.47,0.54,0.54,0.52,
+0.55,0.56,0.60,0.57,0.59,0.60,0.65,0.66,0.68,0.66,
+0.67,0.71,0.69,0.68,0.71,0.76,0.73,0.76,0.74,0.76,
+0.80,0.82,0.82,0.84,0.81,0.81,0.87,0.89,0.88,0.86,
+0.91,0.91,0.91,0.90,0.91,0.88,0.94,0.96,0.95,0.97,
+0.95,0.97,0.99,0.99,1.05,1.01,1.00,1.08,1.06,1.04,
+1.05,1.06,1.04,1.07,1.06,1.04,1.07,1.08,1.03,1.08,
+1.12,1.12,1.16,1.15,1.12,1.16,1.15,1.13,1.14,1.18,
+1.17,1.14,1.20,1.26,1.21,1.21,1.25,1.19,1.29,1.24,
+1.25,1.25,1.26,1.26,1.26,1.28,1.29,1.26,1.31,1.31,
+1.31,1.30,1.28,1.27,1.33,1.29,1.38,1.43,1.31,1.28,
+1.35,1.32,1.33,1.33,1.37,1.36,1.39,1.41,1.36,1.40,
+1.43,1.35,1.39,1.47,1.45,1.42,1.44,1.40,1.43,1.45,
+1.43,1.47,1.48,1.45,1.45,1.57,1.54,1.53,1.53,1.55,
+1.44,1.51,1.50,1.52,1.47,1.52,1.54,1.55,1.50,1.53,
+1.56,1.52,1.57,1.59,1.57,1.60,1.59,1.57,1.64,1.67,
+1.67,1.61,1.61,1.57,1.64,1.65,1.57,1.66,1.67,1.64,
+1.65,1.65,1.70,1.71,1.63,1.70,1.71,1.65,1.65,1.64,
+1.71,1.74,1.74,1.76,1.69,1.74,1.74,1.69,1.74,1.73,
+1.74,1.67,1.74,1.72,1.79,1.80,1.75,1.81,1.82,1.78,
+1.75,1.83,1.80,1.81,1.88,1.86,1.85,1.82,1.88,1.77,
+1.84,1.84,1.84,1.80,1.84,1.91,1.81,1.84,1.86,1.85,
+1.92,1.92,1.89,1.92,1.90,1.86,1.98,1.96,1.85,1.87,
+1.90,2.00,1.95,1.95,1.98,1.92,1.87,1.96,1.93,1.92,
+1.98,1.99,2.05,1.95,1.96,1.97,2.05,1.96,1.98,2.02,
+2.05,2.01,2.01,1.96,1.92,1.98,2.04,2.00,2.03,2.10,
+2.04,1.97,2.04,2.05,2.01,2.06,2.06,2.08,2.06,2.09,
+2.09,2.04,2.13,2.10,1.99,1.99,2.07,2.13,2.10,2.15,
+2.20,2.10,2.13,2.09,2.07,2.05,2.14,2.12,2.21,2.17,
+0.34,0.37,0.37,0.39,0.40,0.43,0.43,0.46,0.46,0.44,
+0.49,0.50,0.52,0.48,0.49,0.55,0.57,0.57,0.57,0.58,
+0.61,0.63,0.61,0.62,0.62,0.66,0.65,0.67,0.65,0.65,
+0.69,0.70,0.70,0.69,0.68,0.73,0.73,0.74,0.76,0.75,
+0.75,0.74,0.81,0.84,0.79,0.82,0.80,0.82,0.82,0.82,
+0.81,0.82,0.81,0.86,0.85,0.86,0.88,0.88,0.89,0.88,
+0.87,0.90,0.87,0.93,0.95,0.90,0.93,0.97,0.93,0.93,
+0.92,0.93,0.98,0.98,0.95,1.00,1.05,0.98,0.99,1.01,
+1.03,1.04,1.08,1.04,1.04,1.05,1.06,1.00,1.10,1.07,
+1.07,1.09,1.12,1.08,1.09,1.11,1.08,1.10,1.14,1.01,
+1.12,1.15,1.20,1.16,1.11,1.16,1.18,1.19,1.18,1.17,
+1.14,1.20,1.20,1.26,1.24,1.21,1.27,1.22,1.26,1.27,
+1.20,1.22,1.24,1.32,1.22,1.24,1.21,1.15,1.24,1.29,
+1.27,1.30,1.26,1.33,1.32,1.31,1.29,1.20,1.31,1.31,
+1.33,1.37,1.35,1.35,1.33,1.31,1.34,1.33,1.38,1.37,
+1.33,1.28,1.35,1.37,1.41,1.39,1.32,1.40,1.33,1.40,
+1.36,1.39,1.45,1.47,1.43,1.45,1.44,1.43,1.41,1.48,
+1.38,1.41,1.48,1.42,1.44,1.53,1.45,1.50,1.50,1.44,
+1.49,1.49,1.51,1.53,1.58,1.55,1.49,1.53,1.48,1.55,
+1.58,1.51,1.53,1.55,1.56,1.50,1.61,1.56,1.53,1.54,
+1.52,1.63,1.60,1.54,1.57,1.62,1.61,1.54,1.53,1.57,
+1.55,1.60,1.65,1.56,1.58,1.52,1.62,1.62,1.59,1.65,
+1.65,1.67,1.61,1.70,1.68,1.70,1.69,1.68,1.61,1.63,
+1.70,1.63,1.64,1.66,1.64,1.80,1.72,1.69,1.70,1.69,
+1.67,1.70,1.75,1.74,1.66,1.64,1.64,1.78,1.72,1.76,
+1.69,1.72,1.81,1.74,1.72,1.68,1.78,1.70,1.82,1.76,
+1.73,1.84,1.79,1.76,1.83,1.74,1.78,1.75,1.69,1.75,
+1.73,1.77,1.83,1.91,1.81,1.91,1.77,1.83,1.79,1.81,
+1.83,1.78,1.76,1.90,1.85,1.88,1.92,1.85,1.83,1.91,
+0.29,0.31,0.34,0.28,0.34,0.37,0.37,0.39,0.38,0.42,
+0.44,0.41,0.42,0.47,0.45,0.48,0.48,0.50,0.51,0.49,
+0.50,0.51,0.53,0.53,0.54,0.56,0.55,0.57,0.59,0.61,
+0.62,0.60,0.60,0.61,0.61,0.66,0.64,0.64,0.66,0.63,
+0.66,0.65,0.67,0.70,0.73,0.72,0.68,0.69,0.68,0.69,
+0.72,0.74,0.73,0.70,0.72,0.74,0.72,0.75,0.75,0.80,
+0.81,0.79,0.79,0.81,0.77,0.80,0.81,0.82,0.82,0.81,
+0.86,0.83,0.90,0.84,0.84,0.84,0.87,0.88,0.91,0.87,
+0.92,0.86,0.92,0.91,0.89,0.87,0.94,0.88,0.95,0.93,
+0.92,0.93,0.99,0.95,0.96,0.95,0.95,0.97,0.94,0.93,
+0.98,1.02,0.97,0.99,1.03,1.01,1.00,1.00,1.03,1.03,
+1.05,1.07,1.02,1.00,1.07,1.03,0.97,1.07,1.03,1.09,
+1.10,1.06,1.07,1.10,1.11,1.09,1.09,1.13,1.03,1.12,
+1.11,1.04,1.10,1.11,1.11,1.14,1.12,1.07,1.09,1.13,
+1.16,1.16,1.15,1.11,1.16,1.21,1.10,1.16,1.21,1.16,
+1.15,1.19,1.21,1.16,1.18,1.26,1.19,1.24,1.15,1.19,
+1.24,1.19,1.25,1.21,1.20,1.28,1.26,1.21,1.23,1.27,
+1.26,1.24,1.19,1.29,1.31,1.27,1.31,1.28,1.28,1.23,
+1.28,1.26,1.19,1.28,1.35,1.33,1.30,1.25,1.30,1.32,
+1.30,1.33,1.29,1.25,1.32,1.30,1.33,1.35,1.38,1.35,
+1.34,1.36,1.38,1.35,1.40,1.38,1.36,1.32,1.41,1.36,
+1.35,1.36,1.37,1.44,1.33,1.35,1.37,1.38,1.42,1.32,
+1.37,1.45,1.44,1.47,1.43,1.38,1.45,1.39,1.41,1.40,
+1.50,1.42,1.50,1.45,1.46,1.42,1.50,1.48,1.50,1.49,
+1.44,1.47,1.51,1.49,1.47,1.48,1.45,1.49,1.48,1.49,
+1.54,1.52,1.51,1.51,1.50,1.49,1.51,1.50,1.48,1.50,
+1.50,1.50,1.53,1.50,1.57,1.51,1.53,1.50,1.51,1.57,
+1.58,1.54,1.57,1.65,1.49,1.60,1.59,1.54,1.53,1.61,
+1.60,1.55,1.59,1.58,1.59,1.59,1.56,1.59,1.61,1.63,
+0.24,0.26,0.30,0.29,0.31,0.31,0.32,0.33,0.34,0.37,
+0.36,0.37,0.38,0.39,0.40,0.42,0.39,0.41,0.42,0.45,
+0.44,0.45,0.44,0.46,0.45,0.50,0.45,0.49,0.49,0.51,
+0.47,0.51,0.52,0.54,0.52,0.53,0.55,0.56,0.56,0.56,
+0.56,0.59,0.56,0.56,0.61,0.57,0.59,0.59,0.60,0.59,
+0.58,0.66,0.67,0.65,0.61,0.65,0.69,0.67,0.68,0.68,
+0.68,0.69,0.68,0.68,0.70,0.69,0.69,0.69,0.71,0.73,
+0.75,0.72,0.73,0.72,0.75,0.75,0.75,0.73,0.73,0.75,
+0.74,0.76,0.77,0.78,0.78,0.72,0.77,0.79,0.79,0.82,
+0.79,0.81,0.84,0.86,0.85,0.89,0.85,0.80,0.84,0.85,
+0.91,0.85,0.85,0.86,0.84,0.82,0.88,0.84,0.85,0.86,
+0.95,0.88,0.85,0.84,0.87,0.93,0.88,0.90,0.93,0.85,
+0.88,0.93,0.98,0.87,0.91,0.95,0.92,1.00,0.91,0.92,
+0.99,0.93,0.90,0.97,0.95,0.99,0.95,0.96,0.99,0.96,
+1.01,0.97,0.99,0.99,1.02,0.98,1.00,1.03,1.00,1.00,
+1.00,1.02,1.05,1.00,1.06,1.04,1.05,1.09,1.03,1.03,
+1.00,1.02,1.04,1.10,1.01,1.07,1.09,1.05,1.08,1.06,
+1.07,1.11,1.06,1.11,1.14,1.09,1.10,1.07,1.10,1.11,
+1.05,1.11,1.12,1.13,1.13,1.07,1.16,1.10,1.14,1.07,
+1.11,1.16,1.15,1.19,1.24,1.14,1.21,1.19,1.14,1.21,
+1.15,1.12,1.20,1.14,1.15,1.16,1.17,1.16,1.20,1.19,
+1.16,1.14,1.20,1.20,1.22,1.24,1.18,1.20,1.24,1.17,
+1.24,1.28,1.24,1.16,1.22,1.24,1.23,1.17,1.23,1.22,
+1.21,1.24,1.18,1.21,1.23,1.27,1.32,1.34,1.26,1.29,
+1.26,1.25,1.29,1.26,1.26,1.24,1.31,1.32,1.33,1.31,
+1.27,1.29,1.33,1.37,1.28,1.31,1.33,1.36,1.29,1.26,
+1.32,1.36,1.32,1.32,1.37,1.34,1.32,1.32,1.39,1.35,
+1.28,1.33,1.38,1.33,1.33,1.34,1.29,1.37,1.41,1.33,
+1.43,1.34,1.41,1.36,1.38,1.40,1.34,1.39,1.38,1.43,
+0.20,0.26,0.27,0.24,0.28,0.27,0.25,0.27,0.31,0.31,
+0.31,0.31,0.34,0.34,0.34,0.34,0.35,0.39,0.39,0.37,
+0.38,0.38,0.40,0.41,0.39,0.42,0.43,0.40,0.44,0.46,
+0.43,0.45,0.45,0.46,0.46,0.48,0.48,0.48,0.50,0.51,
+0.52,0.47,0.48,0.52,0.49,0.50,0.49,0.49,0.53,0.55,
+0.51,0.55,0.57,0.52,0.55,0.57,0.56,0.57,0.55,0.59,
+0.59,0.59,0.56,0.61,0.58,0.59,0.61,0.61,0.58,0.62,
+0.63,0.62,0.65,0.64,0.63,0.63,0.66,0.64,0.65,0.66,
+0.66,0.68,0.64,0.67,0.69,0.69,0.70,0.61,0.69,0.67,
+0.67,0.66,0.71,0.69,0.75,0.71,0.73,0.71,0.72,0.74,
+0.72,0.68,0.74,0.73,0.76,0.73,0.77,0.75,0.75,0.74,
+0.74,0.73,0.77,0.74,0.79,0.81,0.77,0.79,0.75,0.80,
+0.81,0.82,0.77,0.81,0.77,0.83,0.80,0.82,0.83,0.83,
+0.88,0.80,0.84,0.81,0.79,0.80,0.83,0.85,0.89,0.87,
+0.90,0.82,0.83,0.86,0.87,0.90,0.89,0.80,0.90,0.92,
+0.84,0.91,0.83,0.88,0.92,0.83,0.92,0.92,0.93,0.87,
+0.87,0.90,0.87,0.87,0.89,0.94,0.91,0.91,0.87,0.91,
+0.93,0.96,0.91,0.95,0.93,0.95,0.94,0.96,0.95,0.91,
+0.99,0.95,0.97,0.94,0.99,0.96,0.97,1.01,0.97,1.02,
+0.95,0.97,0.98,1.03,0.99,1.01,1.01,0.99,0.99,1.03,
+0.98,0.99,0.99,1.00,0.99,0.97,1.00,1.02,1.02,1.06,
+1.01,1.03,1.01,1.01,1.03,1.02,1.02,1.03,1.01,1.06,
+1.03,1.05,1.06,1.08,1.05,1.08,1.07,1.06,1.04,1.10,
+1.11,1.05,1.09,1.10,1.05,1.07,1.06,1.10,1.08,1.11,
+1.10,1.13,1.10,1.11,1.09,1.10,1.08,1.09,1.11,1.08,
+1.12,1.08,1.15,1.08,1.11,1.11,1.11,1.16,1.12,1.14,
+1.15,1.15,1.14,1.17,1.13,1.21,1.14,1.09,1.16,1.14,
+1.10,1.17,1.15,1.10,1.14,1.18,1.14,1.13,1.22,1.17,
+1.18,1.16,1.26,1.14,1.16,1.19,1.15,1.22,1.20,1.17,
+0.18,0.22,0.21,0.23,0.22,0.25,0.24,0.26,0.23,0.26,
+0.26,0.30,0.29,0.29,0.27,0.29,0.31,0.33,0.32,0.34,
+0.30,0.33,0.34,0.38,0.35,0.35,0.35,0.36,0.41,0.38,
+0.38,0.39,0.37,0.40,0.39,0.40,0.39,0.40,0.41,0.44,
+0.42,0.47,0.43,0.39,0.41,0.44,0.43,0.45,0.45,0.45,
+0.45,0.46,0.47,0.49,0.47,0.48,0.49,0.48,0.52,0.47,
+0.49,0.51,0.52,0.54,0.53,0.51,0.54,0.52,0.52,0.53,
+0.52,0.55,0.49,0.55,0.57,0.53,0.56,0.54,0.53,0.56,
+0.53,0.57,0.56,0.55,0.56,0.56,0.59,0.61,0.58,0.63,
+0.61,0.60,0.61,0.59,0.58,0.61,0.62,0.66,0.63,0.57,
+0.62,0.64,0.63,0.63,0.65,0.63,0.64,0.65,0.67,0.66,
+0.62,0.65,0.66,0.67,0.68,0.67,0.68,0.70,0.71,0.65,
+0.65,0.69,0.70,0.71,0.75,0.69,0.68,0.71,0.71,0.68,
+0.71,0.74,0.72,0.70,0.73,0.69,0.70,0.76,0.73,0.75,
+0.75,0.73,0.74,0.73,0.74,0.74,0.74,0.75,0.76,0.76,
+0.76,0.73,0.73,0.74,0.76,0.78,0.76,0.75,0.80,0.81,
+0.82,0.81,0.78,0.78,0.80,0.79,0.84,0.78,0.76,0.79,
+0.83,0.80,0.79,0.82,0.83,0.82,0.81,0.83,0.79,0.82,
+0.82,0.80,0.85,0.86,0.82,0.82,0.84,0.79,0.88,0.81,
+0.83,0.83,0.81,0.85,0.84,0.84,0.85,0.86,0.85,0.81,
+0.89,0.89,0.88,0.84,0.92,0.87,0.85,0.89,0.89,0.88,
+0.87,0.89,0.94,0.85,0.86,0.85,0.87,0.88,0.87,0.90,
+0.87,0.86,0.92,0.95,0.92,0.94,0.95,0.92,0.92,0.91,
+0.94,0.98,0.93,0.91,0.97,0.93,0.92,0.99,0.94,0.94,
+0.88,0.95,0.96,0.94,0.93,0.96,0.98,0.95,0.97,0.91,
+0.94,0.97,0.97,1.00,0.96,1.03,0.96,0.96,0.96,1.01,
+0.98,0.96,1.03,0.98,0.99,0.97,0.95,0.95,0.99,0.98,
+1.01,0.98,1.01,1.05,1.00,1.01,1.00,1.02,1.01,0.99,
+1.05,1.06,1.00,1.04,1.03,1.06,1.00,1.02,1.01,1.04,
+0.16,0.17,0.18,0.21,0.20,0.20,0.22,0.20,0.24,0.21,
+0.24,0.23,0.26,0.24,0.26,0.24,0.23,0.27,0.26,0.28,
+0.28,0.31,0.28,0.30,0.31,0.32,0.30,0.33,0.33,0.34,
+0.32,0.34,0.33,0.37,0.32,0.34,0.33,0.34,0.34,0.36,
+0.37,0.37,0.37,0.38,0.39,0.36,0.39,0.40,0.40,0.39,
+0.39,0.40,0.39,0.44,0.41,0.44,0.43,0.43,0.42,0.40,
+0.43,0.42,0.43,0.46,0.45,0.45,0.46,0.46,0.42,0.44,
+0.47,0.44,0.44,0.49,0.44,0.46,0.49,0.47,0.48,0.49,
+0.53,0.50,0.50,0.51,0.52,0.47,0.50,0.48,0.54,0.49,
+0.51,0.51,0.47,0.48,0.53,0.51,0.53,0.53,0.53,0.52,
+0.52,0.51,0.53,0.56,0.56,0.55,0.58,0.54,0.56,0.60,
+0.57,0.59,0.59,0.59,0.56,0.55,0.59,0.56,0.57,0.58,
+0.58,0.55,0.58,0.60,0.59,0.62,0.60,0.60,0.61,0.62,
+0.62,0.62,0.61,0.60,0.61,0.58,0.60,0.59,0.62,0.64,
+0.61,0.65,0.63,0.64,0.62,0.61,0.63,0.64,0.70,0.63,
+0.69,0.66,0.67,0.66,0.66,0.66,0.65,0.69,0.70,0.62,
+0.65,0.70,0.69,0.64,0.72,0.65,0.68,0.74,0.69,0.67,
+0.67,0.72,0.71,0.68,0.71,0.68,0.72,0.73,0.70,0.71,
+0.68,0.71,0.70,0.72,0.69,0.74,0.74,0.72,0.69,0.68,
+0.71,0.73,0.75,0.72,0.70,0.73,0.72,0.75,0.76,0.71,
+0.71,0.74,0.73,0.73,0.73,0.75,0.78,0.70,0.76,0.75,
+0.74,0.74,0.81,0.74,0.78,0.78,0.78,0.76,0.80,0.78,
+0.74,0.78,0.79,0.77,0.79,0.78,0.82,0.83,0.77,0.84,
+0.82,0.79,0.83,0.83,0.80,0.84,0.82,0.78,0.86,0.80,
+0.83,0.81,0.83,0.82,0.80,0.82,0.83,0.80,0.82,0.80,
+0.78,0.84,0.82,0.83,0.80,0.84,0.84,0.85,0.83,0.85,
+0.81,0.81,0.85,0.86,0.85,0.80,0.84,0.85,0.82,0.82,
+0.86,0.86,0.87,0.86,0.81,0.83,0.86,0.86,0.86,0.92,
+0.89,0.86,0.88,0.88,0.93,0.88,0.90,0.87,0.88,0.89,
+0.15,0.13,0.14,0.14,0.19,0.18,0.16,0.20,0.19,0.19,
+0.20,0.20,0.23,0.19,0.18,0.23,0.22,0.25,0.24,0.24,
+0.26,0.23,0.26,0.27,0.24,0.23,0.25,0.27,0.31,0.28,
+0.30,0.29,0.27,0.27,0.26,0.29,0.31,0.28,0.33,0.32,
+0.29,0.28,0.30,0.34,0.34,0.32,0.34,0.31,0.32,0.33,
+0.35,0.37,0.32,0.37,0.31,0.32,0.35,0.37,0.36,0.37,
+0.38,0.36,0.39,0.38,0.40,0.38,0.38,0.34,0.35,0.42,
+0.41,0.41,0.42,0.45,0.41,0.41,0.44,0.43,0.41,0.42,
+0.41,0.41,0.41,0.41,0.44,0.42,0.43,0.43,0.44,0.43,
+0.44,0.44,0.46,0.42,0.43,0.48,0.44,0.42,0.46,0.51,
+0.43,0.45,0.45,0.44,0.50,0.47,0.47,0.44,0.51,0.48,
+0.49,0.49,0.51,0.48,0.50,0.48,0.50,0.51,0.49,0.51,
+0.50,0.49,0.53,0.48,0.52,0.48,0.50,0.52,0.51,0.52,
+0.48,0.48,0.55,0.52,0.53,0.52,0.54,0.54,0.54,0.51,
+0.55,0.56,0.55,0.53,0.53,0.58,0.55,0.56,0.58,0.56,
+0.55,0.56,0.52,0.57,0.57,0.55,0.60,0.59,0.56,0.62,
+0.58,0.60,0.58,0.58,0.54,0.57,0.59,0.60,0.57,0.59,
+0.61,0.57,0.59,0.58,0.60,0.60,0.64,0.61,0.58,0.62,
+0.63,0.62,0.61,0.61,0.62,0.58,0.60,0.60,0.64,0.65,
+0.65,0.62,0.63,0.65,0.66,0.64,0.60,0.61,0.63,0.65,
+0.63,0.64,0.64,0.65,0.66,0.68,0.69,0.68,0.66,0.65,
+0.68,0.66,0.64,0.65,0.63,0.68,0.67,0.68,0.67,0.66,
+0.68,0.68,0.68,0.66,0.67,0.70,0.70,0.66,0.75,0.70,
+0.71,0.65,0.66,0.66,0.67,0.69,0.67,0.69,0.73,0.70,
+0.72,0.68,0.73,0.71,0.70,0.69,0.70,0.73,0.72,0.69,
+0.75,0.72,0.69,0.71,0.69,0.72,0.73,0.72,0.72,0.71,
+0.73,0.70,0.71,0.68,0.74,0.78,0.75,0.70,0.69,0.77,
+0.76,0.75,0.72,0.73,0.71,0.75,0.78,0.78,0.77,0.73,
+0.75,0.73,0.73,0.74,0.75,0.76,0.80,0.76,0.76,0.77,
+1.04,1.06,1.13,1.19,1.24,1.26,1.26,1.36,1.40,1.46,
+1.47,1.51,1.55,1.60,1.65,1.66,1.64,1.66,1.69,1.82,
+1.78,1.81,1.84,1.92,1.93,1.92,1.96,1.96,1.98,2.06,
+2.04,2.15,2.15,2.08,2.15,2.23,2.32,2.11,2.23,2.35,
+2.34,2.29,2.23,2.36,2.40,2.37,2.39,2.46,2.46,2.40,
+2.62,2.61,2.58,2.52,2.65,2.59,2.57,2.66,2.73,2.69,
+2.76,2.68,2.77,2.78,2.97,2.80,2.86,2.83,2.89,2.96,
+2.88,2.88,3.06,2.86,3.12,2.97,3.05,2.93,3.08,3.09,
+3.10,3.10,3.06,3.03,3.12,3.08,3.14,3.38,3.23,3.23,
+3.36,3.34,3.24,3.34,3.41,3.37,3.37,3.34,3.23,3.35,
+3.44,3.43,3.57,3.44,3.44,3.49,3.53,3.53,3.58,3.43,
+3.52,3.47,3.44,3.57,3.67,3.67,3.65,3.70,3.74,3.73,
+3.70,3.70,3.77,3.84,3.86,3.91,3.86,3.69,3.92,3.88,
+3.93,3.66,3.89,4.05,3.84,3.96,3.86,4.00,3.87,4.05,
+4.01,4.15,4.00,3.95,4.11,4.02,4.07,4.01,4.11,3.92,
+4.14,4.10,4.16,4.06,4.15,4.11,4.17,4.22,4.10,4.39,
+4.07,4.19,4.35,4.24,4.27,4.28,4.15,4.34,4.25,4.25,
+4.43,4.47,4.36,4.51,4.43,4.47,4.41,4.51,4.59,4.52,
+4.41,4.38,4.60,4.33,4.47,4.48,4.59,4.46,4.41,4.46,
+4.67,4.55,4.57,4.72,4.79,4.65,4.56,4.89,4.68,4.80,
+4.75,4.93,4.61,4.61,4.67,4.67,4.80,4.94,4.94,4.92,
+4.69,4.66,4.68,5.15,4.82,4.83,4.93,5.12,4.96,4.91,
+5.07,5.11,5.06,4.91,5.00,4.96,5.08,4.85,5.05,5.33,
+5.08,4.82,5.27,5.01,4.96,5.15,5.04,5.07,5.09,4.95,
+5.15,5.04,5.19,5.02,5.20,5.43,5.20,5.39,5.10,5.35,
+5.40,5.32,5.01,5.18,5.41,5.35,5.21,5.29,5.55,5.30,
+5.20,5.38,5.36,5.34,5.37,5.20,5.34,5.16,5.36,5.53,
+5.28,5.29,5.29,5.52,5.62,5.36,5.64,5.57,5.46,5.65,
+5.24,5.74,5.37,5.73,5.70,5.40,5.50,5.56,5.73,5.67,
+0.93,0.97,1.06,1.07,1.12,1.13,1.21,1.19,1.25,1.28,
+1.28,1.33,1.42,1.41,1.41,1.41,1.46,1.59,1.57,1.55,
+1.63,1.60,1.61,1.62,1.72,1.71,1.76,1.72,1.84,1.82,
+1.90,1.95,1.92,1.90,1.93,2.08,1.91,2.01,2.06,2.05,
+2.07,2.00,2.14,2.08,2.18,2.18,2.23,2.22,2.34,2.21,
+2.29,2.33,2.30,2.30,2.34,2.43,2.43,2.21,2.31,2.43,
+2.36,2.48,2.41,2.43,2.44,2.55,2.58,2.65,2.65,2.57,
+2.58,2.61,2.59,2.50,2.62,2.71,2.81,2.80,2.65,2.76,
+2.78,2.82,2.69,2.82,2.89,2.89,2.77,2.88,2.98,3.00,
+2.86,3.07,2.94,2.92,2.94,3.06,3.04,3.08,2.92,2.99,
+3.07,2.90,3.04,3.02,3.20,3.13,3.13,3.25,3.19,3.20,
+3.12,3.32,3.31,3.12,3.20,3.25,3.23,3.26,3.33,3.24,
+3.32,3.44,3.37,3.42,3.42,3.42,3.51,3.33,3.50,3.45,
+3.45,3.47,3.32,3.51,3.54,3.54,3.59,3.44,3.68,3.59,
+3.58,3.62,3.61,3.59,3.57,3.57,3.59,3.68,3.63,3.61,
+3.73,3.72,3.73,3.57,3.70,3.81,3.81,3.72,3.69,3.69,
+3.74,3.82,3.76,3.81,3.74,3.79,3.87,3.74,3.88,3.88,
+4.08,3.94,3.90,3.86,4.10,3.92,4.02,4.13,3.93,4.00,
+3.98,4.09,3.95,3.97,3.99,4.06,4.17,4.12,4.08,4.08,
+4.18,4.02,4.09,4.23,4.33,4.26,4.15,4.25,4.23,4.32,
+4.12,4.12,4.21,4.32,4.28,4.35,4.40,4.26,4.18,4.30,
+4.31,4.28,4.28,4.34,4.44,4.47,4.33,4.32,4.40,4.48,
+4.29,4.48,4.32,4.44,4.42,4.38,4.58,4.69,4.51,4.35,
+4.34,4.58,4.44,4.41,4.57,4.57,4.51,4.55,4.62,4.65,
+4.62,4.54,4.53,4.58,4.77,4.69,4.66,4.62,4.78,4.66,
+4.71,4.53,4.75,4.93,4.66,4.74,4.60,4.77,4.79,4.83,
+4.91,4.84,5.02,4.86,4.89,4.78,4.68,4.85,4.90,5.03,
+4.83,5.06,4.94,4.94,4.87,4.87,4.98,5.03,5.08,5.06,
+4.94,5.00,4.97,5.01,4.95,5.08,4.88,4.97,4.92,4.86,
+0.84,0.87,0.92,0.95,0.97,0.98,1.01,1.08,1.14,1.15,
+1.19,1.19,1.26,1.27,1.28,1.30,1.30,1.37,1.34,1.40,
+1.46,1.43,1.53,1.50,1.50,1.56,1.52,1.59,1.66,1.64,
+1.65,1.67,1.71,1.77,1.76,1.71,1.72,1.76,1.78,1.82,
+1.83,1.84,1.89,1.86,1.91,1.90,1.99,1.97,2.03,1.97,
+2.08,2.05,1.99,2.16,2.08,2.04,2.15,2.12,2.08,2.21,
+2.15,2.26,2.22,2.21,2.21,2.24,2.30,2.28,2.28,2.34,
+2.31,2.29,2.50,2.35,2.27,2.39,2.41,2.34,2.49,2.40,
+2.47,2.35,2.44,2.47,2.47,2.59,2.63,2.58,2.64,2.57,
+2.60,2.72,2.61,2.65,2.65,2.80,2.61,2.79,2.68,2.70,
+2.70,2.64,2.78,2.63,2.79,2.85,2.92,2.79,2.79,2.77,
+2.76,2.75,2.83,2.80,2.94,2.89,2.92,2.96,2.93,2.96,
+2.94,3.01,3.09,3.03,3.04,3.02,3.11,3.10,3.00,2.95,
+3.06,2.99,3.03,3.09,3.21,3.14,3.12,3.05,3.30,3.08,
+3.05,3.16,3.26,3.22,3.23,3.20,3.27,3.34,3.28,3.20,
+3.19,3.27,3.40,3.35,3.30,3.47,3.20,3.27,3.28,3.35,
+3.42,3.21,3.26,3.41,3.30,3.32,3.42,3.41,3.44,3.51,
+3.50,3.59,3.47,3.54,3.54,3.53,3.49,3.64,3.69,3.57,
+3.64,3.55,3.70,3.57,3.58,3.53,3.66,3.66,3.67,3.76,
+3.68,3.55,3.54,3.62,3.71,3.80,3.75,3.78,3.78,3.89,
+3.63,3.67,3.63,3.72,3.80,3.76,3.85,3.87,3.61,3.85,
+3.86,3.82,3.83,3.87,3.86,3.90,3.94,3.79,3.95,3.96,
+3.97,3.88,4.24,3.94,3.99,4.01,3.81,3.87,4.06,3.88,
+4.12,3.93,4.00,3.88,4.04,4.04,4.21,4.22,4.12,4.00,
+4.11,4.08,4.08,4.02,4.19,4.27,4.15,4.11,4.32,4.26,
+4.41,4.16,4.20,4.22,4.24,4.36,4.22,4.12,4.18,4.25,
+4.29,4.44,4.41,4.28,4.34,4.12,4.32,4.27,4.41,4.47,
+4.29,4.35,4.39,4.30,4.43,4.24,4.41,4.29,4.27,4.44,
+4.50,4.61,4.20,4.41,4.34,4.37,4.54,4.55,4.50,4.54,
+0.75,0.80,0.82,0.81,0.87,0.91,0.96,0.93,0.96,1.02,
+1.05,1.06,1.09,1.07,1.15,1.23,1.16,1.21,1.24,1.26,
+1.32,1.31,1.26,1.33,1.35,1.43,1.42,1.44,1.39,1.47,
+1.45,1.52,1.50,1.57,1.52,1.53,1.58,1.61,1.59,1.59,
+1.61,1.66,1.68,1.70,1.69,1.78,1.69,1.79,1.75,1.76,
+1.78,1.82,1.82,1.87,1.83,1.89,1.91,1.94,1.92,1.95,
+1.94,1.90,2.00,1.96,2.04,2.07,2.07,2.04,2.05,2.12,
+2.06,2.07,2.06,2.09,2.13,2.17,2.24,2.20,2.19,2.15,
+2.14,2.22,2.17,2.24,2.20,2.25,2.25,2.28,2.29,2.31,
+2.33,2.34,2.31,2.37,2.36,2.29,2.32,2.34,2.41,2.43,
+2.40,2.39,2.42,2.43,2.48,2.47,2.49,2.47,2.52,2.63,
+2.52,2.63,2.60,2.48,2.57,2.62,2.50,2.58,2.57,2.56,
+2.60,2.63,2.58,2.59,2.60,2.68,2.65,2.64,2.79,2.81,
+2.86,2.83,2.76,2.72,2.71,2.68,2.82,2.75,2.80,2.85,
+2.86,2.85,2.80,2.90,2.73,2.78,2.78,2.79,2.97,2.83,
+2.80,2.86,2.91,2.79,2.95,2.97,2.96,2.88,2.91,3.04,
+2.98,3.13,3.10,3.04,2.96,3.08,3.05,3.01,3.07,3.12,
+3.03,3.08,2.96,3.18,3.17,3.13,3.13,3.15,3.10,3.14,
+3.16,3.29,3.30,3.20,3.08,3.11,3.18,3.24,3.29,3.32,
+3.37,3.20,3.31,3.41,3.16,3.28,3.42,3.38,3.29,3.34,
+3.41,3.46,3.32,3.44,3.32,3.37,3.35,3.46,3.37,3.38,
+3.41,3.39,3.35,3.50,3.34,3.40,3.56,3.37,3.40,3.42,
+3.56,3.58,3.53,3.69,3.57,3.65,3.39,3.67,3.68,3.55,
+3.37,3.49,3.63,3.50,3.40,3.68,3.58,3.58,3.61,3.62,
+3.81,3.71,3.61,3.76,3.71,3.63,3.79,3.73,3.51,3.69,
+3.66,3.85,3.92,3.66,3.57,3.86,3.85,3.84,3.69,3.77,
+3.79,3.72,3.84,3.76,3.71,3.70,3.91,3.83,3.79,3.74,
+3.91,3.85,3.91,4.07,3.88,3.89,3.91,3.87,3.94,3.93,
+3.78,3.84,3.96,3.95,4.01,3.84,3.90,3.85,4.00,4.09,
+0.66,0.67,0.70,0.74,0.81,0.79,0.78,0.84,0.86,0.91,
+0.89,0.95,0.96,0.96,1.01,1.01,1.00,1.05,1.08,1.11,
+1.12,1.14,1.19,1.20,1.16,1.24,1.21,1.23,1.29,1.22,
+1.27,1.32,1.31,1.33,1.37,1.40,1.35,1.41,1.41,1.50,
+1.45,1.47,1.52,1.50,1.53,1.53,1.59,1.55,1.54,1.57,
+1.62,1.58,1.60,1.67,1.65,1.56,1.63,1.68,1.68,1.72,
+1.68,1.66,1.76,1.76,1.77,1.72,1.80,1.70,1.76,1.83,
+1.83,1.82,1.89,1.82,1.93,1.92,1.80,1.91,1.88,1.98,
+1.88,1.95,1.92,2.00,1.90,1.96,2.04,2.02,2.03,1.99,
+2.06,2.05,2.11,2.05,2.17,2.02,2.10,2.10,2.14,2.04,
+2.09,2.12,2.19,2.12,2.17,2.26,2.28,2.16,2.24,2.28,
+2.21,2.16,2.20,2.30,2.23,2.27,2.28,2.31,2.28,2.42,
+2.32,2.39,2.34,2.30,2.33,2.28,2.30,2.41,2.42,2.41,
+2.42,2.38,2.46,2.36,2.28,2.41,2.40,2.51,2.34,2.51,
+2.46,2.53,2.58,2.50,2.53,2.58,2.53,2.60,2.45,2.57,
+2.53,2.52,2.62,2.64,2.49,2.60,2.56,2.50,2.58,2.68,
+2.49,2.59,2.47,2.72,2.76,2.69,2.59,2.68,2.71,2.56,
+2.78,2.62,2.66,2.71,2.74,2.73,2.72,2.83,2.82,2.64,
+2.77,2.82,2.88,2.79,2.77,2.79,2.85,2.83,2.87,2.84,
+2.89,2.80,2.85,2.86,2.90,2.97,3.04,2.98,2.91,3.03,
+2.92,2.94,3.06,3.02,2.91,2.99,2.99,2.96,2.97,2.91,
+2.99,2.92,3.01,2.87,2.99,2.95,2.99,2.94,3.04,3.01,
+3.11,3.08,3.16,3.11,3.21,2.91,3.26,3.19,3.10,3.17,
+3.23,3.04,3.20,3.15,3.22,3.20,3.25,3.16,3.14,3.21,
+3.23,3.10,3.19,3.32,3.18,3.35,3.27,3.19,3.20,3.15,
+3.39,3.26,3.20,3.38,3.26,3.25,3.22,3.36,3.31,3.53,
+3.37,3.23,3.28,3.44,3.42,3.30,3.37,3.46,3.40,3.39,
+3.39,3.30,3.28,3.45,3.40,3.35,3.42,3.44,3.39,3.45,
+3.35,3.40,3.25,3.45,3.41,3.49,3.53,3.53,3.51,3.75,
+0.57,0.61,0.63,0.66,0.65,0.72,0.75,0.73,0.75,0.79,
+0.83,0.82,0.85,0.86,0.85,0.88,0.86,0.95,0.93,1.00,
+0.96,0.99,1.01,1.03,1.07,1.05,1.07,1.07,1.06,1.14,
+1.17,1.20,1.15,1.20,1.17,1.23,1.21,1.20,1.20,1.25,
+1.27,1.29,1.26,1.28,1.28,1.28,1.36,1.35,1.32,1.36,
+1.39,1.41,1.45,1.40,1.44,1.44,1.46,1.38,1.48,1.49,
+1.46,1.54,1.50,1.59,1.57,1.53,1.51,1.62,1.62,1.54,
+1.53,1.52,1.59,1.56,1.66,1.68,1.60,1.72,1.66,1.70,
+1.73,1.67,1.68,1.68,1.71,1.68,1.72,1.71,1.72,1.77,
+1.78,1.71,1.78,1.82,1.80,1.79,1.81,1.85,1.77,1.84,
+1.84,1.87,1.83,1.91,1.95,1.90,1.86,1.93,1.89,1.93,
+1.95,1.96,2.01,1.98,1.96,1.99,2.02,1.99,2.02,2.03,
+2.02,2.02,2.07,2.03,2.10,2.08,2.02,2.00,2.01,2.09,
+2.10,2.13,2.10,2.12,2.13,2.18,2.14,2.17,2.19,2.21,
+2.15,2.26,2.25,2.20,2.23,2.19,2.24,2.15,2.27,2.25,
+2.18,2.25,2.17,2.24,2.33,2.30,2.28,2.24,2.31,2.38,
+2.22,2.26,2.38,2.25,2.40,2.26,2.36,2.31,2.42,2.43,
+2.27,2.41,2.37,2.43,2.44,2.44,2.41,2.46,2.42,2.47,
+2.48,2.46,2.54,2.47,2.52,2.56,2.53,2.47,2.47,2.57,
+2.53,2.57,2.60,2.50,2.48,2.54,2.55,2.62,2.58,2.50,
+2.57,2.62,2.66,2.56,2.68,2.49,2.55,2.58,2.73,2.70,
+2.64,2.64,2.74,2.67,2.64,2.70,2.68,2.76,2.71,2.60,
+2.73,2.76,2.71,2.69,2.78,2.70,2.76,2.77,2.74,2.76,
+2.86,2.83,2.82,2.85,2.63,2.70,2.73,2.92,2.84,2.85,
+2.90,2.82,2.86,2.84,2.87,2.74,2.79,2.87,2.88,2.83,
+2.90,2.82,2.97,2.97,2.89,3.01,2.90,2.89,2.90,2.93,
+2.89,2.93,3.05,2.96,2.97,3.06,2.93,2.92,3.01,2.88,
+2.92,2.91,2.89,3.03,2.98,2.98,2.97,3.14,2.91,2.84,
+2.97,3.12,2.99,3.13,3.03,3.03,3.18,3.00,3.16,2.92,
+0.49,0.51,0.57,0.55,0.63,0.64,0.61,0.68,0.66,0.69,
+0.69,0.72,0.70,0.76,0.77,0.76,0.79,0.81,0.82,0.85,
+0.81,0.89,0.90,0.82,0.94,0.96,0.95,0.95,0.97,1.00,
+0.97,1.00,1.05,0.98,1.00,1.03,1.05,1.11,1.07,1.06,
+1.11,1.13,1.08,1.16,1.11,1.13,1.16,1.18,1.13,1.16,
+1.21,1.19,1.31,1.29,1.25,1.27,1.31,1.29,1.33,1.24,
+1.33,1.25,1.37,1.31,1.40,1.35,1.37,1.35,1.37,1.40,
+1.39,1.44,1.38,1.39,1.44,1.43,1.48,1.51,1.48,1.53,
+1.49,1.44,1.52,1.53,1.56,1.50,1.55,1.59,1.52,1.56,
+1.57,1.55,1.59,1.55,1.57,1.57,1.58,1.57,1.61,1.66,
+1.64,1.61,1.63,1.62,1.66,1.73,1.67,1.79,1.65,1.71,
+1.69,1.76,1.80,1.78,1.73,1.78,1.70,1.79,1.82,1.74,
+1.84,1.81,1.82,1.78,1.82,1.78,1.78,1.76,1.83,1.85,
+1.86,1.90,1.89,1.92,1.86,1.96,1.85,1.93,1.91,1.90,
+1.87,1.94,1.98,1.92,1.95,1.92,1.94,1.92,1.93,2.08,
+2.01,2.10,1.95,1.99,2.07,2.00,2.06,2.04,2.09,1.93,
+2.06,2.11,2.06,2.04,2.07,2.06,2.07,2.09,2.05,2.09,
+2.06,2.02,2.04,2.09,2.12,2.10,2.14,2.19,2.15,2.06,
+2.14,2.08,2.13,2.15,2.21,2.06,2.20,2.24,2.13,2.19,
+2.16,2.13,2.29,2.35,2.26,2.20,2.23,2.20,2.19,2.22,
+2.27,2.30,2.20,2.26,2.37,2.24,2.31,2.34,2.11,2.20,
+2.41,2.22,2.22,2.36,2.30,2.34,2.33,2.32,2.31,2.34,
+2.46,2.31,2.47,2.34,2.35,2.43,2.36,2.38,2.32,2.50,
+2.38,2.43,2.45,2.45,2.45,2.41,2.42,2.40,2.47,2.47,
+2.43,2.61,2.51,2.40,2.53,2.47,2.48,2.49,2.53,2.57,
+2.47,2.52,2.53,2.53,2.50,2.56,2.56,2.50,2.58,2.62,
+2.55,2.57,2.54,2.54,2.60,2.62,2.56,2.53,2.55,2.62,
+2.71,2.61,2.61,2.63,2.57,2.54,2.62,2.61,2.57,2.78,
+2.59,2.74,2.72,2.61,2.72,2.69,2.65,2.74,2.62,2.71,
+0.45,0.46,0.50,0.48,0.50,0.54,0.56,0.56,0.58,0.59,
+0.65,0.66,0.61,0.64,0.65,0.70,0.71,0.74,0.74,0.74,
+0.77,0.76,0.79,0.76,0.78,0.84,0.77,0.81,0.83,0.87,
+0.89,0.86,0.91,0.89,0.86,0.87,0.88,0.95,0.91,0.96,
+0.98,1.02,1.03,0.98,0.98,0.98,1.03,1.04,1.03,1.01,
+1.08,1.03,1.04,1.09,1.08,1.12,1.12,1.14,1.11,1.19,
+1.12,1.13,1.13,1.14,1.15,1.22,1.19,1.17,1.18,1.24,
+1.19,1.24,1.22,1.30,1.21,1.27,1.25,1.25,1.29,1.30,
+1.31,1.30,1.30,1.37,1.30,1.39,1.31,1.34,1.31,1.27,
+1.37,1.37,1.39,1.42,1.37,1.35,1.37,1.40,1.41,1.43,
+1.39,1.40,1.37,1.51,1.51,1.45,1.48,1.44,1.50,1.50,
+1.49,1.49,1.54,1.52,1.55,1.52,1.53,1.57,1.56,1.52,
+1.55,1.57,1.54,1.49,1.52,1.59,1.56,1.63,1.69,1.62,
+1.69,1.66,1.63,1.61,1.61,1.72,1.67,1.64,1.62,1.61,
+1.69,1.70,1.67,1.71,1.67,1.64,1.76,1.65,1.67,1.73,
+1.71,1.73,1.68,1.73,1.81,1.77,1.77,1.79,1.83,1.74,
+1.79,1.75,1.76,1.79,1.82,1.87,1.74,1.79,1.81,1.76,
+1.82,1.90,1.82,1.82,1.85,1.85,1.81,1.88,1.86,1.88,
+1.87,1.92,1.94,1.95,1.94,1.97,1.96,2.04,1.88,1.95,
+1.90,1.90,1.92,1.93,1.97,1.92,1.92,1.97,1.93,1.93,
+1.96,2.03,1.98,2.00,1.98,2.02,1.99,1.92,2.02,2.03,
+2.03,1.96,2.00,2.06,2.03,2.06,2.02,2.12,2.06,2.03,
+1.98,2.06,2.08,2.01,2.13,2.11,2.14,2.03,2.13,2.14,
+2.08,2.21,2.13,2.18,2.22,2.17,2.11,2.10,2.09,2.16,
+2.14,2.13,2.11,2.31,2.15,2.16,2.16,2.19,2.27,2.14,
+2.23,2.18,2.21,2.28,2.24,2.15,2.12,2.19,2.19,2.17,
+2.22,2.23,2.37,2.22,2.28,2.23,2.20,2.18,2.31,2.28,
+2.14,2.19,2.34,2.30,2.32,2.34,2.30,2.32,2.30,2.32,
+2.33,2.32,2.33,2.45,2.31,2.36,2.34,2.37,2.39,2.44,
+0.39,0.40,0.42,0.46,0.46,0.47,0.51,0.50,0.53,0.51,
+0.53,0.55,0.56,0.58,0.58,0.59,0.62,0.63,0.63,0.66,
+0.67,0.71,0.69,0.65,0.65,0.73,0.71,0.71,0.75,0.74,
+0.78,0.75,0.75,0.78,0.79,0.78,0.81,0.81,0.77,0.84,
+0.83,0.89,0.85,0.86,0.95,0.81,0.91,0.87,0.94,0.95,
+0.91,0.93,0.98,0.96,0.91,0.96,0.95,0.95,0.98,0.99,
+0.98,1.02,0.99,0.99,1.00,1.06,1.04,1.04,1.04,1.04,
+1.07,1.06,1.11,1.08,1.07,1.11,1.10,1.08,1.13,1.11,
+1.15,1.13,1.19,1.18,1.15,1.19,1.17,1.22,1.18,1.15,
+1.21,1.18,1.16,1.18,1.21,1.26,1.25,1.22,1.17,1.26,
+1.23,1.24,1.28,1.29,1.27,1.22,1.22,1.27,1.28,1.22,
+1.28,1.28,1.32,1.34,1.40,1.34,1.29,1.35,1.33,1.29,
+1.34,1.32,1.42,1.43,1.32,1.38,1.42,1.42,1.40,1.42,
+1.38,1.41,1.42,1.36,1.41,1.47,1.40,1.43,1.48,1.45,
+1.45,1.49,1.42,1.48,1.44,1.49,1.50,1.53,1.56,1.52,
+1.52,1.50,1.50,1.56,1.53,1.56,1.56,1.51,1.61,1.50,
+1.51,1.54,1.57,1.55,1.59,1.60,1.58,1.51,1.67,1.62,
+1.55,1.60,1.65,1.59,1.62,1.61,1.63,1.63,1.67,1.62,
+1.65,1.64,1.65,1.62,1.70,1.61,1.62,1.61,1.70,1.71,
+1.73,1.62,1.67,1.63,1.77,1.70,1.63,1.85,1.70,1.71,
+1.67,1.78,1.75,1.72,1.82,1.72,1.83,1.75,1.80,1.79,
+1.77,1.81,1.76,1.75,1.78,1.78,1.77,1.82,1.76,1.78,
+1.79,1.85,1.83,1.81,1.88,1.84,1.82,1.84,1.82,1.85,
+1.87,1.84,1.90,1.89,1.92,1.90,1.89,1.86,1.87,1.82,
+1.92,1.84,1.93,1.91,1.87,1.95,1.92,1.88,1.80,1.94,
+1.97,1.91,1.92,1.97,1.95,2.01,1.92,1.93,1.99,2.04,
+1.93,1.93,1.95,1.94,2.00,1.99,2.01,2.00,1.99,1.94,
+2.10,1.96,1.98,2.01,1.98,1.97,2.06,1.99,2.02,2.03,
+2.02,2.01,2.05,2.00,1.99,2.07,2.05,1.96,1.96,2.09,
+0.32,0.34,0.37,0.38,0.38,0.39,0.43,0.42,0.44,0.48,
+0.48,0.48,0.46,0.50,0.52,0.52,0.54,0.53,0.56,0.56,
+0.58,0.57,0.60,0.59,0.61,0.60,0.59,0.66,0.64,0.62,
+0.68,0.68,0.67,0.72,0.72,0.71,0.72,0.70,0.73,0.71,
+0.75,0.72,0.72,0.78,0.76,0.75,0.78,0.80,0.77,0.82,
+0.84,0.82,0.78,0.84,0.80,0.84,0.85,0.86,0.86,0.84,
+0.84,0.89,0.85,0.88,0.90,0.92,0.85,0.90,0.93,0.91,
+0.93,0.94,0.97,0.95,0.96,0.94,0.94,0.99,0.98,0.97,
+0.93,0.99,1.04,0.99,0.99,1.00,1.00,1.01,1.03,1.01,
+1.02,1.07,1.04,1.08,1.07,1.09,1.07,1.08,1.12,1.12,
+1.12,1.09,1.08,1.11,1.14,1.16,1.13,1.11,1.06,1.16,
+1.13,1.15,1.16,1.13,1.16,1.14,1.13,1.20,1.22,1.19,
+1.17,1.15,1.12,1.20,1.14,1.14,1.21,1.22,1.22,1.18,
+1.22,1.24,1.25,1.26,1.25,1.24,1.27,1.24,1.31,1.25,
+1.30,1.28,1.24,1.31,1.31,1.34,1.35,1.31,1.30,1.26,
+1.33,1.34,1.28,1.31,1.27,1.32,1.37,1.36,1.35,1.39,
+1.32,1.37,1.40,1.38,1.41,1.42,1.36,1.36,1.35,1.39,
+1.42,1.44,1.40,1.44,1.39,1.40,1.39,1.44,1.38,1.42,
+1.42,1.43,1.47,1.43,1.51,1.47,1.41,1.43,1.48,1.37,
+1.50,1.40,1.45,1.48,1.47,1.48,1.48,1.49,1.53,1.54,
+1.48,1.45,1.47,1.52,1.53,1.47,1.49,1.51,1.59,1.53,
+1.51,1.47,1.52,1.50,1.53,1.53,1.49,1.53,1.68,1.55,
+1.53,1.61,1.57,1.61,1.63,1.58,1.58,1.58,1.58,1.57,
+1.60,1.64,1.61,1.65,1.66,1.64,1.58,1.65,1.59,1.69,
+1.65,1.63,1.64,1.65,1.67,1.62,1.70,1.69,1.70,1.70,
+1.63,1.65,1.69,1.73,1.66,1.70,1.67,1.74,1.73,1.72,
+1.75,1.80,1.75,1.70,1.71,1.68,1.66,1.67,1.72,1.67,
+1.76,1.75,1.77,1.76,1.75,1.84,1.74,1.69,1.72,1.79,
+1.71,1.77,1.76,1.83,1.76,1.74,1.74,1.77,1.78,1.80,
+0.28,0.30,0.31,0.33,0.35,0.35,0.39,0.35,0.38,0.42,
+0.41,0.41,0.44,0.41,0.43,0.47,0.45,0.48,0.45,0.53,
+0.52,0.50,0.51,0.51,0.49,0.55,0.52,0.56,0.55,0.54,
+0.55,0.56,0.58,0.56,0.59,0.63,0.66,0.59,0.63,0.64,
+0.61,0.62,0.66,0.61,0.67,0.61,0.67,0.69,0.68,0.68,
+0.67,0.69,0.73,0.76,0.76,0.71,0.75,0.74,0.74,0.72,
+0.79,0.74,0.73,0.79,0.75,0.76,0.78,0.81,0.80,0.82,
+0.85,0.81,0.84,0.80,0.85,0.85,0.85,0.85,0.86,0.83,
+0.88,0.85,0.84,0.84,0.90,0.88,0.86,0.91,0.89,0.89,
+0.91,0.93,0.92,0.90,0.90,0.93,0.91,0.91,0.89,0.97,
+0.90,0.92,1.00,0.94,1.00,1.04,0.94,1.00,1.00,0.99,
+1.01,1.02,1.06,0.99,1.03,1.02,1.06,1.04,1.03,1.02,
+1.03,1.03,1.02,1.04,1.03,1.07,1.03,1.07,1.05,1.05,
+1.04,1.10,1.07,1.09,1.07,1.07,1.05,1.12,1.10,1.13,
+1.07,1.12,1.09,1.13,1.14,1.10,1.08,1.14,1.13,1.11,
+1.16,1.14,1.16,1.11,1.15,1.20,1.15,1.10,1.16,1.14,
+1.19,1.23,1.16,1.17,1.24,1.19,1.22,1.25,1.23,1.21,
+1.15,1.23,1.24,1.24,1.19,1.18,1.19,1.20,1.21,1.22,
+1.20,1.23,1.22,1.18,1.21,1.25,1.25,1.22,1.27,1.29,
+1.29,1.24,1.30,1.23,1.33,1.29,1.32,1.38,1.34,1.29,
+1.33,1.31,1.32,1.37,1.34,1.29,1.35,1.33,1.34,1.39,
+1.39,1.32,1.38,1.34,1.33,1.39,1.37,1.35,1.37,1.37,
+1.30,1.41,1.36,1.35,1.38,1.34,1.39,1.37,1.40,1.39,
+1.40,1.39,1.41,1.41,1.42,1.42,1.43,1.47,1.47,1.47,
+1.39,1.39,1.42,1.41,1.41,1.44,1.43,1.45,1.47,1.47,
+1.48,1.42,1.42,1.47,1.44,1.45,1.54,1.40,1.52,1.50,
+1.47,1.45,1.53,1.44,1.51,1.49,1.48,1.48,1.52,1.43,
+1.53,1.47,1.51,1.50,1.52,1.56,1.56,1.54,1.49,1.49,
+1.54,1.47,1.57,1.62,1.47,1.58,1.53,1.58,1.51,1.56,
+0.28,0.25,0.27,0.30,0.30,0.30,0.31,0.33,0.33,0.37,
+0.35,0.35,0.36,0.38,0.36,0.41,0.39,0.40,0.41,0.43,
+0.42,0.44,0.47,0.46,0.46,0.46,0.46,0.46,0.46,0.49,
+0.47,0.50,0.51,0.55,0.55,0.54,0.51,0.53,0.52,0.54,
+0.50,0.58,0.56,0.55,0.58,0.62,0.56,0.58,0.57,0.60,
+0.59,0.58,0.63,0.64,0.66,0.64,0.65,0.66,0.66,0.65,
+0.69,0.64,0.66,0.69,0.67,0.65,0.66,0.66,0.70,0.73,
+0.71,0.74,0.75,0.72,0.75,0.73,0.71,0.74,0.71,0.76,
+0.77,0.73,0.74,0.80,0.74,0.76,0.76,0.77,0.79,0.75,
+0.77,0.78,0.83,0.81,0.78,0.82,0.80,0.80,0.85,0.79,
+0.85,0.81,0.84,0.84,0.86,0.91,0.84,0.87,0.86,0.83,
+0.84,0.89,0.91,0.85,0.90,0.86,0.91,0.86,0.87,0.87,
+0.94,0.89,0.90,0.91,0.91,0.89,0.92,0.94,0.93,0.91,
+0.92,0.91,0.90,0.93,0.90,0.94,0.95,0.99,0.99,0.92,
+0.93,0.98,0.97,0.92,0.98,0.97,0.97,0.96,0.93,0.99,
+0.99,0.97,0.97,0.96,1.04,0.97,0.98,0.94,1.02,1.00,
+1.01,1.05,1.07,1.05,1.04,0.98,1.03,0.99,1.04,1.06,
+1.03,1.07,1.02,1.01,1.11,1.05,1.07,1.04,1.07,1.10,
+1.11,1.11,1.05,1.12,1.10,1.12,1.11,1.15,1.11,1.10,
+1.17,1.13,1.07,1.11,1.11,1.14,1.13,1.11,1.11,1.14,
+1.15,1.13,1.14,1.14,1.12,1.16,1.17,1.19,1.21,1.13,
+1.13,1.25,1.19,1.15,1.15,1.18,1.17,1.23,1.17,1.16,
+1.13,1.17,1.18,1.18,1.19,1.20,1.21,1.21,1.24,1.25,
+1.22,1.25,1.19,1.25,1.15,1.27,1.24,1.21,1.25,1.26,
+1.26,1.20,1.27,1.23,1.22,1.25,1.26,1.26,1.25,1.26,
+1.27,1.26,1.35,1.29,1.26,1.24,1.25,1.26,1.26,1.29,
+1.28,1.21,1.32,1.25,1.31,1.36,1.32,1.36,1.31,1.28,
+1.33,1.26,1.36,1.30,1.30,1.32,1.29,1.34,1.36,1.29,
+1.34,1.32,1.34,1.32,1.36,1.34,1.34,1.33,1.35,1.35,
+0.22,0.22,0.25,0.23,0.25,0.29,0.30,0.27,0.25,0.31,
+0.29,0.33,0.32,0.32,0.35,0.34,0.32,0.39,0.36,0.40,
+0.41,0.37,0.39,0.36,0.37,0.39,0.41,0.45,0.39,0.43,
+0.41,0.41,0.46,0.45,0.47,0.49,0.46,0.43,0.46,0.45,
+0.44,0.47,0.50,0.49,0.49,0.52,0.54,0.50,0.54,0.51,
+0.51,0.55,0.53,0.50,0.53,0.53,0.59,0.53,0.57,0.59,
+0.59,0.55,0.56,0.60,0.61,0.59,0.57,0.62,0.63,0.64,
+0.64,0.56,0.61,0.60,0.62,0.64,0.60,0.65,0.63,0.64,
+0.65,0.62,0.65,0.66,0.69,0.69,0.68,0.65,0.68,0.64,
+0.71,0.71,0.67,0.73,0.66,0.67,0.73,0.69,0.67,0.72,
+0.72,0.73,0.71,0.73,0.73,0.75,0.71,0.69,0.72,0.76,
+0.72,0.77,0.75,0.73,0.73,0.74,0.77,0.72,0.79,0.78,
+0.76,0.79,0.78,0.85,0.79,0.80,0.78,0.74,0.82,0.77,
+0.80,0.80,0.78,0.84,0.81,0.81,0.83,0.80,0.81,0.81,
+0.79,0.83,0.85,0.83,0.83,0.86,0.85,0.87,0.85,0.87,
+0.89,0.85,0.89,0.86,0.84,0.89,0.91,0.87,0.89,0.88,
+0.87,0.88,0.88,0.92,0.90,0.91,0.89,0.91,0.89,0.93,
+0.92,0.89,0.91,0.93,0.87,0.94,0.91,0.93,0.92,0.95,
+0.93,0.91,0.98,0.97,0.96,0.95,0.93,0.95,0.99,0.98,
+0.92,0.91,0.96,0.96,0.91,0.93,0.96,1.00,1.04,0.95,
+1.01,0.97,1.02,1.00,1.02,1.01,1.00,1.01,0.98,0.99,
+1.00,1.02,1.02,1.03,1.03,1.02,1.04,1.04,1.05,0.99,
+1.03,1.05,1.07,1.05,1.05,1.07,1.03,1.08,1.05,1.00,
+1.06,1.09,1.04,1.10,1.03,1.11,1.05,1.05,1.03,1.06,
+1.05,1.10,1.02,1.09,1.02,1.10,1.12,1.11,1.08,1.05,
+1.09,1.15,1.12,1.07,1.12,1.10,1.11,1.08,1.10,1.13,
+1.12,1.12,1.12,1.11,1.12,1.13,1.18,1.17,1.12,1.11,
+1.16,1.12,1.16,1.11,1.15,1.15,1.12,1.18,1.12,1.11,
+1.15,1.18,1.13,1.17,1.12,1.15,1.17,1.17,1.20,1.24,
+0.18,0.19,0.21,0.22,0.23,0.23,0.28,0.25,0.24,0.27,
+0.27,0.27,0.30,0.29,0.26,0.32,0.29,0.32,0.31,0.30,
+0.34,0.35,0.36,0.35,0.33,0.34,0.35,0.38,0.34,0.37,
+0.37,0.38,0.37,0.36,0.39,0.36,0.42,0.42,0.40,0.41,
+0.42,0.40,0.38,0.42,0.45,0.45,0.44,0.47,0.50,0.47,
+0.47,0.47,0.46,0.47,0.46,0.50,0.47,0.50,0.52,0.51,
+0.50,0.49,0.49,0.50,0.48,0.51,0.52,0.54,0.50,0.51,
+0.53,0.53,0.55,0.52,0.55,0.52,0.58,0.55,0.54,0.54,
+0.55,0.57,0.52,0.60,0.55,0.61,0.58,0.60,0.62,0.59,
+0.61,0.56,0.59,0.62,0.60,0.61,0.62,0.60,0.60,0.63,
+0.64,0.61,0.61,0.62,0.62,0.60,0.63,0.64,0.63,0.63,
+0.66,0.63,0.64,0.63,0.68,0.63,0.64,0.64,0.65,0.64,
+0.67,0.67,0.72,0.69,0.68,0.71,0.68,0.67,0.72,0.70,
+0.70,0.73,0.73,0.71,0.71,0.73,0.74,0.72,0.74,0.73,
+0.68,0.69,0.72,0.72,0.72,0.75,0.73,0.75,0.71,0.74,
+0.74,0.77,0.76,0.73,0.76,0.78,0.81,0.75,0.78,0.80,
+0.77,0.77,0.74,0.77,0.78,0.81,0.75,0.79,0.75,0.82,
+0.78,0.77,0.81,0.80,0.79,0.78,0.83,0.81,0.82,0.82,
+0.82,0.79,0.81,0.86,0.82,0.79,0.84,0.80,0.83,0.83,
+0.84,0.85,0.87,0.82,0.81,0.82,0.84,0.84,0.85,0.88,
+0.80,0.84,0.85,0.91,0.88,0.83,0.85,0.87,0.87,0.89,
+0.91,0.89,0.84,0.84,0.89,0.91,0.90,0.84,0.90,0.91,
+0.90,0.90,0.88,0.89,0.92,0.92,0.90,0.93,0.90,0.84,
+0.89,0.93,0.90,0.93,0.90,0.94,0.97,0.95,0.92,0.95,
+0.99,0.95,0.97,0.92,0.99,0.95,0.94,0.94,0.96,0.97,
+0.97,0.95,0.97,0.97,0.96,0.98,0.96,0.97,0.92,0.96,
+1.00,0.98,0.96,0.96,0.95,1.00,0.96,0.97,0.97,0.96,
+1.00,1.00,0.95,1.02,1.00,1.00,1.02,0.99,1.00,1.02,
+1.03,1.06,1.04,1.02,1.02,1.03,1.02,1.02,1.03,1.05,
+0.16,0.16,0.18,0.18,0.21,0.24,0.21,0.24,0.22,0.25,
+0.21,0.21,0.26,0.24,0.27,0.25,0.25,0.26,0.27,0.27,
+0.27,0.26,0.28,0.28,0.32,0.33,0.32,0.31,0.30,0.30,
+0.32,0.33,0.36,0.34,0.35,0.33,0.34,0.35,0.36,0.36,
+0.35,0.37,0.39,0.38,0.37,0.39,0.39,0.37,0.42,0.41,
+0.38,0.40,0.42,0.38,0.43,0.41,0.45,0.42,0.42,0.43,
+0.40,0.43,0.43,0.44,0.44,0.45,0.47,0.47,0.44,0.47,
+0.44,0.48,0.44,0.47,0.46,0.46,0.47,0.48,0.51,0.49,
+0.47,0.52,0.48,0.49,0.50,0.49,0.53,0.51,0.49,0.52,
+0.48,0.50,0.51,0.47,0.52,0.56,0.53,0.54,0.53,0.55,
+0.56,0.54,0.52,0.50,0.51,0.53,0.56,0.56,0.56,0.58,
+0.58,0.57,0.53,0.57,0.56,0.59,0.57,0.58,0.56,0.55,
+0.61,0.60,0.58,0.57,0.60,0.61,0.65,0.57,0.60,0.59,
+0.58,0.60,0.62,0.60,0.63,0.60,0.64,0.63,0.62,0.62,
+0.64,0.62,0.65,0.63,0.64,0.66,0.65,0.63,0.65,0.66,
+0.67,0.64,0.64,0.68,0.63,0.66,0.64,0.64,0.67,0.65,
+0.68,0.73,0.66,0.68,0.68,0.70,0.69,0.65,0.67,0.69,
+0.63,0.71,0.72,0.68,0.71,0.71,0.71,0.69,0.72,0.72,
+0.71,0.71,0.68,0.73,0.72,0.72,0.76,0.73,0.75,0.72,
+0.77,0.73,0.75,0.73,0.75,0.76,0.76,0.74,0.74,0.77,
+0.75,0.71,0.75,0.74,0.80,0.75,0.75,0.78,0.74,0.74,
+0.76,0.73,0.74,0.79,0.83,0.74,0.76,0.76,0.76,0.78,
+0.77,0.82,0.83,0.80,0.79,0.81,0.76,0.78,0.79,0.80,
+0.80,0.78,0.81,0.78,0.79,0.79,0.78,0.78,0.83,0.81,
+0.83,0.80,0.81,0.84,0.78,0.85,0.85,0.81,0.81,0.83,
+0.82,0.79,0.86,0.83,0.78,0.86,0.81,0.83,0.87,0.82,
+0.86,0.84,0.81,0.87,0.86,0.89,0.88,0.90,0.89,0.86,
+0.85,0.83,0.86,0.85,0.85,0.86,0.89,0.86,0.86,0.86,
+0.85,0.90,0.90,0.83,0.91,0.83,0.86,0.86,0.92,0.89,
+1.07,1.13,1.19,1.25,1.31,1.32,1.39,1.33,1.42,1.49,
+1.50,1.51,1.64,1.60,1.69,1.65,1.72,1.81,1.79,1.84,
+1.84,1.85,1.96,1.91,1.95,1.92,1.97,2.04,2.07,2.13,
+2.10,2.18,2.18,2.15,2.25,2.33,2.31,2.37,2.31,2.32,
+2.32,2.38,2.40,2.35,2.55,2.44,2.56,2.54,2.46,2.62,
+2.61,2.60,2.71,2.66,2.66,2.75,2.89,2.53,2.76,2.77,
+2.85,2.87,2.92,2.90,2.88,2.92,2.91,2.87,2.90,3.02,
+2.98,2.91,2.93,3.14,2.93,3.01,3.11,3.12,3.09,3.14,
+3.22,3.20,3.30,3.28,3.18,3.28,3.21,3.33,3.35,3.22,
+3.25,3.37,3.36,3.36,3.41,3.50,3.42,3.46,3.47,3.33,
+3.54,3.40,3.46,3.54,3.64,3.52,3.64,3.58,3.56,3.51,
+3.68,3.69,3.65,3.75,3.74,3.63,3.82,3.92,3.80,3.80,
+3.68,3.65,3.87,3.81,4.03,3.82,3.79,3.74,3.91,3.94,
+3.93,3.78,4.02,3.90,4.04,4.06,4.14,4.17,4.07,4.05,
+3.96,4.07,4.15,4.15,4.18,4.21,4.25,4.16,4.17,4.16,
+4.13,4.23,4.18,4.25,4.31,4.31,4.19,4.32,4.38,4.53,
+4.48,4.44,4.28,4.43,4.42,4.49,4.48,4.34,4.35,4.63,
+4.71,4.72,4.54,4.36,4.67,4.56,4.62,4.65,4.57,4.42,
+4.63,4.65,4.64,4.62,4.52,4.62,4.54,4.49,4.96,4.79,
+4.63,4.91,4.65,4.81,4.73,4.61,4.73,4.78,4.86,4.54,
+4.86,4.90,4.91,5.24,4.88,4.89,4.86,4.80,4.87,4.95,
+5.07,5.02,4.92,5.04,4.90,5.07,5.08,5.12,4.96,5.07,
+5.01,4.89,5.21,5.11,5.11,4.92,5.17,5.14,5.42,5.36,
+5.12,5.25,5.11,5.34,5.26,5.15,5.08,5.51,5.16,5.18,
+5.11,5.31,5.30,5.11,5.40,5.36,5.34,5.14,5.52,5.44,
+5.14,5.36,5.45,5.48,5.41,5.57,5.50,5.51,5.61,5.27,
+5.40,5.52,5.31,5.32,5.61,5.65,5.35,5.25,5.51,5.53,
+5.42,5.56,5.48,5.65,5.51,5.65,5.60,5.88,5.70,5.54,
+5.39,5.78,5.66,5.50,5.60,5.70,5.64,5.82,5.80,6.01,
+0.96,1.01,1.07,1.12,1.15,1.19,1.22,1.25,1.33,1.33,
+1.38,1.43,1.44,1.41,1.46,1.53,1.56,1.62,1.64,1.66,
+1.69,1.70,1.80,1.76,1.78,1.82,1.81,1.81,1.88,1.93,
+1.93,1.97,1.95,2.05,2.00,2.06,2.09,2.05,2.12,2.12,
+2.14,2.08,2.15,2.24,2.22,2.23,2.20,2.26,2.33,2.31,
+2.30,2.34,2.42,2.38,2.41,2.41,2.52,2.42,2.56,2.42,
+2.58,2.55,2.65,2.56,2.55,2.56,2.62,2.73,2.63,2.70,
+2.68,2.79,2.69,2.75,2.77,2.88,2.86,2.85,3.00,2.88,
+2.78,3.00,2.83,2.87,2.82,2.98,2.91,2.95,2.82,3.01,
+2.88,3.03,3.08,3.16,3.02,3.11,3.10,3.18,3.06,3.28,
+3.19,3.18,3.22,3.33,3.19,3.28,3.25,3.48,3.39,3.31,
+3.27,3.30,3.25,3.32,3.41,3.34,3.39,3.39,3.41,3.48,
+3.50,3.59,3.53,3.53,3.55,3.43,3.70,3.51,3.47,3.57,
+3.56,3.56,3.51,3.63,3.65,3.56,3.62,3.63,3.70,3.72,
+3.55,3.80,3.64,3.63,3.61,3.66,3.78,3.74,3.94,4.03,
+3.96,3.81,3.95,3.85,3.90,3.78,3.88,3.98,3.90,3.97,
+4.02,3.92,3.85,4.10,3.88,3.78,4.03,4.12,3.96,3.97,
+4.19,4.18,4.00,4.15,4.16,3.98,4.27,4.33,4.15,4.19,
+4.30,4.15,4.17,4.12,4.35,4.14,4.29,4.23,4.41,4.43,
+4.21,4.31,4.40,4.23,4.34,4.33,4.27,4.22,4.16,4.42,
+4.43,4.42,4.32,4.51,4.41,4.57,4.44,4.61,4.43,4.49,
+4.40,4.52,4.47,4.66,4.46,4.54,4.65,4.67,4.51,4.71,
+4.79,4.73,4.56,4.63,4.56,4.69,4.77,4.68,4.59,4.56,
+4.80,4.65,4.75,4.83,4.76,4.62,4.67,4.88,4.95,4.93,
+4.60,4.87,4.92,4.87,4.96,5.08,4.83,4.69,4.67,5.11,
+4.96,4.72,4.78,4.82,4.91,4.98,4.92,4.83,5.00,5.06,
+5.10,5.07,4.94,4.94,4.97,5.05,4.93,5.04,5.06,5.02,
+5.04,4.89,5.12,5.12,5.23,5.18,5.19,4.97,5.05,5.04,
+5.22,5.19,5.05,5.12,5.32,5.26,5.15,5.29,5.11,5.34,
+0.84,0.93,0.91,0.99,1.07,1.08,1.14,1.07,1.12,1.25,
+1.19,1.26,1.37,1.30,1.29,1.33,1.40,1.41,1.47,1.49,
+1.44,1.55,1.53,1.57,1.67,1.63,1.62,1.67,1.70,1.67,
+1.74,1.79,1.85,1.85,1.82,1.82,1.80,1.85,1.86,1.89,
+1.82,1.94,1.93,1.98,2.02,2.02,2.01,2.03,2.08,2.09,
+2.09,2.04,2.21,2.22,2.19,2.27,2.26,2.22,2.33,2.23,
+2.25,2.36,2.38,2.24,2.36,2.33,2.50,2.40,2.42,2.44,
+2.40,2.48,2.50,2.51,2.49,2.52,2.52,2.63,2.55,2.34,
+2.67,2.64,2.47,2.58,2.68,2.61,2.60,2.60,2.74,2.75,
+2.81,2.66,2.83,2.79,2.73,2.78,2.77,2.83,2.88,2.89,
+2.95,2.91,2.81,2.83,2.94,2.89,2.91,2.95,2.82,3.04,
+3.07,2.88,3.06,2.96,2.92,2.94,2.98,3.05,3.08,3.06,
+3.18,3.15,3.13,3.03,3.15,3.14,3.26,3.32,3.19,3.24,
+3.24,3.17,3.28,3.25,3.36,3.18,3.29,3.40,3.24,3.46,
+3.21,3.38,3.29,3.32,3.38,3.39,3.42,3.24,3.34,3.44,
+3.45,3.36,3.42,3.44,3.59,3.55,3.51,3.56,3.51,3.52,
+3.50,3.52,3.65,3.60,3.61,3.72,3.62,3.52,3.69,3.63,
+3.76,3.61,3.58,3.67,3.67,3.55,3.63,3.76,3.68,3.77,
+3.80,3.78,3.82,3.80,3.95,3.92,3.90,3.95,3.78,3.86,
+3.80,3.93,3.93,3.98,3.83,3.83,4.08,4.04,3.80,3.84,
+3.88,4.03,4.05,3.89,4.11,4.13,3.99,4.07,3.97,3.93,
+3.91,4.15,3.98,4.17,4.05,4.15,4.23,4.20,3.93,4.19,
+4.09,4.03,4.08,4.07,4.22,4.31,4.19,4.14,4.15,4.25,
+4.22,4.36,4.11,4.24,4.13,4.24,3.98,4.13,4.17,4.32,
+4.29,4.28,4.33,4.46,4.46,4.38,4.49,4.17,4.56,4.47,
+4.35,4.50,4.55,4.35,4.47,4.39,4.32,4.26,4.36,4.56,
+4.56,4.48,4.41,4.47,4.56,4.50,4.60,4.47,4.62,4.52,
+4.50,4.56,4.67,4.54,4.76,4.43,4.67,4.58,4.60,4.70,
+4.78,4.72,4.62,4.60,4.50,4.76,4.48,4.66,4.58,4.72,
+0.80,0.83,0.85,0.84,0.93,0.93,0.98,0.99,1.01,1.05,
+1.07,1.12,1.16,1.19,1.19,1.22,1.23,1.27,1.27,1.35,
+1.38,1.41,1.39,1.39,1.40,1.43,1.44,1.54,1.49,1.59,
+1.49,1.52,1.60,1.62,1.57,1.58,1.62,1.64,1.68,1.70,
+1.75,1.72,1.77,1.73,1.77,1.78,1.80,1.83,1.81,1.86,
+1.90,1.93,1.97,1.87,1.93,1.98,2.03,2.00,2.00,1.94,
+2.03,2.03,2.04,2.06,2.12,2.22,2.19,2.12,2.18,2.18,
+2.07,2.16,2.23,2.20,2.21,2.24,2.14,2.29,2.26,2.28,
+2.25,2.33,2.28,2.36,2.39,2.42,2.35,2.43,2.40,2.44,
+2.36,2.54,2.50,2.54,2.45,2.40,2.46,2.54,2.50,2.55,
+2.45,2.56,2.63,2.62,2.49,2.60,2.55,2.64,2.70,2.68,
+2.60,2.69,2.61,2.67,2.64,2.69,2.72,2.65,2.75,2.80,
+2.62,2.78,2.75,2.75,2.97,2.94,2.84,2.86,2.93,2.85,
+2.87,2.83,2.86,2.85,2.94,2.85,2.85,2.85,2.84,2.98,
+2.95,2.89,3.04,3.05,2.93,2.96,3.04,2.95,3.04,3.08,
+3.04,3.13,3.05,3.15,3.06,3.12,3.20,3.08,3.09,3.23,
+3.10,3.15,3.15,3.07,3.18,3.20,3.28,3.18,3.26,3.31,
+3.38,3.28,3.21,3.32,3.30,3.35,3.37,3.25,3.40,3.44,
+3.23,3.26,3.34,3.45,3.38,3.36,3.49,3.50,3.47,3.46,
+3.38,3.43,3.47,3.42,3.53,3.51,3.41,3.46,3.37,3.41,
+3.55,3.36,3.52,3.62,3.65,3.48,3.62,3.56,3.60,3.50,
+3.73,3.52,3.57,3.76,3.59,3.70,3.48,3.65,3.60,3.84,
+3.52,3.62,3.78,3.83,3.75,3.69,3.86,3.68,3.74,3.78,
+3.73,3.77,3.73,3.89,3.74,3.82,3.90,3.89,3.75,3.92,
+3.79,3.92,3.59,4.04,3.75,3.89,3.88,3.85,3.88,3.85,
+3.83,4.01,4.01,4.01,4.04,3.88,3.96,3.81,3.83,3.98,
+3.87,3.86,4.14,4.07,3.90,4.14,4.08,4.12,4.07,4.03,
+4.19,4.15,4.06,3.98,4.03,4.04,4.07,4.05,4.16,4.09,
+4.09,4.20,4.34,4.01,4.16,4.23,4.17,4.23,4.46,4.13,
+0.67,0.74,0.74,0.79,0.81,0.86,0.83,0.90,0.98,0.99,
+0.93,1.05,1.01,1.01,1.07,1.07,1.09,1.12,1.13,1.15,
+1.19,1.20,1.19,1.22,1.35,1.38,1.27,1.35,1.34,1.38,
+1.32,1.36,1.45,1.45,1.45,1.49,1.46,1.48,1.49,1.53,
+1.60,1.59,1.52,1.54,1.56,1.61,1.59,1.66,1.65,1.66,
+1.63,1.70,1.72,1.66,1.78,1.81,1.71,1.78,1.82,1.79,
+1.86,1.87,1.87,1.78,1.94,1.93,1.85,1.94,1.86,1.94,
+1.89,1.94,1.96,1.91,2.02,2.06,1.99,2.07,2.09,2.11,
+1.95,1.93,2.13,2.02,2.14,2.17,2.14,2.21,2.10,2.19,
+2.14,2.23,2.18,2.14,2.27,2.25,2.18,2.21,2.25,2.24,
+2.20,2.26,2.28,2.32,2.29,2.28,2.35,2.26,2.34,2.48,
+2.35,2.32,2.32,2.41,2.33,2.42,2.47,2.45,2.48,2.34,
+2.46,2.52,2.36,2.58,2.53,2.46,2.51,2.54,2.57,2.60,
+2.56,2.45,2.58,2.75,2.66,2.78,2.61,2.67,2.51,2.67,
+2.63,2.64,2.61,2.74,2.59,2.63,2.59,2.71,2.74,2.78,
+2.65,2.63,2.68,2.85,2.77,2.80,2.82,2.78,2.80,2.89,
+2.72,2.87,2.87,2.80,2.74,2.74,2.93,2.86,2.92,2.92,
+2.96,2.85,2.91,2.93,3.09,3.03,2.90,2.89,3.01,3.06,
+3.05,3.09,3.05,2.88,2.97,3.03,3.07,2.99,3.20,3.00,
+2.95,2.98,3.19,3.18,3.06,3.14,3.08,3.08,3.10,3.06,
+3.06,3.12,3.18,3.09,3.13,3.18,3.19,3.27,3.19,3.26,
+3.16,3.05,3.28,3.30,3.13,3.28,3.26,3.34,3.12,3.19,
+3.32,3.32,3.23,3.21,3.34,3.24,3.25,3.37,3.52,3.43,
+3.27,3.45,3.37,3.31,3.33,3.46,3.29,3.52,3.33,3.40,
+3.46,3.40,3.51,3.56,3.47,3.38,3.47,3.34,3.61,3.39,
+3.39,3.50,3.65,3.43,3.62,3.41,3.54,3.49,3.47,3.45,
+3.40,3.50,3.56,3.59,3.57,3.69,3.57,3.59,3.61,3.71,
+3.64,3.72,3.68,3.52,3.65,3.72,3.68,3.64,3.54,3.51,
+3.56,3.68,3.74,3.62,3.78,3.54,3.65,3.68,3.63,3.70,
+0.62,0.61,0.67,0.72,0.76,0.77,0.79,0.80,0.83,0.88,
+0.87,0.89,0.93,0.95,0.93,1.03,0.99,1.04,1.09,1.07,
+1.02,1.08,1.11,1.16,1.10,1.11,1.15,1.12,1.18,1.17,
+1.23,1.27,1.20,1.26,1.28,1.28,1.31,1.24,1.36,1.32,
+1.36,1.36,1.34,1.44,1.40,1.44,1.49,1.48,1.47,1.50,
+1.49,1.51,1.50,1.47,1.51,1.56,1.53,1.53,1.56,1.62,
+1.65,1.65,1.62,1.59,1.66,1.66,1.66,1.63,1.65,1.74,
+1.77,1.78,1.71,1.74,1.72,1.78,1.79,1.79,1.82,1.82,
+1.80,1.81,1.80,1.86,1.89,1.82,1.90,1.88,1.80,1.91,
+1.98,1.94,1.96,1.95,1.92,1.95,1.97,1.93,2.10,2.00,
+2.05,2.05,1.97,2.04,2.05,2.08,2.11,2.17,2.06,2.00,
+2.17,2.11,2.14,2.18,2.10,2.24,2.11,2.26,2.12,2.17,
+2.23,2.20,2.29,2.08,2.20,2.19,2.24,2.28,2.19,2.22,
+2.35,2.23,2.36,2.28,2.28,2.30,2.30,2.36,2.28,2.40,
+2.26,2.38,2.33,2.30,2.32,2.35,2.46,2.44,2.38,2.44,
+2.41,2.47,2.42,2.44,2.45,2.44,2.48,2.49,2.47,2.50,
+2.50,2.49,2.56,2.54,2.49,2.61,2.55,2.50,2.55,2.53,
+2.60,2.58,2.58,2.50,2.67,2.66,2.75,2.58,2.66,2.59,
+2.71,2.64,2.67,2.58,2.75,2.75,2.67,2.72,2.68,2.69,
+2.63,2.75,2.74,2.74,2.78,2.78,2.75,2.84,2.63,2.77,
+2.82,2.86,2.77,2.93,2.76,2.80,2.85,2.79,2.78,2.79,
+2.81,2.76,2.86,2.88,2.97,2.80,3.01,2.93,3.07,2.81,
+3.00,2.90,2.97,2.88,2.97,2.84,2.81,2.93,2.99,2.99,
+3.04,2.90,2.96,3.05,2.93,2.99,3.01,3.03,2.94,2.91,
+2.96,2.99,3.06,3.04,3.07,2.97,3.08,3.06,3.09,3.07,
+3.11,3.16,3.02,3.07,3.17,3.17,3.15,3.12,3.24,3.12,
+3.22,3.20,3.05,3.11,3.19,3.36,3.16,3.27,3.20,3.16,
+3.12,3.24,3.18,3.28,3.24,3.15,3.25,3.25,3.34,3.25,
+3.27,3.15,3.23,3.27,3.40,3.24,3.30,3.48,3.45,3.37,
+0.58,0.58,0.59,0.60,0.60,0.67,0.68,0.70,0.72,0.77,
+0.77,0.76,0.84,0.81,0.84,0.82,0.89,0.90,0.91,0.91,
+0.96,0.91,0.97,0.99,1.00,0.97,1.01,1.05,1.07,1.07,
+1.08,1.06,1.13,1.11,1.07,1.09,1.12,1.14,1.09,1.19,
+1.22,1.21,1.24,1.22,1.25,1.22,1.30,1.34,1.35,1.29,
+1.33,1.29,1.29,1.33,1.37,1.37,1.39,1.39,1.43,1.42,
+1.43,1.45,1.48,1.40,1.43,1.41,1.55,1.54,1.50,1.51,
+1.49,1.55,1.49,1.56,1.54,1.54,1.57,1.57,1.58,1.58,
+1.57,1.60,1.62,1.61,1.64,1.67,1.66,1.62,1.63,1.69,
+1.72,1.81,1.70,1.68,1.68,1.74,1.73,1.77,1.76,1.81,
+1.72,1.83,1.80,1.80,1.80,1.87,1.72,1.91,1.80,1.86,
+1.92,1.90,1.89,1.81,1.83,1.91,1.91,1.86,1.94,1.94,
+1.92,1.86,1.90,1.95,1.87,1.99,1.87,1.97,1.98,2.00,
+2.05,2.01,2.03,2.03,1.92,2.01,2.04,2.04,2.01,2.03,
+2.12,2.06,2.12,2.13,2.10,2.09,1.99,2.15,2.18,2.18,
+2.12,2.15,2.19,2.14,2.22,2.28,2.11,2.29,2.18,2.20,
+2.14,2.19,2.24,2.31,2.24,2.27,2.22,2.20,2.17,2.24,
+2.23,2.23,2.32,2.23,2.35,2.32,2.26,2.29,2.38,2.37,
+2.42,2.30,2.34,2.40,2.30,2.30,2.33,2.25,2.46,2.38,
+2.36,2.37,2.30,2.43,2.32,2.35,2.35,2.35,2.38,2.47,
+2.50,2.46,2.50,2.51,2.55,2.44,2.41,2.52,2.50,2.44,
+2.43,2.44,2.48,2.58,2.56,2.58,2.64,2.58,2.49,2.51,
+2.54,2.53,2.60,2.58,2.56,2.51,2.63,2.71,2.49,2.57,
+2.65,2.65,2.60,2.69,2.72,2.48,2.56,2.60,2.72,2.75,
+2.64,2.70,2.79,2.69,2.80,2.68,2.78,2.71,2.73,2.78,
+2.63,2.77,2.70,2.76,2.81,2.65,2.79,2.91,2.75,2.80,
+2.82,2.72,2.77,2.99,2.74,2.85,2.72,2.80,2.87,2.85,
+2.88,2.79,2.77,3.00,2.80,2.76,2.93,2.83,2.87,2.72,
+2.85,3.05,2.89,2.88,2.79,2.86,3.00,2.85,2.93,3.01,
+0.48,0.49,0.55,0.59,0.56,0.58,0.63,0.61,0.63,0.64,
+0.68,0.69,0.67,0.71,0.70,0.75,0.76,0.75,0.80,0.82,
+0.83,0.87,0.84,0.86,0.89,0.84,0.91,0.88,0.96,0.93,
+0.93,1.00,0.96,0.99,0.96,1.04,1.02,1.02,1.03,1.06,
+1.03,1.08,1.07,1.15,1.09,1.10,1.13,1.15,1.15,1.10,
+1.14,1.18,1.15,1.20,1.15,1.25,1.20,1.24,1.31,1.27,
+1.31,1.22,1.33,1.30,1.26,1.32,1.28,1.26,1.29,1.29,
+1.35,1.41,1.38,1.30,1.36,1.38,1.36,1.36,1.38,1.38,
+1.42,1.43,1.44,1.41,1.34,1.46,1.48,1.51,1.52,1.42,
+1.44,1.47,1.49,1.54,1.48,1.56,1.51,1.46,1.58,1.59,
+1.50,1.56,1.55,1.53,1.61,1.54,1.56,1.62,1.58,1.64,
+1.66,1.64,1.63,1.62,1.66,1.75,1.62,1.72,1.73,1.78,
+1.71,1.69,1.70,1.72,1.77,1.77,1.71,1.73,1.71,1.70,
+1.82,1.76,1.79,1.72,1.79,1.81,1.75,1.71,1.84,1.82,
+1.85,1.80,1.82,1.87,1.86,1.85,1.90,1.87,1.86,1.84,
+1.85,1.84,1.90,1.87,1.83,1.79,1.90,1.91,1.99,1.97,
+1.97,1.91,1.92,1.87,1.93,2.03,1.96,1.92,2.00,1.93,
+2.01,1.96,2.07,2.00,2.01,2.02,2.05,2.04,2.05,2.02,
+2.00,2.13,2.06,2.07,2.13,2.04,2.06,2.13,2.11,2.17,
+2.20,2.08,2.14,2.06,2.15,2.12,2.11,2.13,2.16,2.20,
+2.13,2.14,2.19,2.24,2.16,2.18,2.10,2.29,2.20,2.16,
+2.19,2.21,2.20,2.24,2.27,2.26,2.30,2.32,2.27,2.34,
+2.28,2.23,2.23,2.24,2.30,2.27,2.22,2.28,2.30,2.30,
+2.30,2.41,2.33,2.34,2.27,2.34,2.32,2.34,2.26,2.24,
+2.35,2.37,2.29,2.42,2.30,2.43,2.41,2.45,2.36,2.41,
+2.34,2.48,2.45,2.37,2.36,2.46,2.43,2.45,2.45,2.37,
+2.44,2.34,2.42,2.48,2.44,2.46,2.55,2.38,2.57,2.55,
+2.58,2.48,2.50,2.56,2.50,2.45,2.51,2.54,2.54,2.63,
+2.54,2.57,2.55,2.57,2.55,2.52,2.49,2.61,2.55,2.63,
+0.44,0.44,0.44,0.46,0.49,0.52,0.53,0.55,0.58,0.59,
+0.58,0.63,0.64,0.63,0.65,0.65,0.67,0.69,0.70,0.69,
+0.72,0.73,0.75,0.75,0.82,0.78,0.76,0.83,0.80,0.82,
+0.83,0.86,0.85,0.89,0.89,0.88,0.93,0.94,0.92,0.91,
+0.95,0.98,0.86,1.00,0.98,0.96,0.95,0.99,0.99,1.07,
+1.01,1.06,1.00,1.07,1.07,1.06,1.01,1.11,1.06,1.07,
+1.11,1.15,1.12,1.07,1.11,1.16,1.14,1.12,1.21,1.16,
+1.23,1.19,1.22,1.20,1.20,1.26,1.20,1.20,1.19,1.25,
+1.25,1.20,1.22,1.30,1.27,1.24,1.27,1.30,1.32,1.26,
+1.27,1.26,1.31,1.27,1.34,1.36,1.34,1.37,1.41,1.39,
+1.41,1.40,1.41,1.44,1.40,1.40,1.42,1.35,1.49,1.47,
+1.43,1.45,1.43,1.42,1.54,1.44,1.44,1.46,1.49,1.49,
+1.49,1.51,1.49,1.50,1.53,1.56,1.53,1.57,1.56,1.48,
+1.52,1.58,1.50,1.54,1.57,1.59,1.55,1.58,1.55,1.60,
+1.53,1.57,1.59,1.59,1.70,1.60,1.71,1.65,1.68,1.65,
+1.61,1.62,1.72,1.70,1.68,1.72,1.64,1.68,1.69,1.69,
+1.70,1.69,1.64,1.76,1.69,1.68,1.71,1.71,1.73,1.74,
+1.69,1.75,1.76,1.81,1.77,1.75,1.78,1.80,1.82,1.85,
+1.86,1.80,1.79,1.78,1.81,1.78,1.86,1.88,1.87,1.82,
+1.86,1.86,1.73,1.85,1.86,1.86,1.89,1.90,1.97,1.87,
+1.92,1.88,1.92,2.00,1.89,1.80,1.89,1.83,1.94,1.91,
+1.93,2.00,1.93,1.92,1.97,1.97,1.87,2.01,1.97,1.88,
+1.99,1.91,2.02,2.01,2.01,1.99,2.05,1.97,2.05,2.03,
+2.05,2.08,2.02,2.04,2.12,2.01,2.05,2.02,2.04,2.06,
+1.98,2.16,2.07,2.06,2.13,2.11,2.02,2.07,2.08,2.19,
+2.13,2.16,2.09,2.09,2.10,2.18,2.15,2.24,2.10,2.14,
+2.22,2.17,2.18,2.20,2.10,2.17,2.20,2.22,2.16,2.17,
+2.21,2.19,2.17,2.22,2.25,2.23,2.19,2.20,2.25,2.24,
+2.28,2.14,2.11,2.24,2.24,2.18,2.34,2.17,2.30,2.31,
+0.36,0.39,0.39,0.43,0.43,0.46,0.44,0.45,0.49,0.53,
+0.55,0.52,0.52,0.57,0.56,0.61,0.59,0.62,0.64,0.65,
+0.62,0.68,0.65,0.69,0.65,0.69,0.69,0.72,0.69,0.73,
+0.77,0.72,0.73,0.79,0.76,0.77,0.78,0.78,0.78,0.82,
+0.81,0.86,0.83,0.83,0.84,0.85,0.85,0.90,0.88,0.90,
+0.91,0.91,0.94,0.89,0.88,0.89,0.93,0.94,0.97,0.97,
+0.92,1.01,0.98,1.01,0.96,1.00,1.02,1.00,1.03,1.05,
+1.02,1.04,1.01,1.02,1.09,1.03,1.07,1.08,1.11,1.09,
+1.07,1.13,1.10,1.15,1.16,1.12,1.15,1.13,1.16,1.17,
+1.12,1.16,1.17,1.16,1.21,1.13,1.20,1.20,1.23,1.21,
+1.22,1.17,1.24,1.25,1.26,1.21,1.20,1.22,1.21,1.21,
+1.26,1.26,1.24,1.27,1.21,1.35,1.31,1.32,1.27,1.28,
+1.34,1.34,1.32,1.30,1.34,1.26,1.35,1.29,1.35,1.38,
+1.36,1.36,1.39,1.37,1.33,1.41,1.46,1.33,1.42,1.36,
+1.41,1.45,1.39,1.40,1.47,1.40,1.43,1.51,1.45,1.45,
+1.45,1.50,1.43,1.39,1.51,1.44,1.47,1.53,1.49,1.47,
+1.51,1.46,1.49,1.50,1.51,1.52,1.54,1.47,1.52,1.55,
+1.55,1.50,1.52,1.65,1.60,1.57,1.52,1.64,1.55,1.59,
+1.68,1.65,1.68,1.52,1.59,1.60,1.60,1.63,1.63,1.63,
+1.53,1.60,1.60,1.66,1.63,1.54,1.69,1.67,1.63,1.63,
+1.67,1.69,1.75,1.68,1.75,1.66,1.75,1.67,1.69,1.64,
+1.67,1.71,1.60,1.74,1.72,1.69,1.79,1.78,1.72,1.79,
+1.74,1.76,1.81,1.70,1.69,1.67,1.82,1.82,1.74,1.83,
+1.74,1.74,1.81,1.80,1.80,1.80,1.77,1.80,1.83,1.74,
+1.82,1.85,1.76,1.77,1.86,1.86,1.80,1.80,1.92,1.93,
+1.83,1.78,1.83,1.88,1.86,1.88,1.88,1.80,1.79,1.89,
+1.85,1.93,1.84,1.89,1.77,1.90,1.95,1.85,1.91,1.89,
+1.90,1.87,1.95,1.92,1.96,2.02,2.00,1.85,1.92,1.88,
+1.94,1.92,1.95,1.94,2.02,1.94,1.91,2.02,1.95,2.04,
+0.32,0.36,0.34,0.38,0.38,0.40,0.42,0.42,0.45,0.46,
+0.47,0.47,0.48,0.50,0.52,0.49,0.51,0.53,0.53,0.54,
+0.58,0.61,0.61,0.58,0.60,0.62,0.60,0.58,0.59,0.63,
+0.63,0.63,0.66,0.66,0.65,0.71,0.68,0.69,0.71,0.69,
+0.72,0.70,0.70,0.75,0.73,0.77,0.76,0.74,0.77,0.81,
+0.79,0.83,0.81,0.80,0.79,0.80,0.83,0.83,0.80,0.86,
+0.84,0.86,0.82,0.84,0.87,0.87,0.87,0.86,0.90,0.93,
+0.87,0.91,0.90,0.93,0.86,0.96,0.95,0.89,0.95,0.95,
+0.97,0.97,0.96,1.00,0.98,0.96,0.97,1.00,0.97,0.99,
+1.03,1.03,1.00,1.03,1.02,1.05,1.09,1.05,1.06,1.06,
+1.05,1.05,1.06,1.07,1.16,1.10,1.10,1.08,1.10,1.11,
+1.07,1.09,1.11,1.10,1.13,1.06,1.15,1.14,1.11,1.16,
+1.16,1.14,1.12,1.13,1.20,1.18,1.21,1.17,1.18,1.18,
+1.17,1.21,1.20,1.26,1.20,1.22,1.20,1.19,1.25,1.22,
+1.23,1.26,1.29,1.22,1.27,1.26,1.23,1.22,1.23,1.27,
+1.25,1.30,1.31,1.25,1.24,1.35,1.33,1.34,1.32,1.28,
+1.29,1.31,1.33,1.29,1.34,1.42,1.37,1.31,1.34,1.29,
+1.32,1.30,1.37,1.41,1.34,1.41,1.34,1.43,1.41,1.39,
+1.34,1.42,1.46,1.38,1.47,1.44,1.39,1.42,1.41,1.44,
+1.42,1.46,1.47,1.47,1.42,1.42,1.43,1.46,1.51,1.44,
+1.51,1.47,1.43,1.54,1.52,1.52,1.41,1.45,1.57,1.48,
+1.50,1.48,1.59,1.50,1.50,1.59,1.59,1.45,1.52,1.42,
+1.49,1.52,1.52,1.54,1.53,1.55,1.55,1.55,1.56,1.56,
+1.57,1.55,1.56,1.62,1.55,1.55,1.63,1.58,1.56,1.58,
+1.67,1.57,1.58,1.56,1.61,1.57,1.63,1.59,1.62,1.70,
+1.60,1.69,1.57,1.58,1.65,1.62,1.65,1.67,1.66,1.59,
+1.62,1.64,1.66,1.70,1.63,1.67,1.60,1.64,1.66,1.73,
+1.70,1.66,1.67,1.72,1.74,1.75,1.67,1.68,1.72,1.71,
+1.69,1.74,1.71,1.68,1.80,1.75,1.70,1.80,1.71,1.73,
+0.28,0.28,0.28,0.33,0.32,0.33,0.35,0.39,0.36,0.40,
+0.41,0.41,0.40,0.45,0.40,0.43,0.45,0.47,0.47,0.49,
+0.45,0.51,0.52,0.49,0.50,0.53,0.53,0.54,0.55,0.55,
+0.55,0.56,0.54,0.56,0.57,0.59,0.63,0.62,0.60,0.61,
+0.64,0.62,0.67,0.62,0.62,0.66,0.64,0.64,0.67,0.68,
+0.69,0.71,0.69,0.71,0.70,0.75,0.72,0.71,0.74,0.76,
+0.79,0.78,0.72,0.75,0.80,0.78,0.78,0.78,0.79,0.78,
+0.79,0.78,0.81,0.82,0.88,0.85,0.77,0.85,0.80,0.83,
+0.88,0.84,0.86,0.88,0.86,0.93,0.80,0.88,0.90,0.89,
+0.89,0.91,0.88,0.87,0.85,0.93,0.92,0.94,0.94,0.95,
+0.94,0.94,0.95,0.97,0.97,0.91,0.96,0.94,0.95,0.94,
+1.00,0.93,0.94,0.98,1.00,0.99,1.00,1.00,1.03,1.00,
+1.00,1.05,1.02,1.04,1.03,1.05,1.01,1.02,1.01,1.10,
+1.06,1.04,1.06,1.10,1.08,1.12,1.08,1.07,1.09,1.10,
+1.01,1.08,1.14,1.14,1.11,1.12,1.08,1.13,1.10,1.10,
+1.10,1.11,1.12,1.13,1.14,1.12,1.09,1.17,1.14,1.11,
+1.11,1.18,1.16,1.19,1.19,1.20,1.13,1.21,1.19,1.19,
+1.14,1.19,1.14,1.19,1.21,1.24,1.18,1.19,1.16,1.22,
+1.21,1.22,1.20,1.22,1.29,1.19,1.31,1.24,1.30,1.21,
+1.24,1.23,1.27,1.33,1.28,1.22,1.27,1.28,1.23,1.25,
+1.30,1.26,1.25,1.29,1.31,1.29,1.36,1.31,1.30,1.33,
+1.29,1.29,1.31,1.32,1.33,1.32,1.30,1.32,1.32,1.31,
+1.35,1.31,1.37,1.32,1.38,1.36,1.37,1.45,1.32,1.38,
+1.36,1.43,1.42,1.36,1.39,1.36,1.39,1.38,1.37,1.41,
+1.39,1.44,1.46,1.43,1.44,1.41,1.42,1.46,1.44,1.42,
+1.39,1.43,1.40,1.40,1.38,1.41,1.43,1.43,1.45,1.43,
+1.44,1.42,1.38,1.43,1.45,1.46,1.44,1.49,1.43,1.46,
+1.50,1.50,1.49,1.53,1.49,1.46,1.44,1.49,1.53,1.43,
+1.51,1.52,1.43,1.50,1.51,1.57,1.54,1.52,1.59,1.54,
+0.25,0.27,0.25,0.29,0.28,0.31,0.30,0.32,0.33,0.35,
+0.37,0.34,0.40,0.39,0.36,0.37,0.41,0.40,0.48,0.43,
+0.41,0.45,0.43,0.47,0.47,0.49,0.47,0.51,0.46,0.47,
+0.48,0.51,0.52,0.51,0.54,0.50,0.53,0.51,0.55,0.55,
+0.57,0.57,0.57,0.58,0.57,0.58,0.59,0.59,0.60,0.58,
+0.59,0.61,0.62,0.63,0.58,0.66,0.62,0.63,0.63,0.64,
+0.65,0.65,0.66,0.62,0.63,0.68,0.67,0.66,0.66,0.69,
+0.68,0.68,0.68,0.69,0.68,0.69,0.72,0.73,0.73,0.76,
+0.75,0.72,0.75,0.74,0.75,0.74,0.77,0.73,0.78,0.78,
+0.79,0.75,0.77,0.81,0.75,0.79,0.82,0.84,0.82,0.80,
+0.81,0.85,0.81,0.81,0.82,0.85,0.84,0.87,0.80,0.84,
+0.86,0.86,0.85,0.87,0.88,0.86,0.90,0.85,0.88,0.88,
+0.86,0.89,0.88,0.88,0.88,0.95,0.90,0.89,0.90,0.94,
+0.97,0.92,0.91,0.94,0.92,0.94,0.89,0.91,0.93,0.97,
+0.94,0.97,0.95,1.03,0.93,0.93,0.92,0.96,0.95,0.97,
+0.95,0.99,0.96,0.99,1.00,0.99,1.01,0.95,1.06,0.96,
+1.04,1.03,1.05,1.01,1.04,1.05,1.00,1.02,1.07,1.06,
+1.02,1.06,1.00,1.02,1.04,1.03,1.04,1.01,1.07,1.07,
+1.04,1.03,1.09,1.04,1.07,1.10,1.04,1.12,1.03,1.09,
+1.13,1.11,1.12,1.11,1.08,1.09,1.13,1.06,1.11,1.10,
+1.08,1.07,1.14,1.12,1.21,1.13,1.12,1.14,1.09,1.10,
+1.14,1.16,1.17,1.18,1.16,1.15,1.15,1.20,1.13,1.19,
+1.14,1.13,1.18,1.18,1.21,1.20,1.16,1.22,1.18,1.15,
+1.22,1.21,1.21,1.19,1.19,1.24,1.24,1.23,1.23,1.27,
+1.20,1.22,1.26,1.19,1.27,1.20,1.25,1.20,1.25,1.22,
+1.22,1.27,1.27,1.26,1.22,1.22,1.26,1.31,1.27,1.30,
+1.29,1.24,1.31,1.25,1.32,1.27,1.23,1.23,1.32,1.31,
+1.27,1.25,1.29,1.30,1.32,1.33,1.26,1.33,1.32,1.28,
+1.33,1.27,1.34,1.31,1.30,1.35,1.32,1.32,1.37,1.36,
+0.23,0.22,0.24,0.25,0.25,0.26,0.25,0.29,0.28,0.30,
+0.32,0.33,0.33,0.32,0.30,0.34,0.34,0.36,0.35,0.35,
+0.35,0.37,0.38,0.36,0.39,0.38,0.41,0.43,0.38,0.41,
+0.43,0.44,0.43,0.46,0.46,0.45,0.46,0.44,0.48,0.49,
+0.48,0.44,0.50,0.49,0.48,0.51,0.49,0.49,0.53,0.53,
+0.54,0.55,0.50,0.54,0.55,0.58,0.54,0.57,0.58,0.54,
+0.55,0.59,0.59,0.57,0.58,0.57,0.55,0.58,0.58,0.63,
+0.59,0.64,0.60,0.60,0.62,0.67,0.62,0.63,0.64,0.64,
+0.67,0.67,0.66,0.63,0.67,0.67,0.70,0.68,0.67,0.71,
+0.65,0.68,0.67,0.66,0.73,0.70,0.72,0.66,0.73,0.69,
+0.68,0.71,0.77,0.72,0.69,0.74,0.71,0.73,0.74,0.73,
+0.74,0.72,0.76,0.77,0.75,0.79,0.75,0.74,0.80,0.76,
+0.77,0.76,0.72,0.78,0.75,0.77,0.83,0.81,0.85,0.83,
+0.81,0.80,0.78,0.84,0.82,0.80,0.82,0.83,0.81,0.79,
+0.84,0.83,0.86,0.85,0.87,0.84,0.85,0.84,0.88,0.86,
+0.85,0.84,0.86,0.93,0.89,0.86,0.90,0.87,0.91,0.89,
+0.93,0.88,0.85,0.89,0.91,0.91,0.88,0.92,0.87,0.93,
+0.88,0.96,0.89,0.91,0.90,0.91,0.92,0.94,0.90,0.94,
+0.95,0.97,0.95,0.98,0.94,0.95,0.94,0.95,0.95,0.91,
+0.95,0.94,0.93,0.96,0.96,0.95,1.01,0.99,0.97,0.94,
+0.98,1.00,0.94,1.02,0.99,0.95,1.00,1.02,0.97,0.95,
+1.00,0.98,0.97,1.05,1.04,1.01,1.01,0.99,1.04,1.03,
+1.02,1.00,1.09,1.00,0.99,1.02,1.02,1.02,1.04,1.01,
+1.04,1.06,1.03,1.08,1.04,1.03,1.07,1.06,1.05,1.09,
+1.11,1.07,1.08,1.03,1.11,1.06,1.08,1.06,1.09,1.10,
+1.11,1.07,1.11,1.10,1.06,1.11,1.10,1.13,1.04,1.09,
+1.10,1.10,1.11,1.10,1.10,1.18,1.09,1.09,1.10,1.12,
+1.17,1.13,1.17,1.10,1.13,1.14,1.16,1.13,1.09,1.15,
+1.15,1.20,1.15,1.14,1.17,1.17,1.15,1.19,1.15,1.20,
+0.19,0.20,0.21,0.19,0.22,0.22,0.24,0.25,0.23,0.27,
+0.26,0.27,0.28,0.28,0.28,0.29,0.29,0.34,0.30,0.32,
+0.33,0.34,0.33,0.34,0.33,0.35,0.37,0.39,0.36,0.35,
+0.38,0.34,0.37,0.39,0.38,0.40,0.39,0.42,0.43,0.42,
+0.39,0.43,0.44,0.41,0.45,0.44,0.40,0.45,0.45,0.46,
+0.44,0.44,0.47,0.47,0.46,0.49,0.49,0.49,0.51,0.46,
+0.43,0.53,0.49,0.47,0.52,0.50,0.55,0.54,0.51,0.53,
+0.52,0.53,0.54,0.53,0.52,0.54,0.54,0.53,0.54,0.58,
+0.58,0.55,0.54,0.57,0.55,0.60,0.57,0.59,0.56,0.59,
+0.57,0.56,0.55,0.62,0.58,0.58,0.61,0.60,0.65,0.60,
+0.61,0.64,0.62,0.64,0.64,0.62,0.66,0.63,0.59,0.63,
+0.64,0.67,0.64,0.64,0.66,0.65,0.67,0.68,0.69,0.65,
+0.64,0.74,0.67,0.66,0.63,0.67,0.69,0.69,0.69,0.64,
+0.71,0.73,0.67,0.72,0.72,0.67,0.72,0.73,0.71,0.71,
+0.69,0.73,0.77,0.73,0.73,0.72,0.75,0.71,0.75,0.72,
+0.78,0.72,0.74,0.77,0.79,0.75,0.79,0.77,0.77,0.78,
+0.79,0.76,0.76,0.77,0.76,0.77,0.79,0.83,0.78,0.78,
+0.81,0.81,0.79,0.84,0.77,0.81,0.78,0.83,0.85,0.82,
+0.79,0.83,0.81,0.80,0.80,0.87,0.85,0.88,0.83,0.84,
+0.81,0.80,0.84,0.86,0.83,0.84,0.86,0.92,0.84,0.90,
+0.80,0.83,0.87,0.85,0.84,0.84,0.93,0.89,0.87,0.88,
+0.90,0.86,0.93,0.85,0.87,0.83,0.90,0.89,0.88,0.94,
+0.89,0.94,0.90,0.90,0.92,0.91,0.91,0.89,0.95,0.94,
+0.88,0.94,0.89,0.94,0.90,0.91,0.91,0.89,0.96,0.94,
+0.96,0.98,0.92,0.93,0.93,0.96,1.00,0.95,0.95,0.94,
+1.02,0.97,1.00,0.95,0.98,0.97,0.92,0.93,0.96,0.95,
+0.97,0.94,0.97,0.98,0.96,0.97,0.98,0.99,0.99,1.02,
+1.00,1.03,0.94,1.00,0.99,0.95,1.00,0.98,1.01,0.95,
+0.98,0.98,0.99,0.98,0.99,1.05,0.98,1.02,1.03,1.02,
+1.10,1.18,1.22,1.24,1.30,1.39,1.38,1.40,1.38,1.43,
+1.57,1.53,1.63,1.65,1.63,1.75,1.78,1.78,1.85,1.87,
+1.85,1.97,2.01,1.96,1.93,2.00,2.03,2.08,2.16,2.16,
+2.21,2.20,2.21,2.20,2.34,2.31,2.28,2.42,2.33,2.39,
+2.44,2.41,2.45,2.48,2.54,2.50,2.58,2.58,2.57,2.61,
+2.60,2.67,2.71,2.79,2.73,2.81,2.83,2.82,2.84,2.78,
+2.81,2.90,2.92,2.84,2.99,3.02,2.96,2.98,2.93,3.05,
+3.02,3.17,3.08,3.22,3.07,3.14,3.12,3.20,3.26,3.19,
+3.18,3.16,3.43,3.24,3.34,3.31,3.37,3.45,3.36,3.33,
+3.53,3.43,3.49,3.65,3.42,3.55,3.71,3.43,3.63,3.61,
+3.61,3.58,3.61,3.53,3.71,3.70,3.59,3.68,3.73,3.75,
+3.59,3.64,3.84,3.80,3.73,3.95,3.87,3.77,3.76,3.95,
+3.91,3.95,4.02,3.93,4.05,3.85,3.88,4.09,3.98,3.87,
+4.09,3.94,4.05,4.13,4.01,4.09,4.10,4.24,4.13,4.24,
+4.15,4.19,4.15,4.36,4.31,4.05,4.22,4.43,4.07,4.29,
+4.31,4.37,4.42,4.38,4.41,4.35,4.48,4.54,4.47,4.33,
+4.49,4.34,4.33,4.43,4.37,4.55,4.45,4.44,4.49,4.51,
+4.66,4.59,4.63,4.63,4.66,4.79,4.58,4.54,4.69,4.69,
+4.76,4.74,4.71,4.77,4.87,4.83,4.94,4.90,4.89,4.83,
+4.89,4.96,4.79,4.99,4.84,4.89,5.05,4.79,4.95,5.11,
+5.27,5.01,5.02,5.00,5.02,5.13,4.97,5.05,5.00,5.01,
+5.01,5.16,5.02,5.12,5.28,5.14,5.06,5.09,5.08,5.20,
+5.05,5.05,5.36,5.36,5.15,5.27,5.26,5.26,5.47,5.29,
+5.47,5.26,5.27,5.29,5.42,5.26,5.51,5.39,5.29,5.40,
+5.55,5.51,5.70,5.34,5.50,5.58,5.54,5.34,5.66,5.50,
+5.57,5.43,5.48,5.55,5.70,5.55,5.44,5.42,5.58,5.65,
+5.41,5.50,5.48,5.69,5.53,5.61,5.86,5.49,5.76,5.93,
+5.54,5.51,5.83,5.84,5.89,5.69,5.66,5.61,5.90,5.74,
+5.99,5.91,5.94,5.80,5.63,5.86,5.89,6.03,5.99,6.11,
+0.98,1.08,1.07,1.16,1.15,1.23,1.28,1.31,1.34,1.43,
+1.45,1.48,1.43,1.44,1.51,1.55,1.61,1.62,1.68,1.70,
+1.71,1.76,1.78,1.85,1.89,1.83,1.91,1.88,1.93,1.93,
+1.99,2.05,2.02,2.04,2.02,2.01,2.12,2.13,2.11,2.15,
+2.21,2.26,2.28,2.20,2.29,2.31,2.36,2.42,2.39,2.42,
+2.52,2.49,2.57,2.36,2.60,2.42,2.50,2.53,2.53,2.58,
+2.53,2.66,2.68,2.65,2.75,2.83,2.74,2.73,2.74,2.81,
+2.68,2.83,2.88,2.94,2.77,2.81,2.75,2.93,3.02,2.92,
+2.96,2.96,2.93,2.99,3.17,3.03,3.16,3.21,3.16,3.26,
+3.06,2.99,3.13,3.12,3.19,3.24,3.24,3.30,3.24,3.27,
+3.28,3.26,3.25,3.30,3.27,3.40,3.38,3.39,3.38,3.49,
+3.38,3.57,3.37,3.45,3.62,3.46,3.57,3.59,3.56,3.46,
+3.47,3.63,3.57,3.66,3.57,3.60,3.68,3.62,3.53,3.69,
+3.77,3.60,3.84,3.80,3.72,3.56,3.79,3.91,3.74,3.67,
+3.94,3.87,3.97,3.78,3.94,3.95,3.80,3.82,4.05,3.84,
+3.88,4.07,3.87,3.88,3.97,4.24,4.01,4.07,4.01,3.91,
+4.21,4.06,4.03,4.06,4.26,4.23,4.10,4.19,4.08,4.34,
+4.17,4.24,4.19,4.00,4.23,4.32,4.16,4.22,4.09,4.24,
+4.24,4.38,4.49,4.46,4.27,4.32,4.38,4.42,4.41,4.22,
+4.38,4.44,4.58,4.51,4.36,4.42,4.44,4.64,4.53,4.57,
+4.44,4.41,4.60,4.60,4.62,4.78,4.63,4.64,4.57,4.62,
+4.69,4.74,4.63,4.83,4.57,4.66,4.67,4.50,4.76,4.68,
+4.82,4.68,4.69,4.71,4.89,4.72,4.79,4.71,4.70,4.96,
+4.85,4.81,4.81,4.93,5.07,4.75,4.81,5.07,4.84,4.72,
+4.99,5.00,4.97,4.85,4.99,4.98,5.02,4.98,5.07,4.91,
+5.01,5.15,5.08,5.10,5.19,5.33,5.13,5.10,5.29,5.19,
+5.06,5.12,5.06,5.01,5.11,5.24,5.20,5.16,5.14,5.20,
+5.39,5.55,5.04,5.24,5.23,5.20,5.35,5.09,5.31,5.34,
+5.39,5.16,5.33,5.46,5.27,5.44,5.40,5.51,5.50,5.29,
+0.95,0.94,0.97,1.04,1.08,1.12,1.18,1.16,1.23,1.22,
+1.31,1.32,1.32,1.36,1.44,1.47,1.42,1.50,1.52,1.58,
+1.54,1.56,1.64,1.65,1.72,1.62,1.71,1.73,1.78,1.75,
+1.83,1.83,1.85,1.84,1.88,1.92,1.86,1.92,1.96,1.94,
+2.03,2.09,2.10,1.98,2.14,2.10,2.15,2.17,2.21,2.18,
+2.22,2.26,2.22,2.28,2.30,2.34,2.28,2.20,2.21,2.44,
+2.27,2.43,2.38,2.40,2.41,2.48,2.47,2.37,2.61,2.49,
+2.60,2.56,2.56,2.63,2.53,2.69,2.65,2.65,2.61,2.68,
+2.75,2.65,2.69,2.74,2.82,2.77,2.66,2.80,2.72,2.76,
+2.75,2.80,2.88,2.86,2.83,2.91,2.86,2.92,2.94,2.95,
+2.96,3.10,3.09,3.12,3.01,2.89,3.08,3.00,3.01,3.12,
+3.11,3.04,3.12,3.12,3.19,3.01,3.30,3.08,3.12,3.21,
+3.23,3.19,3.27,3.18,3.27,3.25,3.28,3.38,3.29,3.32,
+3.37,3.30,3.46,3.43,3.39,3.34,3.40,3.25,3.44,3.40,
+3.47,3.48,3.51,3.41,3.48,3.48,3.65,3.60,3.53,3.55,
+3.55,3.48,3.65,3.58,3.66,3.56,3.57,3.62,3.63,3.74,
+3.67,3.79,3.67,3.58,3.68,3.72,3.91,3.76,3.88,3.74,
+3.76,3.89,3.81,3.76,3.86,3.99,3.85,3.89,3.78,3.91,
+3.86,3.85,3.94,3.87,4.11,3.93,3.96,3.89,3.94,3.85,
+4.05,4.08,4.05,4.05,4.01,3.97,4.14,4.08,4.12,4.04,
+4.14,4.08,4.38,3.91,4.18,4.12,4.22,4.21,4.34,4.36,
+4.33,4.33,4.24,4.09,4.26,4.24,4.27,4.27,4.19,4.48,
+4.42,4.21,4.48,4.39,4.20,4.32,4.49,4.32,4.66,4.25,
+4.31,4.29,4.57,4.44,4.44,4.57,4.41,4.50,4.46,4.38,
+4.45,4.46,4.38,4.50,4.53,4.63,4.60,4.59,4.58,4.64,
+4.71,4.72,4.55,4.57,4.72,4.60,4.72,4.77,4.77,4.51,
+4.62,4.68,4.59,4.79,4.48,4.65,4.50,4.63,4.59,4.64,
+4.73,4.84,4.65,4.79,4.84,4.87,4.88,4.99,4.72,4.85,
+4.77,4.95,4.86,4.90,4.76,4.92,4.94,4.73,4.90,4.85,
+0.86,0.90,0.91,0.90,0.96,0.99,1.02,1.07,1.07,1.10,
+1.16,1.21,1.20,1.19,1.25,1.31,1.30,1.30,1.35,1.36,
+1.45,1.38,1.45,1.48,1.51,1.54,1.55,1.61,1.61,1.56,
+1.63,1.61,1.68,1.72,1.71,1.76,1.71,1.80,1.83,1.79,
+1.79,1.77,1.87,1.78,1.81,1.98,1.86,2.00,1.92,2.01,
+2.03,1.90,2.07,2.10,2.07,2.15,2.02,2.03,2.02,2.04,
+2.14,2.17,2.16,2.08,2.20,2.27,2.28,2.28,2.29,2.30,
+2.33,2.31,2.31,2.37,2.44,2.31,2.40,2.40,2.50,2.35,
+2.48,2.40,2.45,2.43,2.43,2.55,2.43,2.58,2.52,2.57,
+2.56,2.62,2.57,2.49,2.72,2.63,2.62,2.69,2.68,2.61,
+2.64,2.67,2.69,2.71,2.74,2.77,2.70,2.74,2.76,2.82,
+2.85,2.84,2.82,2.86,2.88,2.91,2.87,2.81,2.91,2.79,
+2.90,2.88,2.94,2.93,2.97,2.99,2.89,2.93,2.94,2.95,
+3.08,2.98,3.09,3.10,2.88,3.15,3.11,3.19,3.15,3.15,
+3.11,3.21,3.23,3.20,3.15,3.23,3.11,3.14,3.29,3.16,
+3.35,3.21,3.21,3.36,3.28,3.36,3.29,3.30,3.29,3.41,
+3.17,3.36,3.35,3.21,3.34,3.41,3.31,3.43,3.42,3.46,
+3.43,3.52,3.51,3.35,3.48,3.47,3.43,3.54,3.47,3.43,
+3.53,3.38,3.48,3.59,3.51,3.59,3.75,3.57,3.62,3.62,
+3.60,3.61,3.53,3.60,3.62,3.68,3.55,3.62,3.66,3.54,
+3.65,3.76,3.68,3.64,3.81,3.68,3.67,3.75,3.65,3.82,
+3.84,3.89,3.85,3.64,3.93,3.88,3.93,3.90,3.74,3.83,
+4.09,3.80,3.96,3.76,3.94,3.88,3.74,3.98,3.94,3.78,
+3.89,3.92,3.96,3.99,3.94,4.06,3.99,4.12,4.12,4.15,
+4.14,4.01,4.16,4.16,3.99,4.21,4.09,4.28,4.02,4.29,
+4.07,4.28,4.25,4.09,4.18,4.19,4.14,4.22,4.15,4.35,
+4.13,4.21,4.27,4.20,4.21,4.21,4.32,4.35,4.23,4.18,
+4.27,4.31,4.13,4.32,4.26,4.34,4.25,4.30,4.13,4.36,
+4.37,4.26,4.53,4.44,4.37,4.29,4.38,4.33,4.46,4.49,
+0.75,0.78,0.84,0.83,0.88,0.91,0.91,0.97,0.97,1.00,
+1.05,1.07,1.08,1.13,1.12,1.16,1.19,1.21,1.21,1.24,
+1.30,1.27,1.27,1.39,1.41,1.41,1.35,1.39,1.46,1.48,
+1.41,1.48,1.44,1.51,1.60,1.59,1.56,1.56,1.64,1.62,
+1.58,1.60,1.66,1.75,1.67,1.72,1.75,1.66,1.83,1.73,
+1.82,1.86,1.89,1.78,1.75,1.80,1.85,1.89,1.86,1.95,
+1.92,1.96,1.96,1.97,1.89,2.08,2.02,2.04,2.02,2.03,
+2.10,2.07,2.08,2.05,2.13,2.14,2.15,2.13,2.14,2.12,
+2.20,2.27,2.23,2.16,2.25,2.26,2.22,2.22,2.17,2.32,
+2.35,2.34,2.27,2.37,2.32,2.38,2.40,2.42,2.31,2.31,
+2.45,2.42,2.40,2.40,2.56,2.54,2.48,2.47,2.56,2.55,
+2.48,2.59,2.49,2.56,2.56,2.57,2.55,2.54,2.62,2.63,
+2.60,2.63,2.59,2.53,2.68,2.68,2.63,2.65,2.55,2.70,
+2.78,2.77,2.77,2.64,2.78,2.76,2.74,2.63,2.84,2.92,
+2.77,2.82,2.91,2.89,2.85,2.86,2.81,2.83,2.94,3.02,
+2.82,2.91,2.90,2.99,3.00,2.90,2.99,2.96,3.07,2.92,
+3.05,3.07,3.01,3.11,3.12,3.06,3.05,3.00,3.03,3.07,
+3.04,3.07,3.09,3.07,3.19,3.12,3.26,3.20,3.12,3.20,
+3.08,3.22,3.26,3.21,3.20,3.18,3.10,3.28,3.17,3.29,
+3.32,3.33,3.22,3.27,3.38,3.11,3.12,3.31,3.28,3.35,
+3.39,3.40,3.32,3.27,3.36,3.39,3.21,3.45,3.38,3.33,
+3.43,3.29,3.33,3.38,3.44,3.27,3.42,3.46,3.42,3.43,
+3.42,3.53,3.44,3.40,3.44,3.43,3.47,3.52,3.61,3.34,
+3.57,3.63,3.52,3.58,3.74,3.80,3.57,3.59,3.63,3.73,
+3.68,3.70,3.53,3.64,3.58,3.73,3.77,3.75,3.66,3.73,
+3.72,3.77,3.74,3.56,3.78,3.67,3.77,3.73,3.83,3.66,
+3.87,3.94,3.76,3.90,3.78,3.54,3.76,3.94,3.81,3.79,
+3.96,3.81,3.95,3.95,3.82,3.82,3.70,3.79,3.91,3.87,
+3.81,3.86,3.84,4.30,3.87,3.98,3.95,3.93,3.89,3.83,
+0.69,0.68,0.71,0.78,0.74,0.80,0.82,0.86,0.85,0.90,
+0.90,0.99,0.97,1.02,1.00,1.03,1.03,1.05,1.08,1.13,
+1.18,1.12,1.15,1.22,1.20,1.19,1.27,1.26,1.25,1.28,
+1.30,1.33,1.35,1.34,1.35,1.40,1.38,1.41,1.43,1.42,
+1.42,1.43,1.48,1.54,1.58,1.58,1.60,1.56,1.54,1.58,
+1.59,1.61,1.63,1.63,1.61,1.60,1.72,1.65,1.72,1.69,
+1.72,1.71,1.77,1.75,1.73,1.77,1.76,1.77,1.81,1.78,
+1.84,1.85,1.90,1.94,1.92,1.87,1.85,1.95,1.96,1.93,
+1.88,1.97,1.99,2.01,2.01,2.02,1.96,2.02,2.12,2.01,
+2.06,2.05,2.06,2.16,2.16,2.14,1.97,2.05,2.12,2.19,
+2.16,2.17,2.21,2.17,2.15,2.12,2.23,2.25,2.17,2.23,
+2.27,2.25,2.22,2.16,2.21,2.26,2.27,2.35,2.34,2.34,
+2.36,2.27,2.40,2.36,2.33,2.41,2.44,2.42,2.52,2.48,
+2.45,2.39,2.41,2.36,2.46,2.51,2.44,2.58,2.51,2.48,
+2.54,2.52,2.47,2.61,2.45,2.62,2.50,2.64,2.67,2.67,
+2.58,2.59,2.69,2.63,2.58,2.61,2.56,2.64,2.62,2.63,
+2.65,2.65,2.67,2.63,2.62,2.78,2.70,2.76,2.79,2.74,
+2.74,2.74,2.83,2.85,2.68,2.74,2.69,2.77,2.82,2.84,
+2.90,2.75,2.80,2.96,2.87,2.81,2.92,2.88,2.91,2.85,
+2.87,2.92,3.01,2.90,2.89,2.95,2.87,2.97,2.93,3.03,
+2.96,2.95,2.98,2.93,3.10,2.94,3.00,3.05,3.12,3.00,
+3.14,3.06,3.02,3.05,2.99,3.05,3.05,3.13,3.16,3.05,
+3.05,3.16,3.20,3.08,3.17,2.99,3.21,3.12,3.26,3.10,
+3.29,3.18,3.15,3.10,3.22,3.10,3.26,3.31,3.19,3.23,
+3.29,3.27,3.35,3.33,3.37,3.19,3.35,3.35,3.22,3.27,
+3.27,3.34,3.27,3.31,3.23,3.41,3.36,3.39,3.30,3.45,
+3.27,3.29,3.48,3.36,3.33,3.47,3.39,3.31,3.41,3.50,
+3.34,3.53,3.43,3.40,3.30,3.33,3.29,3.39,3.52,3.53,
+3.43,3.50,3.48,3.55,3.56,3.43,3.62,3.58,3.52,3.49,
+0.57,0.60,0.65,0.64,0.69,0.73,0.75,0.76,0.78,0.82,
+0.82,0.83,0.85,0.92,0.91,0.97,0.93,0.95,1.00,0.99,
+1.05,1.01,1.00,1.09,1.11,1.11,1.11,1.10,1.12,1.16,
+1.17,1.18,1.23,1.24,1.28,1.16,1.19,1.25,1.26,1.33,
+1.30,1.30,1.39,1.38,1.37,1.35,1.34,1.34,1.45,1.38,
+1.42,1.42,1.46,1.37,1.48,1.48,1.47,1.43,1.45,1.50,
+1.44,1.59,1.48,1.61,1.60,1.58,1.66,1.62,1.63,1.62,
+1.67,1.59,1.64,1.70,1.61,1.67,1.69,1.77,1.67,1.80,
+1.74,1.80,1.71,1.71,1.75,1.78,1.70,1.81,1.84,1.78,
+1.78,1.85,1.82,1.88,1.86,1.98,1.86,1.87,1.94,1.88,
+1.84,1.94,1.86,1.90,1.89,1.95,1.99,2.02,2.03,1.97,
+1.99,1.95,1.96,1.99,2.03,2.02,2.02,2.12,2.10,2.05,
+2.11,2.13,2.11,2.05,2.17,2.16,2.09,2.13,2.13,2.11,
+2.12,2.25,2.17,2.17,2.21,2.32,2.15,2.19,2.28,2.20,
+2.13,2.22,2.24,2.25,2.22,2.26,2.21,2.37,2.37,2.35,
+2.36,2.39,2.41,2.33,2.35,2.36,2.47,2.32,2.40,2.47,
+2.39,2.32,2.43,2.47,2.38,2.41,2.35,2.40,2.46,2.53,
+2.39,2.49,2.44,2.42,2.52,2.54,2.53,2.46,2.55,2.49,
+2.58,2.53,2.56,2.47,2.55,2.43,2.47,2.54,2.62,2.56,
+2.58,2.51,2.59,2.68,2.71,2.64,2.54,2.67,2.64,2.58,
+2.59,2.67,2.63,2.62,2.75,2.65,2.63,2.77,2.72,2.86,
+2.83,2.79,2.70,2.81,2.72,2.71,2.79,2.75,2.77,2.73,
+2.80,2.69,2.78,2.82,2.86,2.85,2.83,2.86,2.92,2.74,
+2.74,2.86,2.78,2.83,2.84,2.93,2.87,2.85,2.83,2.77,
+2.99,2.88,2.86,2.76,2.89,3.02,2.79,2.97,3.00,2.96,
+2.74,3.04,2.94,2.93,2.96,3.10,3.14,2.97,2.80,3.03,
+2.92,2.91,3.05,3.07,3.02,2.93,2.95,3.02,3.23,3.18,
+3.00,3.09,3.00,3.12,2.93,3.09,3.08,3.13,3.00,3.10,
+3.16,3.18,3.16,2.99,3.15,3.16,3.13,3.12,3.20,3.21,
+0.52,0.54,0.57,0.61,0.66,0.65,0.67,0.68,0.71,0.76,
+0.78,0.77,0.76,0.79,0.81,0.83,0.82,0.85,0.86,0.84,
+0.87,0.87,0.95,0.95,0.96,1.04,0.95,0.98,1.02,1.04,
+1.00,1.00,1.08,1.06,1.06,1.08,1.09,1.12,1.17,1.18,
+1.17,1.18,1.15,1.23,1.19,1.24,1.20,1.25,1.28,1.23,
+1.29,1.28,1.23,1.32,1.34,1.29,1.30,1.38,1.35,1.37,
+1.38,1.36,1.44,1.34,1.39,1.42,1.51,1.46,1.48,1.49,
+1.45,1.43,1.44,1.47,1.53,1.49,1.49,1.50,1.49,1.47,
+1.52,1.48,1.55,1.68,1.66,1.59,1.55,1.59,1.61,1.59,
+1.66,1.66,1.63,1.62,1.71,1.67,1.78,1.74,1.70,1.71,
+1.69,1.73,1.74,1.75,1.79,1.68,1.80,1.78,1.76,1.83,
+1.81,1.80,1.77,1.81,1.78,1.77,1.81,1.77,1.86,1.92,
+1.82,1.92,1.86,1.79,1.89,1.88,1.92,1.93,1.90,1.85,
+1.94,1.90,1.93,2.01,1.98,1.97,1.97,1.96,1.95,1.93,
+1.91,2.02,1.98,1.99,2.09,2.01,1.96,2.02,2.00,2.07,
+2.08,2.10,2.08,2.05,2.09,2.16,2.06,2.13,2.10,2.07,
+2.17,2.06,2.07,2.12,2.16,2.12,2.19,2.12,2.19,2.15,
+2.12,2.24,2.18,2.16,2.17,2.22,2.13,2.26,2.19,2.21,
+2.24,2.27,2.22,2.24,2.19,2.23,2.30,2.35,2.24,2.24,
+2.29,2.37,2.40,2.37,2.19,2.27,2.32,2.39,2.28,2.20,
+2.37,2.33,2.28,2.37,2.47,2.30,2.40,2.37,2.42,2.44,
+2.34,2.48,2.38,2.38,2.44,2.41,2.49,2.40,2.46,2.43,
+2.46,2.52,2.39,2.49,2.57,2.62,2.43,2.48,2.61,2.55,
+2.51,2.48,2.51,2.37,2.52,2.52,2.52,2.46,2.66,2.64,
+2.54,2.54,2.62,2.50,2.66,2.58,2.52,2.70,2.60,2.59,
+2.62,2.63,2.71,2.59,2.70,2.72,2.65,2.67,2.59,2.67,
+2.68,2.64,2.67,2.70,2.77,2.65,2.71,2.71,2.73,2.67,
+2.59,2.76,2.69,2.73,2.69,2.78,2.84,2.75,2.67,2.64,
+2.80,2.93,2.80,2.78,2.78,2.85,2.81,2.77,2.85,2.79,
+0.45,0.45,0.49,0.52,0.54,0.56,0.57,0.60,0.60,0.65,
+0.65,0.69,0.68,0.70,0.71,0.71,0.74,0.76,0.77,0.76,
+0.81,0.82,0.82,0.80,0.85,0.87,0.92,0.86,0.91,0.86,
+0.94,0.90,0.94,0.98,0.94,0.97,1.00,1.01,1.02,1.06,
+1.01,1.01,1.04,1.07,1.06,1.08,1.08,1.15,1.06,1.14,
+1.08,1.16,1.16,1.15,1.14,1.16,1.14,1.11,1.18,1.13,
+1.19,1.21,1.21,1.25,1.25,1.22,1.24,1.27,1.30,1.28,
+1.33,1.28,1.34,1.36,1.35,1.30,1.35,1.28,1.35,1.35,
+1.38,1.36,1.40,1.39,1.40,1.45,1.39,1.42,1.43,1.44,
+1.47,1.40,1.43,1.53,1.52,1.53,1.46,1.46,1.53,1.54,
+1.52,1.60,1.56,1.53,1.56,1.54,1.58,1.63,1.48,1.56,
+1.54,1.55,1.68,1.61,1.59,1.61,1.54,1.58,1.65,1.59,
+1.64,1.68,1.68,1.62,1.71,1.67,1.69,1.65,1.70,1.62,
+1.69,1.75,1.67,1.73,1.74,1.73,1.71,1.76,1.77,1.73,
+1.74,1.72,1.75,1.82,1.81,1.78,1.82,1.85,1.79,1.84,
+1.86,1.83,1.85,1.77,1.84,1.89,1.93,1.93,1.87,1.99,
+1.94,1.90,1.96,1.94,1.87,1.86,1.86,1.89,1.88,1.89,
+1.89,1.92,1.94,2.03,1.87,1.96,1.93,1.96,1.97,2.00,
+2.01,2.00,1.98,2.03,1.95,2.02,1.95,2.01,2.00,2.00,
+2.03,2.05,2.02,2.07,2.10,2.10,2.08,2.08,2.12,2.09,
+2.15,2.04,2.08,2.16,2.12,2.01,2.10,2.09,2.12,2.18,
+2.12,2.17,2.13,2.18,2.09,2.20,2.18,2.15,2.18,2.16,
+2.25,2.18,2.26,2.24,2.25,2.12,2.18,2.28,2.23,2.27,
+2.22,2.26,2.23,2.19,2.21,2.25,2.23,2.25,2.29,2.18,
+2.34,2.26,2.31,2.19,2.19,2.30,2.36,2.21,2.31,2.25,
+2.40,2.32,2.30,2.31,2.37,2.24,2.40,2.33,2.38,2.38,
+2.48,2.53,2.30,2.38,2.46,2.37,2.32,2.42,2.46,2.37,
+2.42,2.46,2.41,2.36,2.46,2.45,2.35,2.42,2.44,2.52,
+2.49,2.39,2.48,2.38,2.47,2.41,2.46,2.61,2.47,2.50,
+0.39,0.44,0.43,0.48,0.47,0.49,0.50,0.51,0.53,0.56,
+0.55,0.60,0.60,0.61,0.65,0.65,0.66,0.66,0.67,0.70,
+0.72,0.70,0.71,0.75,0.72,0.71,0.73,0.79,0.78,0.77,
+0.77,0.80,0.83,0.81,0.84,0.84,0.88,0.88,0.89,0.89,
+0.91,0.93,0.94,0.95,0.96,0.96,0.93,0.92,0.98,0.93,
+1.02,0.99,1.03,1.02,1.02,1.03,0.98,1.03,1.03,1.04,
+0.99,1.06,1.08,1.08,1.09,1.12,1.14,1.17,1.10,1.19,
+1.14,1.13,1.15,1.15,1.15,1.17,1.15,1.16,1.19,1.17,
+1.20,1.24,1.22,1.25,1.23,1.23,1.22,1.22,1.28,1.30,
+1.28,1.27,1.17,1.30,1.29,1.32,1.31,1.38,1.30,1.30,
+1.37,1.33,1.38,1.36,1.36,1.32,1.37,1.44,1.39,1.39,
+1.37,1.43,1.37,1.43,1.43,1.39,1.44,1.39,1.51,1.54,
+1.39,1.50,1.48,1.43,1.47,1.48,1.45,1.53,1.52,1.45,
+1.44,1.49,1.52,1.50,1.56,1.54,1.56,1.53,1.61,1.54,
+1.62,1.57,1.57,1.56,1.61,1.61,1.56,1.56,1.66,1.62,
+1.57,1.62,1.62,1.58,1.59,1.59,1.63,1.65,1.63,1.70,
+1.69,1.65,1.65,1.69,1.79,1.65,1.68,1.73,1.68,1.73,
+1.67,1.72,1.73,1.66,1.75,1.75,1.73,1.72,1.77,1.77,
+1.71,1.71,1.70,1.80,1.83,1.73,1.79,1.78,1.83,1.78,
+1.79,1.85,1.79,1.74,1.77,1.75,1.82,1.80,1.80,1.79,
+1.86,1.92,1.94,1.80,1.85,1.84,1.88,1.98,1.90,1.87,
+1.85,1.97,1.91,1.84,1.79,1.82,1.92,1.89,1.92,1.85,
+1.94,1.90,1.95,1.89,1.95,1.94,1.93,2.02,2.00,1.92,
+1.96,1.93,1.96,1.94,1.91,1.95,2.01,1.95,2.02,2.04,
+2.00,2.04,1.97,1.99,2.02,2.04,2.06,1.93,1.98,2.10,
+2.08,2.07,2.10,2.03,2.05,2.04,2.17,2.09,2.04,2.09,
+2.12,2.07,2.11,2.20,2.12,2.09,2.20,2.08,2.04,2.10,
+2.06,2.08,2.09,2.14,2.11,2.16,2.23,2.18,2.22,2.08,
+2.14,2.14,2.14,2.14,2.16,2.15,2.23,2.25,2.18,2.19,
+0.36,0.39,0.40,0.43,0.44,0.44,0.46,0.49,0.48,0.51,
+0.52,0.50,0.55,0.56,0.57,0.54,0.60,0.63,0.62,0.62,
+0.62,0.62,0.64,0.67,0.67,0.69,0.66,0.73,0.69,0.68,
+0.70,0.68,0.73,0.74,0.73,0.80,0.73,0.78,0.78,0.77,
+0.79,0.84,0.81,0.83,0.85,0.87,0.84,0.82,0.81,0.86,
+0.83,0.90,0.87,0.89,0.88,0.94,0.88,0.92,0.89,0.90,
+0.94,0.97,0.94,0.97,0.95,0.98,0.99,1.03,1.01,1.00,
+0.99,1.02,1.09,1.01,1.00,1.00,1.04,1.06,1.02,1.10,
+1.08,1.12,1.07,1.07,1.09,1.12,1.10,1.09,1.14,1.14,
+1.07,1.12,1.17,1.13,1.16,1.19,1.17,1.16,1.20,1.22,
+1.19,1.24,1.23,1.22,1.25,1.18,1.21,1.23,1.23,1.23,
+1.18,1.19,1.24,1.22,1.17,1.27,1.22,1.33,1.30,1.30,
+1.28,1.31,1.30,1.28,1.26,1.34,1.31,1.22,1.31,1.31,
+1.31,1.27,1.38,1.36,1.33,1.39,1.33,1.38,1.37,1.35,
+1.40,1.41,1.40,1.47,1.47,1.39,1.45,1.43,1.41,1.43,
+1.41,1.40,1.40,1.39,1.44,1.43,1.43,1.44,1.47,1.44,
+1.45,1.47,1.47,1.44,1.48,1.52,1.44,1.52,1.52,1.53,
+1.48,1.51,1.51,1.52,1.48,1.54,1.48,1.53,1.50,1.58,
+1.52,1.58,1.55,1.59,1.54,1.58,1.56,1.61,1.60,1.56,
+1.63,1.59,1.64,1.63,1.55,1.64,1.58,1.65,1.57,1.56,
+1.62,1.71,1.62,1.61,1.61,1.66,1.59,1.67,1.67,1.64,
+1.67,1.74,1.66,1.68,1.69,1.63,1.68,1.64,1.63,1.71,
+1.64,1.76,1.75,1.75,1.70,1.74,1.70,1.72,1.71,1.72,
+1.71,1.72,1.78,1.80,1.73,1.72,1.80,1.84,1.82,1.75,
+1.79,1.77,1.81,1.83,1.83,1.83,1.84,1.79,1.75,1.93,
+1.81,1.79,1.84,1.78,1.86,1.86,1.87,1.83,1.93,1.82,
+1.96,1.74,1.83,1.85,1.93,1.94,1.83,1.91,1.83,1.82,
+1.85,1.93,1.89,1.91,1.97,1.88,1.87,1.88,1.81,1.94,
+1.93,1.87,1.99,1.90,1.95,1.99,1.98,1.97,1.94,1.99,
+0.35,0.31,0.35,0.35,0.39,0.42,0.41,0.40,0.41,0.45,
+0.45,0.45,0.47,0.49,0.49,0.48,0.50,0.53,0.54,0.57,
+0.50,0.54,0.57,0.56,0.62,0.59,0.56,0.61,0.63,0.65,
+0.63,0.65,0.65,0.64,0.64,0.66,0.68,0.66,0.65,0.70,
+0.70,0.70,0.74,0.70,0.72,0.70,0.75,0.76,0.79,0.77,
+0.79,0.78,0.74,0.82,0.78,0.81,0.78,0.83,0.83,0.82,
+0.85,0.85,0.85,0.83,0.88,0.85,0.85,0.88,0.85,0.90,
+0.84,0.92,0.91,0.91,0.91,0.91,0.91,0.95,0.87,0.95,
+0.94,0.94,0.99,0.98,0.95,0.97,0.93,0.97,0.98,0.99,
+0.96,1.01,0.98,1.00,1.03,1.10,1.01,1.01,1.04,1.01,
+1.03,1.06,1.02,1.03,1.02,1.06,1.08,1.06,1.06,1.13,
+1.08,1.05,1.08,1.10,1.13,1.11,1.13,1.09,1.09,1.11,
+1.17,1.17,1.15,1.15,1.17,1.16,1.12,1.21,1.18,1.19,
+1.12,1.19,1.15,1.18,1.21,1.23,1.18,1.17,1.20,1.23,
+1.26,1.22,1.20,1.20,1.20,1.27,1.24,1.28,1.26,1.16,
+1.26,1.34,1.27,1.22,1.31,1.24,1.29,1.26,1.35,1.31,
+1.26,1.35,1.28,1.24,1.31,1.25,1.33,1.31,1.38,1.27,
+1.34,1.35,1.29,1.30,1.34,1.38,1.35,1.38,1.40,1.34,
+1.40,1.37,1.36,1.39,1.35,1.45,1.40,1.39,1.41,1.39,
+1.43,1.44,1.39,1.51,1.39,1.42,1.38,1.43,1.40,1.43,
+1.47,1.48,1.44,1.46,1.46,1.43,1.47,1.46,1.50,1.47,
+1.44,1.53,1.43,1.50,1.46,1.55,1.49,1.53,1.48,1.42,
+1.53,1.52,1.45,1.52,1.59,1.51,1.54,1.51,1.48,1.55,
+1.53,1.51,1.58,1.50,1.56,1.52,1.57,1.52,1.57,1.55,
+1.55,1.57,1.63,1.59,1.48,1.57,1.58,1.52,1.59,1.61,
+1.62,1.65,1.64,1.63,1.70,1.62,1.58,1.61,1.61,1.58,
+1.63,1.61,1.65,1.60,1.65,1.64,1.61,1.65,1.65,1.62,
+1.65,1.67,1.68,1.64,1.67,1.61,1.71,1.68,1.68,1.71,
+1.72,1.75,1.74,1.60,1.63,1.75,1.63,1.70,1.74,1.70,
+0.28,0.28,0.28,0.31,0.30,0.33,0.37,0.35,0.39,0.37,
+0.41,0.40,0.42,0.43,0.46,0.43,0.48,0.49,0.47,0.46,
+0.48,0.46,0.49,0.54,0.52,0.53,0.55,0.54,0.52,0.53,
+0.58,0.56,0.54,0.60,0.61,0.57,0.58,0.59,0.61,0.60,
+0.64,0.63,0.62,0.61,0.61,0.64,0.69,0.65,0.65,0.69,
+0.65,0.68,0.70,0.72,0.67,0.67,0.72,0.71,0.75,0.75,
+0.72,0.74,0.73,0.75,0.72,0.77,0.73,0.73,0.75,0.73,
+0.76,0.80,0.83,0.78,0.81,0.80,0.82,0.85,0.83,0.82,
+0.83,0.85,0.85,0.86,0.85,0.81,0.83,0.85,0.86,0.85,
+0.86,0.87,0.89,0.91,0.90,0.91,0.92,0.89,0.91,0.88,
+0.91,0.91,0.89,0.93,0.93,0.93,0.92,0.93,0.97,0.95,
+0.96,0.98,0.98,1.02,0.95,0.99,0.96,1.01,0.99,1.02,
+1.01,1.03,0.98,1.03,1.01,1.03,1.06,1.08,1.04,1.05,
+1.02,1.09,1.09,1.05,1.07,1.04,1.03,1.06,1.08,1.06,
+1.12,1.05,1.06,1.12,1.15,1.09,1.11,1.11,1.07,1.05,
+1.08,1.15,1.08,1.15,1.13,1.14,1.11,1.09,1.15,1.12,
+1.15,1.17,1.21,1.16,1.17,1.18,1.14,1.16,1.24,1.21,
+1.16,1.18,1.20,1.18,1.18,1.17,1.17,1.16,1.19,1.21,
+1.24,1.12,1.20,1.23,1.22,1.19,1.22,1.25,1.24,1.21,
+1.32,1.24,1.28,1.24,1.25,1.25,1.26,1.23,1.32,1.28,
+1.28,1.28,1.24,1.30,1.26,1.29,1.30,1.31,1.33,1.34,
+1.29,1.32,1.30,1.29,1.29,1.29,1.31,1.37,1.33,1.30,
+1.33,1.35,1.33,1.38,1.34,1.38,1.31,1.35,1.39,1.29,
+1.34,1.31,1.36,1.35,1.40,1.35,1.37,1.37,1.35,1.34,
+1.40,1.38,1.37,1.36,1.38,1.36,1.44,1.43,1.43,1.40,
+1.39,1.37,1.44,1.44,1.46,1.43,1.40,1.44,1.46,1.44,
+1.44,1.44,1.43,1.49,1.44,1.43,1.49,1.39,1.50,1.47,
+1.47,1.49,1.47,1.52,1.44,1.50,1.47,1.49,1.51,1.48,
+1.47,1.57,1.47,1.50,1.53,1.53,1.54,1.52,1.44,1.55,
+0.25,0.26,0.29,0.28,0.28,0.30,0.29,0.30,0.31,0.34,
+0.34,0.37,0.33,0.37,0.41,0.42,0.35,0.41,0.43,0.39,
+0.42,0.45,0.44,0.44,0.45,0.50,0.44,0.46,0.49,0.46,
+0.46,0.51,0.51,0.52,0.50,0.50,0.53,0.54,0.53,0.55,
+0.54,0.56,0.55,0.55,0.57,0.61,0.57,0.56,0.60,0.60,
+0.59,0.59,0.59,0.64,0.61,0.64,0.63,0.65,0.65,0.64,
+0.67,0.66,0.67,0.64,0.67,0.67,0.65,0.69,0.66,0.71,
+0.65,0.71,0.71,0.70,0.69,0.72,0.75,0.74,0.72,0.73,
+0.74,0.74,0.73,0.74,0.75,0.75,0.72,0.72,0.78,0.80,
+0.79,0.79,0.80,0.82,0.77,0.77,0.82,0.79,0.81,0.86,
+0.82,0.81,0.80,0.84,0.83,0.83,0.83,0.85,0.83,0.84,
+0.84,0.85,0.86,0.79,0.82,0.89,0.90,0.93,0.87,0.89,
+0.89,0.84,0.86,0.87,0.89,0.88,0.92,0.93,0.89,0.92,
+0.90,0.93,0.86,0.95,0.93,0.92,0.92,0.92,0.97,0.98,
+0.91,0.93,0.91,0.97,0.98,0.92,0.96,0.99,0.98,0.97,
+1.02,1.02,1.00,0.99,0.99,0.99,0.95,1.00,0.99,0.98,
+1.02,1.01,1.02,1.01,1.02,1.04,1.05,1.05,1.01,1.07,
+1.00,1.00,1.04,1.02,1.04,1.06,1.04,1.03,1.04,1.06,
+1.09,1.01,1.09,1.05,1.08,1.08,1.07,1.09,1.08,1.09,
+1.07,1.12,1.12,1.05,1.10,1.05,1.07,1.15,1.13,1.12,
+1.11,1.15,1.11,1.12,1.12,1.14,1.13,1.15,1.14,1.13,
+1.11,1.08,1.19,1.18,1.12,1.19,1.18,1.18,1.18,1.14,
+1.16,1.18,1.17,1.16,1.20,1.17,1.17,1.13,1.19,1.25,
+1.18,1.18,1.23,1.26,1.25,1.23,1.19,1.24,1.19,1.21,
+1.18,1.19,1.19,1.22,1.19,1.23,1.16,1.26,1.27,1.23,
+1.22,1.22,1.26,1.24,1.25,1.28,1.24,1.28,1.17,1.24,
+1.19,1.26,1.25,1.32,1.25,1.29,1.27,1.24,1.26,1.30,
+1.29,1.24,1.31,1.30,1.24,1.29,1.20,1.24,1.22,1.26,
+1.25,1.25,1.32,1.34,1.25,1.33,1.32,1.32,1.36,1.34,
+0.21,0.25,0.25,0.24,0.27,0.24,0.27,0.27,0.29,0.30,
+0.30,0.30,0.32,0.32,0.34,0.34,0.32,0.37,0.36,0.36,
+0.35,0.38,0.41,0.41,0.39,0.37,0.40,0.43,0.43,0.41,
+0.40,0.40,0.46,0.44,0.45,0.46,0.49,0.44,0.46,0.45,
+0.49,0.52,0.50,0.50,0.49,0.51,0.51,0.52,0.54,0.52,
+0.53,0.54,0.54,0.52,0.52,0.55,0.54,0.52,0.57,0.59,
+0.57,0.59,0.58,0.55,0.60,0.59,0.61,0.58,0.62,0.62,
+0.63,0.56,0.61,0.61,0.65,0.61,0.62,0.63,0.62,0.66,
+0.63,0.64,0.64,0.62,0.67,0.65,0.67,0.68,0.68,0.70,
+0.65,0.68,0.72,0.71,0.67,0.70,0.69,0.69,0.71,0.69,
+0.72,0.68,0.75,0.75,0.76,0.73,0.73,0.74,0.73,0.70,
+0.71,0.71,0.76,0.76,0.76,0.75,0.78,0.79,0.80,0.78,
+0.77,0.73,0.80,0.76,0.75,0.83,0.76,0.80,0.79,0.81,
+0.79,0.80,0.80,0.82,0.81,0.80,0.84,0.82,0.83,0.84,
+0.83,0.83,0.83,0.82,0.86,0.84,0.86,0.82,0.84,0.83,
+0.86,0.86,0.87,0.89,0.87,0.86,0.85,0.89,0.88,0.85,
+0.85,0.89,0.88,0.89,0.91,0.86,0.89,0.88,0.88,0.94,
+0.89,0.88,0.91,0.89,0.91,0.91,0.93,0.89,0.91,0.89,
+0.91,0.93,0.97,0.93,0.96,0.95,1.02,0.90,0.92,0.95,
+0.93,0.93,0.95,0.99,0.95,1.00,0.97,0.94,0.94,1.03,
+1.00,0.99,0.97,0.95,1.03,0.98,0.96,0.96,1.01,1.01,
+1.03,1.03,1.04,1.03,1.02,1.09,0.97,1.05,1.01,1.02,
+0.99,1.01,1.03,1.01,1.05,1.04,1.00,1.06,1.08,1.08,
+0.99,1.06,1.07,1.06,1.05,1.06,1.08,1.05,1.11,0.99,
+1.07,1.05,1.10,1.10,1.07,1.09,1.11,1.08,1.11,1.11,
+1.08,1.06,1.07,1.10,1.08,1.08,1.06,1.08,1.10,1.08,
+1.10,1.07,1.12,1.11,1.16,1.09,1.11,1.16,1.08,1.13,
+1.11,1.08,1.14,1.11,1.11,1.13,1.16,1.13,1.16,1.17,
+1.13,1.19,1.15,1.17,1.16,1.20,1.19,1.12,1.17,1.21,
+1.15,1.17,1.24,1.28,1.36,1.39,1.42,1.50,1.48,1.50,
+1.60,1.65,1.71,1.73,1.72,1.79,1.80,1.84,1.88,1.89,
+1.86,1.95,2.03,2.03,2.11,2.03,2.10,2.13,2.19,2.16,
+2.23,2.23,2.22,2.36,2.41,2.40,2.37,2.35,2.36,2.43,
+2.49,2.57,2.55,2.54,2.69,2.61,2.73,2.54,2.66,2.58,
+2.65,2.70,2.74,2.81,2.81,2.90,2.95,2.80,2.79,2.96,
+2.88,3.10,2.90,3.03,3.03,3.04,3.02,3.12,3.03,3.19,
+3.22,3.21,3.21,3.21,3.15,3.25,3.19,3.16,3.34,3.38,
+3.16,3.32,3.23,3.27,3.36,3.35,3.33,3.40,3.27,3.51,
+3.55,3.40,3.57,3.61,3.53,3.65,3.70,3.77,3.44,3.68,
+3.60,3.59,3.56,3.72,3.64,3.84,3.63,3.63,3.88,3.82,
+3.71,3.84,3.86,4.08,3.89,3.97,3.95,3.85,3.91,3.83,
+3.85,4.00,3.80,3.93,3.91,3.94,3.99,4.14,4.21,4.09,
+4.06,4.04,4.00,4.14,4.12,4.20,4.31,4.06,4.40,4.34,
+4.09,4.11,4.22,4.29,4.35,4.46,4.34,4.56,4.26,4.39,
+4.30,4.42,4.37,4.42,4.43,4.45,4.47,4.49,4.62,4.62,
+4.55,4.42,4.62,4.39,4.55,4.60,4.69,4.64,4.50,4.62,
+4.81,4.75,4.52,4.62,4.63,4.73,4.61,4.84,4.77,4.90,
+4.84,4.82,4.92,4.72,4.84,4.80,4.75,4.80,4.65,4.96,
+5.12,4.97,4.93,4.98,5.05,5.08,4.87,4.84,5.10,4.93,
+5.02,5.16,5.12,5.05,5.08,5.03,5.25,5.06,5.18,5.02,
+5.30,5.30,5.06,5.35,5.11,5.43,5.25,5.19,5.36,5.26,
+5.40,5.28,5.19,5.22,5.40,5.45,5.50,5.33,5.31,5.33,
+5.56,5.39,5.43,5.37,5.52,5.50,5.40,5.37,5.49,5.32,
+5.57,5.62,5.32,5.47,5.66,5.42,5.56,5.57,5.53,5.47,
+5.67,5.57,5.46,5.47,5.51,5.50,5.58,5.75,5.69,5.64,
+5.67,5.73,5.88,5.73,5.89,5.85,5.69,5.43,5.92,5.81,
+5.76,5.68,6.08,5.93,5.95,5.77,5.85,5.82,5.80,6.06,
+6.00,5.91,5.99,5.92,6.14,6.12,6.09,5.90,5.98,5.70,
+1.04,1.09,1.06,1.14,1.22,1.23,1.30,1.40,1.36,1.43,
+1.45,1.49,1.50,1.62,1.58,1.66,1.68,1.69,1.77,1.74,
+1.73,1.84,1.86,1.81,1.90,1.86,1.96,2.00,1.96,2.12,
+2.03,2.01,2.21,2.12,2.14,2.17,2.14,2.19,2.17,2.29,
+2.27,2.22,2.37,2.40,2.36,2.41,2.46,2.48,2.54,2.53,
+2.54,2.49,2.53,2.62,2.60,2.50,2.62,2.67,2.70,2.61,
+2.72,2.64,2.73,2.65,2.75,2.83,2.75,2.89,2.81,2.83,
+2.88,2.90,2.71,2.90,2.99,2.85,2.92,3.08,2.95,3.08,
+3.15,3.02,3.12,3.00,3.04,3.11,3.19,3.15,3.31,3.18,
+3.15,3.32,3.27,3.27,3.12,3.26,3.29,3.29,3.48,3.26,
+3.37,3.39,3.51,3.49,3.42,3.46,3.40,3.30,3.48,3.53,
+3.52,3.47,3.51,3.56,3.54,3.57,3.63,3.60,3.66,3.71,
+3.70,3.62,3.64,3.70,3.76,3.59,3.66,3.73,3.81,3.78,
+3.74,3.88,3.70,3.87,3.90,3.97,3.75,3.86,3.88,3.99,
+3.87,4.00,3.87,3.84,3.93,3.90,4.04,4.16,3.90,4.04,
+4.15,4.15,3.94,4.15,4.12,4.08,4.17,4.13,4.22,4.17,
+4.14,4.19,4.28,4.30,4.22,4.41,4.05,4.23,4.17,4.33,
+4.35,4.29,4.28,4.29,4.19,4.34,4.57,4.32,4.28,4.38,
+4.23,4.64,4.53,4.45,4.44,4.30,4.75,4.45,4.32,4.64,
+4.42,4.76,4.63,4.35,4.64,4.75,4.80,4.71,4.52,4.71,
+4.61,4.51,4.65,4.79,4.72,4.80,4.64,4.66,4.81,4.76,
+4.70,4.74,4.65,4.83,4.90,4.70,4.73,4.74,4.76,4.80,
+4.91,4.83,4.81,4.83,4.97,4.91,4.99,5.22,4.84,4.85,
+4.93,4.84,5.20,4.93,5.07,5.05,5.03,5.08,5.15,5.17,
+5.15,5.18,5.26,5.00,5.04,5.08,5.17,4.82,5.26,5.05,
+5.36,5.07,5.07,5.15,5.16,5.10,5.21,5.06,5.26,5.23,
+5.23,5.32,5.48,5.16,5.41,5.30,5.39,5.64,5.41,5.39,
+5.31,5.33,5.25,5.52,5.64,5.44,5.33,5.21,5.52,5.37,
+5.50,5.59,5.49,5.53,5.48,5.38,5.50,5.53,5.65,5.59,
+0.97,0.97,1.03,1.09,1.11,1.15,1.21,1.23,1.24,1.29,
+1.40,1.42,1.43,1.48,1.45,1.56,1.52,1.49,1.58,1.61,
+1.66,1.65,1.74,1.73,1.78,1.81,1.80,1.78,1.73,1.85,
+1.82,1.83,1.90,2.02,2.00,1.97,2.04,2.07,2.08,2.02,
+2.07,2.15,2.07,2.12,2.16,2.14,2.23,2.22,2.22,2.25,
+2.29,2.39,2.37,2.35,2.37,2.39,2.43,2.53,2.44,2.43,
+2.43,2.46,2.46,2.55,2.42,2.50,2.56,2.68,2.60,2.54,
+2.68,2.71,2.64,2.69,2.67,2.68,2.71,2.72,2.79,2.75,
+2.67,2.72,2.73,2.80,2.90,2.91,2.88,2.92,2.92,3.00,
+3.02,2.95,3.01,2.98,2.98,2.91,2.94,3.06,3.11,3.00,
+3.12,3.21,3.12,3.02,3.09,3.18,3.26,3.28,3.30,3.16,
+3.16,3.14,3.14,3.32,3.35,3.23,3.26,3.14,3.29,3.29,
+3.37,3.32,3.54,3.31,3.58,3.48,3.46,3.38,3.47,3.56,
+3.46,3.52,3.53,3.58,3.43,3.50,3.56,3.65,3.53,3.49,
+3.58,3.59,3.47,3.60,3.64,3.66,3.64,3.61,3.76,3.67,
+3.81,3.70,3.82,3.74,3.73,3.74,3.83,3.87,3.80,3.75,
+3.89,3.77,3.73,3.99,3.83,3.71,3.96,3.95,3.88,3.81,
+3.87,3.76,3.92,4.05,4.03,4.13,3.98,3.92,4.05,3.97,
+4.05,4.22,3.98,4.15,4.27,4.12,4.18,4.21,4.15,4.09,
+4.29,4.04,4.12,4.31,4.23,4.45,4.36,4.24,4.21,4.15,
+4.37,4.17,4.25,4.14,4.26,4.29,4.38,4.29,4.34,4.35,
+4.40,4.32,4.35,4.49,4.41,4.35,4.64,4.53,4.46,4.31,
+4.62,4.54,4.42,4.64,4.65,4.44,4.68,4.55,4.62,4.59,
+4.43,4.54,4.63,4.47,4.64,4.44,4.75,4.66,4.45,4.66,
+4.60,4.55,4.89,4.78,4.78,4.59,4.68,4.64,4.61,4.78,
+4.74,4.75,4.68,4.63,4.76,4.78,4.85,4.89,4.55,4.94,
+4.93,4.71,4.74,4.73,4.87,4.86,4.87,4.74,4.84,4.87,
+4.78,4.99,5.03,5.03,4.98,5.02,5.05,4.94,4.97,4.82,
+5.01,4.92,5.01,4.87,5.04,5.03,5.23,5.04,5.14,5.24,
+0.88,0.92,0.95,0.98,1.07,1.04,1.08,1.14,1.13,1.20,
+1.20,1.23,1.25,1.29,1.35,1.40,1.35,1.39,1.46,1.46,
+1.45,1.52,1.55,1.55,1.59,1.59,1.64,1.57,1.61,1.77,
+1.68,1.70,1.68,1.79,1.77,1.76,1.76,1.88,1.83,1.89,
+1.92,1.94,1.91,1.96,1.96,1.98,1.99,2.02,2.07,1.98,
+2.11,2.06,2.07,2.05,2.23,2.23,2.18,2.12,2.17,2.20,
+2.18,2.27,2.35,2.31,2.29,2.32,2.31,2.33,2.40,2.42,
+2.41,2.46,2.37,2.42,2.41,2.34,2.51,2.46,2.50,2.51,
+2.54,2.53,2.56,2.57,2.82,2.63,2.64,2.73,2.64,2.67,
+2.72,2.66,2.73,2.61,2.77,2.65,2.80,2.77,2.78,2.77,
+2.86,2.83,2.87,2.86,2.97,2.92,2.96,2.92,2.75,2.85,
+2.97,2.89,2.94,2.93,2.90,2.96,2.94,3.09,3.12,3.13,
+3.00,3.02,3.02,3.11,3.12,3.14,3.23,3.28,3.19,3.11,
+3.22,3.12,3.21,3.18,3.27,3.22,3.18,3.31,3.28,3.31,
+3.30,3.17,3.18,3.32,3.41,3.22,3.37,3.37,3.49,3.36,
+3.44,3.34,3.31,3.26,3.33,3.57,3.40,3.48,3.45,3.54,
+3.50,3.59,3.45,3.48,3.42,3.68,3.46,3.59,3.51,3.72,
+3.62,3.52,3.59,3.66,3.71,3.60,3.56,3.58,3.77,3.69,
+3.78,3.75,3.69,3.77,3.78,3.76,3.61,3.67,3.93,3.89,
+3.76,3.86,3.86,3.79,3.74,3.76,3.79,3.98,3.92,3.90,
+3.79,3.86,4.07,3.81,3.81,3.99,3.83,3.86,4.03,4.04,
+3.85,4.01,4.01,4.06,4.02,4.07,4.14,3.98,4.01,4.00,
+3.98,4.03,4.19,4.00,4.06,4.23,3.98,4.17,3.95,4.12,
+4.19,4.21,4.29,4.05,4.04,4.14,4.13,4.07,4.19,4.24,
+4.04,4.22,4.17,4.29,4.23,4.40,4.25,4.24,4.20,4.46,
+4.27,4.53,4.26,4.37,4.20,4.13,4.30,4.36,4.34,4.42,
+4.43,4.46,4.29,4.49,4.40,4.37,4.48,4.51,4.54,4.53,
+4.48,4.60,4.56,4.69,4.69,4.42,4.53,4.53,4.56,4.55,
+4.60,4.83,4.61,4.71,4.31,4.67,4.56,4.69,4.77,4.77,
+0.77,0.81,0.86,0.91,0.92,0.98,0.98,1.06,1.06,1.03,
+1.06,1.10,1.16,1.19,1.16,1.19,1.30,1.28,1.27,1.33,
+1.34,1.36,1.37,1.41,1.37,1.51,1.40,1.44,1.50,1.47,
+1.57,1.58,1.55,1.63,1.62,1.59,1.59,1.71,1.67,1.70,
+1.69,1.69,1.72,1.75,1.83,1.83,1.83,1.85,1.83,1.86,
+1.85,1.84,1.95,2.02,1.95,1.87,1.95,1.99,1.98,1.97,
+1.97,2.04,2.11,2.07,2.08,2.08,2.08,2.19,2.12,2.13,
+2.15,2.13,2.23,2.18,2.35,2.23,2.26,2.26,2.27,2.31,
+2.32,2.26,2.28,2.33,2.33,2.49,2.36,2.40,2.35,2.47,
+2.52,2.41,2.44,2.46,2.46,2.41,2.45,2.56,2.60,2.39,
+2.50,2.65,2.62,2.50,2.56,2.65,2.56,2.55,2.70,2.66,
+2.63,2.66,2.64,2.68,2.71,2.66,2.83,2.88,2.78,2.64,
+2.92,2.73,2.82,2.85,2.81,2.80,2.91,2.84,2.84,2.86,
+2.87,3.01,2.86,2.90,2.91,2.99,2.95,2.91,3.02,2.85,
+3.04,2.90,3.06,2.98,2.90,3.03,2.99,2.92,3.05,3.12,
+2.94,3.14,3.15,3.09,3.00,3.21,3.11,3.20,3.23,3.07,
+3.28,3.27,3.18,3.13,3.27,3.22,3.00,3.12,3.22,3.36,
+3.30,3.37,3.31,3.31,3.35,3.11,3.39,3.27,3.31,3.37,
+3.32,3.27,3.23,3.31,3.41,3.41,3.40,3.55,3.30,3.55,
+3.41,3.41,3.45,3.42,3.44,3.47,3.42,3.55,3.54,3.43,
+3.52,3.52,3.46,3.46,3.54,3.64,3.59,3.56,3.55,3.70,
+3.67,3.77,3.69,3.47,3.60,3.82,3.66,3.60,3.69,3.73,
+3.67,3.67,3.67,3.68,3.67,3.70,3.74,3.81,3.84,3.69,
+3.92,3.70,3.59,3.74,3.75,3.76,3.73,3.88,3.90,3.88,
+3.77,3.83,3.82,3.82,3.91,3.84,3.76,4.02,4.01,3.91,
+4.17,4.03,4.01,3.83,4.14,3.93,4.11,3.89,4.01,4.04,
+3.93,4.07,3.91,3.94,3.93,4.00,4.13,4.07,4.06,4.18,
+4.00,4.07,4.13,4.03,3.97,4.02,4.17,4.00,4.18,4.18,
+4.15,4.16,4.18,4.21,4.16,4.09,4.11,4.18,4.16,4.48,
+0.73,0.72,0.75,0.81,0.85,0.83,0.89,0.91,0.92,0.97,
+1.05,1.02,1.03,1.08,1.09,1.09,1.10,1.16,1.18,1.17,
+1.23,1.21,1.25,1.26,1.33,1.31,1.33,1.34,1.36,1.33,
+1.32,1.42,1.44,1.48,1.45,1.45,1.50,1.46,1.50,1.55,
+1.56,1.55,1.52,1.64,1.65,1.60,1.65,1.76,1.70,1.63,
+1.71,1.71,1.72,1.75,1.75,1.76,1.82,1.77,1.79,1.79,
+1.80,1.85,1.85,1.85,1.81,1.87,1.95,1.88,2.04,1.93,
+1.93,1.93,1.99,2.02,1.94,2.02,2.11,2.08,2.09,2.10,
+2.07,2.04,2.09,2.02,2.19,2.17,2.14,2.16,2.20,2.15,
+2.13,2.24,2.21,2.30,2.24,2.21,2.20,2.25,2.32,2.37,
+2.35,2.34,2.31,2.26,2.34,2.31,2.42,2.35,2.30,2.39,
+2.42,2.47,2.53,2.31,2.46,2.49,2.34,2.47,2.51,2.43,
+2.51,2.59,2.36,2.55,2.57,2.62,2.60,2.55,2.52,2.65,
+2.63,2.68,2.59,2.65,2.55,2.52,2.63,2.70,2.67,2.56,
+2.80,2.74,2.81,2.78,2.72,2.80,2.75,2.66,2.69,2.75,
+2.79,2.76,2.81,2.81,2.75,2.79,2.79,2.69,2.90,2.86,
+2.77,2.79,2.95,2.84,2.90,2.88,2.96,2.88,3.00,2.93,
+2.81,2.91,2.96,2.97,3.10,3.04,2.98,3.02,3.06,2.96,
+2.98,3.12,3.03,3.04,3.11,3.14,3.07,3.09,3.16,3.05,
+3.12,3.02,3.20,3.23,3.21,3.12,3.29,3.15,3.18,3.28,
+3.19,3.22,3.16,3.13,3.21,3.14,3.23,3.23,3.27,3.26,
+3.31,3.28,3.22,3.29,3.32,3.26,3.33,3.24,3.31,3.44,
+3.31,3.26,3.36,3.33,3.29,3.32,3.52,3.48,3.44,3.35,
+3.34,3.40,3.50,3.41,3.53,3.47,3.31,3.51,3.49,3.59,
+3.31,3.45,3.35,3.42,3.47,3.53,3.53,3.55,3.49,3.57,
+3.60,3.57,3.47,3.42,3.45,3.36,3.56,3.64,3.41,3.54,
+3.53,3.62,3.58,3.64,3.50,3.63,3.64,3.60,3.60,3.85,
+3.75,3.63,3.71,3.66,3.75,3.77,3.69,3.67,3.62,3.70,
+3.73,3.69,3.82,3.91,3.66,3.76,3.78,3.73,3.83,3.79,
+0.64,0.67,0.70,0.75,0.75,0.74,0.79,0.78,0.84,0.86,
+0.92,0.90,0.92,0.94,0.97,1.01,1.03,1.04,1.03,1.09,
+1.09,1.09,1.11,1.16,1.21,1.15,1.16,1.18,1.22,1.17,
+1.24,1.26,1.26,1.34,1.32,1.32,1.31,1.33,1.42,1.39,
+1.44,1.42,1.40,1.46,1.48,1.46,1.44,1.48,1.48,1.46,
+1.55,1.54,1.58,1.53,1.57,1.60,1.62,1.64,1.68,1.69,
+1.71,1.63,1.64,1.71,1.67,1.64,1.72,1.77,1.78,1.74,
+1.73,1.74,1.83,1.74,1.79,1.76,1.81,1.79,1.89,1.81,
+1.88,1.87,1.90,1.95,1.93,1.92,1.85,1.91,1.89,1.98,
+1.98,1.90,1.95,2.00,1.98,1.97,1.99,2.07,1.98,2.02,
+2.01,2.07,2.07,2.05,2.09,2.07,2.10,2.11,2.12,2.12,
+2.13,2.17,2.17,2.25,2.28,2.16,2.20,2.21,2.16,2.27,
+2.23,2.26,2.25,2.27,2.33,2.28,2.24,2.25,2.23,2.41,
+2.36,2.30,2.36,2.33,2.26,2.39,2.28,2.33,2.31,2.36,
+2.37,2.54,2.40,2.43,2.46,2.39,2.43,2.45,2.53,2.47,
+2.54,2.53,2.43,2.44,2.58,2.46,2.51,2.49,2.47,2.47,
+2.67,2.57,2.58,2.58,2.65,2.63,2.60,2.66,2.56,2.61,
+2.66,2.63,2.65,2.69,2.66,2.68,2.60,2.71,2.74,2.74,
+2.60,2.84,2.61,2.72,2.68,2.85,2.75,2.88,2.74,2.78,
+2.70,2.77,2.69,2.90,2.89,2.87,2.71,2.85,2.79,2.86,
+2.84,2.82,2.75,2.82,2.94,2.92,2.92,2.84,2.87,2.89,
+2.87,2.93,2.94,2.92,2.95,3.05,3.04,3.03,2.99,2.93,
+3.01,3.00,2.95,3.16,2.95,2.99,2.97,3.03,3.01,3.05,
+3.11,3.01,3.08,3.01,3.02,3.02,3.12,3.10,3.18,3.13,
+3.21,3.03,3.13,3.18,3.10,3.11,3.15,3.12,3.07,3.16,
+3.12,3.21,3.20,3.27,3.20,3.24,3.26,3.13,3.19,3.34,
+3.32,3.33,3.27,3.20,3.31,3.11,3.31,3.34,3.23,3.26,
+3.29,3.31,3.45,3.35,3.13,3.27,3.32,3.32,3.35,3.33,
+3.20,3.29,3.29,3.46,3.29,3.43,3.32,3.33,3.47,3.42,
+0.54,0.58,0.60,0.66,0.69,0.70,0.73,0.72,0.76,0.80,
+0.79,0.81,0.81,0.84,0.86,0.91,0.94,0.92,0.95,0.92,
+1.02,0.95,0.99,1.05,1.01,1.03,1.09,1.13,1.08,1.09,
+1.14,1.12,1.15,1.13,1.17,1.16,1.22,1.23,1.17,1.21,
+1.30,1.26,1.24,1.28,1.32,1.34,1.31,1.37,1.43,1.37,
+1.37,1.32,1.39,1.34,1.42,1.42,1.46,1.44,1.45,1.49,
+1.53,1.47,1.49,1.51,1.47,1.53,1.50,1.54,1.54,1.55,
+1.58,1.60,1.67,1.63,1.66,1.66,1.65,1.58,1.66,1.72,
+1.65,1.71,1.59,1.69,1.68,1.71,1.78,1.80,1.73,1.74,
+1.79,1.73,1.78,1.82,1.79,1.81,1.81,1.86,1.84,1.81,
+1.74,1.86,1.94,1.86,1.89,1.89,1.92,1.91,1.94,1.88,
+1.92,1.97,1.97,1.92,2.03,2.02,2.02,2.02,2.00,2.02,
+1.95,1.91,1.99,1.99,2.10,2.18,2.06,2.10,2.10,2.18,
+2.13,2.10,2.15,2.08,2.08,2.19,2.12,2.16,2.16,2.14,
+2.12,2.16,2.12,2.20,2.14,2.10,2.16,2.25,2.28,2.21,
+2.19,2.20,2.24,2.15,2.23,2.28,2.20,2.24,2.33,2.24,
+2.34,2.35,2.44,2.37,2.27,2.29,2.32,2.36,2.35,2.32,
+2.39,2.38,2.37,2.36,2.45,2.39,2.45,2.35,2.43,2.41,
+2.36,2.33,2.47,2.35,2.38,2.52,2.43,2.56,2.34,2.50,
+2.58,2.49,2.48,2.53,2.45,2.54,2.46,2.53,2.50,2.45,
+2.67,2.53,2.61,2.60,2.47,2.63,2.55,2.64,2.63,2.65,
+2.60,2.69,2.65,2.54,2.64,2.62,2.64,2.69,2.66,2.62,
+2.63,2.79,2.62,2.70,2.65,2.63,2.75,2.61,2.68,2.68,
+2.79,2.64,2.73,2.85,2.82,2.60,2.77,2.67,2.82,2.66,
+2.74,2.91,2.78,2.77,2.67,2.83,2.89,2.79,2.86,2.88,
+2.93,2.84,2.84,2.87,2.83,2.91,2.93,2.83,2.88,2.81,
+2.80,2.86,2.85,2.98,2.99,3.02,3.06,2.87,2.91,2.96,
+2.94,2.96,2.93,2.90,3.01,3.00,2.92,2.97,3.02,3.04,
+3.03,2.96,3.00,2.96,3.03,2.95,3.05,3.06,3.00,3.21,
+0.49,0.52,0.53,0.59,0.62,0.61,0.62,0.65,0.68,0.69,
+0.71,0.72,0.72,0.75,0.76,0.80,0.80,0.86,0.80,0.86,
+0.84,0.87,0.89,0.90,0.88,0.95,0.95,0.97,0.98,0.98,
+1.02,1.02,1.04,1.07,1.03,1.07,1.05,1.09,1.10,1.09,
+1.06,1.12,1.13,1.11,1.11,1.19,1.15,1.14,1.20,1.19,
+1.19,1.27,1.26,1.26,1.28,1.24,1.25,1.25,1.26,1.33,
+1.35,1.31,1.32,1.31,1.36,1.32,1.38,1.37,1.36,1.37,
+1.38,1.42,1.34,1.48,1.42,1.49,1.41,1.49,1.44,1.50,
+1.48,1.42,1.56,1.60,1.52,1.48,1.55,1.67,1.57,1.51,
+1.62,1.53,1.61,1.53,1.62,1.65,1.64,1.60,1.56,1.65,
+1.52,1.65,1.73,1.70,1.68,1.68,1.74,1.69,1.67,1.64,
+1.70,1.77,1.75,1.75,1.76,1.80,1.74,1.76,1.74,1.82,
+1.75,1.78,1.82,1.78,1.84,1.91,1.87,1.90,1.89,1.89,
+1.93,1.86,1.88,1.91,1.97,1.91,1.91,1.85,1.87,1.84,
+1.87,1.90,1.97,1.99,1.91,1.92,1.86,1.99,1.92,1.96,
+1.92,1.98,1.94,1.97,2.04,2.03,2.07,1.98,2.05,2.05,
+2.05,1.98,2.03,2.05,2.09,2.02,2.05,2.11,2.05,2.12,
+2.11,2.12,2.02,2.10,2.11,2.08,2.09,2.11,2.27,2.18,
+2.12,2.29,2.09,2.18,2.16,2.22,2.22,2.26,2.27,2.24,
+2.24,2.15,2.16,2.24,2.18,2.29,2.27,2.29,2.29,2.24,
+2.32,2.23,2.32,2.24,2.35,2.36,2.30,2.27,2.38,2.28,
+2.31,2.35,2.38,2.42,2.36,2.32,2.35,2.42,2.34,2.28,
+2.26,2.37,2.34,2.40,2.47,2.36,2.29,2.43,2.42,2.46,
+2.53,2.36,2.48,2.39,2.41,2.40,2.37,2.36,2.44,2.42,
+2.42,2.54,2.49,2.46,2.50,2.52,2.47,2.56,2.46,2.66,
+2.54,2.53,2.52,2.65,2.54,2.53,2.62,2.54,2.60,2.65,
+2.58,2.60,2.57,2.59,2.46,2.63,2.61,2.53,2.59,2.69,
+2.58,2.50,2.72,2.70,2.61,2.69,2.62,2.58,2.73,2.62,
+2.65,2.72,2.74,2.78,2.72,2.73,2.73,2.58,2.74,2.79,
+0.46,0.46,0.49,0.53,0.51,0.57,0.56,0.58,0.63,0.59,
+0.62,0.64,0.67,0.71,0.70,0.70,0.73,0.73,0.75,0.71,
+0.77,0.74,0.77,0.80,0.84,0.84,0.85,0.86,0.89,0.84,
+0.90,0.91,0.87,0.92,0.98,0.96,0.94,0.99,0.96,0.94,
+1.00,1.00,1.03,0.97,1.02,1.01,1.03,1.07,1.08,1.05,
+1.06,1.12,1.17,1.09,1.11,1.13,1.14,1.14,1.14,1.16,
+1.19,1.23,1.16,1.21,1.31,1.23,1.21,1.18,1.25,1.26,
+1.23,1.25,1.26,1.27,1.28,1.30,1.28,1.33,1.31,1.31,
+1.36,1.33,1.40,1.32,1.40,1.35,1.40,1.40,1.41,1.37,
+1.37,1.39,1.41,1.45,1.43,1.40,1.43,1.47,1.53,1.45,
+1.38,1.47,1.49,1.44,1.46,1.48,1.44,1.47,1.52,1.44,
+1.57,1.60,1.50,1.55,1.56,1.52,1.56,1.57,1.56,1.52,
+1.62,1.62,1.60,1.58,1.66,1.69,1.68,1.68,1.67,1.55,
+1.68,1.61,1.66,1.73,1.61,1.71,1.65,1.58,1.70,1.70,
+1.66,1.76,1.72,1.66,1.76,1.75,1.67,1.75,1.71,1.77,
+1.78,1.82,1.78,1.72,1.83,1.76,1.84,1.76,1.78,1.85,
+1.80,1.91,1.86,1.88,1.85,1.85,1.83,1.84,1.92,1.88,
+1.92,1.80,1.89,1.89,1.92,1.98,1.90,1.94,1.99,1.95,
+1.95,1.95,1.91,2.02,1.96,2.00,1.93,1.94,2.03,1.93,
+1.95,1.91,2.05,1.99,1.93,1.99,2.03,2.00,2.09,2.01,
+2.11,2.07,2.00,2.08,1.96,2.07,2.05,2.03,2.07,2.11,
+2.04,2.09,2.05,1.99,2.12,2.09,2.05,2.08,2.09,2.07,
+2.12,2.15,2.11,2.14,2.14,2.08,2.16,2.11,2.16,2.08,
+2.10,2.14,2.21,2.11,2.20,2.21,2.23,2.18,2.30,2.16,
+2.14,2.24,2.26,2.24,2.25,2.19,2.21,2.28,2.26,2.25,
+2.19,2.27,2.20,2.28,2.22,2.30,2.29,2.31,2.22,2.33,
+2.32,2.41,2.36,2.26,2.24,2.31,2.34,2.30,2.27,2.34,
+2.25,2.28,2.30,2.29,2.32,2.37,2.41,2.39,2.49,2.43,
+2.34,2.33,2.40,2.46,2.49,2.42,2.36,2.31,2.38,2.36,
+0.37,0.44,0.44,0.48,0.44,0.51,0.48,0.51,0.51,0.53,
+0.59,0.61,0.60,0.61,0.58,0.62,0.66,0.64,0.69,0.69,
+0.71,0.69,0.70,0.72,0.71,0.72,0.76,0.77,0.81,0.75,
+0.81,0.82,0.79,0.84,0.80,0.85,0.87,0.87,0.92,0.86,
+0.85,0.91,0.87,0.90,0.89,0.95,0.96,0.99,0.94,0.96,
+0.98,0.91,0.98,1.00,1.02,1.04,1.04,1.03,1.02,1.05,
+1.08,1.08,1.07,1.08,1.09,1.12,1.15,1.07,1.09,1.10,
+1.12,1.12,1.12,1.19,1.17,1.19,1.13,1.17,1.15,1.17,
+1.22,1.21,1.20,1.23,1.20,1.24,1.16,1.22,1.20,1.26,
+1.27,1.22,1.27,1.25,1.24,1.23,1.26,1.36,1.35,1.33,
+1.32,1.25,1.33,1.33,1.31,1.34,1.30,1.36,1.34,1.34,
+1.39,1.31,1.40,1.38,1.36,1.48,1.43,1.42,1.39,1.37,
+1.41,1.45,1.36,1.42,1.42,1.46,1.47,1.51,1.49,1.49,
+1.52,1.49,1.45,1.38,1.49,1.50,1.52,1.52,1.50,1.52,
+1.56,1.48,1.48,1.62,1.56,1.58,1.60,1.60,1.60,1.52,
+1.54,1.59,1.62,1.55,1.61,1.51,1.56,1.64,1.60,1.66,
+1.61,1.64,1.62,1.65,1.73,1.58,1.67,1.67,1.58,1.68,
+1.62,1.71,1.64,1.70,1.73,1.65,1.63,1.69,1.65,1.67,
+1.71,1.63,1.69,1.74,1.79,1.71,1.80,1.74,1.69,1.77,
+1.72,1.82,1.85,1.74,1.78,1.81,1.81,1.70,1.75,1.81,
+1.80,1.80,1.78,1.75,1.82,1.82,1.81,1.92,1.86,1.89,
+1.85,1.92,1.79,1.88,1.93,1.89,1.86,1.86,1.90,1.77,
+1.88,1.88,1.87,1.97,1.83,1.93,1.86,1.87,1.94,1.93,
+1.97,1.88,1.89,1.90,1.96,1.94,1.88,1.93,1.95,1.98,
+1.92,1.96,2.00,1.97,1.93,1.96,1.96,2.05,2.03,2.03,
+1.99,2.01,1.97,2.04,2.01,1.97,2.04,2.00,2.06,2.06,
+2.07,2.16,1.96,2.05,2.10,2.13,2.11,2.06,2.07,2.09,
+2.11,2.14,2.06,2.14,2.06,2.08,2.05,2.18,2.00,2.10,
+2.11,2.14,2.14,2.14,2.09,2.08,2.09,2.10,2.17,2.19,
+0.33,0.39,0.38,0.41,0.43,0.43,0.44,0.42,0.49,0.47,
+0.50,0.50,0.55,0.53,0.52,0.57,0.56,0.60,0.60,0.59,
+0.60,0.60,0.60,0.64,0.69,0.65,0.67,0.67,0.66,0.68,
+0.67,0.71,0.71,0.74,0.75,0.71,0.76,0.74,0.78,0.80,
+0.76,0.81,0.80,0.76,0.79,0.84,0.85,0.86,0.83,0.86,
+0.83,0.85,0.88,0.87,0.88,0.86,0.91,0.92,0.91,0.94,
+0.95,0.92,0.98,0.93,0.93,1.00,0.97,1.00,1.00,1.00,
+0.99,1.00,0.99,0.97,0.99,1.02,1.02,1.01,1.08,1.12,
+1.09,1.09,1.08,1.06,1.07,1.08,1.07,1.09,1.06,1.05,
+1.09,1.08,1.18,1.16,1.08,1.07,1.12,1.16,1.12,1.16,
+1.17,1.16,1.11,1.18,1.18,1.17,1.18,1.14,1.17,1.22,
+1.23,1.25,1.23,1.25,1.27,1.20,1.25,1.23,1.24,1.28,
+1.23,1.25,1.26,1.32,1.25,1.25,1.25,1.33,1.27,1.30,
+1.26,1.32,1.34,1.35,1.35,1.29,1.34,1.37,1.31,1.31,
+1.38,1.40,1.41,1.33,1.37,1.36,1.37,1.44,1.43,1.34,
+1.43,1.34,1.45,1.36,1.44,1.44,1.46,1.47,1.40,1.50,
+1.40,1.50,1.49,1.49,1.51,1.49,1.44,1.42,1.48,1.49,
+1.49,1.44,1.44,1.52,1.51,1.46,1.49,1.49,1.54,1.54,
+1.49,1.51,1.54,1.59,1.55,1.50,1.59,1.56,1.53,1.50,
+1.57,1.56,1.63,1.59,1.56,1.58,1.59,1.60,1.58,1.67,
+1.65,1.55,1.63,1.66,1.63,1.71,1.60,1.64,1.60,1.62,
+1.62,1.65,1.69,1.57,1.65,1.66,1.68,1.69,1.66,1.65,
+1.63,1.68,1.73,1.67,1.67,1.65,1.68,1.73,1.63,1.66,
+1.72,1.72,1.73,1.74,1.74,1.80,1.70,1.71,1.70,1.73,
+1.82,1.71,1.76,1.79,1.72,1.80,1.78,1.77,1.75,1.73,
+1.78,1.77,1.79,1.75,1.87,1.77,1.84,1.77,1.75,1.83,
+1.83,1.77,1.73,1.89,1.83,1.79,1.83,1.89,1.78,1.86,
+1.82,1.78,1.88,1.89,1.78,1.85,1.93,1.85,1.89,1.82,
+1.89,1.86,1.91,1.90,1.95,1.91,1.94,1.95,1.97,1.82,
+0.31,0.30,0.36,0.37,0.36,0.39,0.39,0.43,0.42,0.43,
+0.46,0.48,0.47,0.49,0.48,0.49,0.51,0.51,0.52,0.53,
+0.57,0.56,0.59,0.57,0.57,0.58,0.60,0.58,0.59,0.63,
+0.62,0.62,0.59,0.66,0.63,0.65,0.67,0.63,0.71,0.69,
+0.68,0.70,0.70,0.72,0.77,0.75,0.75,0.75,0.74,0.79,
+0.76,0.80,0.78,0.75,0.82,0.81,0.80,0.82,0.78,0.77,
+0.80,0.82,0.89,0.85,0.82,0.82,0.82,0.89,0.90,0.84,
+0.91,0.85,0.88,0.91,0.89,0.91,0.91,0.91,0.94,1.00,
+0.90,0.97,0.96,1.00,0.98,0.94,0.95,0.97,0.95,0.96,
+1.00,0.98,0.99,0.99,1.01,0.99,1.02,1.01,1.00,1.03,
+0.99,1.01,1.09,1.03,1.06,1.08,1.03,1.09,1.06,1.12,
+1.08,1.06,1.09,1.13,1.05,1.08,1.08,1.10,1.13,1.12,
+1.09,1.10,1.14,1.19,1.13,1.16,1.17,1.14,1.18,1.08,
+1.19,1.21,1.14,1.16,1.16,1.17,1.24,1.16,1.23,1.22,
+1.23,1.19,1.20,1.23,1.22,1.22,1.22,1.23,1.26,1.21,
+1.22,1.25,1.22,1.27,1.26,1.23,1.27,1.23,1.22,1.27,
+1.26,1.25,1.28,1.33,1.29,1.28,1.34,1.29,1.32,1.31,
+1.29,1.28,1.34,1.29,1.34,1.39,1.36,1.33,1.34,1.37,
+1.40,1.44,1.35,1.37,1.40,1.36,1.37,1.36,1.36,1.36,
+1.36,1.39,1.35,1.41,1.37,1.39,1.43,1.41,1.39,1.42,
+1.39,1.39,1.42,1.44,1.41,1.44,1.48,1.45,1.45,1.43,
+1.44,1.42,1.46,1.44,1.49,1.53,1.46,1.48,1.48,1.45,
+1.47,1.47,1.43,1.50,1.60,1.42,1.52,1.48,1.49,1.53,
+1.59,1.51,1.53,1.52,1.55,1.56,1.59,1.58,1.53,1.56,
+1.55,1.54,1.56,1.57,1.54,1.57,1.51,1.58,1.57,1.56,
+1.61,1.58,1.53,1.62,1.62,1.54,1.62,1.55,1.55,1.58,
+1.63,1.62,1.56,1.64,1.61,1.63,1.62,1.63,1.63,1.67,
+1.67,1.66,1.68,1.65,1.68,1.71,1.68,1.66,1.72,1.61,
+1.64,1.66,1.62,1.71,1.68,1.62,1.71,1.76,1.72,1.71,
+0.28,0.31,0.32,0.32,0.31,0.34,0.34,0.38,0.39,0.36,
+0.40,0.41,0.41,0.42,0.44,0.43,0.44,0.46,0.50,0.45,
+0.49,0.42,0.49,0.49,0.51,0.53,0.49,0.54,0.54,0.57,
+0.59,0.59,0.54,0.59,0.58,0.61,0.57,0.59,0.59,0.61,
+0.63,0.63,0.61,0.63,0.63,0.63,0.66,0.66,0.68,0.66,
+0.65,0.68,0.68,0.67,0.68,0.63,0.70,0.73,0.74,0.67,
+0.73,0.74,0.76,0.76,0.73,0.74,0.76,0.75,0.78,0.82,
+0.76,0.76,0.82,0.79,0.78,0.76,0.79,0.82,0.82,0.82,
+0.81,0.83,0.85,0.83,0.79,0.84,0.87,0.84,0.86,0.88,
+0.91,0.92,0.86,0.89,0.91,0.87,0.92,0.85,0.89,0.90,
+0.92,0.91,0.90,0.95,0.95,0.91,0.97,0.94,0.95,0.99,
+0.94,0.96,0.90,0.99,0.98,1.00,1.05,0.96,0.92,1.02,
+1.02,1.00,1.00,1.00,0.97,1.03,1.02,0.99,1.08,1.07,
+1.04,1.01,1.06,1.05,1.04,1.03,1.02,1.09,1.06,1.09,
+1.09,1.09,1.10,1.08,1.04,1.05,1.07,1.08,1.15,1.07,
+1.08,1.16,1.14,1.10,1.12,1.12,1.13,1.11,1.09,1.14,
+1.12,1.15,1.12,1.14,1.16,1.15,1.14,1.20,1.21,1.16,
+1.16,1.16,1.15,1.24,1.14,1.17,1.19,1.16,1.21,1.20,
+1.20,1.20,1.23,1.22,1.24,1.19,1.23,1.18,1.29,1.20,
+1.21,1.31,1.23,1.23,1.30,1.21,1.29,1.27,1.24,1.24,
+1.32,1.26,1.28,1.26,1.28,1.24,1.30,1.29,1.29,1.31,
+1.27,1.27,1.32,1.29,1.32,1.26,1.30,1.33,1.31,1.28,
+1.33,1.35,1.31,1.34,1.33,1.40,1.35,1.30,1.41,1.33,
+1.36,1.36,1.31,1.31,1.36,1.36,1.39,1.40,1.44,1.43,
+1.37,1.37,1.32,1.45,1.38,1.39,1.40,1.42,1.43,1.34,
+1.40,1.40,1.38,1.39,1.47,1.46,1.51,1.47,1.42,1.44,
+1.44,1.41,1.41,1.45,1.44,1.37,1.43,1.41,1.45,1.46,
+1.34,1.51,1.53,1.48,1.47,1.49,1.50,1.51,1.43,1.49,
+1.46,1.52,1.49,1.53,1.57,1.44,1.53,1.49,1.48,1.53,
+0.24,0.26,0.27,0.29,0.31,0.32,0.30,0.30,0.33,0.32,
+0.34,0.36,0.40,0.39,0.40,0.40,0.40,0.40,0.41,0.39,
+0.45,0.40,0.47,0.43,0.47,0.47,0.49,0.43,0.47,0.46,
+0.50,0.49,0.47,0.47,0.49,0.53,0.52,0.54,0.51,0.54,
+0.56,0.52,0.54,0.60,0.59,0.60,0.60,0.57,0.57,0.57,
+0.62,0.63,0.58,0.63,0.64,0.64,0.65,0.63,0.63,0.65,
+0.61,0.65,0.62,0.68,0.68,0.66,0.67,0.69,0.71,0.63,
+0.69,0.68,0.72,0.70,0.74,0.70,0.73,0.70,0.74,0.75,
+0.73,0.74,0.71,0.73,0.72,0.80,0.75,0.77,0.77,0.75,
+0.76,0.82,0.79,0.78,0.77,0.80,0.80,0.79,0.81,0.82,
+0.81,0.85,0.79,0.84,0.82,0.85,0.84,0.85,0.82,0.83,
+0.91,0.85,0.86,0.86,0.85,0.89,0.90,0.84,0.84,0.84,
+0.90,0.88,0.88,0.88,0.88,0.87,0.88,0.91,0.89,0.93,
+0.93,0.96,0.91,0.93,0.93,0.93,0.92,0.94,0.97,0.96,
+0.97,0.95,0.98,0.97,0.97,0.96,0.96,1.00,0.91,0.98,
+1.02,0.95,0.99,0.99,1.02,0.99,1.03,0.98,1.05,0.98,
+0.99,1.02,0.99,1.03,1.07,1.06,1.02,1.04,1.04,1.03,
+1.03,1.07,1.06,1.03,1.02,1.08,1.11,1.06,1.04,1.04,
+1.07,1.05,1.06,1.09,1.13,1.11,1.10,1.11,1.07,1.11,
+1.04,1.06,1.10,1.09,1.15,1.14,1.09,1.09,1.09,1.09,
+1.10,1.11,1.10,1.11,1.14,1.15,1.15,1.16,1.14,1.13,
+1.12,1.16,1.15,1.13,1.16,1.21,1.15,1.16,1.14,1.21,
+1.16,1.26,1.14,1.17,1.20,1.18,1.18,1.19,1.16,1.16,
+1.16,1.21,1.16,1.18,1.27,1.21,1.22,1.22,1.18,1.24,
+1.23,1.25,1.23,1.20,1.24,1.23,1.25,1.23,1.22,1.27,
+1.27,1.26,1.21,1.27,1.29,1.25,1.22,1.21,1.34,1.24,
+1.26,1.29,1.30,1.34,1.26,1.28,1.29,1.28,1.27,1.27,
+1.26,1.24,1.31,1.24,1.30,1.32,1.32,1.32,1.30,1.30,
+1.31,1.30,1.35,1.34,1.35,1.34,1.32,1.34,1.32,1.33,
+1.15,1.21,1.26,1.35,1.33,1.42,1.46,1.48,1.49,1.58,
+1.59,1.61,1.67,1.71,1.68,1.68,1.80,1.92,1.85,1.90,
+1.97,1.98,1.99,2.02,2.10,2.14,2.10,2.13,2.17,2.24,
+2.30,2.31,2.31,2.40,2.37,2.35,2.34,2.47,2.33,2.42,
+2.53,2.58,2.53,2.57,2.68,2.53,2.66,2.70,2.65,2.72,
+2.67,2.66,2.72,2.83,2.73,2.90,2.85,3.04,2.79,2.92,
+3.03,2.97,3.00,3.10,3.18,3.05,3.07,3.05,3.12,3.22,
+3.13,3.10,3.12,3.06,3.13,3.32,3.29,3.29,3.44,3.34,
+3.36,3.43,3.30,3.46,3.40,3.46,3.48,3.55,3.54,3.55,
+3.53,3.63,3.52,3.54,3.66,3.73,3.76,3.66,3.73,3.43,
+3.58,3.88,3.64,3.61,3.74,3.76,3.82,3.90,3.86,3.97,
+3.89,4.03,4.18,3.95,3.74,3.99,3.82,4.13,4.00,4.05,
+3.93,4.16,4.07,4.13,4.12,4.12,4.23,4.09,4.23,4.28,
+4.09,4.19,4.11,4.28,4.11,4.21,4.14,4.23,4.39,4.29,
+4.19,4.16,4.38,4.18,4.35,4.39,4.37,4.48,4.46,4.29,
+4.58,4.29,4.27,4.43,4.60,4.68,4.57,4.64,4.74,4.73,
+4.50,4.53,4.69,4.64,4.81,4.67,4.53,4.67,4.65,4.89,
+4.68,4.71,4.78,4.68,4.81,4.77,4.76,4.76,4.67,4.74,
+4.81,4.82,4.92,4.70,4.81,5.11,4.83,4.83,5.03,4.92,
+5.05,5.07,5.04,5.11,5.04,5.07,4.88,5.22,5.15,4.94,
+5.30,4.97,5.13,5.14,5.38,5.20,5.10,5.06,5.18,5.30,
+5.17,5.13,5.29,5.26,5.26,5.24,5.07,5.26,5.30,5.42,
+5.33,5.26,5.34,5.34,5.37,5.48,5.39,5.47,5.44,5.34,
+5.37,5.51,5.55,5.47,5.50,5.56,5.56,5.66,5.61,5.54,
+5.98,5.60,5.62,5.63,5.78,5.57,5.66,5.67,5.62,5.63,
+5.79,5.89,5.52,5.69,5.81,5.69,5.62,5.91,5.67,5.90,
+5.80,6.12,5.73,6.01,5.87,5.61,5.90,5.94,5.64,5.86,
+5.86,5.93,5.90,6.01,5.67,5.78,5.97,5.79,6.19,6.11,
+6.16,6.41,6.13,5.84,6.24,5.94,6.07,6.13,6.17,6.13,
+1.07,1.12,1.17,1.18,1.27,1.29,1.38,1.41,1.48,1.47,
+1.45,1.56,1.53,1.57,1.63,1.63,1.71,1.66,1.71,1.68,
+1.73,1.79,1.91,1.94,1.91,1.97,2.04,2.03,2.02,2.02,
+2.14,2.12,2.09,2.16,2.21,2.20,2.25,2.26,2.29,2.35,
+2.39,2.40,2.39,2.36,2.50,2.49,2.43,2.63,2.49,2.61,
+2.50,2.59,2.56,2.60,2.60,2.70,2.61,2.66,2.71,2.81,
+2.70,2.80,2.77,2.79,2.84,2.80,2.82,2.87,2.90,2.97,
+2.95,3.04,3.01,3.05,2.99,3.10,3.05,3.06,3.16,3.23,
+3.12,3.13,3.11,2.99,3.26,3.22,3.19,3.23,3.10,3.27,
+3.25,3.37,3.27,3.46,3.34,3.37,3.35,3.33,3.40,3.43,
+3.47,3.51,3.65,3.50,3.55,3.56,3.56,3.53,3.67,3.55,
+3.55,3.68,3.54,3.74,3.46,3.60,3.72,3.66,3.85,3.74,
+3.60,3.80,3.86,3.73,3.88,3.67,3.79,3.78,3.88,3.95,
+3.82,3.88,3.74,3.83,3.93,3.95,3.93,4.10,4.21,4.02,
+3.96,4.02,4.10,4.14,4.36,4.15,4.14,4.13,4.04,4.21,
+4.03,4.19,4.16,4.20,4.06,4.42,4.35,4.11,4.24,4.34,
+4.24,4.20,4.30,4.18,4.17,4.51,4.33,4.31,4.49,4.25,
+4.29,4.29,4.26,4.31,4.55,4.64,4.56,4.45,4.65,4.65,
+4.64,4.52,4.59,4.60,4.65,4.64,4.66,4.49,4.68,4.63,
+4.76,4.54,4.72,4.60,4.81,4.79,4.61,4.65,4.65,4.57,
+4.84,4.63,4.98,4.69,4.94,4.65,4.76,5.11,4.77,4.97,
+4.70,4.87,4.81,5.04,5.05,4.78,4.85,4.83,4.73,4.90,
+4.83,5.03,5.03,5.15,5.25,5.09,4.95,5.04,4.94,5.04,
+5.03,5.20,5.09,5.10,5.01,5.40,5.09,5.19,5.32,5.19,
+5.20,5.28,5.16,5.19,5.19,5.32,5.30,5.21,5.20,5.31,
+5.27,5.42,5.04,5.32,5.06,5.15,5.37,5.19,5.42,5.39,
+5.36,5.27,5.39,5.58,5.41,5.56,5.40,5.49,5.47,5.51,
+5.68,5.44,5.59,5.57,5.63,5.68,5.57,5.50,5.57,5.44,
+5.65,5.76,5.73,5.57,5.67,5.73,5.59,5.52,5.63,5.68,
+1.03,1.06,1.04,1.11,1.18,1.17,1.26,1.32,1.32,1.33,
+1.39,1.44,1.40,1.46,1.56,1.55,1.57,1.63,1.62,1.72,
+1.71,1.69,1.73,1.78,1.80,1.87,1.90,1.89,1.83,1.93,
+2.00,1.94,2.00,1.98,2.06,2.04,2.06,2.04,2.15,2.12,
+2.19,2.18,2.16,2.18,2.24,2.29,2.25,2.29,2.45,2.32,
+2.41,2.38,2.40,2.38,2.50,2.44,2.43,2.50,2.42,2.50,
+2.55,2.65,2.65,2.48,2.58,2.65,2.68,2.60,2.63,2.59,
+2.86,2.74,2.80,2.74,2.90,2.84,2.88,2.83,2.76,2.91,
+2.84,2.81,2.97,2.95,2.93,2.93,2.90,3.02,3.07,3.08,
+3.08,3.04,3.12,3.11,2.98,3.07,3.13,3.12,3.13,3.23,
+3.17,3.25,3.26,3.38,3.18,3.27,3.48,3.29,3.28,3.50,
+3.37,3.28,3.47,3.36,3.34,3.39,3.43,3.60,3.49,3.48,
+3.43,3.46,3.41,3.48,3.64,3.43,3.70,3.54,3.49,3.71,
+3.73,3.59,3.61,3.56,3.73,3.54,3.80,3.69,3.65,3.66,
+3.70,3.81,3.89,3.65,3.86,3.69,3.73,3.84,3.92,3.79,
+3.85,3.91,3.84,3.82,3.91,3.69,4.05,3.98,3.78,4.04,
+3.75,4.02,3.91,4.07,3.89,4.07,4.14,4.01,4.13,3.97,
+4.19,4.09,3.99,4.16,4.11,4.11,3.95,4.29,4.18,4.20,
+4.25,4.06,4.17,4.27,4.23,4.17,4.35,4.26,4.32,4.25,
+4.23,4.17,4.46,4.51,4.21,4.31,4.35,4.38,4.36,4.32,
+4.57,4.44,4.48,4.40,4.42,4.69,4.52,4.43,4.44,4.40,
+4.52,4.59,4.35,4.49,4.44,4.65,4.53,4.49,4.59,4.40,
+4.76,4.67,4.64,4.59,4.58,4.71,4.60,4.72,4.88,4.58,
+4.62,4.60,4.72,4.63,4.94,4.70,4.75,4.51,4.71,4.87,
+4.89,5.00,4.95,4.83,4.94,4.82,4.81,5.00,4.87,4.89,
+5.08,4.94,4.94,4.97,4.73,4.93,4.85,5.05,4.80,4.88,
+5.19,4.98,4.91,4.88,4.96,5.21,5.04,4.99,4.92,5.10,
+5.11,4.81,5.02,5.23,5.20,5.18,5.07,5.04,5.18,4.82,
+5.09,5.26,5.04,5.05,5.19,5.24,5.28,5.24,5.08,5.12,
+0.90,0.94,0.99,1.01,1.03,1.09,1.13,1.16,1.23,1.21,
+1.25,1.32,1.33,1.32,1.36,1.39,1.42,1.43,1.53,1.51,
+1.58,1.54,1.59,1.62,1.64,1.69,1.65,1.68,1.71,1.76,
+1.76,1.83,1.80,1.86,1.85,1.87,1.92,1.94,1.86,1.93,
+2.03,2.08,1.93,1.96,2.07,2.09,2.11,2.09,2.15,2.12,
+2.19,2.17,2.22,2.23,2.20,2.20,2.21,2.28,2.37,2.34,
+2.32,2.32,2.38,2.43,2.51,2.37,2.49,2.48,2.45,2.54,
+2.59,2.59,2.53,2.58,2.52,2.63,2.64,2.57,2.56,2.57,
+2.65,2.60,2.63,2.65,2.71,2.72,2.73,2.81,2.84,2.77,
+2.76,2.80,2.81,2.94,2.74,2.73,2.90,2.99,2.77,2.98,
+2.98,2.90,2.90,2.94,2.85,2.84,3.04,3.04,3.09,3.02,
+3.02,3.11,3.06,2.87,3.16,3.24,3.16,3.21,3.15,3.17,
+3.14,3.14,3.23,3.19,3.30,3.35,3.42,3.14,3.32,3.24,
+3.34,3.30,3.44,3.41,3.30,3.35,3.37,3.49,3.41,3.41,
+3.38,3.41,3.57,3.55,3.44,3.52,3.38,3.49,3.65,3.45,
+3.41,3.62,3.59,3.47,3.55,3.62,3.54,3.52,3.46,3.53,
+3.54,3.76,3.63,3.72,3.55,3.74,3.62,3.72,3.87,3.68,
+3.74,3.76,3.71,3.80,3.69,3.79,3.80,3.80,4.00,3.84,
+3.80,3.86,3.80,3.96,3.88,3.96,3.91,3.90,4.03,4.03,
+4.01,3.93,4.08,3.96,3.94,4.03,4.08,3.90,4.11,4.00,
+4.07,4.09,3.94,4.10,4.16,3.98,4.01,4.06,4.13,4.19,
+4.15,4.00,4.14,4.13,4.19,4.01,4.27,4.21,4.17,4.25,
+4.31,4.31,4.25,4.21,4.26,4.09,4.27,4.05,4.13,4.38,
+4.15,4.38,4.27,4.34,4.49,4.21,4.39,4.30,4.47,4.31,
+4.47,4.45,4.54,4.47,4.28,4.52,4.42,4.48,4.40,4.46,
+4.53,4.50,4.61,4.51,4.62,4.54,4.56,4.67,4.47,4.69,
+4.70,4.64,4.63,4.79,4.69,4.67,4.69,4.64,4.55,4.57,
+4.59,4.71,4.70,4.58,4.79,4.67,4.64,4.69,4.69,4.76,
+4.76,4.76,4.68,4.72,4.67,4.62,4.79,4.79,4.81,4.95,
+0.86,0.87,0.84,0.93,0.95,0.96,1.03,1.04,1.11,1.13,
+1.13,1.20,1.23,1.22,1.25,1.35,1.29,1.33,1.34,1.39,
+1.41,1.42,1.47,1.44,1.55,1.53,1.54,1.55,1.64,1.61,
+1.65,1.63,1.67,1.69,1.74,1.75,1.75,1.73,1.76,1.75,
+1.78,1.80,1.81,1.91,1.87,1.82,1.94,2.00,1.99,1.94,
+2.04,2.07,2.04,2.03,2.02,2.08,2.10,2.07,2.13,2.07,
+2.13,2.23,2.11,2.14,2.20,2.18,2.22,2.30,2.28,2.21,
+2.20,2.26,2.36,2.31,2.29,2.33,2.31,2.31,2.31,2.44,
+2.49,2.51,2.47,2.46,2.47,2.47,2.49,2.59,2.46,2.61,
+2.55,2.56,2.68,2.63,2.65,2.57,2.72,2.57,2.64,2.53,
+2.59,2.72,2.77,2.77,2.74,2.80,2.76,2.75,2.68,2.81,
+2.74,2.85,2.82,2.76,2.76,2.94,2.85,2.83,2.88,2.98,
+2.86,2.88,2.89,3.06,2.93,2.88,3.06,3.06,2.90,3.03,
+2.91,3.08,3.06,3.01,3.02,2.97,3.10,3.10,3.09,3.03,
+3.09,3.18,3.11,3.07,3.26,3.23,3.25,3.33,3.30,3.14,
+3.25,3.14,3.18,3.26,3.17,3.38,3.17,3.19,3.28,3.33,
+3.28,3.45,3.30,3.34,3.40,3.38,3.25,3.40,3.33,3.39,
+3.56,3.50,3.44,3.46,3.49,3.48,3.35,3.53,3.38,3.51,
+3.56,3.51,3.70,3.49,3.67,3.61,3.52,3.52,3.55,3.51,
+3.63,3.49,3.61,3.58,3.82,3.47,3.68,3.65,3.59,3.73,
+3.70,3.64,3.71,3.55,3.75,3.81,3.85,3.76,3.69,3.66,
+3.74,3.73,3.90,3.82,3.74,3.99,3.75,3.98,3.87,3.79,
+3.86,4.05,3.93,3.92,3.91,3.92,3.95,3.92,3.83,4.02,
+3.90,3.92,3.89,3.90,3.84,4.02,3.97,3.98,4.09,4.02,
+3.93,3.95,4.00,3.99,4.08,4.12,4.02,4.23,4.19,4.05,
+3.96,4.05,4.04,4.22,4.08,4.00,4.27,4.27,4.19,4.21,
+4.11,4.19,4.15,4.28,4.21,4.23,4.18,4.16,4.35,4.27,
+4.23,4.28,4.32,4.09,4.35,4.42,4.25,4.50,4.37,4.27,
+4.52,4.42,4.23,4.41,4.43,4.27,4.42,4.52,4.24,4.35,
+0.75,0.78,0.83,0.86,0.87,0.91,0.92,0.99,1.00,1.01,
+1.05,1.06,1.09,1.14,1.15,1.15,1.25,1.22,1.21,1.24,
+1.27,1.35,1.28,1.39,1.38,1.35,1.37,1.40,1.37,1.46,
+1.47,1.46,1.53,1.57,1.58,1.52,1.60,1.59,1.67,1.58,
+1.64,1.65,1.65,1.67,1.75,1.72,1.71,1.70,1.73,1.72,
+1.78,1.77,1.81,1.89,1.91,1.95,1.89,1.93,1.96,1.97,
+1.99,2.00,1.98,2.05,1.99,2.11,1.98,2.03,2.00,2.06,
+2.04,2.13,2.02,2.17,2.14,2.06,2.21,2.09,2.29,2.22,
+2.20,2.21,2.25,2.25,2.20,2.14,2.31,2.26,2.26,2.21,
+2.34,2.33,2.29,2.37,2.24,2.40,2.30,2.40,2.43,2.54,
+2.42,2.46,2.50,2.49,2.43,2.43,2.49,2.56,2.46,2.61,
+2.49,2.59,2.53,2.55,2.61,2.64,2.56,2.69,2.63,2.58,
+2.64,2.67,2.61,2.64,2.71,2.73,2.81,2.71,2.85,2.69,
+2.84,2.79,2.80,2.73,2.79,2.83,2.77,2.77,2.83,2.93,
+2.86,2.85,2.80,2.83,2.80,2.90,2.97,2.95,2.87,2.99,
+2.99,3.06,2.98,3.08,2.95,3.02,2.95,3.06,3.00,3.03,
+2.92,3.01,2.91,3.12,3.01,3.06,3.03,3.05,3.09,3.17,
+3.06,3.11,3.19,3.08,3.17,3.10,3.10,3.19,3.22,3.10,
+3.24,3.25,3.22,3.26,3.01,3.21,3.14,3.28,3.10,3.19,
+3.19,3.15,3.26,3.34,3.27,3.28,3.42,3.32,3.31,3.28,
+3.39,3.36,3.46,3.41,3.39,3.39,3.30,3.39,3.36,3.46,
+3.50,3.48,3.40,3.48,3.38,3.52,3.52,3.43,3.49,3.48,
+3.60,3.42,3.45,3.57,3.58,3.48,3.41,3.62,3.55,3.68,
+3.66,3.61,3.66,3.69,3.67,3.60,3.55,3.64,3.60,3.51,
+3.55,3.67,3.78,3.65,3.55,3.64,3.58,3.65,3.67,3.73,
+3.69,3.72,3.89,3.74,3.89,3.81,3.64,3.78,3.73,3.82,
+3.89,3.83,3.83,3.80,3.76,3.78,3.82,3.74,4.00,3.87,
+3.80,4.01,3.89,3.75,3.97,3.99,3.92,3.98,3.94,3.97,
+3.93,4.07,3.94,3.92,3.92,4.19,4.06,3.84,3.99,3.95,
+0.69,0.70,0.72,0.75,0.79,0.85,0.84,0.86,0.87,0.92,
+0.95,0.98,1.00,1.03,1.06,1.05,1.08,1.08,1.10,1.14,
+1.22,1.16,1.26,1.17,1.24,1.22,1.32,1.32,1.28,1.29,
+1.30,1.35,1.38,1.44,1.35,1.45,1.43,1.44,1.46,1.49,
+1.48,1.45,1.48,1.53,1.51,1.52,1.56,1.57,1.60,1.62,
+1.72,1.62,1.64,1.67,1.70,1.69,1.63,1.68,1.78,1.69,
+1.71,1.76,1.75,1.81,1.86,1.75,1.79,1.90,1.89,1.87,
+1.91,1.90,1.95,1.89,1.95,1.95,1.98,2.02,1.98,1.89,
+2.01,1.96,2.02,2.02,1.91,2.07,2.08,2.03,2.09,2.05,
+2.10,2.12,2.04,2.18,2.21,2.16,2.15,2.07,2.23,2.19,
+2.08,2.26,2.18,2.26,2.22,2.16,2.27,2.23,2.20,2.19,
+2.28,2.32,2.34,2.29,2.31,2.36,2.31,2.35,2.30,2.32,
+2.40,2.37,2.46,2.44,2.48,2.43,2.48,2.37,2.45,2.56,
+2.46,2.49,2.53,2.50,2.51,2.60,2.46,2.55,2.52,2.66,
+2.54,2.47,2.51,2.58,2.57,2.60,2.61,2.57,2.61,2.70,
+2.69,2.62,2.67,2.70,2.77,2.70,2.67,2.77,2.65,2.68,
+2.80,2.69,2.72,2.72,2.74,2.63,2.80,2.79,2.82,2.82,
+2.87,2.98,2.85,2.81,2.91,2.88,2.88,2.77,2.86,2.87,
+2.91,2.85,2.84,2.93,2.86,2.97,2.91,3.06,3.00,2.99,
+3.06,2.97,2.99,2.94,2.95,2.94,2.94,3.03,3.01,3.11,
+2.98,3.14,3.26,3.06,3.01,3.11,3.09,3.01,3.13,3.10,
+3.12,3.12,3.23,3.11,3.02,3.15,3.24,3.15,3.10,3.16,
+3.11,3.29,3.13,3.28,3.16,3.22,3.20,3.22,3.23,3.24,
+3.29,3.33,3.29,3.18,3.25,3.32,3.27,3.34,3.27,3.32,
+3.29,3.34,3.34,3.37,3.40,3.45,3.28,3.50,3.29,3.46,
+3.46,3.28,3.30,3.52,3.29,3.46,3.21,3.34,3.58,3.37,
+3.57,3.48,3.46,3.55,3.50,3.57,3.56,3.63,3.45,3.47,
+3.39,3.36,3.45,3.49,3.46,3.45,3.39,3.66,3.53,3.57,
+3.47,3.51,3.61,3.61,3.51,3.65,3.53,3.61,3.43,3.58,
+0.63,0.64,0.69,0.73,0.74,0.71,0.75,0.78,0.82,0.86,
+0.83,0.89,0.89,0.95,0.97,0.90,1.01,0.99,1.02,1.06,
+1.05,1.09,1.05,1.09,1.09,1.17,1.16,1.14,1.18,1.20,
+1.22,1.20,1.28,1.22,1.26,1.33,1.26,1.29,1.33,1.30,
+1.39,1.36,1.35,1.37,1.40,1.39,1.43,1.42,1.51,1.42,
+1.45,1.48,1.52,1.49,1.50,1.47,1.50,1.59,1.54,1.59,
+1.57,1.64,1.61,1.66,1.65,1.64,1.67,1.68,1.68,1.67,
+1.71,1.67,1.78,1.67,1.68,1.73,1.75,1.82,1.72,1.78,
+1.83,1.86,1.75,1.80,1.85,1.89,1.90,1.80,1.81,1.92,
+1.88,1.88,1.97,1.98,1.83,1.90,2.00,1.94,1.90,1.96,
+2.03,2.06,1.94,2.02,2.07,2.00,2.00,2.01,2.11,2.14,
+2.09,2.11,2.09,2.09,2.14,2.21,2.17,2.15,2.14,2.10,
+2.08,2.14,2.15,2.20,2.16,2.20,2.18,2.15,2.27,2.20,
+2.35,2.22,2.24,2.20,2.27,2.31,2.20,2.30,2.27,2.37,
+2.24,2.37,2.36,2.32,2.38,2.34,2.30,2.39,2.33,2.45,
+2.32,2.38,2.38,2.51,2.42,2.48,2.45,2.44,2.54,2.49,
+2.59,2.49,2.49,2.49,2.43,2.47,2.41,2.53,2.43,2.48,
+2.49,2.49,2.61,2.55,2.51,2.59,2.53,2.59,2.59,2.61,
+2.66,2.54,2.55,2.56,2.66,2.63,2.65,2.72,2.68,2.71,
+2.70,2.66,2.69,2.80,2.78,2.82,2.72,2.71,2.74,2.76,
+2.78,2.65,2.68,2.70,2.77,2.72,2.86,2.87,2.78,2.83,
+2.79,2.72,2.85,2.85,2.91,2.82,2.91,2.76,2.90,2.88,
+2.79,2.91,2.85,2.90,2.79,2.93,2.93,2.97,2.97,2.98,
+2.83,2.91,2.91,2.99,2.86,2.79,3.05,3.02,3.00,2.98,
+2.89,2.96,3.04,3.01,3.01,2.91,3.17,2.93,3.02,3.05,
+3.15,3.01,2.99,3.04,3.09,3.04,3.13,2.95,3.14,2.98,
+3.05,3.14,2.98,3.05,3.28,3.18,3.17,3.07,3.17,3.26,
+3.13,3.11,3.23,3.08,3.07,3.07,3.17,3.30,3.13,3.25,
+3.25,3.26,3.23,3.27,3.25,3.21,3.20,3.13,3.28,3.13,
+0.56,0.59,0.62,0.63,0.66,0.67,0.67,0.71,0.74,0.78,
+0.76,0.81,0.80,0.85,0.85,0.84,0.88,0.90,0.90,0.93,
+0.96,0.92,0.96,0.99,0.94,0.99,1.04,1.05,1.09,1.07,
+1.14,1.11,1.10,1.12,1.14,1.14,1.16,1.18,1.19,1.24,
+1.22,1.20,1.21,1.22,1.25,1.28,1.33,1.32,1.26,1.30,
+1.35,1.32,1.34,1.35,1.33,1.43,1.35,1.39,1.43,1.37,
+1.39,1.50,1.51,1.42,1.43,1.48,1.51,1.53,1.50,1.53,
+1.52,1.52,1.57,1.54,1.48,1.53,1.64,1.61,1.52,1.58,
+1.59,1.69,1.65,1.69,1.65,1.76,1.69,1.68,1.71,1.69,
+1.66,1.71,1.73,1.75,1.71,1.73,1.81,1.69,1.78,1.78,
+1.80,1.81,1.79,1.84,1.86,1.81,1.80,1.80,1.85,1.86,
+1.87,1.79,1.95,1.86,1.93,1.87,1.97,1.97,1.95,1.96,
+1.93,1.95,1.89,1.94,1.98,1.99,1.97,2.04,2.03,2.09,
+2.01,2.04,2.02,2.13,2.11,2.12,1.99,2.10,2.02,2.07,
+2.15,2.15,2.03,2.02,2.16,2.06,2.21,2.12,2.09,2.14,
+2.21,2.17,2.15,2.24,2.25,2.19,2.09,2.21,2.32,2.14,
+2.24,2.28,2.25,2.20,2.28,2.20,2.33,2.20,2.27,2.31,
+2.41,2.23,2.33,2.35,2.22,2.24,2.30,2.34,2.37,2.38,
+2.45,2.26,2.32,2.43,2.37,2.33,2.42,2.46,2.38,2.34,
+2.53,2.48,2.46,2.40,2.50,2.42,2.51,2.36,2.44,2.46,
+2.55,2.52,2.47,2.51,2.45,2.50,2.46,2.55,2.55,2.57,
+2.55,2.50,2.47,2.58,2.54,2.66,2.59,2.57,2.55,2.61,
+2.50,2.57,2.56,2.65,2.62,2.62,2.65,2.60,2.79,2.60,
+2.58,2.62,2.57,2.68,2.70,2.67,2.69,2.76,2.65,2.72,
+2.72,2.65,2.64,2.68,2.78,2.74,2.87,2.85,2.89,2.71,
+2.73,2.79,2.73,2.70,2.73,2.79,2.82,2.74,2.79,2.81,
+2.77,2.88,2.81,2.79,2.81,2.81,2.97,2.73,2.78,2.91,
+2.84,2.74,2.90,2.87,2.75,2.88,2.81,2.88,2.99,2.88,
+2.83,2.97,2.87,2.97,2.92,2.99,3.00,2.97,2.80,3.07,
+0.51,0.53,0.54,0.57,0.60,0.60,0.61,0.61,0.66,0.68,
+0.73,0.73,0.71,0.80,0.74,0.78,0.77,0.80,0.81,0.82,
+0.82,0.84,0.86,0.89,0.93,0.89,0.90,0.91,0.98,0.98,
+0.96,1.01,0.99,1.00,0.96,1.01,1.07,1.03,1.06,1.04,
+1.07,1.06,1.11,1.12,1.12,1.12,1.17,1.19,1.16,1.21,
+1.15,1.21,1.23,1.22,1.23,1.28,1.26,1.20,1.27,1.30,
+1.27,1.30,1.31,1.25,1.31,1.34,1.34,1.36,1.34,1.38,
+1.39,1.39,1.38,1.46,1.40,1.46,1.43,1.49,1.46,1.44,
+1.45,1.53,1.49,1.47,1.56,1.51,1.48,1.50,1.54,1.53,
+1.52,1.55,1.53,1.61,1.58,1.50,1.60,1.53,1.56,1.59,
+1.65,1.61,1.60,1.67,1.65,1.67,1.67,1.70,1.68,1.65,
+1.64,1.72,1.74,1.68,1.71,1.69,1.72,1.75,1.79,1.71,
+1.75,1.74,1.72,1.78,1.74,1.74,1.82,1.74,1.83,1.86,
+1.78,1.84,1.80,1.85,1.81,1.94,1.92,1.95,1.87,1.89,
+1.89,1.95,1.87,1.83,1.90,1.88,1.90,1.93,1.88,1.95,
+1.97,2.00,2.02,2.02,1.91,1.95,2.01,1.95,1.94,2.01,
+2.01,2.04,2.05,1.98,2.02,2.03,1.91,2.05,2.03,2.13,
+2.02,2.08,1.93,2.13,2.14,2.19,2.04,2.06,2.17,2.09,
+2.21,2.11,2.06,2.01,2.23,2.10,2.13,2.22,2.19,2.17,
+2.15,2.19,2.23,2.17,2.18,2.19,2.10,2.24,2.23,2.18,
+2.27,2.20,2.17,2.27,2.19,2.24,2.31,2.27,2.14,2.29,
+2.39,2.30,2.22,2.31,2.33,2.30,2.32,2.30,2.32,2.38,
+2.27,2.29,2.42,2.22,2.34,2.30,2.39,2.33,2.36,2.39,
+2.42,2.32,2.35,2.33,2.46,2.36,2.42,2.41,2.40,2.43,
+2.43,2.36,2.43,2.42,2.42,2.49,2.35,2.48,2.46,2.45,
+2.51,2.39,2.56,2.43,2.47,2.47,2.42,2.45,2.52,2.56,
+2.60,2.62,2.55,2.55,2.54,2.54,2.51,2.57,2.49,2.53,
+2.60,2.61,2.62,2.53,2.74,2.59,2.58,2.68,2.56,2.56,
+2.60,2.71,2.62,2.55,2.62,2.67,2.59,2.58,2.70,2.59,
+0.44,0.49,0.47,0.49,0.51,0.51,0.53,0.58,0.61,0.60,
+0.65,0.64,0.65,0.64,0.65,0.73,0.72,0.70,0.73,0.71,
+0.79,0.80,0.75,0.82,0.79,0.83,0.79,0.84,0.86,0.88,
+0.86,0.93,0.87,0.90,0.91,0.93,0.91,0.96,0.95,0.96,
+0.98,1.01,0.99,1.05,1.01,1.01,1.05,1.03,1.03,1.05,
+1.07,1.06,1.06,1.03,1.10,1.06,1.14,1.12,1.18,1.18,
+1.13,1.13,1.18,1.13,1.17,1.23,1.25,1.19,1.25,1.26,
+1.24,1.23,1.25,1.27,1.22,1.26,1.29,1.23,1.28,1.26,
+1.26,1.29,1.32,1.32,1.35,1.32,1.38,1.41,1.36,1.33,
+1.34,1.35,1.38,1.37,1.38,1.44,1.46,1.38,1.42,1.44,
+1.37,1.46,1.41,1.46,1.51,1.44,1.49,1.47,1.50,1.52,
+1.56,1.56,1.54,1.57,1.61,1.51,1.54,1.50,1.64,1.59,
+1.60,1.49,1.56,1.57,1.66,1.64,1.61,1.56,1.64,1.64,
+1.63,1.71,1.62,1.68,1.63,1.68,1.68,1.73,1.72,1.64,
+1.67,1.68,1.71,1.74,1.66,1.66,1.68,1.77,1.70,1.70,
+1.74,1.80,1.69,1.82,1.80,1.81,1.78,1.79,1.79,1.80,
+1.72,1.80,1.81,1.83,1.79,1.82,1.76,1.78,1.83,1.83,
+1.88,1.75,1.83,1.82,1.87,1.91,1.93,1.87,1.90,1.89,
+1.89,1.87,1.94,1.93,1.93,1.91,1.92,1.90,2.05,1.85,
+1.95,1.89,1.94,1.92,1.97,2.02,1.97,2.07,1.98,1.97,
+1.95,1.95,1.94,2.04,2.11,2.08,2.05,1.97,2.00,2.05,
+2.02,2.02,2.13,2.05,2.06,2.09,2.05,2.06,2.03,2.07,
+2.03,2.04,2.10,2.11,2.15,2.03,2.09,2.05,2.20,2.16,
+2.15,2.13,2.05,2.16,2.19,2.18,2.20,2.09,2.13,2.15,
+2.09,2.19,2.14,2.16,2.25,2.15,2.21,2.11,2.17,2.26,
+2.15,2.26,2.30,2.22,2.29,2.22,2.27,2.29,2.31,2.25,
+2.26,2.22,2.27,2.27,2.25,2.22,2.28,2.30,2.36,2.34,
+2.28,2.35,2.25,2.33,2.22,2.37,2.33,2.35,2.36,2.34,
+2.33,2.26,2.32,2.33,2.38,2.44,2.37,2.41,2.31,2.32,
+0.41,0.43,0.45,0.45,0.47,0.49,0.51,0.51,0.54,0.53,
+0.61,0.59,0.57,0.60,0.60,0.59,0.60,0.67,0.66,0.68,
+0.65,0.69,0.72,0.70,0.71,0.74,0.73,0.78,0.77,0.82,
+0.78,0.79,0.81,0.80,0.83,0.82,0.83,0.87,0.86,0.90,
+0.91,0.89,0.91,0.92,0.93,0.92,0.90,0.92,0.94,0.94,
+0.91,0.95,0.95,0.95,0.97,0.99,1.01,0.99,1.06,1.00,
+1.05,1.05,1.03,1.04,1.04,1.07,1.09,1.11,1.07,1.13,
+1.09,1.14,1.14,1.14,1.07,1.19,1.17,1.15,1.18,1.18,
+1.21,1.13,1.20,1.13,1.18,1.21,1.23,1.18,1.20,1.24,
+1.24,1.24,1.27,1.28,1.30,1.23,1.23,1.30,1.24,1.28,
+1.27,1.36,1.33,1.32,1.33,1.28,1.30,1.32,1.31,1.35,
+1.33,1.34,1.40,1.33,1.39,1.34,1.38,1.30,1.40,1.42,
+1.39,1.41,1.40,1.41,1.46,1.44,1.47,1.43,1.44,1.45,
+1.44,1.50,1.46,1.44,1.44,1.48,1.47,1.48,1.46,1.53,
+1.53,1.51,1.57,1.46,1.55,1.54,1.52,1.57,1.56,1.54,
+1.55,1.55,1.58,1.61,1.58,1.59,1.56,1.62,1.54,1.62,
+1.55,1.63,1.62,1.61,1.60,1.60,1.67,1.64,1.67,1.66,
+1.69,1.53,1.69,1.67,1.63,1.59,1.63,1.62,1.68,1.70,
+1.73,1.67,1.69,1.74,1.72,1.71,1.72,1.74,1.70,1.78,
+1.73,1.76,1.74,1.67,1.78,1.72,1.74,1.69,1.82,1.83,
+1.80,1.80,1.76,1.81,1.75,1.75,1.80,1.81,1.83,1.82,
+1.89,1.87,1.83,1.77,1.81,1.84,1.84,1.84,1.81,1.87,
+1.82,1.88,1.85,1.82,1.90,1.87,1.84,1.92,1.89,1.88,
+1.91,1.89,1.93,1.92,2.01,1.96,1.92,1.85,1.91,1.98,
+1.98,1.98,1.98,1.92,1.91,1.97,1.96,1.95,1.96,1.92,
+2.05,2.02,1.96,1.99,2.12,2.01,1.89,2.01,1.99,2.07,
+1.94,2.05,2.05,1.99,2.10,2.08,1.98,2.09,1.98,1.99,
+2.02,2.06,2.05,2.03,2.15,2.10,2.16,2.15,2.14,2.06,
+2.10,2.02,2.14,2.13,2.06,2.11,2.19,2.00,2.09,2.16,
+0.33,0.38,0.41,0.45,0.39,0.42,0.43,0.45,0.47,0.52,
+0.47,0.50,0.55,0.53,0.54,0.56,0.54,0.55,0.60,0.62,
+0.60,0.60,0.62,0.63,0.63,0.66,0.65,0.68,0.72,0.68,
+0.72,0.74,0.71,0.73,0.76,0.73,0.74,0.77,0.77,0.77,
+0.77,0.76,0.78,0.82,0.88,0.82,0.79,0.82,0.89,0.80,
+0.83,0.87,0.86,0.85,0.92,0.89,0.88,0.90,0.89,0.88,
+0.87,0.97,0.95,0.94,0.95,0.96,0.96,0.94,1.00,0.96,
+1.01,1.01,1.03,1.07,1.03,1.01,1.09,1.02,1.01,1.05,
+1.00,1.03,1.07,1.05,1.09,1.11,1.04,1.08,1.09,1.12,
+1.12,1.09,1.07,1.06,1.12,1.10,1.12,1.14,1.15,1.19,
+1.17,1.15,1.17,1.19,1.20,1.14,1.22,1.12,1.17,1.18,
+1.24,1.27,1.19,1.16,1.19,1.24,1.27,1.25,1.22,1.26,
+1.25,1.21,1.28,1.33,1.32,1.28,1.31,1.26,1.26,1.31,
+1.26,1.36,1.31,1.28,1.30,1.31,1.33,1.28,1.36,1.31,
+1.36,1.34,1.37,1.32,1.39,1.28,1.42,1.37,1.41,1.39,
+1.43,1.42,1.39,1.43,1.39,1.44,1.45,1.44,1.46,1.44,
+1.46,1.49,1.48,1.44,1.41,1.41,1.46,1.44,1.51,1.45,
+1.44,1.46,1.51,1.46,1.52,1.52,1.52,1.53,1.53,1.44,
+1.51,1.60,1.52,1.51,1.53,1.54,1.53,1.55,1.52,1.59,
+1.58,1.56,1.60,1.58,1.59,1.62,1.61,1.58,1.58,1.56,
+1.59,1.56,1.59,1.55,1.59,1.63,1.57,1.61,1.68,1.60,
+1.65,1.65,1.68,1.62,1.69,1.65,1.64,1.69,1.72,1.70,
+1.68,1.69,1.61,1.66,1.70,1.76,1.73,1.68,1.68,1.75,
+1.70,1.72,1.70,1.68,1.73,1.82,1.73,1.75,1.69,1.74,
+1.78,1.77,1.75,1.78,1.77,1.80,1.70,1.72,1.71,1.76,
+1.80,1.72,1.76,1.77,1.84,1.75,1.83,1.76,1.79,1.76,
+1.75,1.78,1.79,1.78,1.84,1.77,1.88,1.78,1.85,1.80,
+1.85,1.88,1.84,1.86,1.81,1.92,1.83,1.78,1.88,1.90,
+1.95,1.86,1.87,1.87,1.93,1.95,1.91,1.95,1.93,1.95,
+0.31,0.31,0.35,0.37,0.39,0.38,0.39,0.38,0.42,0.43,
+0.44,0.46,0.47,0.52,0.50,0.49,0.54,0.51,0.51,0.55,
+0.56,0.55,0.56,0.56,0.57,0.61,0.59,0.61,0.57,0.61,
+0.61,0.68,0.67,0.60,0.67,0.67,0.69,0.68,0.66,0.66,
+0.69,0.73,0.71,0.74,0.76,0.70,0.72,0.75,0.72,0.75,
+0.79,0.79,0.79,0.75,0.81,0.82,0.82,0.85,0.86,0.84,
+0.82,0.80,0.83,0.85,0.86,0.82,0.89,0.87,0.86,0.86,
+0.88,0.85,0.90,0.90,0.92,0.89,0.89,0.91,0.94,0.94,
+0.92,0.97,0.95,0.95,0.95,0.94,0.99,0.94,0.98,0.96,
+1.02,1.01,0.97,1.02,1.01,1.05,1.00,1.02,1.01,1.03,
+1.00,1.04,1.02,1.07,1.04,0.98,1.07,1.08,1.09,1.08,
+1.06,1.06,1.05,1.14,1.12,1.09,1.05,1.12,1.18,1.17,
+1.08,1.16,1.13,1.14,1.17,1.15,1.16,1.11,1.20,1.20,
+1.22,1.16,1.22,1.16,1.20,1.16,1.20,1.19,1.18,1.21,
+1.19,1.18,1.15,1.17,1.22,1.18,1.26,1.29,1.20,1.23,
+1.26,1.19,1.24,1.29,1.19,1.33,1.29,1.28,1.24,1.26,
+1.29,1.28,1.26,1.25,1.32,1.29,1.29,1.36,1.29,1.35,
+1.33,1.31,1.33,1.36,1.34,1.34,1.34,1.31,1.33,1.37,
+1.42,1.40,1.38,1.40,1.33,1.32,1.35,1.40,1.38,1.42,
+1.30,1.46,1.42,1.35,1.44,1.36,1.44,1.42,1.37,1.43,
+1.43,1.42,1.43,1.45,1.42,1.50,1.47,1.46,1.46,1.51,
+1.42,1.47,1.43,1.46,1.43,1.44,1.50,1.45,1.51,1.54,
+1.45,1.55,1.51,1.53,1.49,1.54,1.48,1.48,1.51,1.51,
+1.52,1.50,1.49,1.53,1.56,1.53,1.57,1.55,1.58,1.51,
+1.54,1.60,1.50,1.55,1.62,1.56,1.49,1.52,1.59,1.62,
+1.61,1.57,1.58,1.59,1.60,1.63,1.66,1.61,1.57,1.61,
+1.70,1.60,1.61,1.61,1.57,1.66,1.64,1.59,1.65,1.59,
+1.57,1.60,1.72,1.61,1.69,1.59,1.63,1.67,1.70,1.62,
+1.68,1.70,1.69,1.72,1.78,1.71,1.60,1.64,1.75,1.70,
+0.27,0.30,0.29,0.35,0.33,0.37,0.34,0.36,0.39,0.37,
+0.41,0.43,0.42,0.40,0.46,0.43,0.44,0.46,0.46,0.47,
+0.46,0.47,0.50,0.50,0.50,0.52,0.54,0.51,0.53,0.53,
+0.53,0.58,0.57,0.56,0.59,0.60,0.64,0.60,0.63,0.63,
+0.60,0.61,0.68,0.67,0.65,0.65,0.68,0.66,0.67,0.66,
+0.69,0.70,0.70,0.71,0.73,0.70,0.74,0.73,0.73,0.74,
+0.75,0.78,0.78,0.75,0.76,0.78,0.76,0.79,0.78,0.80,
+0.80,0.78,0.77,0.78,0.82,0.82,0.80,0.79,0.80,0.88,
+0.83,0.86,0.85,0.84,0.79,0.86,0.87,0.85,0.88,0.87,
+0.86,0.86,0.85,0.91,0.88,0.91,0.92,0.93,0.86,0.87,
+0.92,0.94,0.96,0.93,0.95,0.91,0.96,0.97,0.96,0.92,
+0.91,0.92,0.98,0.99,0.99,0.94,0.93,0.99,1.06,0.99,
+0.99,1.01,0.98,1.04,1.03,1.05,1.04,1.04,1.03,1.02,
+1.06,1.05,1.06,1.08,1.05,1.08,1.08,1.06,1.08,1.10,
+1.09,1.09,1.09,1.09,1.03,1.06,1.04,1.13,1.11,1.07,
+1.11,1.10,1.11,1.09,1.11,1.11,1.15,1.21,1.14,1.12,
+1.17,1.13,1.16,1.15,1.16,1.16,1.15,1.17,1.14,1.21,
+1.16,1.16,1.19,1.17,1.21,1.19,1.26,1.22,1.24,1.16,
+1.22,1.19,1.22,1.24,1.20,1.25,1.21,1.20,1.22,1.26,
+1.22,1.18,1.20,1.28,1.24,1.28,1.24,1.22,1.29,1.28,
+1.25,1.25,1.26,1.25,1.30,1.27,1.24,1.28,1.32,1.30,
+1.38,1.35,1.29,1.30,1.39,1.34,1.27,1.30,1.32,1.32,
+1.33,1.34,1.34,1.33,1.37,1.37,1.32,1.35,1.34,1.36,
+1.41,1.39,1.39,1.33,1.35,1.38,1.37,1.40,1.39,1.43,
+1.32,1.37,1.32,1.49,1.39,1.37,1.43,1.41,1.42,1.43,
+1.37,1.35,1.39,1.41,1.43,1.40,1.47,1.45,1.45,1.43,
+1.45,1.43,1.50,1.50,1.45,1.46,1.46,1.49,1.51,1.49,
+1.47,1.51,1.48,1.49,1.51,1.44,1.52,1.40,1.45,1.48,
+1.50,1.57,1.52,1.49,1.50,1.51,1.52,1.53,1.50,1.54,
+1.18,1.22,1.27,1.31,1.36,1.43,1.47,1.47,1.53,1.52,
+1.66,1.65,1.69,1.69,1.78,1.80,1.80,1.86,1.97,1.95,
+1.90,1.95,2.03,2.05,2.07,2.10,2.18,2.21,2.17,2.22,
+2.22,2.29,2.46,2.38,2.37,2.44,2.42,2.44,2.44,2.50,
+2.57,2.49,2.51,2.57,2.63,2.63,2.70,2.69,2.69,2.77,
+2.82,2.73,2.84,2.86,2.84,2.82,2.87,2.85,2.93,3.01,
+2.94,3.03,3.00,3.10,3.02,3.09,3.13,3.12,3.24,3.13,
+3.30,3.21,3.24,3.28,3.41,3.25,3.37,3.23,3.33,3.35,
+3.34,3.38,3.54,3.41,3.40,3.45,3.57,3.58,3.45,3.41,
+3.57,3.43,3.59,3.73,3.52,3.59,3.64,3.50,3.74,3.68,
+3.74,3.57,3.61,3.71,3.78,3.83,3.72,3.81,3.78,3.81,
+3.67,3.80,3.87,3.96,3.96,4.03,4.12,3.97,3.99,4.10,
+4.11,4.13,4.10,3.96,3.98,4.08,4.29,4.11,4.19,4.03,
+4.22,4.08,4.38,4.24,4.23,4.19,4.41,4.31,4.30,4.34,
+4.47,4.45,4.43,4.31,4.51,4.33,4.45,4.48,4.40,4.38,
+4.48,4.42,4.58,4.52,4.57,4.65,4.43,4.47,4.60,4.49,
+4.35,4.68,4.66,4.69,4.85,4.81,4.78,4.77,4.65,4.79,
+4.90,4.76,4.73,4.88,4.90,4.89,4.61,4.85,4.97,4.98,
+4.93,5.00,4.90,4.85,5.00,4.84,4.86,4.94,4.95,4.65,
+4.87,5.01,5.17,5.11,5.02,4.82,5.15,5.13,5.15,5.13,
+5.21,5.38,5.00,5.22,5.14,5.13,5.21,5.12,5.23,5.25,
+5.09,5.14,5.39,5.50,5.27,5.25,5.33,5.29,5.44,5.49,
+5.36,5.53,5.29,5.74,5.26,5.57,5.41,5.59,5.58,5.37,
+5.41,5.39,5.66,5.59,5.45,5.61,5.67,5.60,5.61,5.85,
+5.72,5.69,5.57,5.49,5.75,5.65,5.81,5.84,5.61,5.94,
+5.74,5.72,5.90,5.80,5.64,5.90,5.72,5.67,6.14,5.62,
+5.84,5.67,5.85,5.81,5.72,5.92,5.92,5.96,6.12,5.98,
+5.90,5.88,5.88,5.96,6.06,6.26,6.09,6.02,5.85,6.15,
+5.89,6.03,5.99,6.02,6.08,6.42,6.13,6.09,6.13,6.17,
+1.09,1.12,1.20,1.24,1.27,1.34,1.35,1.40,1.46,1.46,
+1.45,1.55,1.52,1.63,1.63,1.70,1.68,1.79,1.85,1.80,
+1.79,1.94,1.98,1.94,1.92,2.01,2.01,2.10,1.98,2.21,
+2.13,2.15,2.11,2.13,2.26,2.12,2.29,2.21,2.28,2.35,
+2.32,2.32,2.31,2.47,2.42,2.53,2.53,2.58,2.62,2.59,
+2.65,2.62,2.72,2.71,2.71,2.71,2.77,2.74,2.83,2.89,
+2.67,2.82,2.80,2.84,2.91,2.96,2.87,2.94,2.96,3.02,
+3.12,3.01,3.01,3.06,2.96,3.06,3.18,3.09,3.17,3.23,
+3.27,3.22,3.29,3.16,3.20,3.33,3.28,3.21,3.32,3.30,
+3.53,3.28,3.33,3.45,3.40,3.51,3.37,3.53,3.53,3.34,
+3.55,3.43,3.57,3.59,3.48,3.50,3.59,3.47,3.67,3.47,
+3.62,3.71,3.67,3.82,3.73,3.73,3.66,3.71,3.84,4.00,
+3.69,3.87,3.74,3.74,3.98,3.89,3.96,3.92,3.89,3.89,
+3.88,4.04,4.00,4.04,4.05,3.95,4.16,4.16,3.98,3.96,
+4.12,4.08,4.08,4.16,4.28,4.09,4.24,4.02,4.14,4.18,
+4.10,4.30,4.21,4.23,4.07,4.43,4.26,4.10,4.44,4.26,
+4.19,4.29,4.31,4.36,4.51,4.49,4.53,4.42,4.40,4.54,
+4.48,4.44,4.54,4.55,4.50,4.53,4.52,4.53,4.49,4.60,
+4.78,4.53,4.60,4.49,4.75,4.57,4.88,4.75,4.75,4.79,
+4.77,4.73,4.96,4.54,4.87,4.96,4.87,4.68,4.83,5.00,
+4.79,4.69,4.86,4.88,4.99,4.83,5.03,4.93,4.82,5.11,
+5.04,4.82,4.84,4.95,4.94,5.06,4.97,5.03,5.01,4.95,
+5.21,5.09,5.12,5.10,5.12,5.11,5.22,5.27,5.33,5.32,
+5.17,5.18,5.13,5.27,5.20,5.40,5.30,5.42,5.07,5.21,
+5.31,5.22,5.39,5.07,5.30,5.24,5.28,5.26,5.36,5.18,
+5.21,5.33,5.36,5.42,5.31,5.31,5.35,5.55,5.37,5.43,
+5.53,5.28,5.38,5.50,5.60,5.48,5.57,5.58,5.51,5.52,
+5.58,5.78,5.62,5.74,5.83,5.79,5.63,5.41,5.48,5.80,
+5.81,5.74,5.50,5.83,5.64,5.84,5.84,5.97,5.77,5.77,
+1.02,1.03,1.09,1.14,1.23,1.26,1.26,1.31,1.31,1.38,
+1.43,1.43,1.50,1.50,1.62,1.60,1.65,1.68,1.68,1.69,
+1.77,1.70,1.79,1.73,1.83,1.88,1.89,1.87,1.99,1.98,
+1.96,2.03,2.00,2.10,2.04,2.14,2.18,2.14,2.17,2.27,
+2.14,2.23,2.28,2.38,2.32,2.34,2.31,2.40,2.39,2.35,
+2.45,2.43,2.53,2.51,2.49,2.57,2.52,2.58,2.56,2.62,
+2.58,2.68,2.62,2.65,2.71,2.77,2.77,2.85,2.60,2.82,
+2.73,2.91,2.82,2.87,2.87,2.96,2.98,2.91,2.92,2.84,
+2.88,3.02,2.88,2.98,3.01,3.06,3.06,3.07,2.98,3.09,
+3.21,3.27,3.14,3.06,3.20,3.22,3.26,3.17,3.21,3.17,
+3.14,3.21,3.23,3.28,3.25,3.32,3.30,3.36,3.36,3.43,
+3.35,3.50,3.37,3.49,3.38,3.48,3.51,3.50,3.46,3.47,
+3.62,3.70,3.62,3.61,3.48,3.64,3.66,3.78,3.68,3.65,
+3.68,3.56,3.47,3.87,3.72,3.86,3.72,3.57,3.76,3.73,
+3.78,3.99,3.80,3.84,3.81,3.84,3.99,3.87,3.97,4.03,
+3.88,3.95,4.00,4.07,3.90,3.87,4.03,3.94,4.03,3.99,
+3.98,4.10,4.06,4.08,4.13,4.28,4.01,4.03,3.88,4.15,
+4.08,4.07,4.43,4.20,4.30,4.28,4.26,4.22,4.24,4.39,
+4.25,4.23,4.12,4.29,4.48,4.25,4.31,4.16,4.42,4.33,
+4.53,4.38,4.54,4.58,4.39,4.38,4.48,4.52,4.56,4.27,
+4.65,4.60,4.52,4.67,4.69,4.46,4.49,4.81,4.62,4.43,
+4.62,4.67,4.89,4.52,4.55,4.68,4.72,4.56,4.68,4.61,
+4.78,4.70,4.79,4.89,4.82,4.85,4.83,4.84,4.92,4.90,
+4.66,4.57,5.13,4.86,4.86,4.79,4.93,4.74,4.98,5.19,
+4.95,4.94,4.81,5.05,4.94,5.05,5.15,5.00,5.04,4.76,
+5.13,5.06,5.05,4.93,5.13,4.95,5.14,5.01,5.08,5.13,
+4.90,5.00,4.93,5.01,5.03,4.96,5.22,5.01,5.31,5.28,
+5.19,5.25,5.32,5.35,5.36,5.37,5.46,5.39,5.27,5.40,
+5.22,5.44,5.02,5.32,5.36,5.21,5.24,5.29,5.37,5.27,
+0.91,1.01,1.02,1.05,1.11,1.12,1.18,1.16,1.22,1.24,
+1.25,1.39,1.37,1.44,1.43,1.39,1.46,1.49,1.57,1.54,
+1.54,1.59,1.68,1.70,1.71,1.70,1.77,1.76,1.71,1.84,
+1.81,1.86,1.84,1.94,1.95,1.97,1.96,2.08,2.03,1.95,
+2.16,2.06,2.00,2.08,2.12,2.15,2.22,2.15,2.16,2.26,
+2.26,2.25,2.33,2.34,2.36,2.20,2.26,2.31,2.42,2.40,
+2.28,2.34,2.47,2.45,2.50,2.54,2.42,2.51,2.62,2.55,
+2.46,2.61,2.52,2.66,2.66,2.67,2.69,2.71,2.83,2.67,
+2.72,2.74,2.67,2.88,2.75,2.82,2.92,2.82,2.91,2.86,
+2.89,2.96,2.83,2.72,3.04,2.86,2.98,3.01,2.99,3.15,
+3.01,3.13,2.97,2.96,3.15,3.06,3.26,3.03,3.15,3.18,
+3.11,3.14,3.06,3.01,3.12,3.12,3.38,3.29,3.27,3.38,
+3.22,3.40,3.28,3.39,3.16,3.27,3.28,3.52,3.53,3.48,
+3.52,3.26,3.46,3.38,3.49,3.39,3.47,3.53,3.44,3.45,
+3.43,3.46,3.41,3.67,3.58,3.61,3.71,3.69,3.59,3.51,
+3.70,3.45,3.59,3.65,3.68,3.73,3.71,3.73,3.82,3.82,
+3.73,3.86,3.80,3.90,3.78,3.91,3.78,3.98,3.76,3.84,
+3.84,3.99,3.91,3.93,3.85,3.95,4.03,3.85,4.20,3.93,
+3.94,3.96,3.89,3.86,3.90,4.15,3.98,3.99,4.11,4.04,
+4.02,4.18,4.05,4.10,4.20,4.22,4.12,4.06,4.13,4.00,
+4.09,4.11,4.15,4.20,4.39,4.17,4.27,4.08,4.51,4.43,
+4.18,4.33,4.02,4.27,4.14,4.38,4.42,4.33,4.27,4.56,
+4.43,4.64,4.22,4.40,4.32,4.61,4.38,4.37,4.46,4.48,
+4.60,4.55,4.54,4.45,4.69,4.55,4.49,4.47,4.44,4.48,
+4.71,4.44,4.38,4.49,4.45,4.49,4.69,4.58,4.64,4.77,
+4.66,4.67,4.69,4.77,4.62,4.60,4.71,4.67,4.80,4.73,
+4.56,4.69,4.83,4.78,4.64,4.71,4.70,4.80,4.69,4.98,
+4.81,4.93,5.05,4.86,4.96,5.13,4.87,4.88,4.91,5.07,
+5.08,5.11,5.05,4.93,4.92,4.90,4.97,5.04,4.98,4.89,
+0.92,0.94,0.94,0.98,1.02,1.03,1.09,1.15,1.12,1.18,
+1.17,1.23,1.28,1.28,1.31,1.38,1.36,1.42,1.39,1.44,
+1.47,1.48,1.53,1.56,1.55,1.61,1.59,1.64,1.65,1.64,
+1.63,1.75,1.74,1.77,1.72,1.87,1.85,1.79,1.79,1.88,
+1.94,1.97,1.93,1.97,1.95,1.96,2.05,2.00,2.01,1.99,
+2.06,2.08,2.11,2.02,2.12,2.19,2.29,2.19,2.18,2.22,
+2.23,2.25,2.25,2.23,2.34,2.35,2.32,2.36,2.35,2.40,
+2.37,2.42,2.44,2.53,2.45,2.45,2.49,2.43,2.48,2.38,
+2.60,2.51,2.59,2.52,2.60,2.74,2.61,2.62,2.71,2.68,
+2.55,2.74,2.75,2.71,2.66,2.77,2.77,2.64,2.77,2.70,
+2.79,2.74,2.84,2.79,2.85,2.85,2.85,2.88,2.83,2.97,
+2.96,2.88,2.97,3.01,3.11,3.14,2.91,3.09,2.96,2.95,
+3.01,3.07,2.87,3.04,3.12,3.20,3.12,3.16,3.10,3.06,
+3.11,3.13,3.17,3.13,3.19,3.24,3.15,3.22,3.11,3.26,
+3.22,3.29,3.30,3.35,3.22,3.30,3.29,3.37,3.45,3.28,
+3.46,3.35,3.33,3.41,3.29,3.33,3.44,3.38,3.38,3.51,
+3.37,3.24,3.54,3.49,3.59,3.45,3.42,3.55,3.56,3.55,
+3.49,3.68,3.62,3.67,3.67,3.53,3.53,3.64,3.60,3.60,
+3.61,3.77,3.63,3.69,3.64,3.78,3.78,3.78,3.68,3.78,
+3.77,3.78,3.84,3.77,3.73,3.67,3.86,3.88,3.86,3.88,
+3.90,3.91,3.95,3.91,3.76,3.89,3.92,3.96,3.95,4.02,
+3.85,3.94,4.00,3.84,3.74,3.98,4.15,3.97,4.04,4.22,
+4.06,4.11,4.19,4.00,4.04,4.03,4.03,3.89,4.16,4.14,
+4.17,4.27,4.08,4.19,3.99,4.32,4.28,4.18,4.01,4.15,
+4.30,4.30,4.22,4.10,4.35,4.25,4.08,4.15,4.30,4.27,
+4.29,4.17,4.40,4.36,4.44,4.48,4.34,4.42,4.22,4.36,
+4.37,4.41,4.42,4.26,4.49,4.34,4.36,4.36,4.34,4.35,
+4.53,4.71,4.50,4.65,4.63,4.46,4.48,4.51,4.50,4.63,
+4.57,4.50,4.35,4.54,4.62,4.55,4.70,4.40,4.56,4.56,
+0.75,0.81,0.88,0.89,0.93,0.93,0.99,1.01,1.07,1.07,
+1.08,1.13,1.15,1.18,1.18,1.21,1.31,1.33,1.31,1.32,
+1.40,1.40,1.42,1.43,1.37,1.46,1.47,1.53,1.49,1.57,
+1.54,1.52,1.53,1.66,1.57,1.61,1.74,1.69,1.74,1.73,
+1.72,1.75,1.77,1.85,1.84,1.83,1.83,1.89,1.87,1.88,
+1.86,1.90,1.94,1.86,1.91,1.93,2.08,1.98,2.03,2.00,
+2.08,2.07,2.10,2.05,2.08,2.11,2.09,2.11,2.09,2.15,
+2.11,2.18,2.20,2.17,2.20,2.25,2.31,2.24,2.31,2.25,
+2.27,2.33,2.38,2.37,2.38,2.37,2.51,2.39,2.30,2.37,
+2.41,2.44,2.46,2.52,2.45,2.58,2.54,2.40,2.52,2.62,
+2.56,2.59,2.56,2.67,2.59,2.45,2.72,2.76,2.63,2.58,
+2.64,2.66,2.69,2.67,2.79,2.65,2.74,2.80,2.73,2.88,
+2.79,2.80,2.82,2.84,2.75,2.86,2.95,2.86,2.94,2.88,
+2.89,2.98,2.90,2.91,2.86,2.78,2.88,3.04,3.00,2.98,
+2.95,2.92,3.03,2.95,3.06,2.95,3.14,3.02,3.12,3.06,
+3.10,3.20,3.09,2.96,3.08,3.08,3.14,3.09,3.18,3.21,
+3.18,3.18,3.32,3.24,3.24,3.21,3.18,3.20,3.17,3.32,
+3.18,3.23,3.22,3.22,3.21,3.38,3.28,3.34,3.36,3.39,
+3.34,3.40,3.31,3.28,3.29,3.48,3.56,3.34,3.61,3.36,
+3.45,3.42,3.42,3.40,3.65,3.47,3.54,3.48,3.53,3.52,
+3.45,3.58,3.45,3.47,3.56,3.65,3.61,3.60,3.56,3.67,
+3.45,3.63,3.57,3.58,3.51,3.60,3.66,3.66,3.75,3.74,
+3.57,3.58,3.62,3.72,3.67,3.75,3.72,3.79,3.74,3.78,
+3.75,3.83,3.73,3.73,3.89,3.91,3.78,3.85,3.81,3.74,
+3.91,3.93,3.83,3.93,3.94,3.66,3.81,3.87,4.02,4.03,
+4.11,3.80,3.98,3.92,3.99,3.97,4.15,3.97,4.13,4.03,
+4.03,4.03,3.97,4.03,4.04,4.10,4.00,3.84,3.89,3.92,
+4.05,4.15,4.01,4.05,4.07,3.95,4.06,4.15,4.30,4.24,
+4.06,4.16,4.32,4.05,4.15,4.28,4.04,4.07,4.04,4.35,
+0.74,0.76,0.78,0.85,0.83,0.86,0.90,0.93,0.99,0.99,
+1.05,1.05,1.06,1.10,1.10,1.13,1.15,1.11,1.18,1.16,
+1.21,1.24,1.27,1.26,1.40,1.31,1.32,1.38,1.39,1.44,
+1.45,1.45,1.45,1.45,1.44,1.58,1.42,1.56,1.53,1.60,
+1.59,1.60,1.57,1.62,1.56,1.69,1.71,1.74,1.72,1.76,
+1.73,1.76,1.75,1.77,1.79,1.77,1.86,1.85,1.85,1.83,
+1.92,1.89,1.86,1.95,1.93,1.98,1.89,1.98,1.94,2.02,
+2.04,1.97,1.96,1.99,2.07,2.02,2.17,2.13,2.05,2.05,
+2.16,2.09,2.16,2.25,2.13,2.22,2.18,2.22,2.26,2.33,
+2.24,2.26,2.28,2.15,2.30,2.34,2.29,2.30,2.44,2.28,
+2.39,2.35,2.39,2.45,2.32,2.37,2.38,2.31,2.42,2.42,
+2.41,2.42,2.54,2.57,2.45,2.45,2.52,2.52,2.38,2.53,
+2.68,2.57,2.54,2.61,2.54,2.52,2.56,2.67,2.54,2.59,
+2.61,2.63,2.62,2.63,2.68,2.62,2.77,2.60,2.69,2.71,
+2.84,2.72,2.70,2.80,2.79,2.72,2.83,2.91,2.77,2.74,
+2.81,2.85,2.75,2.78,2.97,2.87,2.88,2.77,2.84,2.84,
+2.84,2.76,2.89,3.02,3.00,2.90,3.01,2.99,3.06,2.98,
+2.98,3.10,3.08,2.95,3.12,3.09,3.06,3.09,2.96,3.23,
+3.04,3.14,3.08,2.98,3.03,3.03,3.21,3.09,3.13,3.21,
+3.16,3.17,3.14,3.19,3.02,3.29,3.25,3.25,3.28,3.19,
+3.33,3.23,3.21,3.31,3.29,3.33,3.26,3.24,3.28,3.31,
+3.46,3.31,3.15,3.25,3.45,3.36,3.32,3.26,3.43,3.34,
+3.31,3.37,3.30,3.52,3.43,3.37,3.43,3.38,3.35,3.40,
+3.54,3.48,3.54,3.55,3.54,3.60,3.42,3.53,3.51,3.44,
+3.42,3.48,3.58,3.56,3.65,3.60,3.55,3.63,3.58,3.62,
+3.59,3.52,3.60,3.60,3.55,3.53,3.75,3.62,3.74,3.76,
+3.61,3.65,3.71,3.69,3.62,3.73,3.68,3.67,3.69,3.69,
+3.76,3.66,3.69,3.71,3.80,3.71,3.78,3.75,3.73,3.81,
+3.93,3.88,3.86,3.79,3.68,3.91,3.83,3.83,3.81,3.72,
+0.67,0.70,0.71,0.73,0.79,0.82,0.83,0.84,0.86,0.90,
+0.86,0.93,0.98,0.94,0.99,1.00,1.05,1.10,1.05,1.05,
+1.09,1.17,1.16,1.16,1.18,1.23,1.21,1.22,1.28,1.30,
+1.26,1.28,1.31,1.30,1.34,1.37,1.40,1.40,1.41,1.44,
+1.43,1.42,1.49,1.44,1.47,1.48,1.50,1.55,1.56,1.55,
+1.60,1.53,1.58,1.63,1.57,1.66,1.64,1.65,1.69,1.70,
+1.67,1.65,1.78,1.80,1.82,1.72,1.81,1.82,1.80,1.80,
+1.79,1.87,1.85,1.86,1.83,1.89,1.92,1.91,1.89,1.93,
+1.91,2.04,1.96,1.87,1.96,1.96,2.00,2.04,2.01,1.97,
+2.03,2.01,1.99,2.13,2.15,2.07,2.09,2.09,2.12,2.20,
+2.15,2.05,2.12,2.08,2.21,2.19,2.22,2.16,2.17,2.24,
+2.21,2.24,2.29,2.19,2.23,2.34,2.36,2.29,2.28,2.33,
+2.30,2.38,2.32,2.25,2.32,2.36,2.39,2.37,2.31,2.39,
+2.38,2.38,2.38,2.44,2.53,2.37,2.27,2.50,2.53,2.44,
+2.56,2.51,2.38,2.43,2.42,2.52,2.46,2.54,2.48,2.42,
+2.52,2.52,2.59,2.64,2.60,2.65,2.65,2.62,2.60,2.73,
+2.60,2.48,2.72,2.58,2.70,2.69,2.59,2.75,2.72,2.84,
+2.72,2.70,2.80,2.88,2.87,2.84,2.74,2.85,2.72,2.94,
+2.76,2.82,2.91,2.70,2.89,2.82,2.88,2.78,2.92,2.92,
+3.00,2.90,2.90,2.75,2.91,2.88,2.85,2.97,2.91,2.98,
+2.86,2.97,2.92,3.06,2.99,3.04,2.80,2.99,2.90,3.03,
+3.02,3.08,2.95,3.18,2.99,3.06,3.02,2.96,3.09,3.10,
+3.02,3.00,3.00,3.14,3.21,3.16,3.11,3.23,3.25,3.07,
+3.22,3.25,3.15,3.03,3.16,3.16,3.25,3.23,3.21,3.20,
+3.21,3.19,3.20,3.18,3.17,3.27,3.24,3.15,3.32,3.32,
+3.30,3.29,3.25,3.31,3.31,3.25,3.25,3.19,3.41,3.29,
+3.29,3.35,3.27,3.36,3.51,3.25,3.37,3.24,3.39,3.28,
+3.47,3.38,3.35,3.51,3.27,3.45,3.42,3.36,3.48,3.43,
+3.35,3.41,3.60,3.47,3.46,3.55,3.54,3.68,3.45,3.48,
+0.56,0.59,0.67,0.68,0.70,0.72,0.78,0.83,0.77,0.82,
+0.86,0.83,0.92,0.86,0.88,0.92,0.96,0.98,1.01,1.02,
+1.05,1.00,1.03,1.05,1.07,1.04,1.11,1.10,1.17,1.16,
+1.21,1.20,1.19,1.24,1.24,1.19,1.27,1.27,1.29,1.26,
+1.31,1.33,1.32,1.33,1.35,1.34,1.38,1.35,1.47,1.46,
+1.41,1.48,1.43,1.45,1.47,1.51,1.47,1.54,1.51,1.51,
+1.54,1.58,1.54,1.51,1.54,1.66,1.56,1.67,1.66,1.66,
+1.67,1.68,1.66,1.68,1.69,1.67,1.64,1.77,1.73,1.72,
+1.74,1.83,1.74,1.78,1.87,1.81,1.87,1.85,1.83,1.85,
+1.79,1.82,1.89,1.84,1.90,1.88,1.90,1.90,1.91,1.81,
+1.98,1.95,1.89,1.96,1.94,2.00,2.01,1.95,1.96,2.05,
+1.96,2.04,2.17,2.01,2.03,2.03,2.03,2.08,2.10,2.17,
+2.05,2.07,2.14,2.09,2.11,2.13,2.14,2.11,2.08,2.28,
+2.12,2.22,2.18,2.17,2.19,2.29,2.10,2.24,2.26,2.34,
+2.26,2.28,2.35,2.21,2.39,2.32,2.35,2.25,2.33,2.35,
+2.29,2.29,2.25,2.35,2.28,2.41,2.53,2.43,2.40,2.41,
+2.45,2.49,2.46,2.43,2.44,2.50,2.38,2.48,2.45,2.57,
+2.53,2.50,2.55,2.51,2.46,2.56,2.48,2.39,2.43,2.58,
+2.55,2.48,2.50,2.46,2.64,2.63,2.61,2.62,2.52,2.74,
+2.64,2.59,2.66,2.64,2.61,2.75,2.74,2.73,2.63,2.64,
+2.66,2.65,2.64,2.65,2.70,2.65,2.78,2.66,2.69,2.76,
+2.73,2.82,2.65,2.76,2.73,2.69,2.82,2.70,2.78,2.85,
+2.80,2.87,2.77,2.81,2.90,2.82,2.80,2.82,2.89,2.77,
+2.83,2.77,2.91,3.05,2.88,2.98,2.96,3.04,2.83,2.79,
+2.89,2.86,2.97,2.93,2.99,2.93,2.82,2.91,3.00,2.93,
+2.99,2.91,2.98,2.77,3.11,2.95,2.99,3.01,2.96,2.97,
+3.03,3.14,3.09,2.98,3.10,3.08,3.06,3.08,3.00,3.09,
+3.03,3.13,3.11,3.23,3.03,3.13,3.18,3.17,3.11,3.14,
+3.14,3.02,3.22,3.22,3.19,3.18,3.17,3.17,3.09,3.10,
+0.53,0.54,0.59,0.61,0.65,0.67,0.66,0.70,0.76,0.73,
+0.74,0.77,0.78,0.80,0.85,0.85,0.83,0.87,0.95,0.89,
+0.92,0.96,0.95,0.95,0.96,1.03,0.98,1.08,1.02,1.06,
+1.04,1.05,1.03,1.14,1.11,1.17,1.11,1.13,1.14,1.20,
+1.19,1.16,1.18,1.25,1.23,1.20,1.25,1.21,1.28,1.28,
+1.28,1.26,1.37,1.29,1.37,1.39,1.34,1.38,1.41,1.39,
+1.34,1.43,1.41,1.40,1.48,1.43,1.48,1.48,1.52,1.45,
+1.44,1.48,1.53,1.53,1.54,1.63,1.58,1.60,1.56,1.56,
+1.57,1.58,1.57,1.61,1.56,1.63,1.66,1.66,1.65,1.65,
+1.70,1.67,1.72,1.65,1.71,1.71,1.69,1.71,1.69,1.75,
+1.75,1.70,1.72,1.83,1.85,1.77,1.78,1.78,1.80,1.83,
+1.79,1.86,1.81,1.80,1.87,1.90,1.84,1.93,1.88,1.87,
+1.87,1.92,1.95,1.90,1.98,1.95,1.92,1.93,1.99,1.98,
+1.98,2.03,2.01,2.01,2.01,2.05,2.12,2.01,2.11,2.12,
+2.05,2.06,2.12,1.99,1.99,2.06,2.07,2.08,2.07,2.09,
+2.05,2.10,2.13,2.18,2.06,2.07,2.20,2.09,2.13,2.14,
+2.16,2.17,2.21,2.15,2.16,2.31,2.17,2.21,2.22,2.27,
+2.29,2.30,2.21,2.31,2.17,2.31,2.31,2.25,2.31,2.23,
+2.26,2.30,2.38,2.26,2.30,2.30,2.35,2.37,2.34,2.41,
+2.37,2.34,2.36,2.32,2.35,2.42,2.35,2.38,2.41,2.37,
+2.39,2.36,2.46,2.42,2.52,2.45,2.57,2.48,2.49,2.50,
+2.48,2.47,2.52,2.45,2.40,2.50,2.49,2.56,2.57,2.56,
+2.50,2.64,2.57,2.65,2.57,2.56,2.57,2.65,2.52,2.54,
+2.48,2.64,2.56,2.51,2.71,2.60,2.64,2.64,2.67,2.64,
+2.66,2.61,2.66,2.64,2.67,2.75,2.64,2.65,2.76,2.77,
+2.72,2.56,2.79,2.75,2.62,2.72,2.64,2.63,2.79,2.71,
+2.75,2.67,2.76,2.76,2.78,2.67,2.86,2.76,2.72,2.78,
+2.85,2.77,2.75,2.83,2.86,2.81,2.84,2.83,2.84,2.74,
+2.81,2.83,2.83,2.74,2.86,2.98,2.88,2.91,2.92,2.79,
+0.49,0.52,0.53,0.57,0.59,0.59,0.62,0.65,0.62,0.63,
+0.69,0.70,0.74,0.74,0.75,0.78,0.76,0.79,0.78,0.80,
+0.83,0.83,0.88,0.89,0.89,0.95,0.90,0.91,0.92,0.93,
+0.95,0.96,1.01,0.97,1.00,1.03,1.03,1.01,1.13,1.08,
+1.08,1.05,1.12,1.11,1.12,1.10,1.11,1.10,1.18,1.19,
+1.21,1.18,1.21,1.21,1.22,1.19,1.25,1.20,1.23,1.29,
+1.31,1.35,1.29,1.32,1.29,1.29,1.26,1.33,1.34,1.36,
+1.30,1.35,1.33,1.32,1.42,1.40,1.44,1.44,1.42,1.39,
+1.43,1.43,1.47,1.50,1.42,1.39,1.50,1.45,1.48,1.54,
+1.53,1.52,1.56,1.55,1.57,1.65,1.59,1.53,1.59,1.60,
+1.62,1.57,1.55,1.68,1.59,1.58,1.59,1.68,1.63,1.68,
+1.69,1.60,1.68,1.59,1.65,1.71,1.74,1.75,1.72,1.66,
+1.69,1.71,1.72,1.79,1.81,1.78,1.76,1.78,1.74,1.75,
+1.84,1.71,1.78,1.81,1.77,1.87,1.87,1.86,1.81,1.84,
+1.78,1.80,1.87,1.86,1.87,1.88,1.81,1.87,1.97,1.92,
+1.84,1.94,1.99,1.90,1.88,1.92,1.92,1.98,1.96,1.95,
+2.01,1.90,1.92,1.95,1.95,1.96,2.03,1.95,2.06,2.07,
+1.96,2.09,2.01,1.97,2.08,2.12,2.09,2.01,2.11,2.09,
+2.11,2.05,2.14,2.22,2.03,2.13,2.14,2.09,2.15,2.03,
+2.10,2.17,2.21,2.13,2.21,2.19,2.17,2.18,2.10,2.29,
+2.07,2.20,2.23,2.18,2.17,2.15,2.11,2.22,2.21,2.29,
+2.30,2.28,2.21,2.22,2.27,2.24,2.33,2.19,2.27,2.32,
+2.27,2.19,2.29,2.37,2.29,2.25,2.30,2.21,2.33,2.34,
+2.35,2.41,2.32,2.33,2.27,2.32,2.40,2.33,2.35,2.48,
+2.43,2.41,2.31,2.46,2.43,2.49,2.39,2.39,2.48,2.35,
+2.40,2.43,2.39,2.50,2.51,2.51,2.52,2.51,2.43,2.52,
+2.58,2.54,2.44,2.50,2.48,2.43,2.52,2.58,2.59,2.51,
+2.51,2.47,2.60,2.50,2.57,2.52,2.60,2.50,2.63,2.61,
+2.56,2.63,2.52,2.60,2.72,2.59,2.59,2.56,2.65,2.67,
+0.42,0.49,0.47,0.48,0.52,0.52,0.56,0.58,0.61,0.59,
+0.61,0.63,0.66,0.68,0.70,0.69,0.70,0.74,0.73,0.76,
+0.76,0.73,0.77,0.77,0.79,0.81,0.81,0.80,0.84,0.83,
+0.86,0.91,0.90,0.89,0.92,0.92,0.96,0.94,0.90,0.97,
+0.98,0.99,0.95,0.98,1.01,1.02,1.03,1.03,0.99,1.05,
+1.05,1.09,1.08,1.07,1.11,1.09,1.12,1.07,1.14,1.15,
+1.14,1.17,1.16,1.14,1.20,1.16,1.19,1.18,1.20,1.20,
+1.23,1.25,1.27,1.23,1.29,1.23,1.24,1.29,1.27,1.28,
+1.33,1.32,1.42,1.28,1.35,1.36,1.35,1.35,1.36,1.36,
+1.34,1.38,1.31,1.37,1.41,1.49,1.38,1.37,1.51,1.45,
+1.43,1.44,1.47,1.43,1.33,1.44,1.49,1.52,1.50,1.52,
+1.43,1.48,1.50,1.56,1.46,1.55,1.52,1.55,1.52,1.55,
+1.56,1.60,1.56,1.59,1.51,1.53,1.57,1.70,1.58,1.66,
+1.62,1.61,1.57,1.59,1.63,1.63,1.65,1.69,1.67,1.67,
+1.73,1.64,1.66,1.67,1.74,1.68,1.69,1.64,1.73,1.67,
+1.67,1.71,1.64,1.72,1.69,1.77,1.77,1.75,1.83,1.84,
+1.72,1.78,1.83,1.82,1.89,1.82,1.78,1.76,1.77,1.87,
+1.85,1.78,1.87,1.83,1.83,1.90,1.86,1.85,1.85,1.76,
+1.86,1.91,1.91,2.03,1.94,1.93,1.96,1.92,1.96,1.92,
+1.94,1.94,1.99,1.93,1.98,1.97,1.91,1.96,2.00,1.97,
+1.98,1.97,2.07,2.00,1.99,2.04,1.99,1.97,1.95,1.99,
+2.03,2.01,1.99,2.02,1.99,2.08,2.03,2.03,2.05,2.08,
+2.12,2.09,2.10,2.13,2.10,2.14,2.10,2.09,2.11,2.15,
+2.14,2.05,2.07,2.15,2.17,2.18,2.16,2.14,2.13,2.15,
+2.24,2.16,2.17,2.19,2.14,2.26,2.22,2.21,2.24,2.21,
+2.25,2.17,2.16,2.22,2.27,2.20,2.28,2.29,2.17,2.20,
+2.25,2.31,2.41,2.31,2.30,2.30,2.26,2.24,2.22,2.28,
+2.32,2.24,2.23,2.29,2.29,2.34,2.33,2.22,2.31,2.34,
+2.26,2.38,2.28,2.26,2.28,2.28,2.28,2.36,2.39,2.40,
+0.40,0.40,0.42,0.46,0.47,0.51,0.51,0.51,0.54,0.55,
+0.57,0.56,0.60,0.61,0.58,0.60,0.63,0.65,0.68,0.70,
+0.69,0.65,0.71,0.72,0.70,0.71,0.73,0.74,0.76,0.80,
+0.79,0.81,0.79,0.80,0.86,0.87,0.83,0.84,0.88,0.90,
+0.89,0.90,0.88,0.87,0.88,0.89,0.95,0.91,0.94,0.98,
+0.92,0.94,0.97,0.97,1.05,0.98,1.03,1.07,1.00,1.02,
+1.04,1.05,1.08,1.05,1.08,1.05,1.05,1.08,1.09,1.06,
+1.09,1.12,1.06,1.09,1.15,1.15,1.14,1.16,1.19,1.22,
+1.19,1.15,1.18,1.17,1.17,1.20,1.18,1.26,1.25,1.21,
+1.22,1.20,1.21,1.25,1.29,1.27,1.24,1.28,1.29,1.27,
+1.35,1.28,1.30,1.29,1.32,1.29,1.31,1.30,1.29,1.33,
+1.35,1.28,1.36,1.36,1.41,1.37,1.45,1.41,1.41,1.43,
+1.39,1.42,1.40,1.42,1.40,1.41,1.50,1.46,1.50,1.47,
+1.46,1.50,1.43,1.49,1.47,1.51,1.48,1.51,1.46,1.49,
+1.51,1.51,1.53,1.45,1.48,1.55,1.55,1.48,1.48,1.51,
+1.54,1.54,1.50,1.64,1.62,1.61,1.59,1.61,1.57,1.60,
+1.59,1.65,1.63,1.60,1.59,1.64,1.68,1.65,1.59,1.64,
+1.71,1.66,1.69,1.63,1.67,1.75,1.72,1.60,1.72,1.71,
+1.73,1.72,1.67,1.73,1.74,1.71,1.70,1.75,1.72,1.73,
+1.74,1.65,1.72,1.74,1.75,1.80,1.75,1.80,1.75,1.77,
+1.80,1.84,1.84,1.73,1.80,1.87,1.86,1.82,1.75,1.79,
+1.76,1.81,1.86,1.77,1.85,1.89,1.87,1.92,1.79,1.72,
+1.82,1.85,1.86,1.88,1.84,1.89,1.96,1.94,1.88,1.89,
+1.87,1.91,1.92,1.92,1.87,1.91,1.90,1.93,2.01,1.97,
+1.92,1.95,1.96,1.92,1.96,1.91,1.96,1.99,1.98,1.94,
+1.93,2.05,2.01,2.01,1.97,1.93,1.98,1.97,2.01,2.02,
+2.01,2.08,1.98,1.99,1.93,2.05,2.02,2.05,1.91,2.04,
+2.03,2.03,1.96,2.03,1.97,2.06,2.01,2.07,2.03,2.12,
+2.14,2.02,2.07,2.10,2.06,2.19,2.12,2.15,2.12,2.13,
+0.35,0.37,0.43,0.40,0.40,0.45,0.46,0.46,0.50,0.47,
+0.50,0.48,0.52,0.55,0.55,0.55,0.59,0.58,0.58,0.61,
+0.62,0.63,0.60,0.68,0.66,0.65,0.72,0.66,0.69,0.71,
+0.68,0.74,0.72,0.77,0.73,0.73,0.74,0.78,0.79,0.82,
+0.76,0.78,0.81,0.79,0.79,0.78,0.85,0.78,0.87,0.86,
+0.88,0.91,0.85,0.86,0.88,0.89,0.88,0.91,0.95,0.93,
+0.91,0.95,0.92,0.93,0.97,0.98,0.91,0.96,1.02,0.98,
+1.00,1.00,1.03,1.01,1.02,1.03,1.07,1.00,1.03,0.99,
+1.08,1.02,1.02,1.05,1.02,1.08,1.07,1.05,1.10,1.15,
+1.12,1.09,1.12,1.07,1.13,1.11,1.11,1.21,1.15,1.17,
+1.12,1.16,1.18,1.22,1.19,1.23,1.19,1.22,1.22,1.17,
+1.22,1.21,1.21,1.25,1.20,1.28,1.28,1.26,1.25,1.28,
+1.23,1.25,1.30,1.25,1.27,1.30,1.32,1.24,1.30,1.32,
+1.32,1.32,1.32,1.34,1.31,1.36,1.32,1.36,1.37,1.38,
+1.35,1.37,1.36,1.37,1.35,1.35,1.39,1.35,1.36,1.45,
+1.42,1.43,1.35,1.38,1.37,1.44,1.45,1.47,1.41,1.45,
+1.42,1.50,1.45,1.43,1.46,1.46,1.46,1.47,1.50,1.44,
+1.50,1.52,1.51,1.49,1.50,1.49,1.53,1.51,1.45,1.50,
+1.56,1.58,1.50,1.53,1.54,1.50,1.52,1.58,1.55,1.52,
+1.60,1.58,1.56,1.57,1.54,1.61,1.55,1.57,1.63,1.56,
+1.60,1.53,1.55,1.57,1.65,1.63,1.61,1.57,1.69,1.64,
+1.61,1.62,1.59,1.63,1.72,1.69,1.69,1.74,1.67,1.68,
+1.64,1.71,1.65,1.72,1.76,1.75,1.69,1.75,1.75,1.70,
+1.69,1.69,1.75,1.75,1.68,1.66,1.71,1.72,1.77,1.74,
+1.72,1.71,1.76,1.76,1.78,1.78,1.79,1.77,1.86,1.81,
+1.70,1.77,1.79,1.78,1.77,1.77,1.81,1.86,1.84,1.89,
+1.82,1.79,1.87,1.90,1.90,1.84,1.81,1.78,1.85,1.81,
+1.81,1.82,1.90,1.82,1.81,1.86,2.00,1.88,1.93,1.85,
+1.89,1.88,1.89,1.95,1.88,1.92,1.90,1.95,1.86,1.91,
+0.30,0.36,0.37,0.39,0.37,0.39,0.42,0.43,0.40,0.46,
+0.43,0.44,0.47,0.48,0.47,0.51,0.52,0.49,0.53,0.55,
+0.57,0.54,0.54,0.56,0.58,0.59,0.62,0.58,0.61,0.63,
+0.61,0.64,0.65,0.69,0.62,0.68,0.70,0.68,0.71,0.67,
+0.68,0.70,0.74,0.76,0.75,0.74,0.79,0.77,0.75,0.78,
+0.79,0.79,0.78,0.77,0.76,0.78,0.83,0.81,0.85,0.84,
+0.85,0.82,0.82,0.86,0.85,0.83,0.86,0.92,0.89,0.88,
+0.87,0.90,0.89,0.89,0.95,0.94,0.92,0.94,0.90,0.95,
+0.92,0.95,1.01,0.93,0.92,0.98,0.95,1.00,1.02,1.00,
+0.99,0.97,1.00,0.98,1.02,1.01,1.00,1.07,1.07,1.06,
+1.04,1.03,1.05,1.04,1.04,1.09,1.09,1.06,1.04,1.07,
+1.10,1.11,1.12,1.11,1.13,1.18,1.14,1.10,1.13,1.12,
+1.10,1.12,1.17,1.11,1.13,1.15,1.20,1.18,1.13,1.19,
+1.21,1.14,1.21,1.19,1.23,1.21,1.17,1.19,1.21,1.23,
+1.23,1.27,1.27,1.22,1.24,1.19,1.19,1.24,1.22,1.23,
+1.25,1.28,1.31,1.27,1.30,1.28,1.22,1.29,1.28,1.30,
+1.30,1.36,1.30,1.30,1.33,1.25,1.31,1.31,1.28,1.35,
+1.34,1.29,1.33,1.35,1.32,1.35,1.39,1.35,1.33,1.31,
+1.34,1.37,1.38,1.35,1.39,1.37,1.37,1.44,1.38,1.40,
+1.35,1.42,1.41,1.48,1.37,1.39,1.47,1.34,1.46,1.50,
+1.41,1.43,1.49,1.44,1.39,1.44,1.51,1.50,1.49,1.47,
+1.45,1.52,1.47,1.49,1.46,1.49,1.49,1.50,1.53,1.51,
+1.51,1.52,1.57,1.51,1.58,1.49,1.55,1.50,1.55,1.49,
+1.52,1.56,1.55,1.54,1.51,1.53,1.54,1.56,1.55,1.55,
+1.50,1.55,1.58,1.67,1.57,1.65,1.60,1.67,1.56,1.59,
+1.57,1.64,1.60,1.62,1.60,1.67,1.61,1.66,1.64,1.61,
+1.59,1.58,1.64,1.65,1.68,1.69,1.68,1.73,1.65,1.59,
+1.75,1.69,1.64,1.69,1.71,1.69,1.66,1.68,1.73,1.65,
+1.68,1.69,1.67,1.62,1.75,1.69,1.73,1.75,1.74,1.72,
+1.17,1.22,1.24,1.32,1.35,1.43,1.51,1.54,1.53,1.67,
+1.63,1.67,1.70,1.69,1.79,1.81,1.84,1.90,1.95,1.96,
+1.94,2.01,1.99,2.15,2.07,2.16,2.19,2.15,2.19,2.24,
+2.27,2.31,2.36,2.40,2.32,2.42,2.50,2.52,2.54,2.48,
+2.48,2.52,2.54,2.66,2.70,2.73,2.64,2.58,2.76,2.81,
+2.77,2.84,2.80,2.91,2.95,2.85,2.96,2.94,2.96,2.92,
+2.92,3.09,2.91,3.11,3.10,3.08,3.18,3.10,3.15,3.26,
+3.12,3.24,3.28,3.26,3.17,3.36,3.29,3.20,3.37,3.41,
+3.50,3.45,3.15,3.47,3.54,3.48,3.61,3.59,3.59,3.62,
+3.55,3.54,3.67,3.59,3.66,3.60,3.74,3.73,3.88,3.70,
+3.69,3.83,3.69,3.58,3.86,3.80,3.67,3.93,3.81,3.83,
+3.87,3.85,3.96,3.88,3.98,4.15,3.90,3.93,4.01,4.03,
+4.01,4.20,4.10,4.17,4.25,4.13,4.18,4.15,4.33,4.18,
+4.10,4.04,4.28,4.28,4.24,4.32,4.27,4.20,4.25,4.42,
+4.27,4.43,4.30,4.39,4.42,4.51,4.41,4.45,4.61,4.45,
+4.56,4.60,4.56,4.55,4.76,4.51,4.73,4.73,4.61,4.70,
+4.72,4.87,4.80,4.68,4.58,4.55,4.78,4.70,4.74,4.84,
+4.99,4.80,4.69,4.75,4.91,4.81,4.69,4.71,4.84,5.00,
+5.08,4.93,5.05,4.81,4.91,5.06,4.87,5.09,5.05,5.08,
+4.92,5.10,5.02,5.04,5.15,5.09,5.22,5.04,5.36,5.34,
+5.25,5.03,5.24,5.05,5.19,5.32,5.23,5.36,5.34,5.19,
+5.26,5.36,5.25,5.35,5.14,5.27,5.34,5.33,5.43,5.47,
+5.58,5.46,5.34,5.42,5.48,5.33,5.39,5.21,5.48,5.65,
+5.67,5.47,5.46,5.48,5.47,5.49,5.45,5.63,5.68,5.79,
+5.55,5.61,5.70,5.73,5.71,5.61,5.72,5.63,5.73,5.60,
+6.03,5.87,5.67,5.75,5.83,5.94,5.59,5.84,5.84,5.81,
+5.84,5.72,5.62,5.58,6.05,5.91,5.84,6.00,6.16,5.97,
+5.99,6.10,5.69,5.94,6.22,6.08,6.00,6.07,5.95,6.30,
+5.81,5.99,6.09,6.30,6.06,6.10,6.23,6.09,6.29,6.37,
+1.12,1.12,1.21,1.23,1.29,1.37,1.32,1.41,1.46,1.51,
+1.55,1.58,1.61,1.55,1.66,1.72,1.71,1.80,1.81,1.86,
+1.85,1.86,1.98,1.88,1.97,1.98,1.98,2.02,2.15,2.09,
+2.11,2.20,2.20,2.26,2.28,2.35,2.24,2.37,2.29,2.39,
+2.41,2.36,2.37,2.48,2.43,2.54,2.57,2.49,2.62,2.62,
+2.73,2.61,2.59,2.70,2.78,2.64,2.77,2.72,2.74,2.85,
+2.85,2.95,2.97,2.80,2.91,3.03,2.88,2.89,2.92,3.00,
+3.01,3.03,2.94,3.00,3.26,3.14,3.16,3.12,3.17,3.18,
+3.23,3.22,3.22,3.37,3.01,3.27,3.42,3.30,3.28,3.53,
+3.56,3.39,3.35,3.56,3.45,3.50,3.52,3.57,3.66,3.48,
+3.55,3.62,3.63,3.52,3.78,3.58,3.73,3.79,3.73,3.65,
+3.71,3.57,3.75,3.71,3.85,3.74,3.78,3.83,3.64,3.83,
+3.85,3.77,3.90,3.83,3.83,3.93,4.03,3.95,4.03,4.08,
+4.13,3.94,4.02,4.24,4.01,4.18,4.01,4.13,4.06,4.05,
+4.30,4.18,4.09,4.14,4.02,4.33,4.09,4.34,4.27,4.24,
+4.21,4.39,4.14,4.31,4.36,4.54,4.24,4.38,4.28,4.32,
+4.42,4.36,4.53,4.44,4.57,4.56,4.61,4.37,4.61,4.39,
+4.46,4.56,4.47,4.51,4.34,4.74,4.68,4.56,4.53,4.78,
+4.70,4.91,4.79,4.79,4.62,4.71,4.68,4.56,4.82,4.72,
+4.56,4.74,4.88,4.66,4.80,4.77,4.66,4.69,4.93,4.82,
+4.71,4.92,5.14,5.09,4.82,4.94,5.27,5.00,4.93,5.03,
+4.96,5.12,5.13,4.98,5.13,4.84,4.98,5.30,5.17,5.04,
+5.16,5.18,5.13,5.23,5.11,5.44,5.07,5.16,5.23,5.38,
+5.35,5.10,5.09,5.41,5.39,5.43,5.57,5.44,5.32,5.32,
+5.22,5.42,5.48,5.31,5.33,5.36,5.46,5.45,5.56,5.47,
+5.38,5.56,5.43,5.57,5.35,5.41,5.33,5.36,5.27,5.53,
+5.60,5.51,5.69,5.52,5.66,5.86,5.48,5.66,5.37,5.37,
+5.52,5.68,5.81,5.68,5.60,5.62,5.84,5.74,5.90,5.77,
+5.80,5.75,5.62,5.95,5.71,5.75,5.95,5.75,5.75,5.77,
+1.06,1.05,1.11,1.21,1.21,1.23,1.32,1.31,1.36,1.44,
+1.43,1.46,1.45,1.51,1.61,1.55,1.58,1.68,1.66,1.64,
+1.69,1.79,1.80,1.84,1.92,1.93,1.97,1.97,1.97,2.03,
+2.10,2.07,2.09,2.07,2.07,2.04,2.16,2.19,2.28,2.28,
+2.29,2.28,2.24,2.32,2.34,2.38,2.43,2.40,2.39,2.38,
+2.45,2.51,2.57,2.59,2.54,2.62,2.64,2.58,2.74,2.63,
+2.70,2.76,2.76,2.79,2.65,2.89,2.84,2.80,2.84,2.94,
+2.79,2.93,2.93,2.92,2.89,2.93,3.05,2.96,3.11,3.04,
+2.97,3.14,3.16,2.94,3.09,3.15,3.04,3.17,3.21,3.20,
+3.24,3.11,3.29,3.10,3.25,3.27,3.27,3.21,3.30,3.25,
+3.31,3.23,3.35,3.28,3.45,3.48,3.51,3.51,3.31,3.40,
+3.50,3.51,3.52,3.47,3.53,3.53,3.50,3.68,3.42,3.59,
+3.61,3.59,3.68,3.58,3.71,3.76,3.67,3.57,3.56,3.79,
+3.77,3.81,3.81,3.74,3.79,3.93,3.82,3.95,3.94,4.03,
+3.90,3.95,3.97,3.89,4.00,3.97,3.84,4.03,3.87,4.00,
+4.04,4.15,4.16,4.07,3.97,3.97,4.14,4.01,4.19,4.08,
+4.10,4.26,4.14,4.03,4.21,4.25,4.36,4.17,4.28,4.15,
+4.29,4.24,4.35,4.47,4.34,4.26,4.38,4.34,4.38,4.21,
+4.36,4.48,4.36,4.52,4.39,4.36,4.38,4.51,4.47,4.48,
+4.54,4.52,4.69,4.60,4.56,4.55,4.42,4.40,4.60,4.56,
+4.52,4.38,4.69,4.86,4.64,4.63,4.64,4.79,4.82,4.76,
+4.69,4.66,4.62,4.93,4.63,4.85,4.76,4.97,4.97,4.72,
+4.76,4.84,4.92,4.82,4.85,4.99,4.86,4.89,4.90,4.83,
+4.98,4.97,4.92,4.96,4.85,5.07,4.97,5.20,4.93,5.02,
+4.92,5.24,4.92,4.92,4.96,5.01,5.33,5.18,5.02,5.17,
+5.07,5.18,5.23,5.12,5.02,5.46,5.12,5.24,5.14,5.24,
+5.23,5.26,5.25,5.13,5.19,5.31,5.17,5.24,5.38,5.29,
+5.28,5.43,5.49,5.23,5.29,5.24,5.50,5.25,5.36,5.38,
+5.35,5.50,5.40,5.48,5.40,5.81,5.63,5.56,5.39,5.59,
+0.98,1.00,1.05,1.15,1.10,1.19,1.26,1.25,1.29,1.31,
+1.40,1.38,1.37,1.43,1.47,1.52,1.52,1.55,1.58,1.58,
+1.64,1.67,1.70,1.75,1.79,1.69,1.81,1.84,1.77,1.86,
+1.90,1.90,1.89,1.95,1.89,2.02,2.00,2.04,2.04,2.15,
+2.12,2.16,2.24,2.10,2.19,2.28,2.21,2.25,2.30,2.31,
+2.32,2.33,2.33,2.42,2.42,2.45,2.34,2.42,2.57,2.46,
+2.48,2.48,2.63,2.62,2.52,2.61,2.58,2.53,2.60,2.65,
+2.63,2.72,2.70,2.64,2.78,2.74,2.83,2.83,2.91,2.83,
+2.79,2.84,2.67,2.83,2.91,2.93,2.86,2.81,2.95,3.01,
+3.07,3.00,3.07,3.02,3.09,3.14,3.03,3.01,3.09,3.06,
+3.22,3.10,3.21,3.20,3.26,3.18,3.18,3.06,3.18,3.21,
+3.37,3.27,3.31,3.25,3.24,3.29,3.34,3.32,3.45,3.33,
+3.29,3.37,3.54,3.38,3.44,3.37,3.46,3.38,3.38,3.42,
+3.54,3.48,3.55,3.55,3.64,3.60,3.53,3.57,3.74,3.42,
+3.62,3.45,3.66,3.79,3.79,3.63,3.90,3.74,3.64,3.66,
+3.84,3.73,3.77,3.84,3.83,3.90,3.78,3.87,4.00,3.85,
+3.96,4.03,3.81,3.99,3.86,3.90,3.92,3.79,4.03,3.95,
+4.07,4.02,4.11,4.02,4.05,4.11,4.04,4.00,4.17,4.08,
+4.08,4.22,4.09,3.92,4.13,4.22,4.23,4.13,4.23,4.15,
+4.15,4.11,4.28,4.14,4.33,4.27,4.29,4.05,4.33,4.44,
+4.20,4.22,4.16,4.25,4.31,4.30,4.41,4.36,4.46,4.49,
+4.41,4.20,4.52,4.40,4.44,4.41,4.56,4.53,4.55,4.34,
+4.44,4.55,4.48,4.49,4.42,4.62,4.66,4.41,4.65,4.74,
+4.54,4.71,4.68,4.60,4.64,4.64,4.65,4.58,4.57,4.52,
+4.59,4.62,4.76,4.74,5.03,4.73,4.60,4.84,4.78,4.78,
+4.66,4.98,4.64,4.78,4.72,4.87,4.89,4.97,4.92,4.89,
+4.77,4.75,4.70,4.79,4.92,4.92,4.96,5.02,4.98,4.78,
+4.89,5.09,4.86,4.86,5.04,4.90,4.96,5.05,5.01,5.05,
+5.17,5.17,5.09,5.04,5.01,5.17,5.23,5.06,5.26,5.04,
+0.86,0.94,0.99,1.01,1.02,1.11,1.13,1.14,1.19,1.23,
+1.23,1.28,1.33,1.38,1.37,1.37,1.45,1.50,1.47,1.52,
+1.50,1.50,1.55,1.66,1.66,1.65,1.65,1.66,1.70,1.71,
+1.71,1.79,1.73,1.89,1.86,1.94,1.89,1.89,1.87,1.96,
+1.88,1.95,2.07,2.03,2.03,2.05,2.06,2.08,2.08,2.10,
+2.15,2.22,2.18,2.21,2.21,2.28,2.33,2.21,2.22,2.35,
+2.33,2.31,2.38,2.33,2.38,2.49,2.38,2.38,2.52,2.46,
+2.38,2.48,2.56,2.57,2.63,2.53,2.55,2.61,2.55,2.59,
+2.73,2.65,2.78,2.64,2.63,2.77,2.74,2.71,2.79,2.81,
+2.65,2.91,2.80,2.79,2.81,2.76,2.80,2.93,2.92,2.83,
+2.91,3.02,3.04,2.89,2.93,3.00,3.02,2.98,2.98,3.10,
+2.98,3.14,3.04,3.12,3.20,3.15,3.27,3.11,3.26,3.22,
+3.08,3.07,3.15,3.25,3.16,3.23,3.20,3.24,3.28,3.31,
+3.35,3.35,3.42,3.31,3.21,3.24,3.33,3.23,3.53,3.52,
+3.45,3.44,3.44,3.34,3.39,3.43,3.35,3.35,3.38,3.53,
+3.36,3.53,3.40,3.60,3.64,3.53,3.47,3.46,3.57,3.60,
+3.72,3.56,3.68,3.64,3.63,3.56,3.76,3.64,3.52,3.59,
+3.64,3.50,3.85,3.79,3.74,3.72,3.62,3.80,3.90,3.70,
+3.83,3.91,3.89,3.72,3.73,3.80,3.82,3.88,3.91,3.85,
+3.82,3.91,3.81,4.00,3.94,3.99,3.92,4.00,4.16,3.97,
+4.08,4.02,4.09,4.02,3.95,3.99,4.24,4.09,4.03,4.22,
+4.25,4.28,4.08,4.08,4.07,4.17,3.98,4.15,4.25,4.13,
+4.07,4.06,4.21,4.25,4.37,4.42,4.28,4.31,4.22,4.41,
+4.26,4.12,4.27,4.42,4.42,4.25,4.21,4.47,4.37,4.25,
+4.41,4.26,4.49,4.35,4.36,4.50,4.55,4.50,4.51,4.54,
+4.57,4.49,4.36,4.49,4.58,4.51,4.58,4.43,4.68,4.48,
+4.54,4.63,4.68,4.54,4.50,4.59,4.53,4.54,4.71,4.61,
+4.58,4.65,4.72,4.76,4.79,4.73,4.57,4.62,4.87,4.57,
+4.86,4.73,4.85,4.72,4.68,4.71,4.88,4.75,4.58,4.90,
+0.84,0.86,0.92,0.91,0.99,1.01,1.06,1.05,1.13,1.09,
+1.15,1.23,1.15,1.25,1.24,1.27,1.30,1.32,1.33,1.42,
+1.41,1.43,1.49,1.45,1.56,1.53,1.55,1.56,1.52,1.60,
+1.57,1.65,1.70,1.67,1.73,1.76,1.72,1.77,1.79,1.75,
+1.79,1.84,1.91,1.89,1.91,1.91,1.92,1.87,1.99,1.94,
+1.97,2.05,2.02,1.94,2.13,2.08,2.16,2.07,2.08,2.08,
+2.20,2.14,2.18,2.17,2.10,2.21,2.20,2.22,2.24,2.30,
+2.24,2.27,2.29,2.24,2.42,2.35,2.32,2.41,2.41,2.32,
+2.51,2.43,2.48,2.52,2.45,2.56,2.50,2.56,2.61,2.47,
+2.59,2.76,2.66,2.65,2.56,2.68,2.56,2.59,2.62,2.63,
+2.76,2.74,2.76,2.72,2.70,2.71,2.77,2.84,2.79,2.76,
+2.76,2.84,2.78,2.82,2.81,2.90,2.95,2.89,2.89,2.87,
+2.94,2.79,2.91,2.91,2.92,2.87,2.92,2.93,3.02,3.26,
+3.07,3.15,2.92,3.07,3.04,3.08,3.21,3.10,3.13,3.14,
+3.12,3.08,3.17,3.25,3.08,3.05,3.33,3.20,3.16,3.21,
+3.15,3.25,3.30,3.21,3.28,3.36,3.12,3.23,3.42,3.29,
+3.39,3.52,3.29,3.43,3.46,3.44,3.36,3.40,3.30,3.37,
+3.48,3.44,3.35,3.47,3.57,3.31,3.54,3.40,3.47,3.40,
+3.49,3.38,3.63,3.52,3.49,3.54,3.57,3.59,3.54,3.56,
+3.57,3.65,3.59,3.63,3.47,3.73,3.66,3.62,3.65,3.64,
+3.82,3.75,3.56,3.71,3.68,3.62,3.77,3.74,3.81,3.78,
+3.80,3.70,3.76,3.80,3.78,3.91,3.79,3.88,3.86,3.79,
+3.88,3.90,3.89,3.93,3.98,3.88,3.87,4.01,3.87,3.89,
+3.92,3.85,4.02,3.85,3.99,3.89,4.04,4.04,4.07,3.84,
+4.08,4.00,4.02,4.20,4.14,4.06,4.11,4.13,4.20,4.25,
+4.23,4.14,4.21,4.13,4.21,4.17,4.09,4.04,4.17,4.15,
+4.13,4.05,4.14,4.19,4.09,4.19,4.26,4.25,4.24,4.34,
+4.29,4.33,4.27,4.38,4.19,4.32,4.37,4.36,4.23,4.46,
+4.37,4.24,4.16,4.56,4.43,4.49,4.32,4.44,4.51,4.34,
+0.79,0.81,0.87,0.88,0.91,0.92,0.98,0.96,1.01,1.05,
+1.07,1.05,1.11,1.17,1.16,1.17,1.25,1.24,1.23,1.27,
+1.32,1.36,1.33,1.35,1.39,1.45,1.38,1.44,1.50,1.58,
+1.49,1.52,1.57,1.58,1.59,1.49,1.62,1.63,1.64,1.64,
+1.71,1.74,1.76,1.77,1.79,1.78,1.72,1.75,1.77,1.85,
+1.90,1.83,1.82,1.94,1.88,1.83,1.94,1.99,1.96,1.98,
+2.06,2.00,2.04,1.99,1.97,2.05,2.03,2.13,2.11,1.98,
+2.17,2.12,2.16,2.05,2.18,2.19,2.19,2.10,2.23,2.22,
+2.20,2.30,2.30,2.27,2.23,2.36,2.27,2.38,2.30,2.37,
+2.43,2.34,2.42,2.44,2.37,2.38,2.46,2.47,2.43,2.43,
+2.35,2.44,2.42,2.50,2.45,2.58,2.48,2.53,2.54,2.63,
+2.67,2.63,2.61,2.65,2.65,2.59,2.74,2.70,2.69,2.61,
+2.59,2.78,2.83,2.60,2.76,2.74,2.74,2.76,2.81,2.75,
+2.79,2.73,2.86,2.76,2.80,2.81,2.84,3.00,2.89,2.88,
+2.95,2.92,2.86,2.95,2.85,3.03,2.93,3.06,2.94,3.07,
+3.00,3.04,2.99,3.01,3.03,3.04,3.06,3.04,2.98,2.89,
+3.06,3.08,3.10,3.10,3.06,3.17,3.20,3.20,3.08,3.15,
+3.26,3.13,3.26,3.19,3.06,3.12,3.12,3.19,3.25,3.05,
+3.20,3.44,3.27,3.29,3.28,3.20,3.35,3.29,3.31,3.35,
+3.23,3.29,3.31,3.37,3.44,3.33,3.38,3.50,3.55,3.42,
+3.40,3.51,3.44,3.46,3.40,3.33,3.60,3.57,3.45,3.59,
+3.62,3.44,3.63,3.47,3.67,3.47,3.63,3.58,3.73,3.52,
+3.72,3.66,3.63,3.50,3.65,3.58,3.76,3.70,3.54,3.52,
+3.57,3.57,3.73,3.58,3.44,3.69,3.59,3.60,3.71,3.61,
+3.74,3.72,3.75,3.75,3.64,3.70,3.75,3.77,3.75,3.76,
+3.83,3.80,3.93,3.75,3.74,3.84,3.72,3.86,3.83,3.75,
+3.92,3.81,3.96,3.84,3.77,4.03,4.12,3.77,4.08,3.95,
+3.98,3.94,3.95,3.95,3.92,4.14,3.94,3.75,3.79,3.88,
+3.97,4.01,4.06,4.11,3.98,4.05,4.09,4.05,4.06,3.93,
+0.71,0.72,0.78,0.81,0.79,0.82,0.87,0.88,0.93,0.99,
+0.97,1.01,1.03,1.06,1.05,1.06,1.15,1.15,1.12,1.22,
+1.22,1.21,1.21,1.25,1.31,1.31,1.29,1.32,1.35,1.39,
+1.41,1.44,1.48,1.40,1.45,1.48,1.39,1.47,1.50,1.51,
+1.57,1.53,1.58,1.55,1.63,1.58,1.61,1.74,1.67,1.72,
+1.69,1.74,1.74,1.73,1.68,1.74,1.73,1.79,1.73,1.82,
+1.82,1.81,1.81,1.81,1.90,1.95,1.92,1.85,1.95,1.95,
+1.92,1.96,1.91,1.96,1.99,2.07,2.09,2.00,2.07,2.08,
+2.05,2.08,2.09,2.07,2.05,2.04,2.08,2.16,2.07,2.09,
+2.14,2.12,2.09,2.20,2.24,2.21,2.20,2.25,2.37,2.38,
+2.21,2.37,2.26,2.29,2.33,2.42,2.33,2.33,2.28,2.39,
+2.34,2.41,2.37,2.42,2.38,2.41,2.49,2.43,2.48,2.53,
+2.50,2.50,2.39,2.55,2.47,2.58,2.65,2.47,2.59,2.62,
+2.58,2.59,2.51,2.67,2.53,2.70,2.64,2.51,2.73,2.67,
+2.57,2.78,2.63,2.72,2.75,2.72,2.68,2.69,2.68,2.68,
+2.72,2.73,2.70,2.73,2.68,2.78,2.93,2.86,2.80,2.85,
+2.83,2.66,2.74,2.88,2.91,2.95,2.87,2.92,2.83,2.90,
+2.91,2.89,2.97,2.95,2.97,2.95,2.90,3.11,2.93,2.94,
+3.06,2.88,2.96,3.10,3.19,2.94,3.20,3.01,3.08,3.03,
+3.07,3.12,3.07,3.11,3.16,3.13,3.01,3.16,3.13,3.16,
+3.07,3.17,3.21,3.22,3.14,3.32,3.08,3.10,3.22,3.24,
+3.25,3.29,3.17,3.24,3.28,3.16,3.26,3.30,3.29,3.35,
+3.21,3.15,3.32,3.30,3.15,3.30,3.24,3.36,3.45,3.34,
+3.33,3.31,3.36,3.44,3.49,3.29,3.38,3.43,3.24,3.34,
+3.35,3.38,3.50,3.45,3.51,3.49,3.42,3.52,3.50,3.50,
+3.51,3.60,3.56,3.57,3.53,3.49,3.47,3.54,3.33,3.56,
+3.57,3.46,3.59,3.48,3.57,3.64,3.39,3.68,3.59,3.55,
+3.63,3.66,3.76,3.72,3.63,3.68,3.59,3.83,3.67,3.78,
+3.78,3.86,3.67,3.83,3.78,3.86,3.84,3.72,3.81,3.74,
+0.64,0.66,0.71,0.70,0.75,0.77,0.83,0.84,0.82,0.84,
+0.87,0.92,0.92,0.98,0.99,0.98,1.02,1.04,1.01,1.07,
+1.14,1.11,1.16,1.15,1.12,1.27,1.25,1.23,1.24,1.28,
+1.25,1.26,1.30,1.34,1.31,1.40,1.34,1.42,1.42,1.42,
+1.37,1.46,1.42,1.46,1.50,1.47,1.57,1.52,1.50,1.48,
+1.49,1.52,1.55,1.66,1.59,1.56,1.65,1.56,1.68,1.64,
+1.66,1.64,1.76,1.71,1.68,1.74,1.71,1.75,1.78,1.76,
+1.80,1.75,1.78,1.85,1.89,1.80,1.90,1.88,1.91,1.85,
+1.90,1.85,1.94,1.87,1.87,1.93,1.95,1.93,2.05,1.87,
+2.03,2.06,1.95,1.95,2.07,1.98,2.03,2.08,2.08,2.04,
+2.08,1.99,2.06,2.16,2.04,2.12,2.09,2.13,2.15,2.06,
+2.15,2.17,2.19,2.19,2.23,2.22,2.28,2.33,2.27,2.18,
+2.19,2.20,2.22,2.29,2.18,2.37,2.35,2.31,2.36,2.36,
+2.28,2.40,2.26,2.34,2.34,2.38,2.54,2.44,2.36,2.57,
+2.64,2.48,2.41,2.36,2.47,2.45,2.56,2.53,2.42,2.45,
+2.53,2.57,2.45,2.53,2.50,2.63,2.61,2.59,2.54,2.51,
+2.67,2.62,2.63,2.62,2.57,2.59,2.63,2.63,2.62,2.54,
+2.68,2.69,2.72,2.74,2.77,2.77,2.69,2.67,2.68,2.58,
+2.67,2.87,2.72,2.80,2.73,2.77,2.66,2.72,2.85,2.86,
+2.75,2.77,2.77,2.79,2.84,2.90,2.92,2.84,2.99,2.91,
+2.85,2.96,2.87,2.95,2.93,2.85,2.93,2.80,2.84,2.89,
+2.96,2.92,2.97,2.90,2.88,3.02,2.97,2.94,2.78,2.91,
+2.87,2.90,3.08,3.09,3.01,2.96,2.99,3.08,2.98,2.93,
+3.17,3.08,3.12,3.10,3.18,3.26,3.18,3.13,3.03,3.12,
+3.14,3.14,3.14,3.21,3.03,3.20,3.09,3.23,3.13,3.17,
+3.31,3.31,3.16,3.21,3.22,3.09,3.24,3.29,3.22,3.18,
+3.22,3.26,3.10,3.26,3.31,3.29,3.29,3.33,3.38,3.36,
+3.32,3.29,3.24,3.38,3.42,3.28,3.34,3.39,3.41,3.35,
+3.40,3.43,3.38,3.46,3.42,3.57,3.36,3.31,3.47,3.42,
+0.60,0.61,0.65,0.65,0.69,0.74,0.74,0.77,0.81,0.81,
+0.79,0.80,0.86,0.88,0.88,0.91,0.93,0.94,0.96,0.99,
+1.03,1.03,1.05,1.06,1.08,1.08,1.06,1.13,1.13,1.14,
+1.16,1.17,1.17,1.16,1.17,1.22,1.25,1.29,1.25,1.22,
+1.24,1.31,1.25,1.37,1.31,1.33,1.34,1.37,1.40,1.37,
+1.41,1.38,1.43,1.41,1.44,1.42,1.46,1.50,1.54,1.54,
+1.50,1.46,1.52,1.61,1.60,1.56,1.58,1.62,1.60,1.54,
+1.66,1.62,1.64,1.64,1.61,1.72,1.62,1.70,1.73,1.79,
+1.79,1.69,1.72,1.79,1.61,1.78,1.73,1.79,1.75,1.85,
+1.85,1.88,1.84,1.88,1.89,2.00,1.81,1.87,1.86,1.85,
+1.81,1.83,1.88,1.93,1.94,1.99,1.99,1.94,2.00,2.06,
+2.00,2.05,1.94,1.99,1.97,2.06,2.04,2.00,2.03,2.07,
+2.07,2.14,2.10,2.10,2.10,2.15,2.11,2.10,2.08,2.11,
+2.17,2.13,2.14,2.15,2.15,2.13,2.22,2.25,2.20,2.28,
+2.20,2.24,2.16,2.28,2.23,2.29,2.27,2.19,2.25,2.29,
+2.31,2.29,2.34,2.36,2.35,2.39,2.33,2.29,2.35,2.28,
+2.26,2.45,2.27,2.31,2.40,2.37,2.41,2.37,2.34,2.41,
+2.43,2.39,2.54,2.41,2.47,2.44,2.44,2.42,2.50,2.47,
+2.43,2.49,2.48,2.48,2.50,2.47,2.52,2.60,2.46,2.58,
+2.55,2.57,2.51,2.60,2.53,2.57,2.64,2.62,2.59,2.60,
+2.64,2.65,2.61,2.61,2.63,2.79,2.68,2.71,2.66,2.71,
+2.65,2.72,2.73,2.68,2.59,2.75,2.70,2.80,2.72,2.72,
+2.72,2.69,2.74,2.80,2.72,2.75,2.84,2.71,2.84,2.76,
+2.86,2.86,2.80,2.83,2.75,2.84,2.77,2.84,2.72,2.79,
+2.83,2.78,2.88,2.92,2.92,2.90,2.93,2.88,2.81,2.94,
+2.82,3.03,2.96,3.09,3.01,2.96,3.02,3.02,2.91,2.98,
+3.02,2.96,2.99,2.86,3.01,3.04,2.95,2.96,3.10,2.99,
+3.01,3.01,2.86,2.97,2.97,3.07,3.12,3.10,3.15,3.10,
+3.09,3.08,3.03,3.15,3.17,3.14,3.07,3.07,3.09,3.15,
+0.53,0.58,0.59,0.60,0.64,0.67,0.68,0.68,0.71,0.72,
+0.76,0.75,0.78,0.79,0.84,0.84,0.86,0.88,0.88,0.91,
+0.93,0.91,0.97,0.96,0.97,0.96,1.01,1.05,1.05,1.03,
+1.06,1.07,1.07,1.10,1.11,1.13,1.14,1.13,1.12,1.18,
+1.16,1.16,1.15,1.15,1.16,1.17,1.28,1.21,1.25,1.23,
+1.30,1.33,1.29,1.30,1.31,1.30,1.30,1.32,1.32,1.39,
+1.35,1.35,1.34,1.41,1.36,1.41,1.41,1.46,1.42,1.45,
+1.46,1.56,1.54,1.50,1.52,1.58,1.50,1.53,1.54,1.57,
+1.51,1.57,1.64,1.53,1.64,1.60,1.58,1.65,1.54,1.61,
+1.63,1.76,1.67,1.62,1.61,1.69,1.71,1.67,1.79,1.65,
+1.68,1.70,1.71,1.78,1.80,1.77,1.81,1.74,1.82,1.77,
+1.82,1.78,1.80,1.89,1.88,1.82,1.81,1.83,1.85,1.88,
+1.94,1.88,1.98,1.93,1.92,1.92,1.96,1.97,1.87,1.90,
+1.90,1.96,2.01,1.92,1.96,1.98,1.98,2.01,2.01,2.11,
+2.03,2.10,2.09,2.02,2.07,1.96,2.01,2.06,2.06,2.15,
+2.06,2.09,2.05,2.11,2.13,2.07,2.04,2.12,2.17,2.17,
+2.09,2.09,2.17,2.23,2.12,2.20,2.09,2.16,2.22,2.13,
+2.16,2.25,2.16,2.29,2.21,2.23,2.22,2.25,2.20,2.26,
+2.26,2.26,2.34,2.22,2.25,2.29,2.34,2.36,2.23,2.27,
+2.35,2.35,2.41,2.31,2.32,2.30,2.34,2.38,2.42,2.33,
+2.46,2.40,2.36,2.39,2.42,2.42,2.45,2.44,2.43,2.44,
+2.48,2.40,2.52,2.32,2.42,2.47,2.47,2.44,2.56,2.46,
+2.56,2.47,2.58,2.52,2.53,2.53,2.59,2.66,2.56,2.51,
+2.56,2.60,2.56,2.68,2.54,2.55,2.57,2.63,2.61,2.57,
+2.58,2.62,2.70,2.66,2.65,2.54,2.64,2.59,2.66,2.66,
+2.63,2.66,2.62,2.73,2.68,2.75,2.66,2.73,2.67,2.71,
+2.74,2.69,2.69,2.77,2.68,2.78,2.69,2.70,2.82,2.74,
+2.79,2.58,2.85,2.76,2.71,2.65,2.79,2.74,2.83,2.85,
+2.75,2.89,2.93,2.86,2.80,2.85,2.80,2.88,2.88,2.81,
+0.49,0.51,0.54,0.56,0.55,0.59,0.62,0.64,0.67,0.68,
+0.69,0.69,0.72,0.73,0.71,0.74,0.76,0.76,0.78,0.77,
+0.82,0.81,0.88,0.89,0.91,0.89,0.93,0.90,0.87,0.92,
+0.93,1.00,1.01,1.00,1.01,0.99,0.98,1.05,1.02,1.10,
+1.05,1.03,1.07,1.10,1.11,1.13,1.12,1.11,1.18,1.19,
+1.18,1.19,1.19,1.17,1.20,1.26,1.24,1.21,1.30,1.24,
+1.23,1.30,1.27,1.27,1.30,1.30,1.35,1.37,1.33,1.34,
+1.26,1.35,1.34,1.42,1.42,1.38,1.38,1.41,1.47,1.40,
+1.43,1.45,1.46,1.47,1.52,1.49,1.44,1.44,1.47,1.46,
+1.48,1.54,1.55,1.53,1.50,1.48,1.55,1.53,1.53,1.54,
+1.64,1.51,1.60,1.60,1.54,1.64,1.62,1.55,1.65,1.64,
+1.64,1.68,1.66,1.64,1.70,1.70,1.64,1.66,1.62,1.69,
+1.74,1.74,1.74,1.73,1.71,1.76,1.72,1.75,1.72,1.77,
+1.79,1.72,1.78,1.74,1.85,1.84,1.82,1.73,1.88,1.85,
+1.85,1.82,1.80,1.82,1.92,1.85,1.89,1.88,1.94,1.86,
+1.95,1.83,1.86,1.94,1.97,1.91,1.99,1.86,2.04,1.91,
+1.99,1.93,1.99,1.96,1.97,2.01,1.95,1.94,2.01,2.09,
+1.98,2.06,2.04,1.98,2.05,1.99,2.10,2.02,2.09,2.05,
+2.03,2.15,2.04,2.04,2.11,2.07,2.20,2.08,2.09,2.11,
+2.13,2.12,2.12,2.06,2.22,2.15,2.11,2.14,2.11,2.26,
+2.21,2.11,2.19,2.17,2.15,2.26,2.16,2.25,2.20,2.18,
+2.17,2.22,2.16,2.28,2.17,2.21,2.19,2.26,2.25,2.29,
+2.37,2.21,2.19,2.33,2.22,2.27,2.31,2.30,2.37,2.38,
+2.33,2.23,2.35,2.37,2.29,2.25,2.40,2.31,2.43,2.40,
+2.42,2.32,2.28,2.37,2.43,2.36,2.38,2.44,2.52,2.34,
+2.52,2.27,2.29,2.41,2.40,2.43,2.49,2.56,2.43,2.56,
+2.45,2.53,2.54,2.38,2.52,2.48,2.45,2.45,2.55,2.53,
+2.58,2.41,2.50,2.51,2.61,2.57,2.55,2.52,2.50,2.57,
+2.60,2.55,2.56,2.54,2.54,2.49,2.59,2.68,2.62,2.59,
+0.43,0.44,0.50,0.50,0.53,0.52,0.57,0.53,0.60,0.62,
+0.60,0.64,0.65,0.66,0.65,0.69,0.69,0.72,0.75,0.73,
+0.71,0.76,0.77,0.77,0.77,0.80,0.80,0.86,0.83,0.83,
+0.86,0.91,0.91,0.88,0.91,0.91,0.94,0.90,0.92,0.95,
+0.95,0.96,0.99,0.98,0.99,1.02,1.06,1.06,1.05,1.03,
+1.09,1.03,1.05,1.11,1.05,1.09,1.13,1.11,1.11,1.15,
+1.10,1.15,1.20,1.14,1.19,1.20,1.12,1.20,1.27,1.22,
+1.25,1.20,1.25,1.25,1.24,1.26,1.30,1.26,1.33,1.28,
+1.33,1.32,1.26,1.31,1.37,1.26,1.32,1.33,1.30,1.35,
+1.31,1.37,1.43,1.37,1.45,1.40,1.45,1.44,1.40,1.44,
+1.41,1.40,1.43,1.40,1.44,1.44,1.50,1.48,1.48,1.44,
+1.52,1.50,1.52,1.49,1.51,1.57,1.52,1.48,1.52,1.57,
+1.58,1.57,1.56,1.58,1.61,1.57,1.62,1.65,1.66,1.60,
+1.62,1.58,1.60,1.61,1.71,1.69,1.62,1.63,1.65,1.58,
+1.65,1.61,1.71,1.68,1.62,1.69,1.71,1.68,1.65,1.76,
+1.74,1.71,1.69,1.66,1.77,1.75,1.74,1.72,1.82,1.75,
+1.77,1.80,1.72,1.79,1.82,1.83,1.83,1.84,1.84,1.82,
+1.78,1.84,1.81,1.84,1.87,1.89,1.80,1.86,1.86,1.91,
+1.91,1.86,1.81,1.84,1.96,1.97,1.84,1.96,1.84,1.86,
+1.93,2.01,1.97,1.96,1.90,1.93,2.00,1.95,1.88,1.98,
+1.99,1.92,2.04,1.92,2.00,2.01,1.99,2.10,2.01,1.90,
+2.01,2.04,1.99,2.01,1.98,2.07,1.98,2.03,1.98,2.12,
+2.05,2.05,2.06,2.12,2.11,2.07,2.00,2.07,2.13,2.13,
+2.14,2.12,2.10,2.01,2.09,2.08,2.13,2.08,2.08,2.20,
+2.07,2.07,2.16,2.11,2.11,2.11,2.12,2.12,2.24,2.18,
+2.18,2.23,2.23,2.25,2.15,2.05,2.28,2.27,2.27,2.17,
+2.28,2.22,2.25,2.19,2.34,2.29,2.32,2.31,2.16,2.28,
+2.30,2.27,2.25,2.35,2.32,2.29,2.26,2.32,2.28,2.31,
+2.30,2.39,2.21,2.39,2.31,2.24,2.35,2.25,2.34,2.26,
+0.41,0.41,0.44,0.46,0.47,0.48,0.47,0.51,0.50,0.55,
+0.56,0.57,0.59,0.59,0.60,0.63,0.64,0.64,0.66,0.65,
+0.67,0.70,0.72,0.76,0.71,0.73,0.73,0.80,0.78,0.77,
+0.78,0.79,0.78,0.80,0.84,0.85,0.83,0.84,0.81,0.87,
+0.91,0.91,0.87,0.92,0.93,0.91,0.90,0.92,0.96,0.92,
+0.95,1.05,1.00,1.00,0.96,0.98,1.01,1.00,1.01,1.01,
+1.04,1.09,1.08,1.08,1.07,1.09,1.04,1.14,1.06,1.12,
+1.08,1.12,1.09,1.08,1.19,1.16,1.10,1.15,1.15,1.18,
+1.16,1.14,1.21,1.19,1.20,1.21,1.21,1.25,1.24,1.20,
+1.20,1.20,1.26,1.31,1.23,1.26,1.25,1.27,1.34,1.28,
+1.23,1.26,1.32,1.29,1.28,1.33,1.32,1.34,1.38,1.37,
+1.38,1.34,1.37,1.36,1.38,1.37,1.41,1.36,1.43,1.38,
+1.44,1.40,1.39,1.44,1.38,1.44,1.47,1.42,1.41,1.48,
+1.51,1.47,1.47,1.52,1.49,1.53,1.51,1.47,1.49,1.46,
+1.55,1.50,1.53,1.57,1.57,1.57,1.46,1.56,1.53,1.54,
+1.51,1.58,1.54,1.51,1.58,1.50,1.53,1.66,1.58,1.58,
+1.60,1.60,1.61,1.59,1.62,1.68,1.65,1.67,1.66,1.65,
+1.70,1.65,1.66,1.66,1.64,1.66,1.70,1.73,1.75,1.69,
+1.66,1.69,1.69,1.70,1.71,1.65,1.76,1.70,1.64,1.74,
+1.77,1.73,1.77,1.77,1.76,1.79,1.79,1.82,1.75,1.83,
+1.74,1.79,1.81,1.82,1.77,1.86,1.84,1.87,1.84,1.81,
+1.85,1.85,1.85,1.86,1.81,1.85,1.93,1.91,1.84,1.77,
+1.93,1.87,1.88,1.87,1.91,1.81,1.91,1.86,1.94,1.94,
+1.94,1.91,1.90,1.93,1.92,1.85,1.89,2.01,1.92,2.00,
+2.04,2.03,1.94,1.96,2.03,1.86,1.94,1.96,1.98,1.95,
+2.00,2.06,1.92,1.95,1.98,2.05,2.07,2.04,2.00,2.06,
+2.08,2.11,2.00,2.07,2.08,2.02,2.08,2.09,2.09,2.10,
+2.07,2.08,1.99,2.03,2.09,2.01,2.07,2.07,2.09,2.09,
+2.11,2.05,2.06,2.03,2.06,2.12,2.13,2.15,2.14,2.20,
+0.37,0.38,0.36,0.40,0.43,0.45,0.46,0.49,0.49,0.47,
+0.49,0.52,0.53,0.55,0.56,0.58,0.57,0.59,0.60,0.60,
+0.64,0.64,0.62,0.63,0.64,0.69,0.65,0.68,0.68,0.71,
+0.72,0.75,0.70,0.72,0.78,0.71,0.76,0.82,0.83,0.77,
+0.76,0.84,0.81,0.82,0.83,0.81,0.84,0.88,0.86,0.91,
+0.85,0.90,0.83,0.85,0.93,0.85,0.93,0.94,0.92,0.91,
+0.99,0.89,0.93,0.94,0.96,1.00,0.98,0.99,0.96,0.98,
+0.95,0.97,1.00,0.95,1.04,0.99,1.03,1.01,1.07,1.06,
+1.08,1.09,1.01,1.05,1.06,1.09,1.09,1.08,1.11,1.12,
+1.12,1.12,1.13,1.13,1.14,1.17,1.19,1.16,1.20,1.20,
+1.14,1.18,1.21,1.18,1.21,1.27,1.22,1.17,1.17,1.16,
+1.26,1.24,1.21,1.29,1.25,1.28,1.26,1.24,1.24,1.23,
+1.31,1.30,1.33,1.29,1.30,1.30,1.30,1.33,1.32,1.36,
+1.36,1.33,1.33,1.37,1.32,1.38,1.35,1.39,1.34,1.35,
+1.38,1.39,1.36,1.34,1.47,1.42,1.46,1.42,1.39,1.34,
+1.42,1.41,1.47,1.44,1.47,1.45,1.37,1.46,1.44,1.46,
+1.46,1.40,1.54,1.43,1.49,1.50,1.46,1.50,1.50,1.46,
+1.45,1.47,1.50,1.53,1.48,1.53,1.50,1.54,1.58,1.49,
+1.51,1.51,1.54,1.56,1.58,1.53,1.58,1.59,1.56,1.57,
+1.54,1.60,1.57,1.60,1.62,1.64,1.55,1.60,1.64,1.59,
+1.59,1.62,1.57,1.65,1.64,1.61,1.66,1.62,1.67,1.70,
+1.61,1.60,1.64,1.68,1.67,1.68,1.69,1.74,1.62,1.66,
+1.69,1.71,1.69,1.70,1.63,1.75,1.81,1.76,1.74,1.70,
+1.77,1.73,1.71,1.71,1.74,1.76,1.69,1.73,1.81,1.84,
+1.70,1.80,1.82,1.77,1.84,1.79,1.83,1.76,1.81,1.84,
+1.82,1.86,1.82,1.81,1.84,1.89,1.89,1.78,1.81,1.81,
+1.91,1.84,1.87,1.86,1.82,1.87,1.90,1.86,1.81,1.88,
+1.81,1.81,1.88,1.83,1.86,1.91,1.83,1.97,1.94,1.87,
+1.86,1.98,1.98,1.89,1.97,1.97,1.95,1.95,1.89,1.91,
+1.14,1.25,1.26,1.33,1.40,1.34,1.45,1.46,1.54,1.61,
+1.62,1.61,1.68,1.78,1.70,1.80,1.79,1.87,1.82,1.96,
+1.92,1.99,2.03,2.11,2.09,2.06,2.17,2.15,2.17,2.26,
+2.26,2.33,2.36,2.37,2.35,2.47,2.43,2.38,2.45,2.51,
+2.50,2.58,2.61,2.64,2.65,2.67,2.57,2.66,2.66,2.70,
+2.74,2.77,2.82,2.85,2.87,2.89,3.00,2.99,2.83,3.02,
+3.05,3.03,3.08,3.00,3.12,3.05,3.14,3.09,3.06,3.21,
+3.27,3.11,3.25,3.25,3.34,3.32,3.35,3.27,3.34,3.25,
+3.39,3.46,3.52,3.53,3.58,3.43,3.69,3.53,3.62,3.59,
+3.60,3.67,3.77,3.53,3.55,3.61,3.69,3.54,3.66,3.63,
+3.84,3.76,3.65,3.91,3.94,3.89,3.82,3.80,3.89,4.05,
+3.98,3.96,3.97,4.05,3.96,3.94,3.92,3.99,4.18,4.11,
+4.03,4.03,4.19,4.22,4.15,4.11,4.12,4.15,4.18,4.29,
+4.22,4.12,4.25,4.17,4.27,4.18,4.30,4.38,4.26,4.33,
+4.24,4.43,4.47,4.33,4.35,4.49,4.49,4.38,4.40,4.48,
+4.29,4.59,4.62,4.54,4.48,4.55,4.47,4.59,4.53,4.50,
+4.61,4.74,4.62,4.88,4.69,4.65,4.58,4.58,4.76,4.58,
+4.87,4.87,4.83,4.68,4.86,5.00,4.74,4.74,4.73,4.87,
+4.98,4.77,5.20,5.04,4.99,4.99,5.10,4.85,4.98,4.90,
+5.11,5.01,4.95,5.02,4.97,5.22,5.18,5.03,5.08,4.97,
+5.23,5.08,5.31,5.20,5.16,5.21,5.27,5.16,5.03,5.43,
+5.31,5.34,5.26,5.64,5.12,5.11,5.31,5.38,5.33,5.31,
+5.41,5.19,5.40,5.34,5.61,5.48,5.60,5.51,5.40,5.60,
+5.45,5.66,5.69,5.73,5.48,5.58,5.40,5.61,5.53,5.76,
+5.69,5.62,5.57,5.54,5.73,5.77,5.93,5.60,5.68,5.59,
+5.70,5.92,5.83,5.77,5.88,5.66,5.85,5.78,5.94,5.89,
+5.91,5.77,5.72,5.85,5.68,5.87,5.89,6.00,5.85,6.07,
+5.97,6.16,6.13,5.89,6.19,6.00,6.04,6.24,6.14,6.16,
+6.12,6.04,6.02,6.29,6.09,6.09,6.22,6.38,6.38,6.14,
+1.12,1.20,1.21,1.28,1.29,1.42,1.40,1.47,1.50,1.54,
+1.54,1.56,1.63,1.61,1.69,1.77,1.75,1.84,1.85,1.93,
+1.85,1.92,2.03,1.97,1.95,2.02,2.03,2.01,2.14,2.14,
+2.28,2.13,2.24,2.33,2.29,2.32,2.35,2.36,2.43,2.40,
+2.37,2.40,2.32,2.41,2.48,2.61,2.55,2.54,2.55,2.51,
+2.68,2.68,2.78,2.70,2.72,2.77,2.69,2.83,2.85,2.77,
+2.87,2.92,2.91,2.87,2.91,2.94,2.98,2.95,3.02,2.94,
+3.01,3.06,2.99,3.14,3.07,3.11,3.09,3.21,3.23,3.21,
+3.24,3.20,3.26,3.35,3.31,3.17,3.39,3.32,3.42,3.44,
+3.32,3.52,3.43,3.43,3.46,3.40,3.58,3.49,3.51,3.64,
+3.65,3.57,3.70,3.77,3.65,3.47,3.77,3.63,3.53,3.59,
+3.72,3.91,3.75,3.71,3.77,3.78,3.75,3.93,3.80,3.86,
+3.83,4.02,3.87,3.91,3.97,3.90,3.95,4.02,4.21,4.04,
+4.07,4.02,3.90,4.03,4.17,4.17,4.04,4.20,4.16,4.11,
+4.33,4.21,4.18,4.19,4.09,4.20,4.12,4.34,4.27,4.29,
+4.47,4.42,4.33,4.55,4.39,4.43,4.44,4.43,4.52,4.53,
+4.43,4.32,4.34,4.57,4.59,4.39,4.47,4.42,4.66,4.56,
+4.60,4.70,4.59,4.64,4.65,4.70,4.68,4.71,4.83,4.85,
+4.61,4.76,4.41,4.68,4.44,4.69,4.78,4.84,4.93,4.66,
+4.75,4.84,4.80,4.93,4.70,4.78,5.02,4.90,4.97,4.77,
+5.05,5.00,4.95,5.03,5.03,5.06,4.97,5.01,4.94,5.04,
+5.20,5.15,5.19,5.05,4.99,5.05,5.19,5.02,4.95,5.14,
+5.10,5.12,4.90,5.25,5.29,5.29,5.19,5.52,5.24,5.19,
+5.36,5.41,5.15,5.37,5.19,5.36,5.41,5.40,5.37,5.30,
+5.35,5.27,5.43,5.63,5.32,5.57,5.60,5.40,5.61,5.58,
+5.49,5.32,5.44,5.48,5.50,5.71,5.59,5.56,5.61,5.50,
+5.62,5.54,5.74,5.76,5.50,5.53,5.69,5.72,5.59,5.55,
+5.79,5.63,5.52,5.71,5.65,5.64,5.71,5.75,5.85,5.80,
+5.85,5.62,6.07,5.55,5.85,5.84,5.77,5.89,5.71,5.88,
+1.07,1.11,1.13,1.21,1.20,1.29,1.32,1.34,1.41,1.42,
+1.52,1.52,1.55,1.56,1.61,1.64,1.64,1.63,1.77,1.75,
+1.73,1.88,1.88,1.96,1.85,1.93,1.98,1.94,1.93,2.03,
+2.06,2.12,2.17,2.10,2.16,2.16,2.25,2.19,2.20,2.32,
+2.36,2.38,2.38,2.34,2.44,2.44,2.40,2.43,2.45,2.43,
+2.48,2.52,2.49,2.59,2.64,2.64,2.60,2.73,2.65,2.74,
+2.68,2.66,2.76,2.72,2.84,2.68,2.79,2.89,2.79,2.80,
+2.77,2.93,2.82,2.92,2.95,3.01,2.96,2.84,3.02,2.95,
+2.93,3.02,3.09,3.20,3.17,3.14,3.08,3.29,3.19,3.22,
+3.25,3.24,3.25,3.33,3.23,3.39,3.31,3.24,3.41,3.39,
+3.44,3.25,3.41,3.41,3.49,3.49,3.42,3.38,3.55,3.50,
+3.65,3.50,3.37,3.55,3.63,3.54,3.51,3.73,3.63,3.72,
+3.70,3.73,3.66,3.70,3.80,3.82,3.71,3.88,3.73,3.79,
+3.89,3.87,3.83,3.90,3.83,3.81,3.81,3.98,3.79,3.95,
+3.90,4.13,4.07,3.86,4.04,3.90,3.91,4.18,3.95,4.15,
+4.05,4.16,4.10,4.20,4.05,4.07,4.09,4.13,4.16,4.22,
+4.18,4.07,4.20,4.30,4.31,4.26,4.35,4.21,4.19,4.21,
+4.37,4.21,4.27,4.44,4.30,4.36,4.48,4.59,4.53,4.56,
+4.38,4.45,4.31,4.54,4.41,4.69,4.50,4.56,4.39,4.49,
+4.75,4.59,4.61,4.51,4.65,4.49,4.64,4.63,4.59,4.74,
+4.67,4.66,4.52,4.58,4.67,4.65,4.68,4.81,4.62,4.85,
+4.64,4.51,4.77,4.55,4.96,4.85,4.83,4.98,4.89,4.67,
+4.90,4.80,4.75,4.85,4.87,5.04,5.20,4.87,4.94,4.87,
+5.26,5.12,5.08,5.00,5.16,5.13,4.83,5.02,5.08,5.08,
+4.80,5.15,5.04,5.02,4.91,5.28,5.06,5.25,5.04,5.18,
+5.24,5.28,5.09,5.20,5.14,5.12,5.18,5.22,5.12,5.41,
+5.34,5.14,5.14,5.51,5.15,5.31,5.46,5.28,5.43,5.50,
+5.44,5.41,5.53,5.43,5.69,5.31,5.42,5.48,5.57,5.52,
+5.36,5.46,5.62,5.47,5.33,5.47,5.63,5.68,5.38,5.62,
+1.01,1.06,1.05,1.12,1.15,1.18,1.19,1.25,1.31,1.34,
+1.42,1.41,1.40,1.44,1.47,1.55,1.57,1.57,1.59,1.66,
+1.69,1.66,1.77,1.80,1.84,1.78,1.86,1.88,1.85,1.95,
+2.00,2.04,1.94,2.02,2.12,2.04,2.04,2.06,2.12,2.15,
+2.19,2.15,2.20,2.32,2.31,2.31,2.24,2.25,2.43,2.32,
+2.43,2.42,2.29,2.51,2.39,2.45,2.50,2.34,2.52,2.54,
+2.70,2.65,2.67,2.64,2.53,2.58,2.57,2.65,2.77,2.74,
+2.70,2.87,2.86,2.80,2.91,2.90,2.88,2.75,2.77,2.96,
+2.98,2.89,2.86,2.83,2.92,2.99,2.94,3.14,3.03,3.04,
+3.03,3.06,3.05,3.06,3.17,3.14,3.06,3.04,3.12,3.31,
+3.16,3.24,3.27,3.18,3.21,3.28,3.24,3.32,3.25,3.35,
+3.33,3.23,3.43,3.31,3.48,3.34,3.29,3.48,3.40,3.43,
+3.46,3.45,3.51,3.48,3.61,3.43,3.55,3.55,3.61,3.65,
+3.45,3.61,3.53,3.50,3.61,3.64,3.82,3.69,3.73,3.72,
+3.84,3.85,3.77,3.63,3.94,3.89,3.75,3.99,3.90,3.82,
+3.82,3.82,3.62,4.00,3.91,4.00,3.96,3.77,3.89,4.03,
+3.84,4.01,4.11,4.06,3.96,4.03,4.08,3.95,3.94,4.12,
+4.07,4.27,4.19,4.20,4.15,4.20,4.17,4.11,4.27,4.14,
+4.24,4.08,4.09,4.11,4.26,4.35,4.37,4.17,4.38,4.30,
+4.19,4.20,4.26,4.35,4.20,4.32,4.30,4.45,4.55,4.20,
+4.45,4.42,4.29,4.49,4.50,4.41,4.57,4.61,4.54,4.33,
+4.50,4.60,4.43,4.59,4.60,4.51,4.56,4.60,4.38,4.68,
+4.68,4.70,4.78,4.48,4.74,4.56,4.72,4.50,4.59,4.83,
+4.76,4.72,4.73,4.82,4.73,4.77,4.68,4.79,4.79,4.87,
+4.72,4.71,4.96,4.72,4.71,4.83,4.78,4.72,4.91,4.95,
+4.93,5.10,4.91,4.91,4.93,5.13,5.01,4.80,5.22,5.17,
+5.02,5.16,4.90,4.85,5.07,5.17,5.20,4.95,4.99,5.11,
+5.10,5.24,5.14,4.96,4.84,5.22,5.14,4.84,4.98,5.07,
+5.34,5.02,5.34,5.00,5.12,5.16,5.22,5.12,5.35,5.07,
+0.94,0.98,1.01,1.06,1.11,1.13,1.15,1.26,1.22,1.26,
+1.36,1.35,1.36,1.40,1.36,1.43,1.46,1.43,1.54,1.56,
+1.59,1.63,1.65,1.63,1.72,1.70,1.72,1.75,1.67,1.86,
+1.86,1.81,1.83,1.96,1.92,2.01,1.94,1.94,2.02,1.95,
+2.02,2.09,2.02,2.06,2.07,2.13,2.16,2.18,2.17,2.36,
+2.33,2.19,2.24,2.36,2.25,2.25,2.35,2.39,2.47,2.34,
+2.40,2.46,2.45,2.42,2.51,2.54,2.48,2.44,2.64,2.57,
+2.55,2.44,2.59,2.60,2.55,2.61,2.77,2.69,2.78,2.77,
+2.74,2.69,2.72,2.74,2.73,2.68,2.80,2.94,2.70,2.90,
+2.76,2.96,2.79,2.79,2.94,3.03,2.89,2.99,2.89,3.01,
+2.97,3.09,3.13,3.13,3.12,3.06,2.96,3.04,3.07,3.14,
+3.17,3.09,3.20,3.17,3.18,3.18,3.30,3.10,3.26,3.28,
+3.36,3.29,3.25,3.32,3.41,3.30,3.45,3.24,3.28,3.18,
+3.44,3.35,3.29,3.39,3.51,3.39,3.55,3.45,3.43,3.46,
+3.47,3.70,3.55,3.58,3.41,3.55,3.48,3.54,3.63,3.59,
+3.75,3.67,3.62,3.48,3.64,3.73,3.76,3.72,3.78,3.68,
+3.72,3.83,3.69,3.76,3.71,3.90,3.78,3.83,3.75,3.87,
+3.79,3.82,3.92,3.72,3.87,3.93,3.96,3.81,3.94,3.91,
+3.96,3.80,4.00,3.91,3.90,4.00,3.97,3.93,3.94,4.00,
+4.14,4.00,4.14,4.14,4.17,4.28,4.21,4.00,4.14,4.19,
+4.12,4.15,4.12,4.03,4.09,4.29,4.32,4.32,4.47,4.16,
+4.18,4.61,4.15,4.19,4.34,4.15,4.39,4.29,4.28,4.19,
+4.32,4.57,4.27,4.25,4.32,4.31,4.18,4.46,4.50,4.51,
+4.44,4.33,4.31,4.46,4.29,4.37,4.40,4.43,4.31,4.49,
+4.50,4.45,4.51,4.50,4.51,4.64,4.41,4.57,4.56,4.56,
+4.34,4.46,4.61,4.64,4.65,4.77,4.45,4.54,4.56,4.60,
+4.84,4.68,4.79,4.58,4.74,4.71,4.72,4.58,4.80,4.77,
+4.53,4.78,4.80,4.82,4.88,4.95,4.91,4.78,4.88,4.76,
+4.77,5.10,4.80,4.74,4.82,4.82,4.86,4.77,4.93,5.03,
+0.83,0.88,0.95,1.02,0.98,1.01,1.08,1.12,1.13,1.19,
+1.24,1.23,1.24,1.25,1.29,1.35,1.35,1.38,1.46,1.44,
+1.55,1.44,1.50,1.52,1.57,1.64,1.67,1.67,1.69,1.67,
+1.70,1.67,1.77,1.70,1.82,1.86,1.87,1.88,1.86,1.88,
+1.87,1.96,1.89,1.94,2.01,2.02,1.93,2.06,2.06,2.02,
+2.10,2.03,2.14,2.11,2.19,2.20,2.17,2.17,2.12,2.21,
+2.22,2.21,2.17,2.28,2.40,2.34,2.30,2.32,2.36,2.34,
+2.39,2.38,2.40,2.41,2.39,2.45,2.56,2.43,2.43,2.44,
+2.56,2.49,2.61,2.60,2.57,2.49,2.59,2.61,2.61,2.56,
+2.66,2.69,2.72,2.80,2.79,2.67,2.75,2.71,2.79,2.83,
+2.74,2.79,2.89,2.87,2.80,2.80,2.78,2.93,2.95,2.91,
+2.99,2.96,2.97,2.97,2.86,3.05,3.01,3.09,2.94,3.06,
+3.15,2.92,3.05,2.95,3.16,3.08,3.09,2.99,3.12,3.24,
+3.14,3.07,3.15,3.19,3.27,3.15,3.12,3.06,3.19,3.38,
+3.36,3.23,3.24,3.38,3.27,3.36,3.32,3.25,3.48,3.33,
+3.39,3.40,3.33,3.32,3.42,3.47,3.53,3.53,3.40,3.41,
+3.50,3.41,3.38,3.50,3.66,3.55,3.38,3.56,3.47,3.50,
+3.66,3.53,3.54,3.51,3.64,3.61,3.62,3.62,3.77,3.63,
+3.69,3.63,3.71,3.54,3.76,3.65,3.69,3.73,3.68,3.64,
+3.61,3.77,3.76,3.93,3.68,3.78,3.84,3.88,3.89,3.73,
+3.85,3.84,3.80,3.93,3.93,4.02,3.86,3.79,3.80,4.00,
+3.89,3.95,3.96,4.02,3.82,3.73,3.95,4.07,3.81,3.97,
+4.00,4.16,4.15,4.22,4.06,4.16,4.18,4.06,4.00,4.15,
+4.20,4.16,4.30,4.08,4.16,4.11,4.23,4.21,4.26,4.18,
+4.32,4.07,4.19,4.13,4.11,4.15,4.38,4.13,4.28,4.41,
+4.28,4.34,4.38,4.29,4.23,4.27,4.34,4.38,4.29,4.25,
+4.46,4.27,4.46,4.46,4.38,4.37,4.39,4.36,4.45,4.46,
+4.56,4.48,4.47,4.52,4.68,4.52,4.55,4.45,4.52,4.43,
+4.49,4.62,4.67,4.56,4.66,4.72,4.69,4.54,4.53,4.55,
+0.84,0.85,0.89,0.94,0.92,0.98,1.00,1.05,1.10,1.06,
+1.17,1.17,1.21,1.21,1.18,1.26,1.21,1.33,1.34,1.37,
+1.40,1.43,1.43,1.48,1.45,1.47,1.51,1.57,1.58,1.57,
+1.60,1.66,1.64,1.58,1.60,1.67,1.71,1.79,1.70,1.77,
+1.78,1.84,1.83,1.82,1.81,1.80,1.82,1.89,1.93,1.86,
+1.88,1.99,1.91,2.00,1.97,1.98,2.05,2.05,2.08,2.10,
+2.15,2.09,2.07,2.19,2.12,2.16,2.11,2.23,2.21,2.21,
+2.22,2.13,2.20,2.31,2.18,2.18,2.19,2.30,2.33,2.32,
+2.39,2.39,2.27,2.38,2.39,2.48,2.45,2.34,2.41,2.44,
+2.52,2.46,2.43,2.48,2.59,2.44,2.47,2.62,2.52,2.58,
+2.64,2.64,2.65,2.64,2.64,2.64,2.77,2.67,2.66,2.69,
+2.62,2.70,2.82,2.68,2.89,2.80,2.91,2.79,2.80,2.82,
+2.70,2.91,2.82,2.94,2.70,2.91,3.02,3.00,2.97,2.84,
+2.91,2.98,2.84,3.17,2.94,2.89,3.10,3.02,3.00,3.09,
+3.03,3.06,3.03,2.99,3.09,3.02,3.09,3.19,3.14,3.11,
+3.25,3.22,3.21,3.21,3.21,3.26,3.12,3.00,3.18,3.17,
+3.30,3.14,3.20,3.22,3.08,3.20,3.22,3.26,3.27,3.30,
+3.22,3.34,3.32,3.32,3.47,3.20,3.41,3.31,3.46,3.44,
+3.62,3.58,3.39,3.30,3.53,3.56,3.54,3.52,3.36,3.50,
+3.58,3.57,3.53,3.62,3.60,3.64,3.60,3.56,3.56,3.55,
+3.51,3.51,3.69,3.80,3.48,3.69,3.79,3.53,3.62,3.63,
+3.68,3.72,3.61,3.75,3.66,3.70,3.79,3.74,3.77,3.67,
+3.75,3.85,3.73,3.75,3.86,3.74,3.89,3.70,3.79,3.79,
+3.92,3.92,3.73,3.86,3.78,3.69,3.93,3.81,3.79,3.77,
+3.81,3.99,3.92,3.84,4.05,3.81,3.89,3.97,4.02,3.98,
+3.93,4.18,4.02,3.95,3.86,3.94,3.85,3.91,4.18,4.03,
+4.12,3.97,4.22,4.25,4.02,4.16,4.19,4.06,4.10,4.05,
+4.22,4.16,4.04,4.00,4.15,4.19,4.13,4.11,4.10,4.40,
+4.27,4.13,4.07,4.12,4.23,4.33,4.08,4.21,4.23,4.32,
+0.75,0.78,0.82,0.85,0.84,0.94,0.90,0.98,0.97,1.02,
+1.04,1.09,1.08,1.12,1.12,1.18,1.21,1.19,1.20,1.25,
+1.29,1.28,1.31,1.29,1.30,1.33,1.38,1.40,1.43,1.45,
+1.46,1.41,1.47,1.48,1.51,1.55,1.59,1.56,1.53,1.64,
+1.58,1.66,1.65,1.69,1.73,1.72,1.76,1.72,1.74,1.79,
+1.80,1.87,1.80,1.82,1.80,1.86,1.93,1.87,1.88,1.91,
+1.91,1.92,2.01,1.97,1.95,2.01,2.04,2.05,2.03,2.05,
+2.02,2.06,2.02,2.13,2.12,2.15,2.14,2.14,2.12,2.07,
+2.21,2.20,2.25,2.13,2.18,2.20,2.22,2.23,2.29,2.24,
+2.31,2.28,2.22,2.33,2.41,2.31,2.36,2.55,2.39,2.39,
+2.41,2.38,2.38,2.43,2.49,2.58,2.53,2.46,2.49,2.50,
+2.46,2.39,2.57,2.56,2.54,2.59,2.57,2.68,2.53,2.50,
+2.63,2.55,2.58,2.63,2.54,2.79,2.67,2.74,2.66,2.65,
+2.75,2.76,2.75,2.66,2.78,2.87,2.75,2.85,2.66,2.75,
+2.79,2.79,2.85,2.99,2.73,2.87,2.77,2.89,2.97,2.86,
+2.95,2.96,2.93,2.92,2.91,2.85,2.87,2.94,3.01,2.97,
+3.14,3.15,2.97,2.91,2.84,2.99,3.00,2.97,3.06,3.12,
+3.08,3.11,3.24,3.02,3.05,3.20,3.24,3.13,3.16,3.10,
+3.22,3.28,3.27,3.23,3.18,3.16,3.24,3.19,3.28,3.04,
+3.24,3.32,3.18,3.29,3.26,3.33,3.35,3.20,3.20,3.36,
+3.26,3.34,3.40,3.47,3.41,3.23,3.45,3.30,3.35,3.43,
+3.32,3.28,3.34,3.39,3.40,3.46,3.59,3.49,3.46,3.44,
+3.53,3.46,3.47,3.55,3.56,3.44,3.60,3.52,3.47,3.48,
+3.53,3.54,3.48,3.55,3.52,3.67,3.69,3.68,3.58,3.64,
+3.70,3.64,3.82,3.62,3.64,3.72,3.59,3.67,3.56,3.69,
+3.66,3.82,3.71,3.62,3.64,3.87,3.69,3.75,3.87,3.62,
+3.73,4.00,3.84,3.70,3.77,3.82,3.84,3.78,3.81,3.70,
+3.80,3.90,3.96,3.83,3.80,3.83,3.94,3.69,4.04,3.72,
+4.07,3.85,3.83,4.00,3.77,4.04,4.01,3.87,3.72,3.91,
+0.68,0.72,0.74,0.79,0.81,0.82,0.87,0.90,0.92,0.93,
+0.96,1.02,1.03,1.04,1.06,1.09,1.08,1.06,1.15,1.15,
+1.13,1.17,1.23,1.19,1.23,1.27,1.21,1.29,1.32,1.33,
+1.35,1.33,1.39,1.38,1.44,1.45,1.45,1.46,1.42,1.47,
+1.52,1.55,1.50,1.49,1.56,1.56,1.53,1.62,1.58,1.60,
+1.68,1.70,1.71,1.58,1.69,1.72,1.75,1.76,1.69,1.82,
+1.86,1.80,1.73,1.80,1.91,1.87,1.87,1.86,1.90,1.95,
+1.81,1.83,1.99,1.92,1.95,1.94,1.93,1.95,1.95,1.97,
+2.00,2.00,2.01,2.05,2.01,2.06,2.11,2.10,2.14,2.03,
+2.04,2.15,2.17,2.14,2.23,2.14,2.19,2.18,2.18,2.31,
+2.19,2.17,2.26,2.31,2.36,2.35,2.23,2.35,2.32,2.26,
+2.30,2.33,2.37,2.36,2.28,2.28,2.38,2.41,2.38,2.44,
+2.42,2.58,2.32,2.53,2.51,2.43,2.43,2.49,2.46,2.41,
+2.50,2.43,2.49,2.54,2.48,2.53,2.56,2.52,2.59,2.63,
+2.61,2.58,2.63,2.66,2.56,2.66,2.65,2.70,2.70,2.69,
+2.63,2.62,2.73,2.76,2.68,2.83,2.75,2.74,2.80,2.80,
+2.70,2.69,2.82,2.89,2.81,2.75,2.82,2.90,2.84,2.79,
+2.86,2.91,2.95,2.93,2.92,2.97,2.88,3.04,2.96,2.94,
+3.05,3.05,2.92,2.99,2.91,2.90,2.94,2.93,3.08,2.98,
+2.98,2.95,3.04,3.16,2.97,3.08,2.89,3.08,3.17,3.04,
+3.07,3.00,3.21,3.10,3.17,3.10,3.09,3.07,3.03,3.12,
+3.10,3.22,3.09,3.16,3.26,3.16,3.11,3.23,3.14,3.22,
+3.32,3.21,3.18,3.23,3.22,3.13,3.26,3.26,3.27,3.28,
+3.26,3.30,3.37,3.22,3.39,3.28,3.29,3.45,3.15,3.32,
+3.34,3.41,3.59,3.42,3.31,3.44,3.34,3.42,3.35,3.51,
+3.32,3.46,3.19,3.35,3.36,3.50,3.36,3.48,3.37,3.40,
+3.54,3.46,3.63,3.55,3.48,3.54,3.59,3.46,3.52,3.54,
+3.40,3.65,3.52,3.57,3.52,3.54,3.48,3.51,3.65,3.62,
+3.58,3.75,3.61,3.67,3.62,3.77,3.53,3.60,3.69,3.68,
+0.62,0.66,0.68,0.74,0.76,0.80,0.79,0.84,0.89,0.86,
+0.86,0.89,0.92,0.94,0.98,1.00,1.00,0.98,1.05,1.06,
+1.07,1.08,1.09,1.13,1.09,1.16,1.20,1.23,1.21,1.22,
+1.25,1.21,1.26,1.34,1.31,1.37,1.34,1.35,1.37,1.42,
+1.41,1.37,1.40,1.42,1.49,1.45,1.44,1.45,1.49,1.46,
+1.50,1.54,1.49,1.57,1.55,1.63,1.67,1.50,1.65,1.64,
+1.58,1.61,1.59,1.67,1.74,1.73,1.73,1.75,1.70,1.78,
+1.71,1.73,1.73,1.79,1.69,1.81,1.80,1.82,1.80,1.89,
+1.85,1.86,1.87,1.86,1.83,1.93,1.90,1.89,1.91,1.96,
+1.99,1.95,1.95,1.97,1.94,1.96,2.01,2.01,2.05,2.02,
+2.05,2.08,2.11,2.07,2.05,2.06,2.09,2.14,2.03,2.09,
+2.12,2.17,2.07,2.16,2.19,2.07,2.17,2.15,2.17,2.21,
+2.28,2.21,2.26,2.23,2.23,2.27,2.30,2.16,2.29,2.33,
+2.27,2.31,2.41,2.25,2.31,2.35,2.40,2.46,2.33,2.36,
+2.31,2.47,2.42,2.34,2.27,2.43,2.46,2.39,2.42,2.45,
+2.51,2.51,2.43,2.34,2.51,2.49,2.47,2.59,2.46,2.54,
+2.50,2.58,2.60,2.55,2.59,2.69,2.61,2.56,2.66,2.65,
+2.62,2.62,2.56,2.58,2.69,2.66,2.63,2.59,2.74,2.55,
+2.69,2.69,2.72,2.64,2.71,2.75,2.79,2.78,2.79,2.77,
+2.68,2.64,2.71,2.66,2.69,2.82,2.81,2.70,2.86,2.77,
+2.81,2.87,2.85,2.76,2.85,2.90,2.80,2.85,2.89,2.88,
+3.06,2.91,2.95,3.07,2.92,2.96,2.95,2.92,2.82,2.88,
+2.90,2.87,3.06,3.12,3.03,2.94,3.06,3.05,2.96,2.97,
+3.16,2.97,3.03,3.01,2.96,3.19,2.90,3.04,2.98,2.98,
+3.03,3.13,3.19,3.25,3.20,3.09,2.98,3.08,3.24,3.09,
+3.09,3.20,3.10,3.08,3.09,3.19,3.05,3.18,3.17,3.16,
+3.26,3.20,3.10,3.14,3.27,3.22,3.23,3.27,3.18,3.30,
+3.42,3.19,3.28,3.21,3.32,3.29,3.29,3.28,3.37,3.26,
+3.24,3.29,3.41,3.33,3.42,3.27,3.30,3.32,3.29,3.29,
+0.57,0.60,0.63,0.70,0.66,0.73,0.73,0.74,0.77,0.82,
+0.81,0.85,0.85,0.87,0.89,0.89,0.88,0.91,0.93,0.98,
+1.01,0.99,1.01,1.05,1.08,1.03,1.07,1.10,1.09,1.15,
+1.14,1.19,1.18,1.21,1.19,1.24,1.19,1.22,1.32,1.24,
+1.28,1.28,1.27,1.30,1.33,1.33,1.34,1.35,1.35,1.39,
+1.34,1.47,1.41,1.38,1.40,1.44,1.45,1.48,1.51,1.48,
+1.54,1.62,1.54,1.57,1.56,1.57,1.49,1.59,1.59,1.60,
+1.64,1.56,1.67,1.68,1.57,1.64,1.62,1.69,1.65,1.70,
+1.69,1.67,1.72,1.73,1.74,1.72,1.73,1.78,1.81,1.69,
+1.87,1.82,1.77,1.88,1.83,1.79,1.82,1.85,1.87,1.80,
+1.94,1.85,1.85,1.85,1.91,1.94,1.91,1.90,1.93,2.00,
+1.92,1.97,2.01,1.89,2.00,1.98,2.03,2.02,2.08,2.08,
+2.03,2.09,2.08,2.06,2.08,2.11,2.09,2.08,2.13,2.12,
+2.09,2.17,2.17,2.14,2.11,2.17,2.09,2.09,2.19,2.21,
+2.13,2.24,2.28,2.26,2.20,2.21,2.12,2.19,2.16,2.32,
+2.20,2.29,2.26,2.34,2.20,2.23,2.30,2.25,2.26,2.31,
+2.32,2.28,2.29,2.42,2.37,2.46,2.35,2.25,2.34,2.45,
+2.47,2.41,2.35,2.34,2.37,2.41,2.51,2.46,2.39,2.45,
+2.43,2.52,2.48,2.45,2.52,2.47,2.45,2.40,2.47,2.61,
+2.43,2.56,2.53,2.56,2.52,2.47,2.59,2.56,2.57,2.52,
+2.61,2.51,2.66,2.59,2.66,2.65,2.62,2.63,2.68,2.70,
+2.63,2.57,2.74,2.65,2.72,2.73,2.69,2.75,2.75,2.62,
+2.64,2.66,2.75,2.66,2.74,2.74,2.73,2.68,2.71,2.83,
+2.83,2.79,2.79,2.71,2.87,2.70,2.86,2.77,2.90,2.78,
+2.95,2.87,2.92,3.01,2.77,2.94,2.83,2.98,2.98,2.97,
+2.83,2.90,2.97,2.86,2.86,2.92,2.95,2.88,2.90,2.87,
+2.86,2.95,2.87,2.91,2.99,3.00,3.02,2.93,3.02,2.89,
+3.03,3.08,2.99,3.02,3.08,2.88,3.05,2.97,2.92,3.07,
+3.16,3.05,2.99,3.07,3.10,3.17,3.18,3.03,3.16,3.14,
+0.54,0.57,0.59,0.61,0.62,0.64,0.69,0.69,0.74,0.70,
+0.74,0.77,0.81,0.81,0.82,0.81,0.86,0.89,0.88,0.89,
+0.90,0.93,0.94,0.94,0.96,0.97,1.01,1.02,1.06,1.04,
+1.08,1.07,1.07,1.09,1.11,1.14,1.13,1.15,1.17,1.16,
+1.18,1.23,1.20,1.20,1.23,1.20,1.22,1.26,1.26,1.19,
+1.36,1.27,1.30,1.29,1.30,1.34,1.28,1.33,1.40,1.39,
+1.29,1.42,1.46,1.37,1.46,1.46,1.41,1.51,1.38,1.45,
+1.45,1.48,1.51,1.51,1.53,1.50,1.58,1.58,1.49,1.51,
+1.56,1.59,1.63,1.58,1.57,1.53,1.61,1.58,1.62,1.64,
+1.65,1.61,1.65,1.73,1.67,1.66,1.68,1.72,1.67,1.74,
+1.74,1.79,1.71,1.76,1.75,1.69,1.69,1.75,1.82,1.77,
+1.80,1.81,1.85,1.81,1.80,1.79,1.81,1.87,1.88,1.86,
+1.85,1.83,1.87,1.89,1.92,1.91,1.91,2.04,1.93,1.93,
+1.97,2.03,1.91,1.98,1.92,1.90,1.97,2.03,2.03,1.94,
+1.94,2.02,2.09,1.96,2.05,2.04,1.98,2.08,2.07,2.08,
+2.04,2.11,2.03,2.12,2.08,2.06,2.11,2.07,2.02,2.15,
+2.15,2.11,2.10,2.20,2.14,2.14,2.14,2.21,2.18,2.18,
+2.13,2.17,2.34,2.21,2.22,2.31,2.19,2.27,2.21,2.23,
+2.30,2.26,2.30,2.29,2.28,2.31,2.23,2.22,2.36,2.27,
+2.37,2.23,2.39,2.33,2.34,2.32,2.35,2.38,2.28,2.41,
+2.29,2.46,2.40,2.30,2.44,2.31,2.39,2.47,2.41,2.38,
+2.45,2.46,2.44,2.47,2.47,2.39,2.49,2.53,2.45,2.41,
+2.54,2.53,2.41,2.48,2.54,2.51,2.51,2.56,2.51,2.66,
+2.38,2.55,2.59,2.51,2.69,2.58,2.60,2.58,2.64,2.58,
+2.65,2.66,2.61,2.67,2.68,2.66,2.66,2.57,2.73,2.59,
+2.61,2.75,2.60,2.63,2.71,2.59,2.65,2.64,2.63,2.66,
+2.68,2.75,2.72,2.81,2.73,2.82,2.69,2.65,2.77,2.78,
+2.77,2.90,2.85,2.77,2.72,2.75,2.68,2.82,2.84,2.82,
+2.70,2.97,2.74,2.80,2.85,2.84,2.83,2.93,2.77,2.79,
+0.45,0.51,0.55,0.58,0.55,0.59,0.60,0.65,0.62,0.66,
+0.67,0.69,0.71,0.71,0.77,0.79,0.75,0.78,0.85,0.82,
+0.80,0.83,0.86,0.85,0.90,0.91,0.94,0.94,0.92,0.95,
+0.98,0.97,0.99,1.01,0.94,1.02,1.00,1.03,1.00,1.02,
+1.08,1.06,1.11,1.08,1.08,1.11,1.13,1.17,1.13,1.13,
+1.18,1.18,1.14,1.23,1.23,1.23,1.25,1.21,1.25,1.25,
+1.25,1.25,1.30,1.30,1.27,1.29,1.27,1.33,1.26,1.34,
+1.33,1.36,1.35,1.38,1.37,1.42,1.37,1.41,1.38,1.44,
+1.42,1.45,1.51,1.49,1.49,1.44,1.56,1.48,1.52,1.44,
+1.44,1.55,1.57,1.52,1.54,1.49,1.57,1.60,1.56,1.58,
+1.62,1.59,1.57,1.59,1.61,1.69,1.57,1.58,1.59,1.64,
+1.67,1.68,1.63,1.67,1.70,1.71,1.67,1.73,1.62,1.69,
+1.76,1.66,1.69,1.71,1.79,1.77,1.80,1.71,1.79,1.78,
+1.76,1.77,1.89,1.70,1.83,1.78,1.82,1.81,1.85,1.82,
+1.81,1.90,1.86,1.90,1.85,1.87,1.86,1.90,1.87,1.87,
+1.89,1.82,1.89,1.93,1.97,1.96,1.93,1.92,1.95,2.00,
+2.02,1.97,1.97,1.97,1.92,1.97,1.98,1.96,2.02,2.03,
+2.01,1.97,2.07,2.10,2.04,2.00,2.00,2.10,2.04,2.04,
+2.04,2.06,2.00,2.08,2.08,2.07,2.00,2.12,2.08,2.11,
+2.08,2.16,2.16,2.16,2.20,2.06,2.17,2.17,2.12,2.21,
+2.13,2.27,2.17,2.19,2.20,2.19,2.24,2.26,2.14,2.24,
+2.25,2.32,2.26,2.14,2.22,2.27,2.18,2.21,2.26,2.30,
+2.35,2.13,2.34,2.27,2.28,2.34,2.37,2.29,2.38,2.32,
+2.29,2.31,2.34,2.39,2.28,2.37,2.25,2.44,2.32,2.40,
+2.25,2.43,2.42,2.45,2.47,2.35,2.39,2.40,2.30,2.36,
+2.52,2.45,2.44,2.43,2.42,2.54,2.31,2.47,2.42,2.46,
+2.44,2.30,2.46,2.41,2.56,2.49,2.50,2.52,2.43,2.41,
+2.54,2.58,2.57,2.51,2.48,2.56,2.49,2.56,2.46,2.59,
+2.55,2.59,2.51,2.56,2.54,2.54,2.57,2.68,2.67,2.64,
+0.44,0.47,0.48,0.49,0.51,0.55,0.56,0.57,0.60,0.60,
+0.61,0.68,0.68,0.69,0.66,0.69,0.71,0.71,0.74,0.75,
+0.76,0.75,0.77,0.78,0.83,0.79,0.79,0.85,0.86,0.84,
+0.84,0.91,0.86,0.90,0.89,0.95,0.98,0.95,0.93,0.99,
+0.93,1.00,0.98,1.03,1.02,0.98,1.06,1.08,1.03,1.08,
+1.08,1.08,1.06,1.12,1.10,1.14,1.10,1.15,1.16,1.14,
+1.14,1.16,1.11,1.16,1.19,1.22,1.20,1.18,1.19,1.25,
+1.21,1.21,1.26,1.25,1.24,1.24,1.29,1.23,1.34,1.32,
+1.31,1.32,1.36,1.30,1.33,1.30,1.31,1.32,1.39,1.36,
+1.40,1.32,1.33,1.39,1.40,1.41,1.44,1.38,1.44,1.38,
+1.43,1.42,1.47,1.36,1.40,1.51,1.49,1.48,1.45,1.49,
+1.46,1.55,1.51,1.57,1.50,1.49,1.58,1.54,1.60,1.55,
+1.50,1.56,1.59,1.55,1.63,1.60,1.64,1.59,1.66,1.57,
+1.65,1.64,1.62,1.66,1.61,1.68,1.66,1.70,1.66,1.59,
+1.73,1.61,1.63,1.71,1.63,1.69,1.69,1.69,1.67,1.79,
+1.72,1.65,1.79,1.77,1.75,1.76,1.75,1.79,1.76,1.74,
+1.76,1.80,1.74,1.82,1.78,1.76,1.92,1.77,1.80,1.90,
+1.83,1.79,1.92,1.88,1.88,1.82,1.84,1.86,1.89,1.87,
+1.84,1.93,1.96,2.00,2.00,2.02,1.93,1.98,1.84,1.87,
+1.95,1.92,1.91,1.91,1.99,2.04,2.00,2.04,2.02,2.05,
+2.01,1.95,2.01,2.03,2.03,1.98,2.02,1.98,2.02,2.06,
+1.99,2.09,2.03,2.09,2.06,2.05,2.09,2.07,2.02,1.92,
+2.01,1.97,2.07,2.08,2.05,2.05,2.03,2.11,2.15,2.11,
+2.14,2.11,2.14,2.16,2.14,2.16,2.21,2.17,2.14,2.15,
+2.10,2.19,2.25,2.26,2.14,2.24,2.22,2.18,2.20,2.17,
+2.19,2.15,2.24,2.36,2.26,2.31,2.20,2.24,2.29,2.18,
+2.35,2.28,2.18,2.24,2.27,2.38,2.32,2.20,2.30,2.21,
+2.37,2.34,2.37,2.36,2.35,2.34,2.35,2.29,2.37,2.28,
+2.37,2.27,2.34,2.39,2.29,2.35,2.28,2.33,2.38,2.31,
+0.42,0.41,0.44,0.46,0.50,0.50,0.51,0.52,0.55,0.56,
+0.54,0.57,0.58,0.62,0.61,0.64,0.63,0.63,0.65,0.70,
+0.69,0.70,0.70,0.70,0.72,0.72,0.76,0.76,0.80,0.78,
+0.79,0.81,0.82,0.83,0.83,0.83,0.86,0.86,0.89,0.82,
+0.87,0.92,0.89,0.92,0.90,0.94,0.93,0.94,0.95,0.96,
+0.92,0.95,0.97,1.00,1.01,1.00,1.00,1.01,1.03,1.06,
+1.07,1.10,1.06,1.09,1.09,1.05,1.12,1.08,1.09,1.10,
+1.09,1.05,1.11,1.12,1.10,1.15,1.17,1.12,1.14,1.16,
+1.18,1.25,1.22,1.18,1.17,1.20,1.25,1.25,1.26,1.27,
+1.25,1.22,1.25,1.23,1.31,1.33,1.29,1.31,1.28,1.30,
+1.28,1.33,1.31,1.38,1.35,1.38,1.35,1.41,1.34,1.39,
+1.36,1.36,1.44,1.41,1.44,1.40,1.39,1.46,1.43,1.40,
+1.42,1.38,1.41,1.50,1.38,1.46,1.44,1.44,1.46,1.55,
+1.46,1.55,1.48,1.50,1.46,1.51,1.43,1.56,1.49,1.51,
+1.55,1.51,1.59,1.53,1.59,1.59,1.61,1.55,1.59,1.54,
+1.58,1.58,1.57,1.57,1.63,1.56,1.57,1.60,1.63,1.67,
+1.68,1.65,1.64,1.62,1.67,1.62,1.64,1.71,1.68,1.63,
+1.64,1.61,1.67,1.64,1.69,1.68,1.75,1.72,1.71,1.74,
+1.74,1.81,1.74,1.71,1.75,1.77,1.73,1.70,1.73,1.74,
+1.76,1.67,1.79,1.78,1.78,1.83,1.80,1.76,1.77,1.79,
+1.81,1.79,1.75,1.84,1.91,1.85,1.84,1.81,1.86,1.85,
+1.89,1.87,1.83,1.81,1.81,1.86,1.83,1.92,1.91,1.87,
+1.80,1.87,1.86,1.87,1.92,1.90,1.90,1.88,1.95,2.00,
+2.03,1.95,2.02,1.97,1.91,2.04,1.95,1.88,2.01,2.01,
+2.05,1.95,2.04,1.95,2.05,2.14,2.12,2.05,2.00,1.97,
+1.97,1.99,1.97,2.09,2.05,2.02,2.03,2.02,2.01,2.06,
+2.05,2.01,2.06,2.02,1.95,2.01,2.12,2.08,2.05,2.10,
+2.03,2.08,2.18,2.08,2.07,2.14,2.17,2.10,2.06,2.17,
+2.14,2.09,2.20,2.13,2.18,2.16,2.13,2.20,2.16,2.08,
+1.23,1.25,1.28,1.33,1.36,1.39,1.45,1.45,1.54,1.63,
+1.62,1.65,1.74,1.72,1.78,1.75,1.87,1.90,1.88,1.84,
+1.97,2.01,1.98,2.06,2.09,2.15,2.22,2.12,2.23,2.17,
+2.28,2.36,2.32,2.39,2.32,2.39,2.44,2.59,2.43,2.43,
+2.54,2.51,2.62,2.60,2.59,2.57,2.71,2.66,2.67,2.72,
+2.81,2.68,2.74,2.79,2.79,2.88,2.95,2.96,2.92,2.93,
+2.91,3.04,2.94,3.00,3.12,3.07,3.12,3.14,3.25,3.19,
+3.18,3.29,3.21,3.19,3.26,3.32,3.34,3.47,3.33,3.30,
+3.35,3.42,3.46,3.36,3.39,3.38,3.44,3.47,3.52,3.55,
+3.55,3.46,3.54,3.66,3.64,3.66,3.65,3.78,3.62,3.81,
+3.79,3.87,3.62,3.72,3.81,3.76,3.79,3.83,3.74,3.79,
+3.88,3.71,4.03,3.84,3.86,4.06,4.00,4.11,4.00,3.96,
+4.00,4.02,4.09,3.99,4.15,4.02,4.17,4.07,4.25,4.14,
+4.22,4.30,4.27,4.22,4.36,4.24,4.21,4.24,4.41,4.34,
+4.38,4.20,4.19,4.38,4.23,4.56,4.44,4.47,4.47,4.47,
+4.38,4.59,4.49,4.39,4.51,4.46,4.44,4.82,4.57,4.52,
+4.61,4.81,4.73,4.85,4.54,4.63,4.67,4.55,4.59,4.73,
+4.62,4.61,4.82,4.73,4.91,4.98,4.63,4.94,4.79,4.91,
+4.91,4.78,4.89,4.74,4.84,4.85,4.81,5.14,5.17,4.95,
+4.88,5.03,5.06,5.17,4.93,5.04,5.16,4.84,5.27,5.09,
+4.99,5.19,5.12,5.23,5.11,5.49,5.34,5.15,5.31,5.29,
+5.31,5.22,5.36,5.22,5.26,5.30,5.23,5.29,5.48,5.43,
+5.33,5.34,5.38,5.19,5.43,5.47,5.40,5.59,5.53,5.66,
+5.47,5.71,5.64,5.34,5.60,5.61,5.47,5.72,5.54,5.54,
+5.32,5.70,5.46,5.60,5.71,5.46,5.76,5.83,5.63,5.63,
+5.50,5.60,5.71,5.50,5.70,5.88,5.81,5.71,5.88,5.72,
+5.80,6.05,5.67,5.99,5.99,5.81,5.82,5.77,5.90,5.82,
+5.80,5.89,5.87,6.01,6.09,5.76,6.27,5.88,5.93,5.78,
+5.85,6.04,6.05,5.97,6.09,5.94,6.04,6.16,5.86,6.16,
+1.08,1.13,1.16,1.26,1.35,1.36,1.38,1.45,1.55,1.50,
+1.55,1.59,1.57,1.61,1.74,1.69,1.74,1.77,1.80,1.76,
+1.89,1.92,1.99,1.97,2.00,2.09,2.08,2.05,2.11,2.18,
+2.10,2.17,2.23,2.20,2.29,2.39,2.41,2.27,2.37,2.22,
+2.47,2.47,2.47,2.44,2.56,2.52,2.47,2.54,2.57,2.57,
+2.55,2.64,2.79,2.85,2.65,2.67,2.78,2.76,2.76,2.88,
+2.85,2.89,2.91,2.90,2.83,2.90,3.02,3.12,3.06,2.94,
+3.06,3.04,3.01,3.11,3.14,3.12,3.21,3.22,3.19,3.16,
+3.22,3.31,3.26,3.32,3.34,3.44,3.31,3.41,3.36,3.38,
+3.46,3.39,3.36,3.33,3.52,3.55,3.56,3.52,3.56,3.43,
+3.64,3.51,3.71,3.60,3.65,3.56,3.68,3.63,3.70,3.73,
+3.79,3.76,3.75,3.96,3.93,3.76,3.84,3.81,3.79,3.93,
+3.88,3.88,3.91,3.97,3.89,3.91,3.88,3.95,3.99,3.95,
+4.22,4.09,4.09,4.03,3.99,4.09,4.32,4.13,4.07,4.19,
+4.17,4.10,4.43,4.31,4.14,4.27,4.32,4.21,4.36,4.26,
+4.19,4.38,4.34,4.25,4.27,4.34,4.43,4.36,4.46,4.46,
+4.46,4.58,4.43,4.42,4.53,4.32,4.38,4.42,4.47,4.45,
+4.55,4.46,4.62,4.65,4.80,4.41,4.39,4.61,4.69,4.68,
+4.77,4.68,4.53,4.86,4.77,4.62,4.81,4.86,4.68,4.72,
+5.02,4.84,4.84,4.73,4.78,4.92,5.03,5.01,4.70,4.92,
+4.86,4.97,4.71,4.90,5.01,5.08,5.34,4.92,5.00,5.21,
+4.88,5.09,4.83,5.16,5.07,5.07,5.15,5.00,5.27,5.17,
+5.29,5.27,5.45,5.21,5.13,5.18,5.27,5.23,5.27,5.33,
+5.22,5.27,5.23,5.24,5.30,5.59,5.17,5.21,5.21,5.43,
+5.25,5.38,5.57,5.45,5.31,5.50,5.42,5.48,5.61,5.25,
+5.55,5.47,5.50,5.62,5.58,5.52,5.66,5.37,5.49,5.69,
+5.61,5.71,5.60,5.67,5.80,5.76,5.66,5.49,5.45,5.86,
+5.68,5.73,5.91,5.68,5.76,5.73,5.90,5.87,5.61,5.73,
+6.12,5.95,5.51,5.96,5.89,5.68,5.84,5.86,5.62,5.84,
+1.03,1.16,1.21,1.21,1.22,1.34,1.38,1.40,1.44,1.49,
+1.43,1.52,1.57,1.58,1.59,1.71,1.73,1.69,1.75,1.74,
+1.79,1.78,1.91,1.87,1.94,1.92,1.96,2.03,2.03,2.07,
+2.07,2.19,2.14,2.17,2.30,2.12,2.21,2.24,2.26,2.36,
+2.27,2.37,2.33,2.37,2.43,2.36,2.48,2.44,2.49,2.47,
+2.47,2.48,2.53,2.64,2.61,2.67,2.64,2.66,2.60,2.66,
+2.80,2.68,2.77,2.74,2.75,2.79,2.85,2.91,2.89,2.91,
+2.79,2.97,2.90,2.96,2.99,2.99,3.06,2.98,3.00,3.03,
+3.08,3.05,3.10,3.06,3.21,3.22,3.24,3.18,3.17,3.22,
+3.26,3.29,3.21,3.20,3.29,3.21,3.43,3.45,3.37,3.55,
+3.50,3.42,3.45,3.42,3.45,3.57,3.55,3.58,3.46,3.61,
+3.55,3.64,3.67,3.49,3.64,3.49,3.72,3.66,3.68,3.68,
+3.67,3.83,3.69,3.77,3.82,3.75,3.93,3.79,3.73,3.74,
+3.78,3.92,3.83,3.76,3.95,3.94,3.89,4.00,3.88,3.84,
+3.94,3.86,3.93,3.95,4.01,4.07,4.03,4.03,3.95,4.22,
+4.15,4.24,4.22,4.00,4.28,4.17,4.23,4.07,4.23,4.15,
+4.22,4.26,4.25,4.28,4.22,4.33,4.48,4.41,4.43,4.42,
+4.50,4.31,4.37,4.42,4.41,4.46,4.31,4.58,4.54,4.57,
+4.66,4.55,4.39,4.57,4.59,4.66,4.51,4.60,4.48,4.56,
+4.55,4.69,4.74,4.43,4.71,4.65,4.73,4.77,4.73,4.86,
+4.70,4.87,4.58,4.64,4.73,4.65,4.71,4.63,4.69,4.59,
+4.76,4.75,4.91,4.85,4.78,4.75,4.87,4.78,4.87,4.78,
+5.11,4.90,4.82,5.00,4.94,4.98,4.92,5.00,4.95,5.08,
+4.99,4.88,5.01,5.03,5.20,5.05,5.17,5.18,5.10,4.96,
+4.96,5.05,5.12,4.97,5.35,5.15,5.09,5.22,5.18,5.28,
+5.02,5.07,5.42,5.28,5.23,5.40,5.09,5.17,5.40,5.45,
+5.39,5.60,5.30,5.40,5.43,5.42,5.25,5.20,5.57,5.59,
+5.31,5.41,5.35,5.34,5.45,5.33,5.38,5.72,5.35,5.70,
+5.54,5.71,5.46,5.52,5.57,5.46,5.71,5.35,5.60,5.88,
+1.04,1.09,1.09,1.15,1.18,1.23,1.26,1.30,1.42,1.35,
+1.39,1.46,1.50,1.50,1.51,1.58,1.60,1.65,1.66,1.76,
+1.78,1.77,1.78,1.86,1.83,1.82,1.84,1.96,1.84,2.00,
+1.91,2.01,1.96,1.98,2.03,2.07,2.18,2.07,2.18,2.15,
+2.06,2.25,2.25,2.21,2.29,2.36,2.36,2.25,2.40,2.27,
+2.38,2.45,2.43,2.50,2.47,2.62,2.61,2.51,2.59,2.48,
+2.63,2.71,2.65,2.69,2.73,2.63,2.75,2.84,2.82,2.72,
+2.72,2.75,2.87,2.80,2.86,3.02,2.91,2.87,2.97,3.13,
+2.91,2.85,3.08,3.05,3.14,2.98,3.04,3.01,3.03,3.05,
+3.07,3.20,3.08,3.13,3.25,3.10,3.21,3.12,3.17,3.30,
+3.31,3.14,3.27,3.26,3.13,3.36,3.27,3.40,3.47,3.32,
+3.38,3.33,3.37,3.41,3.52,3.43,3.45,3.56,3.60,3.59,
+3.56,3.52,3.69,3.53,3.56,3.70,3.50,3.60,3.53,3.72,
+3.56,3.61,3.64,3.75,3.77,3.72,3.73,3.72,3.83,3.80,
+3.90,3.93,3.84,3.84,3.86,3.91,3.90,4.09,3.97,3.90,
+3.99,3.86,3.99,3.95,3.95,4.06,3.99,3.93,4.13,4.02,
+4.03,4.14,4.15,4.24,4.21,4.12,4.06,4.06,4.09,4.04,
+4.29,4.13,4.35,4.35,4.11,4.05,4.12,4.16,4.29,4.15,
+4.23,4.28,4.27,4.47,4.27,4.22,4.31,4.34,4.14,4.38,
+4.36,4.14,4.25,4.34,4.46,4.40,4.35,4.32,4.54,4.42,
+4.32,4.42,4.58,4.41,4.61,4.56,4.50,4.62,4.52,4.67,
+4.63,4.64,4.62,4.48,4.80,4.58,4.79,4.58,4.56,4.60,
+4.84,4.63,4.70,4.84,5.00,4.69,4.67,4.72,4.90,4.79,
+4.79,4.72,5.02,4.80,4.80,4.78,4.83,4.91,4.85,4.95,
+4.85,4.88,4.92,4.83,5.05,4.80,4.95,4.92,4.94,5.02,
+5.13,4.98,5.07,5.07,5.11,5.08,5.05,4.87,5.04,5.30,
+5.19,5.23,4.98,5.09,4.94,5.28,5.14,5.27,5.16,5.07,
+5.19,5.37,5.11,5.38,5.33,5.46,5.25,5.32,5.27,5.19,
+5.26,5.52,4.93,5.24,5.49,5.29,5.58,5.32,5.16,5.37,
+0.92,1.00,1.06,1.09,1.16,1.15,1.19,1.24,1.30,1.27,
+1.34,1.34,1.39,1.48,1.42,1.49,1.53,1.55,1.54,1.69,
+1.62,1.67,1.72,1.66,1.75,1.75,1.80,1.84,1.82,1.82,
+1.79,1.88,1.85,1.92,1.97,1.97,2.02,2.03,2.00,2.02,
+2.05,2.06,2.11,2.08,2.16,2.09,2.20,2.23,2.29,2.14,
+2.27,2.31,2.27,2.26,2.31,2.35,2.29,2.46,2.48,2.45,
+2.49,2.46,2.58,2.47,2.60,2.56,2.51,2.46,2.53,2.57,
+2.58,2.59,2.70,2.68,2.79,2.66,2.61,2.79,2.70,2.79,
+2.75,2.79,2.75,2.83,2.85,2.83,2.96,2.78,3.00,2.84,
+2.86,2.92,3.03,3.02,3.00,3.03,2.95,2.99,2.97,2.95,
+2.98,3.05,3.04,3.16,3.08,3.18,3.26,3.22,3.13,3.16,
+3.21,3.20,3.14,3.10,3.16,3.25,3.25,3.43,3.28,3.41,
+3.18,3.57,3.21,3.32,3.48,3.51,3.49,3.55,3.50,3.37,
+3.43,3.36,3.46,3.49,3.52,3.36,3.51,3.50,3.41,3.64,
+3.70,3.50,3.68,3.70,3.63,3.59,3.74,3.48,3.61,3.78,
+3.75,3.78,3.66,3.84,3.65,3.84,3.56,3.94,3.82,3.81,
+3.76,3.87,3.82,3.65,3.67,3.73,3.85,4.04,4.18,3.91,
+3.94,3.82,4.01,3.97,3.90,4.01,4.03,3.85,3.87,4.06,
+4.04,4.01,3.94,4.06,4.06,4.02,4.02,3.95,4.31,4.14,
+4.19,4.29,4.01,4.19,4.17,4.29,4.23,4.22,4.18,4.24,
+4.28,4.25,4.30,4.43,4.14,4.33,4.19,4.49,4.47,4.30,
+4.36,4.42,4.34,4.30,4.29,4.19,4.41,4.38,4.33,4.50,
+4.50,4.44,4.53,4.51,4.27,4.64,4.62,4.53,4.59,4.43,
+4.48,4.63,4.56,4.50,4.57,4.39,4.67,4.62,4.50,4.71,
+4.54,4.58,4.74,4.77,4.49,4.62,4.67,4.59,4.53,4.83,
+4.62,4.72,4.74,4.65,4.69,4.93,4.95,4.82,4.80,4.83,
+4.92,4.91,4.77,4.79,4.65,4.84,4.91,4.81,4.69,4.93,
+5.05,4.85,4.97,4.94,4.86,4.97,5.03,4.89,4.90,5.09,
+4.81,5.04,5.16,5.05,4.86,5.02,5.07,5.19,4.72,4.99,
+0.90,0.95,0.96,1.00,1.05,1.10,1.14,1.17,1.21,1.19,
+1.26,1.26,1.35,1.32,1.33,1.41,1.40,1.43,1.45,1.51,
+1.53,1.57,1.59,1.63,1.61,1.67,1.67,1.63,1.78,1.78,
+1.72,1.76,1.79,1.90,1.86,1.89,1.87,1.88,1.92,1.92,
+1.96,1.96,2.00,2.06,2.01,1.97,2.08,2.11,2.10,2.20,
+2.13,2.12,2.21,2.23,2.18,2.18,2.26,2.27,2.32,2.27,
+2.30,2.27,2.25,2.45,2.41,2.37,2.40,2.44,2.45,2.40,
+2.52,2.44,2.58,2.50,2.49,2.55,2.53,2.54,2.63,2.56,
+2.60,2.56,2.70,2.58,2.67,2.64,2.71,2.74,2.79,2.73,
+2.77,2.58,2.86,2.86,2.81,2.88,2.80,2.91,2.87,2.85,
+2.88,2.93,2.83,3.04,2.90,2.93,3.06,3.02,2.98,2.89,
+3.01,3.02,3.01,3.05,3.13,2.98,3.02,3.04,3.14,3.15,
+3.20,3.19,3.18,3.09,3.20,3.24,3.23,3.26,3.22,3.25,
+3.23,3.39,3.24,3.40,3.30,3.34,3.33,3.45,3.19,3.28,
+3.31,3.39,3.39,3.39,3.48,3.45,3.42,3.50,3.51,3.38,
+3.49,3.53,3.47,3.45,3.49,3.36,3.52,3.64,3.55,3.59,
+3.67,3.57,3.71,3.61,3.72,3.73,3.62,3.57,3.68,3.70,
+3.72,3.72,3.66,3.71,3.95,3.76,3.84,3.85,3.71,3.78,
+3.79,3.78,3.75,3.83,3.84,3.79,3.84,3.90,3.84,3.91,
+3.82,3.85,3.96,3.77,3.93,3.80,3.98,4.00,3.93,3.92,
+3.98,4.09,3.90,3.94,4.16,4.13,3.85,4.05,4.28,4.00,
+4.07,4.02,4.11,4.21,4.15,4.21,4.23,4.14,4.06,4.27,
+4.04,4.27,4.14,4.20,4.18,4.23,4.30,4.37,4.24,4.46,
+4.42,4.23,4.20,4.19,4.31,4.16,4.50,4.40,4.33,4.24,
+4.38,4.40,4.31,4.26,4.42,4.56,4.25,4.47,4.33,4.45,
+4.44,4.35,4.41,4.52,4.59,4.62,4.44,4.77,4.45,4.51,
+4.40,4.59,4.54,4.55,4.49,4.55,4.59,4.57,4.42,4.54,
+4.62,4.55,4.51,4.57,4.70,4.65,4.69,4.87,4.61,4.73,
+4.66,4.96,4.77,4.80,4.78,4.62,4.65,4.47,4.87,4.84,
+0.87,0.91,0.91,0.97,0.96,1.01,1.05,1.11,1.11,1.12,
+1.16,1.16,1.20,1.27,1.27,1.35,1.28,1.37,1.35,1.43,
+1.45,1.44,1.51,1.56,1.58,1.56,1.60,1.52,1.64,1.56,
+1.62,1.73,1.67,1.68,1.74,1.76,1.73,1.76,1.78,1.85,
+1.83,1.83,1.87,1.94,1.88,1.88,1.92,1.92,1.95,2.06,
+1.94,2.07,2.07,1.99,2.00,2.11,2.14,2.07,2.20,2.20,
+2.20,2.23,2.24,2.15,2.18,2.19,2.23,2.35,2.24,2.29,
+2.28,2.36,2.36,2.39,2.31,2.26,2.41,2.38,2.40,2.44,
+2.57,2.49,2.50,2.52,2.62,2.66,2.59,2.47,2.58,2.50,
+2.56,2.57,2.69,2.58,2.61,2.57,2.70,2.62,2.68,2.80,
+2.69,2.71,2.78,2.72,2.82,2.78,2.75,2.76,2.72,2.81,
+2.71,2.77,2.94,2.86,2.91,2.98,2.92,2.90,2.87,2.97,
+2.93,2.97,3.07,3.06,2.99,3.02,2.99,3.01,3.09,3.11,
+3.04,3.13,3.01,2.98,3.06,3.08,3.13,3.15,3.14,3.13,
+3.15,3.22,3.25,3.12,3.17,3.23,3.22,3.17,3.36,3.27,
+3.21,3.45,3.38,3.21,3.25,3.37,3.38,3.43,3.30,3.42,
+3.42,3.51,3.37,3.46,3.45,3.44,3.29,3.41,3.45,3.44,
+3.57,3.53,3.50,3.51,3.39,3.61,3.48,3.55,3.49,3.47,
+3.57,3.64,3.49,3.60,3.55,3.72,3.54,3.61,3.62,3.57,
+3.72,3.51,3.55,3.77,3.83,3.61,3.73,3.69,3.78,3.68,
+3.71,3.81,3.69,3.74,3.83,3.74,3.75,3.88,3.93,3.98,
+3.97,3.86,3.89,3.89,3.90,3.91,3.81,3.96,3.79,3.94,
+3.92,3.93,3.86,3.96,3.91,3.72,3.92,4.10,3.91,4.08,
+3.92,3.96,4.09,4.11,3.94,3.93,4.04,4.01,4.03,3.89,
+4.16,4.05,4.23,3.98,3.92,4.19,4.25,4.20,4.26,4.19,
+4.30,4.22,4.18,4.24,4.24,4.41,4.18,4.41,4.17,4.24,
+4.34,4.17,4.38,4.17,4.37,4.49,4.28,4.32,4.29,4.32,
+4.27,4.37,4.26,4.34,4.31,4.23,4.39,4.22,4.43,4.38,
+4.37,4.40,4.41,4.36,4.76,4.47,4.60,4.46,4.61,4.56,
+0.78,0.83,0.85,0.88,0.89,0.96,0.97,1.04,1.05,1.08,
+1.08,1.09,1.15,1.16,1.19,1.22,1.21,1.28,1.28,1.32,
+1.30,1.33,1.37,1.42,1.44,1.48,1.53,1.52,1.50,1.54,
+1.56,1.57,1.50,1.65,1.65,1.56,1.60,1.64,1.70,1.75,
+1.75,1.76,1.78,1.80,1.76,1.77,1.83,1.84,1.82,1.87,
+1.86,1.92,2.00,1.92,1.97,1.92,1.95,2.00,1.99,1.98,
+1.93,2.03,2.10,2.06,2.11,2.13,2.12,2.09,2.13,2.23,
+2.12,2.10,2.22,2.19,2.30,2.11,2.29,2.29,2.25,2.24,
+2.34,2.30,2.27,2.36,2.35,2.35,2.47,2.33,2.34,2.35,
+2.40,2.45,2.51,2.34,2.46,2.37,2.42,2.44,2.55,2.45,
+2.59,2.65,2.53,2.59,2.70,2.60,2.55,2.59,2.71,2.61,
+2.74,2.71,2.70,2.78,2.62,2.61,2.67,2.63,2.68,2.77,
+2.71,2.79,2.81,2.84,2.76,2.68,2.77,2.87,2.93,2.77,
+2.85,2.94,2.86,2.97,2.94,2.94,2.99,2.91,2.96,3.05,
+2.82,2.97,2.99,2.96,2.85,3.00,2.93,3.06,3.00,2.99,
+2.96,3.01,3.12,3.11,3.16,3.07,3.22,3.09,3.22,3.06,
+3.17,3.22,3.20,3.24,3.25,3.21,3.05,3.29,3.26,3.20,
+3.21,3.14,3.45,3.29,3.22,3.09,3.39,3.33,3.29,3.32,
+3.40,3.29,3.29,3.25,3.33,3.40,3.42,3.44,3.30,3.30,
+3.34,3.45,3.43,3.46,3.44,3.36,3.46,3.52,3.43,3.33,
+3.51,3.48,3.55,3.62,3.41,3.41,3.51,3.46,3.58,3.66,
+3.57,3.62,3.49,3.46,3.62,3.54,3.63,3.62,3.53,3.61,
+3.59,3.56,3.72,3.65,3.63,3.66,3.78,3.61,3.81,3.89,
+3.74,3.82,3.69,3.83,3.84,3.77,3.78,3.87,3.81,3.66,
+3.82,3.84,3.83,3.86,3.86,3.93,3.83,3.89,3.89,3.79,
+3.81,3.85,3.87,3.81,3.86,3.93,3.94,3.83,4.07,3.86,
+3.95,3.91,3.93,3.98,4.02,4.14,3.89,4.11,4.00,4.03,
+4.06,4.06,4.07,4.09,4.11,3.94,4.14,4.18,4.11,4.06,
+4.18,4.11,4.02,3.92,4.26,3.95,4.13,4.04,4.03,4.11,
+0.74,0.77,0.77,0.82,0.84,0.90,0.91,0.94,0.98,1.02,
+1.01,1.08,1.08,1.09,1.15,1.17,1.18,1.18,1.19,1.20,
+1.29,1.23,1.29,1.26,1.33,1.36,1.37,1.37,1.41,1.34,
+1.44,1.50,1.47,1.46,1.45,1.51,1.56,1.56,1.63,1.65,
+1.61,1.57,1.57,1.61,1.64,1.60,1.63,1.69,1.70,1.76,
+1.80,1.76,1.74,1.79,1.83,1.84,1.79,1.86,1.85,1.93,
+1.84,1.86,1.90,1.97,1.95,1.94,1.94,2.00,2.01,1.97,
+2.03,1.97,2.02,2.05,2.07,2.08,2.12,2.05,2.10,2.05,
+2.15,2.11,2.09,2.09,2.20,2.18,2.17,2.27,2.23,2.20,
+2.21,2.25,2.21,2.27,2.34,2.34,2.26,2.28,2.32,2.30,
+2.32,2.38,2.43,2.37,2.43,2.50,2.44,2.36,2.35,2.42,
+2.53,2.43,2.46,2.44,2.52,2.58,2.54,2.47,2.48,2.54,
+2.52,2.48,2.70,2.56,2.62,2.69,2.43,2.62,2.68,2.58,
+2.64,2.66,2.75,2.66,2.77,2.75,2.73,2.69,2.74,2.65,
+2.86,2.73,2.76,2.74,2.87,2.83,2.90,2.84,2.79,2.83,
+3.01,2.82,2.84,2.87,2.75,2.86,2.86,2.79,2.84,2.93,
+2.82,2.87,2.88,2.98,2.96,2.99,2.87,3.01,2.96,2.93,
+2.92,3.02,2.97,3.14,2.92,3.04,3.08,3.04,3.04,3.06,
+3.13,3.05,3.06,3.18,3.20,3.04,3.27,3.03,3.12,3.12,
+3.17,3.22,3.31,3.12,3.26,3.16,3.24,3.19,3.24,3.17,
+3.13,3.38,3.48,3.34,3.21,3.30,3.31,3.21,3.30,3.32,
+3.42,3.36,3.35,3.28,3.38,3.24,3.45,3.46,3.42,3.39,
+3.49,3.36,3.30,3.49,3.48,3.36,3.39,3.53,3.41,3.51,
+3.50,3.46,3.32,3.43,3.42,3.30,3.50,3.40,3.64,3.56,
+3.60,3.70,3.58,3.54,3.42,3.56,3.50,3.47,3.55,3.48,
+3.68,3.76,3.60,3.63,3.59,3.57,3.50,3.67,3.68,3.71,
+3.88,3.57,3.81,3.58,3.75,3.69,3.73,3.86,3.76,3.60,
+3.87,3.71,3.81,3.84,3.76,3.89,3.70,3.84,3.91,3.96,
+3.78,3.86,4.02,3.93,4.02,3.92,3.71,3.86,3.90,3.89,
+0.68,0.71,0.76,0.76,0.79,0.84,0.88,0.89,0.92,0.93,
+0.97,0.97,1.02,1.03,1.00,1.02,1.08,1.10,1.09,1.16,
+1.17,1.18,1.21,1.21,1.23,1.22,1.31,1.29,1.26,1.33,
+1.33,1.33,1.35,1.43,1.37,1.37,1.42,1.41,1.45,1.45,
+1.47,1.54,1.47,1.49,1.55,1.57,1.58,1.57,1.59,1.59,
+1.62,1.57,1.67,1.64,1.63,1.64,1.66,1.77,1.76,1.71,
+1.72,1.82,1.83,1.79,1.90,1.84,1.82,1.82,1.82,1.89,
+1.83,1.90,1.85,1.88,1.93,1.91,1.92,1.86,1.95,2.04,
+2.04,2.08,2.00,1.97,2.04,2.03,1.99,2.08,2.03,2.03,
+2.06,2.09,2.15,2.16,2.09,2.10,2.09,2.15,2.18,2.19,
+2.24,2.19,2.23,2.19,2.19,2.16,2.25,2.34,2.17,2.22,
+2.32,2.29,2.16,2.37,2.42,2.26,2.38,2.35,2.45,2.36,
+2.35,2.40,2.39,2.40,2.32,2.36,2.43,2.43,2.49,2.48,
+2.47,2.47,2.49,2.51,2.55,2.48,2.67,2.50,2.55,2.51,
+2.47,2.57,2.55,2.50,2.58,2.66,2.58,2.75,2.57,2.58,
+2.55,2.53,2.60,2.64,2.72,2.65,2.58,2.73,2.68,2.78,
+2.59,2.68,2.73,2.70,2.72,2.76,2.79,2.81,2.68,2.83,
+2.78,2.85,2.73,2.71,2.75,2.83,2.94,2.78,2.87,2.83,
+2.92,2.82,2.88,2.93,2.99,2.79,2.84,2.97,2.89,2.86,
+2.89,3.02,2.98,3.01,2.93,2.97,2.87,3.13,3.05,3.11,
+3.02,2.98,3.01,3.17,3.10,2.89,2.93,3.21,3.13,3.09,
+2.98,3.17,3.09,3.10,3.05,3.23,3.08,3.12,3.17,3.06,
+3.13,3.06,3.10,3.14,3.09,3.01,3.22,3.24,3.27,3.24,
+3.30,3.32,3.15,3.17,3.21,3.25,3.35,3.25,3.35,3.19,
+3.24,3.33,3.22,3.32,3.29,3.36,3.37,3.39,3.40,3.29,
+3.43,3.37,3.43,3.33,3.27,3.31,3.40,3.53,3.32,3.31,
+3.36,3.39,3.45,3.48,3.49,3.33,3.49,3.50,3.53,3.35,
+3.41,3.50,3.58,3.41,3.55,3.56,3.46,3.47,3.53,3.54,
+3.66,3.48,3.58,3.61,3.61,3.58,3.61,3.55,3.49,3.62,
+0.64,0.65,0.70,0.73,0.73,0.75,0.78,0.83,0.88,0.84,
+0.84,0.94,0.90,0.93,0.95,0.99,1.01,1.04,1.03,1.04,
+1.08,1.08,1.07,1.08,1.15,1.16,1.12,1.19,1.18,1.21,
+1.25,1.26,1.23,1.30,1.28,1.32,1.30,1.32,1.34,1.39,
+1.39,1.31,1.36,1.44,1.45,1.48,1.46,1.49,1.49,1.51,
+1.45,1.46,1.47,1.46,1.55,1.58,1.59,1.59,1.57,1.52,
+1.65,1.65,1.63,1.63,1.60,1.72,1.71,1.63,1.65,1.72,
+1.67,1.72,1.78,1.78,1.81,1.79,1.85,1.79,1.85,1.79,
+1.90,1.78,1.83,1.87,1.88,1.86,1.95,1.95,1.90,1.88,
+1.94,1.96,1.93,2.01,2.02,1.95,2.01,2.03,2.14,2.05,
+2.01,2.07,2.06,2.12,2.05,2.09,2.09,2.12,2.19,2.13,
+2.19,2.09,2.06,2.16,2.10,2.16,2.14,2.15,2.19,2.21,
+2.22,2.19,2.23,2.28,2.18,2.19,2.22,2.20,2.30,2.35,
+2.21,2.22,2.26,2.33,2.29,2.39,2.41,2.36,2.35,2.33,
+2.29,2.44,2.39,2.32,2.52,2.46,2.44,2.47,2.41,2.45,
+2.51,2.48,2.36,2.49,2.45,2.48,2.40,2.52,2.50,2.49,
+2.48,2.46,2.54,2.50,2.53,2.52,2.52,2.65,2.56,2.68,
+2.56,2.56,2.61,2.59,2.62,2.61,2.58,2.65,2.63,2.61,
+2.67,2.83,2.68,2.80,2.59,2.62,2.57,2.75,2.60,2.79,
+2.71,2.80,2.77,2.78,2.77,2.74,2.75,2.80,2.83,2.85,
+2.72,2.82,2.78,2.82,2.66,2.73,2.73,2.98,2.74,2.86,
+2.82,2.86,2.82,2.90,3.05,2.87,2.90,2.98,2.96,2.96,
+2.95,2.82,2.80,2.89,2.90,3.00,3.00,2.97,3.02,2.81,
+3.03,2.94,3.06,3.07,3.05,3.02,3.09,3.04,2.95,3.15,
+3.09,2.93,3.15,3.00,3.03,3.13,3.04,3.01,3.07,3.22,
+3.11,3.16,3.16,3.10,3.02,3.13,3.19,3.19,3.07,3.06,
+3.28,3.16,3.15,3.22,3.03,3.14,3.20,3.23,3.19,3.16,
+3.21,3.23,3.29,3.08,3.16,3.23,3.16,3.28,3.23,3.25,
+3.44,3.37,3.37,3.28,3.28,3.47,3.16,3.35,3.41,3.24,
+0.60,0.64,0.63,0.69,0.68,0.71,0.74,0.74,0.78,0.80,
+0.78,0.80,0.86,0.85,0.84,0.92,0.89,0.94,0.96,0.97,
+1.02,0.98,1.03,1.01,1.08,1.05,1.06,1.04,1.12,1.13,
+1.12,1.14,1.18,1.15,1.17,1.22,1.20,1.27,1.25,1.24,
+1.27,1.24,1.30,1.28,1.25,1.31,1.34,1.36,1.35,1.34,
+1.41,1.38,1.42,1.39,1.40,1.49,1.45,1.46,1.49,1.50,
+1.53,1.49,1.50,1.51,1.53,1.60,1.56,1.55,1.61,1.55,
+1.59,1.60,1.73,1.67,1.64,1.61,1.67,1.64,1.72,1.78,
+1.66,1.73,1.72,1.65,1.77,1.74,1.74,1.71,1.78,1.81,
+1.76,1.77,1.83,1.76,1.84,1.84,1.82,1.93,1.87,1.91,
+1.87,1.92,1.92,1.86,1.93,1.88,1.93,1.97,1.96,1.93,
+1.90,1.97,1.89,2.02,2.00,2.03,1.99,1.97,2.09,2.06,
+2.03,2.07,2.04,2.02,2.06,2.01,2.13,2.14,2.18,2.18,
+2.15,2.09,2.06,2.16,2.09,2.21,2.13,2.16,2.18,2.17,
+2.25,2.22,2.25,2.17,2.23,2.23,2.23,2.24,2.25,2.22,
+2.16,2.32,2.15,2.30,2.31,2.22,2.36,2.31,2.24,2.31,
+2.33,2.29,2.32,2.34,2.28,2.34,2.35,2.34,2.42,2.42,
+2.37,2.44,2.31,2.23,2.43,2.42,2.49,2.49,2.50,2.43,
+2.39,2.40,2.41,2.52,2.56,2.47,2.54,2.39,2.44,2.63,
+2.50,2.49,2.43,2.53,2.67,2.51,2.62,2.56,2.52,2.49,
+2.59,2.61,2.66,2.52,2.49,2.56,2.55,2.62,2.65,2.63,
+2.61,2.62,2.74,2.73,2.75,2.69,2.67,2.66,2.71,2.58,
+2.70,2.79,2.73,2.66,2.66,2.73,2.74,2.81,2.81,2.69,
+2.86,2.75,2.74,2.73,2.77,2.74,2.92,2.85,2.71,2.67,
+2.80,2.81,2.81,2.88,2.83,2.83,2.82,2.85,2.81,2.94,
+2.81,2.90,2.78,2.88,2.83,2.91,2.96,2.96,2.79,2.92,
+2.90,2.81,2.91,3.04,2.97,2.94,2.97,2.91,2.93,3.03,
+3.00,3.09,2.83,2.90,3.07,2.96,3.01,3.02,3.02,3.01,
+3.13,3.02,3.00,2.94,3.13,2.94,2.91,3.11,3.23,3.05,
+0.55,0.56,0.60,0.61,0.64,0.66,0.67,0.64,0.67,0.73,
+0.78,0.71,0.79,0.80,0.78,0.82,0.84,0.86,0.87,0.92,
+0.89,0.93,0.92,0.94,0.97,1.01,1.03,0.98,1.01,1.04,
+1.09,1.04,1.03,1.07,1.10,1.08,1.08,1.09,1.15,1.13,
+1.17,1.19,1.20,1.15,1.25,1.26,1.20,1.23,1.25,1.21,
+1.21,1.30,1.30,1.29,1.33,1.33,1.35,1.35,1.36,1.39,
+1.43,1.40,1.35,1.41,1.38,1.44,1.43,1.43,1.45,1.45,
+1.49,1.51,1.49,1.46,1.49,1.50,1.47,1.51,1.56,1.47,
+1.54,1.59,1.56,1.59,1.59,1.65,1.64,1.61,1.64,1.63,
+1.58,1.65,1.62,1.73,1.65,1.69,1.63,1.78,1.76,1.73,
+1.70,1.73,1.74,1.78,1.76,1.78,1.80,1.72,1.86,1.76,
+1.76,1.79,1.85,1.81,1.81,1.89,1.83,1.86,1.85,1.89,
+1.97,1.85,1.83,1.82,1.92,1.88,1.87,1.98,1.96,1.95,
+1.95,1.98,1.96,1.98,1.99,1.89,1.99,1.97,1.96,2.04,
+2.08,1.95,2.02,2.03,2.01,2.09,2.12,2.06,2.09,2.12,
+2.09,2.08,2.13,2.15,2.22,2.09,2.06,2.17,2.18,2.14,
+2.20,2.22,2.15,2.14,2.10,2.15,2.16,2.17,2.21,2.23,
+2.16,2.25,2.17,2.13,2.25,2.19,2.21,2.21,2.24,2.28,
+2.23,2.28,2.23,2.27,2.33,2.28,2.30,2.27,2.32,2.28,
+2.36,2.36,2.42,2.28,2.30,2.38,2.48,2.39,2.32,2.41,
+2.32,2.30,2.47,2.42,2.25,2.47,2.41,2.40,2.46,2.44,
+2.56,2.40,2.52,2.47,2.49,2.52,2.45,2.38,2.54,2.40,
+2.43,2.45,2.56,2.56,2.47,2.50,2.54,2.52,2.57,2.53,
+2.50,2.55,2.60,2.64,2.51,2.50,2.68,2.53,2.57,2.69,
+2.55,2.68,2.45,2.67,2.59,2.67,2.54,2.54,2.67,2.58,
+2.60,2.74,2.66,2.73,2.62,2.58,2.71,2.60,2.76,2.76,
+2.61,2.71,2.76,2.74,2.61,2.75,2.60,2.77,2.87,2.69,
+2.73,2.70,2.67,2.74,2.79,2.82,2.89,2.80,2.70,2.71,
+2.76,2.74,2.69,2.86,2.84,2.84,2.89,2.87,2.83,2.97,
+0.48,0.52,0.55,0.56,0.58,0.58,0.62,0.63,0.64,0.66,
+0.70,0.68,0.72,0.73,0.68,0.73,0.77,0.82,0.82,0.82,
+0.85,0.82,0.88,0.88,0.88,0.90,0.93,0.96,0.97,0.97,
+0.97,0.97,1.03,1.02,1.00,0.97,1.04,1.06,1.08,1.05,
+1.05,1.10,1.10,1.14,1.14,1.13,1.12,1.14,1.13,1.14,
+1.17,1.19,1.16,1.15,1.24,1.26,1.19,1.27,1.21,1.25,
+1.26,1.31,1.27,1.28,1.31,1.27,1.35,1.31,1.33,1.36,
+1.41,1.38,1.37,1.34,1.37,1.37,1.37,1.43,1.45,1.40,
+1.49,1.41,1.41,1.38,1.46,1.44,1.52,1.49,1.50,1.46,
+1.53,1.53,1.57,1.51,1.55,1.59,1.47,1.55,1.58,1.57,
+1.55,1.56,1.61,1.59,1.57,1.65,1.62,1.67,1.60,1.67,
+1.62,1.68,1.66,1.61,1.68,1.75,1.62,1.66,1.67,1.81,
+1.70,1.77,1.80,1.74,1.82,1.72,1.73,1.69,1.73,1.84,
+1.77,1.76,1.73,1.83,1.89,1.82,1.81,1.83,1.86,1.71,
+1.77,1.76,1.90,1.88,1.86,1.95,1.85,1.93,1.93,1.87,
+1.86,1.92,1.96,1.97,1.97,1.88,1.95,1.97,1.96,1.97,
+1.94,1.90,2.07,1.94,1.92,2.00,1.99,2.03,1.99,2.08,
+2.03,2.00,1.98,2.00,2.01,1.97,2.01,2.10,2.10,2.02,
+2.00,2.08,2.04,2.13,2.06,2.10,2.10,2.11,2.11,2.23,
+2.16,2.22,2.20,2.15,2.17,2.19,2.18,2.07,2.15,2.16,
+2.22,2.14,2.19,2.20,2.27,2.28,2.27,2.20,2.26,2.22,
+2.22,2.32,2.20,2.25,2.29,2.32,2.25,2.34,2.39,2.33,
+2.25,2.26,2.32,2.29,2.29,2.27,2.35,2.46,2.24,2.32,
+2.33,2.42,2.38,2.34,2.30,2.45,2.44,2.32,2.47,2.30,
+2.37,2.36,2.45,2.43,2.34,2.29,2.44,2.43,2.38,2.42,
+2.46,2.45,2.39,2.35,2.36,2.33,2.48,2.46,2.47,2.50,
+2.48,2.46,2.29,2.57,2.54,2.55,2.53,2.55,2.45,2.61,
+2.47,2.48,2.49,2.51,2.51,2.48,2.59,2.67,2.54,2.61,
+2.70,2.50,2.55,2.59,2.52,2.56,2.72,2.60,2.54,2.63,
+0.44,0.48,0.46,0.53,0.52,0.56,0.55,0.59,0.60,0.61,
+0.64,0.65,0.69,0.71,0.67,0.69,0.74,0.73,0.75,0.74,
+0.74,0.77,0.79,0.78,0.81,0.83,0.81,0.88,0.90,0.89,
+0.85,0.89,0.90,0.86,0.88,0.95,0.95,0.95,0.98,0.91,
+0.99,0.96,1.05,1.02,1.03,1.00,1.07,1.05,1.06,1.07,
+1.05,1.05,1.10,1.06,1.08,1.12,1.12,1.13,1.13,1.14,
+1.24,1.16,1.18,1.22,1.21,1.23,1.18,1.19,1.21,1.21,
+1.23,1.27,1.26,1.23,1.27,1.35,1.30,1.32,1.27,1.37,
+1.31,1.32,1.35,1.40,1.33,1.36,1.42,1.36,1.34,1.32,
+1.43,1.39,1.38,1.43,1.44,1.47,1.46,1.38,1.40,1.40,
+1.41,1.41,1.46,1.43,1.47,1.45,1.48,1.47,1.51,1.57,
+1.49,1.59,1.57,1.46,1.51,1.54,1.58,1.59,1.61,1.56,
+1.62,1.59,1.61,1.58,1.66,1.63,1.66,1.59,1.67,1.63,
+1.70,1.61,1.68,1.63,1.66,1.67,1.69,1.69,1.73,1.63,
+1.73,1.70,1.71,1.64,1.77,1.79,1.66,1.72,1.73,1.72,
+1.73,1.84,1.78,1.72,1.78,1.74,1.80,1.71,1.82,1.82,
+1.77,1.79,1.87,1.77,1.85,1.87,1.86,1.86,1.87,1.89,
+1.83,1.84,1.84,1.93,1.80,1.87,1.86,1.89,1.94,1.92,
+1.95,1.91,2.01,1.99,2.00,1.89,1.90,1.95,1.96,1.95,
+1.95,1.92,2.04,1.94,2.05,2.05,1.99,1.98,1.98,2.04,
+2.00,1.98,2.04,2.00,2.03,2.04,2.03,2.01,2.01,2.01,
+2.04,2.07,2.07,2.06,2.04,2.04,2.05,2.10,2.11,2.04,
+2.04,2.05,2.11,2.07,2.05,2.18,2.17,2.13,2.18,2.10,
+2.18,2.13,2.10,2.21,2.03,2.19,2.19,2.09,2.14,2.22,
+2.14,2.22,2.19,2.23,2.12,2.23,2.28,2.30,2.24,2.28,
+2.17,2.26,2.19,2.25,2.33,2.23,2.19,2.27,2.24,2.23,
+2.35,2.27,2.25,2.24,2.28,2.39,2.32,2.25,2.35,2.24,
+2.29,2.34,2.37,2.36,2.35,2.33,2.31,2.43,2.31,2.35,
+2.39,2.29,2.50,2.43,2.43,2.45,2.38,2.39,2.45,2.39,
+1.16,1.22,1.28,1.33,1.31,1.38,1.43,1.44,1.54,1.54,
+1.57,1.67,1.73,1.71,1.68,1.80,1.75,1.86,1.90,1.86,
+1.96,1.93,2.05,2.08,2.05,2.07,2.02,2.18,2.22,2.20,
+2.18,2.33,2.27,2.34,2.35,2.39,2.40,2.45,2.51,2.43,
+2.52,2.55,2.53,2.54,2.62,2.53,2.71,2.56,2.80,2.67,
+2.63,2.76,2.81,2.75,2.83,2.84,2.83,3.00,3.00,2.95,
+3.01,2.90,2.90,2.98,3.04,3.01,3.03,3.00,3.05,3.16,
+2.97,3.01,3.22,3.16,3.28,3.23,3.34,3.37,3.30,3.21,
+3.29,3.37,3.33,3.39,3.53,3.44,3.57,3.49,3.48,3.59,
+3.46,3.55,3.57,3.56,3.62,3.64,3.62,3.59,3.68,3.67,
+3.65,3.55,3.85,3.91,3.64,3.67,3.81,3.80,3.85,3.72,
+3.98,3.89,3.88,3.88,4.00,3.74,3.97,3.92,4.00,4.03,
+4.02,4.10,4.07,4.05,3.97,4.05,4.17,3.99,4.05,3.96,
+4.05,4.16,4.22,4.19,4.35,4.23,4.07,4.18,4.23,4.24,
+4.22,4.37,4.21,4.35,4.35,4.47,4.33,4.22,4.45,4.48,
+4.41,4.35,4.44,4.36,4.47,4.50,4.64,4.55,4.67,4.56,
+4.51,4.65,4.72,4.69,4.44,4.61,4.60,4.58,4.81,4.75,
+4.76,4.67,4.69,4.62,4.92,4.85,4.60,4.83,4.71,4.82,
+5.06,4.71,4.71,4.48,4.77,4.75,4.89,5.00,5.03,4.94,
+5.05,5.09,4.90,5.02,5.07,4.92,4.90,4.96,5.20,4.88,
+5.11,5.05,5.10,5.07,5.04,5.32,5.09,5.25,4.93,5.28,
+5.23,5.20,5.13,5.17,5.35,5.18,5.09,5.17,5.47,5.39,
+5.54,5.24,5.42,5.25,5.32,5.30,5.27,5.37,5.50,5.10,
+5.37,5.53,5.40,5.49,5.49,5.64,5.48,5.49,5.48,5.57,
+5.54,5.57,5.54,5.62,5.42,5.62,5.85,5.42,5.50,5.54,
+5.33,5.69,5.72,5.44,5.67,5.62,5.89,5.81,5.70,5.94,
+5.66,5.94,5.78,5.68,5.80,5.67,5.86,5.63,6.04,6.03,
+5.95,5.75,5.85,6.07,5.88,5.86,5.80,5.92,5.94,5.84,
+6.02,6.35,5.97,5.81,5.99,6.11,5.94,6.05,5.98,6.02,
+1.13,1.12,1.20,1.28,1.31,1.35,1.40,1.46,1.52,1.55,
+1.56,1.59,1.59,1.69,1.71,1.73,1.72,1.77,1.81,1.89,
+1.88,1.96,1.99,1.98,2.00,2.01,2.03,2.11,2.03,2.10,
+2.16,2.18,2.23,2.18,2.26,2.32,2.34,2.26,2.39,2.40,
+2.46,2.40,2.39,2.49,2.53,2.54,2.56,2.52,2.56,2.68,
+2.71,2.72,2.59,2.68,2.70,2.75,2.78,2.68,2.87,2.86,
+2.84,2.80,2.87,2.84,2.85,2.88,2.84,2.91,2.91,2.97,
+3.04,3.03,3.19,3.12,3.04,3.20,3.15,3.11,3.14,3.29,
+3.19,3.21,3.28,3.31,3.35,3.20,3.27,3.27,3.39,3.32,
+3.40,3.45,3.48,3.40,3.60,3.49,3.43,3.51,3.62,3.54,
+3.26,3.72,3.57,3.56,3.69,3.65,3.68,3.75,3.76,3.65,
+3.80,3.70,3.71,3.69,3.87,3.78,3.84,3.76,3.86,3.76,
+3.95,3.75,3.93,3.98,3.93,4.02,4.03,4.23,3.78,3.98,
+3.87,3.94,4.11,4.04,3.98,3.97,3.89,4.01,4.01,4.18,
+3.95,4.01,4.14,4.23,4.32,4.08,4.30,4.21,4.22,4.37,
+4.13,4.33,4.39,4.28,4.24,4.23,4.16,4.49,4.44,4.35,
+4.42,4.49,4.40,4.39,4.54,4.54,4.46,4.66,4.70,4.47,
+4.60,4.34,4.58,4.50,4.53,4.68,4.66,4.52,4.76,4.66,
+4.53,4.91,4.58,4.69,4.63,4.65,4.76,4.60,4.83,4.96,
+4.68,4.89,4.90,4.75,4.68,4.81,4.90,5.06,4.86,5.15,
+4.86,4.87,4.97,4.95,4.79,5.00,4.86,5.09,5.11,5.18,
+5.01,5.00,4.99,5.06,5.11,5.07,5.16,5.13,5.35,5.07,
+5.21,5.09,5.19,5.11,5.20,5.04,5.08,5.35,5.35,5.34,
+5.05,4.96,5.27,5.23,5.11,5.40,5.14,5.42,5.18,5.36,
+5.36,5.36,5.41,5.29,5.32,5.26,5.36,5.39,5.43,5.70,
+5.44,5.43,5.49,5.48,5.49,5.50,5.40,5.71,5.63,5.39,
+5.70,5.52,5.64,5.75,5.55,5.44,5.53,5.84,5.75,5.70,
+5.85,5.73,5.50,5.52,5.84,5.69,5.61,5.68,5.70,5.68,
+5.83,5.80,5.70,5.86,5.58,5.96,5.71,5.76,5.83,5.85,
+1.10,1.13,1.21,1.22,1.24,1.24,1.36,1.39,1.40,1.50,
+1.54,1.51,1.53,1.61,1.60,1.70,1.78,1.68,1.72,1.79,
+1.89,1.84,1.83,1.87,1.91,1.96,2.07,2.01,1.97,2.08,
+2.06,2.10,2.04,2.14,2.22,2.17,2.23,2.21,2.41,2.29,
+2.32,2.39,2.32,2.41,2.36,2.40,2.50,2.45,2.52,2.49,
+2.59,2.52,2.54,2.47,2.74,2.57,2.55,2.54,2.84,2.75,
+2.70,2.68,2.74,2.82,2.81,2.87,2.73,2.93,2.95,2.94,
+2.97,2.90,3.03,3.00,3.06,2.91,3.05,3.16,3.05,3.01,
+3.16,3.13,3.10,3.12,3.25,3.16,3.02,3.26,3.23,3.29,
+3.27,3.29,3.38,3.42,3.33,3.47,3.37,3.31,3.31,3.51,
+3.48,3.51,3.46,3.46,3.45,3.51,3.29,3.45,3.54,3.35,
+3.54,3.49,3.64,3.81,3.56,3.65,3.76,3.68,3.79,3.74,
+3.73,3.69,3.84,3.72,3.53,3.83,3.68,3.68,3.81,3.83,
+3.90,3.78,3.97,3.97,3.91,3.94,4.03,3.86,3.96,4.03,
+4.00,3.91,4.08,4.12,4.04,3.98,4.00,4.11,4.28,4.10,
+4.15,4.08,4.08,3.89,4.10,4.19,4.06,4.31,4.21,4.25,
+4.29,4.29,4.30,4.11,4.17,4.11,4.42,4.33,4.44,4.45,
+4.32,4.53,4.53,4.35,4.27,4.53,4.48,4.44,4.39,4.59,
+4.47,4.47,4.52,4.60,4.58,4.40,4.55,4.46,4.81,4.82,
+4.63,4.43,4.67,4.60,4.55,4.78,4.75,4.75,4.71,4.79,
+4.88,4.69,4.81,4.59,4.78,4.81,4.79,4.84,4.70,5.06,
+4.85,4.79,4.80,4.93,4.75,4.92,4.93,4.88,4.93,5.13,
+4.97,4.95,4.80,4.88,4.85,4.94,5.21,5.05,5.26,5.05,
+5.10,4.97,4.97,5.20,5.02,5.10,5.21,4.93,5.22,5.14,
+5.18,5.08,5.06,5.30,5.18,5.38,5.30,5.48,5.14,5.22,
+5.10,5.41,5.28,5.23,5.45,5.47,5.53,5.32,5.31,5.25,
+5.36,5.34,5.44,5.17,5.48,5.40,5.43,5.42,5.53,5.33,
+5.30,5.38,5.35,5.84,5.56,5.26,5.32,5.62,5.38,5.48,
+5.41,5.48,5.42,5.60,5.44,5.49,5.71,5.73,5.51,5.55,
+1.03,1.08,1.09,1.16,1.23,1.27,1.26,1.29,1.32,1.41,
+1.38,1.41,1.52,1.51,1.56,1.53,1.61,1.58,1.67,1.64,
+1.71,1.73,1.77,1.82,1.80,1.92,1.91,1.91,1.96,1.97,
+2.00,2.01,2.02,2.13,2.15,2.11,2.23,2.20,2.13,2.20,
+2.19,2.29,2.27,2.31,2.31,2.34,2.42,2.27,2.35,2.46,
+2.44,2.46,2.38,2.54,2.45,2.55,2.47,2.52,2.63,2.64,
+2.69,2.62,2.69,2.66,2.64,2.67,2.74,2.81,2.81,2.89,
+2.87,2.83,2.72,2.89,2.90,2.81,2.76,2.96,2.99,2.90,
+3.03,2.89,2.91,3.06,3.07,3.07,3.06,3.04,3.18,3.11,
+3.22,3.10,3.15,3.14,3.03,3.13,3.26,3.24,3.31,3.27,
+3.39,3.30,3.29,3.38,3.34,3.42,3.31,3.38,3.26,3.47,
+3.46,3.39,3.50,3.44,3.44,3.62,3.60,3.59,3.49,3.54,
+3.62,3.65,3.52,3.54,3.77,3.66,3.61,3.79,3.72,3.54,
+3.77,3.69,3.72,3.83,3.68,3.73,3.80,3.81,3.91,3.87,
+3.72,3.79,3.70,3.85,3.98,3.81,3.77,4.02,3.94,3.90,
+3.86,3.86,3.94,3.93,4.05,3.81,4.16,4.01,4.06,4.28,
+4.13,4.09,4.12,3.99,4.31,4.12,4.22,4.20,4.17,4.34,
+4.37,4.05,4.25,4.17,4.19,4.24,4.26,4.29,4.14,4.31,
+4.34,4.32,4.29,4.39,4.22,4.42,4.36,4.43,4.33,4.38,
+4.39,4.44,4.46,4.53,4.50,4.45,4.60,4.36,4.55,4.71,
+4.45,4.58,4.53,4.60,4.60,4.49,4.58,4.71,4.46,4.70,
+4.77,4.81,4.70,4.66,4.64,4.62,4.78,4.57,4.75,4.67,
+4.45,4.69,4.91,4.78,4.63,4.51,4.92,4.81,4.68,4.95,
+4.93,4.78,4.86,4.85,4.77,4.98,4.82,4.95,5.11,4.82,
+5.04,5.08,4.92,5.04,5.03,5.15,4.82,5.04,5.02,4.94,
+4.88,4.88,5.26,4.99,5.08,5.17,5.05,5.21,5.22,5.23,
+5.07,5.25,5.18,4.95,5.17,5.09,4.97,5.24,5.23,5.26,
+5.22,5.27,5.38,5.10,5.28,5.33,4.97,5.09,5.26,5.22,
+5.40,5.45,5.44,5.46,5.40,5.34,5.16,5.15,5.37,5.44,
+0.96,1.04,1.05,1.11,1.21,1.17,1.24,1.29,1.28,1.32,
+1.35,1.41,1.39,1.38,1.47,1.48,1.61,1.58,1.66,1.64,
+1.70,1.72,1.69,1.72,1.78,1.80,1.79,1.80,1.82,1.90,
+1.87,1.94,1.94,1.97,2.00,2.09,2.03,2.05,2.01,2.16,
+2.08,2.17,2.15,2.22,2.25,2.20,2.22,2.29,2.27,2.31,
+2.38,2.33,2.31,2.43,2.44,2.39,2.46,2.38,2.50,2.46,
+2.49,2.52,2.46,2.57,2.51,2.59,2.48,2.68,2.61,2.66,
+2.60,2.67,2.69,2.75,2.77,2.70,2.83,2.83,2.75,2.81,
+2.83,2.79,2.87,2.82,2.83,3.04,2.89,2.83,2.88,3.03,
+3.09,3.04,2.99,2.95,2.91,3.07,3.00,3.03,3.23,3.21,
+3.10,3.14,3.14,3.14,3.21,3.21,3.10,3.18,3.39,3.30,
+3.31,3.26,3.21,3.41,3.20,3.31,3.28,3.37,3.41,3.42,
+3.48,3.30,3.47,3.43,3.37,3.37,3.56,3.56,3.50,3.54,
+3.52,3.48,3.54,3.58,3.61,3.41,3.47,3.60,3.65,3.60,
+3.54,3.67,3.59,3.58,3.56,3.75,3.77,3.76,3.63,3.74,
+3.76,3.84,3.71,3.77,3.64,3.78,3.94,3.91,3.91,3.90,
+3.97,3.91,3.86,3.81,3.89,3.92,3.91,3.96,3.93,4.17,
+3.91,3.98,4.07,4.15,4.11,4.06,4.22,4.08,4.05,4.12,
+4.06,4.14,4.18,4.38,4.12,4.11,4.19,4.16,4.26,4.39,
+4.12,4.39,4.33,4.16,4.35,4.18,4.15,4.23,4.05,4.22,
+4.13,4.41,4.43,4.32,4.37,4.46,4.32,4.39,4.37,4.42,
+4.44,4.52,4.37,4.68,4.47,4.45,4.39,4.45,4.51,4.41,
+4.54,4.41,4.76,4.52,4.75,4.54,4.61,4.78,4.64,4.80,
+4.46,4.58,4.74,4.68,4.70,4.57,4.67,4.65,4.63,4.72,
+4.74,4.53,4.51,4.85,4.76,4.79,4.73,4.76,4.70,4.80,
+4.92,4.81,4.79,4.68,4.91,4.73,4.84,5.05,4.80,4.85,
+5.02,4.96,4.96,4.89,4.99,4.94,4.99,5.07,4.87,4.85,
+4.81,5.01,5.14,5.02,5.03,5.02,5.03,4.97,4.95,4.75,
+5.15,4.94,5.02,5.02,5.32,5.24,5.07,5.13,5.06,5.18,
+0.95,0.94,1.00,1.02,1.11,1.12,1.17,1.20,1.24,1.27,
+1.23,1.33,1.33,1.37,1.42,1.41,1.44,1.50,1.52,1.56,
+1.61,1.57,1.57,1.65,1.64,1.68,1.75,1.77,1.77,1.75,
+1.76,1.81,1.85,1.88,1.88,1.98,1.90,1.91,2.02,2.06,
+1.97,2.06,2.06,2.11,2.14,2.13,2.07,2.23,2.20,2.15,
+2.19,2.25,2.34,2.30,2.29,2.23,2.34,2.25,2.39,2.35,
+2.35,2.39,2.43,2.39,2.41,2.52,2.50,2.49,2.58,2.46,
+2.51,2.51,2.54,2.61,2.72,2.62,2.67,2.73,2.73,2.63,
+2.71,2.64,2.71,2.74,2.76,2.78,2.82,2.63,2.81,2.86,
+2.88,2.88,2.87,2.92,2.89,2.94,2.91,2.90,2.89,3.00,
+2.94,3.02,3.11,3.07,2.99,2.89,3.06,3.11,3.13,3.18,
+3.09,3.14,3.10,3.23,3.15,3.27,3.20,3.19,3.15,3.29,
+3.22,3.20,3.31,3.26,3.19,3.25,3.34,3.29,3.29,3.42,
+3.30,3.31,3.49,3.28,3.41,3.43,3.42,3.37,3.36,3.49,
+3.61,3.51,3.42,3.40,3.48,3.55,3.54,3.61,3.61,3.52,
+3.63,3.53,3.57,3.69,3.54,3.64,3.66,3.66,3.58,3.62,
+3.52,3.71,3.70,3.67,3.87,3.77,3.77,3.69,3.85,3.63,
+3.83,3.90,3.84,3.79,3.72,3.97,3.80,3.82,4.07,3.86,
+3.96,3.98,4.00,4.02,4.05,3.84,4.03,3.99,3.99,3.97,
+4.06,4.00,4.05,3.93,3.97,4.10,4.05,4.11,4.09,4.12,
+4.02,3.90,4.19,4.03,4.18,4.17,4.12,4.24,4.39,3.96,
+4.13,4.11,4.16,4.09,4.03,4.34,4.04,4.32,4.35,4.13,
+4.30,4.26,4.23,4.36,4.46,4.38,4.35,4.38,4.16,4.39,
+4.33,4.37,4.45,4.63,4.39,4.38,4.61,4.36,4.50,4.48,
+4.50,4.48,4.48,4.27,4.47,4.58,4.50,4.51,4.54,4.52,
+4.47,4.43,4.51,4.53,4.58,4.55,4.60,4.82,4.49,4.71,
+4.33,4.61,4.58,4.72,4.75,4.47,4.73,4.69,4.59,4.77,
+4.61,4.86,4.97,4.88,4.60,4.65,4.79,4.85,4.74,4.95,
+4.71,4.85,4.98,4.89,4.97,4.73,4.92,4.90,4.75,4.85,
+0.89,0.94,0.97,1.04,1.03,1.09,1.07,1.13,1.16,1.18,
+1.23,1.28,1.27,1.29,1.33,1.35,1.38,1.43,1.42,1.45,
+1.47,1.54,1.59,1.57,1.54,1.61,1.57,1.67,1.64,1.60,
+1.70,1.71,1.73,1.84,1.78,1.88,1.86,1.78,1.88,1.86,
+1.90,1.87,2.03,2.02,1.98,1.99,1.97,2.05,2.02,2.10,
+2.05,2.14,2.13,2.11,2.14,2.20,2.19,2.17,2.15,2.29,
+2.33,2.29,2.25,2.27,2.14,2.30,2.32,2.36,2.37,2.34,
+2.42,2.41,2.45,2.47,2.53,2.48,2.42,2.61,2.41,2.58,
+2.48,2.57,2.54,2.58,2.56,2.59,2.55,2.68,2.74,2.80,
+2.64,2.72,2.70,2.76,2.67,2.83,2.76,2.77,2.77,2.83,
+2.82,2.78,2.81,2.89,2.91,2.84,2.99,2.89,2.89,2.95,
+2.84,2.98,2.98,2.99,3.03,3.00,3.08,3.02,3.08,3.11,
+3.04,3.01,2.92,3.00,3.19,3.22,3.25,3.18,3.14,3.17,
+3.25,3.19,3.07,3.11,3.15,3.23,3.22,3.24,3.25,3.19,
+3.29,3.23,3.43,3.36,3.32,3.26,3.42,3.48,3.37,3.24,
+3.46,3.47,3.45,3.43,3.47,3.63,3.58,3.43,3.52,3.42,
+3.44,3.60,3.48,3.65,3.70,3.49,3.54,3.43,3.69,3.65,
+3.64,3.44,3.60,3.41,3.61,3.58,3.62,3.60,3.58,3.68,
+3.71,3.63,3.75,3.82,3.63,3.59,3.64,3.63,3.80,3.67,
+3.83,3.81,3.66,3.79,3.76,3.82,3.72,3.81,3.83,3.72,
+3.87,3.93,3.80,4.05,4.04,3.82,3.97,4.11,3.88,4.05,
+4.01,3.91,3.95,4.05,3.85,3.91,4.14,4.08,3.97,3.95,
+3.93,3.97,4.22,4.05,4.01,3.99,4.19,4.19,4.13,4.11,
+4.19,4.06,4.28,4.22,4.05,4.07,4.10,4.20,4.03,4.28,
+4.36,4.40,4.11,4.21,4.23,4.35,4.27,4.28,4.49,4.12,
+4.20,4.19,4.25,4.25,4.27,4.33,4.29,4.35,4.30,4.29,
+4.45,4.39,4.42,4.44,4.43,4.35,4.26,4.42,4.36,4.49,
+4.57,4.45,4.43,4.64,4.34,4.66,4.69,4.58,4.67,4.38,
+4.53,4.71,4.61,4.50,4.62,4.49,4.70,4.69,4.67,4.67,
+0.83,0.88,0.89,0.93,0.97,1.00,1.02,1.03,1.11,1.13,
+1.13,1.22,1.15,1.20,1.25,1.28,1.27,1.35,1.41,1.40,
+1.41,1.40,1.39,1.47,1.51,1.46,1.61,1.52,1.59,1.54,
+1.57,1.60,1.66,1.63,1.69,1.71,1.68,1.74,1.73,1.76,
+1.75,1.80,1.83,1.80,1.81,1.87,1.87,1.93,1.97,1.95,
+1.86,2.02,2.01,2.03,2.02,1.96,2.10,2.00,2.09,2.04,
+2.05,2.16,2.16,2.19,2.12,2.20,2.19,2.23,2.21,2.21,
+2.24,2.20,2.27,2.21,2.39,2.32,2.35,2.43,2.36,2.41,
+2.46,2.49,2.45,2.48,2.46,2.51,2.53,2.48,2.52,2.49,
+2.58,2.58,2.48,2.64,2.59,2.58,2.51,2.61,2.64,2.46,
+2.61,2.66,2.81,2.70,2.61,2.71,2.70,2.71,2.74,2.72,
+2.71,2.78,2.69,2.92,2.81,2.90,2.84,2.73,2.90,2.88,
+2.81,2.93,2.94,2.96,2.94,2.97,2.90,2.96,3.05,2.95,
+3.03,2.95,3.09,3.03,3.09,3.03,3.02,3.03,2.98,3.20,
+3.10,3.03,3.03,3.17,3.15,3.06,3.07,3.21,3.33,3.18,
+3.19,3.11,3.28,3.17,3.11,3.14,3.27,3.17,3.27,3.40,
+3.27,3.27,3.47,3.24,3.39,3.24,3.32,3.31,3.39,3.39,
+3.32,3.41,3.45,3.39,3.47,3.43,3.51,3.47,3.35,3.64,
+3.58,3.55,3.38,3.47,3.47,3.54,3.60,3.42,3.69,3.50,
+3.61,3.44,3.52,3.71,3.47,3.74,3.54,3.60,3.66,3.57,
+3.50,3.54,3.57,3.70,3.65,3.59,3.62,3.74,3.95,3.77,
+3.65,3.55,3.72,3.72,3.68,3.66,3.80,3.93,3.89,3.79,
+3.86,3.78,3.91,3.86,3.86,3.86,3.81,3.90,3.86,3.80,
+4.09,3.90,3.91,3.82,4.01,3.80,3.91,4.03,3.93,3.98,
+4.00,4.09,4.06,4.05,4.08,4.04,4.01,4.15,4.02,4.10,
+3.97,4.00,4.22,4.14,4.12,4.08,4.15,4.00,4.18,4.13,
+4.14,4.10,4.22,4.32,4.37,4.27,4.23,4.18,4.41,4.14,
+4.28,4.16,4.30,4.24,4.32,4.19,4.23,4.18,4.22,4.40,
+4.30,4.35,4.33,4.17,4.44,4.44,4.40,4.40,4.27,4.38,
+0.77,0.80,0.86,0.87,0.91,0.94,0.98,0.95,1.00,1.07,
+1.08,1.07,1.11,1.13,1.22,1.21,1.22,1.31,1.25,1.30,
+1.30,1.33,1.36,1.37,1.34,1.46,1.47,1.51,1.43,1.49,
+1.49,1.56,1.52,1.57,1.61,1.54,1.65,1.58,1.59,1.66,
+1.70,1.74,1.75,1.75,1.66,1.77,1.75,1.84,1.76,1.82,
+1.85,1.92,1.87,1.84,1.81,1.92,1.82,1.97,1.95,1.94,
+1.93,2.03,2.01,2.10,2.00,2.07,2.04,2.03,2.06,2.13,
+2.12,2.03,2.13,2.20,2.14,2.19,2.13,2.26,2.29,2.26,
+2.17,2.33,2.29,2.22,2.23,2.28,2.46,2.36,2.39,2.32,
+2.35,2.45,2.41,2.45,2.52,2.46,2.45,2.53,2.54,2.53,
+2.43,2.49,2.45,2.54,2.53,2.60,2.48,2.56,2.62,2.47,
+2.57,2.53,2.63,2.63,2.72,2.65,2.65,2.61,2.71,2.72,
+2.71,2.71,2.78,2.71,2.75,2.72,2.73,2.74,2.78,2.68,
+2.84,2.87,2.84,2.75,2.77,2.87,3.01,2.77,2.86,2.93,
+2.82,2.93,2.82,2.94,2.94,3.00,2.92,2.91,2.95,2.95,
+3.03,3.05,3.06,2.99,3.02,3.09,2.96,3.11,3.04,3.01,
+3.04,3.03,3.07,3.08,3.17,3.18,3.21,3.18,3.04,3.24,
+3.24,3.34,3.09,3.28,3.30,3.22,3.19,3.17,3.29,3.35,
+3.29,3.26,3.12,3.31,3.25,3.36,3.31,3.35,3.13,3.28,
+3.31,3.39,3.48,3.38,3.25,3.44,3.39,3.33,3.45,3.50,
+3.53,3.42,3.52,3.53,3.56,3.39,3.53,3.44,3.38,3.56,
+3.50,3.61,3.59,3.43,3.51,3.57,3.53,3.49,3.56,3.46,
+3.55,3.58,3.63,3.62,3.53,3.71,3.67,3.62,3.75,3.72,
+3.67,3.66,3.51,3.75,3.79,3.69,3.52,3.80,3.67,3.73,
+3.77,3.74,3.90,3.64,3.89,3.68,3.81,3.66,3.75,3.83,
+3.73,3.64,3.75,3.80,3.75,3.83,3.77,3.92,3.77,3.87,
+3.86,3.83,4.05,3.73,3.81,3.76,3.90,3.81,3.89,4.02,
+3.94,4.13,3.83,3.94,3.90,3.87,3.80,4.00,3.92,3.92,
+4.10,4.18,4.00,4.00,4.08,4.12,4.09,4.04,4.08,4.11,
+0.73,0.78,0.80,0.81,0.85,0.88,0.94,0.94,0.94,1.00,
+0.99,1.01,0.99,1.07,1.08,1.12,1.16,1.18,1.23,1.16,
+1.19,1.25,1.25,1.26,1.28,1.31,1.34,1.40,1.36,1.36,
+1.39,1.40,1.42,1.48,1.51,1.52,1.48,1.50,1.55,1.57,
+1.61,1.59,1.64,1.65,1.64,1.61,1.67,1.58,1.66,1.69,
+1.74,1.67,1.75,1.80,1.81,1.76,1.78,1.77,1.84,1.84,
+1.83,1.87,1.83,1.88,1.93,1.91,1.95,1.94,1.87,1.89,
+2.06,1.99,2.01,1.98,2.06,2.01,2.03,1.98,2.04,2.12,
+2.11,2.14,2.16,2.04,2.18,2.11,2.19,2.21,2.18,2.22,
+2.21,2.22,2.29,2.30,2.31,2.31,2.32,2.28,2.29,2.34,
+2.33,2.29,2.41,2.46,2.35,2.39,2.27,2.39,2.37,2.42,
+2.43,2.39,2.43,2.38,2.41,2.48,2.60,2.38,2.52,2.49,
+2.57,2.40,2.54,2.61,2.49,2.57,2.48,2.55,2.70,2.52,
+2.69,2.55,2.66,2.63,2.61,2.75,2.64,2.77,2.70,2.77,
+2.67,2.69,2.72,2.74,2.82,2.79,2.67,2.70,2.76,2.71,
+2.79,2.78,2.73,2.77,2.77,2.89,2.74,2.79,2.86,3.04,
+2.94,2.98,3.11,3.03,2.87,2.88,2.98,2.98,2.93,3.06,
+2.93,2.98,3.06,2.97,3.12,3.03,3.10,2.98,2.94,3.00,
+3.10,3.11,3.18,3.01,3.09,3.04,3.10,3.13,3.14,3.25,
+3.13,3.22,3.17,3.18,3.16,3.25,3.31,3.23,3.23,3.13,
+3.29,3.19,3.21,3.22,3.36,3.16,3.12,3.24,3.25,3.15,
+3.36,3.46,3.35,3.23,3.29,3.18,3.34,3.26,3.42,3.28,
+3.48,3.52,3.40,3.27,3.29,3.43,3.42,3.27,3.53,3.56,
+3.39,3.42,3.48,3.44,3.43,3.38,3.40,3.40,3.52,3.40,
+3.58,3.43,3.55,3.58,3.60,3.54,3.45,3.60,3.60,3.51,
+3.49,3.55,3.46,3.65,3.52,3.72,3.79,3.67,3.55,3.56,
+3.72,3.66,3.70,3.59,3.65,3.76,3.64,3.64,3.58,3.79,
+3.67,3.70,3.68,3.67,3.71,3.69,3.52,3.52,3.80,3.87,
+3.85,3.82,3.63,3.70,3.68,3.74,3.70,3.85,3.88,3.79,
+0.67,0.71,0.78,0.78,0.82,0.81,0.82,0.87,0.90,0.92,
+0.97,0.96,0.98,0.99,1.00,1.05,1.09,1.04,1.14,1.14,
+1.17,1.20,1.18,1.17,1.23,1.24,1.21,1.26,1.28,1.26,
+1.32,1.34,1.40,1.31,1.37,1.37,1.40,1.41,1.45,1.45,
+1.53,1.52,1.50,1.54,1.52,1.53,1.54,1.57,1.51,1.62,
+1.59,1.63,1.63,1.68,1.64,1.65,1.63,1.69,1.70,1.75,
+1.67,1.74,1.72,1.82,1.84,1.79,1.77,1.79,1.80,1.87,
+1.84,1.85,1.98,1.91,1.82,1.94,1.96,1.92,1.99,1.99,
+1.94,1.96,1.94,1.98,2.02,2.01,2.05,2.08,2.06,2.03,
+2.06,2.11,2.10,2.03,2.18,2.14,2.13,2.17,2.13,2.24,
+2.12,2.19,2.22,2.18,2.27,2.23,2.26,2.23,2.29,2.35,
+2.21,2.23,2.27,2.32,2.30,2.30,2.32,2.37,2.35,2.31,
+2.26,2.38,2.30,2.34,2.31,2.42,2.38,2.43,2.42,2.42,
+2.36,2.53,2.49,2.48,2.44,2.43,2.61,2.48,2.46,2.59,
+2.50,2.55,2.44,2.58,2.63,2.57,2.62,2.59,2.61,2.51,
+2.70,2.73,2.67,2.75,2.55,2.62,2.68,2.70,2.72,2.67,
+2.70,2.80,2.66,2.63,2.75,2.69,2.63,2.80,2.77,2.81,
+2.78,2.75,2.71,2.80,2.81,2.84,2.90,2.77,2.76,2.84,
+2.88,2.84,2.91,2.88,2.95,2.91,2.78,2.92,2.95,2.88,
+2.88,2.90,2.90,3.07,2.91,3.01,2.95,2.85,3.01,2.95,
+3.00,2.93,2.90,3.11,3.02,3.07,3.07,3.08,3.03,3.10,
+3.00,3.03,3.13,2.99,3.21,3.09,3.09,3.11,3.12,3.10,
+3.05,3.16,3.20,3.17,3.14,3.15,3.17,3.08,3.11,3.25,
+3.22,3.22,3.24,3.16,3.18,3.29,3.27,3.21,3.25,3.26,
+3.33,3.18,3.23,3.29,3.29,3.21,3.28,3.20,3.32,3.40,
+3.28,3.35,3.26,3.24,3.47,3.30,3.28,3.39,3.29,3.36,
+3.40,3.39,3.41,3.37,3.34,3.40,3.45,3.30,3.61,3.48,
+3.33,3.40,3.38,3.43,3.34,3.51,3.54,3.55,3.55,3.58,
+3.51,3.54,3.49,3.76,3.48,3.56,3.62,3.59,3.51,3.60,
+0.64,0.69,0.70,0.72,0.72,0.78,0.81,0.83,0.85,0.89,
+0.89,0.91,0.90,0.93,0.94,0.98,0.99,0.99,1.04,1.03,
+1.08,1.07,1.08,1.11,1.15,1.13,1.16,1.16,1.21,1.23,
+1.26,1.27,1.24,1.35,1.32,1.28,1.37,1.33,1.32,1.35,
+1.32,1.42,1.41,1.37,1.42,1.44,1.47,1.45,1.45,1.53,
+1.52,1.55,1.57,1.56,1.56,1.55,1.54,1.57,1.66,1.62,
+1.65,1.60,1.57,1.64,1.62,1.70,1.69,1.68,1.72,1.71,
+1.71,1.82,1.66,1.76,1.83,1.80,1.83,1.73,1.81,1.83,
+1.84,1.79,1.82,1.86,1.82,1.88,1.89,1.91,1.81,1.86,
+1.96,1.92,1.99,2.04,1.91,1.97,1.93,1.94,1.99,2.04,
+2.03,2.00,2.07,2.02,2.01,2.04,2.01,2.07,2.11,2.16,
+2.08,2.10,2.11,2.13,2.03,2.12,2.14,2.19,2.26,2.10,
+2.06,2.12,2.23,2.21,2.21,2.21,2.28,2.30,2.23,2.23,
+2.34,2.26,2.41,2.32,2.37,2.30,2.37,2.32,2.37,2.23,
+2.40,2.35,2.16,2.35,2.41,2.35,2.44,2.51,2.40,2.39,
+2.51,2.54,2.44,2.44,2.43,2.47,2.63,2.50,2.56,2.48,
+2.52,2.57,2.53,2.50,2.48,2.47,2.55,2.53,2.54,2.55,
+2.55,2.55,2.64,2.59,2.53,2.58,2.66,2.55,2.53,2.49,
+2.74,2.63,2.79,2.73,2.64,2.60,2.74,2.68,2.70,2.76,
+2.67,2.69,2.70,2.67,2.63,2.72,2.78,2.72,2.71,2.87,
+2.75,2.74,2.80,2.73,2.84,2.74,2.81,2.87,2.75,2.85,
+2.81,2.93,2.70,2.77,2.90,2.85,2.78,2.89,2.82,2.97,
+2.84,2.90,2.92,2.91,3.00,2.86,2.92,2.93,3.04,2.99,
+2.82,3.06,2.94,3.01,2.99,3.07,3.13,3.07,3.00,3.06,
+3.01,3.13,3.02,3.05,3.02,3.04,3.14,3.01,3.05,3.15,
+3.05,2.93,3.03,3.09,3.19,3.03,3.24,3.11,3.10,3.05,
+3.22,3.23,3.14,3.15,3.24,3.21,3.15,3.23,3.14,3.23,
+3.37,3.31,3.13,3.16,3.09,3.21,3.29,3.30,3.22,3.35,
+3.16,3.15,3.35,3.15,3.27,3.34,3.20,3.32,3.29,3.30,
+0.58,0.61,0.64,0.67,0.67,0.68,0.73,0.75,0.79,0.77,
+0.83,0.82,0.86,0.85,0.84,0.94,0.92,0.94,0.96,0.99,
+0.97,0.97,0.99,1.02,1.04,1.06,1.08,1.09,1.10,1.15,
+1.09,1.17,1.17,1.14,1.16,1.18,1.20,1.19,1.23,1.27,
+1.27,1.24,1.35,1.28,1.29,1.31,1.33,1.33,1.39,1.35,
+1.39,1.41,1.43,1.39,1.41,1.48,1.54,1.44,1.50,1.44,
+1.44,1.51,1.51,1.61,1.56,1.56,1.56,1.55,1.61,1.66,
+1.49,1.64,1.59,1.58,1.65,1.69,1.64,1.66,1.71,1.66,
+1.78,1.78,1.68,1.70,1.70,1.77,1.72,1.73,1.82,1.78,
+1.72,1.78,1.74,1.85,1.79,1.84,1.92,1.78,1.90,1.92,
+1.90,1.90,1.85,1.84,1.91,1.93,1.93,1.93,1.86,1.90,
+1.91,1.99,2.07,2.00,2.04,2.01,1.97,2.01,2.05,2.07,
+2.04,2.07,1.95,2.01,2.03,2.14,2.10,2.07,2.13,2.17,
+2.13,2.06,2.10,2.14,2.12,2.17,2.12,2.16,2.20,2.17,
+2.19,2.19,2.26,2.26,2.25,2.25,2.27,2.33,2.21,2.31,
+2.19,2.31,2.23,2.29,2.27,2.33,2.26,2.26,2.36,2.31,
+2.33,2.30,2.41,2.32,2.24,2.38,2.35,2.30,2.48,2.41,
+2.38,2.46,2.36,2.44,2.31,2.41,2.46,2.50,2.37,2.43,
+2.45,2.48,2.51,2.51,2.51,2.49,2.53,2.45,2.51,2.44,
+2.56,2.60,2.60,2.50,2.50,2.57,2.68,2.51,2.51,2.47,
+2.60,2.65,2.59,2.68,2.56,2.60,2.61,2.68,2.59,2.69,
+2.67,2.74,2.61,2.70,2.58,2.61,2.74,2.65,2.77,2.69,
+2.72,2.70,2.59,2.67,2.68,2.72,2.72,2.77,2.77,2.79,
+2.80,2.86,2.74,2.74,2.77,2.76,2.87,2.57,2.87,2.71,
+2.84,2.85,2.85,2.71,2.83,2.80,2.81,2.87,2.76,2.90,
+2.89,2.87,2.92,2.92,2.92,2.82,2.86,2.87,3.02,2.95,
+2.87,2.95,2.81,2.91,2.89,3.00,2.85,2.91,2.97,3.04,
+2.89,2.86,2.97,3.03,2.99,2.94,3.05,2.95,3.15,2.98,
+3.16,3.18,3.09,3.05,3.20,3.24,3.07,2.98,3.06,3.08,
+0.51,0.58,0.57,0.63,0.64,0.63,0.64,0.69,0.71,0.73,
+0.76,0.78,0.76,0.77,0.88,0.82,0.80,0.86,0.88,0.91,
+0.89,0.90,0.92,0.98,0.96,1.02,0.99,1.02,1.03,1.07,
+1.07,1.05,1.09,1.12,1.10,1.13,1.10,1.11,1.19,1.17,
+1.16,1.19,1.23,1.20,1.22,1.20,1.27,1.25,1.28,1.28,
+1.33,1.31,1.30,1.31,1.33,1.31,1.38,1.38,1.27,1.41,
+1.31,1.43,1.38,1.46,1.40,1.41,1.43,1.49,1.53,1.48,
+1.52,1.44,1.44,1.52,1.47,1.60,1.55,1.55,1.53,1.61,
+1.55,1.57,1.60,1.66,1.62,1.61,1.60,1.64,1.66,1.58,
+1.71,1.67,1.68,1.74,1.71,1.68,1.76,1.75,1.72,1.69,
+1.71,1.76,1.65,1.79,1.79,1.75,1.88,1.74,1.81,1.85,
+1.77,1.83,1.87,1.91,1.86,1.83,1.87,1.81,1.89,2.00,
+1.90,1.90,1.83,1.92,1.89,2.05,1.95,1.91,1.99,1.88,
+1.94,2.01,1.98,2.03,1.97,1.96,1.96,1.98,2.09,1.95,
+2.03,2.08,2.03,2.08,1.96,2.06,2.08,2.01,2.13,2.13,
+2.11,2.14,2.11,2.13,2.10,2.11,2.14,2.17,2.08,2.19,
+2.12,2.16,2.24,2.23,2.15,2.18,2.17,2.19,2.30,2.30,
+2.22,2.29,2.09,2.34,2.22,2.18,2.31,2.26,2.35,2.24,
+2.20,2.15,2.31,2.28,2.32,2.29,2.38,2.28,2.30,2.39,
+2.34,2.39,2.38,2.35,2.32,2.31,2.43,2.41,2.44,2.40,
+2.53,2.29,2.43,2.39,2.38,2.45,2.48,2.41,2.48,2.34,
+2.45,2.33,2.52,2.50,2.57,2.51,2.52,2.47,2.46,2.48,
+2.53,2.53,2.39,2.58,2.57,2.54,2.51,2.59,2.62,2.53,
+2.50,2.62,2.58,2.51,2.55,2.56,2.55,2.56,2.63,2.72,
+2.52,2.66,2.64,2.66,2.61,2.56,2.70,2.62,2.61,2.57,
+2.61,2.66,2.69,2.75,2.70,2.59,2.77,2.64,2.70,2.75,
+2.78,2.66,2.64,2.73,2.78,2.72,2.73,2.94,2.70,2.69,
+2.79,2.65,2.79,2.80,2.78,2.70,2.78,2.84,2.73,2.77,
+2.75,2.89,2.85,2.72,2.69,3.00,2.89,2.87,2.94,2.85,
+0.49,0.52,0.53,0.58,0.59,0.60,0.61,0.65,0.63,0.68,
+0.71,0.70,0.73,0.75,0.77,0.83,0.82,0.82,0.84,0.85,
+0.85,0.85,0.86,0.92,0.89,0.92,0.94,0.93,0.94,0.95,
+0.97,0.99,1.02,1.02,1.05,1.00,1.02,1.07,1.05,1.09,
+1.12,1.12,1.09,1.09,1.16,1.17,1.20,1.16,1.18,1.18,
+1.21,1.18,1.17,1.21,1.21,1.27,1.23,1.28,1.23,1.27,
+1.26,1.31,1.31,1.31,1.32,1.39,1.31,1.38,1.38,1.38,
+1.40,1.38,1.43,1.41,1.44,1.40,1.45,1.40,1.40,1.40,
+1.47,1.43,1.48,1.44,1.48,1.45,1.49,1.47,1.50,1.49,
+1.59,1.50,1.56,1.53,1.52,1.63,1.57,1.59,1.59,1.59,
+1.58,1.57,1.65,1.64,1.64,1.61,1.61,1.68,1.68,1.65,
+1.69,1.69,1.70,1.66,1.68,1.70,1.78,1.71,1.76,1.67,
+1.77,1.75,1.79,1.81,1.77,1.77,1.79,1.83,1.78,1.78,
+1.79,1.83,1.80,1.79,1.85,1.82,1.86,1.85,1.91,1.88,
+1.91,1.89,1.88,1.95,1.86,1.87,1.97,1.96,1.99,1.96,
+1.91,1.87,1.89,2.00,1.98,1.95,1.89,1.99,2.00,1.96,
+2.04,1.94,1.97,1.96,1.99,1.95,2.04,2.05,2.03,2.07,
+2.06,2.13,2.11,2.08,2.08,2.06,2.11,2.15,2.13,2.09,
+2.04,2.15,2.09,2.17,2.14,2.09,2.13,2.23,2.20,2.27,
+2.08,2.16,2.16,2.18,2.18,2.19,2.14,2.20,2.18,2.28,
+2.27,2.22,2.22,2.31,2.28,2.24,2.25,2.27,2.24,2.20,
+2.19,2.30,2.26,2.39,2.18,2.25,2.19,2.33,2.35,2.22,
+2.31,2.43,2.41,2.36,2.38,2.37,2.38,2.33,2.48,2.34,
+2.41,2.40,2.44,2.44,2.41,2.32,2.37,2.49,2.38,2.31,
+2.52,2.42,2.43,2.48,2.42,2.41,2.43,2.49,2.41,2.51,
+2.43,2.53,2.47,2.50,2.42,2.52,2.56,2.36,2.58,2.66,
+2.59,2.46,2.60,2.57,2.53,2.47,2.61,2.56,2.56,2.44,
+2.51,2.64,2.59,2.62,2.53,2.68,2.57,2.53,2.59,2.67,
+2.44,2.51,2.58,2.53,2.70,2.48,2.73,2.63,2.61,2.59,
+1.15,1.19,1.24,1.28,1.36,1.45,1.44,1.48,1.53,1.59,
+1.59,1.54,1.68,1.67,1.73,1.81,1.80,1.79,1.82,1.94,
+1.98,1.93,2.00,2.01,2.15,2.07,2.10,2.07,2.13,2.14,
+2.20,2.26,2.15,2.34,2.32,2.27,2.35,2.30,2.44,2.42,
+2.57,2.50,2.54,2.53,2.56,2.60,2.61,2.69,2.60,2.64,
+2.76,2.72,2.78,2.70,2.78,2.85,2.89,2.71,2.92,2.78,
+2.84,2.97,2.92,3.04,2.97,2.89,2.96,3.15,3.07,3.08,
+3.22,3.13,3.10,3.16,3.08,3.32,3.18,3.05,3.16,3.34,
+3.22,3.38,3.35,3.32,3.28,3.38,3.47,3.35,3.42,3.27,
+3.46,3.47,3.60,3.44,3.53,3.45,3.53,3.44,3.56,3.59,
+3.75,3.62,3.61,3.70,3.72,3.73,3.74,3.76,3.78,3.71,
+3.90,3.82,3.83,3.92,3.73,3.83,3.85,4.04,3.97,3.89,
+3.82,3.97,4.02,3.86,3.93,4.01,4.10,3.89,4.07,4.11,
+3.92,3.88,4.12,4.17,4.25,4.30,4.16,4.21,4.21,4.04,
+4.23,4.15,4.29,4.27,4.13,4.24,4.39,4.19,4.14,4.52,
+4.42,4.40,4.42,4.63,4.36,4.31,4.52,4.61,4.53,4.46,
+4.56,4.66,4.53,4.50,4.34,4.35,4.53,4.44,4.73,4.80,
+4.42,4.57,4.62,4.66,4.56,4.70,4.61,4.79,4.71,4.55,
+4.66,4.93,4.84,4.68,4.89,4.52,4.86,4.67,4.78,4.77,
+4.78,5.06,4.85,5.01,4.70,5.17,4.93,4.93,5.04,4.94,
+5.20,5.10,4.84,5.16,5.17,5.10,5.15,5.04,4.98,5.22,
+5.05,5.10,4.92,5.11,5.27,5.22,5.09,5.19,5.27,5.27,
+5.15,5.00,5.09,5.21,5.24,5.38,5.34,5.34,5.39,5.33,
+5.29,5.30,5.24,5.16,5.09,5.34,5.50,5.39,5.72,5.47,
+5.49,5.43,5.34,5.22,5.28,5.50,5.58,5.46,5.61,5.52,
+5.45,5.39,5.78,5.47,5.49,5.65,5.71,5.61,5.49,5.76,
+5.82,5.57,5.50,5.73,5.70,5.59,5.51,5.78,5.65,5.43,
+5.82,5.86,5.90,5.62,5.91,5.83,5.87,5.69,5.91,5.65,
+5.83,5.81,5.93,5.93,5.94,5.80,5.91,5.84,5.84,6.01,
+1.13,1.16,1.22,1.24,1.29,1.31,1.38,1.39,1.49,1.54,
+1.55,1.55,1.58,1.65,1.64,1.72,1.74,1.68,1.71,1.78,
+1.84,1.93,1.93,1.89,1.98,2.02,2.01,2.08,1.99,2.08,
+2.09,2.12,2.25,2.16,2.29,2.28,2.25,2.30,2.47,2.35,
+2.35,2.34,2.39,2.44,2.45,2.57,2.55,2.54,2.53,2.59,
+2.68,2.65,2.63,2.59,2.68,2.70,2.74,2.72,2.81,2.78,
+2.78,2.87,2.81,2.88,2.85,2.81,3.00,2.87,3.10,3.01,
+2.94,3.06,3.00,3.10,3.01,3.18,3.22,3.23,3.18,3.22,
+3.12,3.18,3.21,3.24,3.24,3.33,3.25,3.20,3.27,3.44,
+3.27,3.37,3.48,3.47,3.44,3.65,3.45,3.54,3.48,3.51,
+3.53,3.41,3.43,3.49,3.50,3.58,3.47,3.61,3.51,3.66,
+3.50,3.66,3.64,3.72,3.76,3.78,3.76,3.76,3.74,3.75,
+4.07,3.90,3.83,3.88,3.92,3.77,3.87,4.02,3.95,4.00,
+3.96,3.97,4.10,4.00,4.07,3.89,4.14,3.93,3.98,4.11,
+4.13,4.26,4.22,4.09,4.12,4.14,4.28,4.24,4.16,4.24,
+4.18,4.15,4.37,4.31,4.31,4.30,4.25,4.22,4.36,4.39,
+4.22,4.57,4.25,4.32,4.40,4.49,4.59,4.53,4.49,4.48,
+4.32,4.41,4.63,4.50,4.50,4.67,4.61,4.56,4.49,4.55,
+4.71,4.44,4.71,4.66,4.39,4.51,4.81,4.88,4.77,4.79,
+4.83,4.62,4.95,4.81,4.56,4.63,4.88,4.79,4.77,4.78,
+4.78,4.98,4.85,4.99,4.89,4.86,5.16,4.76,5.02,5.04,
+4.99,4.94,4.97,5.13,5.04,4.92,5.07,4.97,5.06,4.86,
+5.24,5.37,5.12,5.05,5.31,5.23,5.09,5.14,5.24,5.25,
+5.31,5.37,5.09,5.16,5.33,5.24,5.33,5.19,5.64,5.29,
+5.41,5.60,5.22,5.37,5.37,5.08,5.40,5.27,5.37,5.48,
+5.22,5.48,5.56,5.34,5.45,5.31,5.14,5.50,5.56,5.45,
+5.44,5.41,5.25,5.49,5.31,5.47,5.64,5.51,5.62,5.37,
+5.74,5.58,5.65,5.62,5.88,5.82,5.65,5.61,6.01,5.55,
+5.62,5.90,5.81,5.49,5.52,5.65,5.89,5.73,5.90,5.94,
+1.06,1.11,1.14,1.21,1.26,1.31,1.37,1.34,1.39,1.43,
+1.51,1.45,1.58,1.51,1.65,1.64,1.72,1.74,1.69,1.72,
+1.82,1.86,1.92,1.87,1.98,1.97,2.03,1.91,1.97,2.03,
+2.09,2.05,2.19,2.25,2.10,2.18,2.18,2.25,2.17,2.31,
+2.37,2.36,2.31,2.35,2.48,2.42,2.41,2.45,2.51,2.56,
+2.58,2.45,2.62,2.62,2.63,2.70,2.64,2.77,2.76,2.64,
+2.72,2.64,2.78,2.76,2.90,2.78,2.91,2.93,2.90,2.88,
+2.87,2.93,3.02,2.85,2.95,3.03,2.99,2.84,3.04,3.10,
+3.09,3.07,3.17,3.14,3.14,3.16,3.09,3.22,3.30,3.20,
+3.18,3.16,3.34,3.31,3.28,3.38,3.29,3.31,3.34,3.30,
+3.42,3.53,3.44,3.43,3.42,3.49,3.57,3.55,3.48,3.41,
+3.55,3.53,3.54,3.59,3.62,3.70,3.63,3.60,3.73,3.58,
+3.58,3.58,3.71,3.65,3.76,3.82,3.69,3.78,3.65,3.84,
+4.06,3.92,3.78,3.91,3.70,4.00,3.79,3.80,4.03,3.89,
+4.00,4.07,4.04,3.98,3.97,3.93,4.08,4.01,3.93,4.16,
+4.15,4.04,4.08,4.20,4.15,4.12,4.15,4.10,4.18,4.20,
+4.36,4.33,4.18,4.21,4.34,4.19,4.19,4.15,4.45,4.33,
+4.31,4.33,4.20,4.36,4.47,4.37,4.28,4.39,4.33,4.39,
+4.48,4.61,4.41,4.67,4.60,4.47,4.55,4.74,4.61,4.35,
+4.39,4.44,4.76,4.64,4.54,4.74,4.76,4.60,4.86,4.92,
+4.76,4.71,4.45,4.67,4.96,4.73,4.85,4.89,4.76,4.49,
+4.98,4.78,4.75,4.95,4.94,4.83,4.76,4.79,4.93,4.92,
+4.79,4.89,4.90,4.97,4.90,4.92,4.96,5.06,4.95,5.04,
+4.97,5.14,4.93,5.25,5.18,5.26,5.00,5.21,4.90,5.17,
+5.14,5.21,5.01,5.04,5.12,5.14,5.14,5.19,5.26,5.24,
+5.23,5.21,5.42,5.16,5.25,5.23,5.23,5.29,5.49,5.34,
+5.29,5.22,5.48,5.28,5.40,5.27,5.70,5.55,5.31,5.57,
+5.33,5.59,5.30,5.45,5.57,5.35,5.29,5.27,5.35,5.52,
+5.45,5.52,5.51,5.50,5.63,5.73,5.47,5.92,5.55,5.45,
+1.05,1.07,1.14,1.18,1.22,1.24,1.28,1.30,1.40,1.39,
+1.43,1.51,1.48,1.46,1.56,1.58,1.67,1.69,1.72,1.67,
+1.73,1.78,1.77,1.83,1.83,1.83,1.94,1.92,2.02,1.92,
+2.03,2.00,2.04,2.09,2.22,2.04,2.23,2.12,2.25,2.20,
+2.29,2.33,2.27,2.24,2.23,2.32,2.38,2.40,2.37,2.40,
+2.43,2.48,2.52,2.41,2.65,2.62,2.61,2.60,2.58,2.61,
+2.68,2.66,2.63,2.72,2.63,2.64,2.69,2.71,2.78,2.89,
+2.78,2.93,2.78,2.97,2.98,2.99,2.91,2.93,2.98,2.93,
+2.95,3.13,3.01,3.07,3.06,2.98,2.98,3.16,3.15,3.10,
+3.17,3.16,3.31,3.31,3.25,3.19,3.25,3.23,3.22,3.23,
+3.25,3.23,3.34,3.22,3.43,3.35,3.36,3.43,3.39,3.43,
+3.38,3.58,3.56,3.46,3.54,3.35,3.50,3.46,3.46,3.63,
+3.56,3.56,3.61,3.66,3.55,3.67,3.68,3.75,3.76,3.71,
+3.74,3.73,3.75,3.62,3.75,3.92,3.77,3.84,3.98,3.83,
+3.86,3.93,3.84,3.81,3.84,3.96,3.74,3.98,3.93,4.14,
+3.89,3.99,3.97,4.07,4.25,4.10,3.95,4.03,3.91,4.04,
+4.08,4.08,4.06,4.23,4.21,4.31,3.94,4.14,4.15,4.19,
+4.24,4.21,4.21,4.36,4.01,4.48,4.29,4.22,4.50,4.30,
+4.27,4.39,4.41,4.51,4.26,4.30,4.49,4.33,4.43,4.62,
+4.29,4.42,4.60,4.30,4.55,4.62,4.53,4.53,4.53,4.66,
+4.55,4.44,4.53,4.59,4.62,4.45,4.69,4.60,4.47,4.64,
+4.75,4.50,4.82,4.82,4.68,4.65,4.79,4.82,4.55,4.77,
+4.45,4.78,4.66,4.72,4.75,4.70,4.85,4.57,4.85,4.94,
+4.90,4.89,4.64,4.72,4.81,4.90,4.85,5.06,4.85,4.80,
+5.07,4.97,5.08,5.12,4.88,5.07,5.01,4.98,4.90,5.21,
+4.95,4.90,5.04,5.29,5.01,5.25,5.43,5.31,5.04,5.01,
+5.27,5.43,5.04,5.25,5.15,5.12,5.07,5.15,5.14,5.14,
+5.41,5.15,5.25,5.54,5.29,5.36,5.33,5.43,5.11,5.33,
+5.29,5.27,5.39,5.22,5.33,5.12,5.40,5.40,5.56,5.28,
+0.98,1.02,1.06,1.14,1.21,1.20,1.22,1.32,1.33,1.33,
+1.39,1.40,1.46,1.45,1.50,1.56,1.60,1.62,1.61,1.65,
+1.64,1.75,1.75,1.72,1.75,1.76,1.85,1.88,1.82,1.87,
+1.96,1.95,1.97,1.98,1.97,2.05,2.07,2.05,2.06,2.14,
+2.19,2.19,2.24,2.30,2.30,2.32,2.21,2.21,2.23,2.27,
+2.32,2.33,2.44,2.33,2.40,2.31,2.54,2.46,2.48,2.47,
+2.54,2.55,2.61,2.54,2.51,2.70,2.69,2.62,2.64,2.64,
+2.72,2.77,2.72,2.67,2.69,2.80,2.89,2.84,2.82,2.80,
+2.88,2.90,2.82,2.95,2.98,3.04,2.94,3.12,3.00,3.06,
+3.01,3.05,3.03,3.02,3.11,3.04,3.11,3.13,3.13,3.19,
+3.11,3.16,3.23,3.19,3.27,3.31,3.13,3.30,3.31,3.37,
+3.18,3.40,3.36,3.22,3.39,3.31,3.51,3.40,3.31,3.42,
+3.35,3.46,3.65,3.48,3.57,3.49,3.53,3.45,3.44,3.46,
+3.43,3.47,3.62,3.68,3.55,3.66,3.63,3.72,3.61,3.63,
+3.63,3.68,3.70,3.75,3.54,3.86,3.71,3.75,3.65,3.69,
+3.94,3.66,3.86,3.78,3.80,3.81,4.04,3.90,3.89,3.82,
+3.84,4.03,3.92,3.96,3.91,3.83,3.83,4.06,3.93,3.87,
+4.14,3.95,4.24,4.10,4.19,4.20,4.29,4.08,4.04,4.26,
+4.24,4.24,4.03,4.27,4.26,4.24,4.32,4.26,4.36,4.26,
+4.26,4.41,4.36,4.22,4.35,4.25,4.35,4.20,4.36,4.20,
+4.43,4.54,4.40,4.33,4.50,4.30,4.53,4.39,4.39,4.28,
+4.56,4.50,4.60,4.53,4.59,4.54,4.41,4.64,4.58,4.62,
+4.68,4.65,4.68,4.63,4.50,4.52,4.68,4.65,4.51,4.62,
+4.58,4.69,4.70,4.79,4.76,4.88,4.69,4.63,4.72,4.74,
+4.70,4.73,4.64,4.61,4.72,4.75,4.73,4.81,4.87,4.77,
+4.89,4.78,4.65,4.69,4.93,5.01,4.82,4.85,4.99,4.94,
+4.80,4.82,4.91,4.86,4.93,5.05,4.90,5.04,5.01,4.89,
+5.00,5.10,4.86,5.03,5.09,5.05,5.14,5.03,4.99,5.01,
+5.11,5.12,5.03,5.02,5.11,5.19,4.98,5.28,5.20,4.99,
+0.92,0.94,1.02,1.08,1.10,1.18,1.16,1.22,1.26,1.31,
+1.30,1.33,1.40,1.41,1.49,1.44,1.49,1.49,1.48,1.56,
+1.57,1.65,1.64,1.71,1.67,1.71,1.77,1.75,1.79,1.84,
+1.88,1.92,1.88,1.85,1.85,1.99,1.93,2.05,2.11,2.08,
+2.02,2.03,2.14,2.13,2.17,2.23,2.20,2.20,2.18,2.17,
+2.28,2.23,2.38,2.30,2.27,2.35,2.33,2.31,2.40,2.44,
+2.40,2.48,2.48,2.55,2.46,2.44,2.60,2.44,2.63,2.55,
+2.58,2.70,2.65,2.61,2.65,2.68,2.66,2.65,2.78,2.73,
+2.79,2.76,2.80,2.75,2.77,2.72,2.83,2.78,2.93,2.99,
+2.84,2.92,3.00,2.88,3.04,2.95,3.05,3.00,3.00,2.95,
+3.02,3.15,3.14,3.05,3.04,3.17,3.16,2.95,3.13,3.07,
+3.12,3.27,3.13,3.27,3.33,3.27,3.30,3.15,3.15,3.39,
+3.24,3.20,3.26,3.47,3.36,3.35,3.39,3.51,3.37,3.41,
+3.38,3.34,3.33,3.29,3.46,3.46,3.40,3.54,3.44,3.60,
+3.55,3.57,3.48,3.61,3.59,3.55,3.61,3.54,3.51,3.64,
+3.75,3.62,3.71,3.64,3.65,3.78,3.68,3.69,3.75,3.78,
+3.72,3.77,3.91,3.79,3.92,3.81,3.85,3.65,3.89,3.96,
+3.83,3.81,3.89,3.90,3.87,3.85,3.90,3.95,3.97,3.98,
+3.90,3.81,4.06,3.85,4.24,4.04,4.12,4.05,3.96,4.15,
+4.02,3.90,4.09,4.12,4.23,4.23,4.15,4.22,4.06,4.38,
+4.18,4.37,4.20,4.32,4.22,4.32,4.19,4.13,4.18,4.16,
+4.37,4.28,4.30,4.36,4.29,4.34,4.42,4.47,4.26,4.29,
+4.50,4.29,4.32,4.34,4.27,4.52,4.40,4.39,4.50,4.48,
+4.29,4.33,4.36,4.40,4.58,4.42,4.39,4.57,4.51,4.43,
+4.49,4.62,4.60,4.70,4.64,4.58,4.62,4.75,4.77,4.46,
+4.65,4.57,4.54,4.55,4.85,4.68,4.69,4.45,4.76,4.65,
+4.73,4.79,4.63,4.96,4.92,4.90,4.72,4.79,4.93,4.92,
+4.71,4.78,5.03,4.79,4.86,4.74,4.90,4.99,4.89,4.92,
+4.92,4.85,4.96,5.01,4.66,5.01,4.95,5.05,5.09,4.92,
+0.93,0.94,0.98,1.03,1.09,1.11,1.09,1.16,1.19,1.20,
+1.31,1.31,1.35,1.35,1.38,1.40,1.40,1.50,1.44,1.47,
+1.54,1.51,1.57,1.60,1.64,1.64,1.74,1.68,1.73,1.76,
+1.77,1.79,1.83,1.81,1.81,1.84,1.97,1.95,1.95,1.92,
+1.94,1.96,2.01,2.02,2.04,2.07,2.05,2.07,2.09,2.05,
+2.21,2.23,2.17,2.21,2.15,2.25,2.18,2.20,2.22,2.36,
+2.21,2.31,2.24,2.44,2.37,2.35,2.23,2.44,2.40,2.39,
+2.49,2.46,2.42,2.47,2.57,2.47,2.67,2.55,2.60,2.56,
+2.61,2.58,2.60,2.61,2.74,2.78,2.73,2.70,2.72,2.70,
+2.79,2.73,2.85,2.79,2.81,2.80,2.78,2.96,2.83,2.79,
+2.87,2.96,2.94,2.97,2.99,2.95,3.00,2.97,3.14,3.02,
+3.10,3.17,2.91,3.01,2.96,3.13,3.26,3.09,2.99,3.11,
+3.04,3.18,3.19,3.23,3.17,3.28,3.10,3.26,3.13,3.28,
+3.38,3.27,3.26,3.30,3.22,3.39,3.19,3.39,3.34,3.34,
+3.33,3.48,3.37,3.34,3.46,3.40,3.30,3.50,3.46,3.43,
+3.39,3.45,3.46,3.56,3.54,3.39,3.61,3.41,3.46,3.61,
+3.54,3.77,3.58,3.67,3.65,3.62,3.72,3.58,3.56,3.77,
+3.78,3.59,3.87,3.73,3.72,3.70,3.71,3.65,3.87,3.79,
+3.89,3.76,3.94,3.86,3.77,3.88,3.84,3.87,3.74,3.89,
+3.80,3.81,3.83,3.89,3.97,4.02,3.96,3.98,4.06,3.98,
+3.99,3.87,4.20,3.86,3.95,4.01,3.88,3.98,4.05,4.12,
+4.07,4.09,4.12,4.10,4.26,4.18,4.12,4.03,4.04,4.14,
+4.18,4.21,4.17,4.16,4.15,4.32,4.19,4.37,4.26,4.22,
+4.27,4.29,4.35,4.33,4.31,4.10,4.09,4.41,4.33,4.39,
+4.12,4.43,4.55,4.47,4.54,4.37,4.32,4.42,4.47,4.38,
+4.40,4.41,4.45,4.37,4.53,4.34,4.38,4.46,4.62,4.51,
+4.54,4.36,4.70,4.59,4.53,4.46,4.65,4.68,4.57,4.65,
+4.50,4.36,4.54,4.73,4.62,4.55,4.59,4.73,4.77,4.91,
+4.73,4.60,4.65,4.75,4.60,4.68,4.78,4.91,4.79,4.70,
+0.87,0.96,0.91,0.93,0.99,1.04,1.09,1.14,1.17,1.19,
+1.22,1.19,1.22,1.24,1.29,1.36,1.34,1.39,1.43,1.43,
+1.43,1.41,1.51,1.55,1.50,1.59,1.66,1.67,1.61,1.58,
+1.64,1.70,1.67,1.69,1.69,1.68,1.79,1.76,1.80,1.91,
+1.84,2.01,1.99,1.94,1.87,1.95,1.95,1.92,2.04,1.99,
+2.01,2.07,2.01,2.04,2.12,2.11,2.08,2.16,2.07,2.20,
+2.28,2.20,2.15,2.24,2.28,2.38,2.36,2.32,2.25,2.30,
+2.35,2.30,2.35,2.29,2.37,2.51,2.44,2.41,2.49,2.47,
+2.40,2.42,2.48,2.51,2.60,2.44,2.54,2.59,2.59,2.58,
+2.62,2.58,2.73,2.69,2.65,2.73,2.62,2.71,2.72,2.70,
+2.67,2.72,2.71,2.85,2.79,2.71,2.66,2.84,2.81,2.88,
+2.74,2.91,2.94,2.92,2.84,3.00,2.90,2.84,2.88,2.91,
+2.98,3.03,3.08,3.12,3.02,2.99,3.04,3.09,3.13,3.04,
+3.15,3.07,3.15,3.11,3.06,3.16,3.02,3.35,3.12,3.13,
+3.11,3.26,3.17,3.27,3.18,3.31,3.24,3.24,3.25,3.24,
+3.30,3.29,3.26,3.50,3.39,3.42,3.30,3.42,3.36,3.40,
+3.41,3.51,3.45,3.50,3.38,3.34,3.54,3.59,3.55,3.40,
+3.57,3.52,3.52,3.55,3.56,3.63,3.70,3.62,3.71,3.64,
+3.48,3.55,3.69,3.74,3.69,3.57,3.61,3.56,3.47,3.66,
+3.74,3.80,3.75,3.80,3.68,3.84,3.69,3.68,3.70,3.81,
+3.64,3.77,3.92,3.89,3.84,3.87,3.97,3.84,3.95,3.91,
+3.74,4.05,3.86,3.92,3.84,4.01,3.95,4.06,4.01,4.02,
+3.92,4.06,4.03,3.91,3.99,3.90,3.86,4.05,3.91,4.17,
+4.11,4.14,4.18,4.02,4.06,3.98,4.04,4.11,4.22,4.04,
+4.12,4.12,4.07,4.19,4.09,4.28,4.28,4.16,3.94,4.16,
+4.26,4.28,4.10,4.30,4.13,3.97,4.13,4.35,4.36,4.41,
+4.13,4.42,4.30,4.29,4.21,4.36,4.29,4.27,4.45,4.24,
+4.47,4.22,4.51,4.57,4.49,4.37,4.43,4.37,4.46,4.57,
+4.40,4.33,4.48,4.34,4.39,4.52,4.35,4.51,4.59,4.49,
+0.82,0.85,0.88,0.91,0.96,1.03,1.00,1.07,1.10,1.10,
+1.14,1.13,1.19,1.18,1.28,1.28,1.26,1.32,1.39,1.38,
+1.42,1.38,1.39,1.47,1.50,1.41,1.46,1.48,1.57,1.58,
+1.56,1.56,1.67,1.63,1.70,1.62,1.63,1.75,1.69,1.73,
+1.69,1.78,1.80,1.86,1.86,1.94,1.83,1.86,1.88,1.83,
+1.91,1.94,1.96,1.92,2.05,2.01,1.97,2.07,1.96,2.04,
+2.11,2.07,2.06,2.12,2.14,2.12,2.14,2.21,2.23,2.22,
+2.24,2.24,2.18,2.21,2.19,2.33,2.26,2.38,2.31,2.34,
+2.31,2.37,2.28,2.34,2.37,2.30,2.46,2.47,2.47,2.32,
+2.55,2.46,2.50,2.55,2.47,2.49,2.52,2.46,2.53,2.62,
+2.70,2.67,2.61,2.62,2.64,2.58,2.58,2.68,2.69,2.62,
+2.79,2.69,2.69,2.72,2.87,2.77,2.77,2.81,2.78,2.76,
+2.77,2.79,2.96,2.84,2.82,2.92,2.93,2.87,2.91,2.94,
+2.89,2.92,2.99,2.84,2.85,2.97,3.10,2.85,3.09,2.92,
+2.94,3.08,3.05,3.08,3.07,3.10,3.06,3.09,3.14,3.05,
+3.06,3.12,3.13,3.11,3.00,3.28,3.16,3.21,3.27,3.16,
+3.16,3.21,3.18,3.18,3.25,3.13,3.25,3.34,3.20,3.18,
+3.38,3.45,3.45,3.32,3.27,3.36,3.31,3.39,3.36,3.32,
+3.31,3.36,3.41,3.38,3.46,3.46,3.41,3.51,3.38,3.46,
+3.53,3.48,3.44,3.55,3.62,3.55,3.67,3.44,3.50,3.63,
+3.66,3.56,3.45,3.62,3.71,3.58,3.59,3.65,3.59,3.61,
+3.65,3.60,3.62,3.73,3.65,3.67,3.60,3.67,3.83,3.65,
+3.84,3.79,3.78,3.70,3.79,3.78,3.80,3.67,3.93,3.73,
+3.92,3.72,3.72,3.78,3.82,3.79,4.05,3.93,3.92,3.91,
+3.96,3.73,3.84,3.88,3.88,4.11,3.89,3.95,3.85,3.94,
+4.06,3.98,3.99,4.04,4.16,4.04,4.07,4.05,4.04,3.92,
+4.15,4.05,4.10,4.18,4.15,4.15,4.07,4.04,3.95,3.93,
+4.07,4.13,4.02,4.14,4.14,4.20,4.15,4.37,4.11,4.17,
+4.16,4.23,4.17,4.14,4.18,4.26,4.40,4.44,4.29,4.11,
+0.74,0.81,0.83,0.85,0.89,0.90,0.92,0.98,1.01,1.07,
+1.08,1.06,1.11,1.13,1.17,1.18,1.14,1.25,1.23,1.25,
+1.31,1.34,1.33,1.35,1.36,1.36,1.42,1.43,1.41,1.48,
+1.41,1.53,1.49,1.51,1.55,1.54,1.58,1.57,1.55,1.66,
+1.65,1.65,1.70,1.68,1.71,1.74,1.72,1.76,1.73,1.77,
+1.83,1.81,1.83,1.87,1.87,1.93,1.99,1.89,1.96,1.89,
+1.96,1.97,1.98,2.01,1.99,2.04,2.05,2.08,2.03,2.07,
+2.13,2.06,2.03,2.17,2.13,2.19,2.22,2.27,2.11,2.19,
+2.24,2.29,2.22,2.23,2.17,2.24,2.22,2.26,2.31,2.34,
+2.34,2.35,2.43,2.46,2.41,2.36,2.40,2.40,2.46,2.47,
+2.46,2.44,2.51,2.47,2.50,2.45,2.51,2.46,2.52,2.52,
+2.53,2.62,2.63,2.54,2.56,2.55,2.61,2.63,2.62,2.67,
+2.65,2.70,2.78,2.66,2.64,2.69,2.67,2.70,2.71,2.78,
+2.71,2.77,2.74,2.86,2.89,2.83,2.84,2.86,2.91,2.80,
+3.03,2.74,3.06,2.90,2.97,2.89,3.05,2.97,3.07,2.83,
+2.95,2.91,2.93,3.06,3.03,2.95,2.99,3.00,3.02,3.05,
+3.00,2.88,3.04,2.95,3.08,3.11,3.05,3.07,3.03,3.04,
+3.13,3.17,3.36,3.20,3.18,3.15,3.16,3.25,3.20,3.20,
+3.11,3.32,3.31,3.27,3.13,3.16,3.23,3.47,3.22,3.23,
+3.24,3.27,3.29,3.49,3.34,3.38,3.35,3.27,3.51,3.34,
+3.45,3.28,3.37,3.40,3.35,3.30,3.42,3.36,3.44,3.30,
+3.38,3.57,3.48,3.56,3.35,3.51,3.52,3.58,3.61,3.52,
+3.49,3.47,3.52,3.46,3.61,3.51,3.62,3.66,3.72,3.74,
+3.65,3.75,3.61,3.61,3.66,3.70,3.64,3.58,3.60,3.73,
+3.69,3.67,3.80,3.64,3.79,3.67,3.71,3.83,3.92,3.70,
+3.82,3.72,3.75,3.89,3.58,3.86,3.84,3.85,3.83,3.79,
+3.90,3.83,3.72,3.83,3.75,3.69,3.83,3.75,4.01,3.88,
+3.91,3.98,3.87,4.00,3.97,3.91,3.99,3.96,4.03,4.02,
+3.87,3.84,4.08,3.99,3.89,4.03,3.87,3.97,4.06,3.90,
+0.73,0.75,0.80,0.82,0.86,0.86,0.89,0.95,0.95,0.99,
+1.02,1.00,1.02,1.07,1.09,1.11,1.14,1.16,1.13,1.20,
+1.25,1.21,1.26,1.27,1.29,1.34,1.38,1.28,1.36,1.33,
+1.44,1.44,1.45,1.41,1.43,1.47,1.46,1.52,1.49,1.56,
+1.52,1.55,1.54,1.59,1.64,1.58,1.68,1.63,1.65,1.62,
+1.77,1.74,1.76,1.70,1.74,1.75,1.84,1.83,1.76,1.83,
+1.82,1.81,1.88,1.93,1.89,1.86,1.91,1.87,1.93,1.93,
+2.01,1.93,2.03,1.93,1.95,2.04,1.99,2.04,2.02,2.04,
+2.14,2.10,2.08,2.03,2.15,2.04,2.17,2.19,2.10,2.31,
+2.23,2.20,2.20,2.23,2.28,2.34,2.29,2.30,2.32,2.20,
+2.22,2.35,2.31,2.31,2.24,2.39,2.35,2.37,2.36,2.36,
+2.42,2.41,2.45,2.43,2.45,2.51,2.48,2.45,2.44,2.53,
+2.45,2.62,2.57,2.43,2.53,2.49,2.54,2.58,2.50,2.62,
+2.58,2.70,2.57,2.53,2.65,2.64,2.67,2.66,2.69,2.73,
+2.69,2.81,2.71,2.66,2.75,2.67,2.79,2.66,2.77,2.74,
+2.77,2.79,2.80,2.81,2.76,2.84,2.81,2.89,2.74,2.87,
+2.91,2.82,2.81,2.90,2.83,3.04,2.93,2.79,3.01,2.99,
+3.01,2.96,2.97,2.95,2.96,2.90,3.06,2.98,2.90,2.93,
+3.08,3.10,3.13,3.09,3.03,3.08,3.05,3.04,2.97,3.02,
+3.06,3.11,3.12,3.27,3.11,3.16,3.30,3.15,3.13,3.17,
+2.99,3.14,3.15,3.30,3.20,3.16,3.10,3.26,3.21,3.18,
+3.24,3.21,3.32,3.34,3.20,3.27,3.21,3.27,3.31,3.25,
+3.39,3.28,3.23,3.44,3.19,3.34,3.47,3.35,3.47,3.28,
+3.53,3.29,3.34,3.31,3.53,3.37,3.37,3.35,3.41,3.43,
+3.55,3.42,3.56,3.45,3.57,3.48,3.48,3.41,3.42,3.54,
+3.49,3.52,3.59,3.47,3.63,3.57,3.62,3.63,3.54,3.76,
+3.60,3.69,3.59,3.59,3.61,3.65,3.77,3.55,3.81,3.60,
+3.68,3.69,3.74,3.75,3.79,3.64,3.76,3.75,3.83,3.64,
+3.82,3.58,3.91,3.89,3.75,3.55,3.87,3.79,3.75,3.86,
+0.71,0.72,0.75,0.76,0.79,0.77,0.86,0.88,0.89,0.91,
+0.96,0.93,0.97,0.98,1.07,1.06,1.05,1.11,1.07,1.10,
+1.13,1.19,1.22,1.24,1.20,1.24,1.30,1.23,1.33,1.26,
+1.34,1.36,1.33,1.31,1.38,1.36,1.40,1.45,1.48,1.43,
+1.43,1.50,1.50,1.53,1.53,1.50,1.55,1.59,1.58,1.61,
+1.65,1.63,1.63,1.64,1.66,1.64,1.68,1.71,1.70,1.76,
+1.73,1.73,1.73,1.72,1.74,1.72,1.80,1.81,1.74,1.87,
+1.87,1.88,1.83,1.87,1.90,1.95,1.91,1.89,1.92,1.93,
+1.95,2.01,1.90,1.96,1.93,1.92,2.03,2.04,2.06,2.09,
+2.05,2.09,2.03,2.05,2.00,2.14,2.15,2.17,2.12,2.15,
+2.22,2.26,2.19,2.18,2.20,2.17,2.26,2.20,2.28,2.24,
+2.22,2.22,2.30,2.27,2.33,2.30,2.32,2.33,2.20,2.37,
+2.26,2.37,2.42,2.37,2.40,2.37,2.39,2.34,2.45,2.42,
+2.45,2.49,2.58,2.45,2.44,2.45,2.57,2.43,2.42,2.45,
+2.45,2.51,2.51,2.48,2.59,2.52,2.54,2.62,2.56,2.61,
+2.54,2.55,2.57,2.74,2.64,2.59,2.65,2.71,2.67,2.63,
+2.68,2.63,2.71,2.62,2.74,2.78,2.80,2.74,2.66,2.73,
+2.71,2.75,2.85,2.81,2.70,2.77,2.79,2.85,2.85,2.85,
+2.80,2.86,2.84,2.82,2.87,2.79,2.86,2.71,2.92,3.00,
+2.90,2.93,2.88,2.94,2.85,3.00,2.86,2.97,3.03,2.95,
+2.92,2.98,2.97,2.95,2.99,3.07,2.93,3.05,2.90,3.08,
+3.10,3.04,3.11,3.02,3.18,3.00,3.18,3.09,3.10,3.08,
+3.16,3.23,3.16,3.26,3.17,3.22,3.20,3.06,3.27,3.12,
+3.11,3.24,3.26,3.25,3.30,3.21,3.31,3.23,3.19,3.25,
+3.18,3.26,3.36,3.18,3.19,3.23,3.31,3.37,3.23,3.30,
+3.29,3.23,3.28,3.29,3.37,3.28,3.37,3.17,3.41,3.47,
+3.32,3.36,3.40,3.43,3.40,3.38,3.24,3.47,3.54,3.50,
+3.51,3.40,3.47,3.44,3.46,3.38,3.43,3.49,3.42,3.49,
+3.55,3.54,3.55,3.63,3.51,3.64,3.52,3.69,3.46,3.50,
+0.64,0.65,0.71,0.75,0.74,0.76,0.80,0.81,0.86,0.88,
+0.85,0.89,0.90,0.94,0.96,0.98,1.01,1.00,1.04,1.02,
+1.10,1.05,1.09,1.15,1.13,1.14,1.15,1.13,1.16,1.21,
+1.25,1.28,1.30,1.28,1.32,1.33,1.35,1.35,1.36,1.35,
+1.37,1.36,1.44,1.42,1.43,1.48,1.44,1.40,1.45,1.50,
+1.48,1.49,1.51,1.52,1.59,1.47,1.59,1.61,1.63,1.60,
+1.59,1.62,1.66,1.64,1.63,1.69,1.63,1.76,1.72,1.75,
+1.74,1.74,1.80,1.80,1.78,1.76,1.79,1.82,1.83,1.82,
+1.83,1.79,1.86,1.86,1.93,1.90,1.90,1.90,1.91,1.91,
+1.90,1.90,1.92,1.97,1.91,1.99,2.02,1.91,1.93,1.98,
+2.02,1.95,2.00,2.01,2.14,2.16,2.11,2.03,2.06,2.17,
+2.10,2.14,2.08,2.08,2.16,2.15,2.20,2.17,2.13,2.22,
+2.15,2.16,2.15,2.20,2.17,2.21,2.18,2.32,2.25,2.25,
+2.23,2.32,2.28,2.33,2.21,2.33,2.31,2.34,2.30,2.43,
+2.38,2.35,2.40,2.35,2.44,2.46,2.49,2.45,2.36,2.34,
+2.42,2.58,2.40,2.49,2.47,2.38,2.56,2.42,2.49,2.41,
+2.51,2.50,2.54,2.59,2.56,2.48,2.49,2.60,2.61,2.59,
+2.60,2.64,2.63,2.63,2.60,2.61,2.62,2.56,2.60,2.74,
+2.63,2.76,2.72,2.62,2.62,2.77,2.61,2.79,2.53,2.83,
+2.67,2.78,2.69,2.77,2.77,2.70,2.84,2.76,2.70,2.75,
+2.71,2.69,2.86,2.86,2.74,2.89,2.92,2.76,2.82,2.83,
+2.80,2.85,2.87,2.95,2.94,2.90,2.89,2.83,2.81,2.83,
+2.90,2.85,2.92,2.87,2.92,3.01,2.99,2.95,2.90,2.90,
+2.95,2.91,3.04,2.98,3.05,2.98,2.95,3.05,3.10,2.96,
+2.99,3.03,3.25,3.04,3.04,3.12,3.10,3.03,3.13,3.00,
+3.03,3.14,3.17,3.25,3.01,3.20,3.10,3.19,3.19,3.15,
+3.18,3.12,3.10,3.21,3.21,3.12,3.24,3.27,3.08,3.19,
+3.25,3.30,3.21,3.31,3.25,3.20,3.32,3.31,3.30,3.25,
+3.24,3.27,3.11,3.29,3.37,3.27,3.20,3.25,3.30,3.25,
+0.56,0.64,0.62,0.65,0.69,0.70,0.73,0.77,0.76,0.79,
+0.82,0.82,0.88,0.86,0.82,0.91,0.93,0.95,1.00,1.03,
+1.00,0.97,1.00,1.06,1.07,1.08,1.05,1.10,1.12,1.10,
+1.15,1.17,1.14,1.18,1.23,1.17,1.23,1.30,1.20,1.23,
+1.21,1.29,1.30,1.32,1.31,1.35,1.37,1.36,1.36,1.30,
+1.40,1.42,1.38,1.47,1.45,1.45,1.42,1.46,1.42,1.50,
+1.52,1.45,1.51,1.59,1.53,1.50,1.52,1.61,1.60,1.62,
+1.59,1.62,1.61,1.59,1.64,1.70,1.68,1.67,1.64,1.65,
+1.73,1.77,1.68,1.71,1.71,1.78,1.76,1.75,1.74,1.81,
+1.82,1.83,1.80,1.84,1.93,1.89,1.91,1.87,1.94,1.86,
+1.90,1.86,2.03,1.96,1.89,1.90,1.92,1.94,2.05,1.95,
+1.95,1.93,2.04,1.99,1.97,1.98,1.97,2.08,2.03,2.04,
+2.11,2.02,2.11,2.05,2.04,2.15,2.09,2.13,2.13,2.10,
+2.21,2.06,2.20,2.20,2.13,2.13,2.19,2.16,2.13,2.10,
+2.22,2.22,2.17,2.26,2.19,2.26,2.24,2.26,2.24,2.30,
+2.29,2.32,2.29,2.15,2.29,2.36,2.30,2.31,2.33,2.44,
+2.38,2.32,2.39,2.32,2.43,2.36,2.53,2.38,2.48,2.42,
+2.33,2.45,2.42,2.50,2.40,2.44,2.61,2.53,2.51,2.51,
+2.47,2.49,2.44,2.49,2.63,2.56,2.52,2.45,2.52,2.53,
+2.53,2.59,2.53,2.61,2.62,2.59,2.56,2.56,2.60,2.57,
+2.66,2.63,2.56,2.64,2.49,2.64,2.70,2.71,2.61,2.62,
+2.57,2.74,2.65,2.69,2.68,2.73,2.72,2.66,2.73,2.74,
+2.87,2.71,2.67,2.74,2.64,2.68,2.72,2.72,2.84,2.65,
+2.81,2.83,2.73,2.95,2.70,2.83,2.93,2.91,2.76,2.73,
+2.81,2.81,2.83,2.71,2.82,2.88,2.81,2.90,2.86,2.89,
+2.87,2.89,2.81,2.86,2.94,2.89,3.03,2.95,2.89,2.90,
+2.95,3.01,2.97,2.95,2.99,2.96,3.02,3.06,2.98,2.97,
+3.05,3.00,3.12,3.03,3.05,3.02,2.94,3.08,3.11,3.02,
+3.07,3.09,3.08,2.98,3.08,3.02,3.03,3.11,3.20,3.12,
+0.52,0.58,0.58,0.64,0.61,0.66,0.67,0.70,0.71,0.75,
+0.75,0.77,0.82,0.82,0.84,0.83,0.93,0.87,0.88,0.90,
+0.92,0.92,0.92,0.95,1.02,1.00,1.01,1.04,1.07,1.06,
+1.07,1.03,1.11,1.09,1.08,1.10,1.16,1.14,1.11,1.21,
+1.22,1.15,1.27,1.20,1.22,1.25,1.26,1.26,1.27,1.25,
+1.30,1.23,1.32,1.34,1.33,1.36,1.38,1.40,1.37,1.43,
+1.44,1.40,1.48,1.43,1.43,1.47,1.46,1.48,1.53,1.52,
+1.48,1.52,1.50,1.49,1.54,1.52,1.55,1.59,1.56,1.58,
+1.61,1.63,1.64,1.69,1.68,1.63,1.63,1.71,1.66,1.71,
+1.72,1.73,1.74,1.71,1.78,1.71,1.78,1.80,1.73,1.75,
+1.82,1.83,1.61,1.78,1.78,1.79,1.84,1.79,1.79,1.86,
+1.77,1.82,1.87,1.81,1.91,1.79,1.86,1.90,1.90,1.91,
+1.95,1.95,1.98,1.89,1.97,1.93,1.97,2.05,1.99,2.01,
+1.98,2.01,1.99,2.02,2.01,2.00,2.08,2.06,2.01,2.10,
+1.98,2.06,2.04,2.12,2.00,2.00,2.05,2.12,2.09,2.04,
+2.15,2.11,2.16,2.16,2.16,2.09,2.11,2.21,2.26,2.08,
+2.16,2.20,2.23,2.16,2.23,2.12,2.26,2.13,2.27,2.25,
+2.30,2.28,2.33,2.29,2.23,2.31,2.29,2.36,2.38,2.37,
+2.20,2.38,2.36,2.33,2.40,2.26,2.41,2.34,2.29,2.24,
+2.33,2.46,2.32,2.39,2.35,2.41,2.33,2.43,2.39,2.44,
+2.40,2.35,2.42,2.43,2.53,2.51,2.57,2.42,2.52,2.51,
+2.64,2.55,2.54,2.36,2.44,2.56,2.51,2.54,2.44,2.47,
+2.58,2.52,2.60,2.60,2.64,2.56,2.53,2.64,2.62,2.61,
+2.56,2.58,2.66,2.60,2.63,2.66,2.58,2.66,2.62,2.63,
+2.66,2.68,2.63,2.58,2.60,2.75,2.81,2.71,2.71,2.67,
+2.65,2.74,2.70,2.78,2.76,2.63,2.70,2.73,2.73,2.78,
+2.74,2.69,2.70,2.68,2.71,2.82,2.71,2.81,2.82,2.84,
+2.85,2.81,2.74,2.85,2.80,2.75,2.84,2.89,2.83,2.74,
+2.95,2.81,2.84,2.86,2.77,2.94,2.87,3.05,2.92,2.82,
+1.15,1.21,1.18,1.32,1.31,1.31,1.43,1.44,1.42,1.57,
+1.53,1.60,1.61,1.69,1.67,1.76,1.81,1.75,1.79,1.84,
+1.80,1.91,1.94,2.01,2.00,1.94,1.95,2.12,2.02,2.10,
+2.22,2.10,2.20,2.23,2.24,2.32,2.35,2.35,2.36,2.36,
+2.49,2.45,2.46,2.52,2.47,2.46,2.57,2.52,2.59,2.51,
+2.59,2.69,2.64,2.72,2.61,2.68,2.83,2.81,2.79,2.76,
+2.95,2.95,2.75,3.01,2.89,2.90,2.88,3.08,3.08,3.09,
+2.81,3.20,3.08,2.94,3.03,3.19,3.02,3.17,3.12,3.25,
+3.15,3.23,3.28,3.36,3.20,3.37,3.37,3.46,3.33,3.33,
+3.34,3.50,3.55,3.43,3.54,3.60,3.39,3.47,3.57,3.57,
+3.63,3.50,3.45,3.68,3.56,3.74,3.66,3.69,3.73,3.81,
+3.57,3.65,3.87,3.70,3.79,3.85,3.78,3.75,3.78,3.77,
+3.74,3.85,3.80,3.80,4.12,4.17,3.84,4.10,4.04,4.06,
+4.06,3.88,3.84,4.07,4.08,4.04,4.15,3.88,3.95,4.21,
+4.06,4.03,4.11,4.09,4.21,4.25,4.16,4.15,4.19,4.25,
+4.25,4.24,4.18,4.08,4.30,4.30,4.39,4.38,4.41,4.35,
+4.44,4.24,4.43,4.35,4.48,4.53,4.28,4.65,4.53,4.46,
+4.31,4.65,4.45,4.56,4.51,4.62,4.67,4.58,4.75,4.63,
+4.58,4.80,4.57,4.58,4.87,4.70,4.62,4.79,4.74,4.84,
+4.63,4.70,4.85,4.74,4.94,4.96,4.67,4.88,4.80,5.11,
+4.95,4.92,4.98,4.98,4.71,5.18,4.82,4.89,5.09,5.01,
+4.92,5.11,4.92,4.99,4.89,5.19,4.96,5.25,5.10,5.10,
+4.96,5.09,5.28,5.14,5.15,5.00,5.11,5.28,5.13,4.94,
+4.99,5.20,5.17,5.25,5.25,5.32,5.25,5.18,5.29,5.39,
+5.45,5.25,5.37,5.44,5.45,5.53,5.35,5.42,5.42,5.50,
+5.38,5.59,5.51,5.62,5.34,5.59,5.54,5.54,5.68,5.56,
+5.30,5.80,5.72,5.64,5.69,5.55,5.54,5.42,5.78,5.44,
+5.84,6.00,5.69,5.76,5.70,5.66,5.74,5.82,5.70,5.73,
+5.77,5.61,5.55,5.98,5.87,5.82,5.56,5.84,5.77,5.74,
+1.08,1.14,1.22,1.26,1.31,1.28,1.36,1.38,1.41,1.45,
+1.49,1.57,1.54,1.58,1.74,1.69,1.69,1.70,1.76,1.80,
+1.82,1.81,1.95,1.91,2.00,2.04,2.05,1.99,2.09,2.11,
+2.20,2.11,2.11,2.24,2.21,2.19,2.31,2.31,2.26,2.31,
+2.44,2.39,2.40,2.47,2.46,2.45,2.47,2.45,2.58,2.46,
+2.54,2.58,2.62,2.68,2.75,2.70,2.82,2.67,2.67,2.65,
+2.70,2.91,2.88,2.91,2.82,2.84,2.85,2.93,2.87,2.93,
+3.04,2.98,3.01,2.93,3.02,3.07,3.16,2.99,3.01,3.15,
+3.20,3.28,3.16,3.12,3.22,3.25,3.30,3.16,3.36,3.31,
+3.37,3.28,3.29,3.45,3.35,3.30,3.36,3.31,3.38,3.42,
+3.50,3.50,3.47,3.56,3.55,3.60,3.63,3.59,3.67,3.70,
+3.62,3.59,3.66,3.62,3.79,3.74,3.56,3.62,3.68,3.89,
+3.74,3.82,3.82,3.74,3.83,3.98,3.87,3.78,3.65,3.99,
+3.95,3.99,3.81,3.93,3.82,3.96,4.10,3.86,3.99,4.06,
+4.20,4.04,4.04,4.03,4.10,4.17,3.93,4.25,4.05,4.23,
+4.12,4.20,4.21,4.12,4.13,4.30,4.29,4.28,4.23,4.39,
+4.30,4.16,4.33,4.35,4.56,4.30,4.25,4.35,4.42,4.35,
+4.46,4.29,4.35,4.52,4.39,4.40,4.50,4.54,4.56,4.61,
+4.47,4.64,4.63,4.43,4.53,4.52,4.83,4.81,4.60,4.62,
+4.58,4.73,4.74,4.61,4.63,4.60,4.61,4.78,4.72,4.69,
+4.75,4.93,4.74,4.89,4.81,4.96,4.68,5.06,4.76,5.01,
+4.71,4.87,4.93,4.91,4.92,4.86,5.15,4.92,5.03,4.92,
+5.20,4.91,4.85,5.11,4.81,5.14,5.00,5.19,5.06,5.19,
+5.14,5.15,4.97,5.03,5.12,5.09,5.25,5.24,5.15,5.37,
+5.03,5.21,5.39,5.24,5.21,5.23,5.40,5.16,5.38,5.43,
+5.41,5.10,5.10,5.11,5.35,5.18,5.24,5.39,5.48,5.34,
+5.50,5.46,5.26,5.53,5.44,5.50,5.54,5.50,5.48,5.59,
+5.52,5.48,5.54,5.65,5.60,5.41,5.78,5.64,5.73,5.78,
+5.87,5.62,5.69,5.79,5.42,5.50,5.66,5.71,5.66,5.59,
+1.04,1.09,1.14,1.19,1.24,1.31,1.34,1.41,1.42,1.45,
+1.52,1.52,1.52,1.60,1.66,1.63,1.60,1.65,1.79,1.79,
+1.76,1.79,1.85,1.86,1.85,1.84,2.04,1.99,2.05,2.03,
+2.05,2.01,2.05,2.15,2.13,2.24,2.22,2.19,2.12,2.34,
+2.27,2.29,2.45,2.37,2.37,2.38,2.45,2.37,2.46,2.53,
+2.51,2.56,2.61,2.49,2.63,2.52,2.59,2.58,2.70,2.67,
+2.78,2.62,2.68,2.67,2.77,2.72,2.94,2.84,2.85,2.85,
+2.84,3.03,2.95,2.97,2.91,3.00,2.92,3.10,3.03,3.02,
+3.10,3.11,3.08,3.03,3.10,3.25,3.14,3.11,3.14,3.22,
+3.24,3.29,3.24,3.20,3.31,3.36,3.40,3.26,3.38,3.38,
+3.40,3.47,3.35,3.46,3.54,3.25,3.53,3.36,3.58,3.58,
+3.50,3.48,3.56,3.59,3.48,3.62,3.71,3.66,3.56,3.64,
+3.78,3.56,3.66,3.69,3.70,3.76,3.82,3.68,3.95,3.84,
+3.89,3.81,3.87,3.87,3.80,3.77,3.92,3.89,3.92,3.90,
+4.01,4.00,3.99,3.90,3.91,3.89,4.00,4.08,3.95,4.02,
+4.04,4.00,4.06,4.27,4.06,4.14,4.08,4.26,4.20,4.31,
+4.07,4.31,4.36,4.19,4.19,4.12,4.20,4.35,4.28,4.19,
+4.42,4.32,4.41,4.36,4.34,4.37,4.35,4.44,4.47,4.28,
+4.41,4.26,4.60,4.36,4.49,4.47,4.62,4.50,4.35,4.59,
+4.61,4.53,4.48,4.47,4.51,4.38,4.64,4.58,4.54,4.60,
+4.79,4.58,4.71,4.73,4.68,4.45,4.69,4.76,4.61,4.96,
+4.84,4.64,4.69,4.66,4.70,4.72,4.92,4.87,4.99,4.83,
+4.99,4.79,4.93,4.89,4.62,4.68,4.91,5.08,5.14,5.06,
+4.91,4.99,5.14,5.05,5.00,4.97,5.16,5.12,5.02,5.10,
+5.23,4.84,5.00,5.10,5.15,4.98,5.17,5.15,5.20,5.05,
+5.31,5.18,5.46,5.14,5.28,5.20,5.06,5.34,5.28,5.41,
+5.03,5.08,5.27,5.41,5.19,5.40,5.35,5.18,5.32,5.32,
+5.49,5.26,5.27,5.27,5.37,5.41,5.34,5.56,5.52,5.47,
+5.41,5.68,5.53,5.35,5.63,5.54,5.54,5.34,5.52,5.35,
+1.02,1.09,1.13,1.18,1.19,1.27,1.31,1.36,1.30,1.40,
+1.45,1.50,1.49,1.55,1.51,1.52,1.64,1.61,1.71,1.77,
+1.75,1.76,1.73,1.82,1.85,1.77,1.88,1.91,1.95,2.00,
+1.97,2.00,1.99,2.13,2.07,2.09,2.14,2.20,2.26,2.15,
+2.22,2.25,2.24,2.34,2.26,2.25,2.37,2.34,2.38,2.36,
+2.48,2.44,2.47,2.49,2.41,2.50,2.63,2.56,2.66,2.62,
+2.63,2.69,2.71,2.73,2.72,2.75,2.76,2.78,2.79,2.78,
+2.87,2.77,2.73,2.75,2.88,2.85,2.87,2.93,2.99,2.99,
+3.06,2.90,2.89,3.02,2.95,3.02,3.03,3.07,2.95,3.13,
+3.06,3.12,3.25,3.24,3.12,3.15,3.24,3.14,3.17,3.19,
+3.08,3.22,3.35,3.18,3.43,3.15,3.37,3.40,3.49,3.42,
+3.46,3.64,3.34,3.41,3.33,3.52,3.48,3.56,3.28,3.67,
+3.44,3.54,3.53,3.60,3.53,3.50,3.66,3.77,3.50,3.76,
+3.75,3.67,3.72,3.62,3.74,3.82,3.76,3.82,3.95,3.94,
+3.89,3.81,3.89,3.87,3.82,3.82,3.88,3.96,4.07,4.03,
+3.95,3.95,4.02,4.16,3.86,3.92,4.04,3.91,4.08,3.95,
+4.03,4.08,4.06,4.21,4.12,4.15,4.13,4.13,4.06,4.15,
+4.18,4.27,4.19,4.25,4.24,4.24,4.44,4.32,4.31,4.31,
+4.31,4.12,4.38,4.37,4.36,4.33,4.31,4.29,4.32,4.29,
+4.36,4.46,4.41,4.44,4.70,4.59,4.53,4.21,4.55,4.61,
+4.53,4.41,4.51,4.52,4.56,4.65,4.64,4.57,4.56,4.54,
+4.42,4.62,4.69,4.75,4.69,4.69,4.73,4.64,4.86,4.59,
+4.55,4.73,4.72,4.70,4.73,4.59,4.74,4.63,4.83,4.63,
+4.78,4.85,4.97,4.59,4.75,4.91,4.81,4.92,4.97,4.87,
+4.90,4.78,4.74,4.90,4.97,4.89,4.90,4.83,4.98,4.99,
+4.89,5.00,4.80,5.04,5.15,5.32,5.12,5.13,4.91,5.02,
+5.14,5.32,5.14,5.21,5.10,5.49,5.17,4.98,5.33,4.97,
+5.07,5.22,5.20,5.19,5.18,5.28,5.31,5.08,5.26,5.08,
+5.42,5.17,5.46,5.45,5.28,5.32,5.32,5.40,5.62,5.34,
+1.04,1.03,1.11,1.12,1.14,1.19,1.26,1.30,1.26,1.40,
+1.37,1.43,1.43,1.44,1.54,1.52,1.64,1.58,1.66,1.71,
+1.66,1.64,1.75,1.80,1.81,1.83,1.77,1.83,1.88,1.90,
+1.93,1.96,2.08,2.01,2.02,2.07,2.08,2.11,2.15,2.08,
+2.10,2.17,2.24,2.24,2.24,2.31,2.32,2.22,2.26,2.26,
+2.35,2.36,2.40,2.46,2.53,2.40,2.45,2.50,2.51,2.55,
+2.51,2.58,2.69,2.54,2.58,2.64,2.66,2.67,2.62,2.69,
+2.64,2.72,2.86,2.91,2.65,2.67,2.81,2.81,2.80,2.87,
+2.93,2.86,2.89,2.95,2.92,2.99,2.84,2.97,3.05,3.04,
+2.95,2.97,3.12,3.10,3.01,3.02,3.05,3.22,3.10,3.05,
+3.12,3.19,3.14,3.27,3.15,3.31,3.13,3.14,3.16,3.33,
+3.25,3.31,3.38,3.29,3.43,3.43,3.45,3.32,3.42,3.42,
+3.44,3.50,3.41,3.53,3.49,3.45,3.59,3.58,3.53,3.65,
+3.47,3.61,3.46,3.66,3.81,3.72,3.55,3.64,3.85,3.56,
+3.60,3.62,3.76,3.78,3.86,3.75,3.86,3.74,3.52,3.95,
+3.77,3.94,3.75,4.02,3.85,3.81,3.84,3.88,4.00,3.81,
+3.81,4.01,3.98,3.91,4.05,4.04,3.97,3.97,3.88,4.02,
+4.11,4.15,4.05,4.00,4.05,4.23,4.06,4.17,4.11,4.10,
+4.21,4.05,4.14,4.15,4.15,4.15,4.29,4.34,4.24,4.23,
+4.33,4.27,4.36,4.40,4.19,4.19,4.45,4.28,4.32,4.36,
+4.37,4.38,4.24,4.37,4.44,4.54,4.20,4.54,4.42,4.54,
+4.40,4.49,4.56,4.57,4.53,4.42,4.79,4.79,4.53,4.52,
+4.62,4.48,4.64,4.58,4.66,4.72,4.65,4.65,4.68,4.83,
+4.70,4.54,4.66,4.65,4.72,4.72,4.53,4.92,4.54,4.68,
+4.74,4.53,4.83,4.82,4.90,4.65,4.63,4.93,4.83,4.92,
+4.89,4.85,4.79,4.90,5.02,4.73,4.80,5.02,4.85,4.79,
+4.96,4.82,4.84,4.94,5.06,5.05,4.81,5.08,5.00,4.85,
+4.93,5.26,5.05,5.08,4.94,5.13,4.99,4.95,5.33,5.30,
+5.06,5.15,5.15,5.04,4.90,5.01,5.23,5.22,5.10,5.26,
+0.97,1.03,1.04,1.11,1.14,1.14,1.17,1.20,1.26,1.24,
+1.31,1.35,1.40,1.43,1.46,1.50,1.56,1.56,1.52,1.59,
+1.61,1.64,1.69,1.70,1.73,1.75,1.73,1.82,1.83,1.85,
+1.90,1.83,1.92,1.87,1.98,1.94,2.01,1.98,2.02,2.01,
+2.14,2.09,2.07,2.12,2.19,2.12,2.25,2.24,2.24,2.19,
+2.23,2.22,2.35,2.38,2.24,2.47,2.43,2.31,2.40,2.51,
+2.58,2.54,2.46,2.54,2.40,2.52,2.52,2.54,2.53,2.54,
+2.58,2.53,2.61,2.78,2.56,2.64,2.67,2.74,2.73,2.82,
+2.75,2.73,2.69,2.74,2.80,2.86,2.84,2.96,2.97,2.98,
+2.94,2.99,3.00,2.91,3.07,3.00,3.01,3.09,2.87,2.98,
+3.02,3.00,3.22,3.23,2.94,3.11,3.08,3.28,3.06,3.06,
+3.06,3.18,3.24,3.23,3.27,3.19,3.30,3.14,3.42,3.35,
+3.32,3.26,3.34,3.41,3.33,3.42,3.50,3.46,3.43,3.47,
+3.38,3.34,3.48,3.47,3.62,3.31,3.39,3.50,3.55,3.54,
+3.50,3.65,3.54,3.64,3.62,3.62,3.65,3.66,3.53,3.69,
+3.66,3.67,3.75,3.56,3.75,3.70,3.80,3.69,3.60,3.60,
+3.72,3.83,3.75,3.80,3.85,3.76,3.84,3.79,3.85,3.98,
+3.79,3.96,3.94,3.98,3.81,3.92,4.10,3.96,3.91,3.88,
+4.06,4.08,3.99,3.94,4.08,4.02,4.04,3.98,4.17,3.94,
+4.08,4.16,4.25,4.10,4.03,4.13,4.21,4.09,4.11,4.07,
+4.20,4.14,4.28,4.23,4.18,4.21,4.06,4.27,4.18,4.39,
+4.33,4.05,4.40,4.58,4.20,4.34,4.44,4.50,4.31,4.41,
+4.43,4.32,4.54,4.41,4.47,4.32,4.48,4.42,4.26,4.46,
+4.62,4.55,4.54,4.68,4.56,4.62,4.42,4.67,4.74,4.51,
+4.45,4.45,4.66,4.65,4.54,4.77,4.61,4.68,4.71,4.69,
+4.77,4.65,4.80,4.80,4.69,4.76,4.79,4.77,4.72,5.06,
+4.85,4.62,4.79,4.61,4.69,4.95,4.86,4.75,4.95,4.97,
+4.85,4.81,4.84,5.02,4.84,4.94,4.77,5.00,4.97,5.01,
+5.08,5.01,5.00,4.90,5.33,5.07,5.16,5.02,4.90,5.02,
+0.92,0.97,0.99,1.03,1.14,1.06,1.16,1.17,1.23,1.27,
+1.30,1.34,1.31,1.37,1.43,1.41,1.46,1.47,1.52,1.51,
+1.56,1.56,1.64,1.63,1.62,1.63,1.70,1.75,1.69,1.69,
+1.82,1.84,1.85,1.87,1.89,1.86,1.92,1.89,1.90,2.06,
+1.99,2.00,2.13,1.99,2.02,2.12,2.07,2.11,2.15,2.15,
+2.27,2.20,2.18,2.26,2.24,2.30,2.23,2.32,2.29,2.33,
+2.24,2.42,2.26,2.33,2.36,2.33,2.55,2.49,2.58,2.41,
+2.51,2.55,2.59,2.60,2.64,2.60,2.61,2.66,2.56,2.76,
+2.60,2.71,2.76,2.70,2.77,2.80,2.80,2.73,2.75,2.81,
+2.70,2.87,2.97,2.84,2.86,2.89,3.00,2.81,2.91,2.89,
+2.96,2.94,3.03,3.02,2.88,2.99,2.99,3.11,2.94,2.91,
+3.11,3.14,3.11,3.06,3.16,3.14,3.22,3.17,3.08,3.14,
+3.21,3.26,3.21,3.20,3.28,3.12,3.18,3.27,3.27,3.30,
+3.21,3.36,3.30,3.40,3.28,3.27,3.36,3.29,3.46,3.46,
+3.33,3.47,3.41,3.40,3.54,3.37,3.43,3.47,3.57,3.51,
+3.61,3.62,3.65,3.63,3.51,3.70,3.64,3.64,3.56,3.48,
+3.61,3.78,3.69,3.85,3.58,3.65,3.70,3.72,3.82,3.83,
+3.74,3.63,3.96,3.79,3.86,3.73,3.85,3.73,3.86,3.74,
+3.80,3.68,3.97,3.97,3.84,3.98,4.01,3.83,4.01,3.97,
+3.96,3.84,3.85,3.99,3.86,4.01,3.93,4.24,3.98,3.98,
+4.08,4.04,4.05,3.97,4.23,4.28,4.09,4.12,4.25,4.22,
+4.18,4.20,4.25,4.11,4.40,4.22,4.10,4.34,4.19,4.24,
+4.31,4.06,4.19,4.30,4.30,4.41,4.15,4.26,4.31,4.41,
+4.28,4.36,4.38,4.45,4.30,4.27,4.30,4.10,4.26,4.35,
+4.41,4.32,4.37,4.49,4.47,4.47,4.37,4.53,4.42,4.65,
+4.37,4.36,4.55,4.50,4.46,4.45,4.66,4.59,4.81,4.47,
+4.55,4.46,4.57,4.77,4.58,4.63,4.66,4.73,4.83,4.61,
+4.70,4.78,4.67,4.55,4.79,4.70,4.54,4.70,4.73,4.75,
+4.76,4.79,4.68,4.79,4.96,4.93,4.63,4.91,4.81,4.73,
+0.87,0.97,0.95,1.02,1.03,1.02,1.13,1.16,1.19,1.20,
+1.26,1.25,1.28,1.28,1.34,1.32,1.38,1.43,1.46,1.47,
+1.47,1.53,1.54,1.54,1.58,1.63,1.60,1.63,1.68,1.76,
+1.73,1.69,1.79,1.83,1.81,1.79,1.88,1.81,1.89,1.96,
+1.91,1.88,2.00,1.95,1.87,1.99,2.07,1.96,2.12,2.07,
+2.09,2.05,2.15,2.14,2.10,2.11,2.20,2.22,2.30,2.19,
+2.31,2.26,2.27,2.34,2.41,2.33,2.37,2.40,2.26,2.38,
+2.42,2.47,2.45,2.55,2.42,2.44,2.55,2.57,2.48,2.43,
+2.53,2.60,2.54,2.57,2.60,2.68,2.63,2.70,2.67,2.62,
+2.67,2.78,2.68,2.77,2.77,2.64,2.79,2.72,2.70,2.89,
+2.71,2.94,2.83,2.94,2.83,2.91,2.97,2.93,2.85,2.95,
+2.84,2.87,3.05,3.02,2.90,2.98,2.94,2.98,2.92,3.10,
+3.09,3.08,2.94,3.08,3.08,3.00,3.17,3.17,3.23,3.13,
+3.20,3.02,3.20,3.22,3.24,3.16,3.12,3.22,3.36,3.19,
+3.32,3.26,3.32,3.45,3.38,3.32,3.30,3.25,3.40,3.26,
+3.38,3.41,3.44,3.47,3.36,3.39,3.49,3.49,3.50,3.52,
+3.54,3.53,3.67,3.51,3.52,3.55,3.57,3.53,3.63,3.66,
+3.60,3.61,3.62,3.63,3.58,3.70,3.59,3.59,3.86,3.78,
+3.84,3.72,3.86,3.81,3.83,3.88,3.75,3.96,3.76,3.65,
+3.83,3.75,3.91,3.68,3.72,3.76,3.84,3.82,3.64,3.81,
+3.92,3.90,3.98,3.98,3.99,3.86,4.10,3.71,3.95,4.08,
+3.91,3.99,4.00,4.14,4.10,4.19,3.91,4.08,3.93,4.00,
+3.97,4.13,4.11,4.22,4.16,4.15,3.93,4.13,4.07,4.24,
+4.23,4.07,4.17,4.04,4.28,4.25,4.22,4.08,4.16,4.10,
+4.41,4.29,4.36,4.26,4.36,4.40,4.46,4.34,4.41,4.43,
+4.22,4.34,4.39,4.32,4.33,4.28,4.32,4.37,4.29,4.25,
+4.24,4.45,4.46,4.43,4.47,4.46,4.61,4.56,4.41,4.37,
+4.57,4.39,4.37,4.46,4.48,4.51,4.52,4.55,4.44,4.44,
+4.56,4.65,4.49,4.73,4.63,4.57,4.48,4.48,4.69,4.60,
+0.85,0.88,0.98,0.97,0.96,1.00,1.03,1.07,1.10,1.16,
+1.20,1.21,1.21,1.26,1.25,1.29,1.36,1.34,1.37,1.43,
+1.43,1.47,1.49,1.49,1.47,1.52,1.61,1.53,1.58,1.64,
+1.69,1.64,1.68,1.69,1.71,1.71,1.79,1.75,1.83,1.78,
+1.85,1.85,1.87,1.90,1.89,1.91,2.00,2.03,1.93,2.07,
+1.97,2.00,2.02,2.09,2.06,2.07,2.09,2.14,2.20,2.16,
+2.27,2.04,2.13,2.18,2.17,2.24,2.27,2.24,2.28,2.33,
+2.25,2.30,2.33,2.31,2.35,2.36,2.49,2.37,2.38,2.39,
+2.54,2.50,2.47,2.52,2.46,2.40,2.52,2.53,2.48,2.48,
+2.60,2.48,2.64,2.64,2.54,2.66,2.66,2.71,2.70,2.77,
+2.74,2.68,2.71,2.70,2.80,2.69,2.66,2.75,2.63,2.78,
+2.82,2.76,2.86,2.80,2.83,2.88,2.81,3.11,2.81,2.92,
+2.90,2.84,2.91,3.00,2.84,2.99,2.87,3.11,3.07,3.03,
+2.96,3.05,3.05,3.01,3.06,3.10,3.18,3.08,3.06,3.14,
+3.15,3.19,3.05,3.15,3.22,3.02,3.13,3.17,3.22,3.14,
+3.29,3.27,3.18,3.24,3.32,3.21,3.40,3.30,3.23,3.37,
+3.28,3.39,3.33,3.37,3.36,3.37,3.51,3.30,3.24,3.39,
+3.33,3.43,3.46,3.43,3.57,3.44,3.55,3.39,3.49,3.52,
+3.63,3.67,3.67,3.58,3.56,3.60,3.64,3.64,3.67,3.59,
+3.67,3.57,3.68,3.60,3.69,3.65,3.65,3.92,3.67,3.64,
+3.74,3.81,3.59,3.75,3.76,3.83,3.66,3.65,3.63,3.63,
+3.73,3.79,3.82,3.83,3.87,3.72,3.88,4.00,3.86,3.91,
+3.91,3.77,3.74,3.87,3.98,3.86,3.88,3.91,4.04,4.08,
+3.89,3.92,4.00,3.97,4.12,3.97,4.01,4.05,3.94,4.16,
+3.83,4.08,4.13,4.25,4.07,3.97,4.11,4.15,4.28,4.02,
+4.00,4.14,4.14,4.25,4.08,4.10,4.20,4.07,4.25,4.33,
+4.20,4.33,4.30,4.13,4.11,4.23,4.25,4.22,4.24,4.18,
+4.27,4.16,4.19,4.24,4.14,4.21,4.28,4.37,4.24,4.35,
+4.46,4.39,4.49,4.26,4.40,4.41,4.31,4.32,4.44,4.57,
+0.80,0.85,0.87,0.92,0.94,0.97,0.99,1.04,1.09,1.13,
+1.08,1.07,1.12,1.18,1.16,1.24,1.27,1.28,1.26,1.33,
+1.39,1.37,1.38,1.45,1.43,1.43,1.46,1.42,1.52,1.53,
+1.60,1.52,1.63,1.60,1.62,1.64,1.64,1.67,1.70,1.75,
+1.76,1.70,1.73,1.75,1.78,1.85,1.84,1.87,1.82,1.88,
+1.88,1.85,1.89,1.95,1.99,2.05,1.96,1.96,2.07,2.08,
+2.07,2.02,2.01,2.06,2.06,2.11,2.11,2.11,2.18,2.32,
+2.19,2.22,2.27,2.22,2.23,2.31,2.31,2.18,2.29,2.36,
+2.37,2.29,2.29,2.29,2.42,2.31,2.44,2.42,2.37,2.41,
+2.45,2.47,2.45,2.42,2.43,2.54,2.51,2.63,2.54,2.60,
+2.59,2.56,2.51,2.58,2.58,2.56,2.59,2.64,2.53,2.74,
+2.65,2.63,2.69,2.63,2.80,2.70,2.69,2.78,2.81,2.96,
+2.73,2.64,2.77,2.70,2.75,2.90,2.93,2.93,2.90,2.88,
+2.89,2.90,2.89,2.94,2.99,2.86,2.81,2.97,3.01,3.03,
+3.02,2.95,3.08,2.94,2.95,2.93,3.06,3.10,3.10,3.17,
+3.06,3.08,3.01,3.08,3.20,2.97,3.17,3.08,3.21,3.17,
+3.06,3.07,3.18,3.39,3.15,3.33,3.09,3.31,3.27,3.24,
+3.35,3.29,3.18,3.41,3.29,3.37,3.28,3.35,3.31,3.42,
+3.41,3.32,3.47,3.32,3.45,3.40,3.42,3.28,3.48,3.41,
+3.64,3.45,3.47,3.43,3.44,3.49,3.50,3.38,3.42,3.71,
+3.43,3.38,3.45,3.51,3.43,3.52,3.62,3.52,3.55,3.48,
+3.61,3.48,3.58,3.72,3.75,3.81,3.55,3.58,3.76,3.70,
+3.73,3.70,3.74,3.59,3.68,3.72,3.76,3.81,3.67,3.85,
+3.78,3.82,3.80,3.77,3.96,3.78,3.87,3.83,3.80,3.91,
+3.83,3.72,4.00,3.78,3.82,3.80,3.88,3.67,3.77,3.91,
+3.81,3.93,4.05,4.16,3.94,4.07,4.03,4.20,4.01,4.07,
+4.09,3.94,4.05,4.06,4.02,4.05,4.12,3.98,4.27,3.93,
+4.10,4.03,4.05,4.08,4.07,3.99,4.15,4.23,4.12,4.11,
+4.23,4.14,4.26,4.05,4.11,4.19,4.06,4.29,4.17,4.30,
+0.76,0.77,0.80,0.86,0.91,0.91,0.96,0.93,0.97,1.04,
+1.06,1.09,1.10,1.11,1.12,1.18,1.18,1.17,1.26,1.27,
+1.28,1.34,1.30,1.36,1.36,1.36,1.38,1.42,1.40,1.46,
+1.39,1.49,1.45,1.56,1.51,1.55,1.59,1.60,1.60,1.62,
+1.62,1.70,1.67,1.71,1.69,1.76,1.68,1.74,1.71,1.72,
+1.80,1.77,1.90,1.82,1.86,1.83,1.82,1.89,1.94,1.98,
+1.95,2.01,1.98,1.96,1.99,2.02,2.06,1.95,2.08,2.04,
+2.08,2.07,2.11,2.14,2.05,2.15,2.16,2.23,2.14,2.15,
+2.14,2.23,2.18,2.16,2.24,2.22,2.32,2.31,2.27,2.35,
+2.31,2.38,2.37,2.38,2.40,2.37,2.40,2.32,2.41,2.37,
+2.44,2.54,2.45,2.41,2.44,2.46,2.57,2.59,2.49,2.59,
+2.60,2.51,2.51,2.51,2.45,2.63,2.58,2.57,2.48,2.80,
+2.58,2.71,2.64,2.71,2.70,2.61,2.61,2.78,2.89,2.62,
+2.80,2.82,2.76,2.80,2.83,2.74,2.80,2.81,2.76,2.85,
+2.79,2.87,2.82,2.86,2.76,2.89,2.88,3.00,3.02,2.98,
+2.95,2.97,2.92,2.81,2.91,2.95,3.00,3.05,2.97,3.06,
+2.99,2.97,3.01,3.01,2.94,3.18,3.08,3.01,3.00,3.08,
+3.06,3.18,3.09,3.14,3.22,3.24,3.14,3.11,3.22,3.16,
+3.24,3.24,3.00,3.35,3.21,3.18,3.24,3.29,3.34,3.16,
+3.23,3.31,3.21,3.38,3.34,3.32,3.27,3.42,3.46,3.50,
+3.32,3.26,3.38,3.27,3.35,3.55,3.28,3.40,3.52,3.47,
+3.47,3.36,3.38,3.52,3.40,3.43,3.58,3.48,3.38,3.44,
+3.28,3.48,3.39,3.44,3.52,3.47,3.48,3.64,3.56,3.63,
+3.67,3.68,3.54,3.62,3.62,3.66,3.61,3.58,3.66,3.64,
+3.62,3.51,3.61,3.63,3.69,3.66,3.75,3.80,3.68,3.73,
+3.69,3.71,3.77,3.84,3.68,3.61,3.60,3.85,3.84,3.68,
+3.80,3.86,3.78,3.78,3.82,3.85,3.96,3.81,3.97,3.84,
+4.01,3.96,3.90,3.82,3.89,3.68,3.84,3.85,3.98,3.94,
+4.02,3.93,3.94,3.98,3.95,4.10,3.93,4.09,3.94,3.99,
+0.71,0.76,0.80,0.81,0.86,0.89,0.93,0.96,0.93,0.99,
+0.99,1.09,1.05,1.02,1.07,1.12,1.14,1.18,1.21,1.23,
+1.20,1.21,1.30,1.30,1.25,1.32,1.35,1.33,1.36,1.35,
+1.41,1.39,1.42,1.42,1.47,1.49,1.54,1.51,1.49,1.56,
+1.49,1.60,1.55,1.57,1.59,1.52,1.64,1.70,1.71,1.68,
+1.74,1.71,1.68,1.68,1.77,1.74,1.72,1.81,1.83,1.86,
+1.87,1.80,1.89,1.89,1.89,1.87,1.83,1.89,1.94,2.00,
+2.00,1.92,1.94,2.07,2.08,1.98,2.01,2.03,2.00,2.08,
+2.01,2.10,2.11,2.15,2.04,2.06,2.18,2.20,2.15,2.15,
+2.19,2.21,2.24,2.23,2.17,2.19,2.28,2.25,2.19,2.31,
+2.29,2.24,2.28,2.36,2.41,2.39,2.27,2.36,2.27,2.48,
+2.51,2.42,2.41,2.34,2.47,2.44,2.39,2.36,2.49,2.44,
+2.54,2.41,2.55,2.47,2.53,2.57,2.53,2.56,2.54,2.58,
+2.58,2.52,2.64,2.66,2.65,2.66,2.57,2.64,2.62,2.66,
+2.72,2.63,2.72,2.72,2.77,2.73,2.66,2.66,2.81,2.77,
+2.62,2.72,2.82,2.71,2.82,2.75,2.80,2.77,2.88,2.92,
+2.80,2.83,2.87,2.90,2.94,2.91,2.97,3.04,2.92,2.92,
+2.81,2.91,2.94,3.00,2.95,2.94,2.98,3.01,3.00,2.91,
+2.95,3.08,3.07,3.01,3.03,3.14,3.01,3.11,3.17,3.21,
+3.15,3.07,3.04,3.35,3.07,3.10,3.09,3.18,3.15,3.01,
+3.19,3.22,3.25,3.22,3.24,3.16,3.25,3.14,3.21,3.28,
+3.23,3.27,3.33,3.21,3.33,3.22,3.31,3.22,3.26,3.20,
+3.33,3.27,3.38,3.40,3.43,3.39,3.38,3.30,3.37,3.39,
+3.31,3.23,3.51,3.39,3.35,3.43,3.49,3.45,3.42,3.41,
+3.43,3.49,3.39,3.36,3.46,3.45,3.66,3.53,3.64,3.52,
+3.54,3.50,3.56,3.64,3.44,3.68,3.48,3.57,3.55,3.73,
+3.70,3.33,3.70,3.67,3.70,3.49,3.58,3.57,3.79,3.67,
+3.53,3.82,3.47,3.77,3.65,3.71,3.57,3.79,3.66,3.64,
+3.74,3.69,3.75,3.58,3.73,3.78,3.76,3.83,3.63,3.88,
+0.68,0.76,0.73,0.76,0.76,0.81,0.85,0.86,0.90,0.93,
+0.94,0.98,0.96,0.97,1.04,1.02,1.05,1.09,1.13,1.09,
+1.11,1.13,1.16,1.22,1.18,1.20,1.25,1.26,1.26,1.29,
+1.35,1.33,1.29,1.38,1.38,1.37,1.40,1.42,1.41,1.45,
+1.51,1.45,1.52,1.55,1.51,1.50,1.63,1.58,1.54,1.54,
+1.58,1.63,1.65,1.65,1.65,1.64,1.64,1.73,1.74,1.72,
+1.74,1.74,1.76,1.75,1.81,1.76,1.84,1.81,1.85,1.84,
+1.76,1.84,1.85,1.96,1.91,1.88,1.92,1.92,1.89,1.99,
+1.93,2.01,1.95,1.95,2.05,1.98,2.00,2.03,2.00,2.02,
+2.16,2.14,2.05,2.08,2.02,2.09,2.10,2.17,2.08,2.10,
+2.21,2.14,2.27,2.23,2.27,2.25,2.10,2.22,2.19,2.22,
+2.31,2.20,2.29,2.37,2.28,2.28,2.28,2.35,2.39,2.44,
+2.37,2.31,2.33,2.47,2.37,2.33,2.51,2.51,2.46,2.39,
+2.47,2.43,2.42,2.50,2.43,2.54,2.53,2.44,2.47,2.54,
+2.60,2.59,2.55,2.49,2.54,2.47,2.66,2.57,2.60,2.62,
+2.64,2.64,2.58,2.52,2.63,2.64,2.76,2.52,2.75,2.63,
+2.68,2.64,2.76,2.88,2.55,2.69,2.77,2.70,2.79,2.78,
+2.64,2.70,2.85,2.77,2.81,2.79,2.72,2.84,2.87,2.73,
+2.84,2.99,2.81,2.79,2.75,3.02,2.93,2.89,2.93,2.91,
+2.83,2.89,2.95,2.94,2.83,2.93,3.00,3.02,3.10,2.98,
+3.01,3.03,3.15,2.98,3.05,2.95,2.97,2.86,3.03,3.02,
+3.13,3.09,3.16,3.06,3.06,3.14,3.10,3.10,2.97,3.11,
+3.18,3.05,3.26,3.37,3.19,3.02,3.07,3.27,3.12,3.17,
+3.13,3.20,3.28,3.19,3.06,3.23,3.20,3.27,3.21,3.30,
+3.28,3.27,3.20,3.40,3.18,3.34,3.34,3.17,3.32,3.31,
+3.42,3.26,3.28,3.30,3.32,3.40,3.25,3.30,3.51,3.40,
+3.29,3.42,3.50,3.41,3.47,3.40,3.40,3.46,3.46,3.39,
+3.48,3.49,3.39,3.46,3.36,3.37,3.50,3.40,3.46,3.42,
+3.48,3.37,3.53,3.58,3.49,3.55,3.47,3.54,3.58,3.38,
+0.64,0.68,0.70,0.73,0.73,0.75,0.80,0.81,0.85,0.85,
+0.90,0.93,0.91,0.94,0.95,0.94,1.02,1.05,1.00,1.06,
+1.10,1.11,1.10,1.10,1.13,1.14,1.17,1.22,1.14,1.20,
+1.17,1.30,1.30,1.29,1.30,1.30,1.31,1.36,1.33,1.36,
+1.35,1.41,1.45,1.41,1.41,1.48,1.44,1.44,1.47,1.48,
+1.46,1.51,1.56,1.60,1.55,1.58,1.61,1.61,1.64,1.62,
+1.58,1.65,1.65,1.64,1.69,1.72,1.71,1.66,1.66,1.73,
+1.68,1.79,1.79,1.78,1.85,1.79,1.81,1.80,1.83,1.83,
+1.88,1.86,1.82,1.84,1.86,1.87,1.92,1.90,1.95,1.95,
+1.88,1.94,1.98,1.95,2.06,2.04,1.91,2.09,2.06,2.02,
+2.02,2.05,2.05,2.07,2.07,2.06,2.14,2.12,2.05,2.20,
+2.14,2.04,2.12,2.21,2.06,2.21,2.11,2.17,2.21,2.21,
+2.12,2.20,2.20,2.27,2.22,2.28,2.27,2.19,2.21,2.27,
+2.30,2.20,2.33,2.35,2.34,2.37,2.28,2.35,2.35,2.36,
+2.37,2.48,2.39,2.38,2.31,2.44,2.40,2.43,2.44,2.43,
+2.41,2.34,2.45,2.47,2.43,2.49,2.47,2.37,2.41,2.49,
+2.57,2.53,2.56,2.44,2.53,2.65,2.67,2.62,2.63,2.54,
+2.57,2.67,2.70,2.59,2.62,2.66,2.65,2.66,2.70,2.60,
+2.66,2.64,2.67,2.64,2.73,2.81,2.78,2.74,2.81,2.76,
+2.73,2.85,2.71,2.78,2.71,2.80,2.69,2.73,2.89,2.64,
+2.73,2.75,2.80,2.84,2.84,2.82,2.83,2.87,2.85,2.76,
+2.88,2.77,2.95,2.83,2.97,2.89,2.92,2.97,2.90,3.01,
+2.91,2.99,2.90,2.87,2.95,2.91,2.95,2.99,2.88,2.93,
+3.02,3.05,3.05,2.94,3.07,3.05,3.12,3.09,3.04,3.05,
+3.03,3.12,3.06,3.03,3.08,3.09,3.11,3.09,3.05,3.13,
+3.09,3.22,3.17,3.13,3.09,3.21,3.23,3.19,3.19,3.10,
+3.32,3.16,3.16,3.16,3.19,3.12,3.12,3.24,3.24,3.36,
+3.06,3.41,3.25,3.25,3.39,3.25,3.13,3.42,3.24,3.36,
+3.30,3.26,3.30,3.26,3.25,3.24,3.39,3.34,3.42,3.49,
+0.58,0.62,0.65,0.70,0.70,0.75,0.72,0.74,0.79,0.84,
+0.83,0.85,0.89,0.93,0.94,0.92,0.93,0.96,0.95,1.00,
+1.01,1.06,1.06,1.07,1.02,1.06,1.14,1.12,1.15,1.14,
+1.17,1.17,1.15,1.19,1.22,1.25,1.23,1.26,1.28,1.27,
+1.30,1.29,1.34,1.34,1.35,1.39,1.38,1.40,1.38,1.42,
+1.40,1.44,1.46,1.45,1.49,1.50,1.50,1.50,1.45,1.49,
+1.55,1.57,1.56,1.53,1.59,1.52,1.61,1.64,1.62,1.62,
+1.63,1.66,1.77,1.67,1.62,1.69,1.75,1.72,1.72,1.72,
+1.72,1.74,1.73,1.77,1.74,1.83,1.82,1.85,1.81,1.79,
+1.87,1.77,1.81,1.88,1.89,1.85,1.84,1.87,1.94,1.86,
+1.95,1.87,1.97,2.01,1.94,1.89,1.97,1.93,1.98,1.97,
+1.99,2.01,2.01,2.07,1.95,2.01,1.98,1.95,2.14,2.07,
+2.04,2.10,2.17,2.13,2.14,2.05,2.10,2.10,2.15,2.12,
+2.16,2.19,2.19,2.21,2.18,2.25,2.16,2.24,2.20,2.16,
+2.22,2.23,2.30,2.26,2.30,2.33,2.22,2.34,2.30,2.27,
+2.27,2.35,2.32,2.29,2.32,2.42,2.37,2.42,2.37,2.35,
+2.42,2.45,2.40,2.38,2.52,2.38,2.39,2.38,2.47,2.43,
+2.50,2.36,2.41,2.43,2.39,2.37,2.41,2.50,2.52,2.55,
+2.46,2.51,2.58,2.58,2.54,2.63,2.52,2.51,2.56,2.60,
+2.54,2.63,2.56,2.55,2.63,2.60,2.60,2.71,2.68,2.51,
+2.55,2.64,2.69,2.63,2.66,2.57,2.72,2.70,2.74,2.75,
+2.71,2.70,2.59,2.70,2.81,2.83,2.65,2.78,2.72,2.64,
+2.79,2.72,2.76,2.76,2.72,2.72,2.72,2.77,2.84,2.84,
+2.89,2.94,2.80,2.77,2.88,2.88,2.74,2.96,2.88,2.81,
+2.97,2.78,2.89,3.02,2.94,2.94,2.96,2.93,2.94,2.95,
+2.81,2.97,2.90,2.88,2.95,2.98,3.01,3.15,2.92,2.94,
+2.94,2.99,3.05,3.12,3.04,3.04,3.03,2.95,2.93,3.08,
+3.06,3.04,3.16,3.11,2.99,3.05,2.98,3.08,3.13,3.01,
+3.03,3.11,3.03,3.02,3.17,3.02,3.19,3.12,3.20,3.13,
+1.12,1.19,1.25,1.26,1.32,1.36,1.33,1.42,1.48,1.45,
+1.47,1.58,1.59,1.60,1.62,1.76,1.71,1.76,1.80,1.80,
+1.79,1.95,1.96,1.84,1.84,1.95,2.00,2.09,2.08,2.03,
+2.11,2.10,2.12,2.17,2.19,2.26,2.29,2.25,2.27,2.34,
+2.34,2.32,2.43,2.38,2.48,2.46,2.50,2.46,2.44,2.56,
+2.68,2.66,2.66,2.62,2.75,2.57,2.77,2.80,2.74,2.71,
+2.86,2.74,2.82,2.85,2.97,2.81,2.81,2.93,2.80,2.85,
+2.89,2.93,2.96,2.99,3.05,2.89,3.08,3.17,3.10,3.13,
+3.18,3.28,3.05,3.19,3.14,3.33,3.33,3.25,3.30,3.35,
+3.31,3.38,3.34,3.31,3.40,3.30,3.62,3.49,3.47,3.50,
+3.46,3.67,3.52,3.45,3.64,3.53,3.46,3.66,3.58,3.57,
+3.54,3.64,3.70,3.67,3.69,3.70,3.76,3.79,3.79,4.06,
+3.74,3.90,3.78,3.69,3.79,3.83,3.90,3.91,3.78,3.94,
+3.82,4.05,3.84,3.98,3.99,3.93,3.91,4.02,4.12,3.92,
+4.11,4.14,4.21,4.07,4.03,4.23,4.15,4.32,4.22,4.17,
+4.28,4.19,4.16,4.17,4.25,4.39,4.18,4.17,4.13,4.35,
+4.43,4.33,4.41,4.42,4.39,4.22,4.48,4.29,4.43,4.57,
+4.33,4.32,4.43,4.54,4.67,4.41,4.51,4.44,4.42,4.59,
+4.67,4.67,4.48,4.73,4.57,4.73,4.60,4.84,4.77,4.62,
+4.66,4.61,4.74,4.87,4.88,4.67,4.92,4.75,4.60,4.91,
+4.97,4.76,4.99,4.90,4.71,5.05,4.95,4.92,4.84,4.90,
+4.70,4.87,4.81,4.90,4.97,4.96,4.99,5.01,4.96,5.03,
+5.02,5.05,5.26,4.94,5.07,5.12,4.99,4.94,5.03,5.34,
+5.03,5.10,5.20,5.31,4.98,5.22,5.31,5.25,5.21,5.11,
+5.19,5.06,5.30,5.06,5.55,5.21,5.31,5.17,5.41,5.50,
+5.47,5.36,5.38,5.54,5.36,5.40,5.40,5.45,5.37,5.42,
+5.51,5.67,5.42,5.55,5.70,5.53,5.41,5.67,5.35,5.45,
+5.41,5.59,5.46,5.52,5.49,5.71,5.69,5.38,5.60,5.60,
+5.51,5.77,5.58,5.58,5.58,5.28,5.64,5.59,5.91,5.75,
+1.06,1.10,1.16,1.20,1.24,1.28,1.30,1.31,1.42,1.46,
+1.43,1.55,1.53,1.60,1.59,1.66,1.63,1.72,1.75,1.71,
+1.85,1.81,1.78,1.94,1.89,1.91,1.94,1.97,1.97,2.00,
+2.01,2.08,2.16,2.12,2.17,2.19,2.22,2.23,2.33,2.32,
+2.29,2.37,2.31,2.34,2.43,2.41,2.46,2.43,2.55,2.49,
+2.52,2.50,2.51,2.52,2.72,2.49,2.61,2.62,2.61,2.71,
+2.73,2.62,2.75,2.72,2.76,2.91,2.83,2.86,2.88,2.79,
+2.86,2.83,2.98,3.01,3.01,2.97,2.98,3.01,2.93,3.01,
+3.10,3.08,3.24,3.19,3.08,3.25,3.17,3.25,3.24,3.15,
+3.27,3.24,3.14,3.41,3.38,3.34,3.37,3.32,3.42,3.45,
+3.45,3.38,3.38,3.43,3.48,3.39,3.57,3.54,3.43,3.46,
+3.53,3.53,3.75,3.65,3.57,3.63,3.62,3.67,3.52,3.83,
+3.77,3.66,3.78,3.77,3.74,3.72,3.80,3.71,3.76,3.78,
+4.02,4.11,3.76,3.81,3.79,3.91,3.85,3.88,4.10,3.97,
+3.83,3.88,3.76,4.06,3.98,4.00,4.10,4.04,3.97,3.99,
+4.06,3.99,4.04,4.07,4.09,4.25,4.12,4.08,4.33,4.17,
+4.20,4.21,4.24,4.11,4.06,4.22,4.37,4.41,4.28,4.37,
+4.45,4.50,4.35,4.35,4.39,4.33,4.50,4.31,4.46,4.47,
+4.50,4.49,4.51,4.36,4.50,4.40,4.57,4.56,4.49,4.69,
+4.38,4.59,4.86,4.55,4.58,4.57,4.68,4.55,4.61,4.59,
+4.75,4.65,4.66,4.71,4.59,4.53,4.62,4.72,4.65,4.61,
+4.85,4.71,4.93,4.51,4.79,4.70,4.90,4.82,4.91,4.97,
+4.76,4.82,4.88,4.93,5.12,5.05,4.96,5.09,4.90,4.95,
+5.08,5.10,5.00,5.07,5.03,4.95,5.12,5.23,4.91,5.07,
+5.09,4.88,5.24,5.11,5.02,5.21,5.04,5.11,5.17,5.03,
+5.33,5.20,5.19,5.24,5.21,5.09,5.17,5.37,5.33,5.63,
+5.25,5.19,5.43,5.37,5.31,5.46,5.39,5.33,5.46,5.34,
+5.23,5.37,5.49,5.46,5.39,5.35,5.44,5.60,5.56,5.43,
+5.37,5.48,5.53,5.44,5.44,5.60,5.49,5.59,5.47,5.40,
+1.03,1.10,1.20,1.19,1.23,1.25,1.31,1.36,1.38,1.48,
+1.45,1.49,1.56,1.49,1.53,1.62,1.68,1.66,1.71,1.70,
+1.71,1.77,1.85,1.80,1.81,1.86,1.90,1.94,1.93,1.94,
+2.03,1.99,2.02,2.10,2.08,2.15,2.14,2.16,2.23,2.29,
+2.34,2.28,2.27,2.27,2.35,2.35,2.37,2.50,2.48,2.43,
+2.34,2.44,2.48,2.53,2.47,2.51,2.68,2.57,2.63,2.62,
+2.69,2.73,2.76,2.71,2.70,2.76,2.68,2.68,2.84,2.82,
+2.79,2.86,2.88,2.89,2.83,2.89,2.97,2.92,2.98,2.90,
+3.00,3.05,2.95,2.95,2.96,3.05,3.06,3.09,2.99,3.19,
+3.24,3.09,3.26,3.30,3.15,3.19,3.23,3.20,3.29,3.43,
+3.33,3.39,3.34,3.33,3.36,3.39,3.59,3.45,3.37,3.46,
+3.37,3.48,3.58,3.54,3.53,3.50,3.55,3.60,3.62,3.52,
+3.55,3.66,3.61,3.57,3.56,3.76,3.72,3.68,3.63,3.69,
+3.73,3.77,3.65,3.82,3.71,3.82,3.80,3.75,3.88,3.88,
+3.88,3.71,3.72,3.90,3.83,3.93,4.10,4.01,3.91,3.95,
+4.08,4.10,4.10,3.91,4.04,4.00,4.23,3.96,3.97,4.06,
+4.14,4.20,4.09,4.14,4.15,4.14,4.22,4.08,4.37,4.18,
+4.31,4.35,4.35,4.11,4.38,4.23,4.21,4.27,4.30,4.41,
+4.30,4.29,4.53,4.45,4.37,4.46,4.53,4.49,4.42,4.45,
+4.47,4.47,4.40,4.51,4.34,4.62,4.58,4.48,4.52,4.51,
+4.76,4.43,4.62,4.54,4.53,4.57,4.67,4.73,4.57,4.72,
+4.68,4.71,4.63,4.71,4.58,4.80,4.67,4.72,4.74,4.76,
+4.94,4.74,4.94,5.04,4.78,4.88,4.86,4.92,4.82,4.64,
+4.93,4.76,4.89,5.02,4.94,4.84,5.06,4.87,4.74,4.99,
+5.12,4.91,4.96,5.04,5.05,5.11,5.05,5.15,5.20,5.20,
+4.99,5.12,5.07,5.21,5.16,5.21,5.46,5.32,5.09,5.05,
+5.26,5.30,5.27,5.00,5.12,5.17,5.37,5.10,5.48,5.19,
+4.95,5.53,5.27,5.43,5.40,5.45,5.17,5.46,5.37,5.36,
+5.26,5.26,5.46,5.26,5.46,5.41,5.62,5.46,5.47,5.46,
+1.05,1.06,1.10,1.16,1.19,1.28,1.31,1.30,1.38,1.30,
+1.43,1.46,1.50,1.53,1.53,1.52,1.60,1.63,1.63,1.67,
+1.69,1.72,1.74,1.79,1.83,1.83,1.90,1.91,1.98,1.92,
+1.89,1.96,2.01,2.04,2.11,2.09,2.07,2.24,2.10,2.10,
+2.28,2.20,2.21,2.26,2.32,2.35,2.29,2.45,2.30,2.44,
+2.41,2.38,2.44,2.46,2.42,2.59,2.58,2.43,2.55,2.65,
+2.55,2.70,2.57,2.59,2.65,2.60,2.58,2.73,2.71,2.74,
+2.73,2.70,2.85,2.92,2.78,2.85,2.77,2.85,2.92,2.85,
+3.02,2.94,2.94,3.09,3.07,2.98,2.99,3.13,3.09,3.11,
+3.07,3.10,3.25,3.16,3.13,3.18,3.33,3.11,3.16,3.22,
+3.33,3.27,3.43,3.27,3.35,3.31,3.26,3.31,3.36,3.29,
+3.47,3.32,3.29,3.43,3.37,3.56,3.56,3.40,3.46,3.50,
+3.55,3.47,3.46,3.49,3.69,3.64,3.60,3.63,3.60,3.73,
+3.71,3.69,3.52,3.51,3.65,3.60,3.52,3.57,3.73,3.63,
+3.67,3.82,3.71,3.78,4.00,3.79,3.81,3.98,3.77,3.83,
+3.81,3.87,3.96,3.95,4.10,4.01,3.88,4.09,3.95,4.08,
+3.96,3.92,4.05,4.14,4.09,4.14,4.28,4.28,4.15,4.07,
+4.08,4.12,4.13,4.14,4.25,4.22,4.28,4.19,4.19,4.25,
+4.40,4.27,4.55,4.22,4.07,4.28,4.30,4.26,4.25,4.40,
+4.28,4.33,4.40,4.42,4.50,4.22,4.30,4.66,4.49,4.41,
+4.27,4.38,4.61,4.62,4.54,4.29,4.51,4.65,4.75,4.57,
+4.45,4.61,4.64,4.66,4.70,4.66,4.55,4.64,4.73,4.69,
+4.66,4.73,4.71,4.77,4.83,4.72,4.71,4.67,4.82,4.54,
+4.90,4.65,4.73,4.63,4.88,4.73,4.73,4.98,4.84,4.82,
+4.95,4.64,4.81,4.95,4.81,4.85,5.07,4.82,4.96,5.03,
+4.89,4.98,5.06,5.04,4.98,4.93,5.10,4.89,5.04,4.93,
+4.80,5.23,5.04,5.17,5.18,5.15,5.25,5.11,5.04,4.97,
+5.21,4.92,5.16,5.02,5.26,5.26,5.26,5.43,5.30,5.32,
+5.25,5.36,5.15,5.31,5.35,5.17,5.36,5.36,5.30,5.35,
+1.02,1.05,1.08,1.13,1.20,1.17,1.23,1.28,1.30,1.33,
+1.36,1.41,1.46,1.51,1.52,1.53,1.60,1.59,1.64,1.67,
+1.70,1.69,1.74,1.73,1.84,1.80,1.82,1.89,1.86,1.87,
+1.89,1.98,1.94,1.98,2.02,2.09,2.06,2.04,2.06,2.17,
+2.18,2.09,2.19,2.18,2.31,2.14,2.37,2.32,2.33,2.42,
+2.36,2.41,2.44,2.45,2.54,2.32,2.44,2.50,2.59,2.49,
+2.49,2.62,2.62,2.52,2.63,2.57,2.63,2.63,2.68,2.72,
+2.80,2.70,2.87,2.64,2.78,2.78,2.87,2.81,2.88,2.96,
+2.81,2.92,2.87,2.85,2.90,2.98,2.97,2.89,3.00,2.90,
+2.98,3.08,2.94,3.06,3.12,3.11,3.06,3.09,3.07,3.13,
+3.11,3.17,3.21,3.31,3.29,3.19,3.27,3.26,3.33,3.26,
+3.37,3.30,3.39,3.29,3.19,3.39,3.44,3.38,3.45,3.45,
+3.56,3.44,3.33,3.46,3.61,3.47,3.58,3.61,3.58,3.55,
+3.39,3.51,3.59,3.51,3.72,3.63,3.61,3.59,3.74,3.63,
+3.64,3.65,3.97,3.66,3.72,3.74,3.72,3.77,3.84,3.83,
+3.67,3.88,3.83,3.88,3.81,3.86,3.84,3.87,4.01,3.78,
+3.96,3.75,3.98,4.12,4.01,3.98,3.94,4.02,3.96,4.15,
+3.92,4.02,4.09,4.21,4.04,4.12,3.99,4.08,3.99,4.28,
+4.30,4.19,4.14,4.22,4.17,4.31,4.23,4.35,4.24,4.10,
+4.29,4.16,4.14,4.20,4.16,4.45,4.39,4.26,4.20,4.53,
+4.40,4.34,4.34,4.50,4.58,4.35,4.25,4.36,4.40,4.36,
+4.48,4.35,4.41,4.41,4.42,4.57,4.57,4.42,4.39,4.57,
+4.40,4.56,4.65,4.70,4.63,4.56,4.46,4.95,4.77,4.58,
+4.64,4.43,4.73,4.55,4.91,4.68,4.61,4.86,4.73,4.96,
+4.83,4.68,4.63,4.68,4.85,4.82,4.93,4.81,4.90,4.79,
+4.80,4.73,4.88,4.99,4.77,5.08,4.87,5.15,4.89,4.89,
+4.98,4.87,5.03,4.89,5.07,4.90,4.83,4.89,4.79,5.03,
+5.12,4.95,5.19,4.98,4.78,5.27,5.16,5.14,5.13,5.24,
+4.98,5.22,4.90,5.32,5.03,5.14,5.21,5.01,5.26,5.12,
+0.96,1.03,1.06,1.10,1.12,1.16,1.21,1.20,1.27,1.31,
+1.36,1.36,1.39,1.41,1.49,1.49,1.54,1.51,1.52,1.59,
+1.63,1.67,1.67,1.70,1.74,1.75,1.78,1.75,1.82,1.77,
+1.86,1.94,1.90,1.93,1.91,1.97,2.06,1.96,2.09,2.05,
+2.02,2.13,2.15,2.12,2.09,2.22,2.21,2.30,2.25,2.30,
+2.32,2.30,2.33,2.30,2.36,2.35,2.45,2.37,2.41,2.42,
+2.44,2.36,2.61,2.43,2.52,2.61,2.49,2.54,2.66,2.64,
+2.67,2.71,2.70,2.59,2.69,2.74,2.72,2.83,2.80,2.75,
+2.91,2.81,2.83,2.83,2.83,2.90,2.98,3.01,2.74,3.04,
+2.80,2.82,2.97,2.97,2.97,3.01,3.04,3.16,3.02,2.95,
+3.06,3.08,3.12,3.01,3.05,3.14,3.16,3.18,3.06,3.30,
+3.15,3.18,3.24,3.15,3.23,3.16,3.34,3.28,3.38,3.23,
+3.49,3.35,3.35,3.36,3.42,3.39,3.41,3.42,3.47,3.45,
+3.52,3.42,3.56,3.54,3.55,3.66,3.41,3.53,3.53,3.61,
+3.67,3.55,3.61,3.66,3.50,3.59,3.76,3.59,3.77,3.67,
+3.78,3.64,3.69,3.74,3.75,3.70,3.86,3.69,3.94,3.95,
+3.87,3.88,3.76,3.89,3.94,3.83,3.90,3.94,3.88,3.89,
+4.06,3.90,4.01,4.02,3.87,4.04,3.98,3.92,4.14,4.14,
+4.12,4.07,3.95,3.87,4.05,3.91,4.06,4.00,4.21,4.11,
+4.02,4.20,4.07,4.02,4.28,4.20,4.19,4.14,4.28,4.20,
+4.09,4.35,4.15,4.24,4.17,4.29,4.25,4.27,4.37,4.18,
+4.39,4.53,4.36,4.37,4.34,4.41,4.38,4.51,4.41,4.45,
+4.51,4.40,4.47,4.46,4.36,4.48,4.52,4.42,4.51,4.40,
+4.33,4.79,4.44,4.53,4.61,4.80,4.52,4.65,4.61,4.66,
+4.46,4.79,4.75,4.73,4.69,4.80,4.50,4.86,4.78,4.52,
+4.82,4.58,4.82,4.80,4.71,4.61,4.38,4.70,4.81,4.70,
+4.85,4.69,4.95,4.73,4.74,4.60,4.76,4.96,4.77,4.78,
+4.95,4.96,4.88,4.81,4.79,4.73,4.84,4.93,4.86,4.97,
+4.84,4.92,4.77,5.11,4.96,4.95,5.13,5.11,5.25,4.94,
+0.97,0.99,1.00,1.06,1.08,1.12,1.12,1.22,1.22,1.27,
+1.34,1.32,1.38,1.45,1.44,1.46,1.43,1.57,1.63,1.55,
+1.51,1.53,1.61,1.63,1.62,1.68,1.75,1.77,1.72,1.81,
+1.81,1.83,1.84,1.88,1.86,1.90,2.00,1.90,1.95,2.04,
+1.99,1.99,2.05,2.03,2.08,2.14,2.15,2.13,2.17,2.19,
+2.23,2.23,2.17,2.27,2.29,2.27,2.37,2.37,2.33,2.45,
+2.36,2.36,2.42,2.45,2.37,2.45,2.47,2.48,2.59,2.51,
+2.54,2.47,2.58,2.61,2.64,2.58,2.62,2.61,2.55,2.63,
+2.74,2.62,2.69,2.78,2.72,2.81,2.78,2.81,2.85,2.83,
+2.78,2.88,2.90,2.88,2.80,2.96,2.97,2.92,2.95,2.96,
+2.90,3.02,3.09,2.89,3.04,2.89,3.06,3.16,3.02,2.99,
+3.07,3.17,2.93,3.11,3.21,3.17,3.23,3.18,3.13,3.15,
+3.22,3.20,3.24,3.23,3.14,3.16,3.28,3.39,3.36,3.28,
+3.19,3.40,3.38,3.46,3.42,3.45,3.44,3.33,3.50,3.42,
+3.42,3.47,3.62,3.41,3.58,3.57,3.58,3.55,3.57,3.52,
+3.55,3.61,3.57,3.61,3.63,3.74,3.77,3.62,3.72,3.71,
+3.63,3.61,3.56,3.81,3.70,3.70,3.64,3.70,3.82,3.80,
+3.71,3.70,3.96,3.77,3.68,3.86,3.85,3.75,3.86,3.89,
+3.98,3.95,3.95,3.93,3.94,3.99,4.00,3.83,4.02,3.97,
+4.02,4.10,4.08,4.08,4.09,3.98,3.97,4.10,3.90,4.15,
+4.06,4.14,4.30,4.05,4.04,4.25,4.18,4.05,4.14,4.26,
+4.12,4.18,4.10,4.17,4.15,4.13,4.20,4.42,4.17,4.26,
+4.13,4.36,4.10,4.44,4.39,4.28,4.21,4.29,4.46,4.40,
+4.35,4.39,4.31,4.27,4.43,4.40,4.45,4.49,4.62,4.30,
+4.39,4.51,4.63,4.57,4.35,4.29,4.37,4.59,4.39,4.57,
+4.62,4.63,4.52,4.65,4.55,4.52,4.52,4.47,4.68,4.58,
+4.58,4.65,4.77,4.76,4.60,4.69,4.63,4.68,4.81,4.63,
+4.83,4.91,4.79,4.72,4.71,4.78,4.67,4.53,4.71,4.77,
+4.63,4.87,5.14,4.76,4.81,4.87,4.75,4.94,4.92,4.77,
+0.91,0.91,0.99,1.04,1.04,1.10,1.14,1.16,1.21,1.23,
+1.25,1.30,1.34,1.32,1.36,1.41,1.46,1.42,1.47,1.48,
+1.50,1.55,1.59,1.58,1.55,1.67,1.69,1.65,1.75,1.77,
+1.73,1.75,1.74,1.83,1.76,1.78,1.90,1.95,1.90,1.96,
+2.01,1.96,2.04,1.97,1.99,2.07,2.13,2.01,2.00,2.11,
+2.15,2.19,2.18,2.19,2.08,2.16,2.32,2.18,2.21,2.36,
+2.25,2.27,2.35,2.32,2.28,2.45,2.46,2.45,2.37,2.43,
+2.48,2.51,2.58,2.49,2.55,2.54,2.50,2.56,2.44,2.58,
+2.60,2.64,2.63,2.63,2.63,2.62,2.66,2.74,2.75,2.66,
+2.81,2.75,2.80,2.72,2.71,2.81,2.85,2.83,2.72,2.78,
+2.92,2.93,2.78,2.92,2.94,3.00,2.85,2.90,2.90,3.03,
+2.98,2.98,3.00,3.14,3.02,3.13,3.04,2.97,2.97,3.11,
+2.99,3.17,3.10,3.02,3.28,3.19,3.10,3.23,3.16,3.09,
+3.17,3.34,3.16,3.25,3.33,3.44,3.33,3.38,3.23,3.24,
+3.28,3.53,3.36,3.27,3.40,3.25,3.48,3.26,3.47,3.46,
+3.49,3.60,3.41,3.45,3.49,3.35,3.63,3.51,3.47,3.58,
+3.56,3.57,3.66,3.64,3.45,3.63,3.59,3.53,3.58,3.76,
+3.58,3.66,3.80,3.72,3.59,3.74,3.75,3.58,3.61,3.86,
+3.74,3.67,3.84,3.83,3.75,3.83,3.83,3.85,3.98,3.78,
+3.74,3.79,3.90,3.89,3.76,3.85,3.92,3.98,4.05,3.86,
+4.02,3.94,3.86,4.05,3.91,3.90,3.95,4.19,4.08,3.91,
+4.12,4.07,4.08,4.19,4.03,4.10,4.18,4.15,4.02,4.10,
+4.01,4.08,4.10,4.13,4.13,4.03,4.19,4.07,4.16,4.27,
+4.20,4.42,4.16,4.20,4.21,4.43,4.28,4.33,4.24,4.23,
+4.25,4.18,4.21,4.28,4.28,4.47,4.47,4.38,4.40,4.43,
+4.45,4.51,4.39,4.41,4.54,4.52,4.50,4.29,4.38,4.45,
+4.56,4.57,4.51,4.54,4.37,4.39,4.58,4.56,4.67,4.65,
+4.58,4.55,4.54,4.61,4.48,4.54,4.50,4.60,4.54,4.74,
+4.71,4.82,4.49,4.49,4.47,4.84,4.67,4.59,4.79,4.98,
+0.89,0.90,0.96,1.01,0.99,1.04,1.07,1.09,1.17,1.19,
+1.21,1.22,1.28,1.25,1.28,1.31,1.35,1.32,1.38,1.44,
+1.51,1.43,1.53,1.54,1.60,1.52,1.67,1.62,1.68,1.65,
+1.67,1.70,1.73,1.69,1.69,1.76,1.79,1.74,1.87,1.76,
+1.85,1.87,1.82,1.92,1.92,1.97,1.96,2.03,2.02,2.01,
+2.05,2.09,2.03,2.09,2.09,2.15,2.07,2.24,2.13,2.23,
+2.29,2.26,2.20,2.23,2.28,2.32,2.34,2.27,2.36,2.40,
+2.40,2.33,2.39,2.50,2.44,2.41,2.39,2.32,2.40,2.52,
+2.50,2.45,2.49,2.45,2.53,2.60,2.52,2.62,2.53,2.63,
+2.63,2.66,2.78,2.76,2.67,2.80,2.69,2.67,2.80,2.67,
+2.70,2.82,2.80,2.89,2.79,2.80,2.81,2.89,2.89,2.89,
+2.86,2.92,2.92,2.87,2.99,2.88,2.80,3.02,3.03,3.01,
+3.08,3.02,3.06,2.96,3.13,2.97,3.20,3.07,3.06,3.06,
+3.22,3.22,3.04,3.16,3.15,3.15,3.13,3.27,3.14,3.41,
+3.27,3.25,3.30,3.23,3.38,3.26,3.16,3.41,3.27,3.17,
+3.39,3.49,3.36,3.23,3.30,3.34,3.42,3.25,3.41,3.41,
+3.35,3.36,3.50,3.45,3.45,3.55,3.44,3.51,3.57,3.34,
+3.45,3.56,3.47,3.54,3.53,3.51,3.58,3.66,3.58,3.43,
+3.64,3.62,3.57,3.77,3.66,3.55,3.67,3.78,3.72,3.76,
+3.64,3.76,3.72,3.63,3.79,3.65,3.77,3.76,3.68,3.72,
+3.71,3.77,3.81,3.81,3.70,3.89,3.85,3.81,3.68,3.86,
+3.73,3.78,3.89,4.09,3.89,3.85,4.03,3.96,3.99,3.95,
+3.83,3.93,4.11,3.94,4.04,4.09,4.07,3.98,4.18,4.07,
+4.14,3.98,4.20,4.05,4.22,3.99,4.14,4.09,4.17,4.13,
+4.29,4.25,4.34,4.25,4.17,4.13,4.22,4.19,4.40,4.25,
+4.18,4.39,4.20,4.17,4.22,4.35,4.16,4.34,4.31,4.21,
+4.28,4.46,4.30,4.30,4.24,4.33,4.31,4.44,4.39,4.27,
+4.49,4.32,4.40,4.35,4.47,4.48,4.46,4.53,4.30,4.54,
+4.43,4.44,4.47,4.44,4.36,4.48,4.33,4.64,4.47,4.55,
+0.83,0.86,0.93,0.94,0.95,0.98,1.06,1.05,1.14,1.16,
+1.15,1.21,1.17,1.28,1.27,1.26,1.26,1.33,1.36,1.37,
+1.38,1.43,1.39,1.51,1.48,1.49,1.49,1.49,1.58,1.61,
+1.63,1.58,1.69,1.68,1.59,1.71,1.70,1.78,1.74,1.78,
+1.80,1.78,1.83,1.79,1.87,1.83,1.82,1.91,1.94,1.94,
+2.02,1.96,1.96,1.99,2.01,1.98,2.07,2.08,2.13,2.10,
+2.15,2.12,2.17,2.10,2.12,2.14,2.22,2.27,2.24,2.29,
+2.21,2.28,2.29,2.34,2.29,2.34,2.37,2.28,2.37,2.41,
+2.45,2.37,2.44,2.42,2.43,2.41,2.43,2.48,2.48,2.43,
+2.48,2.44,2.49,2.51,2.58,2.56,2.58,2.63,2.58,2.67,
+2.55,2.66,2.69,2.67,2.75,2.75,2.70,2.73,2.80,2.64,
+2.77,2.88,2.75,2.75,2.74,2.80,2.85,2.94,2.99,2.83,
+2.94,2.82,2.92,2.74,2.88,3.01,2.82,3.02,3.02,2.94,
+3.00,3.02,3.00,3.02,3.00,3.01,3.05,3.07,3.14,3.12,
+3.13,3.11,3.04,3.12,3.12,3.09,3.05,3.20,3.12,3.22,
+3.30,3.24,3.24,3.30,3.12,3.30,3.18,3.34,3.22,3.28,
+3.29,3.33,3.29,3.51,3.30,3.29,3.29,3.23,3.40,3.23,
+3.49,3.37,3.33,3.50,3.37,3.44,3.35,3.32,3.37,3.42,
+3.44,3.55,3.44,3.38,3.51,3.47,3.42,3.58,3.58,3.64,
+3.45,3.49,3.50,3.64,3.57,3.60,3.63,3.56,3.59,3.57,
+3.70,3.66,3.56,3.63,3.52,3.81,3.84,3.70,3.72,3.68,
+3.87,3.72,3.73,3.72,3.81,3.90,3.86,3.82,3.86,3.80,
+3.77,3.86,3.74,3.84,3.81,3.85,3.85,4.09,3.95,3.92,
+3.96,4.01,4.01,3.90,4.02,3.86,3.96,3.94,3.99,4.01,
+4.04,3.80,3.99,4.25,3.92,4.20,4.27,4.02,4.06,4.07,
+4.11,4.11,4.17,4.16,4.01,4.12,4.07,4.22,4.01,4.25,
+4.00,4.23,4.34,4.14,4.14,4.22,4.08,4.08,4.12,4.22,
+4.26,4.17,4.22,4.33,4.27,4.38,4.16,4.12,4.16,4.34,
+4.24,4.29,4.37,4.29,4.37,4.18,4.26,4.39,4.22,4.38,
+0.80,0.84,0.89,0.89,0.91,0.98,0.98,1.06,1.03,1.09,
+1.10,1.15,1.12,1.16,1.17,1.26,1.20,1.29,1.30,1.29,
+1.29,1.31,1.38,1.40,1.44,1.43,1.42,1.42,1.47,1.49,
+1.51,1.50,1.60,1.60,1.54,1.60,1.69,1.63,1.65,1.63,
+1.70,1.75,1.76,1.79,1.79,1.86,1.86,1.89,1.84,1.93,
+1.85,1.81,1.88,1.86,1.86,1.96,2.00,1.96,2.03,2.00,
+2.05,2.06,2.00,2.02,2.08,2.16,1.96,2.14,2.07,2.17,
+2.20,2.12,2.20,2.15,2.23,2.19,2.26,2.27,2.22,2.29,
+2.23,2.29,2.35,2.32,2.37,2.35,2.31,2.43,2.40,2.44,
+2.44,2.36,2.46,2.37,2.51,2.49,2.48,2.50,2.56,2.54,
+2.62,2.52,2.55,2.64,2.54,2.48,2.49,2.62,2.67,2.58,
+2.66,2.71,2.62,2.71,2.60,2.67,2.70,2.75,2.70,2.75,
+2.72,2.64,2.79,2.83,2.79,2.87,2.76,2.85,2.68,2.86,
+2.81,2.80,2.87,2.79,2.85,2.88,2.90,2.96,3.06,2.88,
+2.98,3.04,2.97,3.02,3.03,2.97,3.08,3.09,3.07,3.05,
+3.08,3.04,2.96,3.07,3.20,3.11,3.03,3.12,3.14,3.06,
+2.97,3.06,3.19,3.21,3.20,3.26,3.10,3.27,3.22,3.20,
+3.25,3.20,3.38,3.24,3.26,3.26,3.40,3.41,3.30,3.28,
+3.33,3.39,3.18,3.40,3.35,3.37,3.49,3.42,3.40,3.35,
+3.43,3.46,3.40,3.42,3.41,3.49,3.54,3.49,3.38,3.44,
+3.49,3.48,3.46,3.67,3.56,3.52,3.44,3.46,3.36,3.44,
+3.56,3.39,3.72,3.53,3.59,3.66,3.69,3.61,3.66,3.55,
+3.53,3.64,3.53,3.57,3.66,3.66,3.75,3.66,3.71,3.69,
+3.72,3.73,3.64,3.67,3.71,3.84,3.74,3.68,3.72,3.72,
+3.99,3.81,3.77,3.77,3.87,3.84,3.79,3.81,3.77,3.82,
+3.97,3.85,3.89,3.95,3.97,3.87,3.91,4.05,3.95,3.88,
+3.84,4.06,3.99,4.00,4.06,3.95,3.97,3.99,3.94,4.18,
+4.04,4.09,3.89,4.06,4.05,4.17,4.14,4.10,4.15,3.98,
+4.22,4.06,4.09,3.99,4.28,4.05,4.07,4.07,4.25,4.29,
+0.77,0.80,0.81,0.87,0.87,0.94,0.96,0.97,1.00,1.04,
+1.05,1.05,1.09,1.13,1.13,1.18,1.20,1.17,1.27,1.22,
+1.28,1.30,1.25,1.35,1.28,1.36,1.40,1.47,1.40,1.41,
+1.46,1.49,1.53,1.51,1.51,1.57,1.57,1.62,1.62,1.62,
+1.63,1.65,1.61,1.74,1.67,1.73,1.75,1.67,1.74,1.84,
+1.75,1.83,1.89,1.79,1.87,1.92,1.86,1.95,1.87,1.91,
+1.97,1.91,1.94,2.00,2.05,2.03,1.97,2.00,2.02,2.00,
+2.08,2.06,2.03,2.06,2.14,2.01,2.11,2.14,2.11,2.16,
+2.13,2.17,2.27,2.29,2.22,2.26,2.18,2.24,2.35,2.21,
+2.27,2.34,2.35,2.38,2.33,2.41,2.43,2.39,2.45,2.39,
+2.37,2.35,2.37,2.46,2.40,2.45,2.44,2.45,2.48,2.51,
+2.50,2.54,2.53,2.49,2.59,2.54,2.62,2.54,2.55,2.54,
+2.61,2.62,2.54,2.68,2.62,2.64,2.71,2.74,2.70,2.67,
+2.68,2.69,2.84,2.80,2.70,2.71,2.66,2.77,2.70,2.74,
+2.75,2.83,2.84,2.85,2.85,2.95,2.81,2.94,2.90,2.99,
+2.84,2.87,2.93,3.03,2.83,2.99,2.95,2.89,2.92,2.95,
+3.04,2.93,2.94,2.86,3.02,3.20,3.01,3.06,3.07,2.97,
+3.05,3.17,3.10,3.12,3.14,3.09,3.07,3.13,3.18,3.12,
+3.13,3.22,3.17,3.11,3.13,3.26,3.20,3.25,3.26,3.32,
+3.24,3.21,3.33,3.22,3.29,3.29,3.22,3.32,3.16,3.34,
+3.30,3.30,3.22,3.39,3.34,3.31,3.41,3.28,3.34,3.33,
+3.49,3.41,3.30,3.36,3.45,3.49,3.33,3.34,3.43,3.34,
+3.53,3.42,3.36,3.53,3.36,3.55,3.52,3.54,3.34,3.62,
+3.56,3.42,3.48,3.49,3.60,3.55,3.85,3.63,3.51,3.59,
+3.58,3.61,3.61,3.62,3.62,3.54,3.60,3.59,3.75,3.77,
+3.66,3.69,3.87,3.58,3.58,3.69,3.71,3.89,3.72,3.73,
+3.67,3.74,3.81,3.83,3.72,3.64,3.86,3.72,3.61,3.84,
+3.77,3.90,3.77,3.82,3.95,3.90,3.88,4.01,3.88,4.03,
+4.00,3.93,4.03,3.88,3.75,3.88,4.16,4.00,3.94,3.93,
+0.72,0.75,0.80,0.84,0.80,0.90,0.89,0.89,0.95,1.00,
+0.99,1.04,1.05,1.03,1.08,1.13,1.11,1.15,1.16,1.21,
+1.22,1.19,1.26,1.24,1.32,1.29,1.31,1.32,1.40,1.38,
+1.39,1.42,1.42,1.44,1.43,1.52,1.51,1.49,1.53,1.49,
+1.55,1.62,1.57,1.60,1.58,1.60,1.55,1.71,1.69,1.72,
+1.74,1.74,1.68,1.73,1.81,1.79,1.79,1.83,1.79,1.75,
+1.83,1.88,1.87,1.79,1.88,1.84,1.85,1.97,2.00,1.98,
+1.93,2.12,1.97,1.97,2.03,1.98,2.03,2.08,2.01,2.10,
+2.08,2.08,2.10,2.07,2.10,2.13,2.17,2.12,2.10,2.21,
+2.17,2.16,2.28,2.24,2.26,2.28,2.15,2.26,2.28,2.25,
+2.29,2.29,2.30,2.37,2.30,2.28,2.43,2.35,2.40,2.37,
+2.36,2.42,2.44,2.44,2.42,2.37,2.40,2.48,2.55,2.40,
+2.45,2.50,2.55,2.56,2.47,2.61,2.52,2.57,2.48,2.57,
+2.67,2.51,2.61,2.54,2.62,2.51,2.62,2.62,2.58,2.55,
+2.68,2.69,2.73,2.62,2.78,2.76,2.68,2.68,2.73,2.77,
+2.74,2.84,2.74,2.75,2.83,2.85,2.83,2.76,2.85,2.77,
+2.92,2.70,2.85,2.96,2.89,2.95,2.87,2.98,2.87,3.05,
+2.92,3.01,2.96,2.91,2.88,3.07,3.05,2.90,2.94,3.15,
+3.01,2.98,2.93,3.09,3.11,3.02,3.04,3.12,3.11,3.04,
+2.93,3.07,3.19,3.07,3.05,3.08,3.07,3.06,3.09,3.04,
+3.02,3.09,3.20,3.04,3.16,3.18,3.18,3.22,3.06,3.11,
+3.18,3.34,3.29,3.05,3.23,3.26,3.29,3.25,3.35,3.35,
+3.36,3.30,3.42,3.32,3.32,3.40,3.36,3.52,3.38,3.42,
+3.41,3.34,3.36,3.39,3.43,3.42,3.36,3.35,3.26,3.55,
+3.37,3.31,3.45,3.34,3.56,3.41,3.47,3.51,3.57,3.53,
+3.65,3.51,3.45,3.55,3.46,3.50,3.58,3.54,3.63,3.65,
+3.60,3.53,3.61,3.59,3.48,3.66,3.55,3.52,3.55,3.69,
+3.71,3.62,3.71,3.63,3.53,3.75,3.65,3.74,3.74,3.64,
+3.70,3.82,3.75,3.65,3.77,3.57,3.70,3.76,3.78,3.75,
+0.70,0.70,0.73,0.78,0.80,0.83,0.80,0.89,0.89,0.93,
+0.92,0.95,0.97,1.02,1.08,1.04,1.05,1.06,1.12,1.15,
+1.12,1.19,1.16,1.22,1.25,1.24,1.26,1.27,1.31,1.31,
+1.34,1.33,1.38,1.37,1.41,1.45,1.43,1.44,1.42,1.46,
+1.52,1.53,1.50,1.44,1.52,1.48,1.54,1.55,1.54,1.68,
+1.63,1.59,1.60,1.67,1.65,1.69,1.66,1.81,1.77,1.72,
+1.67,1.75,1.74,1.73,1.73,1.82,1.84,1.85,1.86,1.84,
+1.90,1.97,1.84,1.86,1.93,1.90,1.93,1.94,1.99,1.96,
+1.95,1.97,1.95,1.94,1.99,2.00,2.05,2.05,2.01,2.04,
+2.12,2.08,2.15,2.10,2.24,2.15,2.12,2.09,2.12,2.16,
+2.15,2.20,2.15,2.23,2.28,2.27,2.22,2.28,2.21,2.19,
+2.24,2.30,2.20,2.25,2.28,2.31,2.36,2.33,2.37,2.36,
+2.31,2.22,2.32,2.41,2.48,2.46,2.42,2.49,2.53,2.54,
+2.36,2.46,2.55,2.43,2.43,2.49,2.48,2.55,2.55,2.61,
+2.60,2.62,2.56,2.68,2.54,2.50,2.57,2.64,2.56,2.65,
+2.56,2.56,2.58,2.63,2.56,2.77,2.73,2.62,2.69,2.64,
+2.63,2.83,2.76,2.82,2.79,2.77,2.83,2.83,2.79,2.78,
+2.76,2.86,2.77,2.84,2.84,2.79,2.84,2.82,2.80,2.86,
+2.80,2.93,2.80,2.89,2.90,2.99,2.93,2.91,2.92,2.91,
+3.01,2.96,3.02,2.90,2.82,2.92,2.99,2.96,2.92,3.10,
+3.03,2.98,3.11,2.92,3.06,3.07,2.96,3.07,3.03,3.05,
+3.06,3.06,3.12,3.12,3.13,3.17,3.00,3.02,3.09,3.04,
+3.14,3.19,3.22,3.14,3.19,3.26,3.25,3.24,3.18,3.08,
+3.23,3.39,3.17,3.30,3.30,3.15,3.25,3.33,3.28,3.32,
+3.23,3.28,3.33,3.32,3.31,3.21,3.37,3.31,3.38,3.35,
+3.29,3.34,3.34,3.33,3.45,3.32,3.20,3.35,3.40,3.41,
+3.48,3.33,3.49,3.38,3.39,3.51,3.32,3.36,3.40,3.36,
+3.34,3.49,3.49,3.40,3.54,3.72,3.45,3.52,3.48,3.45,
+3.56,3.48,3.50,3.69,3.61,3.59,3.50,3.57,3.65,3.57,
+0.62,0.65,0.72,0.74,0.76,0.77,0.77,0.82,0.88,0.87,
+0.88,0.92,0.93,0.95,1.00,1.05,1.01,1.05,1.11,1.05,
+1.06,1.13,1.15,1.18,1.16,1.14,1.18,1.19,1.23,1.21,
+1.22,1.31,1.29,1.31,1.29,1.32,1.35,1.41,1.34,1.32,
+1.43,1.44,1.42,1.43,1.43,1.51,1.46,1.54,1.54,1.52,
+1.52,1.52,1.51,1.60,1.51,1.60,1.59,1.60,1.63,1.60,
+1.71,1.69,1.67,1.64,1.69,1.72,1.81,1.68,1.72,1.74,
+1.75,1.78,1.81,1.81,1.87,1.77,1.75,1.81,1.76,1.77,
+1.87,1.86,1.82,1.93,1.89,1.91,1.92,1.94,1.93,1.98,
+1.93,1.93,1.97,1.95,2.02,2.02,1.99,2.00,2.04,2.03,
+2.02,2.10,2.13,2.19,2.02,1.96,2.06,2.13,2.12,2.20,
+2.18,2.10,2.26,2.23,2.24,2.14,2.18,2.23,2.26,2.25,
+2.26,2.30,2.33,2.22,2.25,2.23,2.30,2.37,2.35,2.30,
+2.26,2.34,2.29,2.31,2.41,2.36,2.34,2.31,2.38,2.43,
+2.35,2.41,2.44,2.39,2.44,2.53,2.39,2.44,2.51,2.41,
+2.49,2.46,2.50,2.50,2.51,2.53,2.46,2.54,2.52,2.48,
+2.68,2.56,2.59,2.61,2.48,2.56,2.61,2.57,2.74,2.62,
+2.61,2.59,2.64,2.58,2.68,2.65,2.71,2.79,2.73,2.66,
+2.73,2.75,2.70,2.66,2.71,2.77,2.73,2.83,2.86,2.74,
+2.82,2.72,2.84,2.82,2.79,2.92,2.83,2.81,2.78,2.85,
+2.81,2.82,2.80,2.87,2.80,2.86,2.82,2.88,2.85,2.91,
+2.90,2.99,3.02,2.90,2.87,2.91,2.92,3.04,2.91,3.05,
+2.92,3.02,3.17,3.04,3.02,2.91,3.07,2.99,2.94,3.05,
+2.92,3.06,3.06,2.90,3.07,3.04,3.22,3.11,3.06,3.13,
+3.11,3.09,3.13,2.99,3.15,2.98,3.19,3.20,3.15,3.14,
+3.27,3.07,3.21,3.21,3.29,3.20,3.27,3.17,3.17,3.23,
+3.21,3.31,3.22,3.26,3.20,3.16,3.23,3.35,3.31,3.32,
+3.31,3.33,3.28,3.25,3.23,3.31,3.25,3.39,3.28,3.35,
+3.26,3.27,3.41,3.36,3.42,3.39,3.38,3.30,3.59,3.33,
+1.06,1.12,1.18,1.26,1.25,1.33,1.33,1.38,1.37,1.49,
+1.49,1.51,1.50,1.65,1.65,1.72,1.69,1.73,1.76,1.85,
+1.80,1.85,1.84,1.83,2.02,1.93,1.90,2.03,2.04,2.04,
+2.04,2.09,2.12,2.25,2.09,2.20,2.30,2.27,2.35,2.34,
+2.37,2.28,2.41,2.37,2.42,2.42,2.45,2.55,2.44,2.48,
+2.51,2.51,2.57,2.49,2.73,2.63,2.62,2.67,2.65,2.75,
+2.56,2.83,2.80,2.76,2.83,2.77,2.90,2.86,2.83,2.92,
+2.92,2.85,3.08,2.98,2.85,3.05,2.97,3.06,2.99,2.92,
+3.09,3.10,3.19,3.30,3.16,3.36,3.27,3.21,3.21,3.14,
+3.24,3.37,3.31,3.44,3.45,3.58,3.31,3.37,3.32,3.46,
+3.44,3.41,3.59,3.40,3.52,3.55,3.62,3.55,3.55,3.51,
+3.48,3.74,3.67,3.72,3.66,3.59,3.59,3.66,3.73,3.50,
+3.77,3.68,3.64,3.65,3.72,3.76,3.87,3.83,3.85,3.73,
+3.91,3.81,3.88,3.87,4.06,3.99,3.90,3.93,3.89,3.92,
+3.92,4.04,3.99,4.01,4.07,4.13,4.07,4.11,4.15,4.23,
+4.25,4.11,4.13,4.00,4.14,4.17,4.13,4.15,4.02,4.13,
+4.17,4.19,4.41,4.12,4.27,4.42,4.44,4.45,4.27,4.28,
+4.49,4.40,4.29,4.56,4.26,4.51,4.33,4.46,4.37,4.37,
+4.62,4.53,4.65,4.49,4.55,4.42,4.55,4.65,4.57,4.55,
+4.58,4.55,4.56,4.78,4.65,4.74,4.73,4.66,4.50,4.65,
+4.65,4.83,4.69,4.77,4.68,4.83,4.71,4.80,4.84,4.57,
+4.67,4.76,4.86,4.82,4.69,4.95,4.70,4.96,5.01,4.76,
+4.95,5.02,4.79,4.86,4.82,4.91,5.20,4.95,5.00,5.06,
+5.19,4.92,5.06,4.89,5.16,5.00,4.98,5.06,5.49,5.03,
+5.26,5.14,5.26,5.31,5.25,5.12,5.49,5.24,5.39,5.32,
+5.18,5.33,5.15,5.37,5.22,5.37,5.14,5.18,5.29,5.32,
+5.29,5.48,5.33,5.37,5.18,5.29,5.49,5.32,5.20,5.59,
+5.38,5.50,5.58,5.43,5.47,5.51,5.57,5.39,5.49,5.67,
+5.56,5.24,5.45,5.49,5.48,5.49,5.69,5.44,5.49,5.59,
+1.06,1.08,1.13,1.17,1.21,1.29,1.33,1.38,1.42,1.46,
+1.45,1.45,1.51,1.46,1.59,1.58,1.66,1.69,1.71,1.84,
+1.78,1.87,1.75,1.87,1.83,1.95,1.84,1.92,1.95,2.07,
+1.99,2.02,2.13,2.08,2.07,2.10,2.22,2.22,2.30,2.26,
+2.28,2.28,2.31,2.33,2.37,2.37,2.33,2.33,2.36,2.39,
+2.46,2.49,2.48,2.50,2.56,2.55,2.65,2.54,2.65,2.71,
+2.58,2.70,2.68,2.65,2.69,2.75,2.74,2.80,2.85,2.88,
+2.73,2.83,2.93,2.80,2.98,2.93,2.98,2.87,3.01,3.10,
+3.09,2.94,2.98,2.90,3.02,2.99,3.08,3.02,3.10,3.07,
+3.26,3.18,3.16,3.20,3.19,3.25,3.30,3.29,3.26,3.32,
+3.30,3.34,3.26,3.53,3.42,3.35,3.49,3.39,3.42,3.38,
+3.55,3.40,3.49,3.41,3.50,3.51,3.51,3.62,3.52,3.53,
+3.44,3.56,3.46,3.46,3.57,3.50,3.72,3.52,3.73,3.63,
+3.62,3.59,3.73,3.90,3.74,3.75,3.72,3.70,3.99,3.81,
+3.82,4.01,3.93,3.92,3.88,3.88,4.17,3.95,4.01,4.03,
+4.01,4.16,4.09,4.05,4.08,4.01,4.02,4.06,4.03,4.17,
+4.12,4.04,4.26,4.02,4.20,4.24,4.12,4.22,4.31,4.21,
+4.39,4.22,4.32,4.08,4.33,4.25,4.42,4.14,4.44,4.17,
+4.12,4.38,4.31,4.49,4.19,4.38,4.33,4.44,4.52,4.45,
+4.58,4.54,4.54,4.36,4.60,4.56,4.59,4.52,4.40,4.85,
+4.55,4.56,4.63,4.62,4.46,4.87,4.81,4.61,4.87,4.67,
+4.66,4.58,4.45,4.78,4.77,4.80,4.85,4.73,5.08,4.98,
+4.65,4.64,4.86,4.79,4.76,5.00,4.71,4.52,4.88,4.78,
+4.94,4.89,4.92,4.97,4.89,5.06,4.90,5.07,5.03,4.80,
+5.16,4.96,4.87,4.96,4.94,5.09,5.02,5.07,5.09,4.86,
+5.05,4.87,5.03,5.09,4.92,5.07,5.26,5.10,5.11,5.02,
+4.98,4.94,5.39,5.36,5.40,5.14,5.07,5.52,5.05,5.42,
+5.32,5.06,5.27,5.35,5.34,5.38,5.32,5.50,5.24,5.31,
+5.34,5.59,5.08,5.45,5.56,5.54,5.44,5.33,5.22,5.66,
+1.01,1.08,1.19,1.13,1.21,1.29,1.29,1.30,1.31,1.38,
+1.45,1.44,1.50,1.52,1.54,1.64,1.60,1.62,1.74,1.70,
+1.72,1.72,1.85,1.75,1.78,1.91,1.90,1.85,1.83,1.94,
+2.00,1.90,2.00,2.07,2.06,2.11,2.13,2.23,2.21,2.10,
+2.21,2.30,2.32,2.31,2.39,2.31,2.38,2.27,2.45,2.29,
+2.40,2.52,2.46,2.45,2.56,2.62,2.48,2.55,2.53,2.58,
+2.54,2.68,2.59,2.64,2.72,2.59,2.61,2.71,2.78,2.76,
+2.69,2.78,2.74,2.83,2.93,2.87,2.83,2.97,3.01,2.99,
+2.96,2.95,2.86,3.06,2.95,3.04,3.05,3.12,3.02,3.03,
+3.03,3.20,3.13,3.11,3.14,3.23,3.11,3.03,3.22,3.16,
+3.23,3.27,3.37,3.30,3.28,3.33,3.31,3.31,3.24,3.28,
+3.38,3.54,3.25,3.40,3.38,3.40,3.56,3.54,3.56,3.67,
+3.66,3.41,3.51,3.72,3.60,3.54,3.52,3.56,3.54,3.69,
+3.58,3.67,3.72,3.64,3.74,3.73,3.84,3.75,3.76,3.60,
+3.70,3.72,4.01,3.90,3.75,3.95,3.91,3.77,3.77,3.94,
+3.88,3.88,3.92,3.82,3.91,4.00,3.89,3.97,4.11,3.94,
+3.92,4.17,3.95,3.79,4.06,3.94,3.93,4.18,4.06,3.96,
+4.18,4.10,4.06,4.15,4.10,4.24,4.19,4.44,4.32,4.26,
+4.21,4.30,4.20,4.29,4.25,4.32,4.31,4.23,4.41,4.27,
+4.30,4.60,4.50,4.48,4.39,4.18,4.55,4.49,4.57,4.50,
+4.56,4.46,4.51,4.51,4.57,4.52,4.55,4.56,4.35,4.42,
+4.60,4.58,4.59,4.61,4.52,4.68,4.68,4.74,4.72,4.49,
+4.74,4.67,4.51,4.71,4.73,4.69,4.79,4.69,4.72,4.77,
+5.07,4.78,4.96,4.69,5.05,5.00,4.85,4.96,4.89,4.92,
+5.00,4.99,4.80,4.89,4.92,4.80,4.95,4.94,4.84,4.81,
+4.93,5.00,4.97,5.06,5.05,4.89,4.99,4.95,5.10,4.94,
+5.04,5.23,5.12,4.95,5.08,5.22,5.04,5.23,5.15,5.03,
+4.94,5.44,5.11,5.27,4.95,5.26,5.07,5.32,5.12,5.16,
+5.37,5.30,5.43,5.36,5.20,5.20,5.20,5.32,5.43,5.29,
+1.00,1.06,1.14,1.12,1.18,1.21,1.23,1.30,1.32,1.41,
+1.46,1.43,1.46,1.48,1.54,1.58,1.57,1.57,1.68,1.61,
+1.71,1.74,1.79,1.77,1.74,1.74,1.85,1.90,1.90,1.90,
+1.89,1.93,2.00,2.02,2.03,2.11,2.06,2.12,2.13,2.11,
+2.22,2.20,2.22,2.27,2.35,2.33,2.28,2.27,2.33,2.26,
+2.38,2.36,2.48,2.39,2.43,2.40,2.49,2.56,2.44,2.55,
+2.60,2.49,2.57,2.65,2.53,2.65,2.62,2.67,2.66,2.72,
+2.68,2.76,2.70,2.74,2.81,2.89,2.74,2.89,2.82,2.83,
+2.92,2.83,2.81,2.93,3.03,2.99,2.97,2.91,3.03,3.01,
+3.10,3.12,3.13,3.06,3.09,3.17,3.10,3.07,3.23,3.15,
+3.05,3.18,3.27,3.25,3.23,3.33,3.22,3.29,3.29,3.30,
+3.38,3.29,3.50,3.26,3.50,3.49,3.46,3.42,3.38,3.44,
+3.45,3.51,3.46,3.52,3.46,3.70,3.54,3.50,3.67,3.68,
+3.57,3.49,3.52,3.64,3.45,3.52,3.74,3.50,3.71,3.72,
+3.73,3.69,3.82,3.86,3.88,3.86,3.61,3.83,3.80,3.87,
+3.87,3.76,3.76,3.87,3.89,4.00,3.90,3.96,3.86,4.00,
+3.71,3.98,4.04,3.89,3.98,3.85,4.11,4.04,4.02,3.95,
+3.99,4.08,4.06,4.00,4.08,3.97,4.14,4.19,4.12,4.14,
+4.18,4.08,4.17,4.16,4.37,4.21,4.24,4.05,4.41,4.40,
+4.10,4.15,4.29,4.39,4.26,4.38,4.31,4.30,4.33,4.38,
+4.37,4.33,4.49,4.22,4.49,4.55,4.34,4.42,4.37,4.37,
+4.31,4.40,4.53,4.40,4.68,4.73,4.40,4.53,4.52,4.50,
+4.47,4.54,4.53,4.69,4.57,4.52,4.61,4.63,4.74,4.74,
+4.45,4.60,4.69,4.64,4.70,4.74,4.82,4.67,4.70,4.87,
+4.93,4.91,5.01,4.78,4.67,4.74,4.67,4.78,4.83,4.71,
+4.77,4.83,4.80,4.99,5.19,4.75,5.04,5.09,4.98,5.00,
+4.76,4.80,4.96,5.01,5.14,5.09,5.02,4.99,5.03,4.95,
+5.07,5.12,5.09,5.24,5.19,5.59,5.09,5.09,5.12,5.06,
+4.93,4.96,5.34,5.07,5.21,5.36,5.09,5.25,5.10,5.02,
+1.00,1.05,1.11,1.08,1.19,1.15,1.22,1.26,1.40,1.33,
+1.34,1.41,1.42,1.56,1.50,1.44,1.57,1.57,1.50,1.60,
+1.64,1.68,1.66,1.73,1.78,1.76,1.80,1.94,1.90,1.85,
+1.91,1.86,1.85,1.96,1.96,2.08,2.05,2.03,2.15,2.13,
+2.16,2.10,2.13,2.11,2.10,2.21,2.19,2.21,2.30,2.29,
+2.26,2.27,2.30,2.36,2.42,2.42,2.48,2.41,2.51,2.37,
+2.55,2.51,2.46,2.55,2.69,2.53,2.50,2.67,2.63,2.64,
+2.72,2.61,2.65,2.66,2.64,2.60,2.76,2.66,2.74,2.91,
+2.73,2.91,2.84,2.85,2.81,2.88,2.76,2.88,2.98,3.02,
+2.93,3.00,2.92,3.06,2.92,2.91,3.14,3.05,3.06,3.10,
+3.08,3.11,3.26,3.20,3.16,3.14,3.14,3.22,3.28,3.29,
+3.21,3.20,3.30,3.15,3.38,3.33,3.25,3.34,3.34,3.27,
+3.30,3.41,3.43,3.38,3.46,3.29,3.46,3.50,3.45,3.47,
+3.53,3.46,3.61,3.48,3.51,3.48,3.65,3.68,3.73,3.68,
+3.63,3.70,3.63,3.52,3.70,3.56,3.63,3.56,3.66,3.87,
+3.86,3.82,3.79,3.69,3.73,3.81,3.92,3.82,3.91,3.89,
+3.83,3.89,3.89,4.08,3.92,4.00,3.92,3.90,4.00,3.88,
+4.10,3.86,3.93,4.03,3.92,4.05,4.06,4.16,3.93,4.07,
+4.06,4.02,4.12,4.23,4.17,4.20,3.90,4.13,4.12,4.28,
+4.21,4.24,4.29,3.98,4.33,3.96,4.22,4.29,4.17,4.42,
+4.31,4.28,4.35,4.22,4.26,4.37,4.42,4.30,4.34,4.30,
+4.41,4.25,4.51,4.45,4.32,4.40,4.25,4.49,4.50,4.61,
+4.55,4.56,4.44,4.64,4.22,4.48,4.57,4.66,4.53,4.53,
+4.60,4.61,4.56,4.65,4.66,4.67,4.86,4.73,4.71,4.36,
+4.71,4.64,4.50,4.77,4.74,4.71,4.73,4.81,4.73,4.90,
+4.83,4.78,4.79,4.76,5.09,4.86,4.83,4.96,4.68,4.65,
+4.93,4.98,4.94,4.90,4.83,4.79,4.93,4.87,4.97,5.13,
+5.00,4.94,4.90,4.93,4.88,5.11,5.07,4.96,4.92,5.17,
+5.05,4.99,5.16,5.16,4.97,5.03,4.96,5.09,5.21,5.22,
+0.97,0.99,1.05,1.08,1.09,1.21,1.19,1.23,1.31,1.30,
+1.33,1.37,1.40,1.47,1.52,1.52,1.42,1.53,1.61,1.58,
+1.61,1.68,1.65,1.68,1.67,1.72,1.73,1.79,1.65,1.73,
+1.89,1.90,1.86,1.90,1.94,1.95,1.98,1.93,2.02,2.04,
+2.03,2.13,2.11,2.11,2.08,2.21,2.20,2.33,2.19,2.19,
+2.23,2.33,2.33,2.31,2.36,2.29,2.32,2.44,2.32,2.47,
+2.38,2.46,2.47,2.45,2.61,2.48,2.54,2.58,2.48,2.50,
+2.74,2.74,2.61,2.68,2.71,2.73,2.62,2.63,2.70,2.73,
+2.84,2.94,2.77,2.81,2.81,2.88,2.84,2.87,2.87,2.82,
+2.84,3.06,2.90,2.92,3.01,2.89,2.93,2.84,2.94,3.03,
+2.99,2.89,3.05,2.97,3.06,3.16,3.03,3.04,3.15,3.11,
+3.18,3.12,3.07,3.17,3.20,3.27,3.23,3.24,3.38,3.33,
+3.26,3.35,3.16,3.42,3.37,3.61,3.41,3.49,3.28,3.42,
+3.47,3.51,3.36,3.46,3.54,3.40,3.54,3.53,3.45,3.46,
+3.48,3.46,3.64,3.55,3.67,3.83,3.61,3.62,3.71,3.68,
+3.75,3.68,3.68,3.70,3.67,3.66,3.69,3.71,3.74,3.68,
+3.80,3.89,3.79,3.69,3.76,3.84,3.75,3.86,3.83,3.78,
+3.88,3.91,3.96,3.91,3.95,3.93,4.06,4.08,3.94,3.95,
+4.01,4.06,4.00,3.87,4.00,3.95,4.01,4.02,4.15,4.18,
+4.04,4.08,4.16,4.31,4.25,4.09,3.98,4.09,4.22,4.21,
+4.27,4.32,4.21,4.19,4.17,4.35,4.34,4.27,4.25,4.21,
+4.35,4.17,4.45,4.19,4.23,4.28,4.45,4.30,4.31,4.33,
+4.57,4.36,4.39,4.50,4.28,4.44,4.43,4.27,4.40,4.54,
+4.50,4.53,4.49,4.41,4.58,4.39,4.60,4.59,4.62,4.54,
+4.70,4.64,4.70,4.61,4.47,4.58,4.54,4.67,4.55,4.67,
+4.63,4.88,4.63,4.58,4.95,4.93,4.59,4.84,4.75,4.92,
+4.74,4.70,4.79,4.74,4.64,4.83,4.75,4.77,4.80,4.83,
+4.66,4.68,4.95,4.79,4.60,4.85,4.91,5.02,4.92,4.76,
+4.76,4.72,5.03,5.03,5.01,4.91,5.09,5.02,5.05,4.93,
+0.92,0.99,1.01,1.05,1.07,1.13,1.16,1.24,1.29,1.23,
+1.28,1.29,1.32,1.38,1.43,1.45,1.46,1.51,1.50,1.57,
+1.55,1.56,1.61,1.65,1.62,1.74,1.78,1.74,1.76,1.82,
+1.80,1.79,1.85,1.89,1.81,1.94,1.91,1.98,1.97,2.03,
+2.07,1.97,2.09,2.05,2.10,2.04,2.13,2.03,2.10,2.18,
+2.17,2.23,2.27,2.28,2.27,2.29,2.38,2.31,2.30,2.40,
+2.30,2.41,2.35,2.42,2.43,2.40,2.49,2.50,2.53,2.56,
+2.46,2.56,2.55,2.60,2.60,2.60,2.68,2.68,2.57,2.65,
+2.62,2.72,2.68,2.80,2.69,2.71,2.71,2.79,2.79,2.85,
+2.83,2.83,2.84,2.84,2.89,2.85,2.99,2.88,2.97,2.97,
+2.97,2.87,3.08,3.01,2.99,3.03,3.13,3.03,3.05,3.13,
+3.17,3.22,3.10,3.15,3.20,3.15,3.19,3.21,3.23,3.23,
+3.19,3.23,3.25,3.33,3.30,3.33,3.37,3.29,3.19,3.35,
+3.41,3.37,3.27,3.23,3.42,3.36,3.44,3.53,3.54,3.48,
+3.46,3.50,3.47,3.52,3.42,3.47,3.57,3.50,3.55,3.57,
+3.64,3.54,3.59,3.64,3.56,3.71,3.53,3.58,3.58,3.80,
+3.62,3.62,3.72,3.85,3.80,3.75,3.71,3.73,3.81,3.75,
+3.78,3.86,3.75,3.93,3.71,3.93,3.83,3.86,3.98,3.89,
+3.90,3.92,3.97,4.01,3.83,4.19,3.89,3.95,3.88,4.05,
+4.04,4.02,4.23,4.10,3.85,4.12,4.03,4.02,4.05,4.05,
+4.05,4.10,4.10,4.19,4.19,4.14,4.04,4.12,4.23,4.16,
+4.22,4.23,4.19,4.17,4.20,4.34,4.28,4.33,4.39,4.26,
+4.22,4.08,4.31,4.32,4.39,4.21,4.10,4.51,4.19,4.27,
+4.27,4.31,4.38,4.58,4.22,4.21,4.47,4.50,4.40,4.50,
+4.37,4.43,4.24,4.47,4.50,4.38,4.59,4.57,4.31,4.54,
+4.33,4.61,4.44,4.76,4.65,4.41,4.44,4.76,4.64,4.54,
+4.76,4.64,4.44,4.59,4.76,4.60,4.81,4.77,4.76,4.60,
+4.63,4.81,4.93,4.84,4.58,4.80,4.70,4.68,4.56,4.74,
+4.93,4.88,4.92,4.79,4.85,4.72,5.04,4.89,4.81,4.99,
+0.93,0.97,1.04,1.02,1.05,1.12,1.13,1.13,1.21,1.28,
+1.28,1.29,1.28,1.34,1.35,1.42,1.44,1.45,1.48,1.48,
+1.51,1.53,1.62,1.62,1.63,1.64,1.67,1.69,1.71,1.71,
+1.74,1.80,1.79,1.77,1.94,1.82,1.88,1.92,1.93,1.99,
+1.92,1.93,2.04,2.10,2.01,2.08,2.13,2.14,2.03,2.11,
+2.14,2.25,2.08,2.11,2.19,2.19,2.27,2.29,2.22,2.27,
+2.25,2.25,2.27,2.36,2.42,2.30,2.34,2.49,2.40,2.53,
+2.51,2.48,2.61,2.49,2.50,2.52,2.50,2.59,2.66,2.47,
+2.73,2.67,2.70,2.62,2.66,2.73,2.77,2.74,2.74,2.74,
+2.80,2.79,2.81,2.85,2.83,2.73,2.76,2.82,2.90,2.90,
+2.95,2.94,2.81,2.95,2.90,2.82,2.98,3.00,3.01,3.11,
+3.05,3.12,3.02,3.07,3.05,3.05,3.08,3.17,3.16,3.03,
+3.16,3.09,3.28,3.28,3.40,3.32,3.17,3.17,3.35,3.30,
+3.18,3.30,3.33,3.13,3.28,3.33,3.18,3.26,3.34,3.32,
+3.33,3.37,3.34,3.40,3.39,3.59,3.51,3.48,3.42,3.47,
+3.55,3.57,3.49,3.55,3.50,3.53,3.50,3.49,3.49,3.59,
+3.72,3.55,3.53,3.58,3.75,3.79,3.75,3.67,3.67,3.60,
+3.72,3.67,3.75,3.71,3.79,3.79,3.66,3.81,3.88,3.76,
+3.91,3.82,3.83,3.70,3.95,3.85,3.95,3.88,3.86,3.92,
+3.76,3.89,4.06,3.91,4.09,3.82,3.95,3.93,3.75,3.95,
+3.85,4.11,4.00,4.04,4.07,3.94,3.92,4.00,3.98,4.12,
+4.12,3.96,4.14,4.04,3.97,4.23,4.14,4.20,4.08,4.21,
+4.34,4.20,4.07,4.09,4.31,4.30,4.22,4.27,4.33,4.29,
+4.21,4.17,4.19,4.22,4.22,4.22,4.36,4.39,4.28,4.38,
+4.08,4.41,4.34,4.32,4.49,4.44,4.33,4.32,4.57,4.53,
+4.46,4.40,4.24,4.38,4.42,4.39,4.22,4.51,4.54,4.65,
+4.27,4.59,4.51,4.66,4.53,4.70,4.60,4.56,4.57,4.63,
+4.57,4.65,4.72,4.54,4.32,4.60,4.60,4.70,4.52,4.78,
+4.62,4.68,4.67,4.62,4.48,4.76,4.79,4.80,4.54,4.78,
+0.89,0.96,0.99,1.03,1.02,1.07,1.09,1.13,1.13,1.23,
+1.27,1.26,1.29,1.31,1.32,1.41,1.46,1.35,1.42,1.43,
+1.49,1.48,1.57,1.61,1.56,1.58,1.64,1.66,1.66,1.66,
+1.75,1.74,1.77,1.84,1.74,1.77,1.82,1.85,1.86,1.90,
+1.94,1.89,2.00,1.99,2.00,1.97,1.96,1.99,2.01,2.02,
+2.03,2.13,1.98,2.16,2.19,2.19,2.19,2.14,2.17,2.19,
+2.24,2.17,2.34,2.21,2.38,2.28,2.40,2.36,2.22,2.36,
+2.33,2.32,2.38,2.47,2.43,2.51,2.45,2.41,2.56,2.52,
+2.47,2.52,2.57,2.49,2.56,2.62,2.70,2.60,2.51,2.68,
+2.75,2.67,2.67,2.60,2.71,2.77,2.67,2.78,2.82,2.71,
+2.94,2.77,2.83,2.84,2.73,2.94,2.88,2.89,2.96,2.83,
+2.88,2.91,2.98,2.98,3.00,2.89,3.05,2.98,3.02,3.02,
+2.90,3.05,3.00,3.15,3.10,3.13,3.10,3.14,3.27,3.09,
+3.23,3.11,3.16,3.28,3.26,3.16,3.23,3.21,3.22,3.15,
+3.10,3.23,3.28,3.26,3.39,3.51,3.30,3.39,3.38,3.42,
+3.37,3.31,3.26,3.40,3.48,3.38,3.41,3.36,3.45,3.55,
+3.45,3.41,3.55,3.52,3.52,3.57,3.64,3.62,3.63,3.51,
+3.67,3.53,3.53,3.76,3.76,3.78,3.74,3.56,3.68,3.49,
+3.65,3.80,3.63,3.82,3.76,3.64,3.63,3.71,3.75,3.85,
+3.77,3.72,3.65,3.80,3.89,3.85,3.78,3.80,3.80,3.66,
+3.81,3.84,3.73,3.93,3.87,3.83,3.90,3.94,3.97,3.88,
+3.86,3.99,3.97,4.02,4.07,4.03,4.00,4.17,4.01,4.01,
+4.17,3.91,4.05,4.06,4.08,4.11,4.18,4.26,4.10,4.05,
+3.93,4.02,4.27,4.11,4.28,4.22,4.13,4.05,4.16,4.21,
+4.24,4.17,4.22,4.34,4.22,4.19,4.24,4.33,4.30,4.40,
+4.40,4.30,4.21,4.46,4.19,4.21,4.30,4.22,4.30,4.44,
+4.34,4.47,4.29,4.34,4.47,4.47,4.49,4.43,4.43,4.37,
+4.51,4.43,4.54,4.39,4.49,4.44,4.66,4.44,4.28,4.65,
+4.59,4.72,4.66,4.45,4.53,4.54,4.43,4.68,4.70,4.54,
+0.83,0.89,0.97,0.95,0.97,1.05,1.04,1.12,1.11,1.13,
+1.20,1.20,1.23,1.28,1.26,1.31,1.34,1.36,1.39,1.42,
+1.42,1.40,1.48,1.44,1.56,1.56,1.55,1.56,1.55,1.63,
+1.64,1.71,1.67,1.72,1.74,1.72,1.79,1.70,1.78,1.76,
+1.82,1.86,1.86,1.91,1.92,1.93,1.97,1.89,2.02,1.99,
+2.03,1.99,2.04,2.11,2.04,2.08,2.09,2.12,2.16,2.17,
+2.10,2.19,2.18,2.17,2.24,2.16,2.29,2.25,2.22,2.28,
+2.22,2.26,2.37,2.39,2.33,2.34,2.36,2.50,2.48,2.50,
+2.46,2.52,2.46,2.43,2.45,2.48,2.46,2.47,2.49,2.47,
+2.61,2.58,2.60,2.68,2.72,2.58,2.58,2.56,2.68,2.70,
+2.70,2.81,2.77,2.74,2.77,2.76,2.65,2.73,2.78,2.85,
+2.80,2.74,2.83,2.89,2.89,2.87,2.88,2.97,2.99,2.86,
+2.86,2.93,2.89,3.04,2.88,2.89,3.05,2.99,3.14,2.92,
+2.98,2.95,3.13,3.16,3.06,3.06,3.16,3.14,3.21,3.03,
+3.08,3.21,3.13,3.15,3.18,3.26,3.11,3.19,3.20,3.21,
+3.22,3.17,3.25,3.27,3.31,3.34,3.39,3.37,3.33,3.25,
+3.41,3.49,3.40,3.39,3.46,3.46,3.39,3.41,3.36,3.28,
+3.47,3.55,3.42,3.39,3.46,3.50,3.49,3.67,3.50,3.57,
+3.42,3.55,3.54,3.51,3.66,3.52,3.55,3.52,3.59,3.69,
+3.57,3.65,3.75,3.62,3.65,3.63,3.85,3.74,3.67,3.68,
+3.78,3.72,3.65,3.72,3.76,3.68,3.79,3.85,3.75,3.83,
+3.86,3.89,3.81,3.98,3.81,3.77,3.71,3.99,3.72,3.91,
+3.99,3.82,4.04,3.98,4.03,3.85,3.95,3.84,3.97,4.01,
+3.73,3.95,3.95,3.89,3.84,4.09,3.89,3.98,3.96,4.05,
+4.18,4.04,4.01,4.17,4.17,4.07,3.92,4.01,4.04,4.27,
+4.09,4.07,4.21,4.02,4.22,4.09,4.18,4.22,4.16,4.14,
+4.28,4.39,4.29,4.22,4.23,4.23,4.20,4.29,4.31,4.43,
+4.39,4.39,4.42,4.24,4.16,4.34,4.35,4.45,4.37,4.31,
+4.39,4.42,4.32,4.35,4.21,4.21,4.47,4.28,4.39,4.50,
+0.83,0.86,0.89,0.93,0.98,1.01,1.06,1.05,1.06,1.11,
+1.18,1.17,1.17,1.20,1.21,1.29,1.29,1.31,1.30,1.39,
+1.41,1.37,1.39,1.51,1.44,1.48,1.56,1.52,1.54,1.63,
+1.57,1.64,1.62,1.63,1.68,1.68,1.73,1.71,1.74,1.76,
+1.75,1.75,1.75,1.74,1.81,1.76,1.88,1.86,1.89,1.86,
+1.89,1.92,1.81,1.99,1.96,2.08,2.09,2.09,1.93,2.10,
+2.07,2.14,2.19,2.08,2.20,2.15,2.22,2.19,2.18,2.27,
+2.36,2.26,2.25,2.22,2.32,2.27,2.24,2.37,2.31,2.38,
+2.35,2.24,2.47,2.37,2.47,2.44,2.52,2.43,2.50,2.51,
+2.54,2.39,2.50,2.49,2.48,2.58,2.50,2.63,2.56,2.49,
+2.67,2.63,2.70,2.54,2.66,2.63,2.66,2.61,2.61,2.67,
+2.79,2.61,2.74,2.71,2.77,2.78,2.85,2.87,2.79,2.80,
+2.78,2.78,2.79,2.79,2.89,2.92,2.88,2.95,2.86,2.91,
+2.98,2.94,2.96,2.93,2.91,3.02,3.12,2.96,3.07,3.02,
+3.02,3.03,3.01,3.09,3.02,3.01,3.04,3.08,2.96,3.21,
+3.15,3.10,3.22,3.10,3.21,3.07,3.31,3.23,3.13,3.12,
+3.20,3.22,3.23,3.21,3.23,3.33,3.22,3.35,3.30,3.21,
+3.37,3.34,3.41,3.37,3.29,3.26,3.24,3.39,3.49,3.51,
+3.52,3.28,3.50,3.43,3.55,3.37,3.42,3.57,3.44,3.47,
+3.63,3.52,3.52,3.43,3.54,3.66,3.57,3.43,3.63,3.59,
+3.64,3.69,3.63,3.62,3.66,3.68,3.59,3.65,3.64,3.68,
+3.66,3.65,3.73,3.82,3.66,3.72,3.81,3.66,3.82,3.72,
+3.73,3.72,3.81,3.77,3.67,3.73,3.78,3.80,3.68,3.79,
+3.80,3.78,3.77,3.90,3.90,3.85,3.81,3.82,3.96,3.85,
+3.83,4.07,4.13,3.91,3.93,3.96,3.96,3.94,4.08,4.07,
+4.06,3.98,3.87,4.10,3.93,4.09,4.12,3.94,3.96,4.06,
+4.05,3.96,4.14,4.01,4.01,4.02,4.11,4.06,4.05,4.17,
+4.07,4.20,4.17,3.99,4.11,4.18,4.26,4.04,4.18,4.21,
+4.21,4.17,4.28,4.28,4.14,4.32,4.32,4.34,4.28,4.19,
+0.79,0.84,0.85,0.92,0.91,0.94,0.99,0.98,1.06,1.04,
+1.11,1.12,1.12,1.16,1.23,1.18,1.27,1.27,1.26,1.29,
+1.36,1.34,1.36,1.41,1.37,1.42,1.38,1.46,1.49,1.51,
+1.51,1.51,1.51,1.57,1.56,1.65,1.64,1.63,1.60,1.63,
+1.71,1.79,1.77,1.87,1.74,1.71,1.86,1.82,1.78,1.89,
+1.82,1.86,1.78,1.82,1.88,1.92,1.98,1.96,1.94,2.06,
+1.95,2.03,2.05,2.09,2.03,2.08,1.99,2.11,2.09,2.05,
+2.12,2.14,2.20,2.12,2.17,2.21,2.20,2.36,2.36,2.34,
+2.33,2.29,2.36,2.27,2.29,2.37,2.42,2.38,2.40,2.37,
+2.44,2.42,2.39,2.47,2.41,2.42,2.49,2.39,2.58,2.42,
+2.60,2.48,2.46,2.57,2.50,2.43,2.62,2.56,2.46,2.67,
+2.68,2.45,2.64,2.55,2.69,2.71,2.64,2.71,2.62,2.72,
+2.77,2.62,2.61,2.76,2.84,2.83,2.80,2.94,2.77,2.81,
+2.73,2.85,2.89,2.99,2.92,2.77,2.82,2.84,2.94,2.81,
+2.85,2.92,2.85,2.92,2.96,2.93,2.98,3.04,2.92,3.12,
+3.04,2.99,3.11,3.10,3.08,2.94,3.09,3.10,3.10,3.07,
+3.07,3.28,3.02,3.10,3.10,3.30,3.18,3.17,3.15,3.25,
+3.25,3.27,3.14,3.26,3.32,3.27,3.29,3.27,3.34,3.31,
+3.19,3.31,3.32,3.19,3.31,3.34,3.42,3.43,3.33,3.37,
+3.35,3.34,3.36,3.37,3.40,3.43,3.35,3.48,3.46,3.40,
+3.58,3.46,3.44,3.44,3.47,3.54,3.57,3.64,3.51,3.32,
+3.37,3.58,3.41,3.42,3.62,3.65,3.56,3.69,3.64,3.59,
+3.54,3.71,3.50,3.74,3.64,3.56,3.62,3.84,3.69,3.53,
+3.66,3.66,3.68,3.62,3.67,3.69,3.83,3.73,3.88,3.89,
+3.72,3.77,3.80,3.77,3.87,3.74,3.61,3.86,3.88,3.83,
+3.88,3.67,3.83,3.86,3.92,3.99,3.89,3.86,3.66,3.97,
+3.91,3.78,3.98,3.93,3.77,3.93,3.89,3.99,3.92,3.98,
+3.93,3.98,3.88,3.90,4.07,3.94,4.06,4.00,3.95,3.98,
+3.92,4.03,3.97,4.03,4.01,4.25,4.09,3.99,4.14,4.13,
+0.77,0.79,0.80,0.84,0.87,0.91,0.95,0.98,0.99,1.03,
+1.01,1.04,1.11,1.12,1.14,1.18,1.26,1.20,1.25,1.22,
+1.26,1.29,1.32,1.36,1.30,1.32,1.43,1.37,1.48,1.46,
+1.48,1.52,1.52,1.52,1.56,1.52,1.54,1.65,1.59,1.54,
+1.65,1.64,1.67,1.71,1.68,1.77,1.69,1.69,1.78,1.74,
+1.78,1.74,1.71,1.82,1.82,1.80,1.90,1.85,1.85,1.95,
+2.00,1.96,2.00,1.87,2.03,2.02,1.99,2.08,2.05,2.04,
+2.01,2.07,2.11,2.00,2.07,2.04,2.11,2.12,2.15,2.22,
+2.18,2.23,2.15,2.26,2.19,2.24,2.31,2.35,2.28,2.38,
+2.37,2.28,2.32,2.36,2.31,2.34,2.25,2.32,2.34,2.29,
+2.32,2.47,2.41,2.48,2.46,2.51,2.48,2.51,2.40,2.44,
+2.52,2.49,2.42,2.54,2.61,2.54,2.64,2.55,2.63,2.53,
+2.55,2.49,2.59,2.70,2.60,2.52,2.62,2.67,2.69,2.79,
+2.71,2.72,2.77,2.72,2.80,2.76,2.70,2.75,2.83,2.75,
+2.85,2.84,2.78,2.69,2.85,2.78,2.99,2.73,2.97,2.89,
+2.94,2.97,2.88,2.89,2.83,2.96,2.88,3.02,2.96,2.94,
+3.06,2.92,2.96,3.08,2.91,3.03,2.90,3.05,2.96,3.08,
+3.03,3.16,3.11,3.00,3.07,3.21,3.12,3.17,3.13,3.01,
+3.11,3.16,3.14,3.04,3.17,3.10,3.29,3.15,3.15,3.02,
+3.26,3.14,3.31,3.20,3.40,3.31,3.23,3.29,3.31,3.28,
+3.37,3.23,3.19,3.17,3.32,3.31,3.36,3.31,3.36,3.36,
+3.33,3.44,3.48,3.36,3.39,3.40,3.45,3.42,3.45,3.39,
+3.47,3.40,3.46,3.53,3.50,3.47,3.51,3.55,3.57,3.37,
+3.41,3.63,3.50,3.51,3.47,3.50,3.52,3.66,3.63,3.51,
+3.55,3.71,3.63,3.59,3.65,3.65,3.63,3.63,3.67,3.51,
+3.68,3.76,3.69,3.53,3.69,3.85,3.72,3.82,3.79,3.59,
+3.83,3.70,3.74,3.81,3.85,3.78,3.76,3.70,3.81,3.83,
+3.75,3.96,3.91,3.92,3.85,3.85,3.96,3.80,3.86,3.94,
+3.78,3.84,3.93,3.76,3.91,3.79,3.91,3.80,4.02,4.01,
+0.71,0.76,0.81,0.83,0.85,0.88,0.91,0.95,0.95,0.98,
+1.00,1.03,1.03,1.05,1.07,1.09,1.15,1.16,1.18,1.26,
+1.24,1.20,1.27,1.30,1.26,1.30,1.32,1.36,1.40,1.44,
+1.36,1.43,1.44,1.48,1.45,1.47,1.47,1.53,1.49,1.56,
+1.54,1.52,1.68,1.65,1.69,1.64,1.65,1.64,1.69,1.69,
+1.66,1.78,1.75,1.78,1.74,1.78,1.80,1.80,1.83,1.88,
+1.89,1.84,1.91,1.87,1.94,1.91,1.91,1.83,1.99,1.97,
+1.91,2.00,2.03,1.98,2.02,2.02,1.97,2.03,2.02,2.12,
+2.10,2.09,2.12,2.14,2.14,2.11,2.12,2.10,2.14,2.16,
+2.18,2.19,2.23,2.33,2.23,2.22,2.25,2.34,2.37,2.28,
+2.28,2.42,2.28,2.33,2.35,2.33,2.31,2.34,2.44,2.36,
+2.31,2.41,2.46,2.43,2.42,2.44,2.36,2.42,2.48,2.48,
+2.54,2.48,2.49,2.58,2.53,2.49,2.48,2.58,2.53,2.57,
+2.57,2.56,2.63,2.56,2.53,2.66,2.66,2.67,2.80,2.63,
+2.67,2.74,2.77,2.72,2.75,2.79,2.79,2.64,2.74,2.70,
+2.82,2.76,2.77,2.78,2.77,2.82,2.91,2.83,2.76,2.83,
+2.83,2.70,2.85,2.80,2.90,2.97,2.83,2.92,2.83,2.93,
+2.90,2.99,2.91,2.93,2.90,2.99,2.92,3.10,3.08,3.06,
+2.97,2.93,3.12,3.03,3.02,3.02,3.07,3.12,3.04,3.15,
+3.10,3.02,3.12,3.18,3.06,3.21,3.14,3.15,3.28,3.22,
+3.31,3.16,3.18,3.12,3.18,3.26,3.25,3.22,3.20,3.25,
+3.13,3.24,3.22,3.19,3.25,3.38,3.17,3.22,3.34,3.40,
+3.28,3.42,3.29,3.36,3.31,3.51,3.36,3.36,3.45,3.28,
+3.47,3.40,3.43,3.39,3.42,3.38,3.45,3.53,3.40,3.43,
+3.36,3.51,3.39,3.45,3.42,3.46,3.48,3.52,3.35,3.38,
+3.57,3.62,3.63,3.57,3.49,3.52,3.49,3.53,3.57,3.73,
+3.55,3.53,3.63,3.58,3.71,3.64,3.74,3.64,3.44,3.69,
+3.51,3.58,3.76,3.72,3.56,3.63,3.71,3.62,3.81,3.79,
+3.70,3.72,3.75,3.84,3.81,3.72,3.68,3.76,3.79,3.85,
+0.67,0.75,0.77,0.79,0.82,0.83,0.88,0.88,0.87,0.95,
+0.94,1.01,1.01,0.99,1.03,1.08,1.08,1.08,1.12,1.18,
+1.18,1.17,1.19,1.18,1.23,1.30,1.26,1.29,1.31,1.29,
+1.33,1.31,1.37,1.37,1.38,1.38,1.45,1.41,1.43,1.44,
+1.48,1.53,1.55,1.55,1.54,1.51,1.55,1.56,1.54,1.56,
+1.67,1.71,1.66,1.58,1.68,1.72,1.79,1.73,1.71,1.71,
+1.79,1.77,1.77,1.74,1.77,1.85,1.80,1.83,1.86,1.87,
+1.95,1.90,1.96,1.91,1.99,1.92,1.93,1.97,1.97,1.95,
+1.97,2.00,2.00,2.02,1.98,2.14,2.04,2.11,2.14,2.14,
+2.13,2.10,2.11,2.04,2.15,2.18,2.27,2.21,2.21,2.13,
+2.16,2.18,2.18,2.21,2.26,2.23,2.17,2.27,2.29,2.35,
+2.24,2.26,2.26,2.36,2.39,2.40,2.35,2.42,2.34,2.34,
+2.31,2.38,2.39,2.42,2.44,2.35,2.51,2.46,2.43,2.46,
+2.55,2.47,2.41,2.49,2.43,2.60,2.52,2.49,2.60,2.55,
+2.56,2.54,2.54,2.50,2.59,2.62,2.65,2.64,2.63,2.70,
+2.60,2.61,2.71,2.58,2.55,2.72,2.54,2.64,2.75,2.68,
+2.74,2.72,2.76,2.61,2.74,2.75,2.66,2.76,2.80,2.88,
+2.73,2.73,2.84,2.80,2.84,2.79,2.81,2.94,2.74,2.79,
+2.92,2.91,2.91,2.85,2.87,2.93,2.97,2.85,2.91,3.05,
+2.91,2.86,3.05,2.98,3.05,3.03,2.97,2.94,3.04,2.98,
+3.07,2.98,3.10,3.17,3.11,3.11,3.04,3.09,3.16,3.01,
+3.11,3.17,3.08,3.12,3.24,3.16,3.12,3.12,3.11,3.10,
+3.06,3.05,3.06,3.12,3.23,3.17,3.28,3.19,3.19,3.20,
+3.26,3.29,3.18,3.16,3.35,3.33,3.12,3.34,3.27,3.36,
+3.27,3.27,3.32,3.28,3.34,3.36,3.28,3.34,3.40,3.36,
+3.40,3.52,3.39,3.39,3.39,3.32,3.41,3.45,3.33,3.26,
+3.51,3.47,3.47,3.48,3.47,3.47,3.59,3.43,3.48,3.38,
+3.48,3.57,3.36,3.54,3.51,3.51,3.65,3.47,3.62,3.71,
+3.52,3.73,3.54,3.54,3.58,3.56,3.57,3.49,3.63,3.53,
+1.02,1.14,1.17,1.23,1.28,1.30,1.32,1.34,1.37,1.40,
+1.44,1.52,1.55,1.56,1.52,1.61,1.65,1.69,1.69,1.79,
+1.75,1.76,1.81,1.86,1.86,1.94,1.95,1.94,2.03,2.08,
+2.01,2.06,2.07,2.07,2.22,2.15,2.23,2.27,2.23,2.21,
+2.34,2.27,2.36,2.28,2.38,2.42,2.40,2.37,2.49,2.50,
+2.50,2.45,2.44,2.57,2.61,2.58,2.70,2.65,2.62,2.67,
+2.65,2.66,2.73,2.69,2.75,2.82,2.76,2.85,2.83,2.90,
+2.98,2.90,2.95,2.94,2.93,3.03,2.97,3.13,2.88,3.08,
+3.03,3.12,3.20,3.14,3.09,3.13,3.29,3.12,3.29,3.09,
+3.21,3.29,3.13,3.12,3.31,3.26,3.32,3.22,3.36,3.27,
+3.48,3.59,3.33,3.46,3.46,3.50,3.52,3.39,3.57,3.57,
+3.54,3.50,3.55,3.54,3.49,3.44,3.64,3.58,3.61,3.60,
+3.54,3.66,3.73,3.72,3.83,3.71,3.79,3.70,3.64,3.65,
+3.90,3.85,3.99,3.93,3.80,3.77,3.92,3.77,3.99,3.98,
+4.08,4.02,3.85,3.92,3.89,3.99,4.13,4.04,4.06,4.03,
+3.94,4.16,4.15,4.06,4.02,4.21,4.08,4.17,4.30,4.12,
+4.16,4.13,4.24,4.11,4.27,4.09,4.39,4.16,4.02,4.22,
+4.45,4.35,4.27,4.34,4.44,4.46,4.33,4.38,4.48,4.34,
+4.29,4.35,4.50,4.41,4.58,4.33,4.56,4.41,4.72,4.40,
+4.50,4.63,4.68,4.68,4.41,4.70,4.51,4.48,4.65,4.60,
+4.66,4.63,4.66,4.69,4.60,4.67,4.66,4.79,4.70,4.82,
+4.58,4.77,4.82,4.73,4.81,4.72,4.80,4.95,4.77,4.78,
+4.93,4.84,4.77,4.91,4.93,4.96,5.03,5.02,5.08,4.86,
+5.07,4.96,4.82,4.98,4.93,4.94,5.21,4.97,5.05,5.10,
+4.95,5.08,5.22,5.19,5.13,5.23,5.00,5.19,5.11,5.11,
+5.16,5.18,5.15,5.42,5.26,5.28,5.04,5.11,5.29,5.27,
+5.32,5.21,5.50,5.11,5.29,5.17,5.31,5.48,5.41,5.37,
+5.46,5.38,5.10,5.52,5.27,5.30,5.31,5.50,5.08,5.63,
+5.47,5.42,5.63,5.43,5.52,5.28,5.49,5.59,5.63,5.67,
+1.01,1.10,1.14,1.16,1.20,1.27,1.26,1.34,1.35,1.36,
+1.39,1.45,1.47,1.56,1.54,1.58,1.66,1.61,1.71,1.74,
+1.80,1.72,1.75,1.81,1.81,1.88,1.89,1.88,1.90,1.94,
+2.01,1.99,2.04,2.06,2.10,2.06,2.12,2.11,2.18,2.18,
+2.18,2.27,2.25,2.18,2.24,2.20,2.39,2.36,2.34,2.40,
+2.34,2.43,2.55,2.47,2.52,2.51,2.52,2.50,2.53,2.63,
+2.56,2.66,2.73,2.57,2.65,2.72,2.70,2.69,2.76,2.84,
+2.75,2.76,2.74,2.82,2.89,2.84,2.89,2.91,2.82,2.87,
+3.01,2.88,3.01,3.00,3.02,2.91,3.04,3.08,3.09,3.17,
+3.17,3.01,3.15,3.10,3.15,3.13,3.23,3.17,3.20,3.33,
+3.23,3.16,3.18,3.39,3.16,3.31,3.39,3.36,3.32,3.42,
+3.30,3.49,3.37,3.45,3.36,3.48,3.51,3.41,3.48,3.57,
+3.50,3.47,3.45,3.65,3.58,3.63,3.71,3.68,3.69,3.57,
+3.70,3.70,3.60,3.63,3.77,3.75,3.74,3.76,3.92,3.75,
+3.67,3.76,3.68,3.66,3.87,3.83,3.91,3.85,3.99,3.95,
+3.96,3.97,3.92,3.98,4.02,3.96,4.16,4.06,4.11,4.10,
+3.93,4.19,4.28,4.10,4.00,4.08,4.26,4.18,4.15,4.22,
+4.07,4.29,4.12,4.34,4.32,4.29,4.31,4.22,4.11,4.36,
+4.57,4.12,4.45,4.41,4.19,4.23,4.23,4.34,4.48,4.19,
+4.59,4.57,4.39,4.42,4.48,4.54,4.44,4.50,4.59,4.52,
+4.65,4.35,4.44,4.61,4.51,4.36,4.63,4.58,4.50,4.65,
+4.69,4.48,4.55,4.70,4.57,4.58,4.76,4.87,4.59,4.68,
+4.61,4.58,4.70,4.87,5.03,4.73,4.79,4.83,4.50,4.84,
+4.82,4.75,4.77,4.89,4.74,4.84,4.68,4.85,4.79,5.03,
+4.95,5.01,4.81,4.89,4.94,4.92,4.88,4.92,5.04,4.90,
+4.93,5.14,5.02,5.07,5.05,5.14,5.01,5.03,4.94,5.16,
+5.13,5.07,5.01,5.13,5.08,4.95,5.05,5.15,5.17,5.25,
+5.32,5.27,5.00,5.23,5.16,5.09,5.22,5.28,5.34,5.05,
+5.31,5.32,5.16,5.48,5.26,5.32,5.22,5.36,5.18,5.25,
+1.01,1.06,1.10,1.14,1.20,1.24,1.22,1.30,1.28,1.31,
+1.39,1.41,1.53,1.53,1.52,1.63,1.53,1.60,1.64,1.64,
+1.74,1.70,1.69,1.77,1.79,1.83,1.80,1.88,1.92,1.93,
+1.99,1.98,1.97,2.03,2.07,2.10,2.12,2.10,2.08,2.13,
+2.11,2.12,2.20,2.27,2.25,2.20,2.29,2.28,2.36,2.39,
+2.32,2.42,2.44,2.42,2.44,2.32,2.53,2.42,2.55,2.49,
+2.59,2.47,2.62,2.49,2.54,2.61,2.73,2.55,2.67,2.71,
+2.77,2.68,2.67,2.81,2.79,2.93,2.76,2.86,2.96,2.89,
+2.98,2.97,2.80,2.95,2.98,2.92,2.87,2.98,2.96,2.99,
+3.07,3.06,3.00,3.13,3.12,3.07,3.20,3.21,3.36,3.19,
+3.30,3.13,3.23,3.25,3.20,3.15,3.26,3.36,3.28,3.46,
+3.39,3.47,3.23,3.48,3.42,3.48,3.44,3.28,3.34,3.58,
+3.49,3.65,3.35,3.49,3.52,3.58,3.55,3.50,3.50,3.55,
+3.53,3.71,3.54,3.53,3.55,3.50,3.65,3.59,3.57,3.64,
+3.83,3.80,3.76,3.61,3.62,3.85,3.78,3.67,3.72,3.87,
+3.80,3.87,3.95,3.85,3.92,3.79,3.81,3.92,3.99,3.93,
+4.03,3.95,4.05,3.95,4.04,4.02,4.14,3.95,4.15,4.13,
+3.91,4.15,3.89,4.11,4.03,4.14,4.36,4.02,4.12,4.17,
+4.03,4.07,4.14,4.36,4.34,4.07,4.35,4.28,4.40,4.27,
+4.28,4.40,4.32,4.33,4.34,4.34,4.30,4.26,4.43,4.43,
+4.29,4.35,4.47,4.33,4.31,4.30,4.62,4.55,4.41,4.38,
+4.32,4.58,4.50,4.39,4.57,4.49,4.74,4.36,4.70,4.55,
+4.45,4.72,4.34,4.79,4.48,4.55,4.74,4.53,4.60,4.57,
+4.57,4.82,4.85,4.62,4.72,4.60,4.69,4.67,4.83,4.68,
+4.95,4.68,4.82,4.83,4.81,4.61,4.84,4.66,4.69,4.76,
+4.80,4.86,4.85,4.82,5.10,4.96,4.87,4.64,4.96,4.96,
+4.81,4.75,5.20,5.04,4.92,4.92,4.92,4.91,5.32,5.06,
+4.89,4.85,5.11,5.13,5.13,5.05,5.11,4.99,5.12,5.21,
+5.11,5.12,5.18,5.20,5.17,5.35,5.37,5.43,5.04,5.22,
+0.97,1.07,1.10,1.08,1.16,1.17,1.21,1.20,1.28,1.35,
+1.38,1.38,1.41,1.44,1.51,1.56,1.50,1.52,1.59,1.65,
+1.59,1.65,1.70,1.73,1.74,1.81,1.79,1.79,1.90,1.84,
+1.92,1.92,1.97,1.99,2.03,2.00,2.01,2.06,2.07,2.13,
+2.09,2.09,2.15,2.18,2.20,2.31,2.32,2.23,2.35,2.31,
+2.43,2.35,2.32,2.29,2.24,2.41,2.42,2.43,2.43,2.43,
+2.52,2.56,2.44,2.58,2.52,2.61,2.64,2.59,2.61,2.66,
+2.54,2.59,2.67,2.80,2.69,2.85,2.64,2.71,2.83,2.80,
+2.75,2.78,2.68,2.81,2.98,2.85,2.90,2.91,2.93,2.97,
+2.88,3.01,3.00,3.03,2.87,3.05,3.10,3.03,3.03,3.14,
+3.08,3.14,3.28,3.07,3.13,3.18,2.96,3.27,3.21,3.17,
+3.22,3.29,3.28,3.28,3.47,3.39,3.21,3.51,3.45,3.39,
+3.23,3.45,3.31,3.17,3.33,3.35,3.39,3.30,3.43,3.49,
+3.59,3.60,3.50,3.51,3.59,3.54,3.53,3.66,3.61,3.65,
+3.60,3.63,3.71,3.52,3.75,3.86,3.65,3.71,3.84,3.55,
+3.80,3.79,3.90,3.83,3.80,3.76,3.81,3.79,3.73,3.77,
+3.96,3.79,3.97,3.83,3.76,3.91,4.15,4.07,4.10,4.09,
+3.92,4.02,4.05,3.97,4.01,3.83,4.13,3.99,3.89,3.97,
+3.89,4.12,4.15,4.13,4.07,4.19,4.09,4.07,4.13,4.25,
+4.34,4.16,4.11,4.05,4.17,4.31,4.19,4.27,4.31,4.31,
+4.22,4.27,4.29,4.16,4.19,4.42,4.37,4.42,4.31,4.34,
+4.28,4.54,4.36,4.34,4.42,4.52,4.39,4.43,4.44,4.33,
+4.24,4.44,4.38,4.50,4.57,4.46,4.41,4.56,4.61,4.53,
+4.62,4.55,4.39,4.55,4.64,4.46,4.52,4.45,4.63,4.66,
+4.55,4.71,4.56,4.67,4.59,4.78,4.72,4.74,4.88,4.70,
+4.65,4.87,4.59,4.84,4.91,4.72,4.76,4.82,4.74,4.78,
+4.98,4.85,4.95,4.81,4.95,4.76,4.98,4.94,5.10,5.03,
+4.76,4.83,4.94,5.07,5.07,5.10,4.81,5.14,4.94,4.92,
+4.93,5.25,4.95,4.90,5.20,5.04,5.20,4.99,5.08,5.10,
+0.99,1.04,1.06,1.11,1.12,1.18,1.19,1.28,1.27,1.28,
+1.42,1.36,1.36,1.45,1.43,1.48,1.55,1.58,1.51,1.55,
+1.65,1.59,1.67,1.71,1.74,1.73,1.74,1.86,1.78,1.84,
+1.89,1.87,1.86,1.97,1.90,1.98,1.98,1.97,2.07,2.01,
+2.15,2.07,2.09,2.16,2.23,2.19,2.15,2.18,2.23,2.28,
+2.24,2.25,2.24,2.29,2.33,2.34,2.46,2.39,2.36,2.41,
+2.34,2.56,2.43,2.49,2.52,2.49,2.52,2.47,2.56,2.61,
+2.64,2.68,2.72,2.65,2.67,2.77,2.70,2.61,2.73,2.86,
+2.75,2.81,2.74,2.78,2.90,2.83,2.85,2.86,3.02,2.89,
+2.94,2.95,2.89,2.84,2.97,2.92,3.02,3.14,2.94,2.95,
+3.03,3.10,3.01,3.11,3.10,3.11,3.27,3.11,3.26,3.08,
+3.31,3.24,3.20,3.20,3.28,3.23,3.22,3.28,3.31,3.31,
+3.35,3.35,3.31,3.35,3.41,3.37,3.30,3.37,3.39,3.44,
+3.46,3.47,3.36,3.28,3.56,3.39,3.47,3.50,3.61,3.58,
+3.61,3.45,3.51,3.54,3.52,3.50,3.66,3.66,3.74,3.50,
+3.65,3.59,3.66,3.79,3.47,3.76,3.84,3.63,3.90,3.85,
+4.01,3.79,3.76,3.77,3.77,3.81,3.79,3.83,3.85,3.80,
+3.78,3.88,3.86,3.85,3.82,3.95,3.92,3.94,3.75,3.89,
+3.83,4.09,4.13,3.93,3.93,4.03,4.04,4.06,3.99,4.06,
+3.92,4.39,4.24,4.12,4.15,4.17,4.23,4.18,4.24,4.33,
+4.16,4.11,4.11,4.20,4.16,4.19,4.19,4.38,4.30,4.30,
+4.27,4.22,4.24,4.38,4.33,4.34,4.37,4.32,4.31,4.49,
+4.30,4.42,4.56,4.56,4.44,4.56,4.38,4.36,4.36,4.46,
+4.41,4.39,4.45,4.62,4.46,4.58,4.71,4.60,4.55,4.62,
+4.47,4.68,4.60,4.60,4.75,4.54,4.57,4.53,4.74,4.79,
+4.58,4.70,4.87,4.87,4.76,4.84,4.61,4.78,4.75,4.75,
+4.72,4.72,4.78,4.84,4.85,4.82,4.86,4.76,4.80,4.95,
+4.79,4.84,4.86,5.01,4.99,4.87,4.93,4.94,4.91,5.04,
+4.84,4.88,5.05,5.05,5.00,4.99,4.89,4.96,4.92,4.91,
+0.96,1.01,1.06,1.09,1.12,1.17,1.17,1.21,1.24,1.25,
+1.28,1.36,1.37,1.39,1.44,1.44,1.44,1.48,1.57,1.58,
+1.59,1.59,1.66,1.61,1.67,1.66,1.69,1.76,1.74,1.76,
+1.79,1.88,1.91,1.90,1.90,1.93,1.93,1.95,2.01,1.99,
+2.09,2.08,2.12,2.15,2.09,2.17,2.15,2.24,2.19,2.18,
+2.16,2.28,2.25,2.22,2.23,2.32,2.35,2.29,2.35,2.41,
+2.32,2.39,2.44,2.47,2.50,2.55,2.56,2.56,2.57,2.54,
+2.53,2.59,2.58,2.70,2.62,2.68,2.73,2.71,2.60,2.81,
+2.66,2.80,2.67,2.80,2.77,2.86,2.89,2.88,2.75,2.95,
+2.87,2.83,2.91,2.88,2.95,2.85,2.98,2.95,2.96,2.95,
+2.98,3.01,3.08,2.88,3.01,3.06,3.21,3.05,3.04,3.18,
+3.10,3.33,3.18,3.13,3.24,3.21,3.16,3.26,3.32,3.24,
+3.27,3.22,3.31,3.19,3.23,3.32,3.41,3.45,3.32,3.33,
+3.39,3.45,3.44,3.44,3.33,3.52,3.34,3.37,3.56,3.41,
+3.48,3.61,3.54,3.38,3.47,3.41,3.43,3.55,3.70,3.60,
+3.59,3.51,3.62,3.69,3.50,3.63,3.69,3.59,3.67,3.60,
+3.63,3.71,3.70,3.86,3.79,3.77,3.95,3.75,3.80,3.78,
+3.84,3.74,3.87,3.81,4.00,3.98,3.88,3.92,3.85,3.77,
+3.90,3.87,3.89,3.97,4.05,4.29,4.06,3.99,3.99,4.07,
+4.09,4.08,4.05,4.05,3.96,4.02,4.05,4.18,4.13,4.10,
+4.13,4.09,4.00,4.23,4.25,4.13,4.11,4.10,4.24,4.18,
+4.24,4.28,4.32,4.31,4.18,4.24,4.34,4.21,4.31,4.14,
+4.47,4.36,4.40,4.21,4.42,4.40,4.25,4.36,4.38,4.43,
+4.39,4.47,4.41,4.38,4.37,4.58,4.39,4.50,4.40,4.67,
+4.34,4.63,4.49,4.47,4.54,4.52,4.42,4.49,4.58,4.54,
+4.65,4.54,4.65,4.69,4.56,4.39,4.52,4.72,4.68,4.90,
+4.68,4.80,4.68,4.61,4.80,4.73,4.88,4.64,4.80,4.70,
+4.77,4.87,4.64,4.79,4.71,5.01,4.73,4.66,4.73,4.83,
+5.05,4.88,4.83,4.88,4.97,4.68,4.88,4.77,4.89,4.95,
+0.95,0.95,1.05,1.08,1.13,1.08,1.20,1.20,1.23,1.26,
+1.28,1.29,1.30,1.37,1.41,1.47,1.42,1.49,1.49,1.58,
+1.60,1.59,1.57,1.71,1.69,1.76,1.67,1.69,1.69,1.79,
+1.82,1.82,1.83,1.89,1.87,1.92,1.89,1.97,1.98,1.91,
+1.95,2.04,2.06,2.15,2.12,2.08,2.10,2.18,2.12,2.14,
+2.08,2.17,2.19,2.19,2.24,2.22,2.22,2.24,2.27,2.25,
+2.35,2.35,2.35,2.38,2.47,2.36,2.38,2.51,2.51,2.51,
+2.46,2.50,2.55,2.48,2.62,2.56,2.52,2.62,2.73,2.66,
+2.72,2.59,2.73,2.77,2.74,2.73,2.77,2.79,2.82,2.73,
+2.75,2.73,2.86,2.85,2.81,2.90,2.94,2.82,2.90,2.88,
+2.98,2.90,3.04,2.94,3.01,3.05,2.92,2.99,3.00,3.07,
+3.10,3.06,3.11,3.07,3.19,3.11,3.08,3.28,3.25,3.19,
+3.21,3.34,3.30,3.12,3.30,3.25,3.24,3.18,3.31,3.14,
+3.26,3.19,3.18,3.41,3.38,3.30,3.45,3.41,3.44,3.31,
+3.49,3.43,3.46,3.40,3.47,3.65,3.41,3.52,3.53,3.70,
+3.54,3.60,3.50,3.58,3.59,3.45,3.69,3.65,3.54,3.57,
+3.69,3.65,3.58,3.79,3.69,3.71,3.79,3.72,3.64,3.81,
+3.49,3.76,3.66,3.84,3.76,3.70,3.87,3.96,3.93,3.82,
+3.85,3.79,3.72,3.94,3.89,3.91,3.88,3.89,3.85,4.07,
+3.91,4.05,4.07,4.04,3.96,4.13,3.98,4.05,4.03,4.06,
+4.07,4.00,4.22,4.05,4.13,4.03,4.27,4.11,4.21,4.22,
+4.09,4.31,4.04,4.17,4.17,4.12,4.25,4.15,4.19,4.18,
+4.17,4.26,4.25,4.14,4.38,4.20,4.39,4.29,4.07,4.13,
+4.36,4.32,4.37,4.22,4.48,4.40,4.45,4.40,4.41,4.24,
+4.50,4.38,4.35,4.45,4.40,4.20,4.48,4.60,4.40,4.63,
+4.31,4.47,4.44,4.61,4.59,4.57,4.66,4.48,4.67,4.61,
+4.53,4.56,4.69,4.54,4.72,4.63,4.68,4.35,4.66,4.70,
+4.58,4.62,4.67,4.71,4.68,4.82,4.63,4.75,4.93,4.67,
+4.82,4.83,4.78,4.69,4.69,4.84,4.65,4.90,4.85,4.78,
+0.89,0.96,0.99,1.02,1.05,1.09,1.15,1.12,1.21,1.24,
+1.25,1.31,1.33,1.34,1.35,1.42,1.44,1.47,1.46,1.42,
+1.53,1.60,1.55,1.55,1.64,1.64,1.69,1.67,1.66,1.75,
+1.76,1.81,1.80,1.85,1.78,1.88,1.91,1.94,1.84,1.89,
+1.98,2.00,1.99,2.00,1.94,2.04,2.13,2.10,2.07,2.12,
+2.15,2.05,2.22,2.26,2.18,2.24,2.13,2.20,2.28,2.31,
+2.38,2.26,2.26,2.39,2.48,2.32,2.44,2.37,2.36,2.35,
+2.42,2.51,2.47,2.44,2.49,2.54,2.52,2.51,2.57,2.52,
+2.61,2.59,2.65,2.74,2.48,2.76,2.64,2.76,2.71,2.68,
+2.68,2.75,2.79,2.82,2.71,2.89,2.74,2.75,2.86,2.79,
+2.79,2.89,2.96,3.03,2.88,2.99,3.00,3.02,2.95,3.06,
+2.90,3.02,3.16,3.04,2.96,3.01,3.22,3.16,3.06,3.09,
+3.12,3.12,3.17,3.09,3.21,3.25,3.12,3.24,3.16,3.09,
+3.29,3.18,3.20,3.28,3.30,3.26,3.34,3.34,3.36,3.30,
+3.47,3.41,3.48,3.40,3.40,3.46,3.33,3.54,3.46,3.52,
+3.54,3.57,3.35,3.50,3.54,3.47,3.44,3.45,3.53,3.45,
+3.51,3.45,3.56,3.60,3.50,3.60,3.58,3.69,3.71,3.62,
+3.60,3.70,3.80,3.68,3.69,3.80,3.75,3.75,3.69,3.85,
+3.87,3.75,3.85,3.75,3.89,3.68,3.80,3.81,3.86,3.99,
+3.90,3.86,3.86,3.74,3.81,3.86,4.11,3.83,3.94,3.93,
+3.95,4.12,4.12,3.92,3.95,4.04,4.06,4.06,4.06,4.08,
+3.99,3.96,3.92,4.16,4.09,4.07,4.15,3.96,4.19,4.28,
+4.14,4.08,4.23,4.20,4.31,4.35,4.30,4.11,4.23,4.06,
+4.27,4.39,4.23,4.40,4.51,4.26,4.31,4.11,4.33,4.30,
+4.36,4.27,4.22,4.35,4.28,4.41,4.35,4.62,4.51,4.28,
+4.22,4.40,4.38,4.45,4.26,4.40,4.56,4.69,4.55,4.33,
+4.52,4.43,4.42,4.61,4.51,4.47,4.37,4.59,4.66,4.68,
+4.43,4.64,4.68,4.59,4.75,4.62,4.58,4.67,4.65,4.73,
+4.69,4.57,4.55,4.87,4.52,4.76,4.64,4.67,4.80,4.51,
+0.89,0.94,0.97,1.00,1.04,1.09,1.12,1.12,1.21,1.17,
+1.24,1.23,1.28,1.32,1.38,1.33,1.39,1.38,1.39,1.40,
+1.51,1.58,1.50,1.56,1.57,1.62,1.59,1.67,1.64,1.68,
+1.67,1.71,1.71,1.76,1.77,1.83,1.84,1.92,1.87,1.98,
+1.98,1.94,1.97,1.96,2.01,1.96,2.00,1.97,2.03,2.09,
+2.05,2.09,2.13,2.23,2.17,2.25,2.17,2.14,2.26,2.28,
+2.26,2.23,2.28,2.33,2.25,2.32,2.36,2.23,2.39,2.28,
+2.43,2.47,2.39,2.42,2.43,2.59,2.50,2.57,2.57,2.50,
+2.60,2.45,2.53,2.60,2.62,2.61,2.63,2.65,2.60,2.65,
+2.66,2.66,2.71,2.67,2.76,2.69,2.72,2.79,2.76,2.77,
+2.78,2.81,2.80,2.73,2.75,2.87,2.91,2.92,2.98,2.98,
+2.88,2.94,3.01,3.00,2.84,3.08,3.04,3.01,3.11,3.21,
+3.04,2.92,3.17,3.09,3.08,2.98,3.15,3.16,3.20,3.11,
+3.13,3.11,3.10,3.25,3.16,3.15,3.06,3.30,3.21,3.19,
+3.16,3.32,3.32,3.25,3.36,3.32,3.37,3.38,3.31,3.32,
+3.32,3.42,3.35,3.34,3.35,3.34,3.31,3.35,3.49,3.51,
+3.41,3.58,3.40,3.50,3.58,3.46,3.62,3.49,3.63,3.64,
+3.59,3.63,3.66,3.67,3.51,3.61,3.70,3.74,3.54,3.73,
+3.75,3.79,3.66,3.68,3.67,3.69,3.77,3.70,3.85,3.68,
+3.67,3.62,3.81,3.81,3.88,3.89,3.80,3.80,3.82,3.97,
+3.99,3.86,3.78,3.91,3.96,3.98,3.87,3.94,3.91,3.89,
+3.86,3.88,3.93,3.93,3.94,3.98,3.89,3.97,4.14,4.00,
+4.06,3.78,4.13,3.99,4.13,4.16,4.14,4.08,4.11,4.08,
+4.16,4.12,4.22,4.06,4.17,3.96,4.14,4.21,4.26,4.13,
+4.33,4.31,4.11,4.17,4.18,4.17,4.30,4.41,4.32,4.20,
+4.22,4.23,4.36,4.44,4.24,4.32,4.47,4.23,4.32,4.40,
+4.46,4.46,4.36,4.49,4.48,4.51,4.37,4.39,4.51,4.47,
+4.42,4.63,4.30,4.53,4.47,4.44,4.53,4.63,4.61,4.58,
+4.76,4.70,4.46,4.61,4.59,4.53,4.63,4.66,4.67,4.68,
+0.87,0.92,0.97,1.00,0.99,1.05,1.06,1.15,1.17,1.15,
+1.19,1.26,1.24,1.30,1.29,1.39,1.37,1.43,1.36,1.43,
+1.48,1.47,1.50,1.51,1.54,1.55,1.56,1.70,1.66,1.63,
+1.62,1.72,1.69,1.77,1.71,1.77,1.75,1.81,1.85,1.88,
+1.87,1.92,1.89,1.83,1.87,1.89,1.96,1.99,1.96,1.98,
+2.03,2.11,2.04,2.09,2.09,2.13,2.03,2.14,2.16,2.24,
+2.25,2.22,2.11,2.26,2.21,2.22,2.27,2.26,2.29,2.30,
+2.27,2.34,2.37,2.38,2.32,2.41,2.40,2.42,2.43,2.43,
+2.38,2.54,2.40,2.46,2.49,2.47,2.55,2.51,2.54,2.72,
+2.65,2.52,2.54,2.55,2.64,2.63,2.69,2.66,2.59,2.68,
+2.68,2.68,2.70,2.79,2.80,2.78,2.78,2.77,2.85,2.73,
+2.86,2.84,2.84,2.87,2.98,2.91,3.00,2.93,2.94,2.98,
+3.05,2.84,3.03,3.02,3.08,2.94,2.93,2.98,3.06,3.05,
+3.04,2.88,3.04,3.16,3.07,3.10,3.14,3.26,3.14,3.16,
+3.08,3.10,3.21,3.05,3.22,3.14,3.11,3.39,3.37,3.25,
+3.47,3.35,3.25,3.40,3.34,3.20,3.35,3.47,3.40,3.41,
+3.35,3.35,3.37,3.31,3.48,3.46,3.31,3.53,3.37,3.50,
+3.55,3.61,3.44,3.44,3.45,3.51,3.43,3.54,3.45,3.57,
+3.61,3.54,3.56,3.58,3.65,3.61,3.50,3.66,3.71,3.55,
+3.55,3.56,3.63,3.77,3.71,3.58,3.82,3.79,3.64,3.73,
+3.79,3.65,3.77,3.82,3.89,3.81,3.78,3.79,3.69,3.91,
+3.84,3.81,3.94,3.89,3.76,3.86,3.97,3.95,4.01,3.89,
+4.03,3.75,3.95,4.02,3.86,4.04,4.08,4.03,4.04,4.19,
+4.08,4.03,4.04,3.96,4.06,3.95,4.16,4.13,3.99,4.06,
+4.09,4.12,4.09,4.20,4.30,4.12,4.21,4.09,4.20,4.26,
+4.13,4.22,4.31,4.19,3.99,4.20,4.20,4.19,4.34,4.19,
+4.21,4.21,4.12,4.32,4.28,4.33,4.35,4.23,4.34,4.18,
+4.39,4.47,4.46,4.42,4.15,4.59,4.28,4.21,4.40,4.30,
+4.23,4.21,4.36,4.36,4.37,4.46,4.54,4.40,4.47,4.54,
+0.85,0.93,0.91,0.92,0.99,1.03,1.05,1.11,1.10,1.12,
+1.15,1.19,1.22,1.29,1.27,1.30,1.32,1.31,1.38,1.41,
+1.40,1.41,1.48,1.49,1.46,1.49,1.51,1.61,1.56,1.53,
+1.64,1.63,1.65,1.68,1.71,1.67,1.69,1.71,1.72,1.79,
+1.82,1.82,1.81,1.75,1.84,1.88,1.91,1.89,1.95,2.07,
+1.97,2.03,1.94,1.94,2.05,2.05,2.04,2.12,2.02,2.11,
+2.13,2.16,2.07,2.11,2.24,2.15,2.33,2.18,2.24,2.31,
+2.28,2.29,2.25,2.32,2.31,2.38,2.35,2.35,2.38,2.41,
+2.35,2.50,2.46,2.50,2.42,2.55,2.56,2.42,2.47,2.53,
+2.47,2.52,2.55,2.64,2.49,2.53,2.57,2.57,2.50,2.65,
+2.68,2.69,2.68,2.66,2.74,2.72,2.72,2.72,2.72,2.75,
+2.76,2.79,2.80,2.81,2.82,2.85,2.84,2.95,2.77,2.90,
+2.86,2.89,2.97,2.97,2.97,2.91,2.98,3.02,2.99,2.78,
+2.99,3.07,3.05,3.01,3.10,2.88,2.93,3.03,3.07,3.01,
+3.07,3.12,3.19,3.21,3.07,3.11,3.06,3.10,3.11,3.21,
+3.21,3.21,3.22,3.25,3.20,3.19,3.30,3.17,3.27,3.21,
+3.28,3.23,3.26,3.30,3.27,3.34,3.40,3.38,3.44,3.39,
+3.33,3.25,3.29,3.40,3.44,3.38,3.30,3.57,3.48,3.41,
+3.49,3.54,3.40,3.48,3.40,3.50,3.45,3.40,3.51,3.47,
+3.50,3.54,3.54,3.62,3.59,3.71,3.65,3.73,3.67,3.45,
+3.67,3.74,3.69,3.63,3.54,3.68,3.69,3.50,3.80,3.68,
+3.71,3.67,3.80,3.83,3.77,3.92,3.71,3.67,3.94,3.86,
+3.73,3.81,3.83,3.99,3.63,3.87,3.91,3.91,3.84,3.78,
+3.84,4.02,3.84,3.85,3.94,3.91,3.77,3.94,4.11,4.03,
+4.02,4.03,3.97,4.04,3.87,4.15,3.87,4.07,4.10,4.06,
+4.05,4.06,3.99,4.10,3.99,3.97,3.94,4.04,4.03,4.00,
+4.10,4.26,4.29,4.08,4.33,4.15,4.19,4.29,4.28,4.08,
+4.26,4.16,4.31,4.17,4.24,4.21,4.23,4.32,4.41,4.14,
+4.21,4.23,4.24,4.40,4.21,4.42,4.26,4.33,4.34,4.12,
+0.82,0.84,0.87,0.93,0.97,0.99,1.02,1.03,1.05,1.07,
+1.14,1.18,1.16,1.20,1.20,1.25,1.23,1.28,1.35,1.36,
+1.36,1.37,1.37,1.43,1.46,1.50,1.51,1.51,1.56,1.49,
+1.56,1.61,1.60,1.67,1.62,1.65,1.64,1.70,1.71,1.70,
+1.80,1.72,1.75,1.68,1.83,1.88,1.82,1.88,1.83,1.92,
+1.89,1.94,1.93,2.00,1.94,2.04,2.04,2.00,2.08,2.02,
+2.09,2.22,2.09,2.14,2.11,2.21,2.10,2.07,2.08,2.13,
+2.18,2.11,2.23,2.17,2.28,2.29,2.24,2.26,2.26,2.27,
+2.32,2.33,2.17,2.46,2.30,2.44,2.53,2.36,2.43,2.33,
+2.48,2.59,2.50,2.49,2.50,2.54,2.62,2.53,2.41,2.57,
+2.60,2.50,2.63,2.52,2.55,2.48,2.69,2.68,2.62,2.59,
+2.74,2.74,2.62,2.68,2.75,2.84,2.73,2.68,2.68,2.87,
+2.71,2.84,2.85,2.78,2.78,2.86,2.74,3.03,2.85,2.85,
+2.97,2.91,2.94,2.93,2.86,2.96,3.00,2.98,2.80,3.06,
+3.03,2.98,3.12,3.06,3.05,3.14,3.03,3.03,2.95,3.22,
+3.05,3.01,3.11,3.20,3.27,3.09,3.24,3.10,3.17,3.19,
+3.23,3.14,3.16,3.29,3.17,3.37,3.28,3.22,3.31,3.28,
+3.34,3.42,3.34,3.30,3.32,3.28,3.37,3.23,3.27,3.38,
+3.42,3.42,3.37,3.45,3.54,3.44,3.38,3.55,3.33,3.42,
+3.34,3.46,3.47,3.52,3.45,3.52,3.49,3.37,3.48,3.42,
+3.53,3.65,3.56,3.65,3.42,3.62,3.54,3.75,3.77,3.64,
+3.68,3.55,3.71,3.77,3.56,3.61,3.68,3.71,3.60,3.58,
+3.69,3.63,3.59,3.62,3.77,3.73,3.76,3.67,3.73,3.78,
+3.71,3.69,3.76,3.84,3.78,3.85,3.98,3.72,3.69,3.97,
+3.78,3.89,3.76,3.80,3.88,3.80,3.84,3.82,3.93,3.98,
+3.97,3.89,4.14,4.09,3.80,3.96,3.90,3.93,4.01,4.06,
+3.99,4.01,3.96,4.08,3.96,4.14,4.09,4.15,4.11,4.02,
+4.18,3.85,4.05,3.91,4.14,3.98,4.14,3.97,4.08,4.24,
+4.12,4.11,4.23,4.23,4.14,4.17,4.24,4.37,4.21,4.07,
+0.78,0.82,0.83,0.90,0.91,0.94,0.97,1.02,1.00,1.03,
+1.11,1.11,1.16,1.12,1.20,1.21,1.22,1.31,1.28,1.27,
+1.30,1.33,1.34,1.35,1.39,1.42,1.41,1.42,1.46,1.40,
+1.54,1.53,1.51,1.64,1.55,1.62,1.61,1.66,1.70,1.59,
+1.66,1.73,1.67,1.75,1.77,1.79,1.82,1.80,1.82,1.83,
+1.87,1.86,1.83,1.88,1.91,1.98,1.93,1.95,1.94,2.01,
+2.01,1.98,2.01,2.03,2.06,2.03,2.02,2.08,2.17,2.05,
+2.12,2.17,2.22,2.15,2.14,2.22,2.13,2.20,2.24,2.13,
+2.31,2.24,2.26,2.25,2.33,2.27,2.32,2.29,2.36,2.36,
+2.33,2.36,2.38,2.41,2.37,2.36,2.33,2.45,2.51,2.50,
+2.54,2.47,2.49,2.41,2.54,2.60,2.54,2.53,2.64,2.62,
+2.59,2.51,2.62,2.62,2.64,2.71,2.68,2.65,2.76,2.59,
+2.71,2.75,2.68,2.63,2.67,2.79,2.76,2.79,2.80,2.72,
+2.77,2.63,2.78,2.82,2.81,2.79,2.92,2.86,2.84,2.84,
+2.89,2.98,3.01,3.01,2.93,2.96,3.04,3.00,2.98,2.93,
+3.01,2.99,2.94,2.94,3.03,3.04,3.05,3.13,2.95,3.05,
+3.05,3.07,3.09,3.04,3.10,3.01,3.05,3.18,3.12,3.24,
+3.09,3.12,3.11,3.08,3.19,3.09,3.26,3.24,3.19,3.36,
+3.22,3.29,3.18,3.29,3.23,3.30,3.33,3.32,3.24,3.33,
+3.37,3.36,3.33,3.22,3.29,3.42,3.36,3.47,3.48,3.36,
+3.49,3.39,3.44,3.38,3.41,3.31,3.52,3.61,3.60,3.53,
+3.39,3.46,3.59,3.51,3.51,3.51,3.36,3.50,3.46,3.55,
+3.62,3.53,3.55,3.46,3.67,3.66,3.59,3.64,3.67,3.63,
+3.65,3.63,3.65,3.67,3.59,3.65,3.80,3.73,3.75,3.80,
+3.71,3.64,3.66,3.80,3.83,3.75,3.73,3.76,3.65,3.79,
+3.89,3.85,3.78,3.80,3.82,3.69,4.02,3.90,4.10,3.93,
+3.87,3.94,3.87,3.87,4.01,3.95,3.98,3.95,3.92,3.82,
+3.97,4.02,3.69,3.98,3.89,3.97,4.06,4.01,4.07,3.97,
+3.98,4.00,4.08,4.20,3.94,3.94,3.97,3.97,4.21,4.32,
+0.75,0.82,0.82,0.86,0.87,0.91,0.95,1.00,1.01,1.06,
+1.03,1.07,1.13,1.13,1.18,1.11,1.16,1.26,1.20,1.26,
+1.28,1.29,1.32,1.31,1.32,1.40,1.44,1.41,1.42,1.43,
+1.42,1.42,1.44,1.52,1.52,1.53,1.57,1.54,1.58,1.60,
+1.63,1.67,1.63,1.63,1.71,1.69,1.70,1.77,1.75,1.66,
+1.77,1.81,1.81,1.75,1.82,1.79,1.83,1.88,1.94,1.85,
+1.90,1.96,1.94,1.87,1.99,1.93,1.95,2.02,2.10,2.10,
+2.08,2.07,2.14,2.13,2.12,2.10,2.12,2.10,2.14,2.17,
+2.22,2.15,2.19,2.23,2.18,2.27,2.27,2.19,2.28,2.26,
+2.29,2.25,2.32,2.29,2.22,2.35,2.35,2.43,2.37,2.41,
+2.35,2.34,2.42,2.37,2.33,2.35,2.38,2.47,2.45,2.45,
+2.51,2.51,2.57,2.44,2.55,2.64,2.57,2.56,2.64,2.44,
+2.60,2.58,2.64,2.59,2.71,2.67,2.67,2.70,2.72,2.75,
+2.66,2.79,2.62,2.81,2.72,2.70,2.73,2.76,2.76,2.82,
+2.79,2.73,2.72,2.89,2.79,2.86,2.89,2.88,2.97,2.85,
+2.80,2.97,2.85,2.88,2.81,2.91,3.02,2.93,2.96,3.03,
+3.00,3.03,3.04,3.13,2.79,3.07,3.01,3.04,2.96,3.04,
+3.02,3.08,3.07,3.10,3.22,2.96,3.08,3.07,3.13,3.19,
+3.00,3.06,3.31,3.07,3.19,3.15,3.10,3.19,3.09,3.16,
+3.30,3.27,3.30,3.26,3.29,3.23,3.36,3.22,3.34,3.56,
+3.31,3.25,3.35,3.44,3.25,3.35,3.51,3.28,3.37,3.38,
+3.37,3.48,3.42,3.52,3.32,3.35,3.28,3.44,3.46,3.50,
+3.48,3.42,3.40,3.55,3.36,3.52,3.51,3.54,3.59,3.55,
+3.54,3.58,3.53,3.46,3.55,3.60,3.50,3.54,3.62,3.59,
+3.59,3.61,3.63,3.60,3.68,3.68,3.64,3.67,3.74,3.68,
+3.63,3.66,3.80,3.75,3.83,3.51,3.71,3.61,3.89,3.57,
+3.78,3.72,3.64,3.70,3.83,3.79,3.84,3.76,3.75,3.75,
+3.78,3.79,3.95,3.70,3.78,3.89,3.66,3.79,3.76,3.83,
+3.91,3.79,4.00,3.87,3.94,3.87,3.93,3.89,3.84,3.95,
+0.75,0.74,0.79,0.84,0.88,0.86,0.86,0.91,0.98,0.99,
+1.02,1.02,1.06,1.08,1.11,1.09,1.16,1.14,1.17,1.18,
+1.21,1.24,1.24,1.25,1.33,1.33,1.34,1.30,1.36,1.37,
+1.39,1.45,1.45,1.45,1.47,1.52,1.46,1.53,1.52,1.55,
+1.54,1.55,1.58,1.60,1.61,1.66,1.70,1.65,1.65,1.68,
+1.73,1.76,1.71,1.76,1.79,1.77,1.79,1.86,1.76,1.83,
+1.80,1.82,1.89,1.92,1.86,1.90,1.90,1.97,2.00,1.83,
+1.98,1.94,2.03,2.00,1.99,1.97,2.05,1.98,2.03,2.13,
+2.16,2.11,2.14,2.11,2.17,2.15,2.16,2.17,2.21,2.20,
+2.17,2.17,2.15,2.21,2.23,2.21,2.20,2.27,2.36,2.28,
+2.29,2.29,2.30,2.27,2.33,2.36,2.29,2.42,2.40,2.41,
+2.37,2.41,2.36,2.46,2.45,2.52,2.52,2.51,2.55,2.41,
+2.51,2.49,2.54,2.52,2.55,2.61,2.55,2.63,2.55,2.66,
+2.62,2.55,2.60,2.61,2.63,2.63,2.61,2.65,2.63,2.73,
+2.71,2.68,2.75,2.65,2.75,2.77,2.81,2.79,2.75,2.65,
+2.72,2.88,2.84,2.81,2.89,2.81,2.75,2.83,2.86,2.76,
+2.83,2.91,2.91,2.83,2.83,2.92,2.90,2.97,2.90,2.87,
+2.80,2.99,2.93,2.96,2.88,3.03,2.95,3.03,2.98,3.02,
+3.10,3.11,3.00,2.97,3.01,3.01,3.14,3.04,2.95,2.94,
+3.01,3.15,3.04,3.10,3.05,3.16,3.15,3.13,3.12,3.07,
+3.14,3.10,3.26,3.23,3.31,3.18,3.30,3.19,3.32,3.31,
+3.35,3.23,3.23,3.34,3.29,3.22,3.23,3.22,3.33,3.35,
+3.37,3.22,3.47,3.45,3.37,3.46,3.33,3.31,3.31,3.25,
+3.27,3.42,3.36,3.24,3.46,3.42,3.37,3.42,3.56,3.43,
+3.59,3.50,3.55,3.58,3.70,3.42,3.65,3.66,3.42,3.54,
+3.55,3.56,3.53,3.49,3.57,3.51,3.48,3.56,3.56,3.49,
+3.69,3.69,3.62,3.69,3.43,3.56,3.68,3.62,3.80,3.80,
+3.71,3.70,3.71,3.65,3.73,3.67,3.73,3.98,3.70,3.68,
+3.88,3.66,3.74,3.86,3.85,3.68,3.64,3.82,3.84,3.81,
+1.05,1.10,1.14,1.17,1.24,1.23,1.27,1.40,1.41,1.45,
+1.45,1.46,1.51,1.52,1.58,1.62,1.59,1.75,1.68,1.70,
+1.82,1.77,1.83,1.87,1.89,1.92,1.89,1.93,1.97,2.03,
+1.90,2.01,2.07,2.09,2.17,2.11,2.22,2.27,2.25,2.17,
+2.35,2.41,2.34,2.26,2.30,2.41,2.36,2.35,2.42,2.49,
+2.50,2.52,2.49,2.37,2.54,2.50,2.63,2.72,2.56,2.64,
+2.72,2.61,2.67,2.83,2.77,2.80,2.84,2.90,2.86,2.91,
+2.92,2.88,2.97,2.88,2.77,2.98,3.00,2.98,3.01,3.04,
+3.00,2.90,3.11,3.06,3.05,3.09,3.17,3.07,3.19,3.16,
+3.16,3.26,3.13,3.19,3.38,3.21,3.24,3.29,3.26,3.27,
+3.25,3.27,3.37,3.21,3.25,3.33,3.35,3.38,3.47,3.41,
+3.47,3.50,3.53,3.56,3.69,3.40,3.58,3.64,3.69,3.53,
+3.65,3.59,3.68,3.63,3.61,3.74,3.66,3.72,3.88,3.75,
+3.71,3.57,3.68,3.89,3.71,3.91,3.94,3.80,4.05,4.00,
+3.90,3.89,3.92,4.07,4.04,4.03,3.90,3.94,3.93,3.86,
+4.05,4.10,4.01,3.99,3.92,4.02,4.09,4.06,4.09,4.18,
+4.12,4.07,4.26,4.14,4.39,4.28,4.24,4.18,4.27,4.17,
+4.05,4.25,4.25,4.15,4.18,4.23,4.35,4.45,4.30,4.36,
+4.27,4.27,4.32,4.51,4.46,4.44,4.42,4.46,4.38,4.53,
+4.48,4.39,4.81,4.54,4.66,4.46,4.51,4.50,4.58,4.52,
+4.57,4.58,4.76,4.61,4.84,4.73,4.53,4.86,4.64,4.70,
+4.64,4.72,4.92,4.64,5.01,4.65,4.76,4.80,4.84,4.84,
+4.77,4.82,4.84,4.74,4.73,5.08,4.73,4.73,4.92,4.95,
+4.98,4.91,4.83,4.75,4.96,5.05,4.98,5.08,4.96,4.99,
+5.06,5.18,5.13,5.03,5.22,5.12,5.30,5.25,5.26,5.26,
+5.12,4.89,5.35,5.12,5.22,5.30,5.25,5.19,5.31,5.18,
+5.10,5.21,5.25,5.13,5.29,5.39,5.31,5.34,5.16,5.09,
+5.45,5.34,5.19,5.42,5.23,5.18,5.38,5.22,5.42,5.40,
+5.29,5.54,5.50,5.22,5.40,5.48,5.39,5.66,5.52,5.48,
+1.01,1.07,1.08,1.12,1.22,1.22,1.31,1.28,1.33,1.35,
+1.41,1.42,1.47,1.50,1.51,1.57,1.58,1.65,1.63,1.69,
+1.67,1.71,1.73,1.78,1.84,1.81,1.84,1.89,1.98,1.92,
+1.96,2.02,1.96,2.07,2.06,2.04,2.11,2.04,2.10,2.14,
+2.17,2.16,2.26,2.35,2.21,2.22,2.31,2.33,2.36,2.24,
+2.38,2.45,2.50,2.37,2.36,2.45,2.51,2.63,2.51,2.63,
+2.58,2.60,2.58,2.51,2.69,2.63,2.79,2.61,2.67,2.65,
+2.64,2.82,2.74,2.90,2.76,2.71,2.80,2.91,2.78,2.87,
+2.92,2.92,2.93,2.91,2.91,2.94,2.96,3.03,3.02,3.11,
+3.11,3.13,2.96,3.09,3.08,3.14,3.12,3.22,3.09,3.19,
+3.28,3.13,3.23,3.30,3.21,3.33,3.35,3.31,3.31,3.26,
+3.29,3.38,3.51,3.35,3.30,3.45,3.51,3.43,3.50,3.36,
+3.43,3.50,3.47,3.56,3.61,3.50,3.62,3.73,3.48,3.66,
+3.54,3.61,3.65,3.70,3.66,3.83,3.71,3.73,3.76,3.66,
+3.80,3.69,3.59,3.79,3.69,3.80,3.86,3.71,3.85,3.72,
+3.88,3.86,3.82,3.88,3.87,4.04,3.95,4.04,3.95,3.95,
+3.93,3.88,3.76,4.06,3.96,4.05,4.07,3.95,4.14,4.02,
+4.03,4.28,4.14,4.02,4.21,4.01,4.20,4.23,4.07,4.12,
+3.94,4.24,4.12,4.25,4.23,4.22,4.27,4.14,4.27,4.41,
+4.18,4.45,4.39,4.14,4.38,4.38,4.36,4.44,4.39,4.20,
+4.46,4.41,4.45,4.52,4.50,4.27,4.53,4.22,4.55,4.58,
+4.71,4.67,4.53,4.63,4.57,4.55,4.55,4.51,4.68,4.55,
+4.54,4.56,4.85,4.68,4.84,4.83,4.74,4.63,4.67,4.62,
+4.61,4.69,4.81,4.79,4.82,4.93,4.73,4.74,4.90,4.95,
+4.73,4.89,4.91,4.95,4.82,4.98,5.00,4.92,4.88,4.87,
+4.90,5.00,4.95,4.99,4.95,4.88,5.12,4.94,5.09,5.00,
+5.04,4.97,5.11,5.12,4.96,5.27,5.11,4.95,5.05,5.27,
+5.09,5.23,5.04,5.06,5.17,5.06,5.04,5.05,5.11,5.26,
+5.05,5.25,5.15,5.31,5.15,5.26,5.29,5.35,5.28,5.35,
+0.96,1.00,1.08,1.13,1.14,1.16,1.21,1.24,1.27,1.34,
+1.39,1.40,1.39,1.44,1.49,1.51,1.52,1.54,1.57,1.64,
+1.66,1.67,1.68,1.74,1.74,1.79,1.78,1.82,1.88,1.89,
+1.95,1.92,1.91,1.97,1.97,1.95,2.03,2.07,2.13,2.12,
+2.16,2.15,2.22,2.16,2.16,2.27,2.24,2.30,2.24,2.23,
+2.29,2.33,2.31,2.45,2.43,2.45,2.44,2.40,2.46,2.47,
+2.57,2.49,2.50,2.50,2.48,2.56,2.56,2.59,2.59,2.66,
+2.77,2.74,2.64,2.56,2.79,2.70,2.79,2.69,2.86,2.77,
+2.71,2.77,2.81,2.79,2.71,2.85,2.90,2.89,2.91,2.90,
+3.03,2.93,2.94,3.02,3.07,3.03,3.10,3.04,3.10,3.11,
+3.12,3.11,2.89,3.24,3.10,3.22,3.21,3.14,3.24,3.21,
+3.24,3.29,3.23,3.44,3.33,3.23,3.39,3.35,3.42,3.26,
+3.30,3.49,3.47,3.35,3.37,3.41,3.37,3.40,3.38,3.45,
+3.44,3.47,3.52,3.50,3.64,3.46,3.59,3.57,3.69,3.65,
+3.58,3.60,3.61,3.86,3.64,3.57,3.77,3.77,3.58,3.66,
+3.76,3.71,3.73,3.86,3.73,3.93,3.79,3.79,3.77,3.80,
+3.84,3.93,3.80,3.82,3.84,3.84,3.91,4.14,3.83,4.09,
+4.08,4.05,4.06,4.16,4.07,4.02,4.07,4.16,4.00,4.09,
+4.00,4.09,4.14,4.11,4.26,4.09,4.24,4.09,4.04,4.20,
+4.20,4.27,4.28,4.02,4.37,4.02,4.25,4.29,4.30,4.21,
+4.26,4.27,4.32,4.29,4.20,4.38,4.33,4.40,4.46,4.45,
+4.42,4.53,4.33,4.47,4.55,4.37,4.55,4.49,4.28,4.54,
+4.54,4.29,4.45,4.51,4.48,4.60,4.35,4.55,4.49,4.43,
+4.49,4.37,4.66,4.56,4.71,4.76,4.89,4.61,4.64,4.58,
+4.68,4.57,4.61,4.55,4.68,4.86,4.74,4.77,4.72,4.76,
+4.66,4.65,4.67,4.77,4.83,4.76,4.66,4.70,5.04,4.70,
+4.85,4.80,4.96,4.67,4.97,4.90,4.77,4.89,4.76,4.85,
+4.92,4.98,4.93,5.06,4.94,5.03,4.94,5.04,5.01,5.01,
+4.97,4.91,5.12,4.93,5.00,5.05,5.03,4.91,5.07,5.11,
+0.98,1.01,1.08,1.06,1.13,1.18,1.18,1.21,1.22,1.31,
+1.35,1.36,1.39,1.42,1.46,1.47,1.55,1.59,1.52,1.59,
+1.56,1.65,1.73,1.59,1.67,1.72,1.75,1.83,1.78,1.81,
+1.89,1.87,1.90,1.93,1.97,1.99,1.94,2.08,2.02,2.00,
+2.09,2.15,2.13,2.16,2.10,2.10,2.17,2.21,2.16,2.22,
+2.30,2.27,2.28,2.20,2.33,2.42,2.42,2.31,2.38,2.36,
+2.41,2.48,2.50,2.45,2.54,2.45,2.58,2.52,2.47,2.52,
+2.60,2.56,2.56,2.70,2.55,2.74,2.68,2.76,2.84,2.78,
+2.82,2.68,2.86,2.78,2.93,2.75,2.80,2.89,3.00,2.94,
+2.94,2.92,3.00,2.98,3.02,2.99,2.96,2.94,3.06,2.92,
+2.99,3.02,3.09,3.06,3.05,3.20,3.14,3.21,3.20,3.22,
+3.15,3.23,3.17,3.10,3.27,3.18,3.19,3.22,3.16,3.24,
+3.20,3.42,3.44,3.42,3.51,3.48,3.40,3.32,3.41,3.42,
+3.53,3.47,3.43,3.48,3.53,3.40,3.44,3.39,3.57,3.62,
+3.49,3.57,3.67,3.48,3.44,3.45,3.57,3.62,3.57,3.71,
+3.60,3.69,3.62,3.76,3.65,3.84,3.73,3.63,3.78,3.73,
+3.84,3.73,3.99,3.74,3.89,3.90,3.75,3.71,3.82,3.99,
+3.84,3.77,3.92,4.00,3.83,3.91,3.93,3.92,3.78,4.06,
+3.82,3.95,3.96,4.12,4.00,3.91,4.02,4.00,4.11,3.92,
+4.14,4.17,3.92,4.08,4.08,4.08,4.04,4.07,4.07,4.07,
+4.01,4.21,4.22,4.35,4.03,4.17,4.22,4.44,4.22,4.29,
+4.30,4.28,4.29,4.23,4.48,4.44,4.29,4.39,4.45,4.23,
+4.59,4.41,4.38,4.38,4.49,4.62,4.30,4.31,4.57,4.55,
+4.55,4.34,4.52,4.67,4.47,4.49,4.49,4.53,4.45,4.52,
+4.46,4.62,4.45,4.48,4.62,4.60,4.52,4.51,4.54,4.51,
+4.79,4.72,4.68,4.76,4.72,4.73,4.62,4.86,4.71,4.64,
+4.60,4.76,4.87,4.84,4.69,4.76,4.80,4.69,4.71,4.92,
+4.84,4.96,4.75,4.90,4.75,4.76,5.01,4.86,4.87,4.93,
+4.91,5.02,5.20,5.07,4.84,5.07,4.91,4.74,4.82,5.06,
+1.04,0.99,1.04,1.08,1.13,1.14,1.11,1.23,1.22,1.30,
+1.35,1.31,1.39,1.40,1.44,1.42,1.46,1.52,1.54,1.56,
+1.60,1.66,1.61,1.62,1.66,1.67,1.74,1.78,1.76,1.78,
+1.85,1.83,1.90,1.94,1.84,1.93,1.90,1.95,1.95,1.97,
+2.03,2.00,2.05,2.03,2.09,2.06,2.13,2.11,2.28,2.24,
+2.26,2.23,2.17,2.24,2.27,2.28,2.34,2.27,2.24,2.32,
+2.42,2.38,2.38,2.34,2.48,2.44,2.48,2.52,2.61,2.51,
+2.49,2.53,2.55,2.65,2.68,2.66,2.67,2.71,2.68,2.67,
+2.67,2.68,2.75,2.68,2.78,2.71,2.86,2.87,2.84,2.80,
+2.73,2.82,2.87,2.90,2.97,2.88,2.93,3.01,2.95,2.97,
+3.02,2.81,2.94,3.01,3.09,3.07,3.00,2.98,3.09,3.12,
+3.12,2.99,2.99,3.08,3.13,3.18,3.08,3.08,3.24,3.29,
+3.26,3.36,3.23,3.19,3.46,3.33,3.24,3.28,3.39,3.31,
+3.40,3.40,3.46,3.42,3.37,3.32,3.42,3.43,3.25,3.37,
+3.53,3.53,3.57,3.61,3.55,3.52,3.60,3.43,3.54,3.49,
+3.51,3.42,3.60,3.45,3.62,3.54,3.59,3.59,3.69,3.70,
+3.58,3.63,3.75,3.63,3.64,3.78,3.77,3.80,3.88,3.75,
+3.88,3.83,3.58,3.66,3.84,3.81,3.75,3.77,3.92,3.94,
+3.94,3.97,3.97,3.99,3.82,3.90,3.91,4.07,4.10,3.75,
+4.03,4.05,4.07,4.02,3.93,4.14,4.16,3.97,4.11,3.94,
+3.94,4.17,4.04,4.09,4.08,4.35,4.06,4.11,4.22,4.06,
+4.13,4.11,4.26,4.10,4.21,4.47,4.24,4.17,4.17,4.40,
+4.36,4.46,4.38,4.35,4.32,4.17,4.33,4.50,4.30,4.40,
+4.38,4.44,4.33,4.21,4.52,4.41,4.46,4.35,4.39,4.50,
+4.40,4.43,4.47,4.58,4.57,4.34,4.56,4.57,4.61,4.61,
+4.57,4.62,4.48,4.44,4.47,4.65,4.67,4.61,4.67,4.68,
+4.67,4.50,4.80,4.71,4.57,4.59,4.80,4.72,4.66,4.83,
+4.67,4.71,4.77,4.73,4.57,4.70,4.79,4.86,4.83,4.90,
+4.94,4.85,4.84,4.92,4.99,4.93,4.83,5.01,4.98,4.84,
+0.94,0.97,1.02,1.05,1.14,1.12,1.17,1.16,1.22,1.29,
+1.27,1.34,1.34,1.38,1.36,1.36,1.42,1.56,1.56,1.57,
+1.58,1.63,1.59,1.63,1.59,1.63,1.71,1.71,1.75,1.70,
+1.72,1.78,1.82,1.86,1.90,1.88,1.89,1.92,1.99,1.99,
+2.01,2.06,2.02,1.98,2.09,1.97,2.13,2.08,2.06,2.19,
+2.15,2.25,2.27,2.25,2.29,2.18,2.32,2.27,2.31,2.45,
+2.29,2.29,2.43,2.35,2.41,2.39,2.61,2.38,2.47,2.41,
+2.61,2.54,2.51,2.57,2.59,2.57,2.50,2.60,2.60,2.68,
+2.61,2.63,2.63,2.77,2.70,2.74,2.85,2.90,2.77,2.70,
+2.83,2.80,2.89,2.74,2.93,2.94,2.83,2.94,2.94,2.91,
+2.99,2.89,2.91,2.93,2.91,3.01,3.10,3.05,3.07,3.01,
+2.99,2.99,3.10,3.14,3.00,3.10,3.10,3.09,3.00,3.21,
+3.19,3.14,3.29,3.14,3.25,3.26,3.25,3.17,3.28,3.29,
+3.21,3.32,3.39,3.44,3.43,3.36,3.31,3.46,3.37,3.21,
+3.46,3.38,3.48,3.62,3.38,3.46,3.37,3.38,3.53,3.47,
+3.58,3.46,3.56,3.62,3.53,3.55,3.54,3.54,3.65,3.55,
+3.57,3.77,3.63,3.58,3.71,3.54,3.71,3.60,3.80,3.66,
+3.68,3.80,3.68,3.79,3.73,3.81,3.71,3.82,3.72,3.88,
+3.84,3.81,3.95,3.96,3.99,3.97,3.79,3.95,3.87,3.96,
+3.95,4.04,3.89,3.99,3.92,3.96,4.07,4.15,4.02,4.02,
+3.98,4.08,4.15,4.04,3.91,3.98,4.02,4.08,4.01,4.33,
+4.16,4.32,4.26,4.26,4.11,4.15,4.16,4.26,4.22,4.21,
+4.29,4.29,4.25,4.38,4.41,4.31,4.33,4.24,4.24,4.22,
+4.08,4.40,4.55,4.42,4.24,4.47,4.52,4.33,4.37,4.54,
+4.29,4.43,4.28,4.47,4.49,4.43,4.40,4.41,4.55,4.41,
+4.55,4.42,4.44,4.48,4.44,4.56,4.52,4.57,4.40,4.56,
+4.64,4.37,4.62,4.50,4.43,4.54,4.73,4.71,4.51,4.78,
+4.73,4.69,4.80,4.67,4.71,4.69,4.79,4.43,4.74,4.69,
+4.67,4.80,4.75,4.58,4.65,4.76,4.89,4.79,4.90,4.60,
+0.92,0.99,0.99,1.06,1.06,1.14,1.17,1.12,1.22,1.26,
+1.32,1.33,1.36,1.35,1.39,1.43,1.40,1.43,1.48,1.58,
+1.52,1.47,1.59,1.62,1.70,1.59,1.70,1.71,1.65,1.72,
+1.72,1.76,1.78,1.88,1.90,1.83,1.93,1.98,1.91,1.94,
+1.93,1.90,1.97,1.99,1.99,2.01,2.11,2.08,2.05,2.06,
+2.16,2.21,2.15,2.18,2.26,2.27,2.30,2.27,2.24,2.33,
+2.31,2.30,2.33,2.34,2.37,2.34,2.32,2.48,2.47,2.47,
+2.57,2.48,2.58,2.50,2.50,2.57,2.55,2.56,2.55,2.59,
+2.61,2.66,2.63,2.65,2.59,2.81,2.77,2.77,2.66,2.66,
+2.68,2.86,2.82,2.83,2.91,2.77,2.84,2.87,2.84,2.97,
+2.80,2.79,2.86,3.02,2.95,2.99,2.90,3.02,2.97,2.95,
+2.90,2.99,2.94,2.94,2.99,3.16,3.12,3.13,3.06,3.10,
+3.14,3.10,3.06,3.24,3.34,3.19,3.08,3.26,3.22,3.22,
+3.21,3.22,3.10,3.28,3.34,3.25,3.34,3.40,3.27,3.23,
+3.28,3.32,3.44,3.35,3.45,3.45,3.41,3.49,3.40,3.49,
+3.48,3.34,3.49,3.64,3.48,3.59,3.58,3.49,3.43,3.40,
+3.57,3.71,3.57,3.64,3.64,3.64,3.61,3.72,3.76,3.47,
+3.63,3.60,3.77,3.73,3.72,3.83,3.81,3.78,3.80,3.70,
+3.84,3.81,3.77,3.94,3.82,3.67,3.89,3.92,3.84,4.00,
+3.92,3.77,3.89,3.75,3.94,3.85,3.81,3.86,3.93,4.00,
+4.08,3.98,3.98,4.03,3.95,4.02,4.09,3.99,3.92,3.90,
+3.97,4.03,4.17,4.03,4.17,4.08,4.14,4.07,4.07,4.17,
+4.13,4.21,4.18,4.20,4.29,4.30,4.28,4.19,4.26,4.15,
+4.21,4.24,4.23,4.24,4.14,4.33,4.24,4.45,4.33,4.10,
+4.44,4.23,4.34,4.44,4.36,4.37,4.29,4.30,4.35,4.12,
+4.45,4.43,4.38,4.37,4.48,4.45,4.38,4.54,4.51,4.41,
+4.55,4.41,4.55,4.44,4.59,4.36,4.71,4.50,4.66,4.44,
+4.40,4.63,4.48,4.52,4.67,4.43,4.43,4.55,4.68,4.64,
+4.68,4.79,4.80,4.67,4.82,4.64,4.63,4.62,4.55,4.72,
+0.91,0.99,0.99,1.06,1.07,1.06,1.15,1.10,1.18,1.24,
+1.24,1.27,1.32,1.37,1.35,1.33,1.43,1.46,1.44,1.55,
+1.52,1.50,1.64,1.56,1.66,1.66,1.58,1.67,1.62,1.72,
+1.71,1.77,1.77,1.76,1.92,1.80,1.87,1.84,1.86,1.92,
+1.89,1.93,2.03,1.97,2.02,1.97,2.02,1.98,2.05,2.07,
+2.07,2.10,2.23,2.21,2.17,2.16,2.25,2.20,2.19,2.21,
+2.24,2.26,2.31,2.22,2.35,2.29,2.35,2.37,2.48,2.47,
+2.33,2.44,2.42,2.50,2.44,2.50,2.68,2.50,2.50,2.57,
+2.51,2.66,2.63,2.58,2.54,2.66,2.63,2.71,2.61,2.81,
+2.79,2.67,2.68,2.56,2.76,2.66,2.74,2.71,2.71,2.74,
+2.90,2.93,2.90,2.97,2.76,2.80,2.95,2.87,2.88,2.86,
+2.81,3.12,2.90,2.96,3.07,3.05,3.04,3.01,2.99,3.09,
+2.96,3.09,3.09,3.19,3.05,3.28,3.24,3.15,3.09,3.06,
+3.19,3.17,3.19,3.25,3.32,3.19,3.20,3.21,3.26,3.29,
+3.29,3.48,3.49,3.23,3.38,3.42,3.43,3.40,3.42,3.30,
+3.35,3.34,3.45,3.58,3.55,3.44,3.29,3.44,3.52,3.55,
+3.54,3.36,3.46,3.55,3.69,3.54,3.52,3.75,3.59,3.71,
+3.69,3.61,3.64,3.75,3.40,3.58,3.65,3.53,3.59,3.70,
+3.77,3.64,3.76,3.70,3.82,3.78,3.71,3.66,3.66,3.81,
+3.76,3.82,3.90,3.73,3.90,3.89,4.05,3.77,4.03,3.87,
+3.86,4.04,3.81,4.07,4.02,4.04,3.81,3.97,4.09,3.82,
+4.02,4.09,3.99,3.92,3.97,4.11,3.89,4.07,4.02,4.03,
+4.24,4.08,4.14,4.09,4.12,4.15,4.11,4.08,4.11,4.26,
+4.19,4.16,4.14,4.22,4.22,4.19,4.23,4.16,4.28,4.12,
+4.27,4.26,4.27,4.21,4.37,4.28,4.44,4.37,4.26,4.34,
+4.24,4.29,4.41,4.27,4.48,4.37,4.42,4.36,4.27,4.44,
+4.57,4.41,4.28,4.42,4.31,4.41,4.44,4.46,4.44,4.52,
+4.38,4.53,4.30,4.66,4.60,4.46,4.60,4.58,4.60,4.50,
+4.76,4.76,4.56,4.42,4.57,4.79,4.49,4.74,4.75,4.75,
+0.89,0.91,0.99,1.00,1.05,1.07,1.12,1.15,1.15,1.19,
+1.27,1.26,1.30,1.30,1.36,1.36,1.38,1.43,1.46,1.46,
+1.49,1.50,1.57,1.55,1.57,1.59,1.63,1.67,1.72,1.66,
+1.67,1.71,1.73,1.71,1.78,1.87,1.82,1.83,1.83,1.76,
+1.79,1.92,1.92,1.99,1.97,1.91,1.91,1.98,2.05,2.05,
+2.05,2.15,2.11,2.15,2.08,2.09,2.12,2.17,2.18,2.19,
+2.19,2.28,2.16,2.26,2.21,2.26,2.29,2.23,2.30,2.36,
+2.43,2.37,2.36,2.35,2.42,2.49,2.46,2.45,2.52,2.54,
+2.48,2.47,2.45,2.61,2.63,2.53,2.61,2.54,2.56,2.64,
+2.66,2.63,2.68,2.70,2.70,2.65,2.79,2.71,2.83,2.80,
+2.67,2.77,2.81,2.82,2.82,2.80,2.95,2.87,2.92,2.91,
+2.98,2.86,2.87,2.91,2.92,2.86,3.00,2.97,2.94,2.95,
+3.13,3.01,3.01,3.01,3.09,3.15,3.05,3.09,3.14,3.11,
+3.23,3.12,3.22,3.13,3.08,3.25,3.22,3.15,3.17,3.20,
+3.21,3.23,3.30,3.19,3.30,3.16,3.44,3.18,3.34,3.25,
+3.28,3.35,3.46,3.36,3.45,3.42,3.33,3.35,3.40,3.58,
+3.51,3.42,3.54,3.41,3.46,3.44,3.50,3.58,3.34,3.54,
+3.59,3.48,3.59,3.41,3.58,3.58,3.63,3.44,3.58,3.55,
+3.73,3.52,3.66,3.66,3.47,3.58,3.70,3.68,3.67,3.70,
+3.88,3.92,3.67,3.73,3.65,3.71,3.70,3.64,3.76,3.71,
+3.76,3.93,3.82,3.74,3.86,3.80,3.94,3.80,3.94,3.84,
+3.80,3.88,3.93,4.00,4.00,4.15,4.02,4.01,3.88,3.96,
+3.92,3.87,4.07,4.10,4.13,3.97,4.09,4.05,4.17,4.25,
+3.99,4.13,4.22,4.13,4.18,4.03,4.23,4.21,4.16,4.14,
+4.13,4.18,4.27,4.28,4.18,4.14,4.30,4.04,4.12,4.43,
+4.24,4.12,4.26,4.35,4.29,4.29,4.37,4.16,4.28,4.35,
+4.35,4.38,4.19,4.56,4.29,4.22,4.31,4.49,4.54,4.41,
+4.30,4.42,4.39,4.44,4.30,4.21,4.39,4.53,4.49,4.46,
+4.53,4.48,4.48,4.61,4.55,4.39,4.50,4.34,4.68,4.60,
+0.87,0.93,0.98,0.98,1.04,1.01,1.09,1.08,1.16,1.15,
+1.24,1.24,1.25,1.30,1.31,1.31,1.39,1.33,1.37,1.46,
+1.46,1.43,1.59,1.50,1.49,1.60,1.59,1.67,1.66,1.65,
+1.62,1.70,1.71,1.69,1.75,1.79,1.78,1.72,1.84,1.82,
+1.84,1.83,1.80,1.89,1.89,1.92,1.96,2.03,2.04,2.01,
+1.92,1.95,2.03,2.05,2.11,2.11,2.18,2.09,2.18,2.06,
+2.15,2.20,2.27,2.18,2.21,2.24,2.38,2.19,2.34,2.30,
+2.31,2.38,2.40,2.27,2.32,2.46,2.31,2.44,2.52,2.44,
+2.40,2.45,2.48,2.40,2.50,2.52,2.46,2.57,2.72,2.55,
+2.57,2.61,2.58,2.59,2.63,2.62,2.66,2.64,2.65,2.66,
+2.75,2.70,2.77,2.79,2.81,2.75,2.78,2.83,2.91,2.75,
+2.85,2.72,2.84,2.90,2.89,2.86,2.73,2.96,3.01,2.96,
+2.93,2.96,3.02,2.89,3.02,3.07,2.99,3.06,3.05,3.03,
+3.01,3.13,3.00,3.13,3.22,3.16,3.14,3.15,3.12,3.10,
+3.13,2.99,3.37,3.31,3.20,3.14,3.23,3.18,3.30,3.25,
+3.16,3.40,3.35,3.39,3.18,3.32,3.29,3.34,3.43,3.37,
+3.26,3.36,3.44,3.33,3.41,3.43,3.56,3.48,3.48,3.53,
+3.34,3.47,3.39,3.48,3.29,3.47,3.55,3.66,3.56,3.58,
+3.58,3.56,3.51,3.59,3.63,3.59,3.61,3.84,3.68,3.70,
+3.70,3.72,3.81,3.70,3.80,3.62,3.79,3.76,3.76,3.80,
+3.71,3.77,3.77,3.78,3.77,3.57,3.67,3.86,3.57,3.82,
+3.94,3.84,3.80,3.86,3.85,4.02,3.70,3.79,4.05,3.88,
+3.81,3.99,3.99,4.03,3.98,3.99,4.05,3.97,3.97,3.86,
+3.96,4.24,4.03,4.19,3.98,4.03,3.99,4.00,4.09,4.02,
+3.97,4.02,4.12,4.19,4.12,4.11,4.04,4.26,4.14,3.99,
+4.17,4.12,4.30,4.17,4.10,4.17,4.35,4.23,4.10,4.18,
+4.33,4.26,4.20,4.40,4.34,4.45,4.16,4.14,4.34,4.24,
+4.38,4.46,4.19,4.36,4.49,4.48,4.27,4.37,4.37,4.45,
+4.51,4.26,4.35,4.32,4.51,4.43,4.43,4.47,4.40,4.34,
+0.88,0.88,0.93,0.96,1.00,1.02,1.08,1.10,1.09,1.14,
+1.15,1.20,1.23,1.28,1.26,1.33,1.30,1.38,1.35,1.38,
+1.39,1.46,1.51,1.54,1.47,1.55,1.50,1.59,1.60,1.59,
+1.61,1.64,1.68,1.61,1.72,1.70,1.76,1.71,1.75,1.79,
+1.82,1.82,1.79,1.80,1.89,1.86,1.96,1.87,1.91,1.94,
+1.99,2.01,1.99,2.01,1.99,2.06,2.10,2.07,2.11,2.15,
+2.13,2.19,2.04,2.17,2.28,2.22,2.19,2.30,2.22,2.30,
+2.30,2.28,2.38,2.31,2.41,2.32,2.33,2.39,2.43,2.41,
+2.44,2.40,2.47,2.44,2.50,2.47,2.40,2.41,2.44,2.54,
+2.45,2.54,2.57,2.67,2.51,2.57,2.57,2.57,2.64,2.73,
+2.67,2.66,2.61,2.72,2.76,2.73,2.78,2.76,2.81,2.90,
+2.85,2.65,2.70,2.82,2.79,2.90,2.91,2.90,2.80,2.88,
+2.92,2.87,2.88,2.90,2.79,2.99,2.95,3.00,3.05,3.05,
+3.12,3.06,2.96,3.03,3.06,3.14,2.98,3.19,2.93,3.03,
+2.99,3.10,3.16,3.07,3.13,3.20,3.18,3.12,3.30,3.13,
+3.08,3.19,3.22,3.26,3.15,3.18,3.23,3.33,3.37,3.46,
+3.26,3.35,3.39,3.36,3.46,3.35,3.46,3.43,3.35,3.45,
+3.30,3.33,3.32,3.41,3.37,3.56,3.37,3.42,3.41,3.43,
+3.60,3.48,3.60,3.53,3.49,3.53,3.50,3.57,3.53,3.55,
+3.78,3.68,3.54,3.44,3.65,3.58,3.68,3.67,3.54,3.62,
+3.58,3.69,3.64,3.82,3.61,3.78,3.80,3.74,3.83,3.79,
+3.90,3.82,3.81,3.75,3.79,3.69,3.74,3.91,3.68,3.84,
+3.87,3.94,3.89,3.91,3.84,4.08,4.00,3.87,3.87,4.06,
+3.90,3.83,3.91,3.89,3.93,3.88,3.86,4.02,3.93,3.95,
+4.12,3.91,3.88,3.99,4.04,4.19,4.05,4.25,4.09,4.14,
+3.90,4.08,4.18,4.06,4.12,4.14,4.18,4.10,4.10,4.24,
+4.11,4.25,4.30,4.32,4.13,4.22,4.31,4.13,4.36,4.32,
+4.26,4.29,4.18,4.19,4.27,4.25,4.23,4.27,4.38,4.37,
+4.38,4.23,4.45,4.39,4.31,4.31,4.23,4.28,4.39,4.21,
+0.85,0.85,0.93,0.90,0.96,1.00,1.01,1.05,1.10,1.13,
+1.14,1.18,1.21,1.22,1.25,1.25,1.33,1.38,1.30,1.33,
+1.43,1.40,1.45,1.42,1.45,1.48,1.51,1.58,1.55,1.64,
+1.58,1.61,1.60,1.63,1.69,1.70,1.71,1.72,1.69,1.81,
+1.75,1.79,1.82,1.80,1.83,1.88,1.84,1.82,1.88,1.95,
+1.93,2.04,2.03,2.00,2.02,2.06,2.00,2.00,2.06,2.01,
+1.96,2.10,2.07,2.11,2.20,2.13,2.24,2.28,2.22,2.26,
+2.22,2.17,2.17,2.33,2.30,2.29,2.29,2.31,2.31,2.30,
+2.38,2.34,2.34,2.30,2.44,2.42,2.47,2.42,2.45,2.51,
+2.43,2.52,2.43,2.59,2.53,2.62,2.53,2.57,2.47,2.61,
+2.46,2.64,2.63,2.54,2.62,2.60,2.73,2.71,2.76,2.75,
+2.78,2.77,2.70,2.80,2.75,2.69,2.85,2.82,2.76,2.82,
+2.85,2.93,2.84,2.88,2.89,2.77,2.89,2.89,2.94,2.92,
+2.97,2.98,2.97,2.98,3.00,2.97,3.05,3.01,3.03,3.16,
+3.00,3.04,3.03,3.08,2.98,3.00,3.02,3.02,3.07,3.09,
+3.02,3.15,3.20,3.17,3.10,3.16,3.19,3.18,3.24,3.22,
+3.30,3.25,3.30,3.24,3.32,3.20,3.28,3.25,3.33,3.20,
+3.28,3.36,3.31,3.34,3.32,3.35,3.47,3.37,3.39,3.45,
+3.50,3.45,3.39,3.37,3.50,3.50,3.33,3.49,3.53,3.53,
+3.53,3.36,3.46,3.74,3.60,3.63,3.45,3.49,3.54,3.44,
+3.54,3.61,3.55,3.62,3.58,3.53,3.53,3.55,3.78,3.56,
+3.73,3.64,3.73,3.83,3.56,3.78,3.84,3.72,3.77,3.71,
+3.72,3.76,3.80,3.84,3.80,3.77,3.73,3.71,3.94,3.92,
+3.76,3.83,3.75,3.84,3.87,3.88,3.83,3.90,3.94,3.85,
+3.82,3.75,4.15,3.91,3.87,3.95,3.85,3.94,4.03,3.75,
+3.98,4.05,4.02,3.90,4.04,4.16,4.11,4.00,4.17,4.06,
+4.07,4.09,4.07,4.25,3.99,4.10,4.13,3.99,4.16,4.13,
+4.04,4.09,4.29,4.08,4.11,4.07,4.25,4.11,4.26,4.07,
+4.17,4.16,4.14,4.28,4.27,4.24,4.26,4.21,4.19,4.26,
+0.84,0.86,0.89,0.90,0.96,0.97,1.00,1.06,1.02,1.08,
+1.11,1.15,1.10,1.18,1.18,1.24,1.30,1.32,1.27,1.36,
+1.37,1.40,1.41,1.43,1.42,1.46,1.43,1.48,1.55,1.50,
+1.56,1.59,1.60,1.55,1.62,1.67,1.63,1.63,1.75,1.73,
+1.74,1.75,1.73,1.77,1.73,1.77,1.78,1.82,1.82,1.89,
+1.88,1.89,1.90,1.90,1.96,1.95,1.94,2.02,1.92,1.93,
+1.94,2.04,2.06,2.04,2.03,2.07,2.12,2.11,2.03,2.13,
+2.16,2.18,2.19,2.12,2.19,2.23,2.24,2.35,2.22,2.13,
+2.34,2.24,2.32,2.38,2.43,2.42,2.37,2.36,2.45,2.34,
+2.38,2.41,2.43,2.42,2.46,2.47,2.53,2.44,2.43,2.44,
+2.45,2.58,2.50,2.54,2.59,2.56,2.61,2.68,2.62,2.64,
+2.67,2.58,2.67,2.64,2.63,2.69,2.64,2.73,2.62,2.72,
+2.71,2.78,2.95,2.78,2.67,2.84,2.86,2.76,2.86,2.87,
+2.80,2.73,2.89,2.89,2.85,2.91,2.91,2.94,2.85,2.99,
+2.95,3.01,2.96,2.95,3.00,3.02,2.97,3.11,3.08,3.08,
+3.17,3.02,2.94,2.99,3.04,3.08,3.11,3.10,3.16,3.09,
+3.11,3.19,3.16,3.30,3.22,3.13,3.05,3.21,3.21,3.25,
+3.18,3.25,3.40,3.24,3.33,3.13,3.31,3.25,3.35,3.25,
+3.26,3.28,3.36,3.31,3.30,3.50,3.51,3.38,3.31,3.33,
+3.49,3.47,3.48,3.41,3.31,3.35,3.40,3.45,3.54,3.40,
+3.48,3.54,3.50,3.45,3.49,3.43,3.56,3.57,3.58,3.58,
+3.50,3.64,3.54,3.57,3.58,3.57,3.61,3.63,3.55,3.78,
+3.46,3.58,3.73,3.66,3.60,3.52,3.70,3.68,3.66,3.90,
+3.56,3.69,3.78,3.68,3.61,3.76,3.65,3.76,3.81,4.01,
+3.68,3.92,3.79,3.84,3.84,3.77,3.97,3.91,3.87,3.93,
+3.63,4.07,3.87,3.96,3.99,3.98,3.93,3.97,3.91,3.91,
+3.94,3.88,3.85,3.83,4.02,3.99,3.89,3.95,4.04,4.02,
+4.06,4.19,4.17,3.93,3.99,4.06,3.89,4.18,3.98,4.10,
+4.06,4.05,4.06,4.27,4.15,4.18,4.15,4.04,4.22,4.13,
+0.76,0.84,0.86,0.90,0.93,0.94,0.97,1.03,1.03,1.06,
+1.05,1.09,1.12,1.15,1.22,1.19,1.21,1.26,1.23,1.33,
+1.33,1.34,1.33,1.38,1.36,1.41,1.43,1.48,1.48,1.50,
+1.44,1.56,1.50,1.57,1.63,1.60,1.58,1.71,1.60,1.65,
+1.65,1.66,1.69,1.78,1.70,1.78,1.79,1.82,1.85,1.83,
+1.81,1.88,1.83,1.87,1.89,1.89,1.81,1.80,1.97,1.94,
+1.92,1.96,2.01,1.99,2.06,2.07,2.10,1.99,2.04,2.13,
+2.11,2.13,2.17,2.15,2.18,2.20,2.17,2.22,2.17,2.24,
+2.25,2.30,2.22,2.29,2.30,2.23,2.25,2.40,2.37,2.36,
+2.30,2.35,2.37,2.43,2.46,2.43,2.38,2.48,2.44,2.48,
+2.44,2.41,2.42,2.52,2.41,2.53,2.59,2.40,2.60,2.49,
+2.51,2.61,2.58,2.52,2.61,2.51,2.54,2.68,2.66,2.50,
+2.69,2.75,2.67,2.69,2.67,2.72,2.74,2.84,2.79,2.76,
+2.79,2.85,2.77,2.75,2.87,2.86,2.91,2.84,2.83,2.76,
+2.88,2.91,2.95,2.88,2.86,2.85,2.91,2.97,2.91,2.90,
+2.81,2.96,2.99,2.98,2.89,3.05,3.00,2.97,2.96,2.99,
+3.08,3.11,3.02,3.20,3.01,3.13,3.16,3.11,3.22,3.05,
+3.17,3.17,3.05,3.17,3.11,3.09,3.14,3.21,3.30,3.26,
+3.23,3.27,3.16,3.28,3.19,3.32,3.11,3.29,3.21,3.36,
+3.36,3.28,3.12,3.42,3.38,3.39,3.35,3.40,3.44,3.34,
+3.42,3.36,3.42,3.42,3.44,3.40,3.40,3.43,3.37,3.44,
+3.54,3.52,3.60,3.61,3.43,3.55,3.55,3.52,3.37,3.58,
+3.60,3.59,3.59,3.59,3.58,3.53,3.56,3.49,3.64,3.62,
+3.70,3.59,3.62,3.57,3.59,3.71,3.75,3.87,3.77,3.70,
+3.60,3.58,3.73,3.75,3.65,3.64,3.49,3.71,3.65,3.69,
+3.69,3.70,3.73,3.71,3.71,3.80,3.88,3.82,3.90,3.81,
+3.90,3.83,3.97,3.92,3.77,3.94,3.79,3.88,3.74,3.92,
+3.95,3.88,3.90,3.90,3.98,3.73,3.80,3.90,3.81,4.05,
+4.04,3.97,4.00,3.95,3.88,3.93,3.95,4.06,3.96,3.98,
+0.76,0.78,0.86,0.84,0.87,0.89,0.96,0.97,1.02,1.02,
+1.06,1.05,1.09,1.15,1.13,1.17,1.17,1.16,1.24,1.24,
+1.25,1.26,1.30,1.34,1.37,1.38,1.46,1.40,1.46,1.42,
+1.50,1.48,1.46,1.53,1.57,1.53,1.55,1.63,1.61,1.54,
+1.66,1.63,1.67,1.75,1.77,1.71,1.71,1.73,1.76,1.77,
+1.79,1.76,1.78,1.84,1.75,1.82,1.85,1.85,1.78,1.90,
+1.89,1.86,1.92,1.99,2.01,1.92,1.93,2.03,2.05,2.06,
+2.03,2.00,2.10,2.11,2.06,2.06,2.07,2.13,2.09,2.11,
+2.26,2.13,2.22,2.17,2.24,2.30,2.25,2.23,2.19,2.26,
+2.21,2.26,2.29,2.34,2.33,2.35,2.47,2.35,2.44,2.34,
+2.49,2.47,2.50,2.40,2.54,2.37,2.53,2.47,2.53,2.48,
+2.48,2.54,2.40,2.46,2.55,2.51,2.58,2.51,2.61,2.62,
+2.59,2.57,2.55,2.68,2.66,2.70,2.64,2.76,2.66,2.63,
+2.68,2.71,2.72,2.68,2.74,2.75,2.86,2.70,2.78,2.72,
+2.74,2.73,2.90,2.79,2.80,2.87,2.92,2.71,2.80,2.94,
+3.00,2.88,2.86,3.00,2.85,2.94,2.97,2.80,3.03,2.88,
+2.90,2.94,3.02,3.07,2.99,2.93,2.90,2.97,2.95,3.00,
+3.00,3.16,3.17,3.08,3.12,3.08,3.02,3.18,3.22,3.14,
+3.08,3.07,3.23,3.19,3.15,3.21,3.24,3.18,3.00,3.27,
+3.05,3.25,3.23,3.17,3.16,3.38,3.19,3.20,3.28,3.17,
+3.31,3.35,3.38,3.30,3.24,3.25,3.31,3.30,3.42,3.42,
+3.45,3.34,3.40,3.33,3.38,3.39,3.38,3.38,3.43,3.39,
+3.53,3.38,3.30,3.46,3.45,3.54,3.54,3.42,3.44,3.45,
+3.66,3.46,3.50,3.57,3.55,3.53,3.54,3.54,3.53,3.57,
+3.70,3.63,3.64,3.68,3.57,3.62,3.64,3.55,3.58,3.61,
+3.50,3.60,3.71,3.66,3.76,3.70,3.69,3.72,3.74,3.91,
+3.66,3.69,3.54,3.64,3.71,3.71,3.72,3.63,3.81,3.79,
+3.73,3.68,3.69,3.83,3.88,3.85,3.96,3.80,3.85,3.73,
+3.86,3.91,3.79,4.04,3.86,3.77,3.93,3.92,3.96,3.93,
+1.00,1.04,1.11,1.11,1.24,1.25,1.28,1.35,1.35,1.39,
+1.46,1.50,1.53,1.51,1.59,1.64,1.62,1.73,1.72,1.74,
+1.72,1.76,1.81,1.88,1.81,1.98,1.92,1.99,1.94,2.01,
+2.05,2.10,2.19,2.17,2.19,2.12,2.26,2.20,2.24,2.28,
+2.27,2.36,2.30,2.36,2.42,2.38,2.31,2.33,2.41,2.53,
+2.47,2.51,2.60,2.44,2.54,2.55,2.56,2.61,2.72,2.78,
+2.64,2.61,2.70,2.69,2.84,2.81,2.72,2.80,2.81,2.74,
+2.83,2.93,2.92,2.98,3.06,3.01,2.96,2.99,2.77,3.14,
+3.03,2.98,3.07,3.18,3.10,3.18,3.01,3.18,3.09,3.16,
+3.15,3.08,3.12,3.29,3.30,3.33,3.35,3.26,3.47,3.34,
+3.25,3.40,3.42,3.39,3.34,3.53,3.48,3.48,3.45,3.57,
+3.46,3.47,3.64,3.45,3.64,3.47,3.52,3.53,3.51,3.66,
+3.60,3.73,3.59,3.75,3.63,3.71,3.75,3.77,3.84,3.71,
+3.73,3.84,3.98,3.87,3.82,4.07,3.67,3.92,3.84,4.03,
+3.87,3.91,4.12,3.95,3.96,4.00,3.94,3.95,3.89,4.00,
+4.02,3.93,4.05,3.95,4.20,4.10,4.04,4.27,4.10,4.19,
+4.02,4.23,4.24,4.20,4.25,4.09,4.32,4.23,4.30,4.08,
+4.35,4.25,4.42,4.39,4.33,4.23,4.16,4.27,4.31,4.34,
+4.42,4.28,4.41,4.54,4.26,4.62,4.42,4.41,4.63,4.55,
+4.51,4.52,4.64,4.54,4.45,4.63,4.63,4.54,4.58,4.69,
+4.38,4.41,4.71,4.74,4.60,4.60,4.70,4.87,4.50,4.59,
+4.81,4.78,4.90,4.77,4.64,4.79,4.75,4.80,4.89,4.56,
+4.62,5.06,4.82,5.12,4.83,4.94,4.94,4.93,4.99,5.00,
+4.95,5.11,4.97,4.89,4.83,4.91,5.04,5.05,4.91,4.97,
+5.11,4.92,5.12,5.01,5.21,4.89,5.15,5.13,5.09,4.98,
+5.08,5.14,5.09,5.39,5.38,5.27,5.09,5.32,5.33,5.24,
+4.97,5.42,5.52,5.38,5.31,5.24,5.17,5.29,5.15,5.24,
+5.19,5.19,5.47,5.26,5.41,5.32,5.31,5.45,5.31,5.38,
+5.11,5.47,5.27,5.55,5.42,5.72,5.45,5.31,5.42,5.55,
+1.04,1.05,1.12,1.14,1.16,1.20,1.24,1.27,1.31,1.35,
+1.40,1.43,1.40,1.51,1.47,1.55,1.58,1.61,1.67,1.68,
+1.67,1.70,1.81,1.73,1.78,1.83,1.82,1.85,1.86,1.91,
+2.00,1.98,1.94,1.93,2.06,2.09,2.04,1.98,2.12,2.18,
+2.22,2.24,2.12,2.17,2.15,2.29,2.28,2.37,2.52,2.27,
+2.29,2.34,2.38,2.42,2.36,2.38,2.49,2.54,2.47,2.59,
+2.60,2.51,2.58,2.62,2.67,2.67,2.63,2.63,2.66,2.61,
+2.72,2.74,2.62,2.73,2.86,2.80,2.80,2.61,2.89,2.85,
+2.78,2.94,2.94,2.86,2.99,2.94,3.01,3.13,2.98,3.06,
+2.97,3.16,3.09,3.13,3.07,3.15,3.04,3.03,3.14,3.29,
+3.14,3.29,3.18,3.23,3.17,3.28,3.16,3.33,3.36,3.22,
+3.31,3.25,3.50,3.34,3.43,3.33,3.55,3.41,3.36,3.41,
+3.43,3.44,3.54,3.49,3.49,3.41,3.66,3.73,3.58,3.52,
+3.53,3.62,3.53,3.72,3.65,3.63,3.68,3.71,3.54,3.64,
+3.67,3.67,3.85,3.77,3.71,3.68,3.80,3.97,3.66,3.83,
+3.81,3.82,3.97,3.86,3.82,3.88,3.82,4.09,3.78,3.90,
+3.99,3.93,3.78,3.98,4.00,3.86,3.91,3.97,4.06,4.23,
+4.16,4.11,4.16,3.92,4.14,4.13,4.14,4.20,4.19,4.16,
+4.14,4.13,4.19,4.19,4.29,4.22,4.42,4.18,4.38,4.37,
+4.23,4.22,4.45,4.33,4.30,4.45,4.37,4.33,4.41,4.41,
+4.34,4.36,4.34,4.55,4.49,4.53,4.40,4.19,4.49,4.51,
+4.60,4.43,4.48,4.66,4.59,4.59,4.57,4.43,4.66,4.64,
+4.56,4.64,4.74,4.80,4.69,4.67,4.55,4.66,4.74,4.68,
+4.83,4.79,4.86,4.69,4.90,4.75,4.94,4.85,4.96,4.83,
+4.73,4.86,4.83,4.84,5.23,4.79,5.12,4.98,4.66,4.79,
+5.14,4.82,5.13,4.93,4.71,5.03,5.07,5.00,4.72,4.97,
+4.99,4.94,5.14,5.02,5.03,5.07,4.94,4.99,5.08,5.13,
+5.17,4.87,5.29,4.86,5.08,5.27,5.10,5.09,5.34,5.25,
+5.19,5.17,5.20,5.22,5.08,5.40,5.12,4.98,5.18,5.21,
+0.94,1.05,1.04,1.08,1.17,1.18,1.19,1.20,1.28,1.27,
+1.34,1.39,1.35,1.42,1.47,1.50,1.51,1.51,1.58,1.62,
+1.59,1.67,1.67,1.64,1.68,1.78,1.77,1.75,1.83,1.86,
+1.86,1.86,1.94,1.97,1.97,1.95,2.06,1.99,1.92,2.11,
+2.08,2.13,2.12,2.15,2.19,2.13,2.15,2.22,2.29,2.19,
+2.41,2.18,2.22,2.30,2.31,2.34,2.31,2.33,2.48,2.44,
+2.46,2.43,2.47,2.53,2.55,2.59,2.57,2.48,2.55,2.60,
+2.60,2.52,2.70,2.71,2.64,2.70,2.76,2.71,2.65,2.78,
+2.86,2.84,2.93,2.89,2.85,2.76,2.87,2.87,2.90,2.98,
+3.04,3.10,2.95,2.87,2.96,2.98,2.94,3.01,3.06,3.00,
+3.13,3.10,3.05,3.03,3.11,3.14,3.20,3.24,3.08,3.28,
+3.22,3.31,3.33,3.28,3.15,3.30,3.23,3.33,3.29,3.26,
+3.29,3.28,3.31,3.51,3.40,3.44,3.48,3.48,3.54,3.31,
+3.46,3.45,3.55,3.45,3.56,3.59,3.57,3.56,3.65,3.54,
+3.67,3.48,3.64,3.62,3.67,3.60,3.64,3.73,3.64,3.65,
+3.77,3.64,3.69,3.79,3.65,3.65,3.73,3.86,3.73,3.73,
+3.85,3.78,3.81,3.81,3.92,3.83,3.80,3.83,3.65,3.94,
+3.87,3.91,4.05,3.99,3.99,3.75,3.87,4.00,4.10,4.14,
+4.04,4.14,4.08,4.12,3.99,4.11,4.14,4.18,4.09,4.08,
+4.06,4.02,4.11,4.19,4.16,4.08,4.11,4.33,4.16,4.21,
+4.26,4.34,4.31,4.01,4.24,4.28,4.14,4.34,4.33,4.26,
+4.23,4.39,4.39,4.22,4.25,4.35,4.34,4.35,4.42,4.34,
+4.48,4.47,4.45,4.43,4.44,4.44,4.37,4.44,4.49,4.68,
+4.47,4.52,4.54,4.55,4.50,4.53,4.62,4.35,4.57,4.64,
+4.68,4.55,4.63,4.61,4.72,4.46,4.61,4.60,4.73,4.64,
+4.88,4.58,4.65,4.70,4.80,4.88,4.66,4.98,4.69,4.54,
+4.70,4.77,4.58,4.79,4.89,4.95,4.99,4.75,4.83,4.94,
+4.82,4.77,4.92,4.77,4.96,4.87,4.96,4.92,5.22,5.11,
+4.80,4.92,5.03,5.11,5.20,5.00,4.82,4.80,5.00,4.99,
+0.96,1.01,1.05,1.07,1.06,1.12,1.21,1.26,1.21,1.25,
+1.33,1.29,1.40,1.36,1.36,1.43,1.48,1.47,1.49,1.60,
+1.63,1.55,1.56,1.63,1.72,1.70,1.73,1.64,1.77,1.82,
+1.86,1.76,1.83,1.83,1.90,1.93,1.93,1.96,1.97,1.97,
+2.07,2.00,1.99,2.08,2.10,2.14,2.15,2.23,2.07,2.10,
+2.19,2.24,2.30,2.27,2.26,2.36,2.33,2.28,2.35,2.31,
+2.26,2.50,2.36,2.36,2.49,2.43,2.35,2.56,2.45,2.40,
+2.47,2.57,2.66,2.58,2.69,2.65,2.70,2.59,2.79,2.70,
+2.69,2.71,2.79,2.74,2.72,2.82,2.71,2.88,2.83,2.80,
+2.83,2.83,2.86,2.95,2.83,3.04,2.93,2.92,2.98,2.99,
+2.96,3.08,3.04,3.10,3.02,3.06,3.00,2.96,3.01,3.11,
+3.20,3.05,3.10,3.19,3.19,3.05,3.15,3.17,3.17,3.22,
+3.30,3.14,3.22,3.21,3.35,3.25,3.17,3.28,3.26,3.31,
+3.32,3.41,3.24,3.42,3.48,3.47,3.42,3.48,3.43,3.56,
+3.35,3.49,3.44,3.53,3.50,3.41,3.44,3.63,3.52,3.56,
+3.52,3.71,3.55,3.57,3.61,3.48,3.69,3.70,3.58,3.52,
+3.71,3.58,3.61,3.67,3.64,3.67,3.65,3.85,3.63,3.86,
+3.60,3.88,3.84,3.76,3.94,3.66,3.94,3.87,3.91,3.95,
+4.04,3.82,4.08,4.07,3.88,3.88,3.91,3.88,3.84,4.09,
+3.97,4.02,3.96,3.90,4.14,4.10,4.00,3.87,3.86,4.13,
+4.16,4.13,4.07,3.93,4.24,4.20,4.28,4.22,4.04,4.17,
+4.03,4.36,4.21,4.19,4.25,4.06,4.36,4.25,4.22,4.27,
+4.21,4.17,4.16,4.25,4.27,4.45,4.33,4.22,4.32,4.42,
+4.39,4.38,4.51,4.49,4.45,4.57,4.40,4.48,4.49,4.44,
+4.46,4.42,4.44,4.39,4.49,4.48,4.47,4.61,4.61,4.49,
+4.58,4.44,4.51,4.63,4.65,4.59,4.68,4.65,4.52,4.58,
+4.61,4.71,4.67,4.55,4.69,4.61,4.51,5.05,4.75,4.81,
+4.84,4.68,4.75,4.58,4.64,4.84,4.81,4.64,4.60,4.65,
+4.95,4.85,4.95,4.75,4.87,4.92,4.91,4.87,4.89,4.89,
+0.94,0.97,0.98,1.05,1.05,1.09,1.18,1.22,1.16,1.28,
+1.25,1.34,1.35,1.34,1.41,1.43,1.44,1.44,1.55,1.54,
+1.52,1.57,1.58,1.63,1.64,1.72,1.68,1.64,1.74,1.84,
+1.78,1.79,1.82,1.87,1.85,1.95,1.91,2.02,1.95,1.97,
+2.02,1.94,2.00,2.05,2.06,2.10,2.13,2.10,2.10,2.11,
+2.15,2.19,2.14,2.18,2.21,2.25,2.37,2.29,2.37,2.37,
+2.33,2.38,2.32,2.37,2.47,2.35,2.35,2.52,2.60,2.46,
+2.47,2.51,2.40,2.57,2.51,2.54,2.62,2.68,2.50,2.52,
+2.65,2.66,2.59,2.66,2.62,2.69,2.67,2.83,2.67,2.82,
+2.72,2.77,2.89,2.86,2.77,2.88,2.87,2.78,2.90,2.88,
+2.92,3.04,2.81,2.91,2.90,2.98,2.97,3.05,3.05,3.01,
+3.12,3.04,3.23,3.11,2.99,3.05,3.11,3.02,3.14,3.18,
+3.19,3.22,3.18,3.26,3.11,3.33,3.15,3.27,3.22,3.21,
+3.32,3.25,3.44,3.17,3.26,3.39,3.24,3.40,3.44,3.25,
+3.30,3.36,3.47,3.36,3.46,3.48,3.56,3.49,3.39,3.39,
+3.60,3.62,3.53,3.46,3.60,3.52,3.68,3.49,3.46,3.56,
+3.75,3.54,3.72,3.61,3.81,3.80,3.57,3.61,3.73,3.66,
+3.77,3.64,3.70,3.62,3.63,3.84,3.78,3.72,3.80,3.74,
+3.76,3.80,3.81,3.79,3.92,3.87,3.94,3.88,3.91,3.84,
+3.74,4.09,3.78,4.03,3.99,3.89,3.91,4.05,4.14,3.92,
+4.05,3.95,4.18,4.05,4.10,3.97,4.12,3.84,4.14,3.97,
+4.09,4.13,4.04,4.09,4.16,4.32,4.14,4.10,4.10,4.11,
+4.10,4.20,4.10,4.21,4.26,4.07,4.23,4.25,4.26,4.31,
+4.27,4.25,4.42,4.43,4.27,4.55,4.38,4.30,4.52,4.22,
+4.31,4.49,4.39,4.36,4.25,4.36,4.40,4.37,4.43,4.52,
+4.50,4.40,4.36,4.41,4.63,4.67,4.43,4.44,4.50,4.71,
+4.52,4.77,4.42,4.53,4.59,4.49,4.66,4.56,4.68,4.66,
+4.79,4.46,4.67,4.68,4.69,4.70,4.43,4.70,4.67,4.51,
+4.61,4.60,4.56,4.77,4.59,4.75,4.57,4.63,4.59,4.95,
+0.94,0.92,0.99,1.01,1.06,1.05,1.12,1.17,1.19,1.30,
+1.27,1.26,1.28,1.30,1.35,1.38,1.40,1.45,1.50,1.54,
+1.45,1.54,1.53,1.66,1.60,1.58,1.69,1.63,1.66,1.70,
+1.74,1.79,1.80,1.76,1.77,1.80,1.88,1.90,1.97,1.91,
+1.93,1.94,1.96,2.00,2.01,2.01,2.09,2.08,2.14,2.12,
+2.00,2.07,2.19,2.18,2.23,2.21,2.24,2.16,2.31,2.12,
+2.34,2.26,2.35,2.25,2.21,2.36,2.45,2.40,2.40,2.46,
+2.45,2.47,2.40,2.56,2.39,2.56,2.58,2.47,2.52,2.60,
+2.55,2.58,2.69,2.61,2.62,2.57,2.66,2.66,2.71,2.66,
+2.74,2.72,2.72,2.79,2.74,2.75,2.85,2.74,2.84,2.87,
+2.92,2.78,2.86,2.80,2.86,2.85,2.84,2.88,2.99,2.95,
+2.88,2.96,3.01,2.96,2.99,2.96,2.94,3.17,3.10,3.05,
+3.05,3.23,3.12,3.09,3.14,3.21,3.19,3.08,3.17,3.20,
+3.26,3.24,3.26,3.21,3.15,3.12,3.18,3.35,3.26,3.40,
+3.21,3.26,3.36,3.35,3.29,3.36,3.37,3.51,3.45,3.39,
+3.39,3.39,3.43,3.39,3.49,3.33,3.40,3.46,3.46,3.40,
+3.59,3.54,3.63,3.57,3.56,3.63,3.58,3.52,3.57,3.62,
+3.72,3.66,3.64,3.72,3.62,3.78,3.57,3.63,3.73,3.67,
+3.71,3.74,3.66,3.73,3.85,3.70,3.75,3.89,3.79,3.69,
+3.88,3.83,3.73,3.95,3.93,3.92,4.03,3.87,3.79,3.77,
+4.09,3.90,3.84,3.96,3.95,4.01,4.08,3.99,3.86,3.94,
+3.87,3.96,4.01,4.04,4.07,3.95,4.18,4.08,4.14,4.16,
+4.17,4.18,4.33,4.10,4.05,4.16,4.21,4.13,4.12,4.21,
+4.17,4.14,4.10,4.36,4.24,4.33,4.40,4.28,4.26,4.33,
+4.18,4.22,4.20,4.44,4.33,4.29,4.34,4.32,4.36,4.38,
+4.35,4.26,4.36,4.38,4.09,4.48,4.42,4.35,4.40,4.46,
+4.49,4.49,4.42,4.56,4.31,4.41,4.51,4.46,4.41,4.43,
+4.66,4.43,4.54,4.58,4.55,4.29,4.62,4.61,4.54,4.68,
+4.60,4.78,4.58,4.53,4.58,4.52,4.86,4.65,4.64,4.74,
+0.92,0.93,0.96,1.03,1.04,1.05,1.11,1.14,1.21,1.20,
+1.24,1.26,1.29,1.34,1.32,1.37,1.41,1.43,1.42,1.44,
+1.50,1.53,1.50,1.57,1.58,1.62,1.66,1.72,1.65,1.64,
+1.71,1.66,1.76,1.79,1.76,1.78,1.84,1.89,1.80,1.87,
+1.90,1.90,1.95,1.94,1.99,2.02,1.96,2.00,1.93,2.11,
+2.07,2.09,2.15,2.10,2.09,2.15,2.16,2.13,2.19,2.18,
+2.25,2.28,2.25,2.29,2.33,2.31,2.30,2.41,2.36,2.42,
+2.37,2.36,2.44,2.41,2.38,2.43,2.57,2.47,2.48,2.44,
+2.56,2.47,2.48,2.55,2.67,2.64,2.58,2.54,2.57,2.71,
+2.73,2.70,2.67,2.65,2.73,2.73,2.71,2.83,2.82,2.64,
+2.72,2.78,2.77,2.85,2.76,2.79,2.92,2.88,2.91,2.93,
+2.89,2.90,2.96,2.91,3.06,3.07,2.91,2.90,3.00,3.07,
+3.18,3.11,2.92,2.95,3.06,3.13,3.10,3.02,3.16,3.15,
+3.16,3.03,3.06,3.15,3.18,3.19,3.26,3.37,3.37,3.34,
+3.10,3.29,3.22,3.24,3.32,3.29,3.30,3.29,3.45,3.37,
+3.27,3.36,3.41,3.46,3.30,3.40,3.58,3.44,3.47,3.49,
+3.49,3.51,3.42,3.37,3.61,3.60,3.57,3.53,3.63,3.59,
+3.51,3.50,3.54,3.63,3.78,3.62,3.63,3.64,3.53,3.47,
+3.69,3.67,3.62,3.62,3.69,3.74,3.73,3.64,3.66,3.66,
+3.72,3.68,3.75,3.68,3.73,3.62,3.91,3.92,3.83,3.85,
+3.73,3.99,3.84,3.74,3.79,3.85,3.90,3.89,3.92,3.90,
+3.98,4.07,3.88,3.88,3.96,3.79,4.21,3.94,4.10,3.92,
+4.12,4.31,4.08,4.08,4.14,4.18,4.06,4.03,3.97,4.03,
+4.18,4.20,4.16,4.15,4.18,4.28,4.02,4.00,4.21,4.01,
+4.24,4.22,4.13,4.28,4.34,4.21,4.46,4.23,4.23,4.37,
+4.45,4.20,4.41,4.44,4.41,4.20,4.27,4.32,4.17,4.45,
+4.32,4.37,4.36,4.57,4.40,4.49,4.55,4.62,4.52,4.43,
+4.48,4.35,4.43,4.45,4.44,4.59,4.55,4.54,4.42,4.63,
+4.48,4.42,4.42,4.44,4.56,4.53,4.36,4.67,4.61,4.66,
+0.91,0.93,0.96,1.03,1.04,1.10,1.08,1.20,1.15,1.17,
+1.25,1.27,1.29,1.28,1.31,1.37,1.39,1.38,1.41,1.47,
+1.48,1.50,1.54,1.56,1.57,1.56,1.63,1.64,1.67,1.70,
+1.65,1.71,1.75,1.73,1.81,1.77,1.79,1.80,1.83,1.78,
+1.84,1.93,1.92,1.97,1.87,1.94,2.03,1.95,1.94,1.97,
+2.03,2.01,2.06,2.05,2.17,2.14,2.21,2.12,2.21,2.21,
+2.19,2.26,2.26,2.25,2.25,2.24,2.37,2.29,2.39,2.30,
+2.40,2.26,2.40,2.38,2.41,2.49,2.46,2.46,2.54,2.40,
+2.49,2.49,2.54,2.58,2.59,2.62,2.55,2.61,2.61,2.65,
+2.58,2.71,2.61,2.69,2.72,2.65,2.71,2.72,2.79,2.75,
+2.68,2.77,2.74,2.68,2.79,2.83,2.96,3.02,2.82,2.80,
+2.88,2.96,2.77,2.75,2.99,2.87,2.91,3.04,3.04,3.06,
+3.09,2.94,3.03,3.01,3.03,3.00,3.08,2.99,3.07,3.12,
+3.11,3.06,3.22,3.05,3.15,3.07,3.21,3.05,3.26,3.20,
+3.25,3.25,3.20,3.18,3.22,3.26,3.23,3.34,3.25,3.29,
+3.34,3.38,3.33,3.30,3.36,3.31,3.29,3.34,3.35,3.38,
+3.48,3.30,3.38,3.47,3.49,3.61,3.55,3.52,3.51,3.46,
+3.53,3.41,3.62,3.47,3.61,3.50,3.44,3.65,3.63,3.63,
+3.71,3.70,3.75,3.54,3.66,3.52,3.64,3.57,3.64,3.76,
+3.87,3.77,3.75,3.71,3.69,3.72,3.74,3.87,3.73,3.69,
+3.85,3.72,3.92,3.86,3.73,3.80,3.76,3.81,3.93,3.95,
+3.98,3.95,4.11,3.90,4.02,3.95,3.90,4.10,4.03,3.80,
+3.90,3.91,3.85,3.89,4.13,4.05,3.94,3.98,4.03,4.05,
+4.20,3.93,4.00,4.11,4.14,4.05,4.11,4.12,4.08,4.11,
+4.06,4.03,4.22,4.23,4.00,4.27,4.29,4.13,4.26,4.40,
+4.34,4.16,4.30,4.28,4.41,4.35,4.16,4.22,4.52,4.29,
+4.51,4.41,4.35,4.26,4.28,4.41,4.31,4.16,4.44,4.15,
+4.54,4.43,4.21,4.41,4.29,4.37,4.41,4.25,4.48,4.45,
+4.64,4.60,4.52,4.67,4.38,4.37,4.47,4.56,4.39,4.50,
+0.93,0.94,0.94,1.00,1.00,1.05,1.06,1.11,1.15,1.17,
+1.16,1.25,1.24,1.28,1.35,1.33,1.40,1.45,1.45,1.44,
+1.44,1.47,1.50,1.51,1.54,1.57,1.56,1.68,1.54,1.64,
+1.69,1.75,1.73,1.71,1.73,1.77,1.74,1.77,1.79,1.86,
+1.79,1.86,1.91,1.91,1.87,1.97,1.96,1.99,1.96,1.92,
+2.00,2.11,2.05,2.10,2.12,2.18,2.16,2.11,2.18,2.16,
+2.11,2.18,2.19,2.27,2.29,2.24,2.35,2.27,2.33,2.32,
+2.37,2.29,2.34,2.47,2.30,2.31,2.46,2.44,2.42,2.44,
+2.47,2.51,2.50,2.48,2.53,2.53,2.57,2.58,2.56,2.53,
+2.59,2.57,2.66,2.60,2.61,2.67,2.67,2.82,2.73,2.63,
+2.69,2.77,2.69,2.76,2.68,2.90,2.76,2.81,2.79,2.82,
+2.85,2.82,2.90,2.77,2.98,3.10,2.85,2.93,2.97,2.94,
+2.98,3.08,2.97,2.96,2.99,2.98,2.97,2.97,3.05,3.04,
+3.16,3.17,3.13,3.04,3.15,3.15,3.13,3.11,3.10,3.16,
+3.21,3.15,3.06,3.22,3.11,3.12,3.23,3.22,3.24,3.28,
+3.37,3.30,3.34,3.33,3.31,3.22,3.43,3.32,3.35,3.28,
+3.43,3.40,3.41,3.47,3.40,3.54,3.38,3.39,3.42,3.47,
+3.55,3.54,3.45,3.61,3.51,3.49,3.56,3.74,3.58,3.60,
+3.52,3.56,3.61,3.62,3.48,3.68,3.61,3.55,3.70,3.57,
+3.43,3.73,3.67,3.83,3.70,3.66,3.81,3.62,3.64,3.65,
+3.46,3.93,3.70,3.84,3.72,3.74,3.80,3.86,3.75,3.80,
+3.92,3.97,3.94,3.91,3.91,3.75,3.86,3.88,3.89,3.81,
+3.86,3.98,3.90,4.11,4.07,4.02,3.89,4.02,3.99,3.91,
+4.02,4.07,4.01,4.16,4.14,3.96,4.00,4.06,4.15,4.06,
+3.97,3.94,4.17,3.97,4.24,4.20,4.22,4.10,4.02,4.13,
+4.27,4.14,4.32,4.24,4.15,4.24,4.25,4.37,4.14,4.24,
+4.32,4.31,4.21,4.35,4.11,4.37,4.24,4.36,4.40,4.30,
+4.39,4.32,4.37,4.29,4.52,4.52,4.40,4.28,4.48,4.39,
+4.16,4.37,4.46,4.37,4.21,4.33,4.28,4.55,4.50,4.30,
+0.88,0.90,0.96,0.95,0.98,1.07,1.05,1.14,1.14,1.20,
+1.18,1.21,1.23,1.19,1.32,1.27,1.32,1.36,1.34,1.46,
+1.41,1.41,1.47,1.43,1.54,1.55,1.60,1.63,1.60,1.60,
+1.67,1.69,1.71,1.68,1.73,1.73,1.80,1.74,1.76,1.75,
+1.85,1.81,1.90,1.94,1.86,1.87,2.00,1.94,1.95,1.96,
+2.01,1.95,1.95,2.03,2.03,2.04,2.06,2.12,2.11,2.17,
+2.05,2.23,2.15,2.20,2.20,2.24,2.16,2.23,2.28,2.25,
+2.41,2.17,2.30,2.34,2.31,2.39,2.46,2.36,2.36,2.47,
+2.35,2.35,2.53,2.41,2.52,2.55,2.53,2.57,2.53,2.59,
+2.58,2.54,2.63,2.53,2.73,2.51,2.67,2.68,2.69,2.58,
+2.76,2.71,2.66,2.68,2.66,2.83,2.67,2.67,2.90,2.78,
+2.81,2.78,2.72,2.75,2.89,2.74,2.94,2.83,2.93,2.82,
+2.94,2.93,2.91,2.95,2.96,2.92,3.04,2.87,3.02,3.03,
+3.03,3.07,3.09,3.13,3.02,3.04,3.14,3.14,3.07,3.09,
+3.09,3.12,3.16,3.11,3.05,3.10,3.13,3.14,3.23,3.09,
+3.20,3.16,3.12,3.31,3.25,3.27,3.30,3.27,3.24,3.24,
+3.45,3.28,3.34,3.41,3.30,3.27,3.29,3.30,3.41,3.49,
+3.41,3.57,3.46,3.55,3.38,3.48,3.43,3.55,3.37,3.49,
+3.48,3.51,3.46,3.57,3.47,3.51,3.58,3.50,3.44,3.79,
+3.66,3.61,3.75,3.65,3.60,3.76,3.62,3.65,3.53,3.66,
+3.75,3.90,3.67,3.76,3.83,3.86,3.75,3.80,3.78,3.74,
+4.04,3.81,3.85,3.76,3.79,3.77,3.68,3.74,3.74,3.91,
+3.79,3.91,3.82,3.88,3.78,3.91,3.84,3.86,3.88,3.96,
+4.00,3.88,3.97,4.00,3.81,4.10,4.05,3.90,3.97,4.03,
+3.93,4.01,3.90,3.95,3.97,3.96,4.14,4.03,4.13,4.15,
+3.93,4.08,4.04,4.08,4.15,4.06,4.20,4.33,4.19,4.22,
+4.12,4.34,4.19,4.11,4.21,4.37,4.16,4.28,4.19,4.24,
+4.32,4.34,4.37,4.29,4.22,4.35,4.27,4.15,4.42,4.38,
+4.37,4.38,4.39,4.28,4.39,4.47,4.24,4.36,4.20,4.35,
+0.89,0.89,0.93,0.96,0.94,1.05,1.07,1.09,1.10,1.14,
+1.13,1.23,1.23,1.23,1.26,1.29,1.29,1.43,1.40,1.35,
+1.42,1.40,1.47,1.50,1.46,1.44,1.50,1.50,1.54,1.60,
+1.65,1.59,1.58,1.71,1.68,1.63,1.76,1.75,1.74,1.77,
+1.75,1.89,1.82,1.85,1.85,1.92,1.87,1.86,1.97,1.98,
+1.94,2.04,1.97,1.98,2.00,1.99,2.04,2.02,2.08,2.04,
+2.08,2.12,2.12,2.20,2.16,2.20,2.15,2.24,2.25,2.30,
+2.22,2.30,2.31,2.15,2.27,2.29,2.33,2.30,2.30,2.35,
+2.38,2.37,2.41,2.44,2.40,2.45,2.54,2.52,2.52,2.51,
+2.61,2.56,2.51,2.49,2.60,2.63,2.63,2.66,2.63,2.58,
+2.63,2.63,2.66,2.64,2.74,2.65,2.73,2.73,2.71,2.74,
+2.77,2.70,2.74,2.72,2.77,2.87,2.81,2.73,2.83,2.87,
+2.87,2.91,2.90,2.90,2.88,2.90,2.89,2.91,3.09,2.99,
+3.01,2.95,2.92,2.83,2.93,3.02,2.99,3.11,3.16,3.04,
+3.09,3.04,3.09,3.15,3.06,3.08,2.99,3.24,3.12,3.28,
+3.17,3.21,3.16,3.17,3.19,3.19,3.30,3.18,3.33,3.32,
+3.18,3.17,3.21,3.15,3.30,3.23,3.32,3.21,3.33,3.39,
+3.20,3.41,3.38,3.43,3.38,3.46,3.47,3.36,3.57,3.39,
+3.44,3.48,3.57,3.57,3.38,3.33,3.37,3.56,3.71,3.66,
+3.61,3.59,3.63,3.50,3.46,3.59,3.52,3.59,3.69,3.60,
+3.62,3.60,3.48,3.62,3.65,3.64,3.59,3.71,3.72,3.76,
+3.72,3.83,3.72,3.85,3.79,3.71,3.72,3.82,3.89,3.70,
+3.71,3.82,3.70,3.86,3.87,3.92,3.80,3.90,3.79,3.89,
+3.72,3.96,3.87,4.06,3.77,3.79,3.89,3.79,3.84,3.90,
+3.86,3.96,4.04,3.88,3.98,3.93,3.99,3.77,4.06,4.01,
+4.13,3.96,4.11,4.03,3.99,4.15,4.01,4.14,4.16,3.88,
+4.13,4.18,3.98,4.22,4.13,4.04,4.23,4.11,4.21,4.10,
+4.24,4.15,4.23,4.10,4.13,4.05,4.26,4.21,4.26,4.17,
+4.29,4.39,4.29,4.37,4.29,4.16,4.27,4.36,3.95,4.16,
+0.86,0.88,0.92,0.92,0.97,1.02,1.05,1.07,1.11,1.11,
+1.15,1.17,1.17,1.16,1.26,1.28,1.31,1.32,1.33,1.35,
+1.41,1.42,1.45,1.45,1.50,1.44,1.44,1.50,1.58,1.53,
+1.55,1.55,1.68,1.67,1.63,1.68,1.69,1.67,1.72,1.78,
+1.73,1.86,1.74,1.75,1.83,1.84,1.89,1.92,1.93,1.87,
+1.89,1.92,2.02,1.96,2.03,1.96,2.02,1.93,1.98,2.03,
+2.13,2.10,2.06,2.15,2.09,2.15,2.15,2.24,2.23,2.15,
+2.20,2.11,2.27,2.28,2.28,2.37,2.33,2.28,2.33,2.33,
+2.32,2.36,2.46,2.29,2.38,2.37,2.52,2.39,2.48,2.45,
+2.47,2.48,2.51,2.40,2.51,2.52,2.47,2.67,2.55,2.58,
+2.67,2.57,2.61,2.59,2.64,2.66,2.57,2.68,2.63,2.75,
+2.76,2.65,2.73,2.75,2.74,2.84,2.79,2.75,2.74,2.75,
+2.83,2.79,2.86,2.87,2.87,2.76,2.86,2.99,2.88,2.86,
+2.91,2.94,2.85,3.07,2.99,2.89,2.87,3.05,3.03,2.93,
+3.07,3.02,3.04,2.96,3.08,3.24,3.08,3.12,3.02,3.05,
+3.12,2.94,3.07,3.21,3.20,3.16,3.13,3.19,3.19,3.16,
+3.13,3.30,3.27,3.21,3.28,3.36,3.08,3.33,3.21,3.24,
+3.28,3.17,3.37,3.22,3.35,3.16,3.28,3.34,3.30,3.24,
+3.34,3.25,3.35,3.35,3.57,3.38,3.43,3.46,3.42,3.38,
+3.57,3.57,3.57,3.51,3.50,3.49,3.57,3.52,3.60,3.61,
+3.48,3.54,3.46,3.76,3.65,3.57,3.52,3.58,3.60,3.55,
+3.67,3.74,3.74,3.53,3.59,3.77,3.77,3.83,3.70,3.61,
+3.70,3.76,3.64,3.76,3.70,3.70,3.78,3.84,3.78,3.74,
+3.89,3.97,4.04,3.90,3.91,3.75,4.01,3.92,3.83,3.78,
+3.90,3.88,3.93,3.68,3.78,3.84,3.90,3.78,3.99,3.91,
+3.78,3.99,3.92,3.84,4.00,3.94,3.96,4.01,4.08,4.10,
+4.02,3.93,4.06,4.16,4.02,4.12,4.11,4.09,4.08,4.08,
+4.05,4.09,4.03,4.18,4.35,4.18,4.11,4.20,4.25,4.22,
+4.09,4.13,4.05,4.15,4.13,4.17,4.33,4.21,4.13,4.14,
+0.82,0.87,0.88,0.91,0.99,1.00,1.02,1.02,1.09,1.03,
+1.16,1.14,1.19,1.16,1.21,1.26,1.27,1.27,1.31,1.28,
+1.43,1.40,1.40,1.43,1.42,1.44,1.46,1.50,1.50,1.52,
+1.54,1.61,1.59,1.60,1.66,1.64,1.68,1.70,1.65,1.72,
+1.76,1.75,1.83,1.76,1.79,1.79,1.78,1.89,1.96,1.88,
+1.89,1.87,1.99,1.94,1.94,2.03,1.93,2.01,2.00,1.99,
+2.09,2.01,2.04,2.03,2.06,2.08,2.13,2.13,2.17,2.14,
+2.27,2.27,2.19,2.23,2.16,2.29,2.23,2.28,2.30,2.27,
+2.33,2.37,2.41,2.20,2.38,2.31,2.38,2.41,2.37,2.35,
+2.36,2.51,2.35,2.41,2.42,2.54,2.51,2.57,2.56,2.56,
+2.56,2.47,2.65,2.60,2.68,2.53,2.57,2.73,2.69,2.63,
+2.67,2.72,2.68,2.69,2.73,2.85,2.74,2.67,2.78,2.74,
+2.78,2.75,2.82,2.77,2.76,2.81,2.89,2.88,2.82,2.93,
+2.73,2.79,2.77,2.89,2.97,2.83,2.99,3.03,2.84,2.98,
+2.85,3.06,3.02,3.05,2.99,2.95,3.03,3.02,3.02,3.07,
+3.18,3.07,3.21,3.06,3.07,3.10,3.03,3.11,3.15,3.28,
+3.21,3.17,3.05,3.13,3.16,3.29,3.10,3.24,3.15,3.20,
+3.42,3.18,3.19,3.26,3.31,3.35,3.22,3.21,3.35,3.29,
+3.32,3.35,3.25,3.31,3.44,3.33,3.36,3.31,3.36,3.42,
+3.34,3.35,3.26,3.34,3.45,3.48,3.52,3.45,3.37,3.47,
+3.36,3.37,3.47,3.40,3.54,3.44,3.63,3.55,3.64,3.49,
+3.56,3.62,3.54,3.59,3.60,3.67,3.59,3.68,3.61,3.57,
+3.56,3.64,3.60,3.57,3.57,3.74,3.61,3.80,3.67,3.71,
+3.82,3.75,3.65,3.82,3.69,3.66,3.73,3.73,3.74,3.68,
+3.75,3.84,3.90,3.81,3.93,3.78,3.98,3.80,3.93,3.95,
+3.99,4.15,3.89,3.86,3.95,3.92,3.84,3.97,4.12,3.93,
+4.07,3.85,3.80,4.04,4.00,3.89,3.96,3.89,3.91,3.99,
+3.97,4.00,4.04,3.80,4.08,3.86,4.04,3.96,3.98,4.18,
+4.28,4.04,4.19,4.36,4.19,3.95,4.11,4.19,4.35,4.31,
+0.78,0.84,0.90,0.88,0.89,0.94,0.99,1.04,1.03,1.12,
+1.09,1.11,1.17,1.11,1.21,1.17,1.22,1.28,1.29,1.28,
+1.33,1.34,1.32,1.36,1.39,1.47,1.41,1.44,1.55,1.58,
+1.57,1.57,1.50,1.59,1.63,1.58,1.67,1.66,1.63,1.70,
+1.67,1.74,1.70,1.78,1.75,1.80,1.77,1.84,1.80,1.80,
+1.84,1.82,1.92,1.88,1.91,1.88,1.95,1.96,1.90,1.92,
+2.07,2.01,2.00,2.04,2.08,2.04,2.05,2.06,2.14,2.12,
+2.14,2.19,2.20,2.14,2.13,2.04,2.27,2.17,2.21,2.29,
+2.21,2.24,2.29,2.28,2.39,2.22,2.32,2.26,2.31,2.33,
+2.34,2.29,2.44,2.36,2.39,2.45,2.42,2.45,2.40,2.42,
+2.55,2.43,2.52,2.57,2.50,2.57,2.56,2.59,2.47,2.54,
+2.54,2.56,2.58,2.70,2.63,2.64,2.65,2.72,2.78,2.63,
+2.64,2.68,2.72,2.79,2.75,2.70,2.78,2.81,2.71,2.78,
+2.76,2.86,2.88,2.79,2.75,2.87,2.86,2.90,2.87,2.88,
+2.97,3.02,2.97,2.87,3.07,3.01,2.96,2.83,2.99,2.82,
+2.92,2.97,2.98,2.85,3.03,3.07,2.92,2.93,3.02,3.05,
+2.96,3.22,3.15,2.96,3.05,2.97,3.10,3.17,3.10,3.10,
+3.21,3.32,3.19,3.26,3.24,3.34,3.32,3.28,3.13,3.06,
+3.24,3.24,3.18,3.22,3.39,3.14,3.34,3.17,3.29,3.36,
+3.28,3.23,3.26,3.41,3.51,3.41,3.38,3.29,3.42,3.41,
+3.39,3.30,3.41,3.48,3.50,3.47,3.34,3.48,3.45,3.37,
+3.53,3.53,3.60,3.68,3.56,3.61,3.51,3.54,3.51,3.51,
+3.64,3.61,3.56,3.50,3.55,3.68,3.52,3.74,3.72,3.80,
+3.59,3.65,3.70,3.73,3.95,3.77,3.73,3.58,3.56,3.81,
+3.74,3.94,3.67,3.77,3.73,3.86,3.74,3.72,3.85,3.98,
+3.79,3.82,3.79,3.86,3.76,3.77,3.81,3.91,3.99,3.89,
+3.78,3.86,3.78,3.89,3.82,3.89,3.91,3.99,3.89,3.91,
+3.92,3.86,3.94,3.99,3.80,3.97,3.90,4.03,3.98,4.10,
+3.96,4.04,4.02,3.90,3.94,4.11,4.00,4.04,4.05,4.13,
+0.79,0.83,0.87,0.86,0.93,0.95,0.96,1.00,1.01,1.04,
+1.07,1.11,1.11,1.11,1.14,1.22,1.19,1.14,1.22,1.30,
+1.34,1.33,1.30,1.36,1.38,1.37,1.43,1.46,1.47,1.49,
+1.50,1.51,1.54,1.54,1.55,1.60,1.62,1.59,1.64,1.61,
+1.60,1.65,1.69,1.70,1.69,1.66,1.76,1.72,1.79,1.83,
+1.84,1.85,1.79,1.91,1.89,1.87,1.88,1.94,1.90,1.93,
+1.92,1.95,1.93,1.94,2.01,2.00,2.00,2.09,2.08,2.04,
+2.09,2.06,2.08,2.08,2.15,2.11,2.05,2.14,2.16,2.16,
+2.29,2.20,2.27,2.26,2.27,2.22,2.23,2.34,2.38,2.29,
+2.36,2.41,2.46,2.29,2.39,2.41,2.44,2.42,2.44,2.41,
+2.38,2.52,2.44,2.43,2.46,2.39,2.49,2.48,2.54,2.42,
+2.53,2.66,2.59,2.51,2.67,2.62,2.49,2.61,2.61,2.59,
+2.56,2.69,2.70,2.66,2.65,2.72,2.68,2.69,2.76,2.68,
+2.73,2.68,2.81,2.80,2.71,2.75,2.74,2.85,2.75,2.73,
+2.85,2.83,2.86,2.87,2.89,2.87,2.84,2.91,2.98,2.87,
+2.92,2.91,2.93,2.89,2.98,2.95,2.87,2.97,3.04,2.99,
+3.09,3.00,2.96,2.99,3.22,3.02,3.01,3.04,3.01,3.09,
+3.12,3.11,3.18,2.98,3.17,3.16,3.14,3.21,3.17,3.23,
+3.02,3.24,3.01,3.26,3.16,3.37,3.13,3.27,3.26,3.32,
+3.31,3.25,3.14,3.24,3.33,3.08,3.23,3.37,3.32,3.44,
+3.18,3.27,3.37,3.49,3.45,3.46,3.38,3.46,3.43,3.32,
+3.40,3.35,3.37,3.29,3.51,3.55,3.37,3.39,3.49,3.48,
+3.50,3.48,3.49,3.47,3.42,3.51,3.48,3.46,3.41,3.61,
+3.54,3.66,3.46,3.55,3.55,3.73,3.61,3.52,3.66,3.65,
+3.62,3.60,3.75,3.58,3.57,3.77,3.55,3.86,3.69,3.64,
+3.64,3.67,3.77,3.81,3.82,3.91,3.76,3.57,3.70,3.82,
+3.58,3.79,3.79,3.79,3.68,3.76,3.85,3.83,3.80,3.75,
+3.72,3.83,3.84,3.95,3.74,3.72,3.85,3.84,3.94,3.92,
+3.83,3.95,3.97,4.01,3.96,4.07,4.10,4.14,3.99,4.06,
+1.06,1.08,1.13,1.18,1.23,1.26,1.33,1.32,1.39,1.38,
+1.47,1.49,1.58,1.58,1.62,1.61,1.72,1.68,1.70,1.67,
+1.80,1.86,1.84,1.89,1.90,1.99,1.96,2.00,2.04,2.06,
+2.09,2.07,2.10,2.05,2.19,2.21,2.19,2.30,2.24,2.27,
+2.27,2.37,2.37,2.42,2.49,2.44,2.46,2.32,2.33,2.48,
+2.47,2.45,2.50,2.53,2.64,2.63,2.62,2.53,2.71,2.69,
+2.63,2.79,2.64,2.74,2.98,2.81,2.78,2.93,2.81,2.96,
+2.90,2.98,2.95,2.95,2.98,3.09,2.93,3.01,3.03,2.94,
+3.14,3.08,3.18,3.09,3.06,3.11,3.20,3.14,3.23,3.24,
+3.19,3.27,3.28,3.38,3.37,3.28,3.37,3.49,3.42,3.38,
+3.38,3.31,3.32,3.48,3.43,3.44,3.42,3.44,3.36,3.52,
+3.52,3.43,3.64,3.59,3.58,3.61,3.68,3.61,3.66,3.81,
+3.68,3.71,3.64,3.79,3.68,3.71,3.72,3.71,3.95,3.76,
+3.85,3.87,3.84,3.88,3.93,3.79,3.79,4.02,3.91,3.95,
+3.92,4.12,4.07,3.99,3.89,4.03,3.93,4.00,3.98,4.02,
+4.13,4.08,3.90,4.10,4.15,4.23,4.12,4.20,4.25,4.12,
+4.36,4.31,4.15,4.27,4.22,4.15,4.35,4.24,4.30,4.43,
+4.15,4.21,4.46,4.40,4.48,4.48,4.49,4.36,4.32,4.57,
+4.39,4.21,4.41,4.36,4.41,4.65,4.47,4.59,4.66,4.51,
+4.47,4.73,4.76,4.69,4.67,4.75,4.68,4.71,4.67,4.80,
+4.48,4.67,4.78,4.68,4.87,4.74,4.63,4.79,4.91,4.82,
+4.88,4.90,4.80,4.86,4.73,4.91,4.70,4.76,4.93,5.11,
+4.74,4.90,4.87,4.96,4.78,5.07,4.95,5.01,4.93,5.12,
+5.11,5.21,5.12,4.77,5.13,5.03,5.08,5.17,5.12,5.01,
+5.07,5.07,5.11,5.11,5.27,5.10,5.08,5.17,5.08,5.19,
+5.07,5.15,5.42,5.29,5.22,5.26,5.23,5.46,5.20,5.37,
+5.35,5.39,5.33,5.37,5.40,5.35,5.40,5.47,5.08,5.34,
+5.28,5.40,5.45,5.49,5.51,5.29,5.41,5.37,5.54,5.35,
+5.42,5.86,5.40,5.31,5.78,5.69,5.67,5.58,5.54,5.64,
+1.01,1.03,1.06,1.10,1.18,1.16,1.23,1.31,1.29,1.39,
+1.36,1.47,1.44,1.49,1.58,1.48,1.57,1.59,1.59,1.65,
+1.73,1.77,1.73,1.74,1.83,1.81,1.81,1.82,1.87,1.93,
+1.93,1.96,1.94,2.02,2.09,2.09,2.11,2.08,2.10,2.16,
+2.22,2.14,2.24,2.24,2.36,2.26,2.22,2.25,2.40,2.31,
+2.38,2.41,2.47,2.35,2.51,2.54,2.47,2.51,2.65,2.57,
+2.49,2.63,2.51,2.63,2.58,2.64,2.67,2.68,2.73,2.73,
+2.77,2.72,2.85,2.65,2.84,2.86,2.78,2.83,2.88,2.84,
+2.89,2.79,2.95,2.87,3.03,3.05,3.05,3.03,2.94,3.06,
+2.98,3.09,3.03,3.21,3.07,3.11,3.14,3.16,3.17,3.11,
+3.26,3.19,3.16,3.16,3.32,3.24,3.30,3.22,3.31,3.28,
+3.25,3.23,3.42,3.30,3.33,3.46,3.49,3.50,3.46,3.47,
+3.41,3.51,3.42,3.47,3.61,3.52,3.46,3.55,3.55,3.61,
+3.54,3.67,3.63,3.68,3.64,3.51,3.76,3.78,3.58,3.70,
+3.63,3.86,3.66,3.66,3.84,3.76,3.73,3.76,3.79,3.82,
+3.79,3.77,3.94,3.97,3.99,3.96,3.75,3.90,3.94,4.06,
+3.92,4.15,4.02,4.02,3.87,3.96,3.98,4.05,3.99,4.17,
+3.96,3.95,4.19,3.97,4.07,4.24,4.29,4.11,4.02,4.21,
+4.27,4.26,4.17,4.19,4.14,4.32,4.24,4.27,4.25,4.28,
+4.30,4.38,4.43,4.27,4.52,4.19,4.21,4.63,4.34,4.39,
+4.35,4.44,4.53,4.39,4.30,4.50,4.47,4.44,4.40,4.56,
+4.47,4.47,4.44,4.45,4.47,4.47,4.54,4.67,4.61,4.65,
+4.58,4.67,4.58,4.66,4.72,4.62,4.57,4.64,4.76,4.63,
+4.88,4.61,4.60,4.74,4.90,4.74,4.53,4.86,4.88,4.83,
+4.74,4.68,4.98,4.87,5.05,4.90,5.06,4.81,4.91,4.80,
+5.05,4.94,4.75,5.14,4.88,4.96,5.08,4.91,5.10,5.12,
+4.73,5.02,5.15,5.07,5.00,4.94,5.09,5.15,5.02,5.00,
+5.02,5.09,5.02,5.03,5.28,5.36,5.08,5.44,5.20,5.42,
+5.08,5.26,5.14,5.35,5.55,5.06,4.92,5.31,5.14,5.16,
+1.01,1.02,1.04,1.07,1.08,1.17,1.20,1.23,1.27,1.27,
+1.30,1.32,1.38,1.51,1.43,1.49,1.52,1.48,1.60,1.56,
+1.63,1.69,1.66,1.70,1.66,1.67,1.74,1.77,1.77,1.87,
+1.84,1.89,1.84,1.91,1.93,1.98,1.99,2.08,2.00,2.10,
+2.00,2.09,2.11,2.18,2.18,2.17,2.16,2.18,2.18,2.34,
+2.21,2.29,2.20,2.32,2.21,2.33,2.35,2.48,2.43,2.37,
+2.39,2.44,2.38,2.46,2.50,2.56,2.50,2.61,2.55,2.54,
+2.56,2.63,2.60,2.68,2.69,2.77,2.75,2.65,2.74,2.74,
+2.70,2.77,2.69,2.95,2.80,2.72,2.85,2.92,2.90,2.83,
+2.83,3.01,3.09,2.91,3.00,3.02,3.00,3.01,2.80,2.99,
+3.04,3.08,3.12,3.08,3.14,3.05,3.20,3.14,3.16,3.14,
+3.26,3.25,3.26,3.39,3.23,3.11,3.31,3.31,3.33,3.36,
+3.33,3.41,3.39,3.44,3.26,3.45,3.26,3.34,3.42,3.54,
+3.48,3.45,3.39,3.55,3.39,3.58,3.41,3.54,3.33,3.44,
+3.71,3.65,3.68,3.45,3.67,3.69,3.64,3.71,3.72,3.79,
+3.65,3.65,3.70,3.69,3.74,3.74,3.73,3.79,3.72,3.82,
+3.71,3.71,3.88,3.90,3.77,3.90,4.08,3.79,3.87,4.02,
+3.75,3.83,4.08,3.77,3.75,3.82,3.89,3.92,4.05,4.00,
+3.88,3.92,3.91,3.84,4.01,3.87,3.89,4.06,4.04,4.15,
+4.00,4.08,4.15,4.21,4.19,4.05,3.99,4.15,4.16,4.24,
+4.26,4.09,4.22,4.14,4.17,4.18,4.16,4.33,4.24,4.32,
+4.19,4.37,4.51,4.45,4.27,4.26,4.52,4.56,4.20,4.53,
+4.43,4.39,4.48,4.68,4.42,4.40,4.48,4.50,4.46,4.29,
+4.46,4.43,4.39,4.32,4.43,4.45,4.55,4.50,4.65,4.50,
+4.57,4.59,4.46,4.63,4.68,4.72,4.87,4.65,4.69,4.51,
+4.69,4.56,4.69,4.70,4.55,4.75,4.67,4.69,4.77,4.77,
+4.89,4.86,4.70,4.64,4.72,4.76,4.79,4.83,4.75,4.91,
+4.73,5.01,5.08,4.89,4.67,4.78,5.00,4.85,4.74,4.93,
+4.80,4.91,5.07,4.91,4.94,4.91,5.11,4.96,5.07,5.15,
+0.95,0.96,1.02,1.06,1.10,1.13,1.14,1.22,1.20,1.23,
+1.25,1.32,1.32,1.40,1.38,1.43,1.43,1.46,1.45,1.52,
+1.57,1.48,1.62,1.57,1.64,1.65,1.63,1.74,1.74,1.75,
+1.79,1.75,1.81,1.86,1.84,1.94,1.95,1.90,1.82,2.00,
+1.98,1.92,2.01,2.02,2.06,2.07,2.11,2.11,2.16,2.21,
+2.12,2.15,2.25,2.28,2.12,2.30,2.35,2.39,2.35,2.28,
+2.36,2.44,2.37,2.48,2.45,2.42,2.43,2.56,2.67,2.44,
+2.53,2.46,2.53,2.58,2.55,2.53,2.59,2.63,2.61,2.71,
+2.70,2.59,2.75,2.73,2.80,2.85,2.62,2.77,2.69,2.98,
+2.71,2.79,2.87,2.69,2.80,2.88,3.03,2.88,2.97,2.97,
+2.83,2.87,3.02,2.96,3.08,3.02,2.99,3.10,3.12,3.03,
+3.18,3.07,3.07,3.07,3.17,3.06,3.17,3.13,3.20,3.18,
+3.17,3.14,3.24,3.38,3.27,3.31,3.39,3.42,3.26,3.20,
+3.33,3.29,3.39,3.35,3.22,3.40,3.42,3.36,3.42,3.40,
+3.40,3.52,3.35,3.47,3.59,3.61,3.53,3.54,3.44,3.58,
+3.45,3.41,3.40,3.66,3.72,3.73,3.55,3.64,3.55,3.53,
+3.63,3.61,3.64,3.62,3.69,3.78,3.75,3.76,3.63,3.73,
+3.79,3.80,3.93,3.84,3.85,3.71,3.69,3.78,3.85,3.85,
+3.92,3.81,3.85,3.70,3.73,3.84,3.78,3.89,3.95,4.00,
+3.99,3.97,4.07,3.87,3.96,3.89,3.96,4.08,3.98,4.06,
+3.98,4.12,4.08,4.04,4.15,4.04,4.01,3.86,4.22,4.18,
+4.21,4.20,4.25,4.36,4.38,4.37,4.13,4.13,4.21,4.11,
+4.12,4.33,4.37,4.23,4.18,4.39,4.48,4.24,4.34,4.37,
+4.49,4.44,4.32,4.38,4.44,4.54,4.42,4.23,4.30,4.49,
+4.32,4.29,4.48,4.30,4.44,4.45,4.56,4.50,4.49,4.42,
+4.38,4.58,4.38,4.50,4.52,4.45,4.61,4.52,4.64,4.69,
+4.52,4.59,4.68,4.50,4.62,4.64,4.62,4.58,4.75,4.61,
+4.72,4.58,4.80,4.64,4.72,4.68,4.66,4.74,4.57,4.88,
+4.81,4.87,4.59,4.66,4.97,4.67,4.94,4.71,4.85,4.73,
+0.93,0.89,1.01,1.06,1.11,1.09,1.13,1.16,1.20,1.21,
+1.25,1.27,1.35,1.31,1.38,1.39,1.38,1.42,1.49,1.52,
+1.52,1.55,1.61,1.56,1.62,1.65,1.63,1.67,1.67,1.69,
+1.71,1.78,1.78,1.76,1.82,1.73,1.77,1.95,1.85,1.90,
+1.94,2.04,1.90,1.93,1.96,2.07,2.12,2.12,2.09,2.12,
+2.11,2.04,2.11,2.21,2.28,2.14,2.13,2.24,2.16,2.28,
+2.28,2.32,2.35,2.21,2.36,2.37,2.35,2.44,2.41,2.49,
+2.45,2.43,2.58,2.51,2.57,2.47,2.55,2.57,2.54,2.51,
+2.57,2.58,2.66,2.71,2.65,2.53,2.56,2.66,2.66,2.69,
+2.72,2.60,2.76,2.81,2.78,2.84,2.69,2.74,3.00,2.85,
+2.79,2.83,2.76,2.96,2.94,2.94,2.98,2.98,3.08,2.95,
+2.97,2.93,2.97,3.02,3.00,3.11,3.05,3.23,3.02,3.09,
+3.11,3.15,3.12,3.11,3.09,3.04,3.13,3.14,3.25,3.16,
+3.21,3.22,3.31,3.29,3.27,3.07,3.41,3.16,3.37,3.38,
+3.27,3.32,3.28,3.41,3.30,3.31,3.29,3.42,3.32,3.42,
+3.42,3.49,3.49,3.55,3.53,3.39,3.49,3.65,3.59,3.47,
+3.49,3.51,3.49,3.66,3.53,3.62,3.62,3.55,3.56,3.72,
+3.65,3.68,3.56,3.53,3.74,3.66,3.74,3.78,3.76,3.81,
+3.62,3.75,3.74,3.75,3.77,3.74,3.82,3.82,3.91,3.96,
+3.83,3.74,3.96,3.85,3.82,3.87,3.82,3.75,3.84,3.86,
+3.80,3.86,4.00,3.89,3.99,3.83,3.89,4.06,3.78,4.02,
+3.97,4.09,4.03,4.14,4.06,3.96,4.11,3.93,3.99,4.08,
+4.17,3.98,4.14,4.25,3.90,4.04,4.33,4.06,4.26,4.20,
+4.24,4.28,4.15,4.09,4.30,4.10,3.97,4.27,4.22,4.19,
+4.35,4.16,4.17,4.29,4.32,4.38,4.32,4.32,4.22,4.21,
+4.46,4.42,4.52,4.27,4.32,4.43,4.22,4.42,4.37,4.36,
+4.36,4.31,4.48,4.35,4.55,4.70,4.55,4.48,4.61,4.38,
+4.62,4.49,4.42,4.54,4.42,4.56,4.45,4.43,4.76,4.46,
+4.66,4.47,4.61,4.47,4.67,4.68,4.57,4.44,4.71,4.50,
+0.91,0.94,0.98,1.03,1.04,1.08,1.10,1.18,1.16,1.21,
+1.23,1.23,1.33,1.31,1.37,1.37,1.30,1.41,1.45,1.39,
+1.44,1.54,1.57,1.56,1.59,1.59,1.60,1.71,1.62,1.63,
+1.71,1.71,1.69,1.77,1.76,1.81,1.81,1.84,1.83,1.92,
+1.94,1.88,1.94,1.90,1.91,1.97,2.04,2.10,2.14,1.99,
+2.09,2.12,2.11,2.13,2.09,2.17,2.12,2.21,2.21,2.20,
+2.19,2.27,2.30,2.22,2.27,2.31,2.26,2.39,2.34,2.37,
+2.29,2.42,2.44,2.46,2.35,2.46,2.42,2.56,2.40,2.59,
+2.45,2.56,2.51,2.50,2.52,2.53,2.55,2.57,2.56,2.57,
+2.63,2.71,2.68,2.65,2.71,2.72,2.71,2.67,2.76,2.84,
+2.71,2.70,2.76,2.88,2.76,2.78,2.83,2.89,2.98,2.93,
+2.79,2.81,3.02,2.97,2.96,2.91,3.06,2.93,3.01,3.05,
+2.99,2.98,3.07,3.00,3.04,3.11,3.03,3.20,3.11,3.14,
+3.21,3.09,3.22,3.21,3.25,3.18,3.26,3.26,3.28,3.26,
+3.20,3.20,3.17,3.22,3.35,3.30,3.23,3.34,3.28,3.21,
+3.38,3.38,3.32,3.26,3.37,3.41,3.26,3.29,3.43,3.59,
+3.35,3.43,3.47,3.36,3.52,3.51,3.34,3.59,3.44,3.52,
+3.59,3.54,3.51,3.50,3.59,3.54,3.63,3.58,3.59,3.55,
+3.65,3.56,3.75,3.66,3.79,3.76,3.76,3.70,3.71,3.80,
+3.74,3.73,3.63,3.85,3.76,3.76,3.83,3.97,3.74,3.78,
+3.85,3.73,3.78,3.86,3.85,3.75,3.90,3.94,3.94,4.01,
+3.77,4.01,3.90,3.99,3.82,3.88,3.97,3.97,3.98,4.00,
+3.96,3.91,3.94,3.98,4.14,4.04,3.97,3.96,4.12,4.03,
+4.05,4.19,3.96,4.25,4.11,4.08,4.13,4.32,4.19,4.31,
+4.01,4.19,4.18,4.35,4.29,4.12,4.23,4.13,4.24,4.15,
+4.19,4.28,4.42,4.20,4.11,4.31,4.29,4.30,4.27,4.56,
+4.33,4.37,4.42,4.43,4.23,4.26,4.48,4.51,4.22,4.37,
+4.46,4.41,4.33,4.45,4.48,4.43,4.41,4.46,4.57,4.50,
+4.50,4.59,4.71,4.52,4.32,4.49,4.51,4.42,4.66,4.51,
+0.90,0.92,0.97,0.98,1.06,1.04,1.13,1.16,1.19,1.22,
+1.17,1.23,1.24,1.27,1.37,1.35,1.36,1.36,1.48,1.46,
+1.43,1.53,1.51,1.52,1.59,1.59,1.60,1.65,1.59,1.60,
+1.64,1.64,1.68,1.66,1.76,1.72,1.82,1.85,1.86,1.84,
+1.86,1.83,1.86,1.88,1.89,1.91,1.93,2.03,1.98,1.97,
+1.97,2.05,2.10,2.11,2.11,2.09,2.10,2.11,2.15,2.14,
+2.16,2.23,2.34,2.09,2.32,2.22,2.23,2.34,2.29,2.24,
+2.41,2.31,2.38,2.41,2.37,2.36,2.45,2.49,2.50,2.54,
+2.40,2.47,2.41,2.49,2.40,2.47,2.55,2.62,2.60,2.54,
+2.52,2.57,2.64,2.70,2.61,2.63,2.71,2.69,2.77,2.72,
+2.67,2.73,2.70,2.78,2.75,2.92,2.76,2.83,2.88,2.88,
+2.86,2.87,2.86,3.05,2.91,2.89,3.01,2.95,2.86,2.99,
+2.89,3.00,2.98,2.86,3.12,3.11,2.99,3.01,2.98,2.95,
+3.02,3.05,3.04,3.11,3.02,3.06,3.16,3.21,3.15,3.11,
+3.28,3.21,3.11,3.23,3.19,3.18,3.27,2.92,3.18,3.24,
+3.20,3.28,3.22,3.36,3.22,3.31,3.39,3.34,3.49,3.28,
+3.34,3.32,3.46,3.31,3.36,3.46,3.42,3.43,3.49,3.40,
+3.52,3.39,3.51,3.57,3.41,3.48,3.44,3.52,3.50,3.49,
+3.60,3.68,3.69,3.56,3.64,3.64,3.60,3.67,3.52,3.65,
+3.61,3.66,3.69,3.61,3.67,3.72,3.73,3.69,3.86,3.85,
+3.77,3.72,3.89,3.67,3.86,3.50,3.70,3.87,3.74,3.85,
+3.92,3.81,3.78,3.80,3.76,3.78,3.92,4.10,3.90,3.86,
+3.96,3.93,3.98,4.01,4.04,3.92,3.93,3.98,3.98,3.97,
+3.95,3.94,4.10,3.80,4.04,4.02,4.02,3.96,4.02,4.04,
+4.03,4.00,4.06,4.21,4.14,4.20,4.28,4.24,4.09,4.15,
+4.27,4.22,4.22,4.07,4.18,4.24,4.23,4.28,4.18,4.20,
+4.27,4.13,4.24,4.33,4.07,4.21,4.26,4.27,4.44,4.22,
+4.33,4.52,4.50,4.25,4.38,4.25,4.21,4.55,4.29,4.40,
+4.36,4.36,4.39,4.42,4.32,4.42,4.36,4.36,4.46,4.39,
+0.90,0.93,0.91,1.02,0.99,1.06,1.10,1.13,1.14,1.14,
+1.17,1.23,1.24,1.26,1.28,1.36,1.36,1.34,1.35,1.37,
+1.40,1.42,1.51,1.52,1.52,1.53,1.56,1.61,1.56,1.66,
+1.61,1.66,1.70,1.69,1.69,1.69,1.76,1.70,1.80,1.75,
+1.88,1.85,1.82,1.92,1.85,1.84,1.94,1.93,1.95,1.98,
+2.02,2.02,2.02,2.08,1.99,2.03,2.08,2.11,2.11,2.13,
+2.16,2.14,2.14,2.18,2.22,2.20,2.29,2.24,2.30,2.19,
+2.33,2.33,2.32,2.42,2.34,2.26,2.37,2.39,2.48,2.41,
+2.39,2.49,2.43,2.43,2.55,2.46,2.58,2.46,2.51,2.51,
+2.58,2.59,2.55,2.59,2.62,2.57,2.60,2.64,2.64,2.59,
+2.70,2.75,2.77,2.64,2.63,2.72,2.75,2.67,2.86,2.89,
+2.82,2.80,2.82,2.86,2.99,2.87,2.86,2.83,2.99,2.96,
+2.93,2.85,2.89,3.01,2.99,2.97,2.92,2.96,3.06,3.07,
+3.11,2.94,2.89,3.12,2.91,3.14,2.99,2.96,3.02,3.08,
+3.04,3.06,3.29,3.16,3.14,3.01,3.12,3.35,3.22,3.19,
+3.24,3.26,3.37,3.22,3.26,3.21,3.26,3.23,3.28,3.28,
+3.24,3.35,3.35,3.42,3.44,3.53,3.32,3.43,3.32,3.53,
+3.39,3.54,3.48,3.25,3.37,3.43,3.41,3.42,3.46,3.48,
+3.35,3.46,3.59,3.47,3.56,3.53,3.65,3.62,3.68,3.54,
+3.51,3.62,3.52,3.54,3.55,3.59,3.81,3.63,3.63,3.63,
+3.62,3.76,3.74,3.67,3.63,3.62,3.71,3.68,3.80,3.74,
+3.82,3.72,3.60,3.72,3.82,3.79,3.65,3.73,3.77,3.89,
+3.80,3.90,3.72,3.87,3.90,3.73,3.71,3.91,3.87,3.92,
+3.95,3.93,3.96,4.04,4.12,3.83,4.02,3.94,3.86,3.98,
+3.90,3.91,3.94,4.10,4.13,3.96,4.15,4.19,3.99,4.04,
+4.03,4.18,4.04,4.01,4.09,4.14,4.21,4.16,4.24,4.17,
+4.24,4.24,4.43,4.15,4.26,4.20,4.39,4.36,4.25,4.02,
+4.25,4.19,4.03,4.24,4.24,4.35,4.27,4.29,4.24,4.34,
+4.30,4.31,4.41,4.22,4.38,4.33,4.35,4.25,4.49,4.37,
+0.86,0.91,0.94,1.00,1.03,1.04,1.06,1.09,1.07,1.18,
+1.15,1.19,1.24,1.21,1.27,1.32,1.31,1.35,1.36,1.40,
+1.44,1.44,1.46,1.47,1.56,1.50,1.49,1.61,1.57,1.57,
+1.68,1.57,1.60,1.73,1.67,1.71,1.75,1.75,1.76,1.83,
+1.85,1.75,1.84,1.85,1.78,1.82,1.87,2.01,2.04,1.93,
+1.98,1.98,1.97,1.98,2.14,2.07,2.08,2.01,2.06,2.09,
+2.10,2.11,2.16,2.14,2.22,2.20,2.19,2.20,2.24,2.17,
+2.20,2.30,2.26,2.30,2.31,2.31,2.38,2.39,2.33,2.41,
+2.40,2.33,2.47,2.42,2.39,2.52,2.51,2.55,2.55,2.43,
+2.54,2.47,2.43,2.47,2.63,2.56,2.61,2.51,2.69,2.65,
+2.52,2.67,2.64,2.65,2.72,2.61,2.69,2.76,2.66,2.76,
+2.81,2.76,2.80,2.75,2.76,2.82,2.85,2.74,2.93,2.91,
+2.95,2.96,2.78,2.95,2.89,2.87,2.85,2.84,2.86,3.02,
+2.86,3.04,3.00,2.87,2.98,3.04,3.08,3.03,3.15,3.01,
+2.99,3.05,3.01,2.97,3.05,3.10,3.07,3.14,3.13,3.15,
+3.23,3.12,3.15,3.12,3.17,3.05,3.20,3.25,3.35,3.28,
+3.33,3.39,3.34,3.33,3.34,3.53,3.34,3.39,3.40,3.38,
+3.47,3.47,3.40,3.44,3.40,3.41,3.48,3.44,3.61,3.50,
+3.47,3.40,3.53,3.49,3.35,3.54,3.46,3.59,3.52,3.42,
+3.51,3.48,3.48,3.50,3.65,3.62,3.55,3.58,3.61,3.56,
+3.64,3.65,3.59,3.76,3.61,3.72,3.75,3.71,3.71,3.74,
+3.78,3.65,3.73,3.83,3.72,3.64,3.90,3.60,3.69,3.87,
+3.79,3.78,3.88,3.75,3.83,3.81,3.79,3.80,3.89,3.98,
+3.91,3.84,3.95,3.92,3.91,4.04,3.84,3.88,3.96,4.04,
+3.90,3.96,3.87,4.02,4.03,4.07,4.02,3.95,4.02,3.98,
+4.00,4.09,3.94,4.13,4.16,4.14,4.13,4.09,4.15,4.19,
+4.00,4.09,3.99,4.18,4.35,4.25,4.18,4.22,4.08,4.27,
+4.14,4.37,4.26,4.29,4.25,4.15,4.15,4.33,4.30,4.27,
+4.16,4.29,4.16,4.24,4.29,4.41,4.19,4.41,4.31,4.38,
+0.85,0.91,0.91,0.96,1.00,1.02,1.06,1.05,1.12,1.12,
+1.20,1.16,1.17,1.26,1.30,1.32,1.27,1.34,1.37,1.40,
+1.44,1.43,1.44,1.39,1.53,1.45,1.49,1.53,1.54,1.60,
+1.60,1.59,1.63,1.67,1.63,1.72,1.78,1.65,1.76,1.77,
+1.76,1.83,1.81,1.81,1.85,1.81,1.87,1.83,1.90,1.91,
+1.92,1.90,1.97,1.93,1.97,2.01,2.04,2.00,2.01,2.14,
+2.09,2.14,2.10,2.15,2.13,2.06,2.21,2.13,2.21,2.32,
+2.23,2.21,2.24,2.15,2.27,2.23,2.29,2.38,2.30,2.33,
+2.39,2.36,2.41,2.47,2.40,2.49,2.41,2.43,2.38,2.55,
+2.42,2.41,2.50,2.51,2.58,2.68,2.52,2.55,2.57,2.51,
+2.57,2.63,2.63,2.68,2.65,2.68,2.65,2.67,2.61,2.61,
+2.78,2.76,2.71,2.72,2.76,2.79,2.85,2.78,2.72,2.87,
+2.74,2.91,2.76,2.90,2.85,2.95,2.94,2.84,2.93,2.83,
+2.93,3.03,2.93,2.96,3.02,3.09,3.04,2.99,3.00,2.92,
+2.97,3.02,3.00,2.93,3.05,3.02,3.12,3.16,3.19,3.07,
+3.14,3.09,3.10,3.11,3.19,3.26,3.18,3.26,3.27,3.24,
+3.18,3.25,3.34,3.18,3.26,3.22,3.35,3.38,3.37,3.32,
+3.33,3.50,3.35,3.19,3.36,3.47,3.48,3.43,3.41,3.17,
+3.41,3.45,3.40,3.47,3.54,3.44,3.55,3.44,3.54,3.47,
+3.39,3.60,3.49,3.59,3.60,3.51,3.57,3.47,3.56,3.53,
+3.67,3.61,3.50,3.55,3.50,3.51,3.56,3.62,3.57,3.63,
+3.72,3.72,3.59,3.53,3.79,3.86,3.67,3.73,3.72,3.77,
+3.91,3.67,3.84,3.79,3.88,3.61,3.70,3.92,3.79,3.77,
+3.90,3.87,3.88,3.75,3.84,3.82,3.76,3.98,3.84,3.74,
+3.95,3.84,3.93,3.84,3.91,4.07,3.96,3.89,4.02,3.81,
+3.98,4.01,4.12,3.98,3.96,3.97,4.14,3.95,4.05,4.00,
+4.15,4.16,4.06,4.04,4.02,4.21,4.16,3.93,4.12,4.36,
+3.98,4.17,4.12,4.07,4.08,4.13,4.02,3.98,4.10,4.12,
+4.25,4.19,4.26,4.12,4.15,4.30,4.32,4.11,4.34,4.27,
+0.87,0.90,0.91,0.93,0.98,0.97,1.07,1.07,1.08,1.13,
+1.17,1.13,1.19,1.22,1.25,1.25,1.27,1.34,1.34,1.32,
+1.35,1.40,1.40,1.43,1.47,1.49,1.48,1.52,1.52,1.54,
+1.57,1.55,1.66,1.64,1.66,1.67,1.72,1.63,1.65,1.64,
+1.69,1.77,1.86,1.84,1.84,1.85,1.79,1.86,1.86,2.04,
+1.97,1.97,1.98,2.02,1.94,1.91,2.03,1.95,2.03,2.06,
+1.98,2.12,2.21,2.22,2.27,2.06,2.17,2.20,2.09,2.19,
+2.11,2.21,2.19,2.32,2.19,2.39,2.34,2.32,2.35,2.29,
+2.44,2.33,2.27,2.29,2.37,2.38,2.48,2.45,2.41,2.44,
+2.43,2.34,2.46,2.50,2.50,2.48,2.49,2.45,2.58,2.47,
+2.51,2.61,2.60,2.46,2.60,2.63,2.66,2.70,2.73,2.76,
+2.65,2.54,2.69,2.73,2.80,2.67,2.63,2.87,2.64,2.79,
+2.59,2.72,2.80,2.85,2.81,2.90,2.87,2.88,2.79,2.81,
+2.83,2.85,2.84,3.02,2.97,2.93,2.93,3.07,2.97,2.92,
+2.94,3.12,2.97,3.11,2.93,3.11,2.96,3.09,3.09,3.01,
+3.04,3.00,3.11,3.05,3.24,3.20,3.12,3.06,3.17,3.21,
+3.17,3.25,3.21,3.31,3.26,3.31,3.11,3.26,3.35,3.32,
+3.16,3.41,3.23,3.37,3.32,3.33,3.19,3.47,3.43,3.32,
+3.32,3.30,3.48,3.38,3.31,3.41,3.44,3.43,3.45,3.42,
+3.38,3.55,3.57,3.30,3.45,3.41,3.60,3.57,3.53,3.43,
+3.44,3.48,3.38,3.60,3.51,3.67,3.54,3.63,3.71,3.54,
+3.74,3.68,3.56,3.72,3.55,3.59,3.63,3.40,3.65,3.61,
+3.69,3.85,3.69,3.83,3.84,3.71,3.72,3.63,3.87,3.73,
+3.71,3.79,3.91,3.89,3.80,3.79,3.86,3.92,3.87,3.84,
+3.82,3.80,3.82,3.82,3.94,3.76,3.81,3.96,3.73,3.99,
+4.01,3.87,3.85,3.91,3.83,3.96,3.96,4.07,3.98,4.07,
+3.79,3.97,3.96,4.13,4.13,3.89,4.08,4.00,4.19,4.04,
+4.22,3.97,4.19,4.01,4.03,3.97,4.25,4.03,4.11,4.22,
+4.12,4.16,4.15,4.04,4.13,4.11,4.17,4.10,4.31,4.03,
+0.83,0.91,0.88,0.95,0.98,1.01,1.05,1.02,1.07,1.08,
+1.12,1.15,1.20,1.24,1.30,1.25,1.29,1.34,1.32,1.33,
+1.42,1.34,1.40,1.38,1.50,1.46,1.45,1.49,1.48,1.51,
+1.53,1.54,1.56,1.57,1.69,1.70,1.71,1.61,1.70,1.79,
+1.79,1.79,1.77,1.79,1.74,1.85,1.85,1.87,1.86,1.82,
+1.88,1.87,1.93,1.92,2.00,1.99,1.99,2.14,1.97,1.98,
+2.08,2.04,2.07,2.06,2.09,2.08,2.11,2.13,2.17,2.14,
+2.17,2.23,2.23,2.22,2.26,2.22,2.23,2.36,2.31,2.21,
+2.31,2.36,2.33,2.38,2.38,2.31,2.34,2.44,2.39,2.43,
+2.42,2.50,2.53,2.51,2.51,2.51,2.42,2.56,2.48,2.48,
+2.58,2.55,2.49,2.70,2.60,2.58,2.74,2.57,2.70,2.72,
+2.75,2.67,2.63,2.76,2.69,2.67,2.77,2.63,2.67,2.64,
+2.84,2.75,2.68,2.74,2.81,2.75,2.86,2.86,2.73,2.93,
+3.02,2.82,2.89,2.97,2.86,3.00,3.00,2.88,2.93,2.98,
+2.94,3.04,3.00,2.93,2.88,3.07,2.93,3.00,3.06,3.06,
+3.10,3.09,3.07,3.00,3.15,3.14,3.27,3.03,3.14,3.21,
+2.94,3.07,3.11,3.31,3.14,3.20,3.10,3.36,3.12,3.14,
+3.14,3.30,3.31,3.25,3.27,3.16,3.22,3.32,3.25,3.40,
+3.32,3.35,3.32,3.35,3.35,3.45,3.35,3.47,3.38,3.30,
+3.40,3.38,3.35,3.37,3.59,3.43,3.35,3.43,3.56,3.45,
+3.48,3.49,3.46,3.47,3.47,3.45,3.64,3.49,3.61,3.59,
+3.71,3.55,3.52,3.53,3.58,3.60,3.59,3.41,3.77,3.50,
+3.58,3.44,3.62,3.60,3.66,3.76,3.65,3.66,3.79,3.78,
+3.70,3.65,3.84,3.71,3.72,3.68,3.60,3.81,3.62,3.86,
+3.90,3.81,3.86,3.76,3.89,3.85,3.85,4.01,3.79,3.93,
+3.90,3.94,3.94,3.69,3.92,3.92,3.95,3.89,4.03,3.79,
+3.91,4.03,4.02,4.01,3.97,4.10,3.99,3.99,3.91,3.98,
+3.90,4.05,4.00,4.18,4.11,4.08,4.03,4.15,4.09,3.91,
+4.27,4.25,3.94,4.09,4.17,4.16,4.24,4.08,4.23,4.18,
+0.84,0.86,0.92,0.95,0.98,0.99,1.03,1.03,1.10,1.09,
+1.14,1.16,1.14,1.19,1.24,1.25,1.27,1.28,1.29,1.32,
+1.34,1.38,1.39,1.34,1.42,1.44,1.47,1.46,1.55,1.48,
+1.53,1.56,1.57,1.58,1.61,1.66,1.67,1.60,1.63,1.67,
+1.64,1.75,1.72,1.68,1.78,1.78,1.77,1.86,1.79,1.87,
+1.79,1.85,1.92,1.91,1.96,1.92,2.02,1.98,1.95,2.05,
+2.01,2.06,1.97,2.03,1.99,2.07,2.11,2.18,2.11,2.18,
+2.06,2.14,2.21,2.17,2.18,2.18,2.17,2.21,2.19,2.28,
+2.22,2.28,2.35,2.36,2.27,2.44,2.30,2.39,2.42,2.34,
+2.44,2.40,2.37,2.41,2.52,2.45,2.48,2.47,2.56,2.49,
+2.40,2.46,2.48,2.57,2.52,2.56,2.53,2.64,2.53,2.55,
+2.65,2.62,2.61,2.68,2.59,2.65,2.62,2.74,2.72,2.67,
+2.64,2.74,2.77,2.76,2.74,2.72,2.84,2.73,2.66,2.85,
+2.77,2.88,2.84,2.79,2.91,2.89,2.79,2.83,2.93,2.84,
+2.94,2.88,2.84,2.98,2.93,2.92,3.06,2.94,2.95,2.99,
+2.99,2.98,2.94,3.08,3.10,3.07,3.09,3.25,2.98,3.06,
+3.03,3.18,3.21,3.13,3.21,3.16,3.19,3.24,3.10,3.05,
+3.21,3.16,3.24,3.19,3.25,3.04,3.27,3.12,3.33,3.25,
+3.15,3.23,3.36,3.20,3.32,3.36,3.42,3.39,3.34,3.25,
+3.28,3.34,3.36,3.51,3.40,3.36,3.28,3.42,3.37,3.46,
+3.50,3.51,3.56,3.50,3.33,3.44,3.39,3.50,3.47,3.59,
+3.68,3.47,3.42,3.41,3.50,3.27,3.64,3.54,3.50,3.64,
+3.55,3.56,3.51,3.53,3.69,3.68,3.69,3.58,3.73,3.64,
+3.60,3.65,3.58,3.76,3.78,3.76,3.77,3.80,3.77,3.82,
+3.84,3.66,4.01,3.96,3.80,3.75,3.83,3.66,4.01,3.82,
+3.69,3.74,3.82,3.93,3.80,3.65,3.82,3.88,3.78,3.91,
+4.06,4.02,3.81,4.08,3.85,3.85,3.85,3.90,4.01,3.94,
+4.01,4.04,4.02,3.82,4.14,4.09,3.81,4.05,3.93,4.24,
+4.00,4.19,4.13,4.25,4.07,3.91,4.03,3.96,3.99,4.13,
+0.80,0.87,0.87,0.90,0.93,1.00,1.02,1.06,1.06,1.09,
+1.08,1.11,1.12,1.17,1.19,1.21,1.23,1.27,1.30,1.32,
+1.34,1.29,1.39,1.38,1.36,1.45,1.45,1.46,1.52,1.50,
+1.52,1.47,1.54,1.60,1.54,1.60,1.60,1.70,1.61,1.70,
+1.65,1.71,1.67,1.71,1.73,1.71,1.72,1.79,1.85,1.83,
+1.82,1.82,1.80,1.88,1.82,1.90,2.00,1.91,1.97,1.94,
+2.00,1.96,1.98,1.99,2.02,2.01,2.03,2.07,2.08,2.03,
+2.12,2.03,2.10,2.13,2.17,2.24,2.25,2.17,2.20,2.14,
+2.28,2.14,2.25,2.30,2.25,2.26,2.32,2.31,2.41,2.38,
+2.36,2.34,2.34,2.33,2.27,2.50,2.48,2.40,2.44,2.46,
+2.44,2.54,2.46,2.61,2.49,2.60,2.55,2.44,2.49,2.48,
+2.60,2.67,2.63,2.66,2.73,2.62,2.61,2.67,2.67,2.67,
+2.60,2.67,2.64,2.68,2.63,2.79,2.83,2.72,2.61,2.76,
+2.83,2.81,2.68,2.85,2.81,2.72,2.73,2.90,2.88,2.81,
+2.80,2.88,2.88,2.76,2.92,2.92,2.90,2.90,2.85,2.93,
+3.02,3.00,2.86,3.02,3.01,2.89,3.01,3.09,3.07,3.09,
+3.02,3.04,3.04,3.01,3.17,3.09,3.28,3.14,3.06,3.10,
+3.18,3.16,3.07,3.14,3.24,3.25,3.29,3.14,3.31,3.19,
+3.11,3.31,3.33,3.22,3.20,3.38,3.19,3.50,3.23,3.20,
+3.31,3.36,3.34,3.30,3.29,3.45,3.23,3.34,3.44,3.34,
+3.41,3.40,3.29,3.49,3.34,3.45,3.38,3.40,3.47,3.54,
+3.52,3.45,3.61,3.52,3.45,3.51,3.76,3.57,3.52,3.53,
+3.77,3.61,3.62,3.58,3.56,3.59,3.57,3.56,3.53,3.60,
+3.45,3.59,3.75,3.49,3.73,3.69,3.51,3.67,3.75,3.79,
+3.61,3.61,3.54,3.79,3.63,3.80,3.86,3.73,3.80,3.59,
+3.69,3.74,3.70,3.63,3.76,3.86,3.83,3.70,3.71,4.04,
+3.82,3.90,3.72,3.95,3.93,3.75,3.83,3.96,3.90,3.81,
+3.86,3.96,4.12,3.88,4.05,3.83,3.85,4.07,3.89,4.00,
+3.94,3.78,4.04,4.03,4.13,4.09,4.06,4.16,4.21,4.14,
+0.78,0.82,0.85,0.89,0.90,0.92,0.95,1.03,1.05,1.08,
+1.11,1.11,1.11,1.14,1.18,1.15,1.22,1.24,1.30,1.25,
+1.32,1.34,1.34,1.37,1.38,1.40,1.39,1.38,1.37,1.49,
+1.49,1.51,1.52,1.57,1.54,1.59,1.61,1.58,1.59,1.60,
+1.61,1.66,1.68,1.64,1.69,1.72,1.69,1.84,1.76,1.85,
+1.85,1.82,1.79,1.82,1.88,1.85,1.86,1.91,1.92,1.93,
+1.96,1.99,1.97,2.04,1.92,1.93,2.02,2.08,2.02,2.03,
+2.07,2.09,2.09,2.05,2.15,2.11,2.19,2.14,2.17,2.23,
+2.17,2.13,2.21,2.30,2.27,2.23,2.15,2.37,2.28,2.25,
+2.34,2.27,2.31,2.38,2.32,2.33,2.43,2.47,2.38,2.47,
+2.40,2.42,2.41,2.47,2.46,2.44,2.41,2.54,2.54,2.50,
+2.52,2.54,2.49,2.58,2.62,2.57,2.52,2.59,2.65,2.66,
+2.53,2.70,2.65,2.69,2.71,2.58,2.77,2.64,2.72,2.59,
+2.73,2.73,2.75,2.82,2.76,2.74,2.70,2.79,2.87,2.86,
+2.77,2.81,2.76,2.78,2.72,2.77,2.94,2.88,2.90,2.94,
+2.96,2.86,2.93,2.87,2.95,2.97,3.00,3.06,3.02,3.01,
+3.02,2.91,2.98,3.03,2.96,2.94,3.18,3.15,3.00,3.12,
+2.92,3.00,3.10,3.11,3.17,3.01,3.18,3.12,3.18,3.23,
+3.13,3.11,3.21,3.29,3.22,3.28,3.12,3.36,3.19,3.18,
+3.31,3.22,3.31,3.22,3.34,3.36,3.35,3.18,3.30,3.29,
+3.33,3.26,3.44,3.33,3.50,3.38,3.26,3.39,3.38,3.34,
+3.40,3.33,3.34,3.31,3.53,3.55,3.41,3.42,3.44,3.40,
+3.47,3.56,3.55,3.43,3.48,3.54,3.49,3.62,3.44,3.72,
+3.65,3.47,3.54,3.64,3.54,3.72,3.48,3.53,3.61,3.64,
+3.70,3.68,3.59,3.59,3.95,3.53,3.57,3.62,3.61,3.62,
+3.67,3.72,3.61,3.81,3.78,3.82,3.61,3.78,3.77,3.76,
+3.69,3.76,3.88,3.79,3.75,3.87,3.66,3.88,3.93,3.82,
+3.71,3.82,3.77,3.84,3.94,3.78,3.85,3.87,3.94,3.93,
+3.85,3.81,3.95,3.87,3.92,3.89,3.88,4.06,3.91,3.92,
+1.00,1.09,1.14,1.17,1.26,1.31,1.32,1.41,1.45,1.44,
+1.45,1.51,1.54,1.59,1.60,1.67,1.70,1.69,1.77,1.72,
+1.75,1.90,1.89,1.99,2.05,1.89,1.99,2.03,2.05,2.09,
+2.06,2.15,2.16,2.16,2.27,2.25,2.18,2.29,2.20,2.26,
+2.33,2.41,2.30,2.37,2.44,2.45,2.45,2.50,2.55,2.51,
+2.51,2.62,2.64,2.71,2.68,2.74,2.52,2.80,2.72,2.80,
+2.74,2.80,2.75,2.76,2.85,2.86,3.00,3.01,2.86,2.87,
+2.95,3.04,2.89,2.97,3.12,3.14,3.03,3.03,3.01,3.10,
+3.09,3.05,3.12,3.12,3.18,3.26,3.29,3.36,3.39,3.17,
+3.37,3.38,3.45,3.41,3.43,3.45,3.44,3.37,3.56,3.48,
+3.63,3.46,3.37,3.60,3.58,3.47,3.58,3.63,3.82,3.68,
+3.75,3.63,3.59,3.76,3.70,3.84,3.77,3.61,3.77,3.73,
+3.88,3.69,3.96,3.85,3.79,3.80,3.76,3.95,3.92,4.11,
+3.98,3.71,3.80,4.06,4.01,3.95,3.95,3.94,4.01,4.16,
+4.19,3.99,4.17,4.06,4.27,4.15,4.05,4.22,4.10,4.18,
+4.25,4.15,4.17,4.30,4.29,4.29,4.21,4.41,4.42,4.29,
+4.31,4.34,4.39,4.42,4.49,4.47,4.41,4.46,4.44,4.43,
+4.55,4.49,4.45,4.58,4.48,4.38,4.56,4.49,4.65,4.38,
+4.44,4.67,4.57,4.41,4.79,4.51,4.45,4.45,4.67,4.66,
+4.52,4.75,4.64,4.86,4.68,4.91,4.68,4.60,5.01,4.84,
+4.78,4.97,4.84,5.00,5.03,4.93,4.86,4.80,4.75,4.84,
+4.93,5.00,4.91,5.00,4.91,5.01,5.04,5.04,5.03,5.01,
+5.09,5.22,5.05,5.18,5.27,5.13,5.09,5.20,4.90,5.30,
+4.97,5.15,5.19,5.08,5.19,5.14,5.09,5.26,5.12,5.01,
+5.17,5.28,5.31,5.21,5.58,5.19,5.13,5.10,5.14,5.31,
+5.33,5.51,5.44,5.26,5.37,5.24,5.34,5.41,5.63,5.60,
+5.27,5.40,5.58,5.65,5.69,5.55,5.53,5.66,5.54,5.77,
+5.34,5.69,5.50,5.49,5.59,5.60,5.48,5.89,5.96,5.60,
+5.73,5.47,5.79,5.68,5.62,5.74,5.92,5.37,5.77,5.65,
+0.95,1.02,1.11,1.14,1.16,1.23,1.26,1.33,1.36,1.43,
+1.43,1.42,1.51,1.51,1.52,1.54,1.58,1.58,1.64,1.73,
+1.72,1.73,1.83,1.91,1.79,1.81,1.87,1.86,1.95,1.89,
+1.99,2.01,2.03,2.05,2.09,2.08,2.19,2.10,2.14,2.15,
+2.15,2.24,2.21,2.22,2.30,2.35,2.38,2.25,2.35,2.35,
+2.45,2.42,2.45,2.44,2.50,2.44,2.55,2.55,2.57,2.61,
+2.57,2.61,2.55,2.66,2.62,2.64,2.82,2.62,2.71,2.77,
+2.71,2.83,2.79,2.83,2.93,2.88,2.94,2.84,2.95,2.99,
+2.87,2.83,2.94,2.96,3.23,3.00,2.91,3.01,3.10,3.05,
+3.06,3.07,3.10,3.21,3.20,3.27,3.16,3.22,3.25,3.18,
+3.21,3.18,3.15,3.30,3.12,3.49,3.39,3.38,3.48,3.38,
+3.33,3.40,3.48,3.44,3.46,3.50,3.56,3.42,3.43,3.44,
+3.36,3.53,3.46,3.67,3.55,3.64,3.56,3.67,3.70,3.64,
+3.60,3.62,3.77,3.69,3.79,3.74,3.67,3.77,3.72,3.82,
+3.87,3.72,3.75,3.92,3.72,3.89,3.82,3.90,3.86,3.75,
+3.98,3.78,3.89,3.97,3.87,3.76,4.07,4.07,4.05,4.01,
+4.12,4.04,3.97,4.12,4.03,4.12,4.23,4.13,3.99,4.09,
+4.15,4.28,4.30,4.21,4.25,4.23,4.20,4.37,4.23,4.28,
+4.37,4.07,4.15,4.26,4.36,4.32,4.37,4.30,4.22,4.31,
+4.48,4.32,4.42,4.50,4.40,4.39,4.53,4.42,4.43,4.49,
+4.60,4.49,4.39,4.57,4.46,4.56,4.50,4.48,4.55,4.81,
+4.56,4.66,4.63,4.53,4.66,4.62,4.82,4.73,4.67,4.71,
+4.76,4.89,4.68,4.81,4.75,4.61,4.62,4.85,4.89,4.83,
+4.87,4.69,4.83,4.85,4.87,4.72,4.93,5.02,5.00,4.88,
+4.76,4.66,4.90,5.05,4.84,4.86,4.94,5.07,4.92,5.11,
+4.99,4.98,4.98,5.10,5.09,5.10,4.95,5.11,5.15,5.11,
+5.04,5.06,5.18,5.11,5.28,5.12,5.39,5.12,5.22,4.95,
+5.27,5.35,5.34,5.12,5.17,5.22,5.43,5.24,5.25,5.38,
+5.39,5.17,5.34,5.23,5.38,5.49,5.32,5.34,5.42,5.33,
+0.99,0.99,1.03,1.07,1.09,1.19,1.17,1.19,1.25,1.31,
+1.36,1.36,1.32,1.38,1.44,1.51,1.53,1.53,1.54,1.57,
+1.59,1.63,1.66,1.76,1.67,1.76,1.79,1.77,1.87,1.87,
+1.89,1.85,1.89,1.95,2.00,2.04,1.97,2.03,2.10,2.06,
+1.99,2.19,2.03,2.15,2.19,2.22,2.18,2.20,2.22,2.25,
+2.31,2.22,2.31,2.28,2.38,2.40,2.39,2.35,2.45,2.44,
+2.45,2.45,2.42,2.55,2.53,2.60,2.57,2.56,2.58,2.70,
+2.70,2.69,2.75,2.65,2.81,2.73,2.65,2.82,2.81,2.77,
+2.79,2.81,2.78,2.93,2.85,2.78,2.86,2.88,3.02,2.88,
+3.02,3.04,2.99,3.07,3.07,3.01,3.02,3.01,3.08,3.08,
+3.00,3.15,3.12,3.07,2.98,3.13,3.14,3.39,3.25,3.12,
+3.31,3.20,3.24,3.09,3.26,3.26,3.29,3.38,3.34,3.52,
+3.34,3.39,3.46,3.39,3.38,3.42,3.35,3.39,3.52,3.29,
+3.34,3.50,3.44,3.40,3.50,3.47,3.55,3.64,3.49,3.63,
+3.66,3.68,3.71,3.72,3.64,3.58,3.75,3.61,3.81,3.71,
+3.69,3.66,3.85,3.69,3.78,3.84,3.81,3.69,3.68,3.72,
+3.83,3.95,3.91,3.81,3.73,3.83,3.95,3.95,3.86,3.98,
+3.82,4.02,3.94,3.98,3.92,3.84,3.93,4.07,4.13,4.04,
+4.01,4.00,4.14,4.17,4.21,3.99,4.02,4.29,4.12,4.05,
+4.01,4.14,4.29,4.37,4.16,4.14,4.06,4.09,4.17,4.30,
+4.26,4.36,4.29,4.25,4.26,4.39,4.36,4.31,4.14,4.22,
+4.37,4.55,4.36,4.45,4.33,4.50,4.33,4.31,4.45,4.36,
+4.46,4.54,4.43,4.46,4.54,4.51,4.58,4.66,4.55,4.50,
+4.58,4.42,4.55,4.63,4.50,4.19,4.75,4.66,4.61,4.59,
+4.70,4.79,4.64,4.73,4.78,4.71,4.72,4.83,4.60,4.75,
+4.66,4.51,4.68,4.99,4.63,4.68,4.86,4.93,4.96,4.71,
+4.72,4.82,4.72,4.90,4.71,4.82,4.96,4.94,4.88,4.83,
+4.49,4.92,5.05,5.05,4.90,4.97,4.96,4.99,5.10,4.98,
+4.96,4.82,4.90,5.26,5.18,4.92,5.20,4.91,4.98,5.10,
+0.90,0.97,1.01,1.06,1.10,1.09,1.11,1.15,1.24,1.26,
+1.26,1.28,1.33,1.30,1.37,1.42,1.46,1.54,1.52,1.52,
+1.58,1.56,1.62,1.60,1.62,1.58,1.72,1.70,1.80,1.79,
+1.78,1.78,1.76,1.86,1.83,1.82,1.87,1.97,1.91,1.91,
+1.98,2.00,2.04,2.12,1.99,2.12,2.01,2.10,2.13,2.09,
+2.25,2.18,2.12,2.23,2.26,2.32,2.21,2.32,2.31,2.15,
+2.35,2.40,2.43,2.44,2.37,2.36,2.53,2.39,2.53,2.48,
+2.45,2.51,2.47,2.55,2.62,2.46,2.53,2.74,2.64,2.62,
+2.59,2.63,2.75,2.76,2.74,2.70,2.68,2.85,2.73,2.85,
+2.83,2.88,2.78,2.83,2.97,2.89,2.77,2.96,2.92,2.94,
+2.89,2.92,2.90,2.90,2.95,2.99,3.05,2.98,3.19,2.85,
+3.16,3.11,3.08,3.12,3.14,3.16,3.10,3.29,3.11,3.17,
+3.22,3.38,3.18,3.32,3.32,3.25,3.18,3.28,3.25,3.32,
+3.44,3.42,3.29,3.31,3.31,3.48,3.17,3.48,3.41,3.58,
+3.44,3.42,3.41,3.58,3.51,3.44,3.45,3.49,3.56,3.38,
+3.64,3.45,3.53,3.47,3.62,3.51,3.70,3.67,3.61,3.65,
+3.68,3.60,3.62,3.68,3.80,3.71,3.72,3.64,3.72,3.75,
+3.67,3.64,3.79,3.61,3.83,3.83,3.78,3.92,3.78,3.94,
+3.91,3.80,3.77,3.85,3.77,3.92,4.04,3.87,4.03,4.05,
+3.94,3.89,3.94,3.94,3.94,3.97,3.95,3.91,4.05,4.10,
+4.11,4.04,3.90,4.05,4.11,4.08,3.93,4.11,4.07,4.12,
+4.14,4.33,4.16,4.16,4.11,4.24,4.23,4.33,4.14,4.12,
+4.27,4.24,4.15,4.26,4.38,4.37,4.15,4.20,4.30,4.35,
+4.22,4.32,4.35,4.28,4.33,4.27,4.70,4.41,4.42,4.36,
+4.41,4.28,4.50,4.39,4.48,4.46,4.29,4.37,4.55,4.37,
+4.50,4.27,4.35,4.50,4.62,4.49,4.77,4.59,4.48,4.73,
+4.59,4.67,4.57,4.60,4.79,4.71,4.67,4.82,4.74,4.54,
+4.60,4.52,4.71,4.53,4.57,4.86,4.77,4.66,4.75,4.79,
+4.70,4.55,4.73,4.77,4.69,4.81,4.83,4.83,5.04,4.92,
+0.87,0.91,0.96,1.06,1.05,1.14,1.10,1.16,1.16,1.19,
+1.25,1.24,1.29,1.28,1.32,1.38,1.34,1.40,1.46,1.45,
+1.41,1.51,1.51,1.56,1.58,1.54,1.63,1.62,1.66,1.71,
+1.73,1.70,1.77,1.84,1.79,1.80,1.78,1.82,1.89,1.90,
+1.88,1.90,2.00,1.96,1.97,2.03,1.96,2.08,2.07,2.03,
+2.10,2.12,2.11,2.13,2.18,2.17,2.16,2.21,2.15,2.30,
+2.31,2.28,2.28,2.30,2.42,2.42,2.40,2.37,2.29,2.43,
+2.49,2.46,2.35,2.45,2.48,2.49,2.45,2.51,2.44,2.53,
+2.57,2.52,2.60,2.56,2.54,2.47,2.59,2.69,2.61,2.62,
+2.68,2.60,2.87,2.76,2.77,2.69,2.86,2.73,2.82,2.85,
+2.87,2.79,2.88,2.96,2.80,2.71,2.97,2.90,3.03,2.83,
+2.93,3.03,2.98,2.97,2.96,3.05,3.18,2.91,2.96,3.04,
+3.09,3.07,3.01,3.13,3.12,3.21,3.18,3.13,3.16,3.12,
+3.20,3.19,3.04,3.21,3.42,3.29,3.21,3.18,3.30,3.28,
+3.28,3.25,3.31,3.42,3.44,3.34,3.47,3.41,3.42,3.42,
+3.33,3.36,3.41,3.42,3.54,3.42,3.50,3.38,3.57,3.48,
+3.52,3.57,3.51,3.50,3.63,3.59,3.42,3.56,3.59,3.64,
+3.75,3.55,3.69,3.69,3.73,3.63,3.73,3.67,3.60,3.68,
+3.66,3.76,3.64,3.81,3.61,3.68,3.76,3.88,3.73,3.69,
+3.90,3.90,3.81,3.80,3.83,3.78,3.85,3.84,3.99,3.87,
+3.87,3.91,3.86,3.99,3.87,3.98,3.82,4.06,3.82,3.97,
+3.83,4.05,3.96,3.95,3.96,4.04,4.02,4.02,3.98,4.24,
+4.16,4.05,3.77,4.00,4.09,4.22,4.18,3.99,4.05,4.10,
+4.11,4.01,4.05,4.28,4.21,4.26,4.20,4.21,4.26,4.23,
+4.10,4.30,4.23,4.20,4.33,4.36,4.35,4.33,4.37,4.29,
+4.11,4.27,4.35,4.39,4.35,4.56,4.34,4.49,4.54,4.36,
+4.39,4.38,4.50,4.30,4.30,4.34,4.43,4.57,4.59,4.21,
+4.35,4.36,4.49,4.56,4.43,4.44,4.78,4.50,4.59,4.51,
+4.65,4.53,4.40,4.45,4.72,4.81,4.74,4.49,4.59,4.66,
+0.85,0.91,0.94,1.00,1.02,1.07,1.05,1.09,1.19,1.18,
+1.22,1.23,1.23,1.29,1.31,1.32,1.33,1.32,1.46,1.44,
+1.46,1.47,1.47,1.54,1.53,1.53,1.54,1.61,1.61,1.62,
+1.61,1.71,1.73,1.71,1.76,1.76,1.81,1.81,1.82,1.81,
+1.87,1.89,1.91,1.92,1.97,1.95,1.97,2.03,1.97,2.04,
+2.04,2.05,2.08,2.04,2.15,2.09,2.14,2.08,2.11,2.16,
+2.22,2.23,2.21,2.28,2.20,2.22,2.26,2.28,2.24,2.33,
+2.36,2.32,2.33,2.31,2.40,2.47,2.52,2.44,2.41,2.46,
+2.53,2.48,2.55,2.41,2.58,2.55,2.56,2.48,2.49,2.55,
+2.63,2.56,2.54,2.57,2.68,2.61,2.62,2.68,2.68,2.70,
+2.82,2.75,2.67,2.82,2.90,2.84,2.85,2.68,2.84,2.82,
+2.84,2.87,3.00,2.86,2.96,2.96,2.96,2.97,2.92,2.92,
+2.92,2.95,3.08,3.01,2.97,3.11,3.01,3.02,3.01,3.11,
+3.03,3.02,3.06,3.22,3.08,3.09,3.21,3.15,3.17,3.28,
+3.22,3.13,3.19,3.19,3.24,3.13,3.18,3.25,3.33,3.31,
+3.37,3.28,3.15,3.32,3.22,3.29,3.38,3.55,3.33,3.37,
+3.46,3.33,3.52,3.37,3.28,3.43,3.46,3.41,3.52,3.38,
+3.55,3.55,3.52,3.48,3.32,3.60,3.35,3.47,3.57,3.52,
+3.54,3.61,3.62,3.64,3.64,3.67,3.80,3.64,3.71,3.61,
+3.52,3.76,3.57,3.70,3.56,3.78,3.84,3.82,3.61,3.66,
+3.69,3.80,3.80,3.90,3.91,3.98,3.79,3.83,3.84,3.81,
+3.85,3.80,3.86,3.94,4.00,4.00,3.88,3.93,3.90,3.98,
+4.08,3.98,3.84,3.83,3.87,3.88,3.92,3.90,3.99,3.85,
+3.99,4.09,4.10,4.07,3.87,4.03,4.07,3.91,4.02,4.14,
+4.03,4.22,4.09,4.05,4.18,3.97,4.07,4.40,4.09,4.15,
+4.10,4.14,4.19,4.06,4.16,4.16,4.24,4.20,4.33,4.22,
+4.11,4.48,4.31,4.21,4.15,4.45,4.10,4.29,4.32,4.26,
+4.17,4.48,4.34,4.26,4.48,4.44,4.40,4.25,4.58,4.43,
+4.34,4.25,4.33,4.45,4.48,4.48,4.58,4.42,4.46,4.51,
+0.87,0.90,0.96,0.96,0.98,1.04,1.08,1.12,1.15,1.12,
+1.18,1.19,1.20,1.22,1.26,1.29,1.32,1.34,1.35,1.43,
+1.45,1.43,1.49,1.51,1.46,1.53,1.58,1.59,1.63,1.57,
+1.64,1.70,1.66,1.67,1.69,1.67,1.67,1.77,1.69,1.75,
+1.81,1.88,1.85,1.87,1.82,1.92,1.83,1.85,1.95,1.96,
+1.98,1.98,2.07,2.07,2.03,2.05,2.15,2.06,2.10,2.13,
+2.12,2.16,2.18,2.15,2.08,2.11,2.23,2.29,2.32,2.23,
+2.30,2.27,2.34,2.29,2.36,2.39,2.35,2.39,2.40,2.39,
+2.41,2.52,2.38,2.37,2.41,2.52,2.52,2.40,2.46,2.62,
+2.55,2.58,2.63,2.50,2.56,2.59,2.59,2.69,2.64,2.60,
+2.63,2.60,2.61,2.76,2.63,2.77,2.66,2.81,2.79,2.77,
+2.82,2.71,2.83,2.82,2.70,2.75,2.91,2.95,2.78,2.84,
+2.79,2.87,2.90,3.05,2.96,2.94,2.93,2.93,2.96,2.88,
+2.99,3.01,3.09,3.02,3.03,3.01,2.98,3.04,3.05,3.19,
+3.05,2.96,3.08,3.10,3.12,3.33,3.23,3.12,3.24,3.29,
+3.08,3.17,3.27,3.32,3.23,3.24,3.27,3.32,3.23,3.28,
+3.34,3.36,3.49,3.28,3.43,3.41,3.29,3.39,3.38,3.38,
+3.39,3.28,3.34,3.47,3.61,3.41,3.42,3.55,3.30,3.52,
+3.60,3.48,3.46,3.60,3.56,3.53,3.64,3.61,3.41,3.45,
+3.56,3.38,3.66,3.51,3.58,3.53,3.69,3.58,3.71,3.68,
+3.70,3.58,3.51,3.54,3.74,3.62,3.66,3.84,3.91,3.83,
+3.84,3.66,3.76,3.78,3.72,3.70,3.76,3.87,3.83,3.83,
+3.86,3.85,3.78,3.73,3.83,4.05,3.89,3.87,3.82,3.79,
+4.04,3.87,3.87,3.96,3.94,4.12,4.00,4.09,3.99,3.88,
+4.04,3.94,4.13,4.16,4.02,4.20,3.93,4.04,4.05,4.15,
+3.95,4.11,4.11,4.14,4.28,4.14,4.06,4.19,4.11,4.06,
+4.13,4.03,4.07,3.91,3.99,4.13,4.31,4.24,3.94,4.20,
+4.23,4.28,4.21,4.16,4.26,4.33,4.19,4.36,4.33,4.21,
+4.22,4.33,4.32,4.18,4.33,4.45,4.26,4.27,4.17,4.34,
+0.88,0.87,0.92,0.93,1.01,0.98,1.04,1.14,1.12,1.16,
+1.14,1.20,1.24,1.17,1.22,1.31,1.32,1.35,1.36,1.43,
+1.41,1.41,1.44,1.50,1.53,1.51,1.49,1.54,1.55,1.59,
+1.57,1.59,1.64,1.64,1.59,1.67,1.73,1.65,1.71,1.78,
+1.68,1.77,1.76,1.86,1.82,1.87,1.86,1.90,1.88,1.93,
+1.96,1.90,1.95,1.97,2.05,1.98,2.11,2.09,2.03,2.07,
+2.05,2.15,2.09,2.12,2.13,2.17,2.13,2.17,2.24,2.22,
+2.28,2.27,2.22,2.38,2.17,2.27,2.28,2.31,2.38,2.34,
+2.41,2.44,2.35,2.42,2.37,2.33,2.34,2.42,2.44,2.49,
+2.49,2.51,2.51,2.53,2.53,2.60,2.69,2.59,2.57,2.56,
+2.62,2.58,2.60,2.61,2.66,2.69,2.64,2.69,2.70,2.65,
+2.78,2.76,2.74,2.74,2.76,2.73,2.76,2.66,2.82,2.93,
+2.75,2.79,2.86,2.86,2.78,2.83,2.91,2.88,2.84,2.87,
+3.00,2.91,3.01,2.94,2.85,3.01,3.00,3.04,3.11,2.94,
+2.92,3.06,3.08,3.14,2.99,3.11,3.00,2.98,3.10,3.13,
+3.06,3.05,3.16,3.10,3.03,3.14,3.14,3.15,3.26,3.15,
+3.19,3.33,3.27,3.38,3.26,3.34,3.27,3.36,3.32,3.27,
+3.23,3.29,3.29,3.46,3.39,3.33,3.29,3.28,3.30,3.38,
+3.40,3.38,3.47,3.33,3.41,3.50,3.50,3.45,3.49,3.49,
+3.45,3.38,3.49,3.66,3.61,3.62,3.51,3.48,3.58,3.57,
+3.53,3.51,3.53,3.57,3.78,3.63,3.72,3.65,3.63,3.64,
+3.64,3.60,3.69,3.84,3.65,3.75,3.72,3.83,3.80,3.70,
+3.71,3.63,3.71,3.67,3.75,3.71,3.75,3.85,3.70,3.77,
+3.91,3.80,3.87,3.91,3.78,3.81,3.82,3.78,3.89,3.84,
+3.85,3.95,4.00,4.03,3.92,4.01,4.07,3.94,4.17,3.93,
+4.12,4.00,3.99,3.95,3.93,3.83,3.86,3.99,3.97,4.08,
+4.07,3.92,4.13,4.12,4.05,3.97,4.21,4.14,4.08,4.02,
+4.22,4.16,4.11,4.44,4.25,4.10,4.15,4.20,4.21,4.14,
+4.30,4.32,4.14,4.07,4.23,4.10,4.09,4.25,4.27,4.25,
+0.87,0.85,0.92,0.94,0.96,0.98,1.03,1.07,1.08,1.14,
+1.18,1.20,1.13,1.20,1.21,1.23,1.29,1.33,1.32,1.34,
+1.35,1.41,1.40,1.47,1.39,1.47,1.54,1.53,1.55,1.56,
+1.53,1.57,1.56,1.70,1.64,1.65,1.75,1.69,1.70,1.65,
+1.71,1.77,1.82,1.70,1.81,1.80,1.84,1.86,1.95,1.94,
+1.89,1.89,1.90,1.92,1.97,2.04,2.03,1.99,2.02,2.05,
+2.11,2.02,1.97,2.08,2.16,2.18,2.21,2.20,2.11,2.25,
+2.24,2.14,2.28,2.18,2.26,2.27,2.23,2.34,2.27,2.36,
+2.33,2.30,2.34,2.33,2.47,2.33,2.40,2.44,2.46,2.47,
+2.44,2.48,2.51,2.46,2.53,2.49,2.58,2.49,2.55,2.51,
+2.63,2.58,2.67,2.64,2.58,2.54,2.65,2.67,2.61,2.67,
+2.66,2.59,2.60,2.77,2.87,2.71,2.71,2.74,2.69,2.84,
+2.76,2.74,2.85,2.85,2.91,2.86,2.86,2.84,2.83,2.77,
+2.84,2.88,2.92,2.92,2.88,2.89,3.00,2.91,3.03,2.97,
+3.01,2.92,3.05,3.07,2.93,3.04,3.02,3.07,3.04,3.15,
+2.95,3.08,3.13,3.20,3.07,3.19,3.12,3.18,3.18,3.17,
+3.20,3.18,3.09,3.27,3.34,3.10,3.18,3.20,3.24,3.26,
+3.26,3.29,3.29,3.36,3.29,3.32,3.21,3.23,3.23,3.34,
+3.39,3.33,3.50,3.41,3.39,3.48,3.31,3.42,3.41,3.43,
+3.52,3.54,3.44,3.32,3.43,3.47,3.54,3.42,3.48,3.43,
+3.57,3.51,3.73,3.58,3.59,3.50,3.63,3.61,3.64,3.77,
+3.49,3.54,3.66,3.69,3.56,3.67,3.70,3.61,3.56,3.59,
+3.69,3.51,3.79,3.61,3.59,3.68,3.66,3.76,3.84,3.70,
+3.68,3.84,3.80,3.61,3.71,3.69,3.79,3.82,3.96,3.77,
+3.90,3.96,3.77,3.81,3.92,3.91,3.88,3.93,3.88,3.79,
+3.88,3.95,3.97,3.86,3.97,3.92,3.92,3.95,3.81,3.90,
+3.95,4.00,3.76,4.14,4.11,3.95,3.94,4.12,4.08,4.08,
+4.18,4.03,3.93,4.11,4.14,3.96,4.11,4.17,4.15,4.02,
+4.06,3.93,4.14,4.21,4.12,4.28,4.23,4.22,4.20,4.35,
+0.88,0.87,0.89,0.96,0.96,1.00,1.05,1.04,1.06,1.11,
+1.13,1.12,1.18,1.21,1.21,1.25,1.37,1.25,1.31,1.36,
+1.37,1.35,1.41,1.41,1.35,1.41,1.50,1.45,1.49,1.53,
+1.53,1.54,1.59,1.61,1.63,1.66,1.62,1.71,1.69,1.70,
+1.69,1.77,1.78,1.77,1.73,1.79,1.74,1.77,1.79,1.91,
+1.95,1.90,1.93,1.98,1.90,1.93,2.00,2.00,2.00,2.04,
+2.04,1.99,2.08,2.07,2.02,2.09,2.11,2.07,2.13,2.18,
+2.20,2.09,2.12,2.21,2.16,2.23,2.22,2.31,2.23,2.28,
+2.32,2.27,2.25,2.34,2.27,2.35,2.29,2.42,2.33,2.33,
+2.44,2.41,2.44,2.45,2.49,2.53,2.58,2.49,2.50,2.47,
+2.48,2.48,2.55,2.56,2.58,2.55,2.63,2.65,2.62,2.54,
+2.67,2.65,2.63,2.67,2.66,2.75,2.63,2.76,2.72,2.80,
+2.84,2.66,2.78,2.73,2.92,2.78,2.89,2.80,2.76,2.75,
+2.78,2.85,2.91,2.74,2.85,2.97,2.90,2.91,2.78,3.03,
+2.70,2.99,2.97,2.97,2.95,3.03,2.92,2.94,2.96,2.92,
+3.16,3.18,3.04,2.98,3.06,3.14,3.04,3.03,3.15,2.98,
+3.13,3.13,3.07,3.19,3.22,3.18,3.25,3.11,3.29,3.06,
+3.29,3.21,3.24,3.24,3.21,3.25,3.25,3.23,3.16,3.19,
+3.33,3.24,3.34,3.37,3.33,3.33,3.26,3.53,3.39,3.22,
+3.46,3.42,3.38,3.45,3.38,3.51,3.57,3.59,3.28,3.47,
+3.40,3.45,3.45,3.59,3.52,3.60,3.46,3.49,3.52,3.58,
+3.58,3.56,3.58,3.62,3.63,3.61,3.53,3.64,3.52,3.61,
+3.70,3.72,3.61,3.65,3.59,3.67,3.80,3.71,3.73,3.63,
+3.73,3.87,3.61,3.75,3.73,3.81,3.79,3.70,3.74,3.74,
+3.74,3.81,3.88,3.72,3.83,3.78,3.72,3.89,3.77,4.01,
+3.83,3.84,4.01,3.86,3.90,3.85,3.84,4.01,3.98,3.88,
+3.99,3.96,3.77,4.05,3.85,4.01,3.93,3.92,4.03,3.84,
+3.97,4.03,4.13,4.01,3.97,3.99,3.96,3.97,4.00,4.15,
+4.19,4.07,4.15,4.07,4.09,4.02,3.90,4.05,4.13,4.03,
+0.82,0.86,0.87,0.92,0.94,0.96,1.01,1.05,1.11,1.05,
+1.11,1.12,1.17,1.20,1.21,1.26,1.21,1.30,1.35,1.34,
+1.32,1.36,1.39,1.45,1.44,1.43,1.45,1.48,1.45,1.58,
+1.56,1.56,1.62,1.62,1.60,1.58,1.68,1.64,1.63,1.71,
+1.72,1.68,1.73,1.72,1.68,1.70,1.84,1.82,1.83,1.86,
+1.81,1.84,1.79,1.84,1.92,1.93,1.97,1.93,1.94,1.95,
+2.09,1.97,2.01,2.05,2.06,2.04,2.15,2.07,2.08,2.12,
+2.15,2.09,2.10,2.16,2.21,2.19,2.22,2.14,2.17,2.21,
+2.27,2.28,2.32,2.39,2.26,2.33,2.33,2.42,2.37,2.38,
+2.35,2.42,2.37,2.40,2.45,2.42,2.43,2.53,2.37,2.47,
+2.51,2.48,2.60,2.47,2.53,2.61,2.54,2.55,2.46,2.58,
+2.59,2.66,2.70,2.61,2.63,2.54,2.62,2.69,2.69,2.70,
+2.77,2.69,2.63,2.73,2.72,2.89,2.76,2.90,2.74,2.72,
+2.82,2.77,2.80,2.82,2.97,2.80,2.88,2.98,2.98,2.89,
+2.92,2.90,2.95,2.98,2.91,2.91,2.92,2.86,2.92,3.02,
+3.07,2.99,3.03,3.09,3.03,3.10,3.13,2.94,3.09,3.07,
+3.02,3.22,3.02,3.27,3.10,3.21,3.08,3.13,3.18,3.09,
+3.23,3.25,3.25,3.16,3.24,3.10,3.27,3.23,3.22,3.13,
+3.22,3.28,3.27,3.15,3.24,3.19,3.25,3.29,3.25,3.48,
+3.32,3.41,3.36,3.48,3.27,3.38,3.36,3.38,3.60,3.47,
+3.34,3.41,3.47,3.47,3.37,3.44,3.33,3.55,3.38,3.42,
+3.42,3.40,3.41,3.52,3.53,3.55,3.61,3.42,3.53,3.53,
+3.60,3.58,3.49,3.68,3.56,3.56,3.65,3.64,3.61,3.56,
+3.68,3.57,3.65,3.65,3.67,3.67,3.86,3.63,3.72,3.66,
+3.65,3.62,3.81,3.72,3.81,3.84,3.81,3.87,3.87,3.86,
+3.82,3.76,3.88,3.78,3.80,3.87,3.88,3.84,3.78,4.06,
+4.04,3.89,3.80,3.89,3.94,3.81,3.98,4.01,3.83,3.79,
+3.91,3.89,3.90,3.92,3.84,4.08,3.84,3.96,4.13,3.99,
+4.18,4.10,3.89,4.15,3.87,3.87,4.16,4.01,4.00,4.15,
+0.83,0.86,0.88,0.89,0.92,0.95,1.03,1.02,1.04,1.08,
+1.12,1.10,1.16,1.21,1.24,1.20,1.25,1.22,1.32,1.28,
+1.29,1.35,1.44,1.43,1.37,1.47,1.39,1.48,1.47,1.57,
+1.56,1.52,1.59,1.52,1.65,1.57,1.54,1.61,1.68,1.63,
+1.65,1.66,1.72,1.73,1.72,1.75,1.73,1.77,1.79,1.73,
+1.83,1.83,1.84,1.91,1.99,1.87,1.80,1.92,1.98,2.02,
+1.95,1.98,2.00,1.99,2.05,2.03,2.07,2.05,2.04,2.14,
+2.07,2.16,2.12,2.12,2.06,2.21,2.16,2.23,2.19,2.19,
+2.21,2.21,2.27,2.30,2.22,2.26,2.21,2.32,2.24,2.32,
+2.31,2.30,2.29,2.37,2.41,2.47,2.38,2.47,2.47,2.46,
+2.38,2.49,2.50,2.49,2.44,2.68,2.48,2.52,2.56,2.50,
+2.69,2.57,2.51,2.63,2.63,2.48,2.76,2.65,2.67,2.77,
+2.67,2.77,2.61,2.69,2.74,2.71,2.68,2.62,2.64,2.73,
+2.86,2.69,2.82,2.81,2.90,2.80,2.78,2.73,2.80,2.77,
+2.85,2.80,2.96,2.93,2.85,2.99,3.01,2.96,2.92,2.87,
+2.95,2.85,2.96,2.98,2.90,3.05,2.95,3.01,3.12,3.08,
+3.04,3.11,3.06,3.15,3.15,3.06,3.03,3.01,3.04,3.08,
+3.18,3.02,3.16,3.12,3.17,3.10,3.14,3.27,3.25,3.14,
+3.20,3.11,3.15,3.15,3.26,3.39,3.15,3.25,3.10,3.26,
+3.27,3.38,3.30,3.26,3.44,3.25,3.47,3.30,3.30,3.37,
+3.25,3.45,3.35,3.42,3.45,3.47,3.41,3.39,3.58,3.41,
+3.42,3.32,3.47,3.60,3.39,3.45,3.46,3.49,3.50,3.60,
+3.63,3.64,3.59,3.52,3.55,3.65,3.62,3.51,3.66,3.44,
+3.58,3.63,3.60,3.71,3.72,3.61,3.53,3.74,3.69,3.71,
+3.71,3.78,3.74,3.63,3.81,3.72,3.69,3.66,3.83,3.94,
+3.76,3.86,3.78,3.72,3.87,3.89,3.82,3.90,3.91,3.83,
+3.63,3.79,3.98,4.01,3.84,3.94,3.93,3.85,3.85,4.00,
+3.73,3.84,3.98,4.04,3.88,3.95,3.96,3.85,3.77,3.88,
+3.90,3.86,3.91,4.09,3.92,4.08,4.04,4.14,4.21,3.97,
+0.81,0.84,0.91,0.91,0.91,0.98,0.98,0.99,1.02,1.03,
+1.06,1.09,1.15,1.09,1.16,1.22,1.24,1.25,1.26,1.32,
+1.33,1.35,1.32,1.31,1.40,1.42,1.45,1.42,1.41,1.48,
+1.55,1.49,1.51,1.53,1.62,1.57,1.58,1.60,1.60,1.67,
+1.67,1.72,1.68,1.71,1.79,1.71,1.77,1.80,1.75,1.84,
+1.79,1.85,1.83,1.87,1.85,1.83,1.88,1.92,1.97,1.90,
+1.85,1.97,2.01,1.97,2.04,2.05,1.99,1.97,2.05,2.03,
+2.04,2.09,2.19,2.21,2.11,2.17,2.03,2.15,2.16,2.20,
+2.18,2.17,2.24,2.14,2.33,2.22,2.33,2.25,2.30,2.15,
+2.26,2.38,2.36,2.36,2.39,2.41,2.34,2.33,2.44,2.48,
+2.41,2.41,2.51,2.51,2.44,2.50,2.48,2.41,2.48,2.56,
+2.52,2.60,2.46,2.48,2.61,2.59,2.50,2.67,2.67,2.60,
+2.65,2.68,2.59,2.65,2.57,2.74,2.73,2.66,2.69,2.62,
+2.66,2.71,2.67,2.79,2.73,2.74,2.69,2.71,2.85,2.73,
+2.93,2.74,2.89,2.94,2.85,2.97,2.81,2.90,2.88,2.86,
+2.94,3.15,2.89,2.94,2.91,2.96,2.95,3.04,2.92,3.08,
+3.11,2.91,2.96,3.12,2.94,2.98,3.17,3.10,3.10,3.04,
+3.16,3.23,3.20,3.11,3.08,3.16,3.12,3.07,3.20,3.20,
+3.19,3.22,3.27,3.20,3.36,3.39,3.10,3.43,3.34,3.21,
+3.24,3.21,3.07,3.37,3.28,3.34,3.31,3.28,3.34,3.42,
+3.29,3.21,3.34,3.47,3.34,3.36,3.37,3.28,3.40,3.29,
+3.27,3.41,3.44,3.55,3.39,3.41,3.52,3.38,3.47,3.57,
+3.48,3.48,3.54,3.61,3.70,3.38,3.50,3.36,3.53,3.66,
+3.67,3.53,3.68,3.59,3.65,3.60,3.59,3.57,3.64,3.64,
+3.67,3.56,3.48,3.72,3.60,3.62,3.61,3.61,3.65,3.79,
+3.79,3.66,3.67,3.71,3.65,3.80,3.80,3.77,3.71,3.69,
+3.60,3.76,3.89,3.65,3.74,3.83,3.67,3.91,3.89,3.89,
+3.62,3.83,3.87,3.88,3.80,3.94,4.05,3.87,4.06,3.92,
+3.94,3.92,3.85,3.85,3.89,3.95,3.86,3.87,3.99,3.83,
+0.81,0.85,0.89,0.86,0.90,0.95,0.96,0.97,1.07,1.06,
+1.11,1.13,1.11,1.19,1.18,1.17,1.16,1.20,1.23,1.28,
+1.27,1.29,1.31,1.34,1.39,1.39,1.43,1.38,1.41,1.45,
+1.53,1.55,1.51,1.54,1.50,1.62,1.51,1.56,1.64,1.58,
+1.62,1.56,1.70,1.67,1.70,1.78,1.74,1.72,1.70,1.75,
+1.85,1.81,1.86,1.80,1.83,1.86,1.89,1.91,1.86,1.89,
+2.00,1.99,2.00,2.06,2.01,2.09,2.06,1.99,2.02,2.02,
+2.06,2.06,2.15,2.10,2.20,2.15,2.05,2.17,2.15,2.21,
+2.14,2.20,2.17,2.27,2.26,2.11,2.17,2.29,2.20,2.27,
+2.32,2.29,2.29,2.29,2.36,2.39,2.34,2.35,2.37,2.35,
+2.46,2.44,2.58,2.49,2.41,2.40,2.50,2.56,2.43,2.57,
+2.47,2.55,2.57,2.53,2.50,2.47,2.52,2.58,2.59,2.61,
+2.60,2.66,2.75,2.69,2.60,2.60,2.64,2.71,2.86,2.74,
+2.60,2.64,2.73,2.84,2.68,2.79,2.73,2.80,2.80,2.86,
+2.93,2.74,2.87,2.90,2.91,2.73,2.81,2.91,2.96,2.84,
+2.87,2.92,2.84,2.78,2.85,2.81,2.96,2.88,2.93,3.06,
+2.97,2.94,2.97,3.01,3.09,3.01,2.99,3.00,3.01,3.19,
+3.07,2.93,2.96,3.01,3.16,3.10,3.06,3.16,3.19,3.06,
+3.12,3.02,3.07,3.11,3.11,3.16,3.22,3.17,3.18,3.20,
+3.17,3.30,3.18,3.19,3.32,3.15,3.31,3.38,3.30,3.20,
+3.17,3.25,3.31,3.20,3.26,3.39,3.40,3.34,3.37,3.44,
+3.44,3.33,3.54,3.34,3.39,3.33,3.36,3.42,3.42,3.53,
+3.40,3.53,3.34,3.40,3.40,3.53,3.48,3.52,3.48,3.46,
+3.61,3.58,3.48,3.60,3.60,3.65,3.46,3.49,3.58,3.60,
+3.50,3.60,3.77,3.52,3.70,3.60,3.67,3.47,3.67,3.72,
+3.55,3.56,3.65,3.76,3.72,3.77,3.61,3.76,3.83,3.76,
+3.83,3.87,3.70,3.56,3.80,3.78,3.83,3.80,3.77,3.69,
+3.75,3.67,3.90,3.77,3.74,3.86,3.90,3.78,3.98,3.88,
+4.00,3.94,3.81,3.89,3.94,3.82,4.02,4.01,3.85,3.90,
+0.82,0.84,0.87,0.89,0.91,0.92,0.98,1.02,1.04,1.01,
+1.06,1.09,1.09,1.10,1.14,1.18,1.16,1.17,1.24,1.27,
+1.27,1.30,1.29,1.29,1.38,1.34,1.37,1.41,1.42,1.46,
+1.49,1.50,1.47,1.47,1.53,1.55,1.55,1.55,1.64,1.62,
+1.60,1.62,1.71,1.67,1.73,1.68,1.72,1.66,1.75,1.78,
+1.72,1.78,1.82,1.79,1.87,1.75,1.88,1.89,1.91,1.92,
+1.88,1.94,1.97,1.90,1.97,2.01,2.02,2.02,2.01,2.00,
+2.06,2.05,2.04,2.00,2.04,2.07,2.18,2.12,2.10,2.07,
+2.09,2.06,2.15,2.13,2.18,2.17,2.31,2.21,2.23,2.29,
+2.18,2.34,2.34,2.36,2.33,2.34,2.33,2.29,2.46,2.33,
+2.34,2.48,2.39,2.46,2.40,2.29,2.44,2.50,2.54,2.51,
+2.54,2.47,2.55,2.49,2.62,2.49,2.45,2.58,2.53,2.53,
+2.58,2.59,2.60,2.62,2.55,2.66,2.66,2.66,2.61,2.55,
+2.75,2.72,2.69,2.63,2.84,2.68,2.59,2.69,2.71,2.77,
+2.86,2.76,2.77,2.74,2.76,2.81,2.92,2.84,2.78,2.78,
+2.90,2.84,2.84,2.82,3.00,2.85,2.92,2.80,2.93,2.91,
+2.92,2.93,3.00,2.89,2.99,2.93,2.91,2.98,3.03,3.00,
+3.00,3.13,3.05,3.09,2.97,3.12,3.06,2.99,3.11,2.92,
+3.17,3.09,2.98,3.11,3.27,3.09,3.03,3.10,3.09,3.26,
+3.12,3.18,3.13,3.12,3.24,3.23,3.23,3.28,3.27,3.28,
+3.09,3.39,3.12,3.22,3.32,3.41,3.45,3.43,3.35,3.25,
+3.26,3.33,3.33,3.37,3.42,3.31,3.46,3.43,3.36,3.31,
+3.54,3.32,3.44,3.35,3.61,3.49,3.65,3.30,3.38,3.33,
+3.50,3.52,3.47,3.49,3.49,3.50,3.53,3.52,3.55,3.66,
+3.64,3.52,3.72,3.69,3.61,3.63,3.60,3.67,3.66,3.71,
+3.65,3.58,3.55,3.78,3.64,3.62,3.80,3.81,3.75,3.75,
+3.58,3.73,3.70,3.53,3.74,3.72,3.55,3.71,3.85,3.82,
+3.80,3.74,3.88,3.87,3.90,3.87,3.70,3.88,3.83,3.79,
+3.79,3.72,3.95,3.82,3.98,3.83,3.97,3.85,3.87,3.87,
+1.08,1.15,1.13,1.25,1.28,1.34,1.39,1.37,1.42,1.47,
+1.50,1.57,1.59,1.62,1.58,1.73,1.64,1.78,1.76,1.87,
+1.85,1.93,1.93,2.00,1.99,2.10,2.02,2.07,2.12,2.18,
+2.19,2.26,2.18,2.19,2.24,2.23,2.34,2.34,2.36,2.36,
+2.45,2.42,2.47,2.53,2.53,2.50,2.62,2.60,2.67,2.64,
+2.71,2.72,2.57,2.64,2.75,2.84,2.71,2.87,2.82,2.74,
+2.83,2.84,2.89,2.91,2.99,2.95,2.95,2.96,3.06,3.12,
+3.00,3.08,3.11,3.07,3.00,3.11,3.22,3.20,3.29,3.22,
+3.40,3.36,3.35,3.28,3.28,3.27,3.21,3.30,3.38,3.48,
+3.40,3.47,3.51,3.39,3.52,3.51,3.47,3.57,3.65,3.53,
+3.63,3.59,3.67,3.71,3.55,3.64,3.73,3.79,3.82,3.66,
+3.78,3.72,3.74,3.71,3.88,3.79,3.81,3.80,3.82,3.98,
+4.02,3.83,4.00,4.23,3.99,4.07,3.93,4.05,4.05,4.10,
+4.06,3.99,4.01,4.06,3.87,4.17,4.13,4.02,4.30,4.06,
+4.11,4.25,4.13,4.30,4.26,4.13,4.31,4.24,4.35,4.19,
+4.50,4.32,4.28,4.46,4.37,4.32,4.39,4.37,4.32,4.47,
+4.28,4.33,4.60,4.51,4.43,4.61,4.70,4.46,4.66,4.52,
+4.65,4.61,4.74,4.48,4.52,4.68,4.61,4.61,4.74,4.79,
+4.76,4.54,4.67,4.53,4.86,4.81,4.93,4.68,4.80,4.93,
+4.91,4.90,4.83,5.09,4.87,4.94,5.06,4.65,5.08,4.86,
+4.97,4.86,5.08,4.97,5.10,4.98,5.15,5.01,5.16,4.92,
+5.01,5.08,4.96,5.33,5.08,5.07,5.06,5.19,5.12,5.13,
+5.31,5.16,5.25,5.10,5.16,5.36,5.19,5.23,5.33,5.16,
+5.28,5.28,5.31,5.40,5.60,5.49,5.39,5.39,5.35,5.40,
+5.67,5.44,5.71,5.62,5.24,5.51,5.40,5.49,5.55,5.48,
+5.54,5.59,5.70,5.63,5.45,5.78,5.57,5.38,5.48,5.36,
+5.53,5.47,5.63,5.60,5.82,5.78,5.82,5.58,5.74,5.80,
+5.49,5.71,5.86,5.72,5.75,5.66,5.73,5.80,5.90,5.74,
+5.94,5.71,5.89,6.01,5.72,5.81,6.06,5.93,5.96,5.82,
+1.01,1.10,1.11,1.16,1.19,1.23,1.32,1.28,1.34,1.39,
+1.42,1.46,1.52,1.55,1.52,1.61,1.64,1.70,1.66,1.72,
+1.77,1.77,1.88,1.80,1.87,1.90,1.98,1.96,1.91,1.95,
+1.95,2.08,2.09,2.20,2.07,2.13,2.18,2.21,2.24,2.18,
+2.15,2.28,2.24,2.40,2.39,2.36,2.30,2.39,2.41,2.44,
+2.49,2.45,2.51,2.54,2.58,2.57,2.55,2.58,2.57,2.55,
+2.76,2.68,2.73,2.60,2.86,2.77,2.82,2.80,2.89,2.92,
+2.80,2.81,2.86,2.95,2.94,3.05,2.96,3.02,2.90,2.99,
+3.10,3.18,2.94,3.10,3.12,3.12,3.13,3.19,3.20,3.22,
+3.20,3.28,3.15,3.29,3.29,3.30,3.35,3.32,3.37,3.20,
+3.36,3.36,3.24,3.43,3.46,3.46,3.41,3.51,3.53,3.57,
+3.58,3.55,3.52,3.54,3.49,3.54,3.64,3.66,3.68,3.63,
+3.65,3.59,3.67,3.65,3.74,3.83,3.78,3.73,3.78,3.69,
+3.82,3.77,3.73,3.91,3.87,3.95,3.92,3.93,3.89,3.80,
+3.75,3.92,3.90,3.90,4.04,3.95,3.84,4.05,4.17,4.18,
+3.94,3.92,4.11,4.03,4.32,4.03,4.22,4.15,4.12,4.13,
+3.94,4.15,4.19,4.21,4.27,4.27,4.08,4.36,4.47,4.26,
+4.23,4.38,4.40,4.32,4.33,4.33,4.57,4.41,4.55,4.39,
+4.46,4.31,4.29,4.49,4.52,4.45,4.49,4.53,4.51,4.47,
+4.59,4.58,4.39,4.53,4.60,4.58,4.58,4.64,4.59,4.76,
+4.57,4.61,4.59,4.47,4.84,4.67,4.68,4.62,4.78,4.74,
+4.57,4.76,4.70,4.83,4.71,4.81,4.82,4.84,4.87,4.77,
+4.78,4.88,4.80,4.73,4.60,4.83,4.99,4.92,5.05,5.06,
+5.08,5.07,5.04,5.10,4.97,5.10,5.20,5.07,5.07,4.88,
+4.97,4.95,5.20,5.15,5.28,5.29,4.95,5.08,5.06,5.10,
+5.18,5.14,5.13,5.15,5.11,5.08,5.16,5.23,5.42,5.34,
+5.47,5.25,5.31,5.29,5.32,5.35,5.29,5.36,5.44,5.44,
+5.25,5.10,5.69,5.27,5.29,5.31,5.52,5.50,5.31,5.57,
+5.49,5.49,5.48,5.40,5.64,5.52,5.22,5.27,5.39,5.36,
+0.91,1.03,1.04,1.06,1.16,1.18,1.19,1.20,1.25,1.31,
+1.39,1.41,1.45,1.45,1.46,1.52,1.52,1.63,1.59,1.65,
+1.63,1.75,1.74,1.74,1.75,1.79,1.78,1.81,1.86,1.90,
+1.83,1.91,1.95,1.98,1.99,2.00,2.02,2.10,2.10,2.12,
+2.10,2.11,2.17,2.24,2.24,2.21,2.20,2.33,2.34,2.39,
+2.35,2.32,2.38,2.42,2.39,2.50,2.53,2.50,2.47,2.53,
+2.44,2.50,2.57,2.50,2.62,2.53,2.82,2.67,2.67,2.58,
+2.72,2.79,2.85,2.69,2.77,2.81,2.74,2.81,2.61,2.85,
+2.92,2.87,2.80,2.92,2.98,2.90,2.92,3.00,2.94,2.98,
+3.07,2.97,2.91,3.01,3.02,3.07,3.05,3.02,3.07,3.19,
+3.19,3.19,3.28,3.09,3.22,3.24,3.27,3.39,3.11,3.24,
+3.23,3.23,3.36,3.43,3.35,3.49,3.40,3.41,3.22,3.44,
+3.50,3.26,3.41,3.36,3.57,3.57,3.57,3.52,3.48,3.54,
+3.65,3.50,3.60,3.62,3.48,3.72,3.68,3.61,3.67,3.70,
+3.67,3.75,3.74,3.85,3.68,3.63,3.69,3.70,3.90,3.80,
+3.69,3.94,3.95,3.77,3.95,3.93,3.82,3.76,3.89,4.01,
+3.92,3.91,3.91,3.95,3.93,4.02,4.01,3.90,4.10,4.05,
+4.24,4.02,3.96,4.03,4.03,4.10,4.02,3.94,4.31,4.15,
+4.17,4.22,4.17,4.47,4.13,4.31,4.27,4.22,4.32,4.36,
+4.51,4.29,4.37,4.43,4.33,4.29,4.24,4.28,4.20,4.46,
+4.19,4.35,4.36,4.36,4.38,4.34,4.46,4.47,4.67,4.46,
+4.38,4.49,4.56,4.36,4.55,4.42,4.56,4.44,4.48,4.50,
+4.59,4.71,4.75,4.83,4.67,4.61,4.39,4.59,4.86,4.63,
+4.66,4.85,4.57,4.80,4.74,4.69,4.69,4.67,4.77,4.74,
+4.52,4.47,4.63,4.76,4.73,4.72,5.10,4.70,4.99,4.86,
+4.84,4.93,4.93,4.98,4.94,4.87,4.89,4.95,4.54,4.96,
+4.78,4.86,4.90,4.79,4.86,5.01,4.89,4.95,4.76,4.86,
+4.97,4.89,5.17,4.77,5.08,4.98,4.98,4.98,5.09,5.26,
+4.96,5.33,5.31,5.26,5.31,5.27,5.38,5.10,5.10,5.30,
+0.91,0.99,0.98,1.00,1.10,1.10,1.15,1.18,1.23,1.25,
+1.34,1.25,1.34,1.37,1.41,1.49,1.43,1.50,1.58,1.59,
+1.64,1.61,1.64,1.67,1.67,1.63,1.74,1.67,1.82,1.74,
+1.82,1.78,1.77,1.83,1.84,1.94,1.91,2.01,2.05,2.00,
+2.02,2.10,2.09,2.10,2.14,2.12,2.14,2.18,2.11,2.16,
+2.04,2.21,2.25,2.34,2.26,2.27,2.22,2.31,2.34,2.36,
+2.30,2.40,2.47,2.46,2.53,2.46,2.42,2.47,2.48,2.49,
+2.62,2.54,2.61,2.67,2.70,2.55,2.73,2.74,2.73,2.76,
+2.71,2.80,2.76,2.71,2.76,2.73,2.80,2.78,2.89,2.71,
+2.80,2.95,2.86,2.88,2.85,2.97,2.93,2.92,2.96,2.88,
+2.99,2.96,2.99,2.99,3.07,3.03,3.01,3.00,3.03,3.19,
+2.92,3.11,2.96,3.25,3.07,3.01,3.16,3.16,3.21,3.28,
+3.29,3.29,3.29,3.20,3.26,3.27,3.35,3.41,3.42,3.36,
+3.39,3.33,3.34,3.42,3.34,3.40,3.40,3.46,3.54,3.44,
+3.46,3.59,3.59,3.47,3.48,3.54,3.57,3.53,3.39,3.58,
+3.73,3.73,3.72,3.66,3.68,3.72,3.64,3.83,3.71,3.56,
+3.63,3.57,3.63,3.76,3.70,3.83,3.75,3.88,3.73,3.71,
+3.96,3.87,3.68,3.89,3.80,3.79,3.98,3.82,3.91,3.90,
+3.92,4.11,3.91,3.84,3.97,3.98,3.88,3.90,3.94,3.87,
+4.05,4.12,3.99,4.10,4.07,4.11,4.14,3.96,4.06,3.98,
+4.06,3.91,4.25,4.18,4.20,4.13,4.16,4.28,4.17,4.17,
+4.25,4.23,4.14,4.20,4.29,4.17,4.21,4.17,4.39,4.23,
+4.27,4.34,4.27,4.38,4.40,4.31,4.48,4.41,4.37,4.33,
+4.18,4.46,4.38,4.35,4.41,4.27,4.23,4.42,4.54,4.40,
+4.48,4.26,4.31,4.44,4.64,4.45,4.55,4.70,4.44,4.54,
+4.79,4.73,4.40,4.57,4.59,4.52,4.67,4.55,4.62,4.69,
+4.57,4.57,4.56,4.55,4.64,4.89,4.65,4.73,4.83,4.89,
+4.71,4.82,4.84,4.74,4.86,4.81,4.72,4.80,4.91,5.00,
+4.75,4.65,5.02,4.73,5.07,4.96,4.95,4.91,4.89,4.92,
+0.87,0.92,0.97,0.99,0.98,1.05,1.10,1.13,1.18,1.22,
+1.19,1.23,1.24,1.34,1.35,1.37,1.37,1.46,1.46,1.54,
+1.46,1.50,1.59,1.57,1.65,1.63,1.67,1.65,1.73,1.67,
+1.75,1.74,1.76,1.93,1.81,1.85,1.88,1.82,1.91,1.92,
+1.84,1.97,1.98,1.94,2.06,1.99,2.08,2.00,2.09,1.98,
+2.10,2.06,2.22,2.11,2.17,2.24,2.20,2.29,2.16,2.20,
+2.32,2.28,2.34,2.37,2.35,2.30,2.43,2.36,2.37,2.39,
+2.47,2.37,2.42,2.53,2.48,2.55,2.46,2.46,2.57,2.57,
+2.55,2.65,2.62,2.64,2.61,2.64,2.71,2.68,2.62,2.67,
+2.65,2.68,2.80,2.74,2.77,2.85,2.74,2.67,2.75,2.88,
+2.82,2.91,2.85,2.93,2.80,2.97,2.94,3.01,2.97,2.97,
+3.10,2.90,3.01,2.97,3.02,2.99,3.09,2.90,3.06,3.16,
+3.10,3.20,3.05,3.01,3.24,3.05,3.11,3.21,3.24,3.33,
+3.04,3.26,3.23,3.33,3.23,3.27,3.26,3.17,3.32,3.46,
+3.36,3.43,3.29,3.37,3.33,3.40,3.47,3.34,3.45,3.29,
+3.27,3.58,3.39,3.35,3.38,3.57,3.64,3.53,3.53,3.54,
+3.57,3.69,3.54,3.46,3.58,3.46,3.54,3.56,3.63,3.69,
+3.72,3.71,3.61,3.72,3.64,3.76,3.74,3.76,3.66,3.79,
+3.84,3.57,3.74,3.62,3.68,3.67,3.73,3.82,3.76,3.77,
+3.78,3.71,3.88,4.05,3.86,3.89,3.88,3.92,4.03,3.90,
+3.81,3.94,3.99,3.93,3.98,3.96,4.05,4.06,4.06,4.14,
+3.93,4.25,4.11,4.04,4.07,4.00,4.06,4.05,3.97,4.13,
+4.21,4.28,4.04,4.11,4.26,4.23,4.27,4.03,4.17,4.23,
+4.17,4.23,4.17,4.18,4.29,4.08,4.35,4.17,4.24,4.24,
+4.42,4.30,4.25,4.33,4.39,4.30,4.22,4.42,4.39,4.25,
+4.45,4.43,4.24,4.42,4.47,4.35,4.47,4.33,4.23,4.44,
+4.26,4.48,4.40,4.43,4.64,4.41,4.52,4.52,4.69,4.49,
+4.67,4.54,4.66,4.68,4.74,4.73,4.83,4.53,4.65,4.65,
+4.66,4.50,4.70,4.47,4.74,4.58,4.66,4.71,4.60,4.56,
+0.87,0.87,0.91,0.98,1.02,1.04,1.07,1.07,1.14,1.18,
+1.20,1.23,1.23,1.28,1.32,1.29,1.29,1.37,1.36,1.45,
+1.44,1.40,1.50,1.52,1.52,1.54,1.59,1.59,1.60,1.57,
+1.70,1.66,1.71,1.78,1.79,1.74,1.78,1.83,1.79,1.81,
+1.84,1.84,1.85,1.98,1.89,1.97,2.04,1.92,1.96,2.02,
+2.07,2.08,2.09,2.10,1.99,2.16,2.13,2.06,2.11,2.18,
+2.28,2.09,2.22,2.23,2.23,2.29,2.32,2.33,2.30,2.25,
+2.27,2.38,2.28,2.35,2.44,2.50,2.44,2.50,2.45,2.43,
+2.52,2.60,2.50,2.52,2.50,2.61,2.59,2.61,2.50,2.63,
+2.53,2.74,2.55,2.66,2.68,2.75,2.64,2.66,2.68,2.75,
+2.66,2.72,2.64,2.80,2.80,2.83,2.91,2.83,2.68,2.78,
+2.78,2.86,3.00,3.02,2.85,2.88,2.98,2.87,2.91,2.97,
+2.92,3.00,3.03,3.03,2.94,3.18,3.02,3.08,3.05,3.05,
+3.11,3.12,3.03,3.08,3.25,3.11,3.24,3.13,3.31,3.15,
+3.10,3.09,3.20,3.28,3.12,3.21,3.25,3.28,3.24,3.28,
+3.29,3.26,3.27,3.37,3.26,3.34,3.26,3.28,3.29,3.60,
+3.36,3.39,3.28,3.42,3.51,3.50,3.49,3.49,3.48,3.49,
+3.41,3.54,3.51,3.55,3.48,3.59,3.44,3.45,3.53,3.58,
+3.63,3.53,3.70,3.54,3.71,3.49,3.63,3.76,3.60,3.54,
+3.56,3.67,3.65,3.73,3.55,3.80,3.74,3.65,3.68,3.74,
+3.61,3.61,3.78,3.79,3.80,3.78,3.98,3.82,3.93,3.76,
+3.82,3.84,3.91,4.10,3.96,3.91,3.98,3.93,4.00,3.82,
+4.03,3.90,3.87,4.06,3.95,4.00,3.88,4.11,4.00,4.04,
+3.97,4.07,4.21,3.97,4.11,3.97,4.01,4.03,4.05,4.13,
+4.11,4.02,4.18,4.35,4.13,4.27,4.19,4.07,4.20,4.18,
+4.11,4.29,4.21,4.26,4.27,4.13,4.10,4.38,4.24,4.33,
+4.38,4.40,4.29,4.23,4.40,4.33,4.33,4.25,4.38,4.32,
+4.26,4.45,4.44,4.44,4.32,4.29,4.34,4.54,4.51,4.49,
+4.40,4.42,4.44,4.37,4.55,4.62,4.19,4.45,4.27,4.47,
+0.86,0.90,0.92,0.94,0.97,1.07,1.01,1.08,1.11,1.17,
+1.15,1.19,1.22,1.24,1.24,1.29,1.33,1.31,1.35,1.39,
+1.39,1.49,1.44,1.46,1.52,1.48,1.51,1.52,1.66,1.60,
+1.60,1.63,1.65,1.64,1.70,1.79,1.65,1.70,1.75,1.82,
+1.78,1.74,1.82,1.76,1.91,1.91,1.85,1.89,1.95,1.95,
+1.89,1.98,1.98,2.00,1.96,2.02,2.07,2.01,2.06,2.08,
+2.07,2.13,2.15,2.17,2.22,2.15,2.21,2.21,2.22,2.24,
+2.27,2.23,2.23,2.20,2.21,2.28,2.32,2.27,2.39,2.36,
+2.34,2.46,2.37,2.50,2.42,2.47,2.54,2.44,2.50,2.40,
+2.44,2.60,2.50,2.70,2.52,2.56,2.56,2.62,2.65,2.64,
+2.63,2.62,2.62,2.58,2.68,2.67,2.66,2.80,2.65,2.78,
+2.78,2.67,2.71,2.79,2.77,2.88,2.78,2.82,2.87,2.85,
+2.97,2.85,2.92,2.80,2.96,3.05,2.93,2.88,2.89,3.10,
+2.95,2.93,2.93,2.98,3.04,3.07,3.12,2.99,2.99,3.12,
+3.07,3.17,3.11,3.13,3.05,3.25,3.08,3.12,3.11,3.18,
+3.12,3.26,3.18,3.28,3.32,3.26,3.16,3.37,3.28,3.23,
+3.39,3.23,3.24,3.35,3.20,3.39,3.33,3.18,3.22,3.28,
+3.38,3.38,3.37,3.43,3.47,3.44,3.46,3.35,3.57,3.39,
+3.42,3.49,3.44,3.38,3.43,3.30,3.48,3.56,3.65,3.51,
+3.67,3.53,3.47,3.49,3.68,3.62,3.66,3.60,3.58,3.64,
+3.51,3.59,3.69,3.63,3.65,3.74,3.71,3.92,3.70,3.70,
+3.89,3.84,3.63,3.66,3.69,3.78,3.65,3.76,3.69,3.66,
+3.61,3.90,3.89,3.77,3.93,3.83,3.87,3.74,3.83,3.84,
+4.04,3.84,3.94,3.88,4.09,3.76,3.97,3.79,4.05,3.93,
+3.91,3.96,3.98,3.91,4.03,3.98,3.98,4.04,4.08,3.97,
+4.08,4.05,4.09,4.13,4.15,4.16,3.98,4.16,4.12,4.25,
+4.17,4.00,4.04,4.07,4.22,4.00,3.98,4.16,4.15,4.11,
+4.20,4.25,4.17,4.22,4.10,4.24,4.31,4.26,3.95,4.19,
+4.25,4.41,4.27,4.21,4.49,4.22,4.45,4.32,4.41,4.59,
+0.82,0.83,0.93,0.91,0.93,1.02,1.00,1.07,1.06,1.11,
+1.15,1.15,1.19,1.21,1.22,1.28,1.23,1.32,1.33,1.37,
+1.39,1.40,1.46,1.44,1.44,1.45,1.45,1.51,1.53,1.51,
+1.52,1.58,1.64,1.64,1.61,1.64,1.65,1.66,1.73,1.67,
+1.74,1.82,1.74,1.79,1.78,1.82,1.79,1.82,1.90,1.83,
+1.82,1.88,1.94,1.92,1.88,1.95,1.94,2.05,2.01,2.01,
+2.04,2.05,2.06,2.08,2.10,2.14,2.13,2.13,2.17,2.22,
+2.08,2.33,2.24,2.20,2.19,2.19,2.20,2.25,2.22,2.23,
+2.29,2.23,2.29,2.34,2.39,2.38,2.45,2.40,2.45,2.39,
+2.42,2.39,2.52,2.38,2.53,2.52,2.57,2.47,2.49,2.63,
+2.75,2.58,2.55,2.61,2.60,2.61,2.74,2.60,2.63,2.71,
+2.70,2.75,2.57,2.59,2.77,2.65,2.70,2.76,2.62,2.71,
+2.78,2.75,2.81,2.86,2.85,2.86,2.75,2.79,2.88,2.93,
+2.76,2.89,2.93,2.86,2.89,2.86,2.94,2.97,2.88,2.87,
+2.89,3.03,3.01,3.00,3.07,2.99,2.98,3.11,3.09,2.98,
+3.03,3.08,2.93,3.03,3.07,3.06,3.02,3.15,3.15,3.13,
+3.20,3.14,3.28,3.30,3.37,3.25,3.25,3.13,3.14,3.30,
+3.31,3.29,3.19,3.28,3.30,3.29,3.36,3.29,3.34,3.31,
+3.35,3.40,3.33,3.34,3.29,3.27,3.40,3.34,3.30,3.39,
+3.46,3.44,3.42,3.47,3.43,3.45,3.54,3.51,3.48,3.48,
+3.49,3.51,3.67,3.61,3.49,3.51,3.52,3.66,3.65,3.68,
+3.59,3.57,3.62,3.63,3.71,3.62,3.68,3.64,3.64,3.67,
+3.70,3.61,3.74,3.82,3.67,3.74,3.68,3.74,3.79,3.73,
+3.88,3.82,3.93,3.67,3.79,3.86,3.73,3.75,3.66,3.85,
+3.84,3.84,3.80,3.67,3.92,3.94,3.82,3.84,3.88,3.87,
+4.04,4.02,3.80,3.88,3.87,3.91,3.87,3.86,3.97,4.09,
+3.98,3.90,4.04,4.08,4.01,3.95,4.02,4.07,4.06,4.06,
+4.06,4.09,4.12,4.24,4.01,4.14,4.02,4.00,4.05,4.08,
+4.19,4.07,4.24,4.14,4.12,4.28,4.10,4.09,4.09,4.29,
+0.83,0.84,0.89,0.90,0.97,0.94,1.00,1.05,1.03,1.12,
+1.06,1.15,1.14,1.18,1.18,1.21,1.25,1.26,1.29,1.34,
+1.31,1.32,1.35,1.40,1.42,1.46,1.43,1.45,1.49,1.46,
+1.53,1.50,1.56,1.58,1.57,1.61,1.61,1.65,1.74,1.68,
+1.75,1.68,1.70,1.76,1.79,1.73,1.87,1.81,1.84,1.80,
+1.81,1.91,1.85,1.91,1.94,2.01,2.03,1.97,1.96,2.01,
+2.06,1.93,1.96,1.99,2.05,2.06,2.03,2.12,2.15,2.14,
+2.10,2.12,2.18,2.14,2.16,2.21,2.30,2.19,2.24,2.21,
+2.31,2.18,2.23,2.35,2.23,2.39,2.28,2.36,2.29,2.34,
+2.31,2.45,2.42,2.49,2.45,2.49,2.49,2.39,2.43,2.36,
+2.44,2.44,2.54,2.56,2.60,2.48,2.61,2.58,2.57,2.60,
+2.54,2.55,2.59,2.77,2.71,2.55,2.75,2.81,2.73,2.66,
+2.80,2.74,2.68,2.73,2.72,2.68,2.69,2.81,2.83,2.72,
+2.78,2.84,2.85,2.79,2.72,2.76,2.83,2.89,2.94,2.97,
+2.91,2.91,2.89,2.95,2.94,3.00,3.06,3.03,2.94,2.99,
+3.02,2.90,2.97,3.15,3.09,2.97,2.97,3.17,3.04,3.11,
+3.09,3.06,2.94,3.10,3.07,3.17,3.09,3.13,3.14,3.17,
+3.13,3.18,3.19,3.17,3.32,3.19,3.21,3.26,3.20,3.09,
+3.28,3.36,3.26,3.39,3.29,3.34,3.31,3.33,3.35,3.32,
+3.32,3.31,3.50,3.33,3.28,3.56,3.37,3.46,3.48,3.38,
+3.36,3.47,3.48,3.51,3.47,3.46,3.44,3.49,3.43,3.38,
+3.44,3.54,3.70,3.51,3.56,3.42,3.49,3.61,3.59,3.52,
+3.52,3.53,3.74,3.51,3.65,3.40,3.62,3.77,3.61,3.65,
+3.63,3.73,3.60,3.78,3.82,3.73,3.63,3.68,3.66,3.76,
+3.57,3.66,3.76,3.86,3.72,3.75,3.74,3.92,3.84,3.89,
+3.69,3.88,3.75,3.79,3.79,3.82,3.77,3.89,3.90,3.84,
+3.77,3.82,4.00,3.91,3.99,3.86,3.74,3.83,3.79,4.07,
+4.09,3.99,4.02,4.04,3.95,4.03,4.02,4.04,4.10,3.93,
+3.88,4.05,4.10,4.23,4.09,3.99,4.03,4.08,3.91,4.06,
+0.80,0.84,0.86,0.88,0.98,0.97,0.96,1.01,1.06,1.12,
+1.13,1.07,1.13,1.14,1.23,1.17,1.19,1.24,1.29,1.31,
+1.34,1.28,1.35,1.33,1.35,1.43,1.43,1.43,1.45,1.54,
+1.51,1.51,1.51,1.58,1.53,1.60,1.65,1.64,1.61,1.66,
+1.67,1.64,1.71,1.71,1.67,1.74,1.87,1.81,1.77,1.78,
+1.74,1.85,1.90,1.93,1.80,1.82,1.95,1.87,1.99,1.96,
+1.92,1.94,1.98,2.00,2.07,2.03,2.11,2.05,2.10,2.13,
+2.10,2.08,2.19,2.08,2.16,2.14,2.19,2.14,2.14,2.18,
+2.28,2.27,2.22,2.18,2.28,2.24,2.23,2.30,2.49,2.39,
+2.28,2.34,2.28,2.38,2.41,2.34,2.42,2.40,2.51,2.44,
+2.38,2.55,2.47,2.46,2.47,2.52,2.39,2.45,2.41,2.55,
+2.59,2.49,2.52,2.62,2.62,2.60,2.69,2.56,2.61,2.72,
+2.69,2.70,2.67,2.64,2.58,2.59,2.76,2.65,2.81,2.67,
+2.74,2.76,2.86,2.78,2.83,2.90,2.82,2.77,2.84,2.90,
+2.81,2.80,2.85,2.89,2.90,2.88,2.86,2.92,2.88,2.84,
+2.96,2.87,2.97,2.96,3.04,3.10,2.91,3.03,2.90,3.06,
+3.05,3.09,3.17,3.12,3.10,3.07,3.08,3.05,3.12,3.00,
+3.05,3.15,3.22,3.08,3.08,3.10,3.24,3.11,3.22,3.14,
+3.06,3.08,3.20,3.25,3.20,3.32,3.27,3.25,3.21,3.22,
+3.33,3.32,3.14,3.22,3.37,3.31,3.29,3.34,3.32,3.33,
+3.43,3.36,3.35,3.25,3.45,3.37,3.28,3.37,3.17,3.39,
+3.47,3.45,3.42,3.50,3.51,3.54,3.48,3.58,3.43,3.41,
+3.52,3.59,3.35,3.47,3.69,3.60,3.49,3.51,3.68,3.49,
+3.53,3.52,3.54,3.63,3.66,3.68,3.66,3.58,3.74,3.81,
+3.56,3.70,3.63,3.80,3.58,3.84,3.73,3.88,3.60,3.67,
+3.80,3.72,3.85,3.74,3.74,3.61,3.78,3.72,3.87,3.78,
+3.83,3.83,3.90,3.89,3.67,3.78,3.81,3.86,3.78,4.06,
+3.82,3.90,3.84,3.99,3.94,3.74,3.94,3.78,3.99,3.97,
+3.96,3.92,3.90,3.88,3.79,4.06,3.97,4.06,3.80,3.89,
+0.77,0.83,0.86,0.86,0.92,0.95,0.96,0.96,1.02,1.05,
+1.08,1.07,1.14,1.08,1.17,1.21,1.24,1.28,1.24,1.24,
+1.26,1.30,1.30,1.31,1.39,1.39,1.40,1.45,1.37,1.44,
+1.49,1.52,1.50,1.57,1.57,1.54,1.52,1.60,1.53,1.61,
+1.66,1.66,1.71,1.70,1.70,1.76,1.69,1.78,1.80,1.77,
+1.74,1.75,1.74,1.81,1.90,1.82,1.85,1.87,1.90,2.00,
+1.88,1.83,1.96,1.91,2.00,2.00,1.99,2.06,2.01,2.01,
+2.02,2.08,2.06,2.13,2.14,2.08,2.14,2.13,2.11,2.21,
+2.10,2.21,2.22,2.18,2.20,2.26,2.29,2.31,2.27,2.26,
+2.33,2.28,2.11,2.29,2.37,2.33,2.36,2.34,2.31,2.31,
+2.39,2.38,2.50,2.38,2.45,2.42,2.41,2.50,2.45,2.53,
+2.42,2.62,2.59,2.46,2.45,2.52,2.61,2.65,2.64,2.63,
+2.54,2.63,2.64,2.60,2.67,2.70,2.56,2.59,2.72,2.75,
+2.74,2.66,2.92,2.72,2.61,2.78,2.80,2.70,2.85,2.79,
+2.75,2.78,2.85,2.76,2.80,2.80,2.92,2.89,2.85,2.91,
+2.93,3.03,2.79,3.00,2.92,2.85,2.95,3.00,3.04,2.95,
+3.04,2.95,3.15,3.06,2.92,3.05,3.08,3.03,3.01,3.02,
+3.02,3.05,3.18,3.23,3.09,3.11,2.96,3.18,3.14,3.09,
+3.13,3.03,3.13,3.21,3.23,3.29,3.14,3.23,3.04,3.27,
+3.15,3.12,3.17,3.26,3.28,3.29,3.39,3.26,3.14,3.20,
+3.41,3.17,3.34,3.27,3.26,3.32,3.36,3.33,3.49,3.47,
+3.21,3.38,3.48,3.50,3.46,3.43,3.36,3.40,3.41,3.37,
+3.51,3.46,3.44,3.45,3.45,3.51,3.54,3.46,3.46,3.55,
+3.55,3.54,3.59,3.58,3.54,3.45,3.53,3.61,3.52,3.60,
+3.58,3.61,3.58,3.52,3.66,3.60,3.50,3.64,3.52,3.71,
+3.61,3.79,3.66,3.63,3.75,3.68,3.71,3.84,3.76,3.81,
+3.69,3.63,3.62,3.73,3.77,3.84,3.82,3.78,3.87,3.85,
+3.78,3.87,3.75,3.75,3.65,4.02,3.76,3.70,3.97,3.69,
+3.93,3.86,3.93,3.93,3.92,4.02,3.95,4.00,3.85,3.94,
+0.77,0.83,0.84,0.86,0.92,0.94,0.93,0.95,1.03,1.08,
+1.03,1.09,1.10,1.11,1.12,1.16,1.20,1.21,1.23,1.28,
+1.27,1.31,1.30,1.31,1.36,1.37,1.35,1.40,1.39,1.47,
+1.48,1.51,1.53,1.56,1.50,1.49,1.56,1.57,1.57,1.59,
+1.64,1.58,1.61,1.68,1.78,1.73,1.73,1.76,1.76,1.78,
+1.71,1.81,1.80,1.76,1.81,1.80,1.86,1.88,1.80,1.93,
+1.96,1.93,2.02,1.98,1.98,1.98,2.02,1.98,1.99,2.01,
+1.99,2.00,2.07,1.98,2.06,2.06,2.10,2.07,2.13,2.14,
+2.11,2.21,2.22,2.10,2.32,2.15,2.25,2.20,2.29,2.33,
+2.24,2.16,2.19,2.27,2.30,2.33,2.34,2.30,2.32,2.37,
+2.30,2.27,2.39,2.40,2.31,2.45,2.47,2.44,2.53,2.43,
+2.54,2.46,2.49,2.44,2.52,2.50,2.57,2.52,2.54,2.55,
+2.65,2.53,2.60,2.52,2.71,2.59,2.66,2.59,2.59,2.69,
+2.64,2.62,2.60,2.72,2.80,2.65,2.74,2.66,2.77,2.80,
+2.80,2.84,2.74,2.71,2.72,2.73,2.71,2.77,2.85,2.84,
+2.79,2.92,2.75,2.95,2.89,2.71,2.88,2.85,2.88,2.95,
+2.90,2.95,2.95,2.90,2.93,2.95,3.02,3.01,2.93,2.97,
+2.96,2.94,3.06,3.14,2.90,3.01,3.03,3.07,3.17,3.02,
+2.99,3.14,3.08,3.16,3.12,3.19,3.09,3.13,3.18,3.23,
+3.20,3.13,3.15,3.16,3.22,3.24,3.26,3.19,3.20,3.28,
+3.20,3.14,3.30,3.23,3.29,3.38,3.33,3.34,3.16,3.36,
+3.33,3.31,3.31,3.34,3.42,3.37,3.37,3.45,3.48,3.43,
+3.39,3.33,3.43,3.41,3.41,3.39,3.40,3.38,3.54,3.46,
+3.55,3.56,3.58,3.56,3.66,3.61,3.35,3.49,3.40,3.59,
+3.53,3.60,3.73,3.45,3.63,3.56,3.62,3.70,3.65,3.62,
+3.54,3.65,3.69,3.71,3.66,3.60,3.66,3.51,3.63,3.77,
+3.70,3.83,3.74,3.80,3.81,3.76,3.68,3.77,3.80,3.59,
+3.85,3.81,3.74,3.73,3.76,3.73,3.85,3.95,3.69,3.85,
+3.92,3.89,3.70,3.82,3.84,3.86,3.80,3.82,3.69,3.68,
+0.79,0.79,0.86,0.86,0.90,0.92,0.95,0.99,1.02,1.03,
+1.02,1.07,1.07,1.13,1.12,1.18,1.17,1.21,1.25,1.28,
+1.23,1.27,1.28,1.30,1.33,1.32,1.34,1.39,1.43,1.40,
+1.47,1.47,1.48,1.45,1.55,1.51,1.53,1.51,1.55,1.59,
+1.54,1.62,1.61,1.71,1.69,1.62,1.68,1.72,1.79,1.76,
+1.68,1.82,1.80,1.75,1.88,1.69,1.86,1.91,1.90,1.87,
+1.84,1.89,1.90,1.95,1.95,1.92,1.92,2.04,1.97,2.00,
+2.03,1.99,1.99,2.08,1.98,2.08,2.05,2.11,2.01,2.07,
+2.13,2.13,2.22,2.19,2.22,2.11,2.22,2.19,2.15,2.20,
+2.20,2.15,2.31,2.29,2.26,2.29,2.32,2.42,2.26,2.29,
+2.25,2.32,2.38,2.36,2.37,2.34,2.28,2.31,2.52,2.44,
+2.49,2.36,2.46,2.48,2.49,2.47,2.52,2.50,2.61,2.44,
+2.59,2.56,2.52,2.58,2.56,2.44,2.61,2.56,2.49,2.55,
+2.59,2.70,2.57,2.80,2.52,2.68,2.67,2.75,2.62,2.82,
+2.61,2.72,2.76,2.71,2.77,2.84,2.78,2.80,2.89,2.80,
+2.78,2.84,2.80,2.80,2.83,2.86,2.85,2.90,3.00,2.95,
+2.74,2.77,2.89,2.93,3.01,2.80,3.00,2.99,3.01,2.89,
+2.96,2.99,3.00,3.01,3.09,3.01,3.04,2.95,3.06,2.99,
+3.05,3.12,3.13,3.09,3.12,3.02,3.21,3.03,3.04,3.09,
+3.12,3.17,3.19,3.07,3.21,3.19,3.21,3.18,3.14,3.17,
+3.14,3.26,3.15,3.19,3.12,3.25,3.28,3.43,3.18,3.34,
+3.35,3.31,3.24,3.30,3.24,3.25,3.39,3.31,3.21,3.31,
+3.25,3.51,3.32,3.42,3.44,3.38,3.42,3.46,3.50,3.39,
+3.49,3.44,3.29,3.49,3.40,3.36,3.45,3.51,3.47,3.55,
+3.57,3.49,3.21,3.42,3.60,3.53,3.50,3.51,3.52,3.58,
+3.60,3.55,3.55,3.72,3.58,3.69,3.59,3.61,3.57,3.64,
+3.62,3.72,3.74,3.60,3.68,3.75,3.72,3.74,3.73,3.79,
+3.66,3.76,3.78,3.69,3.68,3.70,3.58,3.67,3.67,3.67,
+3.93,3.67,3.67,3.83,3.79,3.76,3.83,3.69,3.92,3.88,
+0.77,0.79,0.85,0.82,0.88,0.95,0.92,0.98,1.00,1.02,
+1.03,1.02,1.11,1.10,1.10,1.16,1.19,1.17,1.19,1.22,
+1.25,1.25,1.26,1.34,1.33,1.35,1.38,1.34,1.38,1.44,
+1.42,1.44,1.46,1.43,1.49,1.49,1.51,1.50,1.56,1.56,
+1.58,1.61,1.55,1.71,1.66,1.67,1.67,1.70,1.70,1.71,
+1.71,1.75,1.68,1.71,1.73,1.82,1.78,1.80,1.82,1.78,
+1.83,1.82,1.88,1.85,1.88,1.86,1.92,1.98,1.93,1.96,
+1.98,2.00,1.99,2.08,2.05,2.07,2.10,2.13,2.08,2.14,
+2.10,2.06,2.08,2.13,2.08,2.18,2.12,2.11,2.22,2.23,
+2.14,2.18,2.24,2.32,2.27,2.21,2.21,2.28,2.34,2.30,
+2.22,2.27,2.39,2.37,2.39,2.38,2.41,2.34,2.39,2.44,
+2.42,2.36,2.45,2.46,2.41,2.44,2.49,2.47,2.41,2.49,
+2.53,2.47,2.42,2.52,2.42,2.52,2.56,2.55,2.56,2.59,
+2.69,2.68,2.61,2.70,2.61,2.57,2.68,2.67,2.65,2.73,
+2.58,2.72,2.73,2.79,2.61,2.79,2.75,2.72,2.88,2.84,
+2.60,2.74,2.74,2.82,2.76,2.70,2.81,2.78,2.85,2.82,
+2.76,2.81,2.93,2.92,2.95,2.84,2.94,2.85,2.98,2.92,
+2.95,2.95,2.94,3.05,2.87,2.99,3.02,2.96,2.88,3.02,
+2.96,2.89,2.91,3.02,3.02,3.11,3.06,3.03,3.09,3.07,
+3.17,3.14,3.23,3.16,3.05,3.15,3.11,3.12,3.18,3.09,
+3.18,3.08,3.21,3.10,3.19,3.34,3.32,3.17,3.18,3.21,
+3.18,3.15,3.16,3.27,3.22,3.28,3.29,3.32,3.18,3.22,
+3.16,3.32,3.46,3.19,3.24,3.31,3.31,3.34,3.39,3.44,
+3.31,3.57,3.54,3.39,3.37,3.43,3.53,3.44,3.50,3.41,
+3.30,3.43,3.49,3.43,3.39,3.44,3.49,3.45,3.47,3.67,
+3.45,3.55,3.44,3.40,3.61,3.58,3.64,3.46,3.54,3.53,
+3.53,3.55,3.38,3.43,3.61,3.57,3.68,3.75,3.59,3.59,
+3.73,3.62,3.68,3.74,3.73,3.70,3.71,3.70,3.66,3.72,
+3.73,3.73,3.80,3.82,3.68,3.62,3.80,3.81,3.75,3.71,
+0.78,0.82,0.82,0.84,0.94,0.89,0.96,0.97,1.02,0.97,
+1.05,1.02,1.04,1.11,1.09,1.15,1.17,1.20,1.21,1.22,
+1.23,1.24,1.16,1.36,1.29,1.33,1.34,1.39,1.40,1.37,
+1.42,1.44,1.40,1.46,1.47,1.49,1.57,1.49,1.51,1.54,
+1.63,1.60,1.62,1.59,1.69,1.70,1.64,1.67,1.64,1.74,
+1.69,1.72,1.74,1.79,1.76,1.77,1.77,1.77,1.87,1.78,
+1.89,1.83,1.87,1.89,1.90,1.93,1.94,1.94,1.85,1.90,
+1.93,1.94,1.98,2.02,1.89,2.00,2.03,2.12,1.99,2.05,
+2.08,2.06,2.09,2.13,2.07,2.12,2.10,2.21,2.18,2.22,
+2.14,2.16,2.22,2.24,2.13,2.28,2.20,2.19,2.13,2.25,
+2.24,2.26,2.27,2.22,2.20,2.30,2.48,2.36,2.34,2.38,
+2.33,2.43,2.46,2.39,2.46,2.46,2.47,2.41,2.50,2.43,
+2.50,2.49,2.57,2.61,2.51,2.54,2.56,2.63,2.51,2.60,
+2.49,2.55,2.56,2.60,2.61,2.69,2.70,2.56,2.63,2.72,
+2.59,2.58,2.76,2.68,2.66,2.75,2.64,2.69,2.71,2.77,
+2.71,2.66,2.75,2.72,2.80,2.82,2.78,2.74,2.74,2.84,
+2.81,2.86,2.79,2.85,2.83,2.92,2.78,2.97,2.87,2.88,
+2.90,2.97,2.85,2.92,2.85,3.03,2.94,2.85,2.98,2.95,
+2.95,3.09,2.99,3.06,2.97,3.09,2.95,3.16,3.12,3.01,
+2.98,3.07,3.02,3.16,3.09,3.14,3.05,3.04,3.07,3.19,
+3.03,3.12,3.09,3.13,3.23,3.26,3.27,3.04,3.29,3.18,
+3.14,3.17,3.28,3.10,3.27,3.28,3.28,3.36,3.26,3.25,
+3.24,3.32,3.39,3.28,3.42,3.30,3.24,3.36,3.35,3.31,
+3.37,3.40,3.31,3.35,3.22,3.37,3.40,3.22,3.35,3.47,
+3.38,3.44,3.49,3.39,3.43,3.51,3.59,3.49,3.56,3.49,
+3.43,3.43,3.36,3.48,3.46,3.41,3.48,3.60,3.53,3.49,
+3.37,3.60,3.64,3.61,3.60,3.63,3.50,3.68,3.57,3.65,
+3.70,3.66,3.61,3.72,3.71,3.51,3.63,3.72,3.56,3.60,
+3.51,3.57,3.51,3.62,3.83,3.72,3.69,3.69,3.74,3.70
+};
+
+static float meanNumAnchorBases[] = {
+10.29,11.18,13.18,13.19,14.50,15.10,17.15,18.04,18.97,20.38,
+21.16,22.65,23.08,24.30,25.73,25.98,27.35,28.95,29.31,30.26,
+31.76,32.39,32.52,32.71,34.88,37.36,38.05,37.55,40.19,40.75,
+41.26,41.60,44.11,45.51,45.16,47.33,47.20,47.78,49.74,51.59,
+53.24,54.20,54.79,53.94,54.59,55.70,57.46,60.50,58.15,60.08,
+61.16,62.98,64.37,65.53,65.88,67.93,68.35,70.37,68.62,70.53,
+72.95,74.36,75.36,76.09,77.96,78.37,81.21,78.20,81.19,81.89,
+83.12,83.09,84.48,86.07,87.22,88.51,89.30,89.85,91.09,93.30,
+91.48,94.63,96.35,96.40,99.79,97.00,99.45,101.28,102.48,102.75,
+104.36,103.84,107.19,108.70,106.95,107.46,110.29,110.16,113.95,113.67,
+112.26,115.17,115.21,116.09,118.59,118.83,119.42,122.30,120.64,121.45,
+124.31,125.48,125.83,126.51,127.48,128.37,130.53,129.25,131.98,134.67,
+133.11,137.08,138.88,137.42,141.38,137.93,139.34,141.34,143.58,142.55,
+147.15,148.06,147.04,147.26,148.81,151.30,149.67,150.13,153.82,154.43,
+155.18,152.88,159.45,158.69,160.62,159.25,162.38,163.32,164.43,163.90,
+165.40,166.39,169.36,167.88,169.54,169.72,172.42,172.38,173.05,172.16,
+176.13,174.65,179.64,178.83,181.02,180.45,184.05,185.48,184.06,185.26,
+185.76,188.14,187.23,187.82,187.99,192.09,193.41,194.47,192.96,195.94,
+197.08,199.81,199.05,198.55,199.11,199.79,200.00,202.18,205.11,203.98,
+207.51,205.21,210.19,207.32,211.09,211.90,211.65,215.12,217.09,218.79,
+215.54,219.63,218.29,220.24,223.97,220.52,223.12,225.35,225.65,223.31,
+226.18,229.32,229.35,231.02,230.20,233.15,233.75,235.31,233.53,237.98,
+238.21,240.25,238.85,240.20,243.91,243.01,244.59,245.77,245.08,248.13,
+248.87,247.74,248.74,253.32,250.74,255.15,254.54,255.99,257.96,257.46,
+256.46,257.33,261.37,260.70,261.65,264.06,265.57,262.46,267.27,271.55,
+270.74,266.35,272.21,271.36,274.50,276.81,273.01,279.42,277.33,281.16,
+278.39,279.82,280.25,280.24,283.61,283.22,284.77,287.10,287.86,289.02,
+290.12,291.62,295.28,289.63,293.72,294.00,296.16,296.72,294.73,299.37,
+300.36,300.62,305.97,304.85,304.27,302.67,306.11,304.61,311.61,306.50,
+7.70,8.64,9.28,10.05,10.91,11.72,12.83,13.15,15.72,14.63,
+15.80,16.35,16.86,17.78,19.65,20.37,21.10,21.39,22.06,22.09,
+23.73,23.95,25.68,26.19,27.62,27.80,27.93,29.09,30.92,30.47,
+32.38,33.22,32.79,33.34,34.00,35.87,36.73,37.09,37.98,37.93,
+39.15,40.07,40.79,42.63,42.95,44.60,43.83,45.34,45.25,46.94,
+46.50,48.07,47.88,49.90,50.21,49.20,51.13,53.20,53.90,53.92,
+55.20,56.36,57.64,58.16,58.19,58.70,59.98,60.69,61.13,61.11,
+63.45,65.45,64.04,64.16,64.49,66.96,67.83,67.81,67.72,69.77,
+70.60,71.91,74.29,72.17,72.55,75.15,75.14,76.49,76.23,78.90,
+79.02,79.24,80.13,79.14,81.39,83.81,84.35,83.68,87.47,86.30,
+86.12,85.33,87.64,90.09,90.73,89.78,90.95,91.08,95.40,94.00,
+92.38,93.32,96.94,96.51,98.39,96.99,98.08,96.53,99.73,99.84,
+100.73,103.12,105.10,103.36,104.98,107.06,105.04,106.83,106.87,107.64,
+111.29,110.27,112.43,111.98,111.08,114.28,114.74,115.45,115.57,117.44,
+115.45,118.37,117.38,116.51,124.46,121.92,120.76,120.31,124.78,123.56,
+123.50,126.16,127.15,127.68,127.64,128.42,129.45,130.45,132.56,131.88,
+134.59,132.58,135.16,135.46,136.24,138.12,138.00,136.35,139.56,141.55,
+138.99,144.63,145.19,142.78,146.65,143.70,142.96,146.41,147.81,148.22,
+150.48,151.96,150.97,150.41,151.26,152.69,154.02,157.21,155.36,155.66,
+156.38,156.13,158.68,159.25,158.82,157.97,160.47,163.47,163.21,161.61,
+162.17,162.55,163.27,167.11,167.53,166.55,168.82,172.27,171.29,170.15,
+170.39,175.73,173.97,174.81,174.96,174.38,178.36,178.32,179.73,177.92,
+179.63,182.32,182.26,181.45,183.47,181.80,186.21,187.16,186.16,185.81,
+187.68,185.02,189.16,192.16,191.64,192.83,191.94,193.87,195.65,197.51,
+195.94,198.70,196.89,198.05,197.44,199.74,200.91,200.47,202.94,201.34,
+202.85,203.83,205.62,204.65,204.62,208.53,209.32,211.16,207.54,212.60,
+213.26,211.60,211.44,213.94,214.66,218.64,217.47,217.15,218.54,219.57,
+220.16,217.85,220.89,220.62,220.32,220.56,224.14,223.76,224.37,225.64,
+225.56,232.40,228.57,229.66,227.33,231.09,231.39,231.64,230.48,236.08,
+5.76,6.68,7.52,7.87,8.03,8.84,9.38,10.38,10.93,11.38,
+11.65,12.99,12.46,13.30,14.49,16.07,14.73,15.79,16.66,17.23,
+17.95,18.04,20.23,18.78,19.62,20.44,20.46,21.57,21.35,23.23,
+24.05,24.83,24.01,25.05,25.99,26.26,26.70,27.55,29.16,29.25,
+29.57,30.87,31.04,31.17,31.15,32.22,32.92,32.33,33.67,34.09,
+34.68,35.77,37.22,36.10,37.66,37.52,38.84,41.16,39.49,39.74,
+41.39,41.62,43.77,42.24,44.38,44.92,45.40,44.94,46.35,48.09,
+46.01,47.04,49.30,48.54,48.62,50.13,49.48,50.91,52.51,53.43,
+53.22,52.91,53.96,56.33,55.70,55.45,55.53,57.06,58.14,58.79,
+57.91,59.87,59.21,61.27,62.02,63.65,63.14,64.14,66.11,64.66,
+63.48,64.95,65.70,66.63,67.51,68.27,67.66,69.93,68.93,69.62,
+71.13,71.71,73.39,74.06,74.16,73.51,73.58,76.27,76.42,75.72,
+77.65,78.67,79.32,79.18,79.20,78.92,79.07,81.50,81.18,81.27,
+80.61,84.06,83.59,82.03,85.02,85.57,86.43,88.74,87.43,86.53,
+88.22,88.02,90.55,89.79,89.35,93.02,92.95,90.79,92.14,92.57,
+94.29,94.26,94.92,96.21,97.84,97.47,97.88,98.92,98.83,99.67,
+98.70,100.44,100.64,102.63,103.11,103.00,104.21,102.15,103.84,105.05,
+106.03,105.33,109.18,109.37,107.52,110.02,112.99,110.00,111.68,111.06,
+113.32,112.57,113.39,114.23,115.91,115.37,116.93,118.22,116.12,118.37,
+116.29,117.19,120.33,121.25,121.10,121.06,119.13,121.81,123.08,123.86,
+124.26,122.61,124.91,124.76,124.62,128.48,127.66,125.98,127.53,129.11,
+129.52,130.37,131.14,131.49,133.80,130.75,131.12,135.28,133.34,135.22,
+134.63,137.10,136.81,137.75,139.11,140.68,139.85,138.50,138.60,142.13,
+142.27,139.03,142.09,141.69,144.88,145.40,146.44,146.88,147.02,146.20,
+148.05,147.86,148.60,147.76,149.17,150.16,150.99,150.92,151.68,154.22,
+152.29,154.76,154.81,155.99,155.15,155.19,156.85,156.10,155.42,158.43,
+158.58,161.22,158.21,158.84,159.65,163.21,160.28,162.11,165.50,162.92,
+165.09,163.89,165.07,167.63,166.46,167.00,169.04,169.44,171.51,172.23,
+170.24,171.55,168.55,172.43,172.88,173.14,173.49,176.60,176.28,172.44,
+4.24,5.14,5.69,5.96,6.37,7.36,7.54,7.57,7.87,7.83,
+9.01,9.62,10.06,10.18,10.41,10.90,10.45,12.03,12.75,12.89,
+13.67,13.81,13.94,14.48,15.68,16.16,16.46,15.84,16.41,18.29,
+16.66,18.74,18.28,18.69,19.87,19.59,20.99,20.68,20.86,22.23,
+21.63,22.10,23.51,22.89,23.65,23.59,24.03,25.38,25.81,26.39,
+26.12,27.32,27.62,27.85,28.01,28.95,28.63,28.80,30.36,29.92,
+32.32,31.62,31.98,33.55,32.85,33.49,34.02,34.63,34.89,34.37,
+34.22,36.25,35.12,35.75,37.15,36.18,38.14,37.81,40.03,39.71,
+39.84,40.53,40.97,41.08,41.16,41.88,42.35,43.48,42.69,43.95,
+46.10,44.28,46.95,45.00,46.91,46.20,48.56,48.27,47.73,47.49,
+49.12,50.41,48.59,50.32,49.33,51.77,50.92,50.94,53.40,52.84,
+52.76,53.74,55.10,56.58,55.72,53.92,54.14,56.51,56.94,56.34,
+57.37,57.78,58.96,59.52,60.64,56.95,58.92,60.58,61.34,60.24,
+62.56,61.90,61.88,61.83,63.40,63.43,64.79,63.80,64.17,64.91,
+67.20,66.10,67.52,68.17,68.33,67.92,68.79,69.68,69.53,69.25,
+70.46,72.15,70.92,72.33,73.22,72.80,72.28,74.22,73.95,75.16,
+74.76,76.72,75.09,77.20,77.15,74.99,77.64,79.05,77.27,80.01,
+79.85,78.26,80.73,80.46,80.73,81.03,81.93,83.50,83.24,82.78,
+82.63,84.88,84.35,84.90,82.56,85.37,84.38,86.74,88.20,86.20,
+88.64,88.71,89.69,91.21,90.00,92.63,89.44,91.41,90.19,94.44,
+93.89,91.77,92.02,95.94,92.83,93.66,96.10,96.82,94.41,94.75,
+96.01,97.05,97.53,97.56,100.04,100.00,99.19,99.99,100.84,102.53,
+102.76,100.86,101.63,102.99,103.15,102.58,103.10,106.74,104.91,104.76,
+106.12,104.12,106.47,109.31,106.67,107.97,106.54,108.28,107.54,109.45,
+109.88,110.22,110.41,112.64,112.09,110.28,110.88,113.95,112.68,112.46,
+115.06,115.14,116.76,117.64,114.46,114.14,117.97,117.66,118.44,119.45,
+119.56,119.08,119.75,117.54,122.68,122.41,122.96,120.81,124.78,122.80,
+125.48,125.66,124.18,125.46,124.32,123.47,123.93,124.84,125.35,128.80,
+128.34,130.22,130.15,128.27,128.41,130.31,131.64,127.65,130.56,132.43,
+3.14,3.67,3.69,4.13,4.58,5.15,5.88,5.40,6.12,6.72,
+6.87,6.93,7.49,7.47,8.33,8.03,8.98,8.56,10.14,9.26,
+9.74,9.70,11.01,11.35,12.25,11.21,12.68,12.41,13.07,12.83,
+12.55,14.37,14.39,14.13,15.25,15.09,15.88,15.17,16.24,16.41,
+16.93,17.49,16.89,16.42,17.90,18.29,18.14,19.36,18.83,19.77,
+20.51,20.58,19.83,20.35,21.73,22.17,21.13,22.53,24.25,23.62,
+22.43,23.21,22.57,24.25,24.35,25.44,25.03,25.81,25.28,25.55,
+26.35,26.76,27.35,27.52,27.74,28.21,28.80,30.02,28.43,29.54,
+28.99,29.62,31.23,30.70,31.82,30.56,30.99,32.79,32.13,32.16,
+33.16,34.42,33.32,33.67,34.10,34.92,35.29,34.74,36.01,34.67,
+35.74,35.85,35.65,36.26,36.38,35.65,38.35,37.51,39.10,39.26,
+40.13,39.64,41.51,41.28,40.13,41.14,42.44,42.24,43.63,42.42,
+41.23,42.97,41.35,44.83,44.71,45.05,43.73,44.72,44.69,45.39,
+46.14,45.83,47.07,46.32,48.63,49.67,47.38,48.67,48.23,49.26,
+49.63,49.94,48.87,50.80,49.90,52.50,53.08,52.92,52.98,52.53,
+53.82,53.72,54.28,53.74,53.74,54.32,53.79,55.84,54.24,53.73,
+56.35,55.22,55.26,56.94,56.42,57.33,56.94,58.88,56.92,61.31,
+60.44,58.32,58.15,59.52,59.77,62.07,60.90,60.62,60.24,61.65,
+61.78,62.82,62.63,61.99,62.89,64.91,65.97,63.92,66.57,66.08,
+64.79,64.11,65.65,67.64,66.92,67.46,68.23,67.48,68.45,68.10,
+70.48,67.98,71.61,69.24,69.94,69.14,71.61,71.83,72.73,71.29,
+72.13,72.04,72.01,74.89,73.33,74.80,74.94,73.30,75.44,74.40,
+76.57,74.94,76.86,79.04,76.96,76.48,77.89,78.05,76.84,79.45,
+79.23,78.44,78.32,80.68,80.65,79.79,80.83,82.69,82.07,81.63,
+83.24,82.41,82.88,83.41,84.04,84.21,84.83,85.52,85.18,84.89,
+85.35,85.27,84.08,88.67,87.43,86.31,86.21,86.88,89.26,88.51,
+87.53,90.36,88.81,89.98,90.83,92.05,91.13,89.85,90.44,90.99,
+91.35,93.20,89.45,93.15,92.88,93.15,94.07,94.03,94.57,96.91,
+94.37,95.06,97.04,97.64,96.24,97.95,96.26,99.27,97.07,98.42,
+2.29,2.40,2.72,3.07,3.11,3.67,4.04,4.34,3.94,5.11,
+5.19,5.30,4.79,5.86,6.25,6.55,6.01,7.04,6.85,7.17,
+7.77,7.82,7.57,8.06,8.30,8.58,8.58,8.55,9.31,9.62,
+9.18,9.89,10.00,11.16,11.05,11.37,10.94,11.90,11.77,11.94,
+11.77,12.15,13.03,12.30,13.15,14.11,13.60,13.46,14.24,13.30,
+14.30,14.95,14.90,15.79,15.75,15.51,16.52,16.67,17.77,16.77,
+16.51,17.72,17.73,19.12,17.72,17.84,20.33,19.46,18.57,19.77,
+19.86,19.90,19.54,19.97,20.94,21.04,20.20,21.13,21.83,21.31,
+22.76,21.53,23.06,22.30,22.69,22.65,22.98,24.93,23.97,24.48,
+24.48,24.33,25.69,24.39,25.23,25.38,26.94,26.32,25.80,28.04,
+26.42,26.71,27.55,26.97,28.00,28.19,27.97,30.20,29.29,29.58,
+29.64,30.15,29.84,29.14,30.01,30.42,30.39,32.02,31.02,31.55,
+31.13,32.18,33.38,33.01,33.69,33.14,31.98,34.46,34.16,34.58,
+34.72,34.70,35.21,35.27,36.53,36.06,35.95,36.05,37.38,36.28,
+36.43,36.25,36.50,38.03,37.67,38.01,38.56,37.22,39.15,39.00,
+38.89,38.45,39.41,40.24,39.98,40.42,40.52,40.88,40.90,40.81,
+41.04,42.02,41.07,43.65,42.47,42.15,43.77,44.26,44.19,43.52,
+43.90,43.47,43.88,44.25,45.87,45.36,45.78,45.33,47.26,46.91,
+45.23,46.69,47.31,47.22,46.21,47.79,47.46,48.72,48.12,48.94,
+49.38,48.75,50.53,48.99,49.93,50.56,50.34,50.74,50.39,50.54,
+52.14,50.80,51.20,51.75,52.63,52.41,55.20,53.47,54.10,53.58,
+54.37,54.50,55.02,55.64,55.14,53.15,55.63,55.67,55.69,56.18,
+56.79,57.24,56.48,55.41,58.07,58.10,59.55,58.06,57.20,58.19,
+59.19,58.59,60.33,59.49,58.23,59.53,59.68,60.96,60.33,60.70,
+61.32,62.67,59.69,63.55,61.83,61.26,61.42,64.25,61.82,62.27,
+63.08,63.55,62.62,63.94,63.10,65.53,64.86,63.84,65.68,64.70,
+63.62,65.38,65.91,66.37,66.16,66.65,66.55,67.44,67.68,67.96,
+66.58,68.16,68.28,69.38,70.34,69.17,70.45,70.21,69.57,69.72,
+70.81,72.72,71.34,71.90,71.20,72.22,72.84,73.16,73.02,72.75,
+1.52,2.09,2.23,2.60,2.47,2.67,2.90,3.19,3.32,3.52,
+3.33,3.70,4.13,3.96,4.50,4.40,4.22,5.48,4.86,5.41,
+5.64,5.35,6.03,5.72,6.04,6.25,5.96,6.93,6.41,7.10,
+6.55,7.29,8.47,7.65,7.44,7.97,8.69,8.55,8.68,8.42,
+8.77,9.09,9.06,10.15,9.38,9.97,10.79,10.83,10.83,10.81,
+11.20,10.15,10.88,11.54,11.54,12.44,11.97,12.42,12.13,12.79,
+13.35,12.57,13.06,12.83,13.09,13.27,13.40,14.36,12.93,13.85,
+14.34,14.42,15.11,14.31,15.30,14.54,15.77,16.49,15.04,15.03,
+15.99,16.61,17.40,15.99,16.55,17.47,17.64,17.20,19.03,16.59,
+18.10,19.50,18.31,17.98,19.12,19.61,18.63,19.44,19.29,19.47,
+20.38,20.71,19.56,20.71,20.79,21.17,20.55,20.88,22.54,21.06,
+22.25,22.23,22.00,21.58,23.84,22.07,23.25,24.08,23.16,23.02,
+22.86,23.82,23.56,23.81,23.42,24.29,24.84,24.11,24.62,24.53,
+25.16,25.57,24.86,26.45,26.66,26.46,26.80,26.44,27.02,27.60,
+27.77,26.86,28.00,27.84,27.80,27.02,29.03,28.34,28.38,28.97,
+28.83,29.86,28.95,29.45,31.34,30.42,30.16,30.73,31.34,28.97,
+30.36,31.10,31.09,32.01,31.90,31.80,33.23,32.08,31.25,32.48,
+33.16,31.44,34.24,34.07,33.44,33.36,33.25,34.37,35.23,34.47,
+33.88,35.26,34.03,34.75,34.94,34.63,35.65,37.50,35.34,34.43,
+37.14,36.43,37.51,36.82,37.36,36.94,36.75,37.71,36.78,39.45,
+37.38,37.10,39.43,37.00,38.90,39.32,40.16,40.41,39.31,41.64,
+40.38,40.09,39.64,41.23,40.52,41.57,41.12,41.85,42.19,42.88,
+39.69,41.61,41.35,43.06,42.07,42.61,43.58,42.30,44.38,42.66,
+42.74,44.50,42.50,43.54,43.64,42.81,44.56,45.49,45.80,44.34,
+45.29,45.29,46.57,45.98,45.87,47.10,45.15,46.51,45.25,44.78,
+45.40,47.71,47.22,46.37,50.51,48.58,47.48,48.17,48.69,47.54,
+47.80,50.26,47.69,48.73,49.51,48.71,49.91,49.73,49.45,50.65,
+51.63,51.45,52.16,51.19,52.03,50.35,51.37,52.99,52.19,52.21,
+54.63,52.69,52.46,51.55,52.48,53.50,52.02,51.95,54.68,53.85,
+1.21,1.59,1.42,1.83,1.90,2.24,2.58,1.98,2.18,2.98,
+3.25,3.29,2.51,3.22,3.29,3.19,3.77,3.30,3.84,4.31,
+4.32,4.09,4.44,4.63,4.33,4.45,4.61,4.88,5.34,4.82,
+6.19,4.69,5.43,5.70,5.08,6.57,6.08,6.33,6.55,6.50,
+6.64,7.53,7.49,7.09,6.88,7.76,8.00,7.32,7.73,7.88,
+7.96,8.05,8.64,8.67,9.05,8.81,8.93,9.13,9.42,8.53,
+9.20,9.95,10.10,9.39,10.22,9.65,10.30,11.38,10.69,9.88,
+10.71,10.55,10.14,11.15,10.94,11.36,11.36,11.34,11.48,11.96,
+11.94,12.55,12.26,11.57,12.74,11.90,13.64,13.02,12.77,13.57,
+13.38,13.24,13.56,14.02,13.70,13.25,14.00,14.82,13.95,13.76,
+14.48,15.62,15.31,14.88,14.63,14.89,14.85,15.93,16.93,15.93,
+15.95,16.02,16.04,17.89,16.21,17.34,17.74,17.30,16.71,16.96,
+18.47,17.68,17.89,17.91,18.55,17.76,18.44,18.84,18.55,18.82,
+19.47,18.55,18.98,18.75,18.82,19.71,19.59,21.22,20.37,20.46,
+19.96,19.91,19.25,19.38,19.85,22.12,19.80,20.96,20.87,21.02,
+21.17,21.08,21.35,21.76,20.80,20.50,22.57,22.07,22.15,21.90,
+23.07,22.28,23.08,21.66,23.40,23.04,24.05,24.38,23.01,24.67,
+23.19,24.18,24.20,25.15,24.53,24.34,24.95,24.70,24.78,25.44,
+25.49,27.40,25.17,25.94,25.52,26.89,26.65,26.38,26.68,27.42,
+26.88,26.39,25.52,27.07,28.12,28.34,26.54,27.36,27.96,28.38,
+29.27,28.73,29.22,28.01,27.95,28.41,29.11,29.98,29.72,29.92,
+29.98,29.78,29.78,29.91,30.41,30.55,28.73,30.42,31.95,29.78,
+31.54,31.15,33.00,31.43,30.66,31.86,30.82,31.41,31.96,31.80,
+31.59,31.35,33.16,33.58,31.61,32.03,34.09,32.34,32.28,34.49,
+32.67,34.15,34.62,33.87,33.37,33.92,35.35,33.15,33.31,36.01,
+33.27,34.74,33.39,34.64,35.28,35.81,36.37,36.64,35.51,34.94,
+35.38,36.51,36.98,36.83,37.56,38.20,36.55,36.92,35.17,36.57,
+37.90,37.96,37.54,37.02,37.98,38.88,39.31,39.14,38.12,39.18,
+39.55,38.17,39.93,39.68,38.82,40.13,39.58,40.88,40.45,41.38,
+0.94,0.98,1.34,1.27,1.56,1.79,1.81,1.36,1.75,2.29,
+1.89,1.89,2.12,2.17,2.49,2.37,2.69,2.67,2.49,3.09,
+3.02,2.71,3.05,3.45,3.96,3.37,3.29,3.24,3.25,3.53,
+4.25,4.06,4.43,3.97,4.54,4.26,4.48,4.81,4.98,4.53,
+4.74,5.49,5.49,5.50,5.32,5.26,5.48,5.86,5.50,6.18,
+5.64,5.63,6.59,6.33,5.99,5.62,6.39,6.27,6.44,6.61,
+6.92,6.87,6.87,7.30,6.35,7.13,7.48,7.75,7.77,7.82,
+7.88,8.19,8.39,8.17,7.80,8.93,9.07,8.62,8.75,8.59,
+9.31,9.21,8.91,8.81,8.95,9.89,9.92,9.64,10.29,9.71,
+9.63,10.70,10.00,10.54,10.43,10.55,10.02,9.92,10.52,11.03,
+10.53,11.08,10.66,10.91,10.52,11.91,12.84,12.21,11.60,11.73,
+10.99,11.47,12.33,12.21,12.31,11.42,12.51,12.88,12.15,12.38,
+13.70,13.44,12.52,13.32,12.83,13.59,13.00,13.15,13.55,13.30,
+14.20,14.32,13.97,13.71,14.80,14.38,13.29,14.74,15.37,14.35,
+15.79,15.05,14.88,14.95,15.20,15.51,15.75,14.26,15.36,15.54,
+15.93,15.59,16.75,16.09,15.05,15.79,16.53,17.19,17.11,16.82,
+16.64,17.37,16.66,17.22,18.21,16.53,16.10,17.58,18.19,18.44,
+16.81,18.41,18.71,18.38,16.32,18.89,18.82,17.61,18.36,17.76,
+18.20,18.59,18.46,19.76,18.95,19.42,18.53,18.62,18.24,17.83,
+19.14,19.92,19.37,19.96,18.98,19.86,20.76,21.51,19.77,22.17,
+21.69,21.08,21.64,22.12,20.27,19.82,20.79,21.46,21.30,21.52,
+21.50,22.02,20.42,20.70,20.94,22.88,21.42,21.68,22.73,20.76,
+22.29,23.63,21.85,23.45,22.78,22.10,23.09,23.14,24.81,24.52,
+23.62,23.62,23.43,24.29,24.67,25.06,24.02,24.32,23.99,24.48,
+24.42,25.05,24.71,24.34,25.61,24.61,25.09,26.16,25.08,24.85,
+25.69,25.59,25.24,25.83,27.30,24.71,25.71,26.87,26.27,26.33,
+27.91,27.44,27.55,26.52,27.62,27.87,27.47,26.90,27.07,27.74,
+27.58,25.29,26.92,28.31,27.57,28.13,29.46,26.59,28.82,29.48,
+27.87,29.13,28.83,29.01,29.97,30.33,29.01,28.31,29.95,29.50,
+0.75,0.96,0.88,0.88,1.05,1.19,1.28,1.09,1.00,1.20,
+1.39,1.55,1.62,1.25,1.65,1.47,1.82,1.77,1.96,2.43,
+2.35,2.21,2.29,2.75,2.94,2.62,2.86,2.69,3.15,3.03,
+3.01,2.98,3.10,3.48,3.35,3.49,3.36,3.17,3.55,3.43,
+3.40,3.75,3.77,4.21,4.30,3.76,4.33,4.20,3.74,3.89,
+3.98,4.70,4.97,4.51,4.69,5.07,4.64,4.95,5.29,4.74,
+4.50,5.24,5.74,5.73,5.06,5.90,5.25,5.41,6.67,5.48,
+5.80,6.15,5.67,6.17,5.65,6.10,6.82,6.20,6.13,5.97,
+6.95,6.88,7.12,7.13,7.37,6.77,7.01,7.21,6.42,7.64,
+7.30,7.67,6.96,7.83,7.76,7.86,7.44,8.12,7.50,7.59,
+8.13,7.87,7.63,7.68,8.60,9.02,7.79,7.71,8.84,8.55,
+8.21,8.88,8.26,8.69,8.89,9.13,9.55,9.11,9.51,9.26,
+9.27,10.06,8.54,10.25,9.54,10.55,9.69,9.98,9.16,10.08,
+8.94,10.16,9.42,9.76,10.99,10.00,10.77,10.31,10.43,10.67,
+10.77,11.02,11.18,10.22,11.69,11.49,10.86,11.47,11.40,10.44,
+12.25,11.77,11.70,10.83,11.63,10.98,12.25,11.79,12.22,11.75,
+11.84,12.77,12.38,13.64,12.81,12.15,11.89,12.69,12.79,13.21,
+13.77,12.22,12.92,13.10,12.23,13.07,13.62,14.07,13.30,14.16,
+13.37,13.41,14.59,14.58,14.83,13.26,14.20,13.76,15.11,14.05,
+14.34,13.57,14.27,14.28,14.28,14.59,14.23,15.08,14.99,15.97,
+15.06,15.40,15.01,15.19,15.59,14.96,15.52,16.23,15.39,15.95,
+16.83,16.80,15.36,16.15,16.24,16.11,16.03,16.67,17.01,16.27,
+16.45,16.74,15.44,16.54,16.88,16.61,17.25,17.39,16.82,18.01,
+15.99,16.60,17.13,17.76,18.22,17.92,18.32,18.19,18.33,17.54,
+18.91,18.07,17.70,18.65,18.16,18.70,17.97,18.32,19.29,18.86,
+19.15,18.61,18.02,18.50,18.37,19.16,19.47,19.76,18.78,19.11,
+18.83,18.02,19.94,19.30,19.45,19.32,19.94,19.52,19.68,20.62,
+20.04,19.89,20.17,20.21,21.19,20.15,19.77,21.17,21.71,20.16,
+20.64,20.81,21.14,22.37,22.13,21.61,20.47,21.89,21.99,21.13,
+0.51,0.75,0.57,0.68,0.75,0.61,0.93,0.89,1.08,1.20,
+1.14,0.92,1.39,1.14,1.29,1.31,1.30,1.54,1.56,1.29,
+1.52,1.66,1.69,1.88,1.38,2.03,1.62,2.09,1.93,1.96,
+2.30,2.39,2.19,2.12,2.35,2.14,2.32,2.39,2.53,2.63,
+2.65,2.50,3.02,3.30,3.34,2.73,2.61,3.27,3.38,3.44,
+2.89,3.63,3.42,3.41,3.81,3.16,3.33,3.17,3.59,3.11,
+3.62,3.72,3.94,4.16,4.05,4.30,4.08,3.56,3.96,4.24,
+4.20,4.22,4.13,4.36,4.04,4.66,5.07,4.81,4.84,4.55,
+5.00,5.26,4.86,4.97,4.88,5.02,4.64,5.27,5.73,4.85,
+5.59,5.19,5.17,4.95,5.05,5.36,5.69,5.32,5.22,5.63,
+5.07,6.15,5.84,5.99,6.39,6.31,6.65,6.53,5.83,6.06,
+6.66,6.35,6.52,6.07,6.63,7.04,6.28,7.13,6.88,6.49,
+7.22,7.20,7.36,6.52,6.76,7.04,7.25,7.11,7.55,7.36,
+7.11,7.00,7.80,7.56,7.69,7.26,7.85,7.72,8.27,7.46,
+6.97,7.73,7.78,8.89,8.09,7.66,9.31,9.16,8.41,8.35,
+8.61,8.44,7.98,8.51,8.18,8.89,9.11,8.83,8.54,9.33,
+8.83,8.47,9.06,8.65,10.04,9.21,9.63,8.89,8.82,10.89,
+9.99,9.62,9.10,9.91,9.62,9.34,10.37,10.00,10.43,10.52,
+9.65,10.19,9.63,10.84,10.21,9.97,10.37,10.68,10.15,10.49,
+11.34,10.57,10.29,11.68,10.56,10.88,11.18,11.46,11.36,10.77,
+12.02,11.02,11.32,11.56,11.67,11.85,11.95,11.33,12.50,12.10,
+11.79,12.44,10.63,12.03,12.36,12.07,11.63,12.52,12.45,11.64,
+11.94,12.40,12.39,12.22,12.07,11.38,11.96,12.53,11.79,12.42,
+12.83,12.64,13.05,14.27,13.05,12.10,12.08,13.20,12.91,12.82,
+12.80,12.71,13.15,13.30,12.61,13.80,12.95,13.27,13.57,14.12,
+14.35,13.72,13.20,14.46,13.90,15.07,14.91,14.32,14.70,14.84,
+14.83,15.12,14.13,14.68,14.66,14.91,15.00,13.94,15.14,12.71,
+14.34,14.34,15.80,14.18,13.94,14.95,15.16,14.12,14.89,15.24,
+14.65,15.38,16.08,15.92,15.81,14.71,16.34,15.73,15.56,16.05,
+0.34,0.59,0.36,0.52,0.59,0.68,0.73,0.72,0.78,0.75,
+1.01,0.89,0.79,0.88,1.21,0.89,0.80,1.05,1.09,0.96,
+1.36,1.12,1.15,1.02,1.28,1.50,1.88,1.42,1.14,1.27,
+1.27,1.52,1.60,1.78,1.70,1.79,2.04,1.97,1.84,1.84,
+1.88,2.03,1.93,2.09,2.17,2.23,1.91,2.53,2.18,2.30,
+2.27,2.50,2.51,2.27,2.11,2.55,2.48,2.53,2.62,2.67,
+2.64,2.98,2.74,2.98,2.99,2.96,2.83,3.14,2.74,2.81,
+3.14,3.03,3.45,3.19,3.37,3.38,3.42,3.51,3.44,3.54,
+3.60,3.46,3.86,3.44,3.77,3.92,3.62,3.56,4.07,3.39,
+4.10,4.06,4.04,3.78,4.13,3.67,4.21,3.91,3.92,4.05,
+4.44,4.27,4.07,4.38,4.55,4.34,4.80,4.60,4.70,4.49,
+4.73,4.96,4.53,4.47,5.08,5.01,4.96,4.41,5.11,5.24,
+4.97,4.79,5.16,4.89,5.20,4.85,4.99,5.13,5.77,5.65,
+5.26,5.57,4.63,5.74,4.93,5.22,5.75,5.41,5.68,5.72,
+5.61,5.36,5.51,5.79,6.13,5.77,5.38,6.50,6.00,6.13,
+6.48,6.87,6.13,6.83,6.47,6.79,5.72,6.10,5.94,6.73,
+6.53,6.73,7.46,6.58,6.73,6.99,7.42,6.80,7.37,7.02,
+7.20,6.43,7.59,6.83,6.89,6.95,7.17,7.40,6.29,7.54,
+7.32,7.13,7.82,6.98,7.21,7.45,7.54,7.33,7.42,7.71,
+7.15,7.76,7.67,8.00,8.83,7.79,7.38,7.34,8.69,7.95,
+7.72,7.74,7.73,8.17,8.01,8.55,8.16,8.10,8.74,8.24,
+7.89,9.11,9.36,8.54,8.40,8.73,8.18,9.05,9.01,8.44,
+9.24,9.81,9.34,9.22,9.11,8.72,9.39,8.95,9.31,9.10,
+9.38,9.38,9.38,8.55,8.64,9.45,9.48,9.98,10.23,10.46,
+10.98,9.39,9.02,9.56,10.27,9.35,10.00,9.58,10.56,9.35,
+10.02,9.74,10.13,10.63,12.00,11.01,10.28,11.06,10.10,9.82,
+10.19,11.08,11.27,10.82,10.69,10.72,10.03,11.74,10.66,10.53,
+10.57,10.14,10.18,10.29,11.50,11.05,10.83,10.20,11.31,11.19,
+11.76,11.54,11.45,10.76,11.97,10.88,11.60,11.63,11.25,11.30,
+0.47,0.37,0.32,0.31,0.38,0.55,0.21,0.55,0.50,0.51,
+0.48,0.48,0.78,0.68,0.56,1.01,0.60,0.75,0.86,0.56,
+0.91,1.20,1.12,1.04,0.97,1.18,1.07,1.67,1.15,1.24,
+0.95,1.55,1.30,1.11,1.08,1.34,1.14,1.47,1.71,1.31,
+1.56,1.55,1.81,1.83,1.66,1.12,1.76,1.72,1.38,1.76,
+1.50,2.15,1.69,1.68,1.81,2.01,1.97,2.23,1.94,2.32,
+1.82,2.07,2.37,2.01,1.88,1.98,1.87,1.92,2.07,2.09,
+2.32,2.40,1.98,2.27,1.99,2.68,2.85,2.06,1.72,2.48,
+2.27,2.43,2.92,2.18,2.86,2.96,2.94,2.68,2.44,2.78,
+2.87,2.65,2.92,2.64,3.41,2.99,2.98,2.76,3.02,3.18,
+3.10,2.84,3.16,3.10,3.19,2.83,3.30,3.23,2.91,3.45,
+3.43,3.04,3.58,3.86,3.36,3.35,3.17,3.26,3.67,3.37,
+4.35,3.53,3.71,3.76,4.17,3.75,3.97,3.79,3.94,3.35,
+4.06,4.04,3.42,4.24,4.34,4.04,4.14,3.68,3.69,4.07,
+4.40,4.00,4.59,4.12,4.29,4.73,4.71,3.97,4.65,4.95,
+4.36,4.79,4.26,4.32,4.76,4.28,4.91,4.56,4.94,5.00,
+5.34,4.81,4.85,4.81,5.74,5.23,5.86,5.09,5.10,4.96,
+5.17,5.26,5.49,5.39,5.67,5.22,5.23,5.16,5.93,5.43,
+5.29,5.36,4.72,5.47,5.46,5.47,4.90,6.20,5.92,5.62,
+5.63,5.69,5.85,5.92,6.64,6.44,5.87,6.16,5.58,5.91,
+5.86,6.04,5.66,5.87,6.09,6.04,5.88,5.85,6.40,6.25,
+6.28,7.00,6.83,6.68,6.50,6.28,7.41,6.03,6.27,6.99,
+6.38,5.92,6.74,6.66,6.89,7.20,6.88,7.07,6.50,7.33,
+6.64,6.37,7.41,7.49,6.77,7.21,7.58,7.35,7.66,6.73,
+8.64,7.20,6.52,7.18,6.81,7.15,7.10,6.93,7.04,8.03,
+7.16,8.12,6.52,7.28,7.38,7.47,7.47,7.45,7.61,7.00,
+7.50,7.08,7.94,6.93,8.32,8.05,8.26,8.67,8.34,7.59,
+7.77,8.09,8.06,8.21,8.28,8.77,7.66,8.21,8.71,8.73,
+8.22,8.64,7.89,8.78,7.89,8.21,9.13,8.68,8.31,8.59,
+0.21,0.20,0.33,0.17,0.28,0.32,0.19,0.29,0.38,0.30,
+0.59,0.39,0.25,0.34,0.44,0.64,0.66,0.71,0.53,0.51,
+0.54,0.90,0.77,0.74,0.69,0.76,0.88,0.89,0.70,0.86,
+0.90,0.80,1.01,0.98,0.83,0.67,1.23,0.93,1.21,0.61,
+0.95,1.07,0.98,1.29,0.99,1.16,1.07,1.17,1.21,1.51,
+0.89,1.38,1.91,1.57,1.48,1.31,1.04,1.25,1.51,1.51,
+1.58,1.34,1.77,1.46,1.49,1.33,1.49,1.52,1.72,1.83,
+1.93,1.35,1.82,1.86,1.88,1.99,1.65,2.13,1.82,1.55,
+2.05,2.29,1.75,1.89,1.89,1.68,2.11,1.94,1.89,2.01,
+2.36,2.02,2.58,1.84,2.03,2.38,2.29,2.11,2.21,1.91,
+1.91,2.45,2.21,2.49,2.60,3.06,2.24,2.47,2.23,2.19,
+2.64,2.49,2.30,2.46,2.97,2.29,2.83,2.52,2.54,2.76,
+2.67,2.56,2.40,2.71,3.27,2.50,2.53,2.75,2.87,3.34,
+3.12,3.00,2.48,2.76,2.88,3.54,3.62,2.81,2.84,3.25,
+3.23,3.04,3.39,3.30,2.73,3.27,2.97,2.99,2.91,3.23,
+2.94,3.39,3.60,2.97,3.30,3.42,3.97,3.69,3.36,3.29,
+3.67,3.12,3.48,3.47,3.56,4.04,3.24,3.71,3.79,3.99,
+3.89,3.55,3.27,3.80,3.75,3.45,3.97,3.89,4.26,4.29,
+4.41,4.18,3.58,4.17,3.86,4.43,4.30,4.48,4.63,4.23,
+4.51,3.76,4.35,4.28,4.40,4.03,3.59,4.41,3.70,4.41,
+4.35,4.44,4.40,4.20,4.70,4.99,4.33,4.18,4.60,4.55,
+4.87,3.92,5.19,4.52,4.29,4.24,4.80,4.54,5.14,4.78,
+4.18,5.04,4.95,4.85,5.05,5.27,5.17,4.75,4.83,4.83,
+5.10,5.23,4.73,5.14,4.71,5.54,4.53,4.96,5.43,4.82,
+4.45,5.46,4.89,5.80,5.60,5.31,5.02,5.59,5.70,5.26,
+5.79,5.51,5.14,5.01,5.39,5.92,5.54,5.45,5.13,5.41,
+5.05,5.41,5.07,5.98,5.75,5.91,5.74,4.88,6.41,5.68,
+5.84,6.15,5.33,5.53,4.77,7.00,5.33,6.14,5.52,5.31,
+5.69,6.12,5.86,5.75,6.67,5.75,5.97,6.98,6.01,6.18,
+0.08,0.26,0.15,0.07,0.24,0.25,0.23,0.29,0.28,0.37,
+0.27,0.28,0.26,0.27,0.34,0.23,0.55,0.44,0.46,0.34,
+0.51,0.53,0.42,0.41,0.31,0.86,0.39,0.50,0.55,0.50,
+0.31,0.85,0.56,0.55,0.74,1.00,0.73,0.83,1.12,0.71,
+0.86,0.73,0.70,0.76,0.85,0.72,0.70,1.02,1.01,1.02,
+0.90,0.67,0.99,0.86,0.89,1.02,0.94,0.99,0.86,0.93,
+0.98,1.11,1.02,1.28,1.42,1.12,1.00,1.04,1.22,1.29,
+1.18,1.30,1.30,1.42,1.19,1.10,1.31,1.21,1.45,1.56,
+1.25,0.85,1.41,1.27,1.32,1.47,1.42,1.59,1.41,1.42,
+1.35,1.61,1.40,1.67,1.38,1.28,1.74,1.50,1.45,1.73,
+1.76,1.71,1.91,1.48,1.72,1.56,1.90,1.91,1.87,1.57,
+1.59,1.70,2.30,1.88,1.70,1.79,1.87,1.54,1.89,2.01,
+2.01,1.96,1.77,2.37,2.03,1.99,1.83,2.74,1.99,2.23,
+1.67,2.45,2.04,1.99,2.36,2.11,2.53,2.10,2.37,2.19,
+2.23,2.25,2.20,2.42,2.25,2.10,2.53,2.25,1.93,2.31,
+2.46,2.43,2.46,2.65,2.45,2.47,2.84,2.92,2.23,2.63,
+2.80,2.84,2.67,2.50,2.89,2.49,2.31,2.46,3.10,2.88,
+2.88,2.42,2.63,2.80,2.66,2.99,2.82,3.05,2.54,2.50,
+2.64,3.24,2.81,3.45,3.15,2.41,3.29,3.30,2.96,3.22,
+3.57,2.45,2.93,2.70,2.69,2.58,2.63,2.64,3.21,3.23,
+3.14,2.99,3.35,3.21,3.55,3.26,3.18,3.58,3.22,3.33,
+3.06,3.56,2.80,3.26,3.28,3.00,3.10,3.09,2.82,3.24,
+3.36,3.58,3.43,3.20,3.33,3.38,2.96,3.36,3.65,3.92,
+3.83,3.29,3.20,3.94,3.23,3.79,3.85,3.59,3.56,3.42,
+3.67,3.58,3.15,2.97,3.67,4.21,3.48,3.57,3.76,3.67,
+4.03,4.25,3.54,3.90,3.92,3.93,3.70,4.38,3.55,3.59,
+3.93,4.35,4.40,3.96,4.01,3.96,4.27,4.14,4.62,4.33,
+3.79,4.60,4.46,4.64,4.09,4.03,4.00,4.03,4.32,3.81,
+3.79,5.24,4.54,4.54,4.55,5.16,4.36,4.52,4.56,4.86,
+12.66,12.60,15.05,16.12,16.93,18.42,19.91,20.27,22.91,23.27,
+24.41,24.51,26.55,27.43,28.89,30.10,31.68,31.70,33.63,34.05,
+36.12,37.54,37.68,38.35,40.84,41.27,43.08,44.17,44.99,46.22,
+48.31,48.26,50.63,52.54,51.60,53.29,55.29,56.44,57.06,57.19,
+59.66,59.99,60.65,62.78,64.10,64.24,66.51,66.06,68.70,69.98,
+70.83,73.39,73.23,73.70,75.72,75.75,78.04,78.13,79.39,81.38,
+82.58,84.77,86.62,87.01,86.46,88.79,88.76,92.59,91.51,95.50,
+95.78,97.17,97.95,97.92,100.31,99.19,101.47,102.38,106.14,106.60,
+105.70,107.68,109.86,110.00,111.16,112.45,111.74,114.72,115.56,116.16,
+119.07,119.80,118.64,121.48,124.67,123.20,125.66,127.25,125.61,130.14,
+130.79,131.90,131.21,134.22,135.34,136.03,138.04,138.65,140.50,137.45,
+142.00,141.97,143.81,144.41,147.26,147.89,148.33,150.36,150.66,151.57,
+153.07,154.63,156.00,157.75,156.54,158.65,161.40,162.39,161.89,164.71,
+163.42,166.76,168.91,171.51,170.51,171.35,172.08,175.16,174.02,174.30,
+176.56,177.53,179.92,181.86,182.27,184.10,183.38,184.33,186.75,188.90,
+190.93,189.34,190.31,192.33,196.45,193.92,196.05,199.82,199.88,198.40,
+200.05,203.20,203.12,206.19,205.92,204.96,209.08,206.85,210.15,213.28,
+213.84,213.88,213.41,219.24,217.03,219.67,220.64,222.73,224.84,221.06,
+226.56,225.74,228.74,227.35,228.63,229.98,229.97,232.34,234.19,233.11,
+234.47,236.88,238.61,241.94,242.50,240.34,244.70,242.77,244.37,247.52,
+247.18,248.01,248.29,256.28,252.00,253.60,256.64,255.42,257.36,256.98,
+257.95,259.26,261.84,264.93,266.55,267.42,266.74,268.45,268.81,268.69,
+271.38,273.90,275.86,273.22,276.32,276.26,278.73,282.11,280.34,284.55,
+283.27,284.51,283.07,285.40,288.01,289.02,294.00,290.28,293.95,294.51,
+297.33,297.31,299.12,297.82,302.82,302.15,304.19,304.00,305.26,306.22,
+304.31,308.67,308.55,311.44,311.84,313.44,312.81,314.71,316.12,316.13,
+320.09,316.24,320.82,322.36,322.85,323.68,327.52,330.04,328.91,331.20,
+329.78,330.07,335.90,333.54,336.88,335.59,336.09,337.69,334.21,340.63,
+342.86,343.66,344.60,345.38,345.82,347.28,348.40,350.72,353.23,353.37,
+9.03,10.62,10.99,11.62,13.32,13.78,14.86,15.11,17.18,16.98,
+18.20,18.26,20.20,21.53,21.89,23.64,23.55,24.64,26.12,26.54,
+27.66,28.46,28.52,30.21,30.98,32.65,32.04,33.85,34.38,35.57,
+36.96,37.55,38.80,39.81,40.34,41.78,42.28,42.38,43.99,44.80,
+44.52,46.17,46.45,46.64,48.53,49.36,50.49,50.30,52.92,52.89,
+55.21,55.18,56.23,56.33,56.64,60.19,60.08,62.55,62.67,61.42,
+65.88,65.24,66.53,66.28,66.38,67.65,69.98,69.96,70.83,71.61,
+73.67,72.89,74.42,76.70,77.52,76.02,77.70,80.46,81.31,80.72,
+81.80,82.72,83.94,83.81,87.32,86.78,89.53,87.25,90.59,90.43,
+90.58,91.97,91.51,92.95,94.11,94.78,96.62,96.71,98.61,99.15,
+99.29,102.77,100.73,103.25,103.21,104.74,104.58,107.24,107.16,106.91,
+107.96,109.54,111.02,110.17,111.75,111.86,111.19,114.22,115.77,116.85,
+117.96,119.29,121.11,118.67,122.27,122.61,123.83,123.47,124.49,127.22,
+126.93,126.13,129.59,128.24,130.38,130.87,131.98,135.24,135.37,134.83,
+136.07,136.84,138.28,139.11,141.04,143.23,141.46,141.79,142.50,142.53,
+143.87,146.32,147.14,148.58,148.07,149.53,152.11,152.71,151.58,153.96,
+152.41,156.43,155.55,158.45,157.26,156.47,156.59,160.82,162.21,162.09,
+163.04,164.59,165.41,164.22,167.13,166.92,170.25,170.95,169.87,171.19,
+171.91,174.89,173.41,175.09,175.39,175.84,178.20,179.03,176.57,182.22,
+179.71,182.91,185.60,182.60,183.63,184.09,187.90,187.24,189.59,188.79,
+189.12,188.95,191.69,194.57,193.32,194.89,194.44,197.47,196.56,201.06,
+198.18,199.84,204.94,202.55,203.15,202.54,205.43,205.52,208.19,209.80,
+206.84,210.82,214.87,208.11,209.24,211.30,216.03,213.17,216.87,216.73,
+219.03,218.89,222.28,219.51,220.84,221.71,224.34,228.50,225.86,222.29,
+228.14,227.30,227.17,231.28,230.09,229.54,232.20,232.91,234.29,233.54,
+234.85,236.56,236.44,239.56,240.08,241.58,241.24,242.06,242.80,246.46,
+245.46,244.65,246.42,246.35,248.53,250.40,249.12,248.52,250.07,250.99,
+254.24,258.60,255.38,253.80,258.15,256.57,259.90,258.52,263.24,260.96,
+263.46,262.16,263.01,267.32,265.84,265.02,272.33,268.21,270.93,268.89,
+7.77,7.96,8.77,8.79,10.36,11.06,10.90,12.40,13.16,13.02,
+14.50,14.67,15.11,15.95,17.05,18.42,18.61,18.88,19.86,20.64,
+20.12,21.22,22.86,23.16,24.63,24.23,25.13,25.45,26.77,27.52,
+28.87,28.54,29.54,30.10,29.95,31.12,31.95,32.01,33.66,34.10,
+35.05,35.45,36.32,37.20,38.91,36.69,38.37,38.30,41.80,40.44,
+41.86,40.58,42.90,43.22,44.20,45.86,45.49,45.95,47.95,48.60,
+48.96,49.78,49.98,50.23,52.51,50.76,53.49,51.18,53.87,56.73,
+55.95,55.79,57.06,57.23,57.25,59.53,60.05,60.78,60.44,61.46,
+62.20,64.51,63.86,63.35,66.40,66.79,67.62,66.58,68.77,66.42,
+68.23,70.71,70.55,71.12,70.49,72.64,75.12,73.38,74.71,74.67,
+77.21,78.12,77.90,78.32,79.16,80.07,82.34,80.33,82.46,82.69,
+83.39,84.57,85.13,85.00,86.15,87.25,87.26,88.12,89.49,89.14,
+90.73,90.31,92.21,93.14,92.56,92.91,93.30,93.78,96.98,95.04,
+97.88,98.14,98.18,99.68,99.51,102.69,102.55,101.08,102.62,102.37,
+106.08,103.16,105.78,106.33,105.67,107.15,108.75,106.98,109.02,109.35,
+109.83,112.63,114.12,113.80,112.21,112.84,116.98,116.59,114.77,118.79,
+117.45,115.94,117.89,118.61,120.32,120.19,123.77,120.32,126.37,123.79,
+124.80,126.68,127.35,126.01,128.68,128.25,129.71,130.18,130.40,131.89,
+129.71,132.57,133.40,134.53,135.45,135.71,135.70,135.00,134.80,136.44,
+138.75,140.28,137.47,138.70,140.23,140.77,142.34,144.06,146.24,145.00,
+145.66,145.42,146.62,146.21,148.22,144.75,150.16,149.47,153.49,148.50,
+154.96,152.25,154.93,154.85,153.62,154.31,153.51,157.77,158.54,156.56,
+159.75,159.24,160.91,161.80,162.85,162.16,163.71,164.90,163.48,164.61,
+165.74,164.90,167.28,169.34,168.12,170.32,170.83,169.88,171.50,171.07,
+172.20,173.06,173.48,174.59,175.14,179.50,179.34,178.49,179.31,179.46,
+181.87,179.33,179.02,181.27,184.83,182.45,183.58,184.14,185.67,185.53,
+187.87,185.52,187.46,189.20,190.31,187.82,191.91,193.07,193.92,191.98,
+194.71,194.66,194.00,197.47,196.81,194.26,196.63,198.05,197.19,199.07,
+199.11,200.86,202.49,202.55,203.81,205.12,204.26,201.53,203.91,204.79,
+5.37,6.21,6.44,6.63,7.60,8.40,9.05,8.98,9.42,10.02,
+10.67,11.45,11.77,12.46,12.37,12.91,14.13,14.05,14.76,16.04,
+16.56,16.20,17.16,17.13,18.01,19.04,19.38,19.60,19.39,20.43,
+21.12,21.79,22.23,22.13,23.34,24.33,24.61,24.16,24.52,26.10,
+26.96,27.58,26.60,27.83,28.47,29.25,29.35,30.68,31.42,32.29,
+30.92,31.89,32.29,33.10,33.88,34.41,33.74,35.70,35.14,35.64,
+37.21,37.21,38.02,37.50,38.99,38.85,39.19,38.88,40.74,41.94,
+41.13,42.93,41.88,44.62,44.86,45.14,45.95,44.59,47.27,47.35,
+46.62,48.24,47.73,48.80,48.79,51.01,50.20,50.05,50.81,52.34,
+50.64,53.01,53.03,54.34,55.28,54.90,55.79,57.38,56.55,56.69,
+58.45,59.75,58.15,58.27,61.49,59.78,60.69,62.21,62.19,63.09,
+62.76,61.92,65.49,64.53,66.22,65.38,65.01,66.07,66.89,69.20,
+68.53,69.51,72.12,68.68,69.83,70.83,70.41,73.66,73.08,75.53,
+74.85,73.16,74.46,73.41,76.58,76.47,74.76,77.74,75.78,77.21,
+78.27,79.71,78.91,81.40,78.43,81.32,83.91,79.77,83.61,83.91,
+84.09,85.19,82.32,84.22,84.82,88.09,87.43,87.83,87.26,89.03,
+89.96,88.87,91.84,90.03,91.68,93.02,92.56,92.30,92.67,91.23,
+96.28,93.89,96.58,98.17,96.82,97.40,98.96,99.28,99.43,100.70,
+98.92,99.09,102.07,100.46,100.44,103.56,99.81,101.24,104.36,103.77,
+105.25,104.83,104.50,106.32,106.19,107.85,109.27,108.02,109.87,108.82,
+111.56,110.83,114.88,108.81,114.19,112.26,113.18,112.69,113.55,114.35,
+114.19,118.29,119.16,118.94,113.81,116.80,117.50,118.43,119.90,119.78,
+122.39,122.79,122.67,124.51,122.70,124.13,121.97,124.51,123.28,126.61,
+126.62,124.33,127.31,128.87,129.47,128.72,131.38,131.58,128.45,130.73,
+131.37,133.81,133.51,130.76,132.67,134.96,132.48,135.91,133.75,133.51,
+132.43,133.78,135.41,136.18,137.85,140.01,142.55,139.48,139.22,139.77,
+140.74,139.92,143.34,143.70,145.31,143.17,146.40,145.24,147.97,146.94,
+148.62,145.86,149.12,149.83,150.41,148.28,151.85,148.69,152.07,151.28,
+150.30,154.08,153.86,154.01,151.68,154.19,158.13,156.00,155.28,158.64,
+3.71,3.83,4.76,5.22,6.22,5.80,6.49,7.48,6.95,8.57,
+8.02,8.20,9.37,9.04,9.36,10.21,10.86,10.89,11.48,11.46,
+11.86,12.28,13.33,13.24,14.01,13.68,14.67,15.16,15.16,15.13,
+16.01,15.79,16.60,17.25,17.78,17.89,18.95,18.41,19.48,18.91,
+20.96,20.43,19.57,21.52,21.37,22.71,21.64,22.43,23.67,24.21,
+24.20,25.10,25.32,26.25,25.21,26.51,26.48,25.91,27.51,27.73,
+27.63,28.50,28.22,28.93,29.47,29.46,31.38,29.60,30.36,31.09,
+32.54,33.19,32.64,32.14,32.28,33.14,34.64,34.63,34.23,35.06,
+35.71,36.15,36.44,35.83,36.83,38.42,38.77,39.27,39.43,40.30,
+41.80,41.13,39.80,41.53,41.90,40.65,42.64,42.82,42.33,42.26,
+44.94,43.61,44.54,45.48,45.18,47.22,47.75,46.33,48.08,47.66,
+48.07,49.22,48.21,48.68,47.80,48.14,48.85,51.19,50.65,50.50,
+52.84,51.24,52.74,52.20,54.84,53.06,54.51,54.88,55.82,54.96,
+56.26,54.45,56.17,57.98,56.84,57.39,57.02,58.26,58.31,58.63,
+60.39,59.91,59.34,60.76,61.62,62.45,61.07,63.27,62.55,64.31,
+62.72,63.86,66.03,65.14,66.19,64.55,66.56,66.47,67.24,67.59,
+67.01,66.16,67.74,68.21,67.26,69.25,69.34,69.53,71.33,72.19,
+73.93,72.06,74.11,71.61,72.98,72.41,75.86,75.05,74.67,75.32,
+73.71,77.59,76.90,77.66,77.59,76.96,77.59,80.94,78.48,79.67,
+78.35,80.86,78.56,80.97,84.76,79.21,82.78,83.97,83.39,84.02,
+81.46,82.11,84.76,82.96,85.07,84.33,87.45,85.76,84.74,88.11,
+87.25,89.24,89.73,88.70,88.07,88.27,89.84,91.72,89.94,94.42,
+88.98,93.06,90.47,92.81,93.03,91.69,90.81,95.89,94.77,96.80,
+94.94,94.99,97.41,95.83,97.04,96.66,98.21,97.05,98.88,99.98,
+100.24,100.05,99.02,98.54,100.50,101.58,102.85,102.42,103.11,101.57,
+100.97,103.11,101.83,104.07,103.87,104.22,105.16,106.05,104.89,107.74,
+106.67,106.29,107.33,105.86,110.07,108.66,110.81,109.75,111.09,111.02,
+110.44,110.24,110.46,110.43,116.74,114.87,112.70,115.97,114.55,115.51,
+113.38,118.24,115.56,118.04,113.18,115.98,113.87,120.61,118.18,118.84,
+2.79,3.31,3.64,4.07,3.96,4.74,4.42,5.16,5.18,5.82,
+5.86,6.19,6.71,6.25,7.54,7.79,8.59,7.97,8.15,8.29,
+9.20,10.29,9.63,10.01,10.54,10.89,10.07,10.94,11.82,12.17,
+11.05,12.36,13.00,12.69,13.02,14.97,13.66,14.10,13.58,15.06,
+14.81,15.88,16.17,16.33,15.79,15.88,17.78,16.87,17.68,17.82,
+18.20,18.83,17.79,18.86,19.99,19.37,19.48,19.87,19.57,19.91,
+21.59,22.19,21.76,21.48,22.39,22.09,22.12,23.68,22.84,23.51,
+24.18,24.10,23.33,24.60,24.42,25.16,25.92,26.12,25.74,25.81,
+27.10,27.02,28.47,26.70,28.65,28.85,27.60,29.12,28.46,29.65,
+30.49,28.69,30.33,31.03,31.37,31.94,32.92,31.15,30.49,31.77,
+33.59,33.42,32.65,34.54,34.91,35.32,34.75,34.80,36.65,34.10,
+35.55,37.34,36.95,36.26,36.27,36.87,37.04,38.74,37.45,38.17,
+38.31,39.01,40.35,40.20,40.13,40.35,40.74,41.96,41.29,41.71,
+40.88,42.50,42.20,42.12,43.38,43.81,44.53,43.56,44.90,45.63,
+45.21,44.56,44.77,45.95,45.67,46.01,48.27,45.88,47.73,47.87,
+46.81,47.67,48.37,49.75,48.69,49.08,50.43,48.75,49.35,51.54,
+50.77,51.27,50.58,51.56,51.70,52.61,53.36,52.54,52.65,53.77,
+52.63,54.00,56.31,53.84,56.01,55.73,56.52,54.30,58.17,57.95,
+56.85,56.45,57.78,58.70,58.73,58.59,60.14,58.07,58.85,58.33,
+60.24,61.65,60.00,61.18,60.52,61.29,62.12,62.60,62.24,62.67,
+62.28,63.63,64.10,63.80,63.51,64.24,65.37,65.84,66.28,65.95,
+66.08,65.45,67.40,68.04,65.17,67.25,67.99,68.47,68.40,68.51,
+68.17,68.64,70.14,70.32,70.01,71.53,72.02,72.09,72.68,70.14,
+72.59,72.38,72.80,73.34,71.86,72.15,73.13,72.73,75.46,77.55,
+76.01,77.12,75.34,76.30,77.08,75.93,76.41,76.67,74.94,77.17,
+77.53,77.71,77.84,76.64,78.07,79.06,77.59,80.82,80.67,80.89,
+79.42,80.44,80.05,81.75,81.83,83.00,82.31,83.79,81.94,85.86,
+83.51,83.85,83.29,83.23,85.09,85.39,85.34,85.97,85.46,85.40,
+86.70,86.89,86.36,87.05,89.29,87.82,87.58,86.48,90.14,88.32,
+2.20,2.36,2.69,2.91,3.24,3.30,3.46,3.84,4.33,4.24,
+4.31,4.72,5.02,5.13,5.49,5.79,5.68,6.68,6.63,6.12,
+7.03,6.73,7.41,7.84,7.22,8.40,8.15,8.72,8.48,9.07,
+8.96,9.50,10.36,9.87,9.76,10.67,10.03,10.41,10.75,10.52,
+10.84,11.76,12.12,12.34,11.99,13.17,12.76,12.72,13.43,12.72,
+14.20,14.06,13.11,13.65,14.56,13.79,15.70,15.36,15.52,15.53,
+14.94,15.26,16.22,15.62,16.18,18.10,17.69,18.13,17.38,18.77,
+18.41,18.58,19.27,19.75,19.67,18.83,18.78,19.62,19.55,20.37,
+20.19,20.82,21.67,21.00,21.71,21.41,21.86,22.36,22.70,22.70,
+21.85,22.36,22.23,22.36,24.05,24.16,24.69,24.77,24.12,24.71,
+24.49,24.72,25.74,26.25,26.83,26.01,25.61,25.36,26.55,25.23,
+25.87,27.41,27.33,28.54,27.42,28.18,29.33,30.40,28.65,28.36,
+28.28,29.96,30.18,30.19,30.04,29.70,31.03,30.08,31.34,31.29,
+32.15,31.02,31.95,31.94,31.32,31.61,34.10,32.70,32.49,33.53,
+33.84,33.47,33.65,34.88,34.21,33.40,34.53,33.81,37.07,37.00,
+36.38,35.65,36.70,36.26,37.89,37.17,37.38,38.05,35.81,37.64,
+37.59,39.24,38.08,39.09,38.70,40.53,40.69,40.35,40.03,41.01,
+42.00,40.49,42.02,41.62,39.95,41.73,42.50,42.27,41.55,42.37,
+41.94,43.75,42.78,43.69,43.93,44.28,44.64,44.71,43.26,44.58,
+44.94,45.80,46.00,45.71,45.37,45.36,44.81,46.28,45.92,44.96,
+47.61,49.09,47.29,47.24,46.93,48.25,48.57,48.83,49.23,48.39,
+49.31,49.34,50.19,52.69,51.03,49.49,52.46,51.39,49.49,52.25,
+53.14,53.80,51.90,52.52,50.61,53.11,52.96,54.06,52.77,54.13,
+54.53,52.92,53.87,55.46,55.18,54.42,55.53,54.92,56.26,56.34,
+57.26,56.97,57.53,56.63,55.54,56.58,56.91,57.66,58.34,57.60,
+57.27,59.52,58.62,60.25,59.61,59.63,57.38,60.24,60.24,59.71,
+59.71,62.30,60.67,61.26,62.73,61.02,63.11,61.14,62.66,62.39,
+64.59,63.73,64.21,62.85,62.42,63.86,62.26,64.05,67.22,63.38,
+66.00,65.30,67.27,65.90,65.14,65.71,66.64,65.50,65.53,68.88,
+1.27,1.37,2.03,1.95,2.83,2.96,2.54,2.83,3.14,2.80,
+3.69,3.59,4.13,3.98,3.94,4.09,4.32,4.52,4.46,5.09,
+6.44,4.98,5.08,5.67,5.58,6.51,6.14,5.64,6.19,6.40,
+7.20,7.07,6.68,6.92,7.15,6.85,6.80,7.99,8.40,7.75,
+8.29,8.39,8.43,9.02,9.29,9.62,8.96,9.70,9.87,10.26,
+10.78,9.51,10.59,10.83,10.95,11.17,10.98,10.77,11.36,11.77,
+11.87,11.76,12.64,13.07,12.28,12.22,12.63,12.28,13.28,13.02,
+13.03,13.03,13.92,13.11,14.65,13.93,14.79,15.07,15.02,14.99,
+15.11,15.83,15.46,16.93,15.38,15.54,15.79,16.25,16.43,17.12,
+16.42,15.26,17.52,16.64,16.98,17.31,18.46,18.08,17.48,19.19,
+18.75,18.21,18.85,19.71,18.50,19.97,20.06,19.95,20.46,20.27,
+20.00,21.28,20.96,19.40,20.63,20.48,21.16,20.40,20.90,21.17,
+21.81,22.68,22.12,21.99,23.73,22.39,22.83,22.85,22.27,23.72,
+24.01,22.69,24.09,24.29,24.13,24.67,22.71,25.01,24.54,24.43,
+25.87,24.44,25.25,25.14,27.24,26.02,26.80,26.15,27.26,26.24,
+26.80,27.63,27.23,28.29,27.86,27.52,28.49,28.76,28.28,28.63,
+28.73,28.96,30.05,30.23,29.54,29.61,28.61,30.27,29.89,30.56,
+30.72,31.12,30.47,31.32,30.21,30.75,30.69,30.05,31.42,30.71,
+32.41,32.59,32.26,32.46,31.98,32.66,32.64,33.05,32.36,32.83,
+32.99,32.76,33.11,35.36,34.02,33.87,35.32,34.16,34.33,34.18,
+35.09,35.72,33.15,36.46,36.84,35.27,36.12,36.49,37.31,34.22,
+37.56,36.35,36.16,37.37,38.87,39.13,37.31,37.78,38.30,38.28,
+38.18,38.77,39.28,41.12,40.29,38.94,38.68,39.28,40.87,40.33,
+40.47,40.95,40.38,40.44,41.77,41.14,41.48,42.57,40.66,41.41,
+42.16,42.06,42.02,42.75,42.47,42.47,44.23,43.49,40.40,44.22,
+43.56,43.34,43.25,43.44,45.85,44.73,46.78,44.02,43.97,46.21,
+45.49,45.02,44.76,45.87,45.93,44.70,46.56,45.86,47.17,46.98,
+46.51,46.44,48.02,46.45,48.60,47.40,47.12,48.87,49.03,49.78,
+48.91,49.47,47.52,50.03,48.55,49.19,51.07,49.31,48.13,49.89,
+1.48,1.21,1.69,1.65,2.00,2.12,2.01,2.35,1.96,2.27,
+2.85,2.40,2.54,2.65,3.06,3.18,3.23,3.41,3.45,4.01,
+3.56,4.12,4.60,4.19,4.23,4.85,4.55,4.64,4.30,5.15,
+4.67,5.32,4.75,5.01,6.05,5.81,5.96,5.44,6.09,6.09,
+6.90,6.23,5.87,6.89,6.79,6.68,7.68,8.07,7.87,7.07,
+7.07,7.38,8.13,8.17,8.12,7.89,8.44,9.04,8.21,8.67,
+9.14,8.45,8.59,8.96,9.49,10.14,9.65,10.62,9.71,11.11,
+10.47,9.66,11.13,10.55,11.02,10.59,11.07,10.62,12.08,10.53,
+11.16,10.85,11.39,10.90,11.63,12.62,12.76,12.31,13.01,12.09,
+11.70,12.85,12.87,12.55,12.41,12.65,12.89,13.32,13.85,14.59,
+13.84,12.96,13.87,13.09,13.76,14.67,13.63,14.32,15.10,13.58,
+15.17,15.15,14.85,16.52,14.91,15.45,15.82,16.09,16.38,15.15,
+16.69,16.70,15.80,16.61,17.41,16.53,17.16,17.95,16.85,16.83,
+15.77,17.05,17.94,19.02,18.70,18.17,18.33,18.76,18.14,18.89,
+19.15,17.95,20.47,19.57,20.03,19.20,19.78,19.61,20.03,19.40,
+18.98,19.05,19.12,18.81,20.38,20.56,20.47,20.84,20.99,20.58,
+21.16,20.67,20.35,21.47,21.12,20.83,21.75,22.12,23.07,23.91,
+23.49,22.74,21.61,22.09,22.34,22.09,22.46,23.84,23.48,23.40,
+24.68,24.20,24.94,23.61,24.46,24.26,26.46,25.38,25.22,24.34,
+23.25,25.47,24.74,25.93,24.11,27.81,26.43,25.74,25.77,26.17,
+25.53,27.56,26.61,27.33,27.86,27.46,26.81,27.47,29.00,28.17,
+27.20,28.47,27.21,28.79,28.27,27.52,28.13,29.39,29.40,28.75,
+27.72,28.62,29.00,29.42,29.45,29.50,29.78,29.62,29.22,31.12,
+28.59,29.58,30.57,30.73,30.33,32.28,30.79,31.50,29.99,31.78,
+31.49,32.89,31.55,32.41,30.08,32.02,31.44,31.81,32.53,32.04,
+33.64,32.93,31.60,31.51,34.85,33.05,32.43,33.67,34.23,33.46,
+34.13,34.63,34.93,34.79,35.23,33.35,35.72,35.49,35.11,36.04,
+34.97,35.70,33.77,35.86,35.88,35.24,35.57,37.29,35.60,36.66,
+35.48,35.05,35.57,38.31,36.37,36.40,37.44,37.49,36.66,37.66,
+1.00,0.76,1.19,1.28,1.68,1.53,1.49,1.69,1.97,1.90,
+1.91,2.00,1.81,2.07,2.16,2.74,2.33,2.59,2.66,2.62,
+2.48,3.03,3.27,3.29,2.90,2.62,3.12,3.64,3.31,3.85,
+3.60,4.37,3.75,3.91,4.15,4.29,4.59,4.25,4.72,4.65,
+4.55,4.89,4.85,4.90,4.92,5.33,5.55,5.59,5.31,5.53,
+5.57,6.39,6.03,5.89,6.22,6.07,6.19,6.96,7.10,6.26,
+6.24,6.88,6.98,6.65,7.19,7.48,6.76,7.69,6.79,7.40,
+7.19,7.42,7.95,7.34,8.49,7.78,8.23,8.43,8.64,8.27,
+7.60,8.40,8.96,8.29,9.07,9.35,7.92,8.79,9.67,8.92,
+9.40,9.32,10.02,9.43,8.71,10.24,9.53,9.02,10.10,10.42,
+10.81,10.97,10.17,10.42,10.48,10.93,10.91,11.37,10.66,12.31,
+11.00,11.90,11.55,10.83,11.03,10.66,11.12,11.32,12.35,12.24,
+11.38,11.38,11.35,11.72,11.86,13.42,12.22,13.12,13.02,13.62,
+12.71,13.40,13.46,13.60,13.68,13.73,13.95,13.51,14.03,14.44,
+13.28,14.37,15.30,13.47,13.99,13.64,15.19,14.50,15.27,15.41,
+13.71,14.44,15.12,14.68,15.67,14.72,15.30,15.47,16.64,16.64,
+16.16,16.64,16.05,15.76,16.39,15.54,17.43,15.77,16.14,17.23,
+17.21,17.48,16.41,17.97,17.18,17.19,17.29,17.93,17.21,18.75,
+17.58,17.20,18.80,19.13,17.91,19.17,18.48,18.62,18.31,18.80,
+18.49,18.48,18.92,19.57,18.50,19.23,18.90,19.43,19.44,19.71,
+19.31,19.85,19.98,21.17,19.57,18.98,20.29,20.94,20.87,20.36,
+21.19,20.35,21.39,20.73,21.81,21.31,20.94,21.42,21.79,21.29,
+21.98,22.68,20.78,22.12,21.61,21.71,21.92,22.04,21.75,22.70,
+22.49,23.47,23.59,22.69,22.96,23.23,22.27,23.13,23.38,24.09,
+22.87,23.00,23.62,24.03,24.55,24.35,24.43,23.96,23.39,23.99,
+25.08,24.25,24.64,24.69,25.13,24.13,25.17,25.03,25.74,24.38,
+25.73,26.04,24.61,25.14,24.82,25.34,24.91,25.02,26.28,25.75,
+25.50,25.83,25.78,25.54,26.63,25.57,27.00,26.83,27.57,25.47,
+27.83,28.33,27.28,28.02,27.63,28.40,27.44,28.28,28.86,28.16,
+0.92,0.83,1.13,0.79,1.26,1.14,1.32,1.05,1.51,1.41,
+1.73,1.64,1.38,1.71,1.58,1.60,1.74,1.89,2.18,2.40,
+2.03,2.29,2.39,2.03,2.16,2.23,2.57,2.90,2.90,2.57,
+2.67,2.90,2.93,2.74,2.97,3.38,3.38,3.36,3.66,3.96,
+3.86,3.71,3.19,3.71,4.25,4.19,3.82,4.08,4.46,4.23,
+3.92,4.66,4.28,4.70,4.60,4.57,4.70,4.98,4.61,5.41,
+5.20,4.71,5.21,4.93,4.72,5.07,5.65,6.27,5.83,5.37,
+5.65,5.28,6.21,6.33,6.09,6.16,5.64,6.33,5.50,6.08,
+6.17,6.08,6.06,6.48,6.25,6.85,6.63,6.94,6.88,6.84,
+6.61,7.08,7.55,7.01,6.76,7.42,7.04,7.09,7.75,7.39,
+8.25,7.69,6.90,8.65,8.12,8.25,8.41,7.88,7.53,8.42,
+7.45,8.67,7.62,8.56,8.94,9.36,8.41,8.64,8.38,8.88,
+8.83,9.26,8.79,9.11,9.59,9.30,9.23,10.72,9.61,9.97,
+10.17,9.22,9.78,9.74,10.84,9.95,10.47,10.84,10.22,10.60,
+10.26,10.70,10.61,10.59,11.51,11.84,10.23,11.45,11.14,11.63,
+11.75,11.03,10.86,11.11,11.39,11.89,11.33,11.33,12.56,11.34,
+11.23,12.10,11.84,10.99,10.39,12.04,12.10,12.37,11.38,11.65,
+11.90,13.13,13.11,13.15,13.27,12.35,12.93,13.14,13.81,12.66,
+13.76,13.19,13.19,13.25,12.96,13.81,13.82,13.55,13.27,12.77,
+13.86,13.74,13.54,14.05,13.77,13.41,13.72,14.37,14.70,14.28,
+14.65,16.10,15.26,14.24,14.94,15.24,14.33,16.17,15.60,14.68,
+15.06,15.56,16.01,16.32,14.95,15.19,15.38,15.27,16.33,16.48,
+15.42,15.69,16.17,16.02,15.70,16.27,15.29,16.37,16.66,16.57,
+17.26,16.66,16.68,17.40,15.67,17.04,16.64,16.52,17.72,17.91,
+17.05,17.36,16.55,18.22,17.69,16.90,17.19,18.32,17.41,18.11,
+18.35,18.29,17.19,18.77,19.10,19.79,19.66,17.98,19.21,18.61,
+19.16,19.00,18.35,17.21,18.21,18.46,19.94,19.26,18.91,19.20,
+19.11,19.65,19.12,19.23,18.48,21.23,19.32,20.73,21.79,19.10,
+19.63,19.91,21.02,19.73,20.63,19.64,20.39,20.39,20.02,21.95,
+0.56,0.63,0.65,0.65,0.99,0.85,0.98,1.01,0.91,0.88,
+1.12,1.11,1.03,1.22,1.21,1.32,1.02,1.34,1.32,1.53,
+1.34,1.48,1.62,1.83,1.52,1.78,1.73,1.95,1.86,1.95,
+2.35,2.09,2.46,2.18,2.27,2.27,2.62,2.44,2.59,2.63,
+2.80,2.44,2.60,2.65,3.06,2.74,2.74,2.83,2.58,2.67,
+2.90,3.34,3.42,3.11,3.35,3.57,3.39,3.42,3.79,3.61,
+3.44,3.72,3.07,4.23,3.54,3.80,4.47,3.71,4.55,3.89,
+3.90,3.78,4.40,4.47,4.78,4.40,4.18,3.74,4.23,4.50,
+4.64,5.05,4.90,4.68,5.08,4.86,5.22,5.43,5.03,5.38,
+4.99,5.02,5.63,5.34,5.72,5.32,5.62,5.80,5.13,6.29,
+5.51,6.07,5.92,6.12,5.85,5.71,6.60,6.42,6.21,6.04,
+5.91,6.55,6.29,5.86,5.90,6.26,6.74,6.59,6.28,7.00,
+6.47,6.65,6.93,7.29,6.21,6.16,7.16,6.66,8.08,7.22,
+7.15,6.80,7.82,7.28,7.61,7.11,7.80,8.15,7.67,7.89,
+7.45,7.27,7.23,8.26,7.85,7.55,7.03,8.16,8.98,8.04,
+8.61,7.96,8.42,7.56,7.98,9.05,8.77,8.72,8.61,9.06,
+9.16,8.92,9.74,8.14,8.85,8.75,8.85,10.07,9.97,9.14,
+9.45,9.72,9.20,9.68,8.71,9.97,9.36,9.50,10.36,9.20,
+9.68,9.99,10.05,9.50,9.79,10.35,9.22,9.26,9.94,10.15,
+9.66,10.14,11.45,11.10,10.32,10.22,9.95,10.56,10.80,10.59,
+10.78,11.27,10.87,10.29,12.16,10.89,10.40,10.67,11.11,11.84,
+11.38,11.59,10.40,11.65,12.96,12.12,11.74,11.78,12.47,11.68,
+12.19,12.84,12.30,11.80,12.22,12.23,12.14,12.71,13.22,12.15,
+12.45,12.34,12.87,12.04,11.67,13.22,12.97,13.05,12.99,13.21,
+13.62,13.12,13.72,13.13,13.32,13.08,13.29,12.69,12.46,13.25,
+13.07,12.60,14.14,13.87,13.53,13.26,14.60,14.04,12.97,13.42,
+13.72,13.93,14.45,14.02,13.47,14.52,15.15,14.12,13.02,15.31,
+14.80,14.64,14.82,13.33,15.16,13.65,14.54,14.92,15.36,14.04,
+14.12,14.86,13.63,15.32,14.87,15.70,15.74,15.39,15.13,16.26,
+0.32,0.67,0.61,0.65,0.66,0.58,0.62,0.65,0.78,0.76,
+0.77,0.93,0.61,0.84,0.92,0.83,0.96,1.23,1.02,1.05,
+1.25,1.12,1.35,1.01,1.31,1.59,1.33,1.43,1.45,1.87,
+1.58,1.46,1.96,1.72,1.97,1.24,2.14,1.56,2.05,1.63,
+1.55,2.26,2.13,2.04,2.41,2.06,2.32,1.82,2.01,1.98,
+2.57,2.67,1.95,2.31,2.35,2.60,2.62,2.75,2.54,3.02,
+2.34,2.55,3.33,2.93,2.73,2.63,2.73,3.31,2.84,3.34,
+3.47,2.97,2.89,3.22,3.06,3.30,3.42,2.85,3.34,3.54,
+3.68,3.86,3.12,3.88,3.72,3.32,3.51,3.94,4.57,3.87,
+4.07,3.50,3.48,3.84,4.31,3.56,4.06,3.44,4.47,3.70,
+4.12,4.14,3.88,4.14,4.51,4.55,4.56,3.75,3.91,4.72,
+4.57,4.57,4.54,4.20,4.56,4.93,5.36,4.43,4.94,4.54,
+5.21,5.37,4.79,5.00,5.24,4.82,5.37,5.13,5.45,5.01,
+5.00,5.36,4.99,4.70,5.16,5.40,5.76,4.78,5.43,6.09,
+5.50,5.64,5.46,5.64,6.14,5.53,6.19,6.00,5.77,6.53,
+6.06,6.07,6.58,5.56,6.62,5.85,7.09,6.11,6.25,6.18,
+6.25,7.07,6.52,6.70,7.06,7.02,7.29,7.38,7.05,6.72,
+7.48,6.61,6.97,6.67,7.16,6.62,6.92,6.83,7.26,6.75,
+6.55,7.45,7.32,7.92,7.30,7.49,7.00,8.31,7.45,7.70,
+7.68,7.91,7.90,6.68,7.93,7.15,8.97,8.66,7.62,7.67,
+7.98,8.79,7.80,8.61,7.64,6.88,8.22,7.25,7.86,7.72,
+9.05,8.53,8.15,7.80,9.03,8.77,8.98,8.87,8.66,8.55,
+9.19,8.25,9.15,9.02,8.96,9.48,8.01,9.57,8.78,9.43,
+8.56,9.05,9.18,9.29,9.46,9.36,9.69,9.12,10.20,9.49,
+9.22,9.12,9.72,9.48,10.01,9.12,9.98,10.12,10.30,9.10,
+9.23,9.30,10.99,9.44,10.35,9.95,10.92,9.49,9.37,9.72,
+11.07,9.68,9.66,11.06,9.39,10.69,10.38,10.86,10.87,11.10,
+9.87,11.65,10.04,11.01,10.92,11.82,10.68,11.08,10.96,10.83,
+11.33,11.13,10.92,11.62,10.89,11.30,10.89,11.32,10.23,12.04,
+0.36,0.29,0.37,0.45,0.30,0.56,0.37,0.37,0.38,0.42,
+0.50,0.68,0.60,0.60,0.46,0.60,0.61,0.87,0.78,0.79,
+1.03,0.85,0.81,1.32,1.00,0.78,1.15,0.93,0.96,1.30,
+1.17,1.14,1.30,1.30,1.13,1.17,1.37,1.42,1.10,1.49,
+1.27,1.50,1.34,1.22,1.63,1.32,1.68,1.56,1.20,1.75,
+1.58,2.38,1.78,1.75,1.78,1.57,2.08,1.83,1.99,1.65,
+2.07,2.08,2.18,2.15,2.14,2.30,2.24,2.15,2.25,2.50,
+2.30,2.08,2.55,2.13,2.22,2.53,2.14,2.68,2.74,2.52,
+2.52,2.67,2.62,2.25,2.96,2.49,2.83,2.54,2.50,2.99,
+2.67,2.91,2.59,2.73,3.15,3.06,3.09,2.67,2.94,2.76,
+3.21,2.89,3.34,3.62,3.14,3.23,3.14,2.98,2.50,2.93,
+3.17,3.48,3.51,3.35,3.42,3.70,3.60,3.52,3.63,3.87,
+3.50,3.52,4.27,3.70,4.36,4.05,4.41,3.35,4.19,4.21,
+3.93,4.05,3.46,4.14,3.81,3.68,3.87,3.87,4.34,4.23,
+4.43,4.37,4.08,4.12,4.57,4.04,4.56,4.49,4.70,4.07,
+4.39,4.45,4.33,4.30,4.42,4.66,4.34,4.76,5.15,4.71,
+4.94,5.47,4.93,5.04,5.01,5.18,4.98,5.28,5.05,5.13,
+4.45,5.24,5.03,5.76,5.50,4.79,5.67,4.99,5.53,5.96,
+5.37,4.92,4.78,5.80,4.84,5.73,5.33,6.21,5.14,6.14,
+5.15,5.28,5.94,6.01,5.33,5.85,5.84,5.51,5.71,5.90,
+6.23,5.22,5.60,6.27,6.25,6.64,5.71,6.30,5.87,6.13,
+5.92,6.80,6.18,6.55,6.30,5.91,6.18,6.63,7.25,5.79,
+5.80,6.13,6.29,6.47,7.03,6.06,6.46,5.66,6.66,5.63,
+6.92,6.13,7.05,6.79,6.59,7.05,8.35,6.63,6.87,6.29,
+7.07,6.64,6.79,7.25,6.73,7.07,7.26,7.12,6.99,7.94,
+7.23,5.89,6.72,7.86,7.79,7.72,7.94,6.61,8.42,7.85,
+7.60,8.23,7.24,7.75,7.59,7.36,7.22,8.74,7.03,8.02,
+8.05,8.07,7.33,8.26,8.39,8.39,7.61,8.01,7.70,7.79,
+8.07,8.06,7.45,8.21,8.53,8.02,8.35,7.97,8.31,8.95,
+0.15,0.23,0.33,0.27,0.23,0.35,0.52,0.38,0.31,0.55,
+0.41,0.38,0.31,0.28,0.45,0.39,0.49,0.67,0.65,0.64,
+0.73,0.49,0.42,0.59,0.95,0.93,0.58,0.82,0.76,0.91,
+0.82,0.60,0.69,0.88,0.88,0.90,0.93,1.11,1.13,1.18,
+1.01,0.90,1.17,1.15,1.25,0.93,1.26,1.07,1.36,1.41,
+1.28,1.05,1.20,1.37,1.57,1.17,1.40,1.19,1.56,1.15,
+1.39,1.28,1.47,1.81,1.72,1.79,1.52,1.54,1.28,1.43,
+1.77,1.84,1.72,1.88,1.98,1.63,1.55,1.73,1.72,2.10,
+1.74,1.56,1.96,1.76,2.09,1.83,1.72,1.78,2.15,1.74,
+2.22,1.86,2.07,2.33,2.37,2.42,2.22,2.09,2.27,2.32,
+2.27,2.81,2.42,2.25,2.23,2.39,2.11,2.58,2.54,2.36,
+2.75,2.24,2.75,2.89,2.83,2.81,2.33,2.17,2.53,2.48,
+2.73,2.14,2.64,2.52,2.75,2.48,2.83,3.24,2.66,3.07,
+3.37,2.25,3.44,3.31,3.25,3.77,3.09,3.31,2.56,3.08,
+3.37,3.38,2.78,3.74,3.34,3.22,2.68,3.72,3.63,3.42,
+3.42,3.75,3.22,3.44,2.82,3.48,3.31,3.50,2.85,3.47,
+3.15,3.42,3.32,3.68,3.39,3.89,3.46,3.52,4.14,3.39,
+3.66,3.96,3.51,4.80,3.66,3.75,3.75,3.89,4.25,4.09,
+3.86,4.22,4.44,4.27,3.41,3.79,4.15,4.35,4.01,4.21,
+3.80,4.26,4.41,4.20,4.52,4.67,4.49,4.91,3.99,4.44,
+5.10,4.54,4.39,4.36,4.43,4.16,5.02,4.71,4.42,4.64,
+5.02,4.27,3.77,4.32,5.19,4.80,4.72,4.69,4.15,5.18,
+5.38,4.69,5.15,4.94,5.24,5.49,5.00,4.68,4.52,5.10,
+4.97,4.83,5.17,5.17,5.19,4.89,5.22,4.92,5.09,5.45,
+5.16,5.40,5.44,4.91,5.28,5.56,4.98,5.63,5.72,5.68,
+4.70,5.16,5.58,5.30,5.46,5.41,5.68,4.90,5.93,4.65,
+6.54,5.31,5.72,5.87,6.53,5.67,5.91,6.07,5.76,5.49,
+5.77,5.55,6.59,6.32,6.21,5.67,6.57,5.91,6.85,5.44,
+6.04,6.02,6.35,6.20,5.73,5.67,6.60,6.97,6.25,6.46,
+14.21,15.47,15.20,19.26,19.63,20.26,21.60,22.75,24.64,26.20,
+25.89,28.62,30.96,31.32,33.27,34.13,34.80,36.95,38.31,39.29,
+40.06,41.68,43.59,46.55,46.07,47.63,47.44,51.17,52.69,53.38,
+55.15,55.95,57.65,57.68,59.38,61.03,61.14,63.90,64.01,66.52,
+66.78,70.09,70.98,72.37,73.52,77.56,75.86,77.69,78.52,76.90,
+81.56,83.48,82.98,84.74,86.22,85.81,89.51,89.32,90.74,94.04,
+92.95,94.48,95.56,98.49,100.04,99.89,104.22,104.05,106.00,106.76,
+106.82,109.34,108.53,112.08,114.71,115.57,116.36,117.59,118.09,119.68,
+122.70,122.21,123.39,125.56,126.55,127.14,129.22,130.22,132.45,135.43,
+134.59,136.29,139.21,138.35,139.22,140.95,142.54,144.82,144.56,145.20,
+147.59,151.01,149.20,152.55,152.43,155.59,157.16,160.07,160.31,157.96,
+162.72,164.27,160.96,163.72,168.00,170.14,168.50,172.71,172.54,172.38,
+176.78,174.84,179.39,179.16,178.97,183.88,184.32,184.63,185.32,186.14,
+189.25,188.49,191.07,194.25,193.28,196.62,196.74,199.79,201.23,201.39,
+202.26,201.17,206.85,205.91,207.05,209.89,211.96,211.49,213.69,216.56,
+215.12,219.91,218.45,219.55,219.02,221.05,223.70,223.22,225.10,228.25,
+230.13,229.84,230.52,230.80,234.20,237.18,234.87,236.88,241.36,241.60,
+242.48,244.63,245.64,248.78,248.34,248.98,255.52,253.18,252.24,255.94,
+255.60,256.97,259.50,258.38,259.76,263.85,263.97,263.79,266.33,268.14,
+270.05,270.02,274.67,274.96,275.32,279.92,279.86,277.53,277.83,282.61,
+282.14,284.73,284.57,287.02,286.10,290.04,290.97,291.32,295.96,295.81,
+295.43,299.08,300.84,300.79,302.94,302.31,307.01,307.15,307.29,314.15,
+309.41,309.71,312.67,312.42,315.43,314.65,319.56,318.39,322.75,321.83,
+323.92,323.68,323.96,322.61,329.05,329.97,330.98,331.98,331.71,331.89,
+336.04,337.79,337.11,337.15,342.23,340.99,346.18,347.13,346.18,346.87,
+348.50,355.98,353.05,356.43,356.12,356.44,359.87,358.11,363.21,360.60,
+364.98,366.49,366.26,369.82,365.29,370.76,371.75,375.05,375.66,374.86,
+376.45,376.83,381.55,383.00,382.41,380.46,384.25,382.72,389.01,393.08,
+390.62,388.84,396.26,394.65,394.92,398.82,398.33,401.45,399.70,404.38,
+10.19,11.82,12.91,14.72,15.40,15.74,17.69,19.09,19.01,20.82,
+20.71,22.27,23.51,24.41,25.73,25.53,28.13,29.49,28.87,31.39,
+31.20,33.21,33.87,35.63,35.66,37.59,39.01,38.51,39.44,40.33,
+42.16,42.28,43.97,45.62,45.45,47.39,49.24,47.92,49.84,52.37,
+54.34,54.02,55.02,57.33,56.42,59.07,58.98,60.44,59.69,62.15,
+65.22,63.64,65.65,67.14,66.98,67.57,69.30,70.91,72.05,72.55,
+73.20,74.86,75.30,77.88,77.93,79.19,80.01,81.92,82.62,83.53,
+83.30,86.02,84.68,86.85,87.34,88.63,89.65,90.21,90.08,92.68,
+94.90,93.29,95.17,96.70,97.83,98.69,100.31,102.44,104.35,104.29,
+104.57,106.85,105.32,109.24,108.53,111.98,112.52,112.42,113.75,114.38,
+113.91,115.62,115.91,118.21,119.90,121.32,123.23,123.36,123.00,124.78,
+125.97,126.48,128.45,128.27,128.17,132.03,129.79,133.84,135.09,135.06,
+137.07,137.41,139.54,137.75,140.35,141.54,143.85,143.91,144.03,146.93,
+146.71,147.14,147.58,150.03,150.03,152.29,150.01,154.70,156.17,156.97,
+155.54,155.85,160.63,160.42,163.35,161.39,162.82,164.91,167.07,165.47,
+165.84,167.68,170.57,169.91,171.43,173.06,173.48,174.85,174.85,175.38,
+179.88,177.57,180.88,182.26,182.65,184.24,185.24,190.66,184.00,187.75,
+187.88,189.35,190.40,193.50,193.64,194.22,199.10,196.41,195.39,196.41,
+198.85,202.67,202.75,200.14,203.10,203.03,204.72,206.30,207.72,205.77,
+206.01,208.31,212.23,214.91,211.10,214.80,217.26,217.06,217.85,217.12,
+220.07,218.94,221.36,222.72,224.40,225.14,227.45,227.16,230.66,231.34,
+230.40,233.19,232.79,233.17,235.34,236.41,233.60,238.28,238.68,240.50,
+243.09,242.53,244.53,244.04,246.69,245.76,247.30,247.38,244.90,250.46,
+254.73,251.44,253.61,257.32,254.33,261.18,259.57,257.68,258.14,260.06,
+262.44,261.99,264.69,263.64,264.95,270.59,266.69,270.49,270.71,270.47,
+272.14,271.66,278.62,274.79,273.81,274.54,281.68,280.42,276.89,278.92,
+279.84,282.27,283.71,284.82,288.06,286.72,287.18,292.77,288.99,291.65,
+294.24,295.67,297.40,294.21,294.20,295.01,298.26,300.43,300.16,299.54,
+304.30,301.62,306.41,309.51,312.02,308.10,304.28,312.53,312.03,313.81,
+8.26,9.50,9.74,10.71,11.01,12.02,14.00,13.84,14.16,15.09,
+15.74,17.91,17.54,19.21,18.78,19.66,20.81,22.17,23.77,24.02,
+24.09,25.50,25.65,27.29,27.07,29.18,28.06,28.90,30.62,32.28,
+32.94,34.02,34.17,36.02,35.78,36.80,36.55,38.28,38.78,40.09,
+41.64,40.92,42.72,43.47,44.29,44.02,45.24,45.83,46.60,49.03,
+48.62,49.48,50.91,51.07,53.88,52.80,53.18,53.63,56.04,57.54,
+55.49,57.48,57.96,56.84,59.21,61.32,61.46,63.28,62.11,65.18,
+63.07,66.09,65.42,68.31,66.92,69.98,68.36,71.27,69.76,73.78,
+72.45,72.89,73.88,75.34,76.40,77.32,76.39,79.31,77.82,78.75,
+81.55,82.64,81.69,84.25,82.76,85.44,85.37,87.70,87.55,89.97,
+87.61,89.28,91.39,90.99,93.62,93.18,93.21,96.47,93.67,94.78,
+98.43,98.01,98.67,99.85,99.19,102.34,103.23,103.62,104.34,102.86,
+104.67,105.94,106.80,109.98,106.27,109.55,110.47,110.79,111.70,113.03,
+110.81,113.60,113.55,116.97,115.67,115.74,117.86,119.55,121.73,122.00,
+120.32,123.59,123.83,124.86,126.67,126.84,124.35,124.90,127.51,129.67,
+130.85,131.14,131.59,133.27,132.44,132.01,133.28,135.48,134.93,134.44,
+137.12,137.02,138.40,144.14,139.67,144.06,139.31,142.61,144.43,146.01,
+145.42,146.04,146.61,149.12,147.39,150.82,149.48,152.17,154.53,156.44,
+154.78,154.19,154.84,156.76,155.49,156.65,158.20,160.82,160.05,162.20,
+164.69,162.54,164.38,164.75,168.23,166.20,166.10,165.79,167.88,169.18,
+169.50,172.02,172.01,173.65,173.63,175.08,174.79,176.65,175.70,180.06,
+178.60,178.58,177.82,181.12,181.87,183.72,180.51,182.36,183.66,184.14,
+187.65,189.09,186.27,190.10,187.18,190.60,191.56,191.61,191.70,191.25,
+192.37,195.57,193.47,195.07,195.68,197.12,200.04,201.05,198.19,199.82,
+199.49,202.55,201.32,204.79,206.46,208.11,206.40,207.02,209.32,211.73,
+211.42,208.78,211.26,210.44,212.46,216.34,215.14,213.49,220.11,219.00,
+217.76,218.62,219.64,222.11,222.66,221.65,221.68,224.01,229.45,223.18,
+226.47,228.00,227.07,232.38,229.71,228.16,230.58,232.59,234.99,236.09,
+233.80,235.49,233.13,237.62,236.76,239.88,243.16,240.53,240.53,243.51,
+5.86,7.53,7.35,7.92,8.88,10.39,10.58,11.27,11.38,11.97,
+13.08,12.99,13.50,13.22,14.50,15.40,15.56,17.52,17.79,18.38,
+18.98,18.28,19.94,21.32,22.01,22.48,22.37,22.30,22.84,23.45,
+26.59,25.69,25.78,26.47,27.52,28.38,29.38,30.48,29.45,30.85,
+30.98,33.33,32.21,32.56,33.37,34.77,34.09,36.02,36.17,35.88,
+36.88,38.64,39.98,39.20,39.45,39.06,40.92,42.68,42.29,41.93,
+42.09,45.91,44.69,45.66,47.27,47.27,48.69,48.49,47.94,49.32,
+50.28,49.11,51.80,51.46,52.87,53.72,53.66,54.51,54.63,56.29,
+56.73,55.91,56.83,58.13,58.25,59.14,60.28,59.64,61.99,60.99,
+63.54,62.60,63.86,62.83,64.52,65.61,68.15,65.89,66.51,66.66,
+70.39,68.87,69.48,70.24,70.47,74.46,71.55,73.65,73.99,75.44,
+73.84,74.90,75.97,77.79,78.29,77.86,77.61,78.00,79.38,79.51,
+80.18,82.46,83.28,82.45,84.96,83.34,83.43,84.98,86.08,85.82,
+86.80,87.81,89.10,90.19,88.51,88.69,91.64,91.64,94.20,93.70,
+94.91,94.74,95.29,93.59,94.06,97.98,98.28,98.05,99.10,98.98,
+98.98,102.22,101.40,104.26,102.66,103.75,104.73,105.88,105.75,106.60,
+106.86,107.41,107.09,107.27,106.20,109.00,107.51,108.48,109.31,111.51,
+113.53,110.14,114.05,113.12,116.64,114.87,115.16,114.74,118.49,116.25,
+119.42,119.91,121.77,120.15,118.66,121.67,122.26,124.64,124.58,124.19,
+123.83,124.40,127.14,126.69,126.48,130.72,125.94,128.74,130.64,128.10,
+131.67,131.10,132.21,132.56,131.75,133.56,133.41,132.54,136.38,136.21,
+135.52,137.28,139.53,139.90,140.29,141.19,138.82,141.31,140.63,145.87,
+143.42,144.65,145.67,140.63,145.05,146.06,145.64,147.99,147.32,146.33,
+150.30,149.10,152.56,151.99,150.54,150.81,153.35,151.85,153.86,158.31,
+153.74,156.40,155.40,156.86,157.65,159.87,156.05,159.13,158.34,163.53,
+161.90,161.48,161.99,163.87,165.06,164.47,163.29,163.93,166.56,167.68,
+166.14,170.07,170.25,170.14,172.29,167.80,167.70,171.18,173.51,173.06,
+171.15,175.21,175.16,175.46,174.98,178.50,178.58,181.20,180.90,179.13,
+178.09,181.97,176.76,183.57,185.46,183.25,182.51,183.95,183.83,182.02,
+5.30,5.27,5.43,6.97,7.08,7.53,7.09,8.55,7.88,9.74,
+9.44,10.26,10.97,10.93,11.92,13.27,12.95,12.97,13.46,14.25,
+14.56,14.63,15.54,14.57,16.16,15.98,16.91,17.99,18.27,17.99,
+19.26,19.77,20.65,21.35,20.42,21.21,22.63,21.82,22.21,22.43,
+23.38,25.18,24.55,25.15,26.66,25.93,27.80,26.35,27.74,27.95,
+28.30,28.21,30.07,30.78,31.21,30.84,31.68,32.44,33.63,31.72,
+33.69,33.50,34.14,34.87,34.90,35.42,37.13,36.97,36.91,37.15,
+38.30,37.97,39.15,39.30,40.07,39.01,40.72,40.49,41.29,42.92,
+44.05,44.44,44.19,44.04,44.75,44.23,45.99,45.59,45.93,46.81,
+49.03,49.48,48.14,49.00,51.45,50.74,51.06,51.23,51.53,51.51,
+51.71,53.86,54.12,53.72,55.47,53.21,55.69,56.35,55.47,55.45,
+57.02,57.71,58.14,58.38,57.63,60.18,60.08,60.34,61.20,61.63,
+61.18,62.12,64.09,62.78,64.17,64.53,63.91,66.09,66.64,67.31,
+66.33,68.28,69.11,67.02,69.28,68.46,71.82,71.07,70.16,69.92,
+71.79,72.14,72.61,73.70,74.66,73.91,75.88,75.23,74.59,76.35,
+76.22,78.36,77.02,76.85,79.13,78.26,77.31,79.49,80.12,80.69,
+81.79,79.17,83.24,80.94,83.70,83.89,83.73,85.53,85.36,85.17,
+86.34,87.30,86.89,85.58,88.12,87.44,88.96,87.47,89.22,90.02,
+89.99,89.00,93.25,91.31,93.78,91.62,92.69,94.48,94.68,93.29,
+97.04,95.18,95.64,94.96,99.03,97.22,96.47,100.39,99.98,99.35,
+99.51,100.67,100.16,101.06,101.78,102.63,103.97,104.25,103.68,107.16,
+105.39,106.32,106.59,106.71,106.94,106.45,106.25,109.90,107.97,110.94,
+109.35,109.71,110.45,112.11,112.17,113.18,112.33,111.86,113.25,114.99,
+111.27,113.65,114.21,116.57,116.25,114.69,117.06,117.44,117.59,116.65,
+118.04,120.26,119.43,121.19,120.57,120.44,123.44,123.45,123.60,123.70,
+125.89,125.59,123.59,124.94,125.32,126.05,125.31,127.25,130.60,127.45,
+125.53,129.71,129.05,126.98,131.34,129.56,134.81,131.95,133.24,134.05,
+135.22,133.47,136.47,133.63,135.67,136.16,136.34,136.09,137.41,138.34,
+140.12,139.24,140.18,138.66,138.92,138.41,141.62,140.91,144.34,144.46,
+4.03,3.85,3.96,4.89,5.30,5.78,5.94,6.69,6.38,7.01,
+7.49,8.10,7.66,8.20,8.88,9.57,9.07,9.81,9.91,10.44,
+11.45,11.62,11.65,11.80,12.02,13.29,13.96,14.13,13.53,14.94,
+14.66,15.28,14.39,15.29,15.97,16.32,16.41,17.34,17.23,16.48,
+17.95,19.03,17.98,19.09,20.52,20.58,20.00,20.69,21.15,22.33,
+22.66,22.08,21.96,23.88,24.01,22.89,24.14,24.43,23.91,26.64,
+24.66,25.25,27.27,26.15,28.23,26.64,28.18,28.71,27.68,27.74,
+29.25,29.67,29.09,27.90,29.89,30.70,31.23,30.93,32.22,31.84,
+32.70,33.97,34.79,33.06,34.36,35.14,35.39,35.38,37.01,35.41,
+36.30,37.13,38.04,37.43,37.93,37.84,37.82,37.35,39.97,39.65,
+40.01,41.07,41.24,41.81,43.07,41.48,41.84,42.68,44.80,43.59,
+43.98,44.12,44.01,45.20,46.27,45.92,45.62,45.05,47.75,47.56,
+47.54,47.48,47.30,48.86,48.83,49.47,49.17,49.35,49.70,50.56,
+51.75,54.92,51.26,51.41,51.38,53.20,52.10,53.71,53.62,54.91,
+54.06,54.65,54.50,56.33,56.74,55.77,56.53,56.65,58.09,57.42,
+60.15,56.87,58.98,58.87,60.81,60.33,59.73,60.76,59.44,60.38,
+62.26,62.98,60.85,63.54,62.95,63.29,64.21,64.62,62.86,66.90,
+65.61,67.55,66.39,66.69,67.22,67.58,67.44,66.64,71.37,69.66,
+68.70,68.68,70.31,68.63,70.04,71.53,71.70,73.00,71.63,73.64,
+73.05,73.26,73.10,72.22,75.74,73.63,75.06,75.09,75.28,75.28,
+75.67,77.21,79.22,75.99,77.38,77.70,77.94,79.46,79.54,79.53,
+80.10,78.59,82.04,80.04,81.18,79.42,82.24,83.37,81.65,84.66,
+80.82,84.36,82.44,85.44,85.89,84.32,86.98,87.06,85.57,87.19,
+86.55,88.19,86.82,87.83,86.45,88.24,88.99,89.10,88.32,90.21,
+90.06,91.86,90.65,92.39,92.49,92.33,91.35,93.46,92.49,96.09,
+95.59,95.13,96.08,92.72,95.64,98.50,96.48,98.49,97.93,98.22,
+98.40,98.80,101.65,101.35,98.92,98.47,98.01,101.44,100.66,99.93,
+101.35,101.29,101.87,102.21,100.47,103.60,105.86,104.61,106.49,104.24,
+104.43,106.25,106.77,103.82,106.19,106.31,104.99,108.01,110.04,108.61,
+2.92,3.31,3.57,3.71,3.94,4.07,4.13,4.97,5.10,5.71,
+5.04,5.92,6.31,5.88,6.24,6.48,7.79,7.62,8.21,7.74,
+8.37,8.51,8.91,8.31,9.49,9.72,9.66,10.24,11.23,10.33,
+11.66,11.61,12.06,12.37,11.24,12.45,12.94,13.61,13.96,13.64,
+13.92,14.14,14.75,14.42,15.34,13.75,15.39,15.91,16.25,17.22,
+16.30,15.97,16.43,17.57,18.09,18.09,19.18,19.76,19.63,19.02,
+20.17,20.32,20.65,20.46,20.00,20.59,21.46,21.69,21.44,20.82,
+22.42,23.13,22.07,22.97,23.14,23.21,24.14,24.96,24.59,25.47,
+25.56,24.53,24.54,26.29,27.45,26.20,27.25,26.70,27.96,27.13,
+27.92,27.33,28.19,27.26,27.87,29.26,29.22,30.14,28.88,30.62,
+30.27,30.60,31.13,31.98,31.22,30.89,32.76,32.54,32.35,33.55,
+32.98,33.48,33.52,34.88,34.04,35.82,35.13,36.52,36.46,35.67,
+36.08,37.01,37.13,37.22,37.89,36.39,36.68,37.79,37.38,37.31,
+38.31,39.01,38.61,39.25,40.95,40.33,40.78,41.39,39.73,41.56,
+41.84,41.86,41.59,40.99,42.85,44.60,43.15,44.36,43.76,43.20,
+43.69,43.88,45.52,44.85,45.02,46.08,46.22,47.29,48.36,47.55,
+47.78,47.77,47.62,49.55,48.83,48.50,48.64,48.52,48.64,49.29,
+51.45,50.76,50.48,52.06,50.36,53.22,52.32,52.39,51.55,52.73,
+51.75,52.65,54.49,54.92,54.76,54.61,55.02,55.52,54.99,56.85,
+55.22,56.97,55.12,55.42,57.45,56.13,58.36,57.71,55.94,56.98,
+58.10,59.20,58.41,58.87,60.26,59.42,59.22,60.75,60.27,60.05,
+59.83,60.72,63.60,60.02,65.11,63.25,61.94,64.20,62.77,63.22,
+63.29,63.47,63.57,63.94,66.09,64.03,64.58,66.30,67.33,66.35,
+66.90,66.89,68.57,67.93,69.67,68.01,64.29,69.47,69.29,68.33,
+71.53,67.56,69.53,70.78,69.74,70.64,69.76,73.19,71.54,71.41,
+72.62,72.75,71.91,74.25,74.56,73.42,76.70,75.77,74.71,74.58,
+77.10,73.06,74.46,74.47,76.86,76.16,75.02,77.09,76.70,76.67,
+74.13,77.75,78.11,79.82,78.07,78.25,77.84,80.32,80.77,81.07,
+81.12,79.56,81.28,81.79,79.81,82.83,82.73,81.94,84.20,84.13,
+2.36,2.16,2.75,3.08,3.11,3.44,3.24,3.23,4.49,4.17,
+4.72,4.16,5.04,4.91,5.00,5.73,5.06,5.39,5.79,6.00,
+6.24,5.76,6.66,6.51,6.71,7.80,7.53,7.37,8.43,7.87,
+8.05,9.42,8.86,8.67,9.29,9.73,10.01,9.36,10.02,10.26,
+9.97,10.65,9.97,10.86,11.66,10.74,12.45,11.82,11.98,12.04,
+12.45,13.08,13.08,13.21,13.49,12.96,14.23,14.32,14.46,14.98,
+14.72,15.91,15.76,15.08,16.21,15.14,16.81,16.45,17.23,16.03,
+17.25,16.58,18.34,18.10,18.00,17.45,18.57,17.26,19.10,17.68,
+18.91,18.41,19.02,20.96,19.70,19.28,19.90,20.05,21.56,21.32,
+20.89,21.45,21.48,22.59,21.55,21.24,21.53,21.82,22.60,22.76,
+23.22,23.75,24.46,23.65,23.68,24.57,24.22,23.89,24.28,24.48,
+25.07,25.62,25.98,26.42,26.43,25.29,26.17,26.19,27.00,27.71,
+27.92,26.48,29.16,26.99,27.32,29.17,28.13,29.01,28.51,28.66,
+29.61,28.21,30.16,30.99,29.52,30.40,30.42,29.91,30.36,30.03,
+31.44,30.84,31.32,34.17,31.97,32.84,32.52,31.80,31.92,33.38,
+33.45,34.27,34.76,33.90,35.24,34.87,34.34,36.34,34.79,35.95,
+36.05,35.80,37.04,36.13,36.23,38.68,38.52,37.04,36.13,37.66,
+37.43,36.99,39.07,38.81,38.37,39.11,38.67,39.65,40.06,40.08,
+38.91,39.71,39.12,39.84,41.01,40.01,43.11,44.15,40.99,41.48,
+40.36,43.42,42.02,43.02,42.49,43.03,43.06,44.55,42.02,44.94,
+44.51,43.57,44.28,45.14,45.44,46.27,45.34,47.07,46.18,45.41,
+46.30,46.15,46.48,48.11,45.66,47.06,48.53,47.31,47.66,48.37,
+50.34,50.15,48.97,50.37,48.24,50.23,49.01,48.42,49.18,51.01,
+51.71,49.19,51.55,51.20,49.78,52.76,52.12,51.12,53.71,52.84,
+52.93,52.00,55.17,53.49,52.79,52.63,53.18,54.19,55.58,55.47,
+55.40,55.88,55.36,56.64,55.37,53.25,57.01,55.65,57.05,55.71,
+57.92,56.82,57.15,59.33,59.60,55.96,57.98,57.97,58.82,58.19,
+61.10,59.34,60.27,59.22,59.09,60.17,60.59,60.31,60.79,61.06,
+60.20,62.97,62.12,62.17,63.25,63.36,62.67,62.48,62.19,62.31,
+1.71,1.75,1.67,1.84,2.67,2.01,2.82,2.42,2.84,3.48,
+3.23,3.27,3.34,3.40,3.97,3.89,4.09,4.10,4.59,4.30,
+4.89,4.87,5.24,5.51,5.60,5.68,5.49,6.14,5.99,6.70,
+6.46,6.26,6.65,7.20,6.75,7.31,7.38,7.38,7.17,7.77,
+8.08,8.55,7.83,8.30,8.22,9.34,9.20,9.34,8.71,9.06,
+9.87,9.94,8.77,9.96,10.34,10.34,10.74,10.54,10.28,11.37,
+11.71,11.91,10.46,12.23,11.11,10.79,11.59,11.99,12.65,12.81,
+12.92,12.63,13.34,12.96,13.75,13.19,13.63,13.64,14.00,14.00,
+13.85,14.20,14.93,13.93,14.31,15.21,16.12,16.13,15.05,16.22,
+15.42,15.97,15.68,17.24,15.54,15.95,17.27,17.64,18.83,18.48,
+16.99,17.07,17.56,17.09,18.80,17.54,19.27,18.38,18.14,17.66,
+18.93,17.36,19.00,18.61,20.23,19.41,19.98,20.60,19.38,20.86,
+19.98,20.30,21.00,20.29,20.65,21.52,21.92,21.21,21.68,23.01,
+22.27,21.86,22.98,22.05,22.86,22.28,22.60,22.55,23.38,23.42,
+23.62,23.30,23.95,23.58,25.53,25.21,24.70,24.22,25.38,24.78,
+27.86,24.71,25.04,26.16,26.27,27.18,25.83,25.50,28.06,26.94,
+26.91,27.83,26.07,27.21,27.13,28.12,27.75,27.49,29.42,28.32,
+28.80,28.21,29.06,30.75,28.28,28.89,28.54,30.09,28.88,30.24,
+30.72,31.07,30.09,30.77,30.42,31.73,31.27,31.37,32.58,32.53,
+32.19,32.72,32.60,31.60,31.95,32.44,33.75,32.21,33.00,31.72,
+34.16,33.74,34.59,33.24,33.93,33.65,34.39,33.99,34.98,34.47,
+34.45,34.48,33.92,36.46,35.25,35.75,35.45,38.30,36.00,35.77,
+36.08,36.06,36.30,37.80,36.77,38.95,37.65,36.51,39.75,38.66,
+36.24,38.56,39.06,38.78,39.47,39.29,38.00,40.03,40.24,40.06,
+41.18,39.44,41.74,40.43,39.80,40.66,41.18,40.94,41.26,42.36,
+42.05,40.44,40.91,41.17,43.18,41.37,42.99,41.58,42.73,42.79,
+43.26,45.14,43.39,44.28,43.69,43.04,45.45,43.02,44.30,44.71,
+44.30,44.76,44.93,45.52,45.31,43.43,47.08,45.33,42.98,43.39,
+44.21,47.20,46.51,45.69,45.88,45.85,47.48,48.02,47.19,46.87,
+1.25,1.46,1.49,1.94,1.46,1.92,1.67,2.08,2.48,2.47,
+2.30,2.73,2.77,2.13,3.00,3.36,3.31,3.52,2.94,3.57,
+3.56,3.90,3.98,3.98,4.43,4.47,4.00,4.56,4.54,4.81,
+4.80,4.67,4.83,5.28,5.23,6.00,5.29,5.92,5.58,6.14,
+5.23,6.21,6.25,6.66,6.60,6.97,6.26,6.48,7.12,7.70,
+7.45,6.99,8.29,7.99,7.65,7.96,8.19,7.82,8.46,8.06,
+8.46,9.31,8.08,8.61,8.74,9.10,9.39,8.54,9.35,9.56,
+8.73,10.23,9.31,9.66,10.37,11.11,9.49,10.48,10.85,10.83,
+10.88,11.09,10.68,11.34,12.43,10.92,12.14,11.99,12.72,12.31,
+12.59,11.83,12.23,11.69,13.08,13.02,13.10,12.57,13.55,13.59,
+12.87,13.71,13.98,13.87,14.75,13.60,13.46,13.42,14.44,13.88,
+14.06,14.22,14.26,15.34,15.34,14.88,15.86,15.45,14.72,16.10,
+14.88,15.70,15.62,15.54,16.27,16.49,15.88,16.52,17.05,17.55,
+16.81,17.21,17.11,17.03,17.85,17.93,17.13,18.82,17.15,17.64,
+17.17,18.29,17.23,17.89,17.73,18.68,18.73,18.30,17.81,19.72,
+19.71,19.41,20.28,19.62,19.82,19.05,20.48,18.76,20.83,20.70,
+20.05,21.39,20.61,20.44,20.46,22.60,20.12,21.90,21.95,21.46,
+22.16,22.18,21.83,22.60,21.75,21.55,22.14,22.19,21.88,24.74,
+22.97,23.10,23.09,24.32,24.30,23.17,22.99,24.43,22.97,24.05,
+24.73,23.02,24.49,23.70,24.54,24.00,25.26,25.21,24.38,25.60,
+25.92,25.87,25.52,25.66,26.61,25.13,27.19,26.49,26.29,27.34,
+27.21,25.67,27.55,27.88,24.56,26.66,26.14,27.60,26.59,26.83,
+28.33,28.47,27.96,26.81,29.16,29.12,28.44,29.35,28.05,29.45,
+30.42,29.19,29.83,29.86,28.95,29.67,28.92,29.52,28.52,30.68,
+30.49,30.28,30.64,30.03,31.66,28.98,30.96,30.63,29.95,31.82,
+30.64,31.57,31.50,32.58,33.33,33.44,32.65,31.05,33.32,32.62,
+33.30,31.57,31.36,34.18,33.22,31.41,33.74,32.20,34.67,32.91,
+34.34,35.35,33.31,33.93,34.89,33.24,33.92,33.34,33.99,33.92,
+35.13,36.05,35.70,34.42,36.06,35.83,35.04,36.30,35.97,36.54,
+1.06,0.93,1.10,1.29,1.29,1.49,1.42,1.36,1.86,1.43,
+1.93,2.16,1.68,2.15,2.45,2.04,2.31,2.57,2.44,2.47,
+2.80,2.58,2.90,2.60,3.50,3.32,3.14,3.12,3.42,3.68,
+3.96,3.53,3.78,3.66,5.07,4.22,4.32,3.86,4.32,4.67,
+4.82,4.82,4.81,4.76,5.08,4.24,5.63,4.77,5.29,5.42,
+5.96,5.73,5.24,6.00,5.71,6.29,6.05,5.88,5.85,5.90,
+5.98,6.15,6.44,6.81,6.84,6.67,6.58,6.91,6.88,6.94,
+6.68,6.72,7.51,7.70,7.50,6.83,7.68,7.63,8.41,7.61,
+7.95,8.29,8.48,7.88,9.08,8.14,8.45,8.69,9.20,8.14,
+8.04,8.69,8.87,9.19,9.43,9.61,9.71,10.21,9.91,10.16,
+10.04,9.86,10.07,10.79,9.75,10.82,10.47,10.70,10.93,11.51,
+11.37,11.62,11.49,11.47,11.33,11.01,11.36,12.46,11.05,11.75,
+12.43,11.48,12.53,12.75,12.25,11.16,12.30,12.87,12.54,12.94,
+11.98,12.57,13.27,12.92,13.55,13.33,12.79,13.72,14.18,14.16,
+13.71,12.60,14.26,13.70,13.54,13.16,14.75,15.09,15.81,13.82,
+13.54,15.03,13.76,14.88,14.90,14.14,15.32,15.04,16.66,15.17,
+15.67,14.93,14.41,15.90,15.83,15.90,15.43,15.86,16.68,16.46,
+16.47,16.95,16.60,16.62,17.23,16.82,17.13,16.33,17.42,17.46,
+17.27,17.11,16.83,17.59,18.64,17.85,18.75,17.28,17.50,18.30,
+17.60,18.67,18.43,18.09,19.29,18.84,17.81,18.23,20.06,18.59,
+18.33,18.18,19.64,18.83,18.75,19.92,19.62,19.57,18.23,19.83,
+20.42,20.18,19.81,20.69,19.31,20.90,20.04,19.93,20.52,21.56,
+20.31,21.18,20.51,20.42,20.56,22.58,21.81,21.07,20.77,22.41,
+21.96,21.06,21.10,21.06,22.37,21.75,22.52,22.31,22.70,23.85,
+22.25,23.50,22.15,22.53,22.67,23.20,23.71,24.09,22.40,22.46,
+23.27,22.63,22.75,23.93,24.62,22.69,23.46,24.27,25.90,25.32,
+23.80,25.45,24.52,25.03,25.89,24.61,24.08,26.04,24.57,24.21,
+25.71,25.92,26.25,24.63,24.94,25.80,26.43,25.94,26.16,26.46,
+26.24,25.72,27.81,26.69,26.70,27.90,27.69,26.41,25.03,26.45,
+0.51,0.39,0.62,0.81,1.13,1.40,1.07,1.21,1.16,1.55,
+1.04,1.41,1.48,1.49,1.71,1.87,1.98,1.62,1.54,1.67,
+2.10,2.10,2.13,2.39,2.32,2.28,2.47,2.44,2.71,2.90,
+2.62,2.47,3.02,2.67,3.19,2.38,3.14,3.19,2.92,2.94,
+3.66,3.68,3.73,3.32,3.76,3.59,3.64,3.69,3.85,4.29,
+4.08,4.00,3.94,4.46,3.78,4.44,4.38,4.22,4.71,4.62,
+4.99,4.52,5.10,4.87,5.55,4.96,4.86,4.63,4.76,5.44,
+5.44,4.81,6.33,6.09,5.58,5.74,5.65,6.70,6.36,5.63,
+6.38,6.47,6.53,6.45,6.59,6.59,6.39,6.05,6.72,6.74,
+7.31,7.08,6.73,6.89,7.35,6.88,7.91,7.76,7.28,7.14,
+7.11,7.26,7.50,7.17,8.63,7.27,8.74,8.36,8.01,8.71,
+8.14,8.33,9.26,8.56,9.27,8.38,9.48,8.67,9.27,9.28,
+8.68,8.19,9.70,8.69,8.71,9.89,9.79,9.38,8.79,9.41,
+9.52,10.08,9.65,9.68,9.36,10.10,8.49,9.83,10.05,10.09,
+10.77,9.78,9.66,10.46,10.66,10.82,10.36,10.56,9.85,10.85,
+11.84,10.40,10.45,11.37,10.94,11.45,9.98,11.77,11.77,10.83,
+11.52,11.98,12.07,11.94,12.46,11.95,12.10,11.69,11.41,12.75,
+12.40,13.36,12.81,11.68,12.80,12.46,12.31,11.72,13.26,12.75,
+13.07,12.40,12.97,12.70,13.50,13.60,12.69,14.03,12.82,13.77,
+13.69,13.52,14.75,14.04,13.75,14.69,14.46,14.64,15.62,14.18,
+14.05,14.80,14.34,14.94,14.74,15.22,15.18,15.41,15.61,14.30,
+14.81,15.09,14.72,15.57,14.83,14.27,15.90,15.15,14.91,14.73,
+14.75,15.48,15.55,15.37,15.93,16.78,16.32,16.73,16.71,16.08,
+17.49,16.52,17.70,16.85,16.15,17.04,17.32,16.38,15.99,16.11,
+17.91,17.29,16.49,17.21,17.18,18.10,17.03,17.57,17.03,17.92,
+16.16,19.24,17.79,18.54,18.32,17.97,18.50,17.67,17.20,17.86,
+19.77,18.06,17.68,18.68,18.71,18.55,18.58,19.23,19.33,18.73,
+19.01,18.76,19.04,19.78,18.82,20.50,19.69,20.97,21.11,20.06,
+20.79,20.00,19.90,20.42,19.29,19.76,18.55,20.17,21.57,21.11,
+0.64,0.54,0.73,0.62,0.72,0.99,0.94,1.03,1.11,0.86,
+1.06,1.11,0.85,1.25,0.98,1.36,1.06,1.48,1.25,1.72,
+1.83,1.42,1.76,2.12,1.81,1.89,2.09,1.94,2.52,1.82,
+2.18,2.27,2.06,2.23,2.38,2.73,2.53,2.84,2.34,2.52,
+2.50,2.61,2.98,2.84,2.30,3.08,2.74,2.65,2.88,2.91,
+2.77,3.10,2.90,3.48,3.08,3.72,3.65,4.06,3.94,3.09,
+3.24,3.77,3.58,3.99,3.75,4.32,4.12,3.69,4.97,4.04,
+3.75,3.99,4.31,4.42,3.87,4.06,4.16,4.47,4.65,4.70,
+4.51,4.70,4.34,3.89,4.89,5.05,4.32,4.41,5.16,5.54,
+5.13,5.14,4.82,5.58,5.57,5.06,5.90,5.64,4.20,5.27,
+5.17,5.87,5.88,5.78,5.56,6.37,5.86,5.78,5.98,5.99,
+6.13,6.05,6.29,5.94,6.21,5.77,6.42,6.64,6.49,6.93,
+6.16,5.96,6.83,7.57,7.24,6.80,6.57,7.90,7.84,7.64,
+6.94,7.20,7.03,7.12,7.42,7.96,8.29,7.37,8.01,7.60,
+7.73,7.85,7.72,7.45,8.09,7.57,7.01,8.25,7.83,8.08,
+8.12,7.94,8.24,7.86,8.57,8.48,9.15,8.42,8.54,8.85,
+8.22,8.24,9.47,9.17,9.15,8.96,8.92,8.85,8.64,9.00,
+9.26,9.71,9.40,9.71,9.40,9.94,9.63,9.70,9.85,9.54,
+8.71,10.06,9.06,10.83,10.10,10.12,11.13,9.32,9.42,9.69,
+11.55,10.92,10.98,10.45,11.19,10.59,10.92,9.30,10.13,9.68,
+11.80,10.33,10.73,10.85,11.50,10.80,11.35,11.50,10.73,11.82,
+10.83,12.23,11.20,11.51,11.94,11.68,11.76,12.30,11.81,12.31,
+11.97,12.18,11.96,12.02,11.75,12.10,12.82,12.52,11.91,12.11,
+11.12,12.72,12.29,11.72,12.27,12.14,12.10,13.65,12.18,12.73,
+13.18,12.74,11.95,13.07,13.49,13.08,13.97,13.23,13.60,13.28,
+13.09,12.76,13.66,13.36,12.14,13.08,13.75,12.97,12.83,14.18,
+13.48,13.81,15.05,14.01,14.57,14.26,14.47,13.77,13.06,14.42,
+14.51,14.24,14.59,15.12,14.56,14.96,14.28,15.00,13.87,14.16,
+14.62,14.46,15.84,14.23,15.68,15.75,14.98,15.01,16.52,15.42,
+0.23,0.37,0.41,0.48,0.51,0.74,0.43,0.37,1.08,0.80,
+0.69,1.04,0.66,0.97,0.81,0.93,1.28,1.16,0.89,1.09,
+1.07,1.29,1.17,1.55,1.46,1.05,1.59,1.34,1.51,1.47,
+1.36,1.62,1.85,1.95,1.65,1.65,1.78,1.98,1.81,1.28,
+2.01,2.26,2.06,1.90,2.00,1.84,2.01,1.99,1.98,2.01,
+2.50,2.68,2.21,1.85,2.51,2.26,2.70,2.44,2.85,3.05,
+2.59,2.53,3.02,2.48,2.79,3.11,2.83,3.27,2.74,3.27,
+3.06,3.34,3.08,3.51,3.39,3.50,3.08,3.64,3.68,3.69,
+4.40,3.56,2.94,3.99,3.39,4.15,3.90,3.65,3.80,3.54,
+3.87,4.03,4.08,3.73,3.86,3.98,4.04,4.41,4.49,4.15,
+3.81,4.26,4.73,3.89,4.04,4.22,4.35,4.58,4.78,5.07,
+4.87,4.84,4.36,4.68,5.54,5.12,4.45,4.28,4.72,5.55,
+5.34,4.68,5.52,5.72,4.94,5.22,5.32,5.24,5.22,5.57,
+5.26,6.08,5.46,5.73,5.86,5.87,5.60,5.96,6.36,5.41,
+5.61,5.94,6.17,6.46,5.65,6.10,5.75,6.62,5.80,5.86,
+5.80,6.06,6.07,6.74,6.04,5.85,7.32,6.96,5.62,6.78,
+6.14,6.92,7.11,6.97,6.73,7.04,6.60,6.84,6.74,6.52,
+6.42,7.19,7.06,6.98,6.75,7.02,7.16,6.72,7.97,6.71,
+6.87,7.34,7.37,7.05,6.94,7.59,7.49,7.76,7.01,8.51,
+7.69,6.35,7.96,7.88,7.28,8.75,8.70,7.76,7.70,7.38,
+8.06,7.95,7.78,8.03,7.96,8.58,7.80,8.80,8.30,8.30,
+8.27,8.09,8.28,9.26,9.09,9.09,8.90,9.03,8.82,9.29,
+8.69,8.72,9.69,8.97,8.41,9.46,9.61,9.59,9.62,9.35,
+9.36,8.45,9.88,9.44,9.11,9.36,9.71,9.32,9.24,9.33,
+9.79,9.96,9.52,10.12,9.87,9.84,8.98,10.22,8.91,9.98,
+9.65,9.81,10.15,9.83,11.09,8.98,10.22,10.86,9.86,10.30,
+10.78,9.98,10.00,11.15,9.71,10.43,10.79,10.51,10.16,10.64,
+10.78,10.72,11.20,11.03,11.72,10.84,10.71,9.66,10.93,11.79,
+10.78,10.15,11.55,11.10,11.98,11.26,11.17,11.01,11.39,11.19,
+0.22,0.41,0.35,0.43,0.32,0.23,0.54,0.54,0.50,0.42,
+0.56,0.44,0.70,0.55,0.60,0.56,0.75,0.63,0.59,0.81,
+0.87,0.99,1.11,1.22,1.00,1.07,1.17,0.97,1.01,1.60,
+1.19,1.14,0.98,1.38,1.33,1.06,1.25,1.25,1.42,1.38,
+1.18,2.07,1.47,1.75,1.56,1.36,1.39,1.65,1.77,1.77,
+1.86,1.71,1.89,1.70,2.13,1.97,1.51,1.82,2.25,2.19,
+1.61,2.20,1.95,1.79,2.51,2.37,2.35,2.85,2.41,2.08,
+2.04,2.33,2.22,2.38,2.47,2.33,2.31,2.68,2.33,2.17,
+3.04,2.66,2.21,2.89,2.81,3.40,2.48,2.36,2.98,2.78,
+2.79,2.90,2.64,2.78,2.70,2.39,3.33,2.80,2.92,3.06,
+3.53,3.08,2.85,3.05,3.29,3.22,3.35,3.28,3.49,3.74,
+3.42,3.69,3.51,3.57,3.47,3.28,3.51,3.55,3.37,4.11,
+3.84,3.40,3.76,4.10,4.00,3.83,3.85,3.61,4.08,4.03,
+3.86,3.99,4.01,4.15,3.88,4.05,3.59,4.51,4.76,4.23,
+4.70,4.45,4.58,3.83,4.97,4.21,4.57,4.49,4.79,5.63,
+4.49,4.56,4.35,4.84,6.03,4.52,4.68,5.06,4.33,5.24,
+4.75,4.32,4.89,5.38,4.74,5.07,5.84,4.68,4.93,5.08,
+5.37,5.63,5.84,5.18,5.17,4.68,6.14,5.26,5.35,4.87,
+5.15,5.27,5.46,5.71,5.51,6.20,5.11,5.80,5.80,6.22,
+5.45,5.32,5.41,6.90,5.94,5.86,5.70,5.94,6.04,5.57,
+6.47,6.26,6.55,6.45,6.36,6.19,6.50,6.54,5.93,5.79,
+6.17,6.40,6.26,7.40,5.89,6.26,5.44,6.71,6.79,6.38,
+6.66,6.00,6.71,6.72,6.02,6.18,7.28,7.64,6.63,7.56,
+6.92,6.63,6.92,7.39,7.18,8.14,6.33,6.50,6.67,7.55,
+7.28,7.25,6.78,7.68,7.55,8.13,7.52,6.85,7.69,6.75,
+7.02,6.87,7.51,7.25,7.25,7.59,7.94,8.45,7.79,7.98,
+9.04,7.35,8.17,7.47,8.24,7.83,7.99,8.43,8.03,8.25,
+9.29,7.45,8.16,8.12,9.39,8.27,8.62,8.16,9.24,8.43,
+8.06,8.59,9.58,8.34,8.63,8.31,8.10,8.05,8.25,8.12,
+15.36,17.26,19.96,20.14,22.66,23.99,25.63,26.07,28.57,29.33,
+31.91,32.10,33.46,36.21,36.76,38.68,39.89,41.55,42.67,43.93,
+45.94,48.20,48.79,50.83,51.11,53.04,54.92,58.08,58.54,59.56,
+61.01,62.16,62.50,66.39,68.18,70.53,70.84,72.15,73.83,73.70,
+76.89,77.21,79.18,81.39,82.50,85.01,86.36,86.91,88.68,89.88,
+92.38,93.34,95.04,97.68,96.36,100.95,101.07,102.89,103.54,105.48,
+107.31,107.65,109.62,109.54,113.97,114.67,114.67,118.39,119.67,121.59,
+124.22,124.06,125.01,127.47,128.27,128.92,131.69,131.60,137.57,137.53,
+137.06,140.39,141.50,141.05,142.27,143.74,147.94,148.69,150.04,154.22,
+152.65,154.39,156.11,158.87,159.79,161.10,161.81,163.96,163.96,167.48,
+167.95,170.12,171.70,172.35,172.61,175.79,176.41,176.74,180.25,179.86,
+183.35,184.06,188.86,185.79,188.85,190.74,191.94,194.45,195.41,196.66,
+197.58,200.73,199.62,201.25,206.09,205.18,209.12,210.64,209.54,211.91,
+213.00,217.04,216.51,217.77,221.88,220.12,224.07,223.81,227.61,226.36,
+225.90,230.94,230.08,235.89,234.72,236.51,238.25,240.44,241.26,245.04,
+241.74,242.22,247.81,249.16,248.51,251.59,253.65,257.00,255.81,259.27,
+258.84,260.70,262.66,265.62,266.59,269.56,266.34,268.60,273.12,274.29,
+273.93,279.33,279.58,279.42,282.54,280.73,283.26,285.61,287.38,286.99,
+290.20,291.60,291.93,297.33,295.62,294.82,301.48,303.25,303.49,302.81,
+306.22,307.19,308.29,310.23,312.73,313.92,317.65,317.54,315.80,318.98,
+322.28,321.15,323.69,326.25,324.67,327.79,331.37,330.56,332.38,334.07,
+337.00,336.05,338.58,338.67,345.51,342.51,346.46,346.68,346.56,349.76,
+350.24,354.42,351.43,356.17,357.30,363.60,362.50,360.38,361.77,363.44,
+364.20,367.72,371.17,374.17,374.45,376.14,374.66,376.40,378.90,376.58,
+383.93,380.38,383.14,385.90,387.43,387.20,387.41,394.12,392.47,398.12,
+398.97,401.15,398.36,404.31,407.86,406.28,408.68,407.51,411.57,410.80,
+412.74,412.28,411.80,417.74,418.88,417.79,422.12,428.87,424.97,423.60,
+425.98,429.85,430.63,431.24,436.21,433.15,433.87,433.69,437.41,443.11,
+443.85,446.04,443.06,446.17,449.81,450.87,451.56,450.52,453.77,457.74,
+12.08,13.59,14.90,15.90,17.46,18.92,19.25,20.69,22.31,22.42,
+24.47,26.40,26.66,27.66,29.37,30.40,30.61,32.58,35.05,34.90,
+35.62,37.23,37.25,39.33,42.15,41.06,42.73,45.87,45.54,48.47,
+46.98,49.63,51.34,51.94,52.66,53.39,55.91,58.68,57.76,60.08,
+60.97,62.66,62.29,63.61,64.97,66.62,66.55,68.64,70.67,71.28,
+71.76,74.84,73.97,77.74,78.10,79.25,79.42,81.36,81.72,81.96,
+85.06,86.81,86.85,87.07,90.31,90.83,90.72,93.31,94.02,93.39,
+97.04,98.87,97.78,98.34,100.56,100.51,104.81,105.26,106.27,106.81,
+109.28,109.42,111.00,112.83,112.86,115.99,115.02,118.71,118.79,119.31,
+120.47,120.68,124.37,123.77,125.23,126.63,126.72,129.49,129.87,132.27,
+132.19,135.03,136.77,135.17,135.99,138.32,140.82,138.75,143.02,144.27,
+145.60,144.21,148.04,148.05,147.83,149.61,152.35,152.18,152.56,157.49,
+157.41,155.98,157.80,160.40,162.45,164.18,163.33,164.05,166.32,167.26,
+168.40,171.09,169.57,171.73,176.10,172.12,176.61,173.19,177.18,178.16,
+179.72,181.46,180.23,182.61,186.37,186.66,188.65,188.53,190.21,190.22,
+193.99,191.86,198.29,196.59,197.78,197.09,202.01,202.23,204.08,203.98,
+203.81,203.65,207.69,208.90,211.23,207.08,211.56,214.44,213.27,213.34,
+213.57,216.74,218.01,218.00,220.35,222.85,224.83,222.51,226.71,228.43,
+228.54,231.73,233.99,230.76,235.26,238.28,233.45,239.16,237.78,242.43,
+242.62,243.29,245.27,242.53,248.25,245.86,245.86,248.42,252.16,251.21,
+254.53,253.22,255.35,257.72,260.21,259.54,262.54,261.82,259.22,264.67,
+266.22,268.12,266.19,265.77,270.84,271.07,272.20,273.04,275.93,272.51,
+280.89,278.75,277.65,278.58,280.16,281.12,282.99,286.13,285.56,289.37,
+289.90,292.87,292.37,291.54,292.20,295.20,297.47,298.95,295.95,297.22,
+299.98,304.28,304.95,304.34,302.08,306.25,308.16,305.80,312.64,308.40,
+314.69,313.77,315.36,315.53,317.80,319.42,323.02,322.67,321.17,321.03,
+321.52,326.41,324.02,328.40,324.65,331.12,330.99,335.81,332.33,337.01,
+339.37,339.30,339.38,344.38,337.13,340.49,340.94,344.07,343.83,343.48,
+347.51,350.16,350.85,353.79,354.19,350.60,357.72,353.92,358.18,359.16,
+10.05,11.23,11.11,12.06,13.76,14.46,15.48,15.58,17.41,18.10,
+18.98,20.42,21.10,21.30,21.94,23.47,24.20,25.03,27.22,26.44,
+29.20,30.11,30.62,31.07,33.05,34.15,35.99,34.27,35.49,36.45,
+38.10,39.15,40.16,40.61,41.75,42.97,43.16,44.58,46.31,46.22,
+46.54,47.59,48.28,48.92,52.15,51.86,52.56,54.49,53.44,54.95,
+59.65,58.19,58.89,59.14,59.96,61.13,62.44,63.44,63.98,65.08,
+67.75,67.09,67.66,68.22,70.78,70.30,70.57,72.03,73.70,74.96,
+75.98,75.68,75.60,76.14,79.73,82.45,80.98,82.74,81.11,84.57,
+83.75,84.64,87.67,88.91,89.47,89.05,90.80,92.05,94.33,93.92,
+95.77,95.29,96.14,98.63,97.58,100.32,99.21,100.17,102.95,103.69,
+102.92,104.60,105.87,105.61,107.69,110.83,110.21,110.23,110.86,113.81,
+112.56,115.15,113.87,117.97,118.39,118.02,119.61,120.78,117.14,120.59,
+122.40,122.78,123.52,126.33,126.97,125.77,127.22,129.27,131.77,131.94,
+132.18,130.23,133.28,134.24,134.18,138.00,138.51,139.44,139.66,137.53,
+142.71,140.83,144.31,145.35,144.06,146.41,146.07,146.48,147.54,150.48,
+152.49,150.93,152.23,154.24,152.36,154.03,157.07,157.51,158.27,158.87,
+158.92,160.72,159.72,162.19,163.87,164.80,163.84,169.81,166.88,168.46,
+169.36,168.31,176.56,172.61,170.14,175.20,175.08,176.45,178.06,178.55,
+179.28,178.88,183.73,182.07,184.53,186.48,183.12,186.23,183.77,185.56,
+188.56,189.98,187.84,193.38,192.94,196.41,195.74,193.70,196.96,195.50,
+195.00,202.29,198.91,199.77,201.14,202.28,203.10,203.36,205.08,203.50,
+207.17,207.31,209.25,212.35,209.30,212.09,215.47,212.68,212.56,215.31,
+217.03,214.56,219.21,218.42,219.64,222.96,225.08,224.67,223.41,225.66,
+227.30,227.42,229.51,225.78,231.22,231.33,231.18,229.90,227.71,231.11,
+235.02,233.33,237.13,236.66,238.50,242.07,243.14,240.09,243.81,245.66,
+243.50,244.35,246.84,247.24,250.62,250.55,248.43,251.05,254.33,253.11,
+254.80,253.97,256.99,260.40,261.89,260.25,261.29,261.13,261.24,265.60,
+264.33,262.05,265.68,267.35,268.73,268.54,270.48,267.83,266.16,272.19,
+270.00,274.95,274.97,278.21,274.01,275.53,278.45,279.96,278.80,279.13,
+7.02,8.47,8.91,9.40,10.65,10.34,12.12,13.22,13.88,14.37,
+15.48,15.96,16.19,17.77,18.25,17.26,19.76,20.39,20.72,21.50,
+22.99,22.81,23.47,24.23,24.92,25.32,26.23,28.11,27.21,29.27,
+29.35,29.39,30.46,31.91,31.92,33.95,33.77,35.40,36.17,35.51,
+37.24,37.42,38.99,40.13,38.47,41.38,41.49,41.76,42.13,43.70,
+45.49,44.35,47.57,46.13,47.78,46.98,47.10,49.46,48.85,49.29,
+51.97,52.27,51.10,53.91,54.01,55.55,57.12,56.95,56.73,58.76,
+58.77,60.11,62.84,61.22,63.06,63.62,62.68,65.75,64.48,65.27,
+66.84,65.86,67.83,68.82,70.17,69.85,71.47,71.66,71.92,74.42,
+75.98,73.35,73.46,74.62,77.87,77.50,77.36,79.59,77.45,78.73,
+80.13,80.45,81.81,84.06,83.10,85.14,85.61,87.09,87.67,88.41,
+89.04,89.75,90.89,90.62,89.70,90.36,95.05,93.19,93.00,93.09,
+96.15,98.50,96.75,96.14,100.41,102.03,99.52,100.33,102.84,102.88,
+102.57,104.27,105.61,103.61,107.15,107.31,106.61,108.33,108.15,108.17,
+108.16,111.59,112.42,111.98,114.60,115.16,114.42,114.33,117.27,116.01,
+120.04,120.32,119.59,119.73,121.73,120.59,122.80,123.38,124.61,123.30,
+126.09,123.37,125.97,127.99,128.38,127.16,131.32,129.69,129.00,130.47,
+133.22,133.58,132.28,136.02,136.74,138.14,137.58,135.60,139.38,141.74,
+142.14,140.37,141.90,142.09,141.88,143.13,144.53,147.67,146.91,145.52,
+145.92,148.24,147.90,150.15,150.50,152.68,153.30,152.44,150.61,154.75,
+152.81,155.47,156.30,156.53,159.30,159.53,163.68,158.42,160.44,161.06,
+161.46,159.66,163.24,162.34,165.26,165.69,164.12,166.70,169.86,168.25,
+165.91,168.85,168.28,170.52,174.08,170.01,175.56,176.51,174.31,177.22,
+176.68,176.74,180.26,178.36,178.50,177.52,182.54,180.75,184.33,184.34,
+184.97,185.71,185.15,187.96,184.77,187.03,185.36,189.72,190.03,191.53,
+192.19,193.20,191.94,191.28,196.74,196.69,194.59,195.79,197.15,199.35,
+198.35,196.43,201.31,201.49,203.43,201.09,204.55,203.21,206.49,203.36,
+202.70,209.94,208.56,205.80,209.34,213.14,211.48,208.32,210.08,217.13,
+211.47,212.63,211.71,216.62,217.10,214.68,218.70,218.17,218.25,220.51,
+5.74,6.36,6.98,7.22,8.64,9.14,9.62,9.66,10.75,11.22,
+12.22,12.13,13.35,12.58,13.73,13.89,15.16,14.25,16.71,17.44,
+17.98,17.51,17.68,19.75,18.92,20.52,21.42,21.54,20.74,21.67,
+23.18,23.22,23.36,24.99,25.36,25.86,25.44,27.35,26.71,29.21,
+29.48,30.94,28.82,29.56,30.12,31.71,32.69,32.16,32.93,33.70,
+34.28,34.57,36.20,36.05,37.77,37.10,38.39,38.86,39.40,39.71,
+38.59,41.18,39.43,41.80,41.50,43.39,43.56,45.79,43.61,46.02,
+43.75,46.43,47.37,47.59,47.99,48.68,49.34,49.50,49.70,50.14,
+51.63,52.05,54.33,54.74,52.39,52.56,55.38,56.12,55.15,56.64,
+57.88,58.04,57.67,59.32,59.36,60.84,57.61,62.26,63.08,62.90,
+61.30,63.54,64.25,63.92,65.78,66.01,65.85,67.44,65.99,68.10,
+68.01,70.14,70.61,68.73,70.00,72.36,70.99,73.54,73.97,74.43,
+72.97,75.89,77.13,76.43,77.54,76.61,77.77,79.66,77.48,81.23,
+79.18,79.13,80.94,79.43,82.63,81.30,79.78,84.90,84.39,82.42,
+86.41,84.14,85.72,87.21,87.90,89.06,88.67,88.52,90.95,91.95,
+90.46,91.06,91.37,91.16,92.98,94.37,95.64,92.79,96.96,96.53,
+96.25,96.83,96.71,98.13,98.78,98.97,99.42,101.41,103.24,99.75,
+104.14,102.91,105.52,102.54,104.12,107.38,105.37,104.69,110.00,109.93,
+107.25,108.05,109.29,109.45,111.18,110.68,112.82,115.69,113.63,114.70,
+114.65,115.04,115.26,115.64,115.52,117.81,118.64,116.66,118.27,118.42,
+119.79,121.82,119.08,119.97,123.37,122.83,123.38,123.64,123.18,123.64,
+124.92,126.79,126.53,127.37,130.94,126.45,126.48,129.62,128.03,129.65,
+132.09,131.55,130.49,135.38,133.36,134.74,136.69,136.46,136.59,136.22,
+139.72,138.98,140.96,138.89,136.85,140.28,140.04,142.84,141.19,141.61,
+144.10,143.03,141.45,145.97,145.67,144.57,142.15,144.30,149.53,148.34,
+146.59,144.06,146.59,150.77,149.95,150.89,151.81,153.10,152.41,150.77,
+155.45,156.86,151.63,155.26,155.37,156.47,158.12,158.68,158.09,159.40,
+158.92,159.14,160.54,163.93,163.87,164.10,162.22,162.66,164.79,168.01,
+164.30,166.42,164.73,166.73,163.92,170.46,169.56,168.87,168.22,168.47,
+4.71,4.80,4.68,5.72,6.10,6.88,7.50,7.67,7.76,8.32,
+8.75,9.87,9.70,11.02,10.73,11.53,11.24,11.68,12.31,12.78,
+13.14,13.94,14.38,14.90,15.09,15.59,16.08,17.03,17.23,18.05,
+18.47,18.96,18.95,19.16,18.75,19.37,22.21,20.68,22.00,21.52,
+22.38,22.78,23.18,23.42,24.15,25.31,22.84,25.48,25.10,26.79,
+25.82,27.38,26.41,27.82,28.11,28.71,29.57,29.15,30.29,30.66,
+30.63,30.96,32.98,32.18,32.85,34.15,33.77,34.17,34.73,35.47,
+35.72,35.31,35.50,37.38,36.55,37.85,37.70,38.68,38.57,39.81,
+39.97,39.98,41.06,42.19,41.58,42.30,42.52,43.32,42.20,41.98,
+43.58,44.58,44.22,46.30,47.42,45.99,46.51,49.11,49.52,47.85,
+48.61,50.16,49.50,50.45,49.13,51.09,51.52,52.76,53.59,52.55,
+53.90,54.29,53.49,54.83,54.59,54.21,56.32,56.89,57.11,57.58,
+56.99,57.50,59.41,58.26,59.90,60.94,59.02,60.91,59.59,61.08,
+61.91,62.74,62.61,62.03,65.50,63.25,63.15,64.94,64.45,65.19,
+64.76,66.91,67.93,67.77,67.86,69.11,70.99,70.64,71.05,70.37,
+70.57,70.12,71.69,69.91,71.52,73.43,75.13,75.00,73.97,73.09,
+74.55,75.17,77.33,75.52,75.30,76.44,76.69,76.92,79.57,79.78,
+79.70,78.53,80.39,81.83,81.04,80.09,80.86,83.17,82.38,83.94,
+84.16,83.22,84.21,83.97,86.00,87.86,86.13,86.48,88.06,87.12,
+86.12,87.42,90.11,89.97,91.20,88.75,89.89,91.37,93.35,90.94,
+92.82,93.46,92.98,91.38,94.36,93.78,93.93,95.81,96.70,97.74,
+98.57,100.41,96.43,98.16,97.80,99.27,98.60,99.20,100.01,100.27,
+102.69,102.26,104.27,104.76,102.31,104.20,104.22,104.31,106.56,103.69,
+104.84,106.79,105.31,108.79,107.79,108.51,109.10,109.32,109.52,109.72,
+109.87,110.04,107.47,110.05,109.29,113.70,112.99,113.70,112.39,114.56,
+112.43,115.80,117.12,113.22,115.59,117.88,117.43,118.17,119.36,119.67,
+119.61,118.91,117.77,121.07,119.55,119.13,121.42,120.61,121.42,120.17,
+124.39,125.06,124.45,127.17,127.86,126.39,127.33,123.41,128.78,128.11,
+127.66,128.50,129.64,131.34,130.89,129.42,129.24,133.07,131.09,132.49,
+3.32,3.98,4.41,4.57,4.44,5.39,5.57,5.46,6.88,6.20,
+6.77,7.58,7.85,8.81,8.17,9.38,9.38,8.84,10.26,9.67,
+11.50,11.31,10.46,11.13,11.35,11.85,12.73,12.22,13.20,12.20,
+13.40,13.53,15.60,14.55,15.99,15.98,14.76,15.59,16.41,16.54,
+17.03,16.62,17.91,16.45,18.57,19.44,18.98,19.62,19.61,19.96,
+20.05,21.10,21.24,21.45,21.59,22.70,22.36,22.65,23.20,25.54,
+23.89,24.19,24.95,24.01,25.24,26.28,26.78,26.95,26.03,25.76,
+27.32,25.98,27.21,27.67,28.73,26.91,30.09,30.66,30.74,30.45,
+31.26,30.90,31.10,33.04,32.02,32.91,33.10,32.33,33.06,33.42,
+34.19,35.42,32.32,35.45,35.44,35.15,36.41,36.79,36.18,36.40,
+37.86,38.36,38.99,38.38,38.47,39.97,39.53,40.00,39.77,42.95,
+40.34,41.83,42.81,43.32,42.19,43.00,43.49,42.28,43.16,43.01,
+44.96,43.42,44.38,43.58,45.94,47.65,48.10,48.52,47.23,46.32,
+47.18,48.70,48.14,49.99,49.05,49.51,49.21,50.31,49.66,51.27,
+49.83,50.88,49.39,51.39,52.48,52.88,53.42,53.20,54.43,54.70,
+54.81,55.43,54.79,55.83,56.49,55.26,56.53,56.74,57.51,59.03,
+58.42,58.03,58.79,58.72,60.24,61.18,59.04,59.66,59.33,59.59,
+64.18,62.06,62.22,60.93,60.96,61.05,63.65,63.17,65.01,64.80,
+63.33,64.45,64.38,64.86,64.87,67.80,66.23,67.17,66.86,66.85,
+68.48,67.54,68.59,70.86,69.76,69.60,71.64,70.03,72.03,71.73,
+70.12,71.76,72.88,73.09,73.51,74.54,72.77,72.96,72.94,73.98,
+74.88,76.26,75.83,77.48,75.20,75.64,77.38,76.58,77.65,78.26,
+77.75,78.84,79.87,80.18,80.24,79.91,79.82,79.42,81.59,79.89,
+80.84,80.14,81.53,83.15,84.77,83.16,82.28,82.42,85.70,83.66,
+84.86,85.27,88.07,86.00,86.95,85.70,89.87,88.58,85.48,87.63,
+91.12,89.24,89.97,87.47,90.31,86.75,92.02,89.73,92.34,91.27,
+93.32,89.56,91.53,96.29,92.09,95.25,91.74,94.50,92.26,95.62,
+95.14,94.97,94.62,98.58,95.41,96.05,98.98,97.55,96.46,98.72,
+98.24,97.76,99.07,99.22,100.67,101.85,100.35,101.19,99.57,99.83,
+2.71,2.66,3.23,3.33,4.04,4.35,4.19,4.54,4.31,4.90,
+5.41,5.61,5.76,5.81,6.48,6.83,6.42,7.08,6.53,8.31,
+8.07,7.89,8.23,9.09,8.76,9.34,9.30,10.42,10.21,9.73,
+10.12,10.96,10.70,11.04,11.48,11.82,12.93,11.54,12.03,13.88,
+13.35,13.54,14.10,14.51,14.14,13.99,13.70,15.72,15.65,15.70,
+15.77,16.14,16.64,17.05,16.77,17.91,16.67,17.15,17.79,17.74,
+18.69,18.07,19.99,20.21,19.52,19.54,20.45,20.73,20.33,21.04,
+21.92,21.43,21.12,22.07,21.58,20.87,22.82,21.41,23.47,24.37,
+24.53,24.32,24.12,23.86,23.81,24.54,26.48,24.69,26.42,26.46,
+26.79,26.38,26.27,26.28,26.57,27.48,28.40,28.80,30.23,27.73,
+28.44,28.46,30.23,29.31,30.01,30.48,30.36,30.97,29.61,30.93,
+31.11,31.51,31.99,32.80,33.24,33.75,31.02,33.35,32.93,34.19,
+35.77,34.13,35.65,34.64,35.26,34.84,36.20,37.17,36.20,35.74,
+36.69,36.02,37.21,39.11,38.37,40.30,38.48,38.10,38.47,39.86,
+38.27,41.58,39.27,39.87,40.61,39.70,42.35,41.27,41.94,42.47,
+43.12,43.47,42.61,42.45,43.17,43.70,43.19,43.05,44.94,45.30,
+45.05,44.03,45.14,45.27,46.04,46.76,46.88,47.49,48.73,45.44,
+48.09,48.95,48.95,46.84,47.55,48.63,48.11,49.19,49.75,49.48,
+51.23,50.42,50.92,49.66,51.31,50.05,52.13,50.96,51.24,53.62,
+50.65,51.23,54.34,53.44,54.11,52.38,53.30,55.99,53.35,54.20,
+55.37,55.43,53.71,53.17,55.97,58.41,55.45,56.58,56.52,57.56,
+57.05,57.49,58.28,58.70,57.23,58.23,61.27,58.33,59.43,59.74,
+60.49,60.45,62.62,60.97,61.07,60.64,61.17,63.06,61.53,63.40,
+63.53,62.90,61.30,65.00,65.29,64.18,65.12,65.59,65.66,63.48,
+66.86,63.29,66.43,65.20,69.51,66.42,66.72,67.33,67.07,66.85,
+69.60,67.95,68.90,68.89,68.03,67.70,70.10,69.81,69.62,68.51,
+71.12,71.74,69.66,71.87,70.97,72.59,72.00,69.78,74.10,70.63,
+73.66,74.99,72.90,75.85,73.44,73.04,74.18,76.11,76.06,73.50,
+75.53,74.33,76.88,77.52,74.88,75.57,78.27,78.89,77.78,77.61,
+1.89,2.22,2.30,3.03,2.41,3.01,3.08,3.43,3.35,4.25,
+3.96,4.84,4.02,5.04,4.91,5.41,5.41,5.45,5.90,5.70,
+6.45,5.88,7.08,6.28,6.01,7.22,7.45,7.19,7.98,7.43,
+7.94,8.10,9.00,8.53,9.17,8.69,9.00,9.84,9.68,9.62,
+9.99,9.81,9.99,10.64,10.71,11.02,11.44,12.36,12.56,12.19,
+11.46,12.08,12.77,12.23,12.09,13.85,13.46,13.68,13.45,14.40,
+14.54,14.35,14.60,15.29,14.08,15.38,15.94,15.77,16.15,15.58,
+15.37,17.51,15.87,16.99,17.11,16.42,17.06,17.35,18.31,18.71,
+17.27,17.66,18.45,19.51,19.09,18.79,19.46,18.94,19.12,19.82,
+19.86,20.97,20.75,19.77,20.78,21.43,21.05,21.77,22.64,21.69,
+22.73,23.65,22.29,22.00,23.61,22.71,23.94,24.90,23.57,23.98,
+24.00,23.98,24.66,25.49,24.54,24.55,24.92,26.81,24.26,24.74,
+26.03,26.68,26.32,25.81,27.61,27.22,27.49,27.11,27.67,27.61,
+28.25,27.94,28.70,28.51,29.32,29.95,29.59,28.22,29.99,29.48,
+31.19,30.02,30.48,31.08,29.86,30.98,31.07,31.83,31.06,31.76,
+31.72,31.96,32.18,34.48,33.84,33.31,34.08,34.53,32.63,32.53,
+33.60,34.92,35.01,33.37,34.81,36.11,34.73,35.25,37.22,35.56,
+35.90,36.15,36.68,35.11,39.13,37.26,36.29,39.34,37.45,39.26,
+39.51,37.34,38.59,37.39,38.28,40.17,37.31,40.68,39.18,40.40,
+40.79,40.98,39.60,40.44,41.48,42.04,41.97,41.65,40.86,42.38,
+42.52,43.22,42.83,43.35,42.65,42.95,41.80,44.08,42.63,44.30,
+45.10,43.40,45.08,45.20,46.30,45.51,46.42,44.13,47.60,48.33,
+47.01,45.65,46.27,45.95,47.44,46.77,47.92,46.76,47.22,48.09,
+48.30,47.35,48.96,48.99,51.01,50.87,50.85,48.60,49.30,49.51,
+50.61,50.96,50.83,52.71,51.37,50.89,50.52,50.16,52.11,51.69,
+51.49,52.55,52.32,52.58,54.46,54.00,52.85,53.02,54.19,53.31,
+53.22,55.62,53.22,56.17,53.36,57.43,56.85,58.31,56.42,55.99,
+54.38,54.47,56.16,55.03,58.27,57.70,58.27,58.26,56.94,58.30,
+57.02,57.70,60.17,59.18,59.62,60.30,59.35,58.33,59.07,59.91,
+1.42,1.84,1.96,2.09,2.02,2.31,2.46,2.42,2.92,2.90,
+3.21,2.94,3.34,3.24,4.14,4.23,4.35,3.98,4.76,4.10,
+3.96,4.31,5.12,4.90,5.23,5.61,4.56,5.49,6.14,6.11,
+6.02,6.28,6.33,7.21,6.76,6.72,7.53,7.54,7.15,7.53,
+7.50,8.32,8.22,7.96,8.77,8.14,8.64,8.49,9.17,9.41,
+9.24,9.52,9.49,9.37,9.73,10.38,9.78,10.37,9.77,11.43,
+10.49,11.34,11.10,10.27,11.40,11.31,11.69,11.54,11.96,11.78,
+11.18,12.43,12.40,13.28,13.14,13.56,13.58,13.24,13.68,14.27,
+14.44,14.07,14.27,14.86,14.22,15.09,16.37,13.85,15.14,14.96,
+14.80,15.07,16.20,15.40,16.25,16.11,16.40,16.74,15.79,16.64,
+17.53,17.77,17.86,18.35,17.39,16.66,19.22,18.82,18.25,18.61,
+19.11,17.27,19.70,19.21,19.30,17.96,19.10,19.41,19.76,19.93,
+18.83,19.92,21.04,21.71,20.57,20.99,20.27,19.94,21.61,22.71,
+21.61,21.01,22.02,22.17,21.94,22.62,22.25,21.55,23.01,23.18,
+22.97,22.90,23.68,24.04,22.56,24.30,24.54,24.79,23.03,25.27,
+24.67,24.70,24.95,26.42,25.56,23.84,26.18,25.99,25.50,24.25,
+26.06,26.27,25.93,25.80,25.69,26.00,28.48,28.76,26.88,26.38,
+28.88,26.02,26.42,27.57,30.44,27.81,28.88,29.44,28.53,29.22,
+29.64,27.20,30.31,30.27,30.20,29.83,29.85,30.18,30.43,30.56,
+28.86,32.30,30.64,31.35,31.59,29.91,32.80,32.16,32.05,33.50,
+32.22,31.73,34.31,31.51,33.37,33.27,32.89,34.34,33.80,34.83,
+32.66,33.92,34.99,32.59,34.46,33.34,33.74,35.24,34.21,35.98,
+35.37,34.44,34.84,35.16,35.56,35.46,36.38,37.24,36.28,37.22,
+36.76,36.66,37.83,37.64,38.01,36.88,37.22,37.12,38.30,37.21,
+39.21,37.62,40.05,39.01,39.14,38.91,38.91,38.47,40.81,40.32,
+40.03,39.82,39.39,39.67,40.10,37.82,43.02,40.62,41.33,40.29,
+40.61,41.44,40.10,40.57,42.12,41.86,42.11,40.76,42.52,43.06,
+43.96,43.10,42.89,44.86,43.17,42.95,45.44,43.66,43.46,44.30,
+45.06,43.22,44.35,45.11,44.44,44.61,44.74,44.28,45.84,48.48,
+1.20,1.43,1.28,1.46,1.64,1.71,2.21,2.09,1.70,2.06,
+2.13,2.56,2.05,2.73,3.05,3.29,3.14,3.22,3.24,3.71,
+3.62,4.10,4.26,3.48,4.11,4.00,4.29,4.13,5.20,4.57,
+4.91,4.52,5.23,5.30,5.10,5.11,5.57,5.49,5.92,4.93,
+5.36,6.53,6.12,6.58,5.92,6.22,6.25,6.91,7.17,6.79,
+6.87,7.79,7.68,7.66,6.38,8.37,7.44,8.17,7.61,8.11,
+8.62,8.25,7.82,8.26,8.16,8.16,9.52,9.18,10.12,8.58,
+9.33,8.96,9.27,9.53,10.49,9.75,9.75,10.53,10.42,10.68,
+10.64,10.77,10.42,10.72,11.59,11.08,11.23,10.78,11.32,11.54,
+11.63,12.32,11.50,11.46,11.57,12.64,12.80,12.62,13.66,12.33,
+13.71,12.93,13.30,14.13,14.02,13.07,14.07,13.69,13.82,13.49,
+13.80,14.01,14.15,14.45,15.79,14.84,15.03,14.43,14.60,15.13,
+16.91,15.48,15.72,15.03,16.00,16.06,14.94,16.76,16.83,17.11,
+17.57,17.26,17.51,16.18,16.80,16.37,18.50,17.70,18.90,16.83,
+18.82,17.89,17.45,18.84,17.75,17.79,18.09,17.89,18.81,20.00,
+19.29,18.89,19.20,17.64,19.68,19.81,20.18,18.45,20.54,21.22,
+20.59,18.74,19.63,20.99,20.07,21.75,20.15,21.38,20.62,20.61,
+21.95,20.91,20.44,21.25,21.23,22.95,22.29,21.55,22.51,21.71,
+23.18,21.73,21.16,24.36,22.18,22.93,22.45,24.71,22.71,23.94,
+23.48,24.16,23.50,23.95,24.29,23.80,24.34,24.47,24.14,25.01,
+24.22,24.46,24.85,25.41,25.69,25.43,26.22,25.48,25.13,25.96,
+24.63,26.86,27.04,25.17,25.88,27.07,26.26,26.11,25.95,26.02,
+26.07,26.66,27.37,26.83,27.52,27.40,30.15,27.67,28.36,28.07,
+29.22,26.49,28.37,28.50,28.92,29.17,27.61,29.92,28.90,29.33,
+30.14,29.95,28.88,29.59,30.32,29.32,29.76,30.24,30.71,31.84,
+31.34,29.68,30.97,29.25,30.02,30.29,30.82,31.98,31.48,31.49,
+30.59,31.84,32.14,31.72,32.27,32.27,30.20,31.55,31.60,33.71,
+32.11,32.78,32.79,32.63,32.83,34.02,34.87,33.94,33.27,33.71,
+33.52,34.13,35.03,33.04,32.46,35.04,35.01,34.90,34.70,35.93,
+0.95,0.85,1.43,1.00,1.43,1.29,1.55,1.12,1.10,1.98,
+1.89,2.19,1.86,2.15,2.00,2.37,2.09,2.71,2.41,3.17,
+2.96,2.76,2.80,2.79,2.80,3.23,3.59,3.01,3.34,3.28,
+3.63,3.95,3.67,3.97,3.07,4.03,3.71,3.96,3.97,4.12,
+4.21,4.78,4.64,4.63,4.95,4.82,4.74,5.47,5.76,5.35,
+4.79,5.43,5.44,5.01,5.35,6.07,5.90,5.56,6.13,6.54,
+6.27,6.53,6.59,6.23,6.66,6.89,6.45,6.87,6.85,7.04,
+6.97,7.34,7.41,8.19,7.24,7.55,7.86,7.82,8.51,8.49,
+6.96,8.06,7.99,8.57,7.84,8.37,8.94,7.89,8.17,9.49,
+8.71,8.64,9.59,8.84,10.56,8.89,10.07,10.07,9.29,10.06,
+8.97,10.14,10.69,10.38,10.01,10.93,10.68,10.36,10.22,11.14,
+10.12,10.84,10.14,10.97,11.30,11.04,11.73,10.84,11.82,10.85,
+10.60,12.07,11.92,11.82,12.08,12.47,11.96,12.55,13.13,12.58,
+12.66,12.93,12.08,12.24,12.66,12.58,12.78,13.74,13.34,14.19,
+12.96,14.03,14.49,13.30,13.30,15.35,13.11,13.95,15.37,14.69,
+14.51,13.79,13.81,13.77,14.49,15.37,13.95,14.32,14.96,14.96,
+15.56,15.56,15.90,15.30,15.75,15.35,15.88,15.99,15.09,16.45,
+15.60,16.14,16.36,16.28,17.18,15.67,16.45,16.41,16.13,17.10,
+16.56,17.34,17.32,16.41,17.27,17.75,17.37,17.69,18.75,17.88,
+17.20,18.32,18.10,18.33,17.64,19.25,19.22,17.73,17.55,17.75,
+18.46,18.69,18.79,19.69,20.23,20.08,20.00,19.63,20.81,19.13,
+19.54,20.40,19.55,19.77,21.09,20.17,20.02,19.97,19.36,21.51,
+19.85,20.53,22.32,19.54,21.76,19.95,20.67,20.46,21.99,19.65,
+21.73,21.90,19.86,22.25,22.34,21.20,21.19,21.80,22.00,21.63,
+20.72,22.07,22.24,21.07,22.57,21.66,22.35,21.78,23.13,21.76,
+22.48,24.49,24.08,24.49,23.14,24.87,24.43,22.64,23.25,23.07,
+24.23,23.21,24.12,23.97,24.74,24.86,24.92,24.53,23.83,23.81,
+24.08,25.81,24.51,26.66,25.73,25.31,25.08,25.33,26.63,24.61,
+25.04,26.34,27.29,26.11,27.70,26.81,25.01,26.57,27.32,27.42,
+0.81,0.59,0.82,0.62,0.85,0.86,1.14,1.00,1.12,1.20,
+1.37,1.29,1.62,1.64,1.51,1.73,1.59,1.96,1.72,1.90,
+1.79,1.93,2.23,2.00,2.06,2.02,2.45,2.49,2.80,3.09,
+2.89,2.78,2.54,2.96,2.62,2.97,3.12,3.87,3.33,3.36,
+3.40,3.63,2.81,3.46,3.12,3.17,3.58,4.05,3.96,3.89,
+4.12,3.71,4.28,4.29,4.47,4.14,4.61,4.93,4.44,5.23,
+4.40,5.26,5.32,5.06,4.78,5.10,5.47,5.11,5.57,5.26,
+6.03,5.17,5.56,5.15,5.47,5.86,5.65,5.98,6.45,6.21,
+6.82,6.12,5.96,6.70,6.33,7.50,5.65,6.19,6.58,6.62,
+6.74,7.04,6.71,6.84,6.61,7.46,6.94,6.70,8.24,7.01,
+7.43,7.58,7.62,7.54,7.92,8.35,7.93,7.44,7.61,7.96,
+7.32,7.19,8.22,8.04,9.03,8.92,8.01,8.68,8.08,8.70,
+9.47,9.37,9.28,8.59,9.38,9.09,9.68,9.07,9.27,9.91,
+9.08,10.40,9.23,10.15,9.75,9.57,9.65,11.10,10.33,9.32,
+10.09,10.73,11.17,11.03,10.48,10.85,10.73,11.08,11.24,12.13,
+11.15,11.25,10.82,12.17,10.82,11.15,11.58,10.79,11.21,11.96,
+11.72,11.91,12.44,10.93,11.59,11.40,11.26,12.55,12.28,13.18,
+11.94,12.15,13.31,12.01,11.95,11.85,12.64,12.68,12.79,13.70,
+11.73,13.27,13.46,13.12,12.56,12.73,13.52,13.37,13.91,14.08,
+13.06,13.17,13.34,13.73,15.04,13.65,14.10,13.04,14.25,14.47,
+14.79,13.86,14.63,14.91,14.19,14.26,14.54,14.57,15.79,14.10,
+15.56,15.68,15.44,15.28,15.43,15.15,17.11,14.92,15.24,15.56,
+15.45,15.41,15.64,15.59,15.28,15.54,16.17,15.46,17.13,15.95,
+15.74,17.08,16.44,17.25,15.56,15.71,16.65,16.83,17.25,16.11,
+17.82,17.13,16.02,17.58,17.27,17.78,17.62,17.71,17.86,17.09,
+17.74,16.82,17.20,19.31,17.57,18.11,17.79,17.57,18.01,17.99,
+18.75,18.12,19.03,18.62,18.04,17.78,18.30,18.76,18.23,19.32,
+20.13,19.90,18.16,19.57,19.27,19.14,21.14,19.88,20.19,18.42,
+18.29,21.05,19.23,19.84,21.67,19.93,20.30,19.54,20.12,19.92,
+0.30,0.60,0.65,0.81,0.61,0.69,0.69,1.02,1.06,0.67,
+1.08,1.03,1.18,1.44,1.50,0.88,1.41,1.35,1.51,1.32,
+1.46,1.74,1.90,1.89,1.89,1.79,2.13,2.14,1.49,2.08,
+2.26,2.03,2.09,2.00,2.25,2.13,2.47,2.38,2.69,2.13,
+2.63,2.74,2.49,2.53,2.98,2.32,2.83,2.90,2.88,2.63,
+2.90,2.97,3.41,3.28,3.15,3.03,3.36,3.37,3.98,3.22,
+3.46,3.42,4.39,3.68,3.73,3.96,4.17,4.07,4.19,4.27,
+3.81,3.84,3.98,4.37,4.96,4.11,4.46,4.04,4.19,4.60,
+4.77,4.46,4.76,4.70,4.58,5.01,4.92,4.50,4.92,5.51,
+4.48,5.01,4.83,5.78,5.29,5.17,5.81,5.98,5.33,5.74,
+5.53,6.02,5.36,6.20,6.34,5.88,5.97,5.82,5.75,6.01,
+6.30,5.86,5.47,5.70,6.43,7.10,6.75,5.71,7.21,6.33,
+5.83,6.20,6.21,6.73,6.75,6.91,7.59,7.54,6.81,7.28,
+7.07,7.16,7.56,7.12,7.47,7.86,7.94,7.85,7.89,7.76,
+8.51,7.76,8.06,8.02,7.08,8.28,8.11,8.34,8.80,8.41,
+8.07,8.44,8.55,8.35,9.59,8.55,8.58,8.94,8.89,8.69,
+9.11,9.15,9.79,9.05,8.76,8.75,8.29,8.85,8.86,9.26,
+8.96,8.30,9.83,10.05,9.32,9.52,10.15,9.01,9.56,10.52,
+9.81,9.90,9.29,10.52,10.63,10.35,9.93,10.81,10.62,10.87,
+9.55,11.08,10.51,10.90,11.31,11.01,10.34,10.52,10.52,11.11,
+10.63,10.91,10.72,11.54,10.12,11.11,11.23,11.38,11.45,11.04,
+11.49,12.30,11.62,10.96,11.34,12.37,11.18,12.40,11.38,12.52,
+11.54,11.73,12.83,12.83,11.72,12.19,13.27,12.33,12.71,12.79,
+11.83,12.05,12.22,11.93,12.74,12.02,12.24,11.63,11.79,13.32,
+13.20,12.98,12.65,12.18,13.10,12.68,13.09,13.84,13.29,13.57,
+12.68,13.12,12.93,13.13,14.68,13.15,13.97,13.99,14.77,14.25,
+13.21,13.94,13.69,13.99,13.19,13.30,14.73,15.04,14.14,14.74,
+14.09,14.71,15.08,15.44,14.97,14.37,14.35,15.92,14.19,14.14,
+14.70,15.81,15.25,15.99,15.03,15.01,14.81,15.36,15.44,15.52,
+0.32,0.39,0.30,0.47,0.62,0.72,0.74,0.72,0.72,1.04,
+0.99,1.06,0.91,0.63,0.88,1.15,0.90,1.11,1.22,1.10,
+1.12,1.24,0.97,1.26,1.20,1.42,1.92,1.38,1.51,1.42,
+1.74,1.78,1.61,1.68,1.74,1.72,1.75,1.69,1.87,2.31,
+1.71,1.78,2.31,1.76,2.07,2.38,2.36,2.42,2.10,2.22,
+2.26,2.49,2.38,2.74,2.54,2.32,2.15,2.92,2.56,2.60,
+2.62,2.89,2.99,2.35,3.35,2.76,2.74,3.01,2.38,3.58,
+3.28,2.65,2.89,3.46,3.24,3.56,2.55,2.98,3.43,3.39,
+3.78,4.09,3.46,3.67,3.87,4.11,3.99,3.56,3.85,3.97,
+3.58,4.65,3.86,3.56,4.23,3.56,3.79,3.59,4.19,4.37,
+3.93,4.00,4.74,4.30,4.17,4.78,4.38,4.48,4.21,4.12,
+5.02,4.29,5.42,5.12,5.03,5.02,4.82,5.39,5.71,4.77,
+5.12,5.55,5.13,5.66,4.88,5.47,4.88,5.55,4.74,5.61,
+5.82,5.37,5.60,6.04,5.33,5.32,6.47,5.77,5.93,6.17,
+4.96,4.85,5.74,5.80,5.72,6.07,5.90,6.60,6.01,6.21,
+6.91,7.19,6.45,6.50,6.04,6.76,6.79,6.71,7.74,5.85,
+6.82,7.01,6.95,6.40,6.92,6.11,6.50,6.60,7.15,6.89,
+6.27,6.55,7.44,7.58,6.43,7.47,7.39,7.10,7.66,6.97,
+6.94,7.64,7.57,7.10,7.90,7.63,8.05,8.28,7.59,7.83,
+7.40,7.55,7.91,8.63,8.47,8.63,8.24,7.83,8.50,8.07,
+7.36,8.03,9.08,9.37,7.48,8.57,8.03,8.94,8.73,8.40,
+9.05,8.90,9.71,8.72,8.08,9.21,9.37,8.86,9.38,8.05,
+8.53,9.38,9.11,9.90,9.63,8.92,8.83,8.86,9.55,9.09,
+9.21,9.96,9.00,10.21,10.05,9.42,10.21,10.04,9.79,10.43,
+8.59,9.58,9.81,9.74,9.64,9.16,10.56,9.44,9.45,9.90,
+10.88,9.69,10.01,10.19,9.54,10.50,10.31,10.87,11.27,11.06,
+10.91,11.19,11.36,10.31,11.03,11.02,9.68,10.90,10.88,10.77,
+11.33,11.31,10.22,11.13,11.74,10.38,11.91,11.30,10.89,11.23,
+11.81,12.13,11.64,10.94,11.23,12.38,11.78,11.77,12.12,12.13,
+17.78,19.65,20.92,22.11,25.62,26.47,28.00,29.65,31.48,33.03,
+34.69,36.03,39.72,40.12,43.54,44.05,45.23,47.58,49.30,50.34,
+53.18,54.14,56.35,57.76,58.75,62.13,63.06,64.06,67.05,68.75,
+69.42,71.51,72.32,74.97,75.33,77.67,79.02,81.72,83.47,84.39,
+86.23,88.27,89.37,91.51,92.84,96.19,95.83,98.75,99.94,103.09,
+103.55,107.39,107.69,109.35,110.09,113.83,112.74,115.67,117.19,117.79,
+122.21,120.33,123.31,126.54,130.12,128.01,133.36,133.70,136.22,137.07,
+136.62,139.00,143.26,142.94,146.19,148.17,147.83,150.57,152.43,154.03,
+155.83,154.39,160.73,162.94,161.11,164.41,166.50,166.42,169.35,170.31,
+174.25,176.05,175.78,177.66,181.14,183.97,180.35,183.56,186.44,188.86,
+190.61,191.81,195.86,195.36,197.03,200.72,201.56,204.80,203.65,205.84,
+206.95,208.91,208.50,213.65,213.34,217.35,215.44,218.29,220.34,222.46,
+222.88,225.59,227.06,229.64,232.30,233.08,236.87,237.41,239.04,241.21,
+238.27,244.95,244.68,246.00,249.08,253.01,253.77,255.35,255.81,258.12,
+258.64,261.08,263.02,265.02,266.92,266.89,270.04,269.63,272.73,275.79,
+274.97,275.95,278.21,279.37,280.55,286.41,287.64,287.10,290.23,289.10,
+293.95,295.52,294.66,298.88,301.19,302.20,305.32,306.12,306.72,309.41,
+311.37,315.39,312.76,313.80,321.46,318.89,321.02,322.50,324.12,328.19,
+325.62,326.66,333.40,333.20,339.64,336.53,338.84,339.22,341.09,345.69,
+344.49,346.56,350.53,352.14,352.56,356.37,355.89,360.05,357.94,363.63,
+361.25,362.89,362.82,371.40,367.41,372.74,373.35,373.09,374.80,378.80,
+380.19,379.97,383.84,382.74,386.60,388.33,392.13,389.74,389.83,396.48,
+396.83,398.12,395.32,401.39,403.71,408.34,409.28,411.20,411.35,409.72,
+416.24,415.44,420.72,418.82,420.27,425.47,427.81,424.52,426.81,430.63,
+431.57,434.11,433.58,430.85,439.18,440.11,440.28,443.07,442.98,445.27,
+447.88,450.82,449.94,450.82,453.40,458.06,456.79,460.09,461.50,463.76,
+466.63,468.62,466.09,475.61,472.17,475.69,476.59,477.89,482.91,479.99,
+484.63,482.53,485.52,486.95,491.47,488.31,494.67,498.11,493.76,500.11,
+500.96,498.41,502.93,504.07,509.01,503.66,511.14,511.87,511.69,511.42,
+14.19,15.30,16.65,18.48,20.76,20.99,23.68,25.01,23.86,26.36,
+28.33,27.58,30.77,31.24,34.58,35.27,36.42,37.93,38.75,40.29,
+42.81,43.27,43.45,45.91,46.66,49.10,49.86,51.10,53.55,53.71,
+56.22,57.66,58.23,60.58,59.83,62.62,64.26,65.27,66.93,67.71,
+68.58,70.09,72.02,74.24,75.44,77.87,77.68,80.30,79.29,81.05,
+82.91,84.76,86.35,87.09,89.45,89.92,91.83,92.43,92.61,94.60,
+95.17,98.23,100.18,99.77,103.61,102.95,103.49,107.24,106.00,108.29,
+111.37,110.45,113.18,116.30,116.37,117.93,119.52,119.16,121.90,121.91,
+124.74,126.04,128.77,127.38,130.22,130.74,130.38,134.40,137.53,134.49,
+138.42,138.23,139.79,143.73,142.07,144.59,145.26,145.57,150.91,149.86,
+151.73,154.16,153.48,154.37,157.87,158.96,156.96,162.32,161.81,164.87,
+166.35,165.81,167.73,166.56,172.90,174.66,172.62,173.04,180.29,180.35,
+179.71,181.29,182.40,183.26,184.50,185.37,185.78,186.97,191.89,192.28,
+194.29,194.50,198.24,195.31,197.69,197.77,201.61,201.84,199.48,205.28,
+207.25,208.33,213.52,209.83,209.19,213.66,215.91,214.25,219.25,220.04,
+221.82,221.34,225.00,223.81,228.34,227.74,228.78,231.80,230.90,232.33,
+235.31,236.49,233.42,239.52,238.90,240.04,242.62,244.14,244.41,246.44,
+249.75,251.55,249.64,254.22,256.22,256.18,253.62,258.34,256.93,260.72,
+259.89,264.29,265.05,264.11,269.21,267.19,272.11,270.70,272.64,270.28,
+273.65,276.62,276.98,282.89,283.75,281.43,284.55,284.36,288.68,284.93,
+290.65,291.57,291.80,293.97,295.05,294.51,297.23,298.17,299.90,301.31,
+303.65,301.96,307.22,311.79,306.36,310.61,310.00,313.69,312.53,311.20,
+315.98,317.39,317.79,319.10,320.17,324.08,324.09,325.18,328.04,326.65,
+326.54,331.55,331.70,334.56,336.71,336.10,340.19,342.26,339.18,343.49,
+345.68,346.98,345.72,350.13,350.80,349.37,348.62,354.15,353.27,354.91,
+359.49,356.93,360.92,361.09,363.62,363.95,363.36,367.62,366.85,369.78,
+375.20,370.78,377.27,373.97,375.43,376.52,381.46,380.16,383.20,383.59,
+383.03,384.05,386.43,390.94,392.36,393.30,392.62,392.69,393.20,400.53,
+398.48,399.66,403.77,402.02,404.36,402.71,407.46,407.49,411.31,410.23,
+11.40,12.28,13.47,15.19,15.82,16.32,17.63,18.55,20.91,21.05,
+22.50,23.45,24.09,25.23,27.59,27.28,28.68,29.13,30.96,32.46,
+33.11,34.12,36.12,35.64,37.88,38.12,38.47,40.41,42.20,42.01,
+44.75,44.18,47.97,47.45,48.82,49.31,49.74,50.55,53.53,51.74,
+54.30,55.55,57.42,58.97,59.08,60.08,61.77,62.34,65.76,65.25,
+65.58,67.11,69.10,68.55,69.32,69.92,73.17,73.25,75.25,75.25,
+75.68,76.76,78.44,80.11,81.47,82.38,82.63,83.66,85.37,83.78,
+87.54,87.18,87.81,93.09,91.42,93.59,93.78,94.68,97.44,97.58,
+98.81,100.34,100.97,102.71,102.81,104.51,104.63,105.64,108.94,108.94,
+108.93,109.94,111.59,111.37,113.43,115.84,115.21,116.06,116.11,121.18,
+118.35,121.02,120.77,123.41,125.36,125.30,126.62,130.65,128.86,130.32,
+131.53,131.47,135.78,133.46,136.12,134.65,137.26,138.44,140.05,140.56,
+138.76,141.05,144.61,145.26,147.59,150.05,149.16,149.54,151.09,152.17,
+153.02,154.16,155.32,157.19,159.64,160.71,156.77,160.00,161.17,162.02,
+165.43,165.61,166.04,167.93,167.22,167.33,171.04,172.49,171.95,173.40,
+175.31,174.80,175.30,179.32,180.34,181.19,180.33,183.85,186.26,183.80,
+186.07,189.93,191.09,187.49,189.56,192.04,189.56,195.32,192.24,194.66,
+198.75,193.51,199.66,198.08,201.07,204.53,202.01,203.84,203.84,207.27,
+209.21,208.40,211.23,207.71,214.72,213.96,217.11,216.89,215.43,219.83,
+216.88,220.09,218.84,222.71,223.35,224.41,224.09,228.61,227.62,228.17,
+230.58,229.67,230.26,234.87,236.04,233.42,236.57,239.09,237.06,240.51,
+242.89,239.48,243.64,245.21,244.17,246.54,247.96,245.78,251.08,248.03,
+251.47,250.93,254.71,255.87,255.47,257.38,259.74,259.93,257.37,261.36,
+262.23,261.41,266.40,263.90,264.69,270.03,268.18,270.22,269.04,272.52,
+273.65,274.38,270.42,273.50,276.85,278.69,278.89,279.21,282.10,281.81,
+285.31,286.31,286.01,284.76,290.00,287.86,290.09,290.50,290.07,295.64,
+293.04,293.23,296.10,297.56,300.00,301.23,301.21,298.90,303.00,304.45,
+308.04,306.50,308.64,310.61,310.80,311.18,310.76,313.50,315.55,314.36,
+318.97,313.39,317.40,320.47,320.73,319.76,323.97,321.25,323.82,326.41,
+9.21,9.58,10.29,11.88,12.46,13.66,13.88,15.00,16.38,16.86,
+17.61,18.12,19.80,19.23,20.92,21.30,22.63,24.47,23.84,24.87,
+26.49,27.66,28.70,29.91,30.17,29.65,31.64,32.28,32.73,33.34,
+34.38,35.95,35.71,36.96,38.14,39.13,40.13,40.70,40.76,43.70,
+44.10,43.55,45.29,46.83,47.03,46.06,49.40,50.28,49.89,51.46,
+53.12,52.50,52.35,54.68,54.89,56.72,58.31,58.70,57.70,60.94,
+59.97,60.73,60.38,64.23,63.62,64.75,64.62,66.45,66.94,70.02,
+68.92,70.35,70.83,69.47,72.99,71.37,75.95,76.09,75.73,76.73,
+77.54,78.89,77.88,80.40,82.24,84.05,83.73,82.39,84.83,87.25,
+87.96,87.36,87.36,86.76,88.87,92.42,89.43,91.39,93.36,94.13,
+96.37,97.85,97.37,96.01,98.72,100.96,102.31,101.86,102.36,103.24,
+105.19,103.38,105.60,105.44,105.01,106.55,107.98,110.36,109.85,112.22,
+109.41,113.98,113.18,114.10,118.67,115.11,118.12,117.72,118.31,119.48,
+119.07,120.31,122.24,124.87,123.77,125.30,127.53,126.84,127.33,128.49,
+129.83,130.37,129.45,132.81,133.54,135.60,134.52,135.41,137.01,137.17,
+138.80,134.60,139.02,142.81,143.92,141.30,143.78,144.51,143.97,146.33,
+145.86,148.21,150.04,149.09,152.94,151.20,153.01,152.10,154.77,155.82,
+155.62,158.74,157.97,159.01,160.75,159.71,162.06,160.34,162.36,161.19,
+164.59,164.38,163.67,169.13,169.99,168.94,171.82,170.99,171.51,170.24,
+169.02,173.40,174.89,176.64,174.86,177.59,174.07,178.07,180.17,178.56,
+180.07,182.49,182.72,183.25,184.42,182.01,184.66,187.04,189.14,186.13,
+187.18,187.60,190.06,190.55,191.51,193.12,197.20,197.93,199.01,196.71,
+197.47,200.95,197.99,200.70,201.89,204.24,203.35,204.32,208.31,207.62,
+208.35,204.74,208.31,208.31,210.51,214.06,211.87,212.78,212.78,214.41,
+216.35,215.44,219.72,218.06,219.14,223.00,221.62,221.38,222.91,221.52,
+221.43,226.88,225.69,225.74,224.02,229.87,230.26,232.40,231.81,231.53,
+227.62,234.42,233.37,236.55,235.34,238.77,234.86,237.47,238.89,239.69,
+243.08,240.38,241.74,245.51,241.07,244.71,246.41,245.79,248.50,245.37,
+249.88,248.50,252.98,254.63,251.59,252.52,259.31,256.33,255.35,260.74,
+6.73,7.94,8.75,8.93,10.18,9.85,11.53,12.11,12.16,13.41,
+14.29,14.72,15.13,16.02,16.21,16.65,17.80,18.49,18.89,20.32,
+20.85,21.12,21.98,23.49,23.12,23.93,24.51,26.60,26.91,27.00,
+27.49,28.56,28.99,28.79,30.24,29.52,30.70,33.10,33.18,33.97,
+34.27,35.40,36.30,35.60,37.38,37.68,39.62,38.31,39.42,40.40,
+41.42,40.92,41.88,42.65,43.60,43.43,43.77,45.72,45.76,47.34,
+48.13,49.05,48.59,50.03,50.65,50.06,51.21,52.36,54.49,55.26,
+56.12,54.64,54.16,57.24,56.98,57.70,60.16,59.77,59.22,61.08,
+62.49,61.83,61.65,62.21,62.50,64.53,65.23,65.70,66.56,69.28,
+67.35,67.87,69.06,70.53,73.64,72.04,70.51,73.78,71.86,75.33,
+76.41,75.95,76.17,78.24,76.96,76.00,78.74,80.22,82.06,82.34,
+80.12,81.31,82.28,82.36,82.46,84.73,83.95,87.66,87.39,87.15,
+88.40,88.66,88.87,88.46,91.34,92.99,93.42,93.00,92.72,94.01,
+94.48,93.48,96.86,98.68,98.51,101.10,102.27,97.27,99.79,101.08,
+103.41,103.09,103.60,104.14,104.72,107.31,105.67,107.79,108.82,108.99,
+111.13,111.08,110.42,110.05,110.47,111.78,113.97,112.18,115.52,115.00,
+115.10,117.95,118.01,118.64,117.12,118.29,120.53,121.02,121.11,122.31,
+123.28,123.79,126.40,125.37,128.51,124.43,126.72,125.86,128.56,127.02,
+127.06,130.48,130.19,131.85,131.12,131.39,133.45,132.39,136.79,134.46,
+135.78,135.14,136.08,137.69,140.97,139.11,140.13,139.05,140.09,140.91,
+143.60,143.22,144.22,144.00,145.19,147.61,144.43,146.02,147.48,149.70,
+149.34,151.27,151.37,147.49,151.77,153.34,154.51,154.34,154.12,153.25,
+157.16,156.59,159.56,158.06,157.74,159.99,161.42,158.46,160.63,159.53,
+161.93,164.07,165.54,166.17,162.91,165.14,167.38,169.71,167.05,169.39,
+171.61,172.78,173.57,174.19,173.27,171.67,173.66,175.53,174.67,176.96,
+172.82,175.59,180.60,180.62,179.22,180.90,177.64,180.98,181.52,184.07,
+181.65,183.22,183.73,185.24,183.84,187.01,186.68,185.43,188.43,189.96,
+187.99,188.91,190.47,189.54,194.51,195.71,191.44,195.80,193.22,197.55,
+196.30,198.08,196.71,197.14,197.25,200.49,202.45,197.99,200.05,207.68,
+5.60,6.12,6.14,7.17,7.84,8.65,9.08,9.79,9.77,10.25,
+11.24,11.33,11.16,12.14,12.51,13.66,14.22,14.96,14.02,14.18,
+16.34,17.67,18.32,17.18,18.86,18.14,18.89,20.05,20.89,21.35,
+20.47,20.40,21.83,22.02,23.11,24.16,25.14,25.09,25.59,25.80,
+27.03,27.91,28.72,28.00,29.34,29.61,30.00,29.89,31.18,30.63,
+31.32,32.00,32.58,34.48,34.49,35.12,35.36,34.65,36.42,37.03,
+37.12,37.45,38.99,39.16,38.75,41.05,41.83,40.72,41.41,41.22,
+43.12,43.96,43.53,45.23,45.57,45.81,46.86,46.09,46.35,47.36,
+47.51,48.88,49.25,51.23,49.61,51.35,50.15,52.32,52.31,52.41,
+54.62,53.56,55.28,54.92,54.69,54.27,57.74,57.45,56.65,57.20,
+57.33,58.38,57.26,59.72,59.46,61.64,61.49,61.97,64.13,62.66,
+63.80,65.45,65.84,66.25,66.68,65.29,67.57,68.95,69.85,68.86,
+70.09,69.81,70.66,71.50,72.68,70.89,73.38,73.79,73.18,72.79,
+75.65,76.62,78.13,77.69,77.06,78.70,78.90,78.07,78.90,78.20,
+81.49,78.37,82.87,81.53,81.31,81.50,82.79,83.61,84.00,84.54,
+83.54,86.29,84.31,87.79,88.46,87.28,85.52,88.33,90.08,89.19,
+93.07,92.88,89.89,92.17,91.06,94.53,92.82,95.51,91.63,95.74,
+94.99,98.80,95.96,97.51,97.96,99.17,97.68,99.41,99.86,102.00,
+97.96,103.37,100.85,100.54,102.42,105.03,106.10,102.78,107.07,104.78,
+105.86,105.45,108.50,108.63,110.64,110.88,106.60,110.68,112.17,111.46,
+112.08,110.68,112.09,110.60,114.56,113.58,113.67,116.20,115.00,115.52,
+118.58,118.63,117.30,117.72,116.06,121.04,119.94,121.00,122.35,120.53,
+123.28,121.49,123.60,124.85,125.45,123.50,124.57,125.75,124.99,124.63,
+127.94,128.41,127.79,129.06,128.24,132.52,130.47,130.75,134.93,133.46,
+132.98,133.29,133.26,134.93,134.22,135.26,136.29,137.50,137.45,136.14,
+138.93,140.14,137.38,141.08,146.32,142.35,140.72,142.59,143.38,143.66,
+141.89,143.97,143.50,144.97,143.56,148.11,146.47,147.86,146.17,146.32,
+148.55,147.22,148.75,154.08,150.66,152.03,151.30,151.81,150.33,153.13,
+153.78,153.87,156.22,157.87,157.77,157.31,156.87,156.10,157.41,160.42,
+4.49,4.95,5.06,5.92,5.21,6.26,6.98,7.68,7.51,7.66,
+8.22,8.95,9.04,9.47,9.89,10.71,11.04,11.81,13.10,11.80,
+12.71,12.33,13.73,14.54,14.53,14.96,14.56,15.16,15.87,17.19,
+16.59,17.85,18.10,18.36,18.15,18.93,18.57,20.21,20.00,20.33,
+20.09,21.41,21.37,22.39,22.78,22.80,24.14,24.73,23.79,25.30,
+23.77,25.88,27.02,27.67,26.63,26.74,27.95,28.07,28.17,29.42,
+28.85,29.19,30.35,30.11,31.50,32.11,31.87,32.22,31.63,32.46,
+33.89,34.15,33.97,34.26,37.03,33.13,34.36,38.08,34.63,36.61,
+37.79,38.50,37.04,39.24,39.46,39.11,41.16,39.60,40.77,41.13,
+42.46,43.17,42.39,43.36,41.48,44.58,44.73,44.62,46.70,44.81,
+44.50,45.30,47.77,47.20,47.35,48.02,49.08,48.68,50.12,50.54,
+48.60,49.51,50.51,50.28,51.07,52.17,55.61,52.63,54.38,54.90,
+53.46,55.33,54.38,55.49,56.23,54.73,56.61,57.17,57.96,57.16,
+57.98,60.30,60.45,60.64,59.22,59.87,60.29,59.55,61.85,63.15,
+63.30,61.38,63.45,65.59,64.14,63.87,64.85,65.81,64.39,65.38,
+65.84,67.81,66.00,69.45,68.34,69.59,67.43,69.71,69.60,70.51,
+69.54,71.87,71.69,73.31,71.23,72.45,72.44,73.48,74.99,73.62,
+74.64,73.70,75.10,74.70,76.72,76.76,79.43,77.92,78.47,80.37,
+78.57,78.08,80.45,80.95,78.76,80.39,81.43,82.16,81.67,84.57,
+81.69,83.87,84.13,85.63,85.93,84.93,87.75,85.07,87.49,86.21,
+87.19,88.39,84.85,88.97,89.08,91.39,89.97,87.83,89.49,92.17,
+93.33,92.38,91.78,93.09,93.25,92.88,95.12,95.20,94.45,94.24,
+94.70,95.48,98.14,95.45,98.73,97.73,99.86,100.93,98.43,97.11,
+99.80,99.82,99.73,100.39,99.77,101.06,101.60,101.07,104.24,105.23,
+103.77,106.38,104.11,106.93,104.29,105.14,106.74,105.32,104.24,108.66,
+104.41,109.33,107.52,110.28,108.21,111.23,111.55,111.87,110.85,109.84,
+113.73,114.12,112.51,113.35,113.09,114.94,114.39,114.44,116.24,116.50,
+117.35,116.07,116.01,117.75,118.26,119.73,117.81,116.17,118.13,120.98,
+118.28,121.59,122.22,120.60,122.32,122.14,123.62,122.55,126.24,123.68,
+3.38,3.83,4.25,4.57,3.88,5.07,4.68,6.28,6.11,6.08,
+6.36,6.66,7.21,7.28,7.41,7.53,8.60,8.82,9.52,9.30,
+9.68,10.05,10.31,10.21,10.53,11.36,11.55,11.69,11.94,12.57,
+13.34,13.70,14.25,14.76,13.61,14.45,14.37,16.72,15.62,16.74,
+17.25,16.25,17.48,17.06,18.27,16.39,17.59,19.27,19.50,19.84,
+19.24,19.30,20.11,20.47,21.86,20.81,20.74,22.43,22.06,23.34,
+23.33,23.24,23.33,24.61,24.36,24.26,25.39,25.42,25.16,25.06,
+25.38,27.33,26.89,26.26,25.83,28.87,28.38,27.04,27.98,29.85,
+29.00,29.71,30.19,30.66,30.85,31.04,30.90,32.06,31.64,30.85,
+32.37,33.08,32.09,32.71,34.00,33.77,34.42,33.09,35.49,34.53,
+37.38,36.17,35.75,36.55,36.60,36.53,38.77,37.58,37.44,37.76,
+38.97,38.86,37.83,38.58,39.88,39.77,42.61,41.58,41.38,41.38,
+41.19,42.75,42.95,44.23,43.80,42.14,44.81,44.63,44.57,44.05,
+44.63,44.84,46.53,44.50,46.76,48.46,47.49,46.54,47.13,49.82,
+47.64,50.00,50.29,47.64,48.74,48.39,49.00,49.78,50.57,51.52,
+53.17,53.58,52.15,53.80,52.39,54.33,53.90,52.53,55.32,55.50,
+54.17,54.72,54.94,55.60,56.09,55.99,58.52,58.32,58.97,58.19,
+58.90,57.33,59.68,57.81,59.82,59.98,60.96,60.21,60.10,59.22,
+62.04,60.87,62.58,64.05,62.57,64.14,62.82,63.35,64.82,63.71,
+65.11,62.28,64.92,64.33,65.77,66.96,64.13,66.87,68.03,69.66,
+67.97,69.72,69.45,69.64,70.34,70.45,72.02,69.31,69.73,71.77,
+70.65,71.11,71.00,71.72,72.10,75.29,73.14,73.68,72.99,73.93,
+73.15,75.22,74.03,73.63,75.38,76.99,79.11,76.33,77.17,77.08,
+76.86,76.60,79.87,78.30,81.01,75.85,76.78,82.07,80.71,80.48,
+81.98,81.89,80.99,82.84,83.17,82.71,82.66,82.34,85.64,83.90,
+85.01,83.26,83.39,84.45,83.95,87.44,86.51,85.73,88.45,88.13,
+87.09,86.77,89.25,88.84,88.24,89.71,89.46,89.10,92.11,89.00,
+90.31,93.19,90.36,94.64,93.36,91.05,91.85,94.25,96.61,92.18,
+95.83,95.26,94.63,94.79,95.89,92.86,96.55,95.98,98.06,96.61,
+2.51,2.97,2.98,3.03,3.42,4.37,4.16,4.55,4.72,4.37,
+5.30,5.28,6.08,5.45,5.63,6.59,7.03,6.64,7.01,7.38,
+8.11,8.18,8.46,8.28,8.36,9.08,9.53,9.69,9.69,9.11,
+9.94,10.63,11.24,10.96,10.65,11.30,12.02,11.78,12.62,12.31,
+12.26,13.08,14.29,13.98,13.54,14.18,14.13,14.46,14.35,15.53,
+14.98,15.26,15.08,15.02,16.05,16.48,16.43,17.72,17.71,17.45,
+16.44,17.67,18.07,19.26,18.24,17.93,19.60,19.76,18.87,19.43,
+19.89,20.47,21.17,20.84,20.18,21.76,22.34,20.85,22.82,22.18,
+22.88,22.65,23.09,23.60,24.32,23.78,24.45,23.29,25.66,25.06,
+25.96,26.88,26.69,25.39,25.86,26.78,26.30,26.34,27.65,26.54,
+27.58,28.94,29.65,28.49,29.29,28.88,29.76,30.55,30.48,29.77,
+30.73,30.04,31.90,31.10,30.72,31.24,33.12,31.87,33.45,32.99,
+31.85,33.18,34.29,34.64,34.27,33.61,32.53,32.84,35.03,34.69,
+35.21,34.28,34.53,35.38,36.38,36.72,38.17,35.06,38.14,36.30,
+37.56,38.74,37.53,38.96,36.95,38.77,39.03,39.06,40.59,39.61,
+40.35,38.99,39.51,41.73,41.16,42.04,39.78,43.39,40.56,43.65,
+43.38,43.29,43.68,45.69,43.89,43.68,42.11,45.72,44.46,45.84,
+43.11,46.57,44.98,46.29,47.80,49.23,46.50,47.09,48.22,46.34,
+48.88,49.55,49.09,49.42,49.20,51.32,48.24,51.31,49.73,50.92,
+51.12,51.95,51.44,51.55,53.68,51.35,52.32,52.23,51.71,52.79,
+53.18,52.51,54.23,53.25,53.78,53.94,55.83,54.59,55.40,55.25,
+56.81,55.02,56.08,57.61,57.57,54.99,56.64,56.60,57.01,56.47,
+56.30,59.03,57.69,57.24,58.40,59.18,60.19,58.92,58.68,60.14,
+58.06,57.38,61.06,61.16,62.48,63.29,62.11,61.08,63.27,63.86,
+63.15,61.85,63.86,65.57,63.77,63.66,61.81,65.44,63.39,66.06,
+66.60,65.58,66.39,66.31,65.84,64.11,68.88,67.11,66.67,68.16,
+67.74,68.50,70.05,67.75,69.44,69.40,71.43,70.83,69.58,69.44,
+69.34,70.06,69.96,71.96,71.45,72.09,70.58,72.00,72.62,71.71,
+72.46,71.25,71.40,72.94,75.90,76.95,76.01,74.19,72.92,76.04,
+1.95,2.35,2.65,1.61,2.75,3.27,3.16,3.43,3.20,4.12,
+4.14,3.73,4.13,4.91,4.64,5.12,5.57,5.78,6.06,5.47,
+5.71,6.27,6.17,6.70,6.73,6.86,6.87,7.36,7.54,8.40,
+8.18,8.27,8.05,8.84,8.64,9.58,9.51,8.99,10.21,9.30,
+9.89,9.59,10.23,11.12,11.19,10.96,10.36,10.82,10.74,10.99,
+11.33,11.74,12.19,11.02,12.94,12.38,12.99,12.92,13.52,14.31,
+14.25,14.16,14.12,14.40,14.70,15.18,15.57,14.47,14.84,15.11,
+15.58,15.75,16.15,16.35,16.53,16.61,17.34,17.32,17.20,17.00,
+18.43,16.88,18.42,18.20,18.43,17.59,19.27,18.25,20.59,18.53,
+18.50,20.00,20.78,20.43,18.85,20.59,20.63,20.91,20.97,20.68,
+20.71,21.78,22.05,22.70,23.44,22.39,22.87,23.49,24.08,23.84,
+23.67,23.39,23.56,23.73,24.72,24.74,24.17,25.01,25.84,26.17,
+27.48,25.25,25.92,27.40,27.52,26.08,26.02,27.02,25.42,27.28,
+28.34,26.43,26.81,28.36,28.27,29.00,30.07,25.85,28.55,30.10,
+29.32,29.21,29.89,30.50,30.50,30.68,28.77,30.39,32.39,30.00,
+31.04,31.05,31.06,31.33,32.52,33.99,32.68,31.63,31.99,33.23,
+33.71,32.95,34.00,33.48,33.51,34.51,34.92,35.44,34.99,36.21,
+35.02,34.07,35.45,35.85,35.79,36.06,36.75,36.04,37.58,36.72,
+36.69,38.12,36.27,36.05,38.34,39.14,38.44,36.96,37.53,37.88,
+38.51,40.80,39.98,39.80,41.31,39.85,40.48,40.30,41.16,39.86,
+42.15,40.76,42.47,40.67,43.27,43.16,42.86,41.03,44.69,42.81,
+43.40,41.98,44.91,43.65,43.09,43.48,44.27,43.95,46.26,42.61,
+43.71,43.44,45.22,46.92,45.44,44.88,45.47,45.55,45.74,46.69,
+47.14,46.46,46.87,48.22,49.34,46.33,48.16,46.90,47.60,48.56,
+47.90,49.07,48.83,49.01,49.33,50.20,48.69,50.55,49.99,50.07,
+49.48,51.19,51.00,51.12,50.07,52.08,52.30,51.60,51.31,54.37,
+51.53,52.82,52.54,50.38,53.74,52.50,54.83,53.98,52.87,55.87,
+54.40,55.12,54.59,57.02,55.01,55.51,56.43,55.55,56.48,57.18,
+56.27,55.30,57.73,56.01,57.82,59.04,55.92,57.14,57.90,58.79,
+1.41,1.57,2.15,1.96,2.31,2.33,2.57,2.40,2.65,3.30,
+3.29,3.12,3.22,3.79,3.74,4.19,3.60,4.14,4.44,5.17,
+4.81,4.56,4.58,4.98,4.88,5.62,4.73,5.89,5.70,5.96,
+5.48,6.26,6.20,7.19,6.38,6.44,7.21,7.39,7.44,7.22,
+7.68,7.90,7.76,7.63,8.86,7.75,8.33,7.78,8.66,8.65,
+8.04,9.39,10.35,9.91,9.47,9.77,10.94,10.56,10.99,10.32,
+10.74,10.88,11.49,10.64,11.43,10.86,11.48,11.49,11.79,12.29,
+13.18,11.72,12.38,12.51,13.17,13.12,13.55,13.64,13.30,13.73,
+12.92,13.84,14.10,14.21,14.14,13.32,14.94,14.34,15.20,15.33,
+14.72,14.65,16.30,15.65,16.28,16.76,16.74,15.40,16.35,16.70,
+18.14,17.04,16.74,17.42,16.99,16.30,17.04,17.58,18.85,17.83,
+19.34,19.04,17.39,18.81,17.63,19.34,19.16,18.43,19.83,18.65,
+18.71,20.26,20.87,19.04,19.72,20.73,20.02,21.17,20.66,20.69,
+21.24,21.00,20.61,21.70,21.13,21.30,20.78,22.22,23.09,23.61,
+22.76,22.41,23.76,22.80,23.30,22.45,23.72,23.64,23.92,24.40,
+24.10,25.08,24.69,24.08,26.36,25.51,26.18,24.67,26.09,26.31,
+25.20,25.07,26.33,26.26,24.96,25.60,26.49,26.25,26.70,26.81,
+26.75,27.11,27.49,28.12,28.43,28.11,27.57,26.86,28.91,29.71,
+27.03,28.73,28.83,29.37,28.76,28.96,29.91,28.39,30.32,29.46,
+29.78,30.83,31.89,31.00,32.47,31.71,32.07,30.94,31.15,31.92,
+30.87,30.02,31.78,32.04,32.46,32.95,33.30,31.66,33.74,32.49,
+32.04,32.96,33.80,34.98,34.45,34.62,34.80,33.28,33.87,33.73,
+34.74,35.36,33.66,33.89,35.45,36.05,35.43,36.70,35.96,34.98,
+36.05,37.44,36.48,36.35,37.09,37.80,37.83,39.01,37.80,38.52,
+36.39,37.48,37.03,36.45,40.29,38.37,40.16,39.77,40.03,39.86,
+38.13,38.95,38.97,41.38,38.08,41.14,41.23,41.73,41.11,42.00,
+40.72,40.80,40.05,41.77,42.05,40.74,41.36,40.78,43.83,40.39,
+41.63,41.94,42.84,43.51,41.77,42.77,42.68,42.84,43.53,41.70,
+44.84,44.03,43.43,43.65,45.15,44.95,43.59,45.14,46.04,45.51,
+1.04,1.69,1.60,1.40,1.86,1.79,1.61,1.77,2.43,2.53,
+2.33,2.32,2.62,2.93,2.98,2.79,2.99,3.71,3.78,3.40,
+3.62,3.38,4.01,4.33,3.86,4.14,4.54,3.84,4.58,5.02,
+4.78,4.88,5.04,5.00,5.10,5.43,5.47,5.65,5.39,6.15,
+6.29,5.80,6.22,6.94,5.62,6.02,5.97,6.40,6.82,7.82,
+6.80,7.11,7.78,6.59,7.04,7.72,7.19,7.48,8.06,8.79,
+8.51,8.86,7.88,9.15,8.85,8.49,8.72,9.06,8.23,9.15,
+9.23,9.54,10.38,10.52,9.78,9.21,10.53,10.26,10.62,10.80,
+10.39,10.91,10.73,10.44,11.54,11.76,11.28,10.15,11.95,11.28,
+11.18,11.01,12.15,10.61,12.56,12.01,12.01,12.25,12.15,12.80,
+13.29,12.04,12.65,12.75,13.66,12.98,14.46,13.83,12.65,13.60,
+13.41,13.72,13.74,13.52,13.65,15.19,15.08,14.69,14.24,15.15,
+15.04,15.43,15.09,15.73,15.43,15.15,16.07,15.09,16.20,16.46,
+17.94,16.27,16.78,16.73,16.05,16.30,16.41,16.87,18.67,16.97,
+17.08,16.87,17.06,17.73,18.01,18.97,17.19,17.92,19.33,19.38,
+18.38,18.99,17.47,19.64,19.32,18.28,19.44,20.30,19.41,18.69,
+19.58,19.64,19.41,19.59,20.72,20.22,19.73,20.36,19.12,21.59,
+20.59,21.98,20.68,22.18,21.89,21.77,21.49,21.14,20.15,21.15,
+23.32,22.36,22.51,22.11,22.29,22.59,21.66,23.80,23.55,24.06,
+23.00,22.35,22.82,24.52,24.10,25.31,24.42,24.26,23.50,24.76,
+25.08,24.79,23.71,25.25,23.74,24.74,24.21,26.31,25.97,26.58,
+25.72,27.10,26.39,25.27,25.29,25.18,26.59,26.65,25.58,27.94,
+26.07,27.45,26.41,26.78,26.48,28.86,28.49,27.04,27.25,27.54,
+27.82,27.80,29.17,30.42,27.98,28.68,27.11,28.50,28.55,29.05,
+30.10,30.82,28.28,29.09,29.92,28.53,29.20,30.22,30.55,29.04,
+30.76,29.70,30.73,28.91,30.67,30.97,31.31,31.20,30.46,32.09,
+32.59,30.92,31.12,31.43,31.25,32.63,32.09,30.38,32.93,33.22,
+31.13,33.89,32.99,33.32,31.71,34.27,31.64,33.80,34.54,32.96,
+32.32,35.08,35.13,33.68,33.85,34.91,33.37,33.52,35.87,33.56,
+0.82,1.21,1.14,1.41,1.32,1.54,1.49,1.80,1.42,1.67,
+1.72,2.29,2.31,2.00,1.82,2.14,2.41,2.52,2.46,2.79,
+2.25,2.79,3.03,3.27,3.06,3.13,3.41,3.16,3.69,3.54,
+3.43,3.92,3.63,4.31,4.08,3.81,4.07,4.02,3.96,4.76,
+4.64,5.58,5.14,3.86,4.67,4.96,4.89,5.58,4.76,5.28,
+5.21,5.44,5.51,5.76,5.96,5.74,6.20,5.84,5.96,5.70,
+6.02,6.78,6.70,6.58,7.04,6.76,7.70,6.99,6.94,7.02,
+7.24,7.68,6.60,7.88,8.37,7.37,8.42,7.68,7.15,7.52,
+7.19,8.11,7.77,7.85,7.34,8.90,8.30,9.00,8.86,9.22,
+8.98,9.50,9.81,8.99,9.18,9.32,9.61,10.65,9.85,9.22,
+9.53,10.86,9.91,9.76,10.48,10.28,10.61,10.75,11.05,10.59,
+10.08,10.83,10.75,11.59,11.43,11.32,11.41,12.09,11.63,10.56,
+11.03,11.80,12.43,12.12,13.33,11.91,12.16,12.70,12.39,11.98,
+13.21,12.94,13.30,12.15,13.17,13.22,12.88,13.27,12.88,14.30,
+13.47,12.72,12.91,14.13,13.61,13.97,13.83,14.04,14.88,14.15,
+14.72,14.02,13.60,14.41,15.23,15.47,15.51,14.93,15.84,15.99,
+15.87,16.16,15.25,15.72,15.74,15.42,16.87,15.82,14.16,16.29,
+16.15,16.34,15.83,17.57,16.47,16.65,16.76,16.88,17.49,16.55,
+16.19,16.24,17.50,18.05,17.47,17.18,18.41,15.94,18.46,17.43,
+17.92,17.67,18.21,18.57,18.60,17.79,18.56,18.98,17.99,18.55,
+19.07,19.19,18.71,17.76,19.73,19.21,19.32,19.47,19.60,19.57,
+19.94,19.52,20.39,20.23,19.41,19.45,19.92,20.53,20.57,19.66,
+20.10,18.99,21.32,21.75,22.39,22.23,22.01,20.46,21.30,21.15,
+21.33,24.27,21.56,22.42,22.48,22.06,21.99,22.17,21.43,22.11,
+22.80,22.67,23.11,22.35,21.45,22.38,24.30,23.51,24.00,22.20,
+24.51,23.03,24.43,23.64,23.64,24.28,23.84,22.87,24.11,25.22,
+23.59,25.07,24.10,25.26,23.77,25.41,24.64,24.18,26.31,24.36,
+25.26,24.53,25.53,26.76,25.18,26.11,24.75,25.75,26.11,25.60,
+26.40,27.97,26.89,26.21,25.84,25.32,25.82,27.76,27.43,28.15,
+0.69,0.84,0.79,1.16,1.08,1.00,1.19,1.08,1.39,1.17,
+1.52,1.30,1.84,1.44,1.79,1.46,1.40,1.86,1.90,2.15,
+2.15,2.60,2.10,2.17,2.21,2.72,2.50,2.52,2.81,3.04,
+2.67,2.74,2.55,3.68,2.69,2.91,2.84,3.31,2.97,3.47,
+3.27,3.53,3.51,3.75,4.06,3.41,3.97,4.30,4.10,4.09,
+4.12,3.84,4.01,4.66,4.54,4.83,4.62,4.58,4.94,4.32,
+4.89,4.42,4.57,5.64,4.79,5.92,5.58,5.73,5.09,5.30,
+5.70,5.25,5.34,5.99,5.09,5.71,6.68,6.06,6.02,6.52,
+7.58,6.50,6.51,6.36,6.64,5.58,6.80,6.58,7.39,6.66,
+6.39,6.83,5.99,6.50,7.70,6.80,7.19,7.30,7.30,7.07,
+7.04,6.89,7.26,8.14,8.51,8.69,9.04,7.64,8.29,8.95,
+8.38,8.53,8.53,9.46,7.99,8.75,8.76,8.60,8.61,8.81,
+9.03,8.11,9.55,8.89,9.21,10.25,9.64,9.93,9.49,9.72,
+10.05,10.19,9.65,9.75,9.29,9.37,9.93,9.72,10.13,10.03,
+10.17,10.87,10.39,10.50,10.51,10.10,10.82,10.87,11.21,11.01,
+11.55,12.24,10.59,11.02,11.93,10.48,11.12,11.72,11.98,10.62,
+11.30,12.09,12.74,10.48,12.87,11.45,12.54,13.50,12.65,12.23,
+11.91,13.62,12.66,12.43,13.00,12.64,13.30,13.43,13.10,13.39,
+12.40,13.15,12.93,13.49,13.07,14.02,12.85,13.60,12.70,12.73,
+13.62,14.10,14.07,14.35,14.04,14.89,14.05,14.19,14.11,13.60,
+13.81,14.03,13.86,15.39,14.22,15.79,15.46,13.44,15.19,15.11,
+15.94,14.84,17.38,14.13,15.52,15.48,15.70,14.83,16.32,15.75,
+15.64,15.71,16.25,15.99,16.44,16.02,16.72,17.50,15.87,16.39,
+17.41,16.41,18.75,17.10,17.15,16.97,18.05,16.64,18.00,16.77,
+18.17,17.21,18.14,17.27,17.80,17.96,18.33,17.01,18.13,17.89,
+16.57,17.95,17.80,18.68,18.03,18.93,19.13,18.10,18.12,18.29,
+18.31,18.24,18.94,19.45,18.84,18.67,18.18,19.37,19.21,18.33,
+19.41,19.84,19.61,19.55,18.47,18.06,19.80,19.52,19.47,21.14,
+21.33,20.14,19.03,19.68,21.46,19.76,20.22,19.95,20.56,20.24,
+0.60,0.45,0.55,0.50,0.96,0.86,0.71,1.09,0.96,0.97,
+1.04,1.10,1.24,0.89,0.97,1.57,1.21,1.70,1.62,1.52,
+1.66,1.42,1.93,1.94,1.64,1.51,1.78,2.03,2.43,2.18,
+2.36,2.31,2.05,2.14,1.79,2.13,2.51,2.33,2.63,2.71,
+2.32,2.10,2.37,3.22,2.91,2.77,3.24,2.67,2.87,3.09,
+3.35,3.48,2.89,3.88,2.68,2.94,3.59,3.78,3.46,3.77,
+4.07,3.67,4.06,3.95,4.58,3.67,3.82,3.32,3.43,5.02,
+4.36,4.55,4.85,4.95,4.35,4.26,5.31,4.54,4.80,4.71,
+4.54,4.77,4.71,4.47,5.25,5.00,5.02,4.70,5.36,5.72,
+5.54,5.28,5.63,4.58,5.26,5.87,5.59,4.66,5.44,6.45,
+5.10,5.46,5.29,5.43,6.99,6.14,6.54,5.69,6.42,6.03,
+6.22,6.41,6.82,6.19,6.52,6.44,6.15,7.27,6.66,6.81,
+6.54,6.65,7.75,6.37,7.45,6.76,6.52,7.23,6.66,7.08,
+6.67,6.58,8.05,7.48,7.23,7.32,8.47,8.08,7.28,7.48,
+8.41,8.21,7.82,7.32,8.08,8.70,8.74,8.52,8.68,8.48,
+7.90,8.79,7.66,8.43,8.67,8.95,9.89,8.95,9.24,10.03,
+9.11,9.75,8.88,8.84,8.62,8.89,9.84,10.10,8.62,9.88,
+10.08,9.28,9.60,9.61,9.69,9.75,10.44,9.77,9.51,9.60,
+10.64,10.62,10.60,10.39,10.08,9.76,10.03,10.48,11.36,10.59,
+10.43,10.84,11.14,11.18,12.20,11.09,10.38,10.79,10.33,11.85,
+10.80,10.47,10.72,10.88,11.39,11.94,11.65,12.56,11.21,11.96,
+11.79,11.71,11.43,11.43,11.86,12.46,11.91,11.99,12.74,11.29,
+12.09,12.87,11.28,11.75,13.53,12.54,13.44,12.43,13.84,12.65,
+12.86,12.48,12.47,12.24,12.50,12.47,12.41,13.22,13.58,12.68,
+13.68,12.59,14.00,13.52,14.20,12.79,13.90,14.42,13.15,13.42,
+14.67,14.16,13.00,12.93,14.07,13.74,14.62,14.87,14.04,14.31,
+15.06,13.04,14.42,13.45,14.93,15.64,14.90,14.55,13.79,15.55,
+14.64,15.47,15.13,15.26,14.12,15.28,15.84,15.14,15.71,15.07,
+15.35,14.14,15.02,15.40,15.13,15.79,16.14,14.80,15.40,14.94,
+20.18,21.79,23.39,26.60,28.32,29.88,31.47,34.71,35.45,36.84,
+38.98,42.29,42.57,45.60,47.61,50.38,49.98,53.72,56.34,56.57,
+59.37,61.22,63.22,65.02,66.35,68.55,70.40,74.00,74.99,75.89,
+79.88,80.11,81.48,84.17,84.70,89.40,90.34,91.04,93.31,95.17,
+97.39,97.60,102.47,102.36,105.74,104.62,108.06,111.95,113.20,116.19,
+117.56,119.67,118.43,122.10,124.08,127.42,126.76,129.40,132.48,133.84,
+134.60,137.97,140.90,144.16,146.16,146.24,146.80,149.70,153.31,152.02,
+154.08,157.02,158.86,160.11,166.40,166.49,169.47,169.16,171.43,173.62,
+174.23,174.70,180.98,181.24,184.55,184.34,186.02,189.76,191.92,193.20,
+193.77,197.36,199.83,200.76,202.93,204.39,206.43,207.64,208.46,215.18,
+215.47,216.39,215.81,218.74,219.83,221.81,228.85,229.63,228.26,229.50,
+234.88,235.70,237.83,240.18,239.28,245.38,248.98,248.69,250.77,253.30,
+252.77,254.14,259.96,257.99,260.20,260.96,265.92,266.90,269.46,269.55,
+273.18,271.75,274.67,277.11,281.34,283.76,284.06,285.40,286.91,288.00,
+289.43,292.06,295.79,296.99,298.50,302.97,305.31,306.08,308.30,307.94,
+308.62,309.60,315.77,318.18,318.41,320.47,319.86,328.18,331.06,326.21,
+330.86,330.40,338.02,337.17,336.43,340.40,342.24,343.18,348.91,347.82,
+349.38,347.02,352.04,357.77,358.84,359.55,361.13,364.21,364.95,366.76,
+371.12,369.71,372.68,374.29,377.75,376.27,380.24,384.03,381.69,383.93,
+383.95,389.36,386.74,391.56,393.21,399.77,398.17,403.56,403.38,409.02,
+408.41,409.20,410.96,412.95,416.04,419.97,417.66,423.01,425.55,426.61,
+428.76,432.40,430.15,433.68,434.16,435.97,438.39,439.47,444.38,446.54,
+445.17,448.10,450.25,450.31,452.80,457.63,459.84,456.83,461.91,464.10,
+465.19,469.32,470.13,470.46,475.01,475.59,477.44,476.93,480.78,483.62,
+485.59,485.94,493.12,491.13,493.60,494.80,497.45,498.97,506.87,501.04,
+506.44,498.28,511.71,505.73,514.33,513.61,515.22,517.39,519.24,521.66,
+526.90,525.09,529.77,527.44,530.04,534.26,535.76,538.50,540.29,545.85,
+541.24,545.06,541.93,548.43,548.87,553.33,551.74,556.75,555.43,559.84,
+562.82,560.19,564.53,570.72,567.97,567.84,579.26,576.61,577.31,582.09,
+16.09,17.69,19.14,20.38,23.14,24.16,25.39,26.88,28.95,29.44,
+30.83,33.98,35.64,35.92,37.76,39.25,42.70,42.87,44.15,45.57,
+46.90,47.90,52.07,51.06,53.61,55.45,57.13,57.79,60.25,60.29,
+63.56,65.60,67.09,67.95,70.49,71.15,71.64,73.61,75.28,76.16,
+78.38,80.13,83.60,83.14,84.97,85.65,88.85,90.30,92.26,91.40,
+93.62,96.63,96.98,100.60,100.61,101.74,104.79,105.44,106.20,108.60,
+110.77,112.80,111.90,115.66,115.05,117.63,120.58,119.61,122.20,125.65,
+124.64,129.70,129.80,131.74,131.10,132.55,133.19,137.96,136.21,138.69,
+141.29,142.45,146.52,145.80,149.54,148.97,149.88,151.08,152.99,157.06,
+156.83,159.57,159.59,160.13,163.51,165.63,168.80,168.15,168.35,173.11,
+173.05,171.54,175.29,175.77,178.55,179.97,181.95,184.01,187.63,186.13,
+188.76,188.71,190.31,193.33,195.83,193.73,197.28,193.45,197.84,203.56,
+202.35,205.59,206.55,208.90,209.86,213.28,212.19,213.98,216.31,217.53,
+220.27,221.56,220.33,220.93,228.16,227.98,230.32,231.20,232.67,238.01,
+232.52,234.79,236.89,241.23,242.08,241.62,243.65,245.85,246.04,249.52,
+249.49,251.98,252.84,258.05,253.01,258.27,261.07,259.30,263.86,263.45,
+266.27,268.90,267.33,272.79,273.11,274.79,274.79,276.89,278.06,280.57,
+281.51,286.92,284.90,285.09,288.99,290.46,289.71,293.42,297.83,295.94,
+294.36,300.94,302.19,301.94,303.29,307.01,306.85,306.75,308.39,310.19,
+313.86,311.39,316.59,317.82,323.95,327.24,320.85,323.59,326.31,330.04,
+326.90,332.02,332.45,330.86,335.30,336.17,339.07,337.19,344.49,342.72,
+346.69,349.63,345.34,352.33,352.72,351.04,354.33,358.32,356.87,361.11,
+362.64,361.56,361.32,364.42,368.80,367.00,372.81,374.45,371.14,375.65,
+375.34,379.92,381.03,382.82,383.12,381.39,384.01,389.34,389.60,393.45,
+390.76,392.87,398.26,394.57,400.29,396.36,400.31,400.45,406.40,404.31,
+407.01,404.83,408.18,413.86,410.45,414.72,414.75,419.60,417.86,421.06,
+421.46,424.74,428.88,426.54,432.60,429.45,435.65,432.40,438.33,437.18,
+438.56,441.47,442.25,444.64,442.46,448.28,449.09,456.23,454.79,453.16,
+455.05,457.55,459.53,460.32,461.48,460.08,462.03,464.73,465.16,470.67,
+13.27,14.63,15.42,17.19,16.97,19.15,20.62,22.02,23.32,24.34,
+26.02,26.52,28.67,28.97,30.27,31.88,33.02,34.78,36.46,37.55,
+38.05,38.90,39.92,41.74,43.74,45.26,46.89,46.42,48.92,48.96,
+50.48,52.78,53.39,54.27,57.03,57.13,58.02,59.12,60.85,61.66,
+63.18,64.51,67.35,66.81,68.59,69.71,71.80,71.36,74.06,76.39,
+76.30,76.65,79.40,80.97,80.90,82.06,83.89,84.33,84.28,87.86,
+86.55,89.69,90.90,93.14,92.99,91.21,96.66,99.55,98.70,98.45,
+101.62,100.56,105.59,104.15,103.76,106.73,109.18,109.74,111.44,112.97,
+114.18,114.33,116.41,118.17,117.07,119.98,120.50,121.29,124.28,125.19,
+126.40,127.69,128.24,129.95,130.93,129.73,135.35,137.85,135.88,139.10,
+136.87,138.96,142.56,140.84,148.48,147.05,148.49,145.84,148.65,148.20,
+152.72,151.05,154.06,155.93,156.82,156.63,159.75,158.73,159.35,164.12,
+166.68,167.79,167.59,168.62,171.16,168.45,173.50,172.96,175.31,175.57,
+175.13,179.02,180.37,181.07,180.76,183.40,183.75,184.35,185.90,187.04,
+190.77,190.38,190.78,190.52,194.28,196.05,198.93,198.09,202.48,204.45,
+200.87,201.06,204.56,204.35,203.26,208.24,208.46,207.86,217.27,211.78,
+217.77,215.53,215.96,214.94,216.30,220.35,222.27,224.55,224.47,225.65,
+228.22,225.87,228.66,226.80,229.57,233.57,233.42,238.18,237.66,235.42,
+237.11,239.96,244.47,242.40,247.73,247.23,246.49,249.80,249.29,252.71,
+255.53,254.12,255.20,257.15,253.33,260.39,259.73,260.00,259.39,262.96,
+261.93,266.62,263.13,270.71,271.42,268.17,270.84,272.82,273.62,274.58,
+275.29,276.78,279.26,278.25,283.04,283.25,286.73,285.00,288.50,289.13,
+292.99,291.39,290.20,288.24,296.44,293.63,295.13,297.27,301.52,302.32,
+300.51,301.91,302.29,302.11,306.30,310.73,311.91,310.55,315.39,313.98,
+314.97,316.59,317.98,317.58,319.17,321.64,322.70,323.44,325.23,325.37,
+327.68,327.05,327.82,333.05,328.90,330.58,335.33,337.93,338.94,336.47,
+339.37,340.21,342.95,343.98,346.59,346.53,346.09,349.39,350.35,350.20,
+354.15,352.90,354.99,359.04,359.93,356.79,355.65,361.37,362.29,366.78,
+369.66,372.22,366.88,368.25,370.92,372.70,373.12,376.37,369.75,378.89,
+10.59,11.79,12.91,13.80,14.19,15.61,16.62,17.35,17.28,19.16,
+20.58,21.49,22.21,22.36,25.31,25.89,27.29,26.70,28.06,29.18,
+30.20,31.84,32.64,34.53,34.54,35.92,36.67,37.02,38.97,39.53,
+40.23,42.11,42.52,44.30,43.46,45.16,47.23,47.37,49.23,49.16,
+50.50,51.82,52.41,53.16,53.59,56.80,56.49,57.10,59.74,59.06,
+61.86,63.09,62.64,64.33,63.77,64.95,67.00,66.45,67.98,71.71,
+68.55,70.76,71.89,73.18,76.23,76.19,75.77,78.96,78.89,82.57,
+82.74,81.18,83.75,84.27,83.34,85.75,87.96,87.80,90.03,89.04,
+91.81,92.56,92.76,93.66,94.16,95.38,95.59,97.71,99.81,99.91,
+100.37,100.97,103.83,103.69,105.95,108.21,106.53,108.33,108.18,108.57,
+111.34,110.39,112.45,114.19,113.30,116.98,119.55,119.59,118.81,120.58,
+119.86,123.42,123.21,123.65,121.33,125.76,126.79,126.14,129.15,129.02,
+130.32,132.24,129.75,135.34,135.10,136.02,136.94,139.37,141.14,140.81,
+141.35,143.37,144.04,144.09,143.37,146.45,145.32,147.48,148.51,155.38,
+151.82,151.83,151.19,155.06,155.03,156.23,155.16,157.75,156.97,160.50,
+159.76,161.36,162.63,163.47,162.78,165.59,168.36,166.91,170.55,170.09,
+169.10,174.37,171.74,173.99,177.69,177.68,177.89,180.21,179.11,183.88,
+179.75,183.25,182.23,183.42,184.45,183.82,185.88,191.30,186.42,190.32,
+192.01,192.16,195.19,194.76,196.80,193.92,199.18,196.91,200.62,203.27,
+202.08,203.18,204.90,205.53,205.14,206.75,209.23,208.12,210.48,209.67,
+210.21,212.39,214.75,220.15,214.55,218.58,220.21,219.97,217.97,220.23,
+221.22,222.04,219.05,225.54,224.96,224.50,229.06,226.84,229.89,231.17,
+231.18,230.24,233.86,238.22,233.95,238.08,235.65,239.78,242.14,243.64,
+242.48,242.45,245.74,244.53,249.11,246.92,249.14,248.49,250.47,247.74,
+251.73,256.07,254.00,253.70,252.21,259.74,259.22,259.45,258.04,260.16,
+263.65,261.74,264.18,267.28,262.82,269.57,266.51,270.50,273.42,273.66,
+274.31,274.92,274.73,275.67,276.60,272.43,279.99,279.04,278.98,282.27,
+282.39,278.79,285.59,285.55,284.15,290.72,284.51,289.37,294.10,290.95,
+292.88,294.61,297.30,294.66,298.58,299.54,299.75,299.26,306.97,300.42,
+8.38,9.14,9.99,11.26,12.18,13.33,12.30,13.50,14.39,15.36,
+16.13,16.98,17.37,18.35,19.45,21.03,20.61,20.84,23.49,24.04,
+24.36,26.31,26.53,27.18,27.42,28.59,28.76,29.78,31.19,30.75,
+32.10,33.24,34.03,34.83,36.82,35.72,36.83,37.62,40.24,40.41,
+40.05,41.55,42.70,44.84,44.69,42.90,45.85,46.82,47.13,48.41,
+48.59,48.57,49.54,51.97,51.44,53.92,53.13,54.03,54.00,56.10,
+56.11,57.56,59.32,58.86,59.45,59.98,60.89,61.65,59.93,61.73,
+65.42,64.92,66.12,64.41,67.08,68.14,68.39,69.46,70.07,70.96,
+72.61,72.22,73.84,74.22,74.68,76.10,76.78,79.46,80.29,79.22,
+80.22,80.82,82.21,83.01,84.77,86.53,86.66,86.14,88.55,88.05,
+86.71,89.45,90.95,89.63,93.98,91.81,93.33,94.73,96.04,96.11,
+97.23,96.17,97.77,100.13,100.69,100.24,101.17,103.23,103.18,106.79,
+105.75,105.59,105.94,107.40,109.82,105.94,111.00,109.79,110.02,112.25,
+114.34,112.70,109.62,114.22,115.99,114.65,119.16,118.71,118.97,120.88,
+119.36,121.48,122.57,122.60,122.76,124.37,124.52,124.46,127.96,128.85,
+130.01,130.48,132.10,130.59,130.97,132.41,133.24,133.76,134.37,135.26,
+133.92,138.71,135.94,140.43,140.35,140.49,140.48,142.16,145.42,142.07,
+142.95,144.78,143.50,147.42,149.19,147.10,150.75,150.68,148.35,150.27,
+153.87,151.02,155.56,154.84,156.12,156.69,159.82,157.17,161.12,161.38,
+162.36,162.23,162.88,164.31,162.06,167.80,165.05,168.41,166.24,169.29,
+167.29,168.54,166.90,171.38,170.63,174.21,175.78,172.13,175.38,177.62,
+178.48,177.32,176.61,178.29,177.80,181.35,178.54,183.75,181.48,184.40,
+187.96,189.11,183.51,186.82,190.52,187.33,190.83,190.57,190.45,191.09,
+190.73,193.09,195.54,191.91,198.65,197.92,198.70,199.69,196.82,196.67,
+202.49,201.74,201.16,203.70,203.64,206.75,205.59,205.70,208.31,207.68,
+210.02,209.28,211.73,212.82,207.77,212.55,212.88,214.40,215.16,215.73,
+220.06,215.47,219.36,217.49,218.46,220.53,222.05,222.72,222.76,222.48,
+227.64,224.16,227.60,227.46,230.49,227.59,230.51,229.97,227.49,231.88,
+229.13,233.99,232.03,237.74,235.81,236.24,240.16,236.50,238.23,240.19,
+6.63,7.09,7.96,7.87,8.88,10.17,10.79,10.75,11.70,13.06,
+13.77,13.48,14.98,14.06,16.07,15.90,16.13,16.53,17.68,18.88,
+19.72,19.96,20.91,22.02,21.78,21.73,22.98,23.69,24.04,25.46,
+25.59,27.28,26.33,27.24,27.71,28.88,30.92,29.23,30.33,31.75,
+32.34,32.96,32.93,33.41,33.94,34.20,35.59,36.41,38.94,37.52,
+38.02,38.78,39.27,40.29,42.33,41.09,42.15,42.82,44.38,43.94,
+44.78,45.25,46.10,47.20,47.86,48.42,48.87,51.04,49.49,48.82,
+50.99,52.26,50.39,51.82,54.40,54.73,55.13,56.90,56.37,57.27,
+58.21,58.82,58.68,59.93,59.06,59.97,62.05,61.46,62.58,63.58,
+64.83,64.07,64.46,66.35,66.07,64.52,64.66,67.53,67.96,68.75,
+69.86,70.12,71.62,70.40,72.87,73.49,72.92,73.62,74.34,76.14,
+76.27,77.37,78.66,77.26,79.88,80.73,81.13,81.29,81.00,82.22,
+84.49,83.09,82.36,87.51,85.12,86.64,85.85,86.75,88.66,88.08,
+89.13,87.97,95.22,91.91,90.12,95.21,93.42,93.33,96.17,95.55,
+95.92,95.92,95.98,99.17,98.05,98.61,98.10,99.91,99.52,101.41,
+99.52,104.36,103.00,104.22,102.52,105.62,106.08,105.57,105.93,109.80,
+107.23,108.07,110.35,107.40,109.82,110.88,110.75,110.58,113.72,112.61,
+112.99,116.75,113.37,116.16,120.06,117.91,121.08,119.29,120.81,121.53,
+121.47,120.99,123.80,122.45,123.05,124.49,125.27,125.49,128.04,129.74,
+128.50,126.67,127.19,128.57,131.51,131.58,130.98,133.71,132.41,134.32,
+130.74,134.83,133.88,138.08,136.14,135.37,136.22,137.30,138.37,140.43,
+138.68,139.24,141.88,142.63,140.63,143.81,144.44,141.83,146.66,146.04,
+145.95,148.71,147.14,148.97,147.51,149.01,150.97,151.00,150.79,155.28,
+153.81,155.90,155.31,154.43,154.62,157.74,155.38,157.70,160.54,157.12,
+159.01,162.19,161.00,162.63,161.11,161.81,165.04,164.80,166.00,165.06,
+167.36,166.53,168.44,167.17,166.53,168.94,167.35,171.17,169.00,172.17,
+173.97,169.75,175.24,174.61,176.25,174.32,177.07,172.72,180.35,178.80,
+177.37,178.20,179.56,180.35,183.46,182.47,181.84,181.59,183.47,184.56,
+184.26,186.07,185.62,184.11,189.58,188.34,187.75,194.25,189.89,192.51,
+5.05,5.43,6.57,6.80,7.83,8.03,7.86,9.23,9.24,9.70,
+10.06,10.81,10.19,11.81,12.23,12.72,13.54,13.71,14.42,15.45,
+14.98,16.39,16.35,14.78,19.17,18.08,18.60,18.76,18.97,19.95,
+20.57,20.19,21.83,21.25,22.82,23.12,23.33,25.51,24.68,24.65,
+24.74,25.88,25.46,27.39,26.85,27.95,29.04,29.93,29.29,29.98,
+31.58,31.59,32.98,32.28,31.85,33.77,32.92,34.57,34.72,34.52,
+35.77,34.33,35.35,35.73,37.59,37.34,38.16,38.51,40.41,41.69,
+40.83,41.72,41.95,42.26,43.30,41.84,44.60,45.04,43.14,45.65,
+46.02,46.14,47.32,46.36,48.44,47.35,50.72,48.73,49.25,51.04,
+49.33,51.83,52.21,52.59,51.74,53.52,53.57,52.80,53.04,54.03,
+55.02,54.38,56.98,56.53,58.32,59.64,59.97,60.56,57.28,59.46,
+60.68,59.69,60.90,62.34,63.98,62.93,63.77,63.41,65.42,64.87,
+65.99,66.78,67.38,68.14,68.89,67.60,68.97,67.23,68.70,70.31,
+70.09,70.27,71.34,72.20,74.32,73.43,73.34,74.62,73.50,74.34,
+74.69,77.87,77.08,77.20,76.24,78.64,79.18,78.06,79.79,80.92,
+81.92,80.73,82.16,80.66,81.78,83.72,83.45,84.17,85.63,83.26,
+86.24,88.32,87.68,88.83,86.58,90.60,87.63,88.84,90.20,90.94,
+89.93,91.40,94.56,92.24,94.52,93.13,94.54,96.02,92.67,93.42,
+94.48,94.48,98.97,96.54,96.28,97.39,98.47,100.27,97.82,101.75,
+101.17,102.47,101.94,103.75,101.28,105.73,105.52,103.21,103.78,105.36,
+107.32,105.88,104.96,107.18,111.54,107.82,109.27,110.03,107.86,107.77,
+112.89,110.20,110.27,113.54,113.40,112.90,113.10,113.00,116.73,115.53,
+118.63,117.98,119.20,117.62,117.60,119.91,122.15,116.66,116.22,119.50,
+120.62,121.25,122.17,121.79,125.02,122.21,125.72,126.25,129.09,127.58,
+123.86,127.24,127.66,124.60,127.52,128.49,127.40,133.21,129.28,130.97,
+131.38,131.08,133.10,132.06,131.91,136.19,132.38,133.43,135.63,134.41,
+134.83,136.51,138.66,137.44,135.46,139.89,142.72,138.95,140.08,142.13,
+143.20,138.47,141.95,142.17,140.78,144.29,145.41,145.14,146.80,147.27,
+150.25,145.80,147.82,149.81,147.97,149.97,146.81,148.43,148.61,150.37,
+4.47,4.15,5.03,5.13,5.16,6.66,6.32,6.91,7.19,7.82,
+8.37,8.85,8.43,9.68,9.78,10.69,10.74,11.05,11.37,11.51,
+12.31,12.95,13.38,13.91,13.13,13.91,14.55,14.08,15.10,16.16,
+16.28,16.40,16.55,17.24,16.06,17.23,17.25,18.70,18.74,20.68,
+20.91,20.47,20.71,20.97,22.20,21.59,23.14,24.41,24.03,21.85,
+25.40,23.99,23.96,25.01,26.03,25.98,27.41,27.10,27.12,28.17,
+27.15,28.64,28.95,28.82,28.82,31.19,29.04,30.33,30.62,31.98,
+31.70,30.95,32.85,33.69,33.66,34.05,33.31,33.80,35.41,36.94,
+37.97,37.94,36.89,38.40,37.27,39.61,38.97,38.87,37.83,37.76,
+39.77,40.17,41.44,39.86,41.45,40.43,40.81,42.10,44.55,42.03,
+44.08,45.72,45.26,46.91,46.54,45.79,46.79,47.14,45.93,47.35,
+46.49,48.24,48.32,48.76,50.36,49.98,50.19,50.67,50.13,51.33,
+51.30,51.16,53.39,51.41,55.34,54.25,56.78,54.93,55.74,54.94,
+57.33,56.54,57.35,57.76,55.72,59.19,58.49,57.64,58.82,60.33,
+59.51,60.20,59.12,61.21,60.59,61.33,62.83,60.60,62.24,63.05,
+63.88,65.30,66.24,65.69,66.35,67.05,66.61,65.78,67.45,66.88,
+68.09,66.43,68.50,68.50,70.43,69.67,70.51,68.65,70.30,68.67,
+70.85,72.97,70.60,73.91,74.03,74.86,74.84,74.17,74.54,75.18,
+75.26,77.00,75.99,78.33,76.72,79.94,77.45,81.46,78.40,79.22,
+81.65,79.85,79.66,79.42,81.44,79.46,80.78,82.32,84.61,85.36,
+83.16,86.75,85.35,83.89,86.21,84.27,86.88,85.56,86.74,88.61,
+87.52,88.01,85.16,88.78,89.61,90.19,89.81,90.67,89.25,90.50,
+91.13,92.56,92.53,92.46,94.64,92.96,94.90,93.22,97.97,93.26,
+95.37,95.87,96.50,97.33,98.24,96.85,98.47,97.51,99.07,98.62,
+99.44,98.18,97.49,103.12,100.92,101.79,102.71,101.92,103.28,103.11,
+101.65,104.58,102.74,105.84,108.22,104.78,106.22,106.79,102.95,107.37,
+107.12,106.80,112.86,108.69,108.48,111.48,107.15,108.76,108.89,111.85,
+110.34,110.75,110.45,111.82,112.79,113.66,113.32,113.44,113.39,116.67,
+116.06,118.58,119.74,119.12,120.12,117.75,116.57,120.59,118.40,117.78,
+3.33,3.64,3.82,4.38,4.48,4.70,5.66,5.98,6.21,5.28,
+6.13,6.89,7.28,7.43,7.16,7.76,8.13,8.89,9.24,9.73,
+10.04,10.71,10.48,10.78,10.50,10.86,11.33,11.35,12.49,12.83,
+12.69,13.44,12.61,14.75,13.94,13.19,14.50,14.44,14.38,14.46,
+15.06,16.41,15.63,16.83,18.55,16.55,17.25,17.64,18.96,19.53,
+19.04,19.89,20.83,20.42,19.47,19.76,20.00,20.73,21.63,22.21,
+22.32,22.00,22.74,22.52,22.27,24.86,24.39,24.25,25.39,23.86,
+25.39,26.09,25.88,26.19,25.87,26.20,27.27,26.96,27.63,27.60,
+29.79,28.70,28.83,29.50,30.17,30.82,30.70,30.64,30.20,31.02,
+31.86,32.63,30.61,32.02,32.70,33.80,32.76,34.31,32.48,35.58,
+33.12,36.21,35.90,35.97,35.62,36.09,35.37,37.40,37.20,37.07,
+38.07,36.88,39.44,39.20,40.88,39.71,38.24,40.72,41.35,40.87,
+41.01,40.60,42.07,43.42,41.81,42.31,42.18,41.96,43.59,44.17,
+43.98,45.70,43.59,44.15,45.84,46.88,44.63,46.64,47.94,46.17,
+47.43,48.00,46.07,46.88,48.69,49.62,49.65,49.92,50.95,49.37,
+51.61,48.59,52.43,50.98,50.63,51.91,50.35,51.28,52.56,53.08,
+53.28,53.09,54.40,54.21,52.77,55.62,54.38,55.97,57.24,57.09,
+56.84,55.91,57.42,57.77,57.79,57.73,57.57,57.71,57.75,56.47,
+59.77,59.56,59.82,61.04,61.85,61.45,59.68,61.14,62.69,62.77,
+62.48,64.14,62.48,65.14,61.81,63.94,65.16,65.54,64.86,63.83,
+65.31,66.14,67.62,67.94,66.53,67.57,69.47,68.14,69.54,70.60,
+68.60,68.82,69.26,69.68,68.97,70.03,72.12,72.38,70.45,71.49,
+71.48,72.73,71.90,71.65,74.30,72.80,73.09,73.75,73.52,75.83,
+77.05,75.11,76.60,79.17,75.89,78.14,76.41,79.98,78.76,76.36,
+81.19,78.66,80.39,81.00,79.74,81.70,80.38,78.21,80.95,80.32,
+81.17,83.98,81.58,82.83,84.54,82.91,82.75,83.76,85.75,84.08,
+86.78,82.60,84.82,87.06,83.99,86.32,86.47,85.58,88.39,90.00,
+88.92,87.90,88.02,87.55,90.14,88.56,89.56,91.31,89.18,90.50,
+90.92,90.19,90.79,92.88,90.71,90.95,93.98,92.31,92.80,96.38,
+2.43,2.82,3.00,3.31,3.33,3.51,4.09,3.98,4.46,5.54,
+5.09,5.56,5.12,5.64,6.21,6.50,6.95,6.38,7.24,6.85,
+7.53,7.75,8.22,7.76,8.67,8.52,8.53,9.76,9.18,9.20,
+10.48,10.12,10.21,11.46,10.25,11.68,12.00,11.58,11.31,12.34,
+13.26,12.54,12.33,13.44,13.20,12.42,13.61,14.52,13.69,14.74,
+15.58,14.97,14.07,16.02,14.58,16.55,16.63,17.31,16.67,17.25,
+17.29,17.46,17.01,18.27,19.04,18.11,18.61,18.52,19.85,18.91,
+19.99,20.84,21.34,19.89,19.61,20.78,20.83,20.92,22.15,20.58,
+21.53,23.08,24.54,23.64,24.34,24.60,23.36,24.23,23.37,24.18,
+23.51,26.68,25.62,25.53,25.99,25.70,25.86,26.21,27.68,26.71,
+28.10,27.49,26.62,26.52,28.87,28.56,29.15,28.99,26.41,29.52,
+28.25,29.64,30.89,30.12,31.14,31.36,32.30,31.31,33.39,30.93,
+32.23,31.98,31.62,32.74,32.11,31.46,33.92,35.08,33.90,34.35,
+33.72,36.36,33.94,35.03,35.78,34.66,36.61,37.91,37.28,35.37,
+37.12,35.14,36.71,36.80,38.94,38.41,38.95,39.20,37.59,37.95,
+39.70,40.16,38.76,41.12,39.85,41.03,40.67,41.19,42.37,42.19,
+42.15,42.89,42.86,42.04,42.63,43.09,45.26,44.72,43.02,44.87,
+46.26,46.29,44.14,46.55,45.39,45.86,47.37,45.46,46.90,45.83,
+47.63,49.33,47.73,47.41,48.83,49.36,48.19,48.03,49.25,47.24,
+50.18,47.60,49.62,49.33,49.42,50.90,49.73,51.64,52.42,52.26,
+51.09,52.97,51.13,51.84,53.28,53.60,52.32,52.95,55.40,55.49,
+54.75,53.79,52.94,52.77,55.07,55.66,53.87,54.85,57.56,54.68,
+55.05,55.13,58.22,57.83,57.81,58.16,59.23,56.84,57.08,60.25,
+57.46,61.53,58.69,58.91,60.89,61.43,60.89,62.46,59.58,60.16,
+62.13,61.20,60.78,62.92,61.70,61.72,62.44,63.45,64.00,64.25,
+61.98,63.08,65.47,64.56,66.36,65.62,65.68,67.80,67.53,65.26,
+66.94,68.76,68.29,67.83,67.74,69.32,66.65,69.78,68.85,67.78,
+72.58,67.01,71.21,68.39,68.52,72.09,70.84,69.77,71.61,71.66,
+72.19,73.32,73.69,74.92,73.59,70.80,73.70,73.25,74.96,75.29,
+1.99,2.20,2.05,2.72,2.71,2.79,3.56,3.16,3.25,3.91,
+3.82,4.05,4.33,4.34,4.21,5.19,4.97,5.67,5.02,6.16,
+6.60,6.15,5.71,6.08,5.62,7.01,6.67,7.62,6.86,7.33,
+7.62,7.73,8.21,8.01,8.82,9.33,9.63,8.68,9.58,10.02,
+8.97,9.81,9.39,9.01,10.76,9.88,10.80,11.50,10.25,11.21,
+10.84,11.31,12.61,12.24,13.10,12.62,13.67,13.21,13.16,13.41,
+14.44,13.17,13.36,14.21,14.40,14.03,14.78,15.37,15.41,15.48,
+15.75,15.88,16.55,16.50,17.55,16.36,16.73,17.02,16.87,16.75,
+17.81,17.93,17.18,16.71,18.71,18.35,18.08,19.09,18.57,19.15,
+18.85,20.25,19.97,20.05,19.38,21.01,20.38,20.62,19.96,20.27,
+20.91,21.62,22.27,20.23,22.29,22.27,22.03,22.90,22.84,23.69,
+24.32,22.81,24.93,23.07,24.50,23.80,25.53,24.90,25.07,25.22,
+23.98,24.77,25.59,25.51,25.74,27.22,25.11,25.79,26.02,27.79,
+27.34,28.49,27.89,27.92,28.34,28.52,28.43,28.87,28.99,29.12,
+28.88,30.29,29.54,30.96,29.46,31.04,29.33,28.79,30.09,30.52,
+32.07,31.59,31.24,30.92,32.33,31.78,30.97,31.83,32.64,31.60,
+32.55,32.87,33.10,31.59,33.42,34.13,34.37,35.01,34.45,34.34,
+33.33,36.34,36.30,34.79,34.93,33.62,37.91,35.50,36.03,35.56,
+37.08,36.59,37.83,36.41,37.34,37.48,38.06,38.13,38.06,39.66,
+40.00,38.91,39.36,38.58,39.86,39.40,38.79,40.68,40.97,41.49,
+40.64,41.58,41.88,43.48,41.46,40.75,41.88,42.70,41.76,42.16,
+41.63,42.60,43.65,42.61,44.23,43.61,44.36,43.95,44.75,45.04,
+43.80,45.03,45.67,45.43,47.43,43.78,45.94,45.40,45.70,44.72,
+45.05,45.83,46.35,48.69,49.50,47.41,49.94,49.19,50.50,48.87,
+49.45,46.80,47.96,46.73,49.09,49.85,47.32,48.99,48.62,49.54,
+50.87,49.91,51.44,52.09,50.84,51.11,51.89,49.55,50.70,52.23,
+51.69,52.11,53.12,51.53,52.30,53.94,52.57,53.08,53.38,53.79,
+54.74,52.43,55.89,53.78,53.16,55.34,57.00,55.13,58.27,56.12,
+55.26,55.34,56.79,56.23,55.54,56.25,56.67,55.17,57.80,57.55,
+1.78,1.43,1.79,2.13,2.31,2.14,2.24,2.62,2.60,3.15,
+2.85,3.03,3.24,3.60,3.18,3.91,3.85,3.80,3.97,4.86,
+4.40,4.86,5.39,5.55,5.27,5.19,5.25,5.38,5.53,5.85,
+5.69,6.13,6.27,7.13,7.54,6.89,7.03,7.05,6.60,7.09,
+6.76,8.30,7.44,7.75,8.50,9.26,7.53,8.47,8.46,9.02,
+8.88,8.33,9.54,9.27,10.19,9.99,9.96,11.04,10.65,10.23,
+11.04,10.43,11.00,11.29,10.50,10.82,11.22,11.10,11.92,12.84,
+12.27,13.35,12.75,13.50,12.98,13.51,12.70,13.54,12.74,13.50,
+13.84,14.15,14.04,14.68,14.11,14.52,14.07,15.20,14.86,14.49,
+14.57,15.47,15.38,16.24,15.86,16.18,16.18,15.48,16.44,16.49,
+17.52,16.51,17.64,17.21,16.93,18.55,17.60,18.65,17.97,17.52,
+17.10,18.77,18.43,18.23,19.49,17.67,20.32,19.03,18.75,18.32,
+19.74,19.71,19.33,20.33,20.74,19.87,20.62,20.58,20.71,20.33,
+20.73,21.02,20.02,21.13,20.93,23.07,22.29,22.64,23.06,20.80,
+22.26,22.33,23.11,22.48,23.34,24.04,24.43,22.79,22.44,24.80,
+24.00,21.61,23.82,24.14,26.62,24.43,24.99,24.98,26.44,26.13,
+25.75,25.99,26.98,27.29,27.13,25.60,27.36,25.82,27.76,27.14,
+26.55,27.16,27.72,25.88,28.20,27.84,27.75,28.08,29.18,29.43,
+28.61,29.53,29.89,29.95,29.59,29.27,29.18,31.11,29.67,29.38,
+30.58,30.83,29.78,30.32,31.93,31.59,31.20,32.19,30.86,32.33,
+31.24,32.37,31.55,31.22,32.59,32.15,32.10,34.27,34.60,32.88,
+31.66,34.97,33.03,33.61,33.24,34.18,34.95,34.80,33.02,33.29,
+34.62,35.15,36.54,35.72,35.05,35.89,37.29,35.05,37.17,36.78,
+35.70,37.09,36.28,38.82,35.15,37.84,37.17,36.85,36.42,37.96,
+38.13,37.28,38.48,38.82,38.35,39.22,38.16,37.71,38.20,38.25,
+38.65,38.66,42.19,40.46,41.27,40.52,38.94,40.06,39.24,39.92,
+41.59,39.95,42.22,40.54,41.56,43.42,41.60,42.97,42.59,43.35,
+43.33,41.20,42.58,41.42,41.82,44.55,41.99,45.41,44.82,42.80,
+43.34,43.21,44.59,43.52,44.83,44.07,44.06,44.31,46.22,44.66,
+1.16,1.25,1.55,1.32,1.63,2.04,2.24,1.67,1.60,2.56,
+2.26,3.04,2.74,2.59,3.13,2.76,2.76,3.46,3.30,4.32,
+3.90,3.78,3.90,3.45,3.45,3.90,4.33,5.13,4.08,4.36,
+4.36,4.38,5.53,4.96,5.85,5.84,5.57,4.89,5.56,5.54,
+5.04,5.39,6.40,6.61,6.36,7.11,7.22,5.97,7.15,6.75,
+6.70,7.98,7.55,6.62,7.18,7.13,7.78,7.17,8.14,8.61,
+8.85,7.87,8.66,8.78,9.74,8.57,8.61,9.30,9.83,10.45,
+10.34,8.72,9.61,9.21,9.67,9.79,9.43,9.93,10.21,10.47,
+10.55,10.29,10.28,11.36,11.72,11.68,11.73,10.85,11.18,11.03,
+12.06,12.42,12.77,13.53,11.53,11.06,13.11,12.16,11.72,12.81,
+13.13,13.02,13.28,12.95,12.93,14.47,14.24,13.28,14.39,14.56,
+13.91,14.69,13.95,14.21,13.43,14.23,14.89,13.87,16.17,15.62,
+15.97,15.60,15.36,16.28,15.68,16.05,15.92,15.20,16.86,15.21,
+16.93,16.09,15.97,16.99,16.31,16.63,17.77,16.99,17.00,17.12,
+16.56,17.11,18.53,17.24,17.67,17.89,18.65,17.98,18.58,18.39,
+19.39,18.04,19.84,19.29,18.02,19.37,20.15,19.57,20.50,19.75,
+20.01,18.91,20.42,20.83,21.52,21.03,19.79,21.23,21.37,21.25,
+21.93,21.75,21.02,22.52,20.80,21.68,21.45,22.11,21.29,21.68,
+23.76,20.96,24.12,23.11,23.55,22.86,23.07,24.86,23.99,23.53,
+23.37,23.03,24.11,24.07,22.21,22.74,24.26,24.50,25.29,23.83,
+24.55,24.11,26.37,25.32,26.94,25.75,25.72,26.64,25.24,27.61,
+27.20,26.23,27.39,26.39,25.96,25.50,27.19,27.95,27.55,25.84,
+27.48,28.85,29.06,27.76,29.25,29.23,28.90,30.21,27.57,27.73,
+29.94,29.72,28.44,29.12,29.29,29.85,29.25,28.41,28.62,29.05,
+27.90,30.41,29.39,30.96,28.50,31.25,29.70,31.14,30.36,30.86,
+30.25,31.10,30.59,30.58,30.75,31.60,31.73,30.41,32.15,32.82,
+31.71,31.96,31.92,30.61,31.49,31.67,31.74,33.66,31.91,32.04,
+33.56,32.71,32.82,34.25,34.72,34.58,33.68,34.72,33.70,32.95,
+33.95,35.15,34.37,35.52,33.59,33.37,35.25,35.33,35.73,36.51,
+0.83,0.96,1.19,1.33,1.39,1.42,2.04,1.55,1.47,1.90,
+1.85,2.18,2.46,2.25,1.78,2.46,2.19,2.69,2.45,2.32,
+3.23,3.11,3.39,3.12,2.88,2.97,3.22,3.58,3.30,3.96,
+3.65,3.79,3.79,3.58,3.83,3.74,4.50,4.59,3.93,4.70,
+4.65,4.27,3.98,4.85,5.15,5.55,5.26,5.51,6.22,5.50,
+5.80,5.76,5.26,5.62,5.79,6.18,5.93,6.61,6.72,6.06,
+6.89,6.21,6.09,6.66,6.65,7.08,6.93,7.19,6.68,6.82,
+7.53,7.29,7.88,7.08,7.64,7.39,8.23,7.83,7.56,8.44,
+8.02,8.37,7.27,8.80,8.15,9.71,8.86,9.48,9.54,9.46,
+9.41,8.63,9.77,9.75,9.55,9.43,10.20,9.86,9.96,10.14,
+10.36,9.89,10.05,10.01,9.83,9.46,10.77,11.02,10.81,10.48,
+11.44,10.90,11.14,10.97,11.78,10.86,10.13,11.12,11.72,11.69,
+11.56,11.80,13.24,12.45,13.05,13.59,11.61,11.96,12.62,12.17,
+12.94,13.34,12.75,13.77,12.77,13.91,13.76,12.95,14.16,13.56,
+13.22,13.49,14.19,13.98,14.53,14.47,13.92,14.02,13.98,14.31,
+14.70,14.80,15.47,14.63,14.83,15.20,16.11,15.91,16.10,15.96,
+15.75,15.27,15.30,16.07,16.79,17.06,15.84,16.67,15.90,15.98,
+15.69,15.90,17.51,16.70,16.91,16.75,17.35,16.74,17.27,18.28,
+18.47,17.22,17.62,17.85,17.00,17.90,19.05,18.32,18.52,18.36,
+18.24,17.87,18.48,18.29,18.40,19.86,18.63,18.90,19.06,19.79,
+17.10,19.72,19.91,20.95,19.59,19.73,20.11,19.56,22.06,20.09,
+20.21,20.86,20.86,19.07,21.42,20.76,21.80,20.36,21.51,20.47,
+21.57,20.37,20.58,21.76,20.69,22.57,21.28,23.58,21.69,21.16,
+21.08,22.14,21.77,22.33,21.72,21.98,23.17,23.69,22.91,23.87,
+23.77,24.02,22.13,23.11,24.62,24.00,23.73,23.50,24.33,24.83,
+23.86,24.44,24.82,25.88,24.17,25.61,24.50,24.20,24.30,25.81,
+25.23,24.62,25.01,24.42,24.95,26.37,24.38,24.01,26.49,23.64,
+25.66,25.93,24.77,26.65,24.84,27.51,26.45,26.82,26.25,27.95,
+26.56,26.57,27.78,27.59,26.25,27.52,26.08,28.09,26.36,28.78,
+0.79,0.76,0.84,0.87,1.11,1.41,1.26,1.52,1.31,1.74,
+1.31,1.19,1.78,1.51,1.88,1.79,1.72,1.95,1.84,1.82,
+1.93,1.85,2.15,2.23,2.61,2.87,2.81,2.65,2.44,2.57,
+2.71,3.28,3.52,2.98,3.24,2.82,3.19,3.50,3.47,3.65,
+3.33,3.58,4.01,4.11,3.70,4.05,4.05,3.69,4.72,4.47,
+3.86,4.54,4.72,4.23,5.34,4.58,5.15,4.66,4.94,4.82,
+4.45,5.04,4.92,5.06,5.28,5.05,5.94,5.45,5.69,6.28,
+5.47,6.28,5.57,5.78,5.98,5.77,6.23,6.35,7.14,6.27,
+6.21,6.98,6.31,6.63,6.55,6.61,7.25,7.24,6.80,6.94,
+6.54,7.05,7.07,6.60,7.67,8.41,7.45,8.16,7.55,7.98,
+8.45,8.19,7.34,7.39,7.60,8.42,8.94,9.73,8.70,9.01,
+8.31,9.05,8.33,8.75,8.54,8.99,8.65,9.89,8.46,8.75,
+10.00,9.65,9.84,9.41,10.12,10.49,9.85,9.14,9.62,9.09,
+9.46,9.67,9.99,10.37,9.94,9.85,10.61,11.18,10.61,10.69,
+11.23,10.43,10.58,10.64,11.79,11.60,10.92,10.94,11.45,11.67,
+11.93,11.10,11.20,12.78,11.78,12.14,10.94,11.38,12.55,11.11,
+13.77,13.02,11.55,13.08,11.81,12.63,12.51,12.40,13.25,13.16,
+11.60,13.96,13.75,13.08,13.82,14.03,13.79,13.46,13.47,14.28,
+13.56,14.38,12.56,13.81,14.12,14.55,15.42,14.02,14.78,14.21,
+14.95,14.64,15.24,15.17,15.87,16.06,15.51,14.67,14.57,15.18,
+16.36,14.73,15.20,14.41,15.73,15.51,15.26,16.76,15.63,15.12,
+15.76,14.05,16.58,16.79,17.12,16.53,17.03,15.80,16.78,16.80,
+16.52,17.58,18.42,17.97,17.37,16.11,16.38,16.06,16.68,17.21,
+17.84,17.26,17.31,17.97,18.06,17.79,16.79,16.98,17.48,17.84,
+17.95,16.87,18.10,18.23,16.92,18.58,18.65,17.63,17.98,19.34,
+19.54,18.23,18.61,18.13,18.10,18.86,18.41,18.41,20.00,18.14,
+20.70,19.12,19.11,19.78,19.84,19.98,19.59,20.01,19.59,20.01,
+20.54,21.05,20.18,19.59,20.06,20.37,21.44,21.29,20.34,20.93,
+20.86,21.51,21.45,20.21,22.20,19.61,20.50,21.76,22.52,21.70,
+22.68,24.08,27.66,29.07,31.77,33.74,35.23,36.16,40.89,42.52,
+45.54,45.36,48.88,51.25,52.52,54.73,56.81,60.32,61.95,63.60,
+66.88,68.57,70.17,72.02,74.39,76.91,76.94,81.31,83.48,85.21,
+88.05,87.39,93.01,94.12,96.67,99.10,100.93,101.01,105.63,108.21,
+110.33,113.18,113.20,114.33,116.83,118.64,122.29,123.42,126.01,131.04,
+131.19,132.72,136.86,137.68,138.90,140.35,145.79,144.91,147.90,150.66,
+152.69,154.98,155.85,161.11,160.19,163.01,164.59,167.55,170.63,171.48,
+173.49,176.47,180.34,183.40,183.59,183.34,186.87,190.40,192.59,194.76,
+198.18,197.01,201.63,201.83,205.13,206.86,208.65,215.50,212.16,215.85,
+217.00,221.34,222.61,224.60,226.27,229.47,232.07,231.39,234.99,236.75,
+240.34,242.73,244.90,245.20,248.60,249.16,255.13,254.94,256.34,260.00,
+260.17,261.73,264.56,269.72,271.26,272.09,277.28,278.76,277.31,280.70,
+283.62,284.88,284.91,290.85,292.32,293.38,295.44,299.90,302.93,306.85,
+303.77,304.22,307.20,311.43,311.56,312.51,316.75,322.55,322.32,321.34,
+330.21,329.89,333.23,332.01,334.14,339.50,335.30,342.72,344.49,346.85,
+348.55,349.08,349.25,353.39,357.09,357.63,360.21,364.05,367.38,370.03,
+371.43,370.90,373.63,379.21,381.68,377.85,385.23,383.21,388.44,390.78,
+388.33,395.17,395.39,400.29,397.34,403.55,406.62,405.46,412.79,411.65,
+414.15,412.71,417.70,420.10,416.11,425.00,426.20,429.46,429.49,431.59,
+434.16,436.75,436.55,442.38,443.42,447.15,448.87,450.57,453.17,455.39,
+456.92,460.25,459.51,464.54,466.28,466.48,472.83,475.22,468.48,477.81,
+477.66,480.46,483.90,487.30,486.64,487.34,491.89,491.04,495.43,498.45,
+499.08,502.33,504.72,509.65,509.75,516.36,509.68,516.15,518.28,524.48,
+520.05,524.28,528.21,530.56,529.95,531.09,536.15,536.73,538.92,540.82,
+542.57,544.20,548.12,551.02,554.07,555.95,556.29,555.38,560.05,563.56,
+563.75,564.75,571.71,572.35,574.22,573.96,577.33,587.22,584.83,585.30,
+589.14,589.56,589.40,594.57,597.51,601.83,602.79,599.66,602.81,607.20,
+606.86,613.38,614.01,614.95,619.84,618.63,617.90,625.22,626.08,627.05,
+627.02,632.52,637.51,635.48,639.04,640.96,644.28,648.22,645.68,651.72,
+18.60,19.18,22.36,23.98,26.00,27.53,29.05,30.65,31.64,34.79,
+36.44,38.79,40.56,39.98,44.66,45.08,46.90,49.42,49.80,51.91,
+53.27,55.31,57.35,59.79,61.58,62.55,64.44,67.07,67.08,69.18,
+70.33,72.76,75.28,78.79,79.37,79.96,80.58,84.16,87.22,87.20,
+90.02,90.19,92.04,93.65,95.99,96.66,101.28,100.34,104.01,106.31,
+107.90,107.98,111.09,110.48,114.60,116.95,119.33,120.88,122.62,121.60,
+124.79,124.94,130.16,131.86,132.64,132.31,135.89,135.66,139.60,141.96,
+142.34,145.41,146.43,147.48,150.00,152.32,152.05,153.45,158.58,160.04,
+159.63,162.15,166.84,165.56,163.99,169.73,170.53,172.18,175.22,176.17,
+179.67,179.92,181.99,182.91,186.06,186.51,188.71,189.92,191.17,194.28,
+194.43,199.48,199.14,202.43,203.75,204.14,205.33,208.27,212.19,210.36,
+212.69,217.03,216.95,220.53,219.65,225.73,226.19,225.12,225.25,229.86,
+233.26,233.48,235.18,240.59,237.92,240.23,241.15,242.66,245.56,247.27,
+249.75,251.88,252.51,256.85,256.55,260.21,261.76,261.14,264.37,266.62,
+268.80,266.76,269.77,273.69,271.28,274.33,277.38,281.36,281.26,283.75,
+287.87,282.45,286.25,290.10,292.95,294.64,296.09,296.01,298.83,299.63,
+300.84,300.10,308.75,310.97,312.93,311.17,310.73,316.49,315.90,320.13,
+319.87,319.06,324.39,324.63,327.85,329.54,332.55,329.39,332.36,330.96,
+337.46,341.14,340.62,343.61,342.51,344.89,352.56,351.26,351.03,353.26,
+357.08,357.65,359.34,361.73,362.41,363.86,365.82,366.66,366.75,371.89,
+373.75,375.66,376.77,374.15,382.18,383.70,380.01,384.40,388.99,389.01,
+392.74,392.72,388.55,398.10,395.25,398.74,403.93,406.67,406.17,406.56,
+410.37,411.43,411.80,411.83,416.88,419.11,417.64,422.80,424.56,422.47,
+425.76,426.29,431.48,432.74,431.65,433.66,434.81,443.74,439.40,441.22,
+446.51,449.95,446.57,451.39,449.72,455.79,450.77,454.63,457.39,456.97,
+461.00,465.30,466.08,465.69,474.05,469.93,472.16,474.29,475.19,475.55,
+479.28,481.92,482.32,485.16,488.18,488.35,489.07,492.40,496.47,495.26,
+499.49,499.88,502.90,504.85,503.36,506.04,508.44,510.13,511.38,512.27,
+515.18,517.39,514.96,520.88,522.42,527.12,529.31,527.09,530.19,530.88,
+14.62,16.01,17.72,18.68,22.00,22.68,23.31,25.38,26.99,27.86,
+29.58,30.80,33.88,33.49,34.50,36.16,38.15,39.65,40.14,41.76,
+42.87,45.32,47.31,47.47,49.55,50.80,52.28,55.69,56.04,55.94,
+58.45,59.95,60.94,63.86,64.45,65.85,65.66,67.13,71.06,70.22,
+71.38,74.49,75.61,76.94,76.74,80.22,80.49,83.01,85.42,86.35,
+88.42,87.38,89.54,90.32,91.04,93.92,95.25,97.48,99.34,99.34,
+102.39,101.78,105.93,106.75,107.43,110.48,111.42,111.25,112.86,114.73,
+115.87,118.94,118.78,120.98,122.41,121.90,124.12,128.32,129.12,128.25,
+130.32,132.02,134.27,130.50,136.42,136.65,142.04,140.73,141.61,142.14,
+144.63,145.06,148.10,149.88,152.21,150.16,152.15,154.23,156.52,157.79,
+158.44,159.62,164.73,164.54,164.14,164.47,168.65,168.56,171.05,169.87,
+175.84,173.44,177.14,179.03,178.59,183.66,182.15,182.89,182.15,185.54,
+189.22,188.28,194.83,195.60,193.79,193.67,195.02,200.46,199.82,200.15,
+202.77,201.98,207.32,206.73,210.26,210.07,212.63,210.00,214.08,213.91,
+215.14,218.12,218.94,221.39,222.62,225.68,225.35,225.46,226.82,234.07,
+232.65,234.40,235.68,236.03,242.20,235.95,240.05,244.31,244.69,244.05,
+247.96,247.50,248.81,248.77,252.53,252.86,256.98,254.04,254.09,256.87,
+262.74,257.90,266.09,266.82,263.23,267.86,269.18,268.74,270.17,275.31,
+273.06,278.27,281.27,280.01,281.62,282.14,281.56,284.84,288.93,287.70,
+289.98,292.94,289.73,294.29,295.20,293.86,296.41,297.84,299.90,299.86,
+301.28,305.59,308.79,308.33,310.48,311.99,312.93,314.84,314.92,320.19,
+318.43,322.54,322.55,324.47,322.90,324.51,327.91,329.02,332.98,330.73,
+331.63,332.99,338.99,337.12,337.33,340.27,340.78,342.67,341.27,347.54,
+346.60,347.57,350.65,349.08,352.40,354.33,356.84,359.24,356.17,358.93,
+364.06,360.46,372.08,367.64,370.09,370.27,370.77,371.44,376.43,378.93,
+376.38,379.45,375.36,381.00,383.04,382.34,384.16,387.30,389.69,392.08,
+391.23,392.29,391.58,395.67,396.41,394.97,401.27,403.10,403.57,403.16,
+400.53,406.76,405.26,405.17,404.91,417.47,415.67,415.89,413.52,417.27,
+419.02,418.49,421.08,423.95,425.87,423.75,425.69,425.48,432.12,429.86,
+11.99,13.55,14.82,15.28,18.28,17.89,19.46,19.68,22.24,22.04,
+23.65,24.48,25.92,27.43,28.02,29.81,30.60,32.18,32.66,35.05,
+36.22,36.94,39.37,39.80,39.88,42.00,43.43,44.57,44.22,47.55,
+45.93,48.21,50.23,49.55,52.57,51.01,53.42,54.62,55.66,58.23,
+58.46,58.94,60.62,62.58,63.23,65.21,65.72,68.17,68.24,69.18,
+71.91,72.90,72.64,74.11,76.03,77.24,76.91,78.12,78.61,78.72,
+82.25,83.47,84.81,87.50,88.39,89.25,90.84,89.58,92.68,93.89,
+95.20,94.73,95.50,97.75,98.52,100.91,99.80,101.91,102.86,105.13,
+105.34,107.95,108.28,108.39,109.91,110.78,111.62,113.21,115.30,116.00,
+116.42,120.44,119.29,122.11,120.10,121.92,125.12,125.95,126.22,127.54,
+129.23,127.25,130.18,134.86,135.40,135.53,137.74,137.45,140.07,139.38,
+140.12,142.94,145.26,144.37,146.89,145.73,146.11,147.49,152.11,149.38,
+150.78,155.72,152.12,156.87,157.95,158.79,158.90,159.27,160.53,164.39,
+165.69,163.94,166.62,165.24,170.65,170.77,172.50,170.79,172.23,175.20,
+174.05,177.06,177.74,176.22,177.64,180.02,182.08,183.02,183.85,188.03,
+187.80,186.03,191.83,192.66,193.43,195.59,189.97,195.39,196.62,197.72,
+201.20,200.94,201.03,202.28,202.23,204.43,204.97,208.26,207.78,210.34,
+211.82,210.64,216.96,215.53,218.30,216.25,220.30,220.23,220.90,221.33,
+220.94,223.69,224.55,226.18,223.77,230.40,230.17,236.00,229.77,233.73,
+231.33,232.94,238.09,238.30,237.73,240.69,241.46,241.36,242.87,245.22,
+246.33,243.62,249.29,248.50,256.15,254.23,252.37,255.51,255.08,256.19,
+258.72,261.05,259.36,264.23,261.89,259.78,265.96,264.44,263.46,270.38,
+268.97,269.56,271.96,270.92,278.40,275.20,275.06,275.76,282.64,279.36,
+280.29,282.68,280.93,288.01,287.33,288.69,285.54,289.75,291.54,293.14,
+294.31,298.22,295.11,295.95,296.48,295.26,300.19,303.10,300.25,303.18,
+308.18,306.67,305.89,309.40,306.24,312.35,310.26,312.90,309.28,315.27,
+317.62,320.85,317.66,317.37,318.90,322.31,323.24,326.22,325.20,329.89,
+329.23,330.04,333.15,330.27,333.82,331.91,336.37,335.46,338.56,340.61,
+338.17,340.90,341.70,344.67,345.79,346.77,343.25,345.73,348.92,344.68,
+9.29,10.77,11.56,12.29,13.32,14.88,15.38,16.70,18.61,19.20,
+18.86,21.14,21.17,22.29,23.74,23.11,25.08,25.91,26.20,26.66,
+27.85,30.35,30.24,31.11,33.05,33.64,33.49,34.89,35.74,37.46,
+37.16,37.98,40.75,42.15,42.12,41.63,43.78,43.99,46.23,46.36,
+47.60,48.85,47.93,49.74,49.67,51.93,53.22,53.20,55.07,56.33,
+57.26,58.53,56.85,61.23,59.86,62.64,61.95,63.12,65.94,65.14,
+69.31,68.34,68.78,68.66,71.41,73.05,71.21,74.47,73.45,76.33,
+74.41,76.13,78.50,76.67,81.05,81.25,83.77,81.05,84.55,85.31,
+85.38,86.05,87.21,86.74,89.02,88.73,90.79,92.30,91.76,94.60,
+93.80,98.12,96.94,98.68,98.31,99.14,100.75,101.46,101.28,101.29,
+104.59,103.83,105.70,106.69,106.77,109.16,109.77,110.07,111.65,113.25,
+113.39,115.85,115.24,117.22,117.64,119.02,118.61,120.36,118.32,122.24,
+123.46,123.94,126.44,126.41,127.33,127.68,128.72,128.85,131.35,131.54,
+131.06,134.52,134.64,134.80,135.21,136.80,139.55,140.40,140.96,141.70,
+141.06,143.82,142.92,144.94,143.73,147.21,147.01,149.81,151.54,152.66,
+151.99,152.03,152.23,156.56,155.76,155.53,156.34,156.28,160.98,157.23,
+158.55,161.40,166.06,159.92,164.84,163.56,166.29,167.99,169.17,169.72,
+169.11,171.22,175.08,173.53,173.71,175.51,172.96,176.11,176.60,177.75,
+181.07,181.96,182.91,182.18,181.67,182.20,187.01,184.40,190.36,188.19,
+186.70,189.09,193.98,195.19,192.79,192.60,191.56,194.63,198.05,198.11,
+199.14,201.47,202.54,197.76,201.55,203.09,206.26,203.68,205.62,207.90,
+207.18,208.30,209.60,209.71,209.98,212.04,216.16,216.83,213.09,218.06,
+217.64,217.88,217.57,218.19,219.58,221.20,220.32,226.61,226.68,224.08,
+224.42,227.34,228.41,229.09,233.03,234.09,231.99,232.70,234.57,234.41,
+238.00,238.95,236.66,238.15,244.13,239.85,239.76,240.68,246.04,245.18,
+246.27,247.74,248.19,248.12,248.01,250.74,251.47,251.21,252.72,255.69,
+253.82,252.39,256.85,257.26,260.53,261.25,261.12,260.15,265.82,263.04,
+262.57,266.30,267.75,268.30,265.06,270.66,267.75,269.69,273.31,275.15,
+274.59,274.01,277.04,278.61,279.17,278.44,277.54,279.77,280.40,280.47,
+8.01,8.47,9.81,10.55,11.50,12.05,12.81,12.56,14.46,15.16,
+16.54,16.06,16.80,18.53,18.15,20.21,19.62,20.60,22.10,22.07,
+21.48,24.08,24.90,25.82,26.41,26.71,27.66,27.14,29.21,30.21,
+31.52,31.90,32.36,34.23,33.31,34.74,34.26,34.23,37.26,38.56,
+38.30,38.60,40.36,40.94,43.41,41.88,44.27,43.53,44.12,45.52,
+45.32,46.69,46.35,47.81,48.04,49.60,46.75,49.17,51.43,53.45,
+53.47,55.02,55.80,54.41,55.21,56.31,57.59,58.20,61.28,60.82,
+61.81,61.33,62.69,64.54,63.58,64.82,64.79,65.72,68.22,67.79,
+67.95,69.51,70.61,72.08,72.81,71.74,74.24,73.73,73.21,75.81,
+76.97,76.09,78.11,79.77,78.95,80.52,81.06,81.51,79.35,81.99,
+82.91,83.22,86.19,86.34,84.92,87.31,89.36,89.17,89.81,89.83,
+91.37,90.59,94.93,94.79,94.08,95.74,98.59,98.25,95.92,99.70,
+99.10,100.52,101.04,99.73,101.91,102.70,102.95,106.33,104.16,104.33,
+106.60,106.07,109.28,111.19,111.52,112.21,108.88,113.30,113.71,113.72,
+114.69,115.24,117.82,117.28,115.32,119.39,120.05,118.93,118.85,122.07,
+120.33,122.77,123.24,121.65,125.62,124.87,126.35,126.08,127.17,131.80,
+131.00,130.12,129.00,133.60,133.80,136.15,132.20,136.04,133.90,137.10,
+138.53,136.99,137.50,140.52,140.97,140.87,141.00,140.46,145.84,142.59,
+145.75,145.59,146.94,146.92,146.54,151.32,148.66,149.93,150.33,152.15,
+151.52,154.00,152.38,153.48,155.78,158.12,154.49,160.69,157.66,159.50,
+161.44,157.33,161.96,162.40,164.03,163.20,164.71,165.31,166.22,165.05,
+167.90,167.31,169.86,171.68,171.00,173.06,171.74,176.25,174.20,172.32,
+175.71,176.69,179.21,174.26,175.78,175.81,176.01,182.48,180.19,179.84,
+184.80,183.32,184.94,185.31,185.28,185.04,188.82,185.99,188.71,191.66,
+189.98,189.12,189.73,193.90,192.19,191.41,193.70,197.85,196.40,196.30,
+193.53,198.97,199.26,203.23,201.83,204.54,202.51,205.54,206.02,205.01,
+207.26,206.65,205.41,210.94,207.44,210.52,209.75,210.93,212.42,211.21,
+213.51,214.31,214.29,215.61,215.58,217.39,215.09,217.30,221.84,218.90,
+221.12,223.85,222.76,222.56,223.75,223.54,227.96,223.79,225.11,226.09,
+6.62,6.96,7.10,7.74,8.10,9.44,9.54,10.21,10.62,12.62,
+12.77,12.93,14.26,13.34,14.34,15.33,17.04,16.80,16.74,18.32,
+18.88,19.58,20.41,19.51,21.09,19.88,22.29,23.05,23.99,23.61,
+25.44,24.16,27.07,26.50,26.64,27.13,27.33,28.02,28.99,30.07,
+30.14,31.83,32.01,32.10,33.16,32.92,33.76,36.57,35.69,35.85,
+37.16,37.35,37.52,39.42,39.11,39.97,40.19,40.89,43.19,42.96,
+42.09,44.35,43.65,44.52,44.88,47.07,45.90,47.23,48.81,49.15,
+49.65,49.47,48.85,50.68,50.90,52.65,52.48,53.14,54.02,54.09,
+55.04,54.09,56.78,55.76,55.41,59.50,59.50,58.30,59.26,60.94,
+60.89,62.02,63.86,63.38,63.00,63.83,65.88,66.49,64.34,66.73,
+67.39,68.01,68.11,68.61,68.79,69.34,71.39,72.91,71.24,72.45,
+75.06,73.12,75.19,75.26,74.65,76.58,77.46,76.26,76.33,79.55,
+82.20,81.68,80.48,81.15,81.26,81.55,83.62,80.73,84.28,85.72,
+84.44,85.61,87.24,86.54,87.48,88.92,88.53,90.79,88.44,91.18,
+93.84,91.66,94.60,93.83,94.71,95.80,94.15,98.67,97.76,96.05,
+96.55,99.36,98.92,97.30,101.16,99.98,102.03,100.34,101.68,104.90,
+105.80,105.09,105.47,105.23,105.64,105.71,108.03,108.39,106.77,109.31,
+108.15,110.45,111.15,110.92,113.47,112.95,111.60,115.18,115.26,115.00,
+116.89,117.10,115.55,116.90,118.91,118.30,120.82,119.01,119.33,117.87,
+123.71,124.62,123.79,123.66,124.12,123.77,122.84,125.03,126.21,129.15,
+127.16,130.41,130.65,129.29,130.38,130.49,131.28,131.33,133.19,131.17,
+133.92,135.05,137.61,134.16,134.02,136.57,138.18,136.85,140.52,139.09,
+139.96,144.66,142.40,142.71,142.65,142.94,144.76,145.40,146.06,142.94,
+146.56,146.07,148.72,149.99,152.86,147.70,149.72,151.56,150.27,151.61,
+153.03,152.62,155.70,153.08,154.61,155.55,159.01,159.84,157.92,156.45,
+159.94,158.96,157.79,163.22,165.09,160.41,157.50,165.97,166.00,165.50,
+166.72,164.53,164.60,168.33,166.07,168.49,166.69,168.25,170.63,172.70,
+172.66,170.79,170.66,173.30,176.14,170.52,172.20,175.48,174.37,175.51,
+179.21,180.33,175.96,180.32,178.53,177.94,179.74,182.52,180.24,180.91,
+5.09,5.27,6.33,7.42,7.34,7.18,8.40,7.79,8.63,9.63,
+9.95,10.04,10.36,11.75,12.16,12.01,12.26,13.07,13.60,14.58,
+14.78,15.68,15.53,16.44,16.91,16.59,17.08,18.88,19.17,18.46,
+19.42,20.64,20.88,22.20,21.24,22.83,22.05,23.18,22.98,24.70,
+24.79,24.60,26.29,26.34,25.80,27.06,28.12,26.71,28.81,28.18,
+29.84,30.00,29.11,30.80,30.23,32.32,32.89,32.42,32.51,34.79,
+35.40,35.34,36.37,35.84,36.28,35.60,37.05,36.88,37.30,38.17,
+39.05,39.27,41.11,40.75,40.18,42.52,42.80,42.99,44.02,43.31,
+44.17,44.89,43.87,44.90,45.09,47.32,46.88,46.80,47.02,47.34,
+46.91,49.16,51.21,50.37,51.16,51.28,52.41,52.35,54.00,55.27,
+53.86,54.61,53.89,55.21,56.59,56.25,56.97,57.43,57.76,58.50,
+57.25,59.48,58.66,59.00,59.52,62.69,61.65,63.53,64.06,62.84,
+64.14,64.12,64.72,65.99,63.90,67.27,65.85,67.92,65.76,66.68,
+69.97,68.39,69.58,68.46,70.39,70.12,72.63,73.17,71.29,74.00,
+73.68,72.26,73.62,73.70,74.08,79.55,77.82,78.36,77.52,76.08,
+76.91,78.51,79.81,80.69,79.45,79.88,80.56,81.23,81.17,84.17,
+82.15,83.23,84.67,84.78,84.17,85.78,87.15,84.63,88.59,83.86,
+89.68,86.91,89.08,87.58,90.62,90.80,91.04,94.24,93.44,91.13,
+91.88,92.19,95.00,94.15,96.39,93.93,95.81,97.67,95.34,96.72,
+96.90,99.37,97.19,97.05,98.60,102.08,100.55,101.69,103.40,102.68,
+104.42,101.26,103.24,102.40,105.74,104.40,104.01,106.50,105.65,105.20,
+106.90,109.23,106.92,106.90,109.72,108.67,109.53,112.45,109.67,110.66,
+114.69,111.25,111.24,114.41,116.27,114.57,116.07,114.44,115.23,117.57,
+116.00,118.51,117.06,118.31,118.97,119.39,118.94,118.74,120.45,122.73,
+121.82,123.85,123.06,122.12,123.70,126.41,128.67,123.85,127.06,122.76,
+125.52,127.50,127.36,126.88,130.35,129.61,129.82,129.08,130.44,130.13,
+130.40,133.14,129.85,132.86,134.54,135.99,134.38,133.72,135.15,136.66,
+137.96,134.69,135.94,137.35,140.22,138.56,140.44,141.66,142.08,142.61,
+140.14,139.14,142.11,140.86,146.25,142.29,145.25,144.03,145.61,143.65,
+4.17,4.35,4.31,4.87,5.39,5.69,6.21,6.34,7.53,7.86,
+7.60,8.49,8.79,8.42,9.30,9.34,10.97,10.97,11.52,10.91,
+12.06,12.19,12.51,13.17,14.62,14.06,13.10,16.09,14.97,15.96,
+15.41,16.49,16.38,18.61,16.41,17.55,19.04,18.78,18.74,18.41,
+20.69,20.09,18.85,21.13,20.90,20.89,21.65,20.90,22.50,23.43,
+23.33,24.05,23.76,24.94,25.11,24.80,24.69,26.56,26.93,26.75,
+27.55,27.45,28.29,27.75,28.64,29.98,30.13,29.86,30.57,30.25,
+31.37,31.32,31.79,32.87,32.22,34.41,34.20,32.99,33.58,34.26,
+34.07,35.20,35.56,36.20,36.39,36.67,36.32,36.58,39.23,38.17,
+37.82,38.00,40.79,38.89,41.59,39.15,41.25,42.09,41.58,41.95,
+43.19,42.79,43.10,43.88,44.28,45.55,44.99,45.77,46.06,47.63,
+47.23,47.29,48.17,47.62,47.27,47.76,47.86,50.34,50.76,49.48,
+50.40,50.63,51.80,51.68,51.88,52.26,53.38,53.37,52.42,54.00,
+55.02,52.71,54.41,55.04,55.64,59.32,55.66,56.64,57.26,58.56,
+58.53,59.75,58.57,58.88,61.13,59.45,61.36,62.64,61.56,61.02,
+62.98,62.31,62.01,64.95,64.38,64.20,64.64,63.44,65.32,65.11,
+67.06,67.06,65.66,67.52,67.94,67.89,67.82,67.22,68.12,69.61,
+69.90,69.86,70.64,71.14,72.26,69.29,73.75,73.68,75.41,75.63,
+74.73,74.85,74.00,74.37,75.43,76.09,74.40,74.70,79.25,77.92,
+77.93,75.97,77.45,79.81,77.32,79.31,81.01,80.17,82.97,80.36,
+83.85,83.59,82.98,84.30,83.33,80.92,83.37,82.56,85.82,82.91,
+86.97,89.26,86.25,84.50,88.96,87.07,84.83,89.96,88.34,88.98,
+91.28,87.56,89.86,90.30,91.44,92.12,92.74,93.89,92.62,93.81,
+93.83,92.35,92.34,92.84,96.20,93.94,97.33,94.52,94.67,98.08,
+96.74,97.34,98.03,99.84,99.24,99.12,97.51,97.87,98.29,101.20,
+99.42,102.15,102.43,102.36,102.82,103.50,103.33,103.02,103.93,102.34,
+104.80,106.81,107.52,105.94,105.23,106.65,107.59,109.55,107.34,106.33,
+109.40,110.18,112.77,109.61,109.07,110.89,112.24,109.94,112.01,113.29,
+113.60,112.40,113.23,113.56,116.21,114.60,115.20,113.21,114.72,115.64,
+2.95,3.52,3.50,4.30,4.38,4.86,4.52,5.32,5.63,6.68,
+7.01,6.38,6.81,7.34,7.72,8.14,8.11,8.56,9.68,9.59,
+9.01,10.48,10.07,10.61,10.11,10.98,11.20,11.54,11.51,12.26,
+12.61,13.35,12.63,14.06,13.31,14.59,15.18,14.08,14.90,15.91,
+15.29,15.91,15.75,16.58,17.47,17.23,17.28,18.53,17.25,18.89,
+18.99,19.78,20.30,19.00,19.94,19.35,20.74,21.01,21.53,21.09,
+20.56,22.49,22.93,22.97,22.90,22.70,24.38,23.07,23.77,25.12,
+24.39,25.85,24.35,26.24,25.76,25.40,26.62,26.45,27.69,27.53,
+26.93,28.51,28.09,29.22,29.55,30.13,30.16,28.64,30.41,31.14,
+31.14,31.89,31.52,30.91,33.28,31.20,32.96,32.68,32.68,32.95,
+33.62,33.68,34.50,36.01,36.68,36.16,36.24,35.73,35.74,37.19,
+37.41,36.50,37.35,39.11,37.65,40.47,39.31,40.67,40.08,39.56,
+41.52,40.55,41.09,41.80,41.51,40.94,41.19,43.63,43.75,44.70,
+42.96,43.48,45.43,45.15,43.66,46.47,46.51,45.09,47.16,46.05,
+46.17,46.41,47.74,47.87,45.57,46.80,47.91,49.06,49.50,49.38,
+49.24,48.91,49.32,49.93,51.70,48.92,51.81,53.97,51.15,51.15,
+53.73,52.94,52.55,53.77,52.82,53.42,53.16,53.42,55.32,56.79,
+55.48,55.01,56.34,57.07,56.03,58.54,57.57,58.77,56.58,60.34,
+58.55,58.08,59.81,58.36,61.77,59.90,60.76,60.01,62.12,62.74,
+59.35,63.14,62.32,64.21,63.02,60.51,64.73,63.15,62.55,65.29,
+63.93,65.04,67.05,67.10,66.25,65.94,68.43,65.30,67.26,69.21,
+69.33,68.75,68.69,70.00,68.56,68.16,69.58,69.13,72.22,73.71,
+71.87,71.91,73.24,72.50,73.74,73.14,74.75,73.97,74.18,72.73,
+74.01,74.34,74.47,75.48,76.30,76.62,76.10,76.26,73.45,74.65,
+76.17,79.37,76.68,77.57,79.58,80.00,78.56,80.08,82.25,80.62,
+80.61,81.61,79.19,81.11,82.46,81.32,84.50,82.37,84.52,84.57,
+80.95,85.00,84.83,84.29,82.95,86.03,86.47,85.61,85.97,85.05,
+86.59,87.73,86.09,88.78,90.27,87.59,87.44,87.67,87.76,87.75,
+89.46,90.05,88.84,91.66,91.82,91.44,93.00,94.34,90.78,91.34,
+2.49,2.91,2.80,3.17,3.50,3.63,4.55,4.60,4.82,4.99,
+5.46,5.35,5.48,5.99,6.58,5.99,6.74,6.70,7.06,7.11,
+7.53,8.26,8.60,7.92,8.45,9.23,9.10,8.70,8.52,9.74,
+9.25,9.58,10.89,11.00,10.96,11.75,11.05,12.18,12.38,12.42,
+12.87,12.28,12.05,12.94,12.99,13.44,13.93,14.27,14.39,15.71,
+14.80,14.59,14.69,15.04,15.39,14.92,17.30,16.05,15.42,17.85,
+17.17,17.47,17.49,17.84,18.39,17.25,18.89,19.83,19.33,20.70,
+19.34,19.56,19.82,20.09,19.36,22.04,21.57,21.35,22.60,22.16,
+22.16,22.61,21.48,23.83,23.16,23.52,23.80,23.16,24.73,23.82,
+24.42,25.29,24.88,25.20,24.41,27.10,25.95,27.08,26.45,26.08,
+27.26,27.32,27.14,28.69,29.15,28.95,28.65,30.68,27.98,29.11,
+29.57,29.73,30.16,29.71,30.23,29.81,30.86,31.99,32.13,31.50,
+31.14,33.08,32.79,32.74,33.27,32.68,35.61,32.16,33.81,35.14,
+35.53,35.74,35.48,35.45,35.99,35.49,35.59,36.20,37.08,35.98,
+35.72,36.87,38.32,37.15,37.18,37.54,36.23,37.73,38.54,39.83,
+38.61,40.53,40.84,39.25,38.76,42.85,40.43,42.42,40.43,41.64,
+42.10,42.02,42.13,43.34,42.36,42.75,42.77,42.35,42.56,43.86,
+43.73,45.31,45.30,44.96,44.39,48.13,42.49,47.08,48.25,45.98,
+45.43,48.12,47.95,46.59,48.54,47.28,45.01,49.31,50.38,48.63,
+49.26,51.32,50.69,50.11,49.77,48.90,49.55,52.16,50.92,52.12,
+51.76,52.91,51.50,52.91,53.44,53.37,52.49,53.81,54.78,52.55,
+54.07,52.53,55.25,53.91,53.24,56.56,56.30,55.18,58.53,53.83,
+56.16,55.56,58.05,58.60,56.85,56.66,56.99,61.23,59.42,59.23,
+59.16,58.61,59.64,61.41,59.93,59.11,61.66,60.96,62.10,62.89,
+63.19,60.03,63.30,59.65,62.02,61.59,62.34,60.82,62.88,64.20,
+64.64,63.96,63.56,65.23,64.41,65.50,65.98,65.89,65.82,64.81,
+65.12,65.56,67.54,67.95,66.00,67.59,66.62,67.26,68.32,70.11,
+69.24,67.81,68.17,68.22,73.58,68.27,69.36,70.58,71.38,70.84,
+70.82,71.92,70.94,70.00,72.51,72.94,73.77,75.10,73.58,74.00,
+2.09,2.13,2.15,2.65,2.72,2.84,2.88,3.80,3.45,3.99,
+4.35,4.10,3.91,4.85,3.93,4.39,5.17,5.49,5.44,6.18,
+5.41,6.38,7.14,6.28,6.04,6.99,6.92,7.31,7.88,7.85,
+7.67,8.04,7.90,8.52,8.41,8.23,9.39,9.62,9.13,9.57,
+9.93,10.52,10.79,10.06,9.69,10.80,10.48,10.38,12.27,11.27,
+12.24,12.69,11.62,12.58,12.13,13.28,13.04,12.29,14.30,14.64,
+15.00,14.66,13.02,13.63,14.62,14.29,14.95,14.49,15.77,15.51,
+15.62,15.83,16.58,16.61,17.62,16.82,15.87,17.66,17.43,17.59,
+18.35,17.17,18.18,18.94,18.22,19.71,17.32,19.46,20.37,19.45,
+19.65,20.23,19.50,19.95,18.33,20.63,21.24,21.09,21.28,22.86,
+21.59,21.45,22.45,22.18,22.30,22.41,22.09,22.76,23.09,22.27,
+25.01,23.43,24.80,22.42,25.32,25.14,24.43,25.54,25.77,26.19,
+24.47,25.38,25.36,26.15,26.10,26.71,26.06,26.29,25.82,27.97,
+26.23,27.61,27.39,28.55,28.14,28.07,26.94,27.94,30.36,28.72,
+28.13,29.73,30.44,31.74,30.32,30.96,29.42,30.39,31.42,30.43,
+31.74,30.96,31.59,32.49,32.56,32.05,31.32,32.44,31.44,32.35,
+31.34,34.12,34.08,34.01,34.60,35.24,33.70,35.92,35.33,34.93,
+33.42,34.98,35.63,35.42,35.30,36.17,35.80,35.35,34.98,38.01,
+36.27,37.16,35.96,38.04,38.98,37.78,37.92,39.38,39.32,37.14,
+39.81,38.68,38.88,40.58,40.12,39.45,41.41,40.79,39.39,39.90,
+40.89,42.02,40.88,42.33,41.43,42.31,44.02,41.23,43.79,42.70,
+43.05,43.63,42.20,43.07,44.95,44.46,43.27,43.08,44.19,43.19,
+44.93,43.85,45.49,44.65,44.66,44.21,45.50,48.09,44.58,47.15,
+45.53,48.35,48.42,48.52,46.48,49.08,47.28,47.55,46.17,47.99,
+47.58,49.62,48.54,48.39,49.83,49.73,50.11,50.56,49.73,50.46,
+49.65,51.49,51.78,51.41,50.96,50.99,52.26,50.61,52.28,52.02,
+52.47,51.00,51.46,53.59,54.03,53.77,51.91,53.46,52.54,54.45,
+55.15,55.25,54.44,57.54,56.66,56.27,53.56,55.07,57.09,53.47,
+57.56,59.27,55.17,55.01,56.67,58.36,57.37,59.99,59.05,61.44,
+1.58,2.04,1.70,2.32,2.05,2.61,2.40,2.67,2.89,3.04,
+3.77,3.15,4.24,3.77,3.40,3.78,4.39,4.18,5.45,4.83,
+4.59,5.29,4.87,5.44,5.61,5.72,6.12,6.92,5.61,6.24,
+6.05,6.58,6.90,6.59,7.15,6.72,6.77,6.70,7.16,7.28,
+8.00,8.25,8.50,8.70,8.54,7.57,8.74,9.05,9.31,8.35,
+9.31,9.38,9.73,9.82,9.26,11.23,10.08,10.17,10.40,10.22,
+10.60,11.22,10.84,10.09,10.69,12.09,11.52,11.64,12.01,12.66,
+12.25,11.89,11.76,12.42,12.38,12.49,13.47,12.86,14.17,14.95,
+14.87,13.75,14.69,13.92,13.98,14.51,14.52,14.43,15.12,16.17,
+16.03,15.35,14.99,16.16,16.16,16.05,16.82,16.92,17.37,16.76,
+17.20,18.31,16.62,16.82,18.54,19.41,18.61,19.08,16.34,18.44,
+18.30,18.54,18.69,18.50,20.18,17.92,20.43,19.35,20.36,20.28,
+19.61,20.59,19.67,20.46,20.30,21.26,20.83,21.54,21.56,22.58,
+22.24,22.05,21.05,24.24,22.24,23.09,21.36,22.23,22.30,23.28,
+23.34,24.18,23.97,26.02,23.54,24.12,24.43,24.02,23.79,25.59,
+24.60,25.58,24.44,25.61,25.55,25.12,25.63,25.54,27.80,24.69,
+26.93,26.15,27.79,27.19,27.00,26.68,27.10,27.48,27.92,28.12,
+26.90,28.31,27.52,27.91,28.19,29.21,27.91,28.36,29.17,29.00,
+28.36,28.98,29.33,29.57,30.01,30.46,29.95,32.20,30.56,30.64,
+31.90,31.38,30.98,32.11,31.28,30.70,32.52,32.15,32.31,31.85,
+31.97,31.88,32.77,32.26,34.08,33.11,32.08,32.30,32.31,31.37,
+34.22,33.84,33.48,35.64,33.43,34.96,33.74,34.51,34.97,35.87,
+35.33,35.36,37.68,35.33,36.71,37.18,36.90,36.67,35.62,34.94,
+38.26,38.59,38.02,36.27,36.66,36.82,37.64,37.13,38.99,40.96,
+38.85,39.67,39.85,39.09,40.06,40.52,38.84,39.41,38.97,38.52,
+39.24,41.69,39.11,41.42,40.46,39.39,40.93,41.42,40.73,41.23,
+41.59,40.02,42.43,41.60,44.88,44.74,42.82,43.33,42.62,44.68,
+42.22,43.94,42.97,44.61,43.12,42.92,43.50,45.36,45.03,43.77,
+42.98,42.55,45.65,45.05,42.75,44.99,45.30,45.73,46.97,46.57,
+1.25,1.38,1.49,1.73,1.61,1.75,1.61,2.17,2.03,2.52,
+2.74,2.90,2.74,2.69,2.39,3.24,3.20,3.29,3.36,3.35,
+3.31,3.35,3.99,3.66,4.30,3.76,4.51,4.53,4.19,4.44,
+5.09,5.04,4.99,5.92,5.59,5.22,5.65,5.76,5.85,6.24,
+6.45,5.88,6.57,6.42,6.46,6.98,6.74,6.77,6.98,7.53,
+7.88,8.13,7.13,8.37,8.44,8.69,8.16,8.56,9.27,8.26,
+8.08,9.14,8.16,8.76,8.80,8.84,8.46,9.10,8.59,9.85,
+9.71,9.99,9.57,9.85,9.82,10.91,9.70,10.03,10.36,11.27,
+11.55,11.35,11.68,10.90,11.91,11.94,13.05,11.78,12.40,12.05,
+12.10,12.30,12.31,12.53,13.47,12.46,13.43,12.40,13.72,13.09,
+12.31,13.33,14.57,14.30,13.12,13.27,13.53,15.00,14.68,14.77,
+13.83,14.42,14.95,15.44,15.81,16.59,15.12,15.09,15.87,15.53,
+16.64,16.32,15.50,16.27,14.97,16.89,18.21,16.80,18.55,17.70,
+17.57,17.27,16.75,18.53,17.15,17.64,18.31,18.93,17.85,17.98,
+18.96,18.28,19.19,17.85,19.49,19.47,18.51,19.06,20.25,20.21,
+18.32,18.77,20.20,22.12,20.44,19.33,22.16,20.84,21.02,20.44,
+22.86,19.84,19.64,20.42,22.43,21.01,21.82,21.32,21.81,22.64,
+21.96,22.87,20.59,23.29,22.76,21.38,22.74,22.43,20.23,23.06,
+23.75,23.95,24.95,24.47,23.01,23.90,24.03,23.52,23.70,24.00,
+25.16,23.75,23.93,25.45,23.90,24.76,26.19,25.36,24.79,24.13,
+24.89,26.98,24.23,25.90,26.51,25.98,26.22,26.62,26.40,24.54,
+25.63,27.63,25.56,27.31,27.02,27.97,28.79,27.07,27.10,27.57,
+29.28,27.26,28.28,27.50,28.44,27.65,27.68,27.41,27.26,28.03,
+30.59,30.23,28.59,29.80,28.94,28.45,28.57,31.17,30.50,30.87,
+31.38,29.47,30.48,28.73,32.30,31.50,31.85,30.28,33.14,32.73,
+31.52,31.32,31.95,31.33,32.16,32.12,31.47,32.63,31.64,33.70,
+33.68,33.39,32.77,33.70,32.78,34.33,33.45,33.33,33.47,33.70,
+35.32,33.61,35.63,33.58,36.05,34.95,36.10,34.26,34.59,35.44,
+36.10,34.69,36.02,34.91,36.01,35.25,34.68,36.29,36.09,37.75,
+1.00,1.01,1.27,0.98,1.35,1.38,1.47,1.71,1.51,2.01,
+2.00,1.94,2.10,2.12,2.34,2.34,2.28,3.13,2.52,2.99,
+3.15,3.41,2.83,3.07,3.13,3.29,4.05,4.14,3.88,3.46,
+4.18,3.27,3.68,4.30,4.06,4.42,4.42,4.53,5.21,4.77,
+4.34,5.17,5.44,4.87,5.30,5.55,4.56,5.58,6.00,5.97,
+5.58,5.46,6.11,6.06,6.00,6.29,6.71,6.46,7.46,5.78,
+5.61,7.82,6.98,6.53,7.17,7.10,7.84,7.64,7.03,7.33,
+7.53,8.14,8.35,8.34,7.79,7.63,8.39,7.57,8.11,8.53,
+9.11,8.40,8.71,8.98,8.42,9.23,9.50,9.46,9.02,9.97,
+9.24,9.25,9.52,10.42,9.68,10.20,10.31,9.80,11.01,9.89,
+10.53,11.54,11.04,10.86,11.47,10.33,12.04,10.88,10.45,11.38,
+11.17,11.08,11.85,11.05,12.04,11.57,11.95,12.13,12.61,12.62,
+11.96,14.63,11.87,12.45,11.88,12.53,12.61,12.96,12.56,12.39,
+13.05,14.22,12.72,14.41,14.80,13.36,13.96,14.72,14.11,14.12,
+13.66,14.51,15.18,14.72,14.97,14.43,14.88,14.41,16.17,14.76,
+16.37,14.63,15.62,16.44,16.72,15.57,16.88,16.55,16.30,15.75,
+16.45,15.83,16.13,16.60,16.71,16.04,17.28,17.51,17.29,16.28,
+17.66,18.14,18.02,18.48,17.30,18.17,16.99,18.64,18.50,19.39,
+17.68,19.11,19.46,18.34,17.51,19.77,19.64,20.37,19.27,18.87,
+18.88,18.22,19.81,20.43,19.77,19.64,19.80,20.32,20.25,20.67,
+17.43,20.11,19.34,20.32,20.50,21.00,22.12,20.86,21.01,21.83,
+22.41,20.83,21.87,21.43,21.17,20.26,22.24,21.30,22.34,22.25,
+21.35,23.24,22.80,21.10,23.01,23.30,23.79,21.50,23.44,24.31,
+22.53,23.35,21.74,24.09,22.51,22.46,23.10,22.34,24.83,23.94,
+24.95,24.37,25.12,24.23,24.98,27.46,25.44,24.68,24.73,24.08,
+26.04,25.44,26.41,24.45,25.53,25.07,25.33,25.42,26.01,24.74,
+25.45,26.11,26.58,27.50,26.23,25.55,25.32,26.91,26.49,27.78,
+26.55,28.81,25.98,26.66,28.23,26.16,27.26,26.89,27.31,27.48,
+27.37,28.14,29.56,27.35,28.39,29.42,27.91,27.93,29.21,29.00,
+25.05,27.56,30.16,32.60,34.04,37.51,40.17,42.90,44.69,48.23,
+48.73,51.64,53.45,55.48,59.11,60.32,64.01,66.42,68.74,72.96,
+74.29,76.51,78.18,79.83,83.27,85.31,88.45,90.74,92.97,95.97,
+98.16,99.99,102.32,105.10,107.41,110.45,111.14,116.25,118.53,119.79,
+123.06,124.60,125.51,130.96,131.17,134.28,134.85,139.84,141.91,146.11,
+145.77,147.91,149.76,154.19,157.18,158.07,160.81,162.29,166.36,167.14,
+167.15,173.52,174.11,178.21,179.58,183.57,186.11,186.85,187.36,190.04,
+195.76,195.58,199.45,201.59,205.20,206.92,207.12,212.48,213.99,216.81,
+218.12,222.51,225.12,225.62,228.49,231.82,233.39,238.37,240.61,240.52,
+243.39,247.27,248.55,251.84,253.18,257.41,259.32,258.74,262.42,264.57,
+268.49,266.20,273.77,275.58,277.86,276.25,278.01,285.08,288.78,290.00,
+288.86,293.92,298.44,298.61,300.72,300.31,306.01,311.55,312.57,314.15,
+316.86,320.84,320.61,323.61,324.17,327.86,331.67,335.34,335.46,337.77,
+342.06,342.10,346.32,348.04,351.21,350.95,354.43,356.55,359.56,361.48,
+363.33,364.00,368.84,372.92,373.15,374.56,376.77,380.81,382.69,385.85,
+387.80,389.83,394.19,395.43,399.03,405.20,401.63,407.64,406.93,410.98,
+414.18,412.64,417.31,422.65,423.34,422.84,427.75,430.72,429.48,434.80,
+438.79,439.15,441.40,442.47,447.25,448.90,453.49,453.08,456.47,458.99,
+461.57,468.46,469.91,468.03,471.33,475.28,476.02,478.96,482.39,483.18,
+485.16,488.12,489.47,491.99,496.40,498.87,499.53,503.48,507.14,505.51,
+510.59,514.79,516.80,519.16,516.71,523.36,523.45,527.73,528.18,532.28,
+533.84,536.11,537.51,542.58,545.75,545.47,550.68,545.62,553.20,553.50,
+556.10,564.35,564.58,567.99,563.63,575.62,571.81,575.51,579.76,582.22,
+580.67,580.58,589.69,590.21,590.58,596.76,600.83,602.13,600.35,599.08,
+608.56,609.14,613.71,616.60,613.11,617.79,620.07,628.22,630.14,629.72,
+637.00,636.54,635.99,637.15,642.92,640.96,646.50,648.64,648.79,653.22,
+653.96,655.74,659.21,665.89,667.24,669.79,675.66,671.54,669.92,675.00,
+679.46,684.29,684.88,684.88,691.66,692.75,694.15,698.42,699.75,699.38,
+706.98,705.33,708.08,711.37,710.88,717.14,719.54,721.83,722.31,722.96,
+20.53,22.30,24.36,26.70,29.00,31.45,31.73,34.44,35.80,38.88,
+40.46,43.09,44.07,46.34,48.59,50.99,53.67,54.01,56.68,59.04,
+60.51,62.22,65.72,68.30,70.09,71.44,72.06,74.63,77.03,77.63,
+81.35,80.60,85.47,88.71,90.13,90.82,92.30,95.75,97.60,99.72,
+100.72,103.53,107.09,106.71,108.90,112.83,113.76,115.29,116.70,116.25,
+119.83,121.61,127.34,127.30,128.52,128.29,133.67,133.99,139.16,139.41,
+138.64,146.51,147.44,146.10,149.45,152.31,154.22,155.66,156.27,159.16,
+160.17,165.66,165.75,168.36,171.04,170.54,171.14,176.50,175.88,181.21,
+179.88,181.52,185.32,187.18,190.49,193.43,193.11,193.79,195.15,199.42,
+200.84,202.50,206.44,207.39,211.25,211.02,215.11,213.49,216.88,219.92,
+222.76,221.02,226.39,229.55,228.84,232.95,232.04,236.21,236.86,239.87,
+240.56,243.25,242.92,246.38,251.32,252.19,249.74,253.45,256.52,261.15,
+262.37,261.43,266.86,267.73,269.41,270.77,274.78,274.15,278.84,279.84,
+281.12,284.71,284.28,288.06,291.95,287.40,295.56,295.14,298.10,297.30,
+302.13,305.37,305.66,307.23,308.05,313.95,317.10,312.67,320.06,321.84,
+321.00,323.21,326.44,327.81,326.98,331.93,332.68,331.98,337.59,339.99,
+339.22,342.08,347.52,344.74,345.43,353.10,354.17,355.38,356.61,363.05,
+360.83,366.20,365.94,369.21,368.14,374.28,373.16,373.64,377.13,381.17,
+381.72,383.86,385.79,386.96,389.64,391.69,390.98,398.72,398.28,398.55,
+401.23,405.38,406.17,410.64,410.31,410.19,414.89,417.83,416.16,420.87,
+422.08,427.42,423.03,424.08,430.39,431.88,433.12,434.54,437.70,439.26,
+441.04,446.17,447.34,447.56,443.89,448.41,453.12,455.25,458.24,460.02,
+462.60,461.31,463.63,470.15,468.51,470.03,472.92,474.49,475.44,477.89,
+482.91,483.80,484.25,487.66,493.57,493.65,497.67,494.39,498.60,507.74,
+499.17,506.35,508.05,506.31,506.67,510.62,513.64,512.71,516.71,522.13,
+522.02,523.81,525.90,525.00,531.11,531.00,537.39,536.17,538.80,537.27,
+538.77,542.59,552.21,546.84,552.15,551.31,552.10,554.33,556.47,559.52,
+558.48,559.08,564.54,567.79,574.66,574.27,577.28,576.91,578.31,579.28,
+582.66,588.21,586.19,590.70,589.94,588.96,594.03,595.83,599.04,603.53,
+17.18,18.56,19.85,21.55,23.26,24.91,27.08,28.90,30.11,31.48,
+34.58,34.72,36.89,40.20,40.90,42.06,43.32,46.03,45.79,48.38,
+49.08,51.79,54.07,55.54,57.34,59.45,60.52,61.37,64.07,63.55,
+66.15,68.63,70.62,69.69,73.51,74.82,77.22,78.59,79.28,80.72,
+82.49,84.67,86.38,88.76,89.28,89.97,94.15,94.36,96.98,98.52,
+99.48,101.89,103.74,106.34,107.03,108.51,108.64,110.77,111.29,115.92,
+116.56,117.98,119.01,124.06,122.32,123.94,123.84,126.20,129.68,129.74,
+133.14,135.13,136.07,136.38,137.07,140.60,142.69,149.46,144.80,148.50,
+147.79,149.74,152.59,154.16,156.79,157.12,159.84,160.45,162.03,163.90,
+166.28,166.41,169.62,170.78,170.59,174.15,177.24,175.59,180.27,180.79,
+182.64,183.10,185.02,187.78,190.38,189.32,191.81,195.14,195.62,197.38,
+197.30,200.95,202.45,206.27,207.13,208.03,208.64,210.25,212.65,210.01,
+216.60,216.75,221.02,220.34,220.41,226.69,226.58,228.23,230.13,231.05,
+231.35,233.57,233.31,239.09,235.24,239.43,241.76,241.34,247.53,244.81,
+248.01,250.99,249.93,252.39,253.23,257.87,257.42,262.23,265.45,264.99,
+264.21,266.00,267.01,271.40,273.12,271.18,275.53,279.15,278.35,279.35,
+283.79,282.87,284.54,284.12,291.00,287.39,291.03,291.88,296.18,290.93,
+297.70,300.86,299.00,301.69,306.05,299.93,307.58,308.44,312.12,311.59,
+314.49,317.99,318.44,317.59,320.98,323.66,325.24,328.15,327.99,329.63,
+330.03,333.22,335.36,338.90,336.08,339.73,339.49,343.88,342.81,346.31,
+345.77,352.12,351.98,350.59,355.60,356.36,356.90,355.93,359.56,360.12,
+364.23,366.05,368.08,366.11,373.43,374.00,371.75,377.72,375.25,380.37,
+380.16,381.56,385.79,387.08,391.91,391.73,392.48,392.47,390.97,391.64,
+399.52,399.11,401.78,400.49,404.91,409.19,403.76,404.37,410.77,409.79,
+413.60,418.00,419.08,423.69,418.80,422.35,426.25,428.48,427.24,425.61,
+431.44,433.00,433.00,434.83,438.02,434.45,440.06,440.27,444.37,442.15,
+447.51,453.53,453.14,452.61,454.14,454.67,453.21,456.42,460.46,457.48,
+462.60,462.78,466.58,461.63,466.78,469.65,469.56,472.82,475.10,475.59,
+479.58,479.17,480.77,484.84,485.27,490.48,489.59,491.46,493.26,497.99,
+13.99,15.78,16.92,18.01,18.61,19.97,22.98,23.20,25.02,25.91,
+26.86,27.97,30.48,29.77,32.99,33.76,35.07,36.46,37.18,39.37,
+42.20,42.32,44.44,45.03,47.44,47.17,48.52,52.68,52.19,53.41,
+56.38,56.57,58.53,58.83,59.76,61.78,63.34,64.79,67.00,66.17,
+68.46,68.75,70.36,74.73,73.74,75.36,76.43,78.98,77.56,79.64,
+82.44,81.49,83.94,85.40,86.45,88.71,88.10,91.85,93.14,94.61,
+94.59,97.09,97.31,99.88,100.13,100.86,105.58,104.62,106.38,106.41,
+108.85,110.96,109.50,114.44,116.30,115.03,114.76,117.97,118.53,120.37,
+122.09,123.24,125.49,126.37,127.87,127.41,130.50,132.53,131.14,134.65,
+138.24,139.46,136.95,140.81,142.84,141.83,144.89,148.18,145.39,147.82,
+151.85,150.17,153.55,154.13,155.08,154.24,154.50,159.22,160.91,161.48,
+161.67,167.52,165.98,168.52,165.90,171.75,170.63,173.71,174.68,177.71,
+172.69,178.35,177.79,181.83,183.39,183.16,185.79,185.91,186.94,187.43,
+189.32,190.82,194.39,192.19,195.38,195.94,197.85,200.04,201.22,202.98,
+204.52,205.66,206.99,204.84,208.35,209.48,211.19,209.96,217.38,216.11,
+215.99,219.29,218.88,220.89,226.13,225.93,226.00,225.09,225.94,229.68,
+231.68,231.05,233.04,232.36,234.54,239.05,238.26,241.79,242.54,242.87,
+246.12,242.68,249.58,246.26,248.60,249.79,254.64,251.60,253.71,255.31,
+257.40,258.23,262.02,263.06,268.52,262.01,269.71,266.95,267.63,268.39,
+270.29,274.61,272.29,272.07,278.63,277.60,277.26,278.89,280.44,282.19,
+287.42,284.40,286.39,290.09,292.84,292.90,294.98,293.52,295.38,299.36,
+295.63,302.51,302.51,301.01,307.01,306.83,306.36,308.42,307.00,311.89,
+315.06,314.81,315.36,317.60,315.90,318.65,322.42,319.07,324.65,325.90,
+324.54,326.04,331.22,329.14,331.07,331.58,331.56,333.70,340.69,338.38,
+341.17,343.82,341.05,341.17,345.08,345.15,345.84,349.27,349.67,352.19,
+354.15,356.18,356.86,356.72,359.52,358.04,361.37,360.84,362.30,368.54,
+364.10,373.53,365.69,373.62,373.12,371.77,374.00,374.55,380.57,381.22,
+380.19,386.10,383.68,383.85,388.44,387.61,388.13,388.96,389.03,395.53,
+399.15,388.73,394.46,397.18,395.69,397.63,398.08,402.28,406.42,404.68,
+11.40,12.98,14.63,14.71,16.28,16.78,18.27,19.52,20.56,22.02,
+22.84,22.82,24.74,25.64,27.11,27.64,28.49,30.20,31.49,32.37,
+32.14,33.70,35.51,37.83,38.61,38.79,40.27,41.89,42.40,44.33,
+44.87,45.92,45.06,47.07,50.64,53.17,50.59,53.22,54.30,54.53,
+56.00,57.21,59.20,59.74,59.23,61.32,62.71,62.06,64.77,65.31,
+67.18,68.88,71.44,69.39,71.32,71.26,75.29,72.86,75.15,77.98,
+79.86,79.14,80.35,81.81,81.73,83.50,84.54,86.66,86.56,88.19,
+90.06,88.37,90.12,93.77,93.07,95.65,97.59,93.94,97.67,97.55,
+101.33,101.80,103.24,103.42,105.00,106.55,108.16,107.65,109.68,110.33,
+111.04,109.92,116.10,115.83,116.51,116.79,117.80,119.42,119.72,117.81,
+121.68,123.41,125.75,124.86,126.52,125.90,128.33,131.04,131.79,134.43,
+133.46,133.17,136.74,139.26,137.72,135.93,143.40,143.21,142.00,145.75,
+144.82,143.26,145.63,147.33,147.48,151.53,148.70,151.44,151.58,155.61,
+155.53,154.52,159.00,159.66,156.90,160.08,161.03,163.37,163.18,163.95,
+165.62,168.99,170.16,169.34,168.40,173.04,173.49,171.56,175.79,176.35,
+177.49,176.85,178.93,179.71,182.22,182.46,182.68,186.30,188.51,186.46,
+189.09,190.56,191.22,191.93,192.62,192.09,193.80,194.98,198.09,198.11,
+199.67,198.15,199.53,204.82,201.97,205.49,206.58,208.30,206.57,212.84,
+211.46,212.27,210.67,215.24,217.72,217.77,219.90,215.65,216.23,218.91,
+225.43,222.90,223.02,226.01,229.24,227.91,232.31,228.12,229.94,229.20,
+234.42,231.65,234.22,236.99,243.48,236.87,237.65,242.98,242.83,246.83,
+245.05,245.04,248.26,247.43,246.67,249.03,247.95,250.34,250.80,248.09,
+254.84,253.90,259.66,261.38,262.93,260.65,259.91,266.23,265.98,263.09,
+268.08,266.32,267.02,266.77,271.31,271.78,273.12,273.51,274.10,271.47,
+278.59,273.93,278.88,279.89,278.95,286.25,281.35,286.59,289.01,285.85,
+287.73,289.46,289.72,290.73,293.35,291.58,296.33,297.24,297.64,301.68,
+303.40,301.21,302.31,304.25,304.90,301.69,306.92,309.48,310.06,306.80,
+309.14,309.76,315.16,309.86,313.87,317.49,316.18,314.52,321.76,317.55,
+324.30,324.47,322.79,327.91,324.82,326.50,325.95,330.21,329.47,333.25,
+9.81,10.07,10.82,12.32,12.69,14.21,14.87,16.03,16.58,17.79,
+17.08,19.54,20.47,20.94,23.14,23.05,23.04,23.93,25.68,26.04,
+27.49,28.46,28.48,29.99,31.83,31.61,34.52,32.34,33.91,35.90,
+36.14,37.21,38.55,39.40,40.26,41.60,42.65,41.80,43.55,45.29,
+45.54,47.27,47.39,48.81,51.66,50.06,51.72,50.30,52.07,53.10,
+54.52,55.29,56.41,58.32,57.24,58.76,60.59,60.29,63.50,62.53,
+62.73,63.97,65.82,66.76,66.33,67.76,68.29,69.98,70.72,72.41,
+71.90,73.79,74.91,75.99,76.35,76.69,78.72,78.73,79.10,79.33,
+82.18,82.97,82.64,85.83,84.11,84.15,85.93,88.21,89.75,90.32,
+90.08,90.87,91.80,93.31,94.88,93.53,94.66,96.42,97.42,98.28,
+97.70,100.66,101.34,102.62,104.08,102.89,103.86,103.62,105.21,106.76,
+109.15,107.61,111.23,111.03,112.17,114.10,113.25,115.31,114.76,116.25,
+117.90,119.52,121.37,119.42,119.64,118.18,123.50,124.32,124.84,125.14,
+124.62,128.43,129.62,128.80,129.94,131.23,132.76,132.37,135.60,136.14,
+136.65,134.03,138.84,135.95,139.31,140.50,141.46,141.76,144.09,144.72,
+144.86,143.11,147.31,147.58,147.41,149.84,149.91,150.29,152.63,153.42,
+152.17,156.22,154.65,155.59,159.35,159.05,159.34,161.74,160.01,163.03,
+164.81,164.99,165.72,168.17,166.44,163.51,169.53,166.73,168.05,175.77,
+174.60,171.42,171.43,173.59,174.53,174.78,178.87,180.84,183.26,178.71,
+180.45,180.69,181.73,182.20,185.83,184.19,186.08,187.51,185.29,189.56,
+191.05,191.41,192.94,187.25,192.25,194.85,194.38,196.01,198.65,196.71,
+199.57,200.14,201.77,202.23,201.53,206.02,204.87,208.92,205.26,207.79,
+206.67,210.07,212.40,209.14,209.73,210.52,213.72,213.79,217.04,216.26,
+216.32,215.90,222.04,220.60,221.92,220.02,222.42,221.26,225.21,227.33,
+228.89,227.69,222.71,228.00,231.78,232.79,232.90,233.69,228.95,231.79,
+239.53,232.26,238.50,235.46,239.21,238.07,240.20,242.54,242.28,242.54,
+242.48,244.84,246.91,246.73,246.42,246.71,248.96,251.57,249.65,252.49,
+252.14,248.31,252.19,258.32,258.05,258.05,255.15,259.97,259.47,261.65,
+259.70,264.38,267.09,265.18,263.06,265.95,266.64,269.89,269.67,271.05,
+7.38,8.08,9.38,9.27,10.52,11.23,12.65,13.09,13.32,14.59,
+15.33,14.99,15.67,18.54,18.88,19.31,19.02,18.99,20.69,21.98,
+22.65,23.48,22.71,25.52,26.01,26.76,26.56,27.88,27.14,28.96,
+29.39,30.16,31.73,32.80,32.96,31.69,33.04,33.97,34.76,36.41,
+36.89,36.94,38.29,39.27,39.13,41.26,40.75,40.64,43.20,42.15,
+44.23,45.50,45.41,45.36,48.46,48.14,48.72,48.36,49.42,50.55,
+49.66,52.73,52.28,52.95,54.92,55.20,56.58,57.60,56.99,57.14,
+58.65,59.15,61.28,62.08,61.61,63.14,62.86,64.85,63.89,65.19,
+65.94,68.66,67.62,68.01,67.61,71.09,70.25,72.60,73.82,71.68,
+74.48,72.85,74.16,75.39,74.87,77.21,76.47,77.44,80.30,78.38,
+78.39,81.64,81.17,80.25,83.10,81.75,84.31,86.02,85.73,87.91,
+89.44,88.26,91.38,88.85,92.25,91.90,91.58,93.66,92.70,95.57,
+96.57,96.41,97.17,97.27,98.88,98.37,97.30,100.93,101.22,103.02,
+103.91,103.99,104.18,106.08,105.42,105.49,105.28,108.94,108.69,108.97,
+108.93,113.26,112.89,111.53,113.31,110.32,115.89,117.37,114.51,118.00,
+118.81,119.15,118.47,119.60,119.74,123.83,120.68,122.54,126.08,123.53,
+128.05,125.79,123.97,126.98,128.38,128.46,127.09,131.13,131.69,130.87,
+131.53,129.29,132.66,133.62,132.26,135.41,138.35,136.96,139.19,141.26,
+143.20,139.25,139.04,142.53,141.94,145.81,142.37,143.54,146.33,146.42,
+145.39,150.09,148.43,148.87,149.73,153.16,151.21,150.28,150.94,156.33,
+155.16,156.00,155.83,156.93,158.59,158.48,157.25,159.73,163.90,161.57,
+161.74,162.48,164.12,161.90,164.76,164.34,164.57,166.22,171.04,167.19,
+170.12,168.10,170.49,172.94,173.20,172.82,173.80,176.98,172.41,174.13,
+175.82,180.13,181.56,179.39,181.71,176.61,180.16,180.98,182.34,179.23,
+184.76,180.87,183.70,184.58,188.08,190.68,186.53,187.86,193.16,184.64,
+186.15,192.60,193.11,193.14,195.96,197.03,195.66,195.51,194.75,193.39,
+198.58,196.27,200.87,199.22,203.48,201.18,200.89,204.59,204.26,202.39,
+202.14,207.55,203.86,207.74,207.68,206.13,211.54,210.50,211.39,210.82,
+215.22,213.02,212.55,211.24,211.40,218.90,218.23,220.03,217.50,218.37,
+6.20,6.90,7.56,8.50,8.76,10.04,9.60,9.79,10.90,12.29,
+13.07,12.98,13.46,14.03,14.84,14.82,15.01,16.69,16.34,17.05,
+17.57,17.54,18.88,19.75,21.31,22.36,21.02,22.93,23.03,24.15,
+22.82,24.03,26.64,26.03,25.01,26.43,26.35,27.66,29.01,29.89,
+29.48,30.65,30.98,32.10,31.65,34.18,32.53,34.07,34.73,33.95,
+35.07,35.20,37.33,40.02,40.35,38.16,39.48,40.98,39.74,40.07,
+42.42,42.12,42.32,42.83,44.81,44.65,45.87,46.88,47.19,48.09,
+47.34,47.22,47.47,48.52,50.65,48.68,50.60,50.08,52.60,51.58,
+53.01,53.60,52.24,57.13,56.02,56.05,55.56,58.28,57.00,60.29,
+60.40,59.10,60.17,59.88,63.44,63.72,63.67,62.12,62.05,63.88,
+65.28,66.14,66.06,68.67,67.28,66.29,70.91,70.28,68.71,70.29,
+70.64,72.39,69.98,73.08,72.31,75.25,76.02,76.29,75.86,77.10,
+77.89,77.11,78.87,79.94,79.03,80.55,80.03,80.88,81.41,82.80,
+84.60,82.85,85.69,85.17,87.53,86.02,86.43,88.48,89.39,89.70,
+89.02,89.90,89.17,92.63,92.37,91.08,91.46,92.58,93.95,95.79,
+97.76,97.48,97.58,97.74,97.01,95.75,96.82,99.14,98.44,102.86,
+101.02,98.63,101.65,102.29,102.77,105.99,104.95,106.19,107.40,105.79,
+106.03,108.74,111.08,109.04,112.06,106.53,109.84,110.75,111.18,113.55,
+112.45,115.17,115.52,115.25,112.34,114.70,117.13,119.69,116.45,115.43,
+119.00,121.37,120.93,119.70,119.28,121.53,121.26,124.64,124.13,124.16,
+125.85,123.66,126.09,126.31,127.68,127.52,131.12,127.87,127.74,129.02,
+128.70,132.00,129.52,132.01,135.39,131.16,133.40,132.76,133.52,137.78,
+135.04,139.33,140.75,134.94,139.00,141.89,138.27,140.97,140.88,141.74,
+143.07,146.87,142.58,142.53,144.55,144.25,147.53,149.04,147.15,151.19,
+151.73,147.61,152.29,150.26,150.85,151.54,150.77,151.64,152.97,154.58,
+151.43,154.03,156.94,155.81,156.46,157.11,157.48,159.27,159.87,156.94,
+160.86,159.30,161.76,161.28,164.31,161.40,162.11,168.09,167.40,166.00,
+162.67,168.94,166.88,167.35,172.30,170.88,174.32,170.85,171.24,170.66,
+171.59,174.18,172.47,174.07,176.15,174.77,176.21,179.09,177.22,176.61,
+4.76,4.95,5.46,5.80,6.70,7.22,7.83,8.32,8.15,9.81,
+9.85,10.60,10.72,11.35,11.56,12.61,13.01,13.88,13.86,13.93,
+14.37,15.43,15.38,15.76,17.16,16.18,17.80,17.44,18.93,18.02,
+21.06,20.11,20.76,20.93,22.29,21.84,22.53,22.98,24.12,24.17,
+23.69,24.92,25.14,25.93,26.34,25.99,27.18,28.09,27.83,29.18,
+27.97,30.41,30.29,29.63,29.30,30.70,32.34,29.84,33.21,32.26,
+33.00,33.90,33.65,34.28,35.52,35.82,35.25,37.72,38.34,38.07,
+38.15,37.25,40.09,39.20,40.72,41.59,41.85,41.03,42.47,42.78,
+44.00,43.43,43.52,44.98,45.88,45.42,45.70,46.56,48.16,46.94,
+48.26,48.17,49.16,49.45,49.58,50.26,51.29,51.09,54.21,52.95,
+53.62,53.82,55.03,55.52,54.07,54.93,56.88,56.71,55.95,56.67,
+57.19,57.01,58.34,58.94,59.73,60.62,58.63,60.18,60.95,60.21,
+61.43,64.18,63.90,62.02,64.91,63.53,63.85,64.86,63.46,66.22,
+66.86,67.99,67.13,68.75,67.75,69.08,70.28,71.48,71.38,70.06,
+71.72,72.16,74.03,73.51,76.24,74.83,74.26,75.41,76.18,74.86,
+78.08,75.93,75.82,78.28,79.56,80.10,80.90,82.67,79.72,83.51,
+80.84,82.38,83.93,82.99,85.27,82.32,84.36,85.50,85.31,88.17,
+86.01,87.63,85.02,87.94,88.69,88.90,89.44,90.46,90.61,92.68,
+90.46,90.18,92.15,92.14,92.24,96.42,93.85,94.39,96.60,95.07,
+94.56,96.21,96.03,96.13,98.39,99.69,98.44,97.47,101.50,101.07,
+99.71,101.76,102.00,102.32,103.22,100.83,104.70,103.89,105.98,104.91,
+104.06,105.09,107.20,107.90,104.40,107.02,108.28,109.27,109.77,109.04,
+110.86,111.31,112.36,113.89,114.67,112.88,114.86,116.21,112.72,114.01,
+115.81,116.29,116.08,116.38,116.41,116.99,118.68,118.60,120.06,116.05,
+123.75,119.90,119.30,118.80,119.77,121.65,122.49,123.44,125.75,124.16,
+124.12,127.60,125.84,126.94,128.10,124.86,129.24,129.95,130.48,128.67,
+129.09,129.36,131.61,131.93,130.21,130.29,130.66,133.89,135.63,133.40,
+131.63,130.44,133.34,131.11,134.34,141.00,136.39,135.45,141.32,135.18,
+139.78,140.94,138.32,141.71,141.90,142.41,139.96,143.84,142.30,143.01,
+3.50,4.86,4.76,5.49,5.43,5.76,6.39,6.32,7.05,7.80,
+7.63,7.92,8.20,9.03,10.07,10.01,10.57,10.48,10.50,11.18,
+12.31,12.37,12.54,12.46,12.89,12.48,13.15,14.60,14.71,14.21,
+14.47,15.86,16.19,16.12,16.21,17.91,18.44,18.75,19.21,18.57,
+19.71,20.16,21.31,21.02,21.62,21.80,21.12,20.96,22.99,21.42,
+24.07,22.92,24.75,24.66,24.76,24.60,24.11,25.40,26.73,27.95,
+25.00,27.18,27.00,29.66,29.36,29.17,29.71,30.14,30.25,31.14,
+30.36,31.56,31.96,31.94,32.19,32.71,33.80,33.91,33.58,35.72,
+33.27,35.99,34.09,36.40,36.71,36.41,34.79,38.20,36.78,38.58,
+38.57,39.07,36.25,39.76,41.32,39.12,41.71,41.15,39.68,40.30,
+41.71,43.45,42.45,43.05,44.87,43.51,44.87,44.86,45.82,46.58,
+45.58,46.72,48.27,47.04,48.17,48.27,48.28,49.41,51.35,50.77,
+49.95,51.47,50.94,51.25,52.27,52.27,51.42,53.23,52.85,53.09,
+53.86,54.60,56.18,55.40,55.45,57.06,55.81,59.39,56.75,58.32,
+57.27,60.25,59.33,58.43,61.00,60.59,61.78,58.64,62.70,60.30,
+61.01,61.16,63.60,61.67,64.77,61.48,64.52,64.54,66.10,65.00,
+66.10,65.28,66.27,65.91,68.92,68.66,66.44,66.87,70.40,67.01,
+69.72,72.13,67.39,71.43,71.35,71.68,71.63,69.48,74.71,75.25,
+72.44,72.02,73.23,74.23,71.89,75.09,75.92,75.93,77.43,75.28,
+76.55,77.96,77.68,78.71,80.15,76.92,80.05,81.41,81.46,81.03,
+83.04,82.20,83.04,82.93,80.93,85.35,84.00,84.28,83.89,83.55,
+84.45,87.97,84.52,84.11,83.61,87.88,87.28,85.04,87.92,90.45,
+90.01,90.50,91.68,89.45,90.06,90.34,92.51,89.38,91.00,90.42,
+93.90,93.93,94.43,92.31,95.34,95.38,96.59,93.98,93.44,97.39,
+95.86,97.84,97.35,95.68,99.50,97.71,96.87,98.87,98.37,100.82,
+100.76,98.21,103.51,101.51,101.53,98.82,102.11,102.27,103.08,105.34,
+105.48,101.51,107.66,105.27,107.25,105.83,106.63,106.49,106.17,105.82,
+105.78,106.83,108.66,106.90,109.26,109.62,111.36,112.15,112.00,111.12,
+111.30,113.65,113.95,113.32,114.78,113.50,111.33,114.28,115.66,114.35,
+3.17,3.63,3.73,4.23,4.60,4.99,5.15,5.62,6.13,6.60,
+6.60,6.51,7.29,7.80,7.61,7.46,8.79,9.05,8.44,8.93,
+9.37,9.57,10.16,10.42,11.04,10.88,11.76,12.38,12.72,12.39,
+12.08,11.71,13.30,12.80,12.86,15.20,13.67,15.08,14.50,15.13,
+14.89,16.39,16.69,16.26,16.93,18.12,17.05,17.00,17.05,19.07,
+18.22,20.64,18.51,19.77,18.51,20.40,20.76,20.71,21.08,20.76,
+22.80,23.31,22.40,23.04,22.62,23.07,24.43,24.96,24.58,24.10,
+25.26,25.66,27.55,25.38,25.79,26.51,25.90,27.19,26.31,27.74,
+28.29,29.27,28.32,29.14,28.08,29.87,30.10,29.83,31.61,31.29,
+30.00,30.18,30.87,31.60,33.22,31.90,33.14,35.19,34.30,33.67,
+34.77,35.52,35.28,35.55,35.79,35.44,37.67,36.46,37.89,37.02,
+37.32,36.67,38.28,37.79,37.81,38.88,39.05,42.11,40.59,39.72,
+39.36,40.63,42.09,41.70,41.28,42.25,42.70,40.73,43.20,42.12,
+43.60,42.30,46.29,45.60,44.84,44.62,45.81,46.93,44.64,46.10,
+47.85,47.41,48.61,49.87,48.90,47.46,49.45,46.61,48.67,48.78,
+49.60,48.20,50.88,48.55,52.72,49.56,50.73,50.74,52.99,53.16,
+53.11,53.34,53.95,51.32,53.28,54.73,54.13,56.26,55.91,55.86,
+54.40,57.11,57.38,57.00,57.26,57.95,55.98,58.51,57.73,59.02,
+57.44,61.80,57.85,60.54,59.38,60.66,62.54,63.36,62.09,64.11,
+61.99,62.77,62.62,61.64,61.97,64.08,63.95,66.91,63.71,63.23,
+66.08,66.39,66.11,65.70,66.80,67.33,67.04,66.94,68.40,67.28,
+68.69,69.03,69.34,67.52,68.78,69.98,69.52,70.66,69.16,72.04,
+69.92,72.97,71.61,73.05,73.43,74.42,74.36,73.37,76.19,74.84,
+75.44,75.45,74.50,77.21,75.68,76.76,78.32,78.23,78.30,75.42,
+76.84,76.75,78.55,77.66,80.62,80.06,79.49,80.45,77.84,81.47,
+80.92,79.90,83.04,80.52,80.29,81.22,82.65,83.56,84.68,81.93,
+83.95,82.97,83.74,82.95,86.65,86.62,85.44,87.47,84.73,86.74,
+87.22,86.16,88.95,90.26,88.77,89.17,90.25,89.59,86.58,89.73,
+91.82,90.22,91.87,91.70,91.41,92.19,91.90,93.75,93.06,91.51,
+3.08,2.59,3.14,3.12,3.65,4.23,4.11,4.33,4.50,5.21,
+5.07,5.13,5.96,6.54,6.09,6.07,6.22,7.16,7.23,7.83,
+6.60,7.52,8.45,7.74,9.40,8.97,8.81,9.50,10.29,9.68,
+9.60,10.10,11.08,10.21,10.95,11.38,11.37,11.50,11.30,12.54,
+12.36,12.18,13.55,13.20,13.69,13.04,15.02,14.63,15.15,14.49,
+14.97,15.88,15.49,16.28,15.78,16.74,16.57,17.22,16.52,17.01,
+18.68,18.28,18.48,18.56,18.60,18.97,18.57,18.61,18.59,19.54,
+19.23,21.73,20.83,19.85,20.99,22.03,21.46,22.83,21.19,21.90,
+22.46,22.03,23.96,22.59,24.65,25.21,22.62,24.83,24.75,24.70,
+24.37,24.86,26.39,24.86,26.78,27.51,26.02,26.54,27.74,28.22,
+27.46,28.39,27.19,27.18,27.59,29.52,30.11,29.23,29.24,29.39,
+29.75,29.53,29.85,31.43,31.00,31.67,32.44,31.49,31.94,32.52,
+30.37,32.34,33.65,33.28,34.72,33.77,33.70,34.81,34.29,36.34,
+33.63,36.47,35.04,34.15,36.75,35.83,36.30,35.79,35.18,38.29,
+38.51,37.55,38.01,37.57,38.60,40.59,39.82,40.35,40.13,36.62,
+38.62,40.95,38.16,41.05,42.44,41.46,40.94,40.42,43.71,42.77,
+42.40,43.29,42.80,41.70,43.89,42.12,43.20,45.24,46.10,43.72,
+45.65,44.65,44.99,44.66,45.19,47.10,45.92,46.29,45.47,46.35,
+48.11,47.98,47.70,47.31,47.82,49.19,49.05,50.14,50.29,47.86,
+48.52,50.38,50.42,53.10,49.39,51.53,52.41,51.66,51.02,52.20,
+52.41,53.45,53.91,52.94,51.94,51.01,55.34,54.68,55.78,53.57,
+55.40,57.53,54.92,56.14,57.70,57.47,58.07,57.34,57.53,56.94,
+58.63,58.97,58.79,56.93,59.86,59.80,58.93,60.46,60.42,60.10,
+58.12,60.72,59.72,59.04,61.90,61.20,62.91,61.67,63.09,63.02,
+62.57,64.07,62.38,64.10,62.10,63.54,63.86,64.51,65.15,63.42,
+64.98,65.86,66.05,66.51,67.78,66.61,65.14,67.55,67.93,66.63,
+68.67,68.49,66.61,66.12,69.56,68.18,68.73,71.12,69.17,69.65,
+69.72,69.51,70.98,69.02,72.45,69.70,71.10,74.26,69.33,75.46,
+74.15,72.68,73.44,73.20,74.03,73.97,72.38,75.44,74.12,74.84,
+1.95,2.07,2.08,2.67,2.39,2.93,3.69,3.36,3.78,3.47,
+4.34,4.48,4.85,4.56,5.40,4.89,5.73,5.88,5.86,5.70,
+6.16,5.95,6.51,7.20,7.28,6.47,7.82,7.70,7.46,6.91,
+8.36,8.33,7.75,8.77,10.13,9.50,8.41,9.47,9.82,9.51,
+10.39,9.88,10.45,9.57,10.43,10.63,11.71,11.69,11.50,12.28,
+11.38,12.02,12.93,13.03,11.61,12.90,13.78,13.18,13.87,14.00,
+14.28,14.40,13.65,14.41,13.91,14.87,13.76,14.01,15.72,15.18,
+15.65,15.91,17.48,15.78,16.51,17.41,17.12,18.70,18.34,17.35,
+18.85,18.79,17.57,18.58,18.70,18.21,18.86,19.32,20.58,19.85,
+20.04,20.19,20.18,21.34,21.13,20.84,22.82,21.15,21.24,21.37,
+23.21,22.34,21.57,22.52,22.87,23.34,24.11,23.86,23.87,24.36,
+24.60,24.31,24.20,26.09,25.97,25.75,25.94,25.40,25.81,25.92,
+25.83,27.21,26.53,26.80,26.85,27.57,25.46,29.45,27.23,27.89,
+28.56,29.18,28.46,29.07,30.54,29.58,28.44,29.56,28.64,30.44,
+31.67,29.62,29.67,31.25,31.98,31.25,32.36,32.67,31.72,30.02,
+31.63,32.08,32.25,33.49,32.95,33.31,33.77,33.55,33.88,33.17,
+36.01,34.30,35.68,35.05,35.87,34.17,34.90,35.56,37.87,37.38,
+35.85,35.88,37.90,38.61,37.59,36.61,37.59,36.05,37.44,38.10,
+38.17,37.74,38.68,39.38,38.48,38.28,41.04,40.93,39.63,38.04,
+43.40,41.15,41.66,41.63,41.39,40.98,41.79,40.76,41.96,41.17,
+42.31,43.67,42.58,41.56,42.66,42.94,43.77,44.99,44.02,45.05,
+44.31,42.76,45.33,45.64,46.33,45.11,45.10,47.79,46.29,44.48,
+44.72,46.21,45.88,47.12,48.06,48.25,46.79,48.13,48.89,46.80,
+47.81,48.76,47.50,48.36,48.60,48.53,50.54,47.52,49.47,49.36,
+49.00,50.33,51.38,50.27,47.82,49.50,50.18,49.69,51.96,51.02,
+52.12,52.36,53.10,52.69,53.12,56.63,53.27,52.79,52.24,56.19,
+52.95,55.06,54.09,55.87,55.50,54.39,56.15,53.61,57.89,55.80,
+56.29,56.78,58.20,57.61,56.65,56.47,57.21,56.48,58.39,56.86,
+58.63,60.70,59.26,58.39,60.95,59.74,59.84,60.72,58.02,60.30,
+1.61,1.96,2.14,2.05,2.08,2.33,2.27,2.27,2.62,3.22,
+3.03,3.76,3.15,3.71,3.87,4.63,3.72,4.65,5.09,4.47,
+4.88,5.14,5.34,5.31,5.41,5.88,5.24,5.96,5.86,5.88,
+5.66,6.54,7.00,7.39,7.16,6.83,7.40,7.43,7.69,7.67,
+8.11,8.53,8.12,8.84,8.43,9.36,9.23,8.63,9.71,9.41,
+9.78,9.61,10.06,10.32,10.62,10.79,10.84,10.99,10.28,11.24,
+11.75,12.39,12.36,11.37,12.33,12.46,12.07,12.43,11.71,13.23,
+12.43,13.13,13.98,13.19,13.27,13.14,14.22,14.73,13.81,14.45,
+13.88,14.36,14.14,15.84,15.33,15.18,14.74,16.25,15.58,16.88,
+16.32,16.23,15.90,17.58,16.67,16.93,17.06,17.68,16.93,18.37,
+17.48,17.50,18.69,18.43,17.60,18.05,18.34,18.60,18.75,20.48,
+19.66,19.21,19.23,18.76,19.52,21.18,21.42,22.19,21.38,21.06,
+21.43,19.99,20.33,20.19,19.91,20.49,22.02,23.27,20.87,21.62,
+21.95,22.05,22.20,23.46,22.80,23.84,23.20,23.18,24.72,25.24,
+24.47,23.87,24.21,23.73,24.21,25.06,25.64,26.60,26.84,24.45,
+26.77,27.59,26.68,27.05,26.58,26.21,25.07,26.44,27.09,28.00,
+26.58,27.94,27.64,27.69,26.95,29.12,30.05,28.83,28.11,29.10,
+27.65,28.93,28.93,29.13,29.76,29.63,29.51,29.88,31.57,28.62,
+30.46,30.42,30.81,29.43,30.93,30.26,31.56,31.24,31.09,31.77,
+31.79,33.74,33.01,31.46,33.09,30.96,32.44,33.76,34.17,34.08,
+35.60,34.95,34.38,33.71,33.33,33.41,35.45,34.06,33.54,33.77,
+31.72,35.28,37.15,36.36,33.67,34.59,36.04,38.50,37.28,36.30,
+36.59,38.84,36.74,37.74,36.40,37.05,36.53,37.40,36.90,38.89,
+38.73,38.18,41.01,39.87,38.85,39.99,39.02,39.27,39.28,39.28,
+40.31,39.52,38.86,39.37,40.22,40.82,41.61,40.90,41.13,40.73,
+40.43,41.04,43.35,42.58,42.85,43.43,41.98,44.24,41.41,42.38,
+40.81,43.92,41.74,45.12,44.51,44.90,43.22,44.40,44.02,43.77,
+42.49,43.68,44.38,45.28,42.94,45.72,43.67,45.96,44.58,44.67,
+46.07,46.43,47.55,46.78,46.33,47.65,46.73,46.81,47.59,46.90,
+1.25,1.72,1.76,1.78,1.91,1.67,2.20,2.09,2.34,2.51,
+2.36,2.59,2.85,2.83,3.32,3.17,2.98,3.78,3.82,3.36,
+3.36,3.81,4.53,4.39,4.14,4.02,4.46,5.16,5.18,4.42,
+4.68,4.78,5.61,5.42,5.58,5.90,6.52,5.78,6.19,6.02,
+6.49,6.54,7.13,7.55,7.01,7.52,6.72,7.79,8.21,7.91,
+7.80,7.53,8.26,7.70,7.21,8.47,7.75,7.63,9.11,9.23,
+8.81,9.58,9.72,8.86,10.00,10.31,10.32,9.77,10.67,10.07,
+10.57,9.47,10.70,10.40,10.88,10.71,10.56,11.62,10.97,11.84,
+11.20,11.22,12.12,11.21,11.85,11.95,12.62,12.26,12.81,13.58,
+12.19,13.65,14.24,13.55,13.71,13.26,13.46,13.73,14.44,14.46,
+14.70,14.23,15.32,14.82,15.68,15.09,15.55,15.32,14.90,14.34,
+15.17,15.39,16.28,16.14,16.17,16.57,17.00,17.00,17.23,16.93,
+17.57,16.32,17.47,16.49,16.86,17.66,17.15,17.38,17.61,19.33,
+17.66,17.48,17.07,18.53,17.24,18.92,19.66,19.20,18.86,19.49,
+19.51,17.76,20.11,18.97,19.57,20.04,19.94,19.92,21.06,19.93,
+20.93,21.57,20.75,20.74,20.25,21.31,21.49,20.77,22.77,21.52,
+20.93,21.68,22.40,22.53,23.70,23.36,22.01,22.18,22.96,23.34,
+22.22,21.72,24.15,23.13,22.61,23.65,23.32,24.22,24.87,24.51,
+22.46,24.04,24.75,24.64,25.12,25.55,26.05,25.70,25.74,26.03,
+24.73,25.02,25.02,25.78,26.64,26.95,27.39,25.20,25.58,28.15,
+27.97,27.01,27.21,25.42,27.72,27.24,26.35,27.71,28.29,28.54,
+28.11,28.39,31.02,29.47,30.19,30.16,28.07,29.45,29.73,27.68,
+27.72,29.99,29.90,30.59,31.43,30.39,28.35,31.23,31.98,30.77,
+29.70,31.02,30.98,30.21,31.61,30.84,31.83,30.40,32.45,30.01,
+30.52,30.64,33.30,32.62,32.98,32.41,34.35,32.39,34.50,33.14,
+33.93,31.56,33.16,32.37,32.57,34.30,33.12,33.38,33.62,33.40,
+33.32,34.18,33.65,35.46,36.00,35.33,35.19,36.97,35.42,35.57,
+35.23,34.73,36.52,36.70,35.70,34.95,36.67,35.68,37.10,37.11,
+36.27,37.81,35.75,36.20,38.76,37.02,38.29,36.81,37.86,40.76,
+27.43,30.86,34.36,35.87,37.47,41.12,43.45,46.08,48.55,52.13,
+54.75,57.03,60.37,63.15,66.23,69.02,70.07,73.45,78.36,78.50,
+81.80,85.25,87.29,91.54,93.43,94.83,96.34,99.87,104.09,105.94,
+109.39,111.35,113.46,118.38,120.48,123.06,124.62,128.26,129.95,131.54,
+136.15,137.27,141.55,144.45,147.86,148.85,152.98,154.96,159.26,161.06,
+163.56,166.07,166.31,171.63,174.75,176.28,178.93,178.46,183.33,186.49,
+193.16,190.35,195.38,198.80,203.78,202.62,205.63,206.89,213.42,212.80,
+215.42,222.59,222.99,225.93,226.46,230.79,232.04,237.35,239.38,241.07,
+244.93,247.09,247.03,250.89,252.02,258.29,259.05,263.92,265.29,267.60,
+269.79,273.84,276.37,281.46,279.58,282.88,286.39,288.62,292.91,294.38,
+298.68,298.75,304.92,306.53,311.20,310.70,316.05,320.53,319.18,322.56,
+325.94,328.23,331.00,330.98,332.75,337.47,341.58,344.00,346.92,347.34,
+349.71,351.95,358.14,360.39,358.16,362.51,367.90,368.05,371.79,377.07,
+378.42,379.63,383.37,385.11,390.60,389.76,394.63,398.02,402.01,401.05,
+404.31,407.21,412.40,414.52,414.28,417.60,421.64,422.11,425.40,429.76,
+432.04,432.77,438.64,435.98,441.34,447.77,447.91,450.79,454.62,457.44,
+461.16,461.65,461.14,461.59,469.27,477.53,474.93,480.39,477.24,481.60,
+488.70,489.09,491.66,494.81,498.01,500.00,499.86,506.64,504.41,513.94,
+509.59,514.69,517.70,521.67,520.16,523.69,530.24,530.70,536.48,534.70,
+539.01,545.84,543.14,545.63,552.08,549.05,558.68,559.97,562.95,563.92,
+568.36,566.14,572.73,575.94,578.37,581.72,584.80,586.43,583.87,588.63,
+595.21,594.76,596.60,601.22,607.31,609.46,605.21,616.78,618.37,618.32,
+621.56,622.25,627.04,629.41,632.88,634.36,639.80,637.65,642.53,648.60,
+647.84,647.36,653.85,657.43,657.99,659.45,658.74,661.09,669.91,674.52,
+672.57,676.06,679.49,685.24,689.51,684.14,693.66,695.47,697.45,696.57,
+701.20,700.06,710.86,707.29,711.88,714.54,713.93,719.19,726.26,727.34,
+730.25,729.62,732.22,734.89,738.26,736.88,749.42,748.63,747.71,751.66,
+755.17,755.60,760.85,757.77,764.90,768.32,774.41,777.68,777.50,777.18,
+783.01,783.98,787.33,787.28,796.73,799.53,799.34,800.58,797.97,805.72,
+23.37,25.55,27.55,29.37,32.11,33.93,36.69,40.01,41.50,42.74,
+46.11,48.67,51.00,53.54,54.99,56.83,59.05,61.58,64.85,65.95,
+67.78,70.58,72.31,76.36,76.74,79.70,82.22,83.49,85.90,90.85,
+91.49,93.21,97.31,99.84,100.18,103.02,104.63,107.16,107.40,111.48,
+112.97,114.94,121.51,120.28,123.45,124.56,127.94,128.74,131.13,134.60,
+134.29,137.19,141.40,142.42,146.42,146.21,149.89,151.71,155.31,156.64,
+158.09,161.11,162.46,163.76,166.56,171.59,173.81,176.61,174.99,178.90,
+181.96,183.22,188.58,190.12,194.04,194.11,193.53,198.92,198.95,201.13,
+203.42,205.79,208.26,211.23,209.82,215.49,220.15,220.32,222.41,225.19,
+226.86,228.69,232.27,233.05,234.46,239.05,241.21,243.14,242.88,245.01,
+246.83,249.14,253.59,256.56,260.30,261.69,260.25,261.69,267.48,268.88,
+274.75,272.59,275.51,277.47,280.06,281.32,282.36,290.34,293.76,289.47,
+293.04,292.57,296.07,300.91,304.44,307.84,308.66,309.89,310.02,313.90,
+317.29,320.74,321.28,325.57,328.10,330.16,330.53,333.33,337.08,338.94,
+339.22,344.04,342.69,345.44,347.10,348.48,355.38,352.26,356.44,360.59,
+364.78,365.37,368.46,370.12,368.84,373.42,378.00,382.62,382.96,384.00,
+381.32,391.62,391.57,384.88,393.60,396.62,396.73,401.18,400.58,404.57,
+406.61,408.16,410.32,416.69,415.71,415.01,420.27,423.90,425.69,428.93,
+429.21,432.22,435.03,435.67,443.05,440.00,444.33,443.17,446.51,445.44,
+453.95,455.10,456.70,457.25,462.85,460.80,468.75,467.43,474.56,475.50,
+475.77,479.40,480.93,483.48,485.00,488.04,489.86,494.95,491.39,497.08,
+498.91,500.09,502.82,501.59,508.85,506.20,513.23,512.22,511.74,515.75,
+522.86,523.56,523.41,524.98,530.44,530.79,535.42,538.74,535.17,540.18,
+546.60,547.44,549.65,550.16,549.19,547.81,554.84,560.94,561.11,562.54,
+569.23,567.39,568.05,571.30,572.79,575.55,583.98,587.05,585.73,588.74,
+590.48,591.80,595.68,593.42,598.88,601.52,601.35,605.89,604.49,606.02,
+615.42,616.10,611.10,621.60,621.40,619.60,625.47,625.22,628.15,632.32,
+635.10,635.44,637.39,636.78,642.51,647.08,641.28,648.70,649.92,651.91,
+659.34,661.23,657.03,662.04,666.58,663.86,671.96,670.74,673.37,670.70,
+19.66,20.96,23.90,25.82,27.94,29.68,30.26,32.52,34.02,36.83,
+38.36,40.88,42.89,43.82,45.76,48.66,50.08,50.48,55.20,55.13,
+57.13,57.88,60.30,62.29,63.99,65.44,69.44,70.08,72.94,72.36,
+76.90,77.16,79.86,82.83,83.84,84.07,87.72,88.66,91.90,92.63,
+93.97,95.03,99.87,99.82,102.40,106.49,107.01,108.69,109.11,113.32,
+114.52,114.05,118.15,119.59,120.39,122.23,123.76,124.79,127.20,131.73,
+133.41,132.66,134.53,137.12,140.27,140.69,142.64,147.49,147.68,149.47,
+153.35,152.74,155.41,155.19,159.61,160.93,163.05,167.97,165.28,170.50,
+171.62,171.68,172.90,174.20,176.33,181.36,179.21,185.16,185.32,188.83,
+189.26,191.21,191.68,193.69,195.82,197.44,199.32,201.50,202.98,204.94,
+208.16,208.39,212.06,213.37,212.55,219.01,219.75,219.24,223.18,224.63,
+226.72,229.42,229.97,230.19,237.63,238.65,238.35,242.88,242.52,242.10,
+243.69,249.26,249.60,250.03,254.42,254.61,256.24,259.55,257.60,262.78,
+264.41,265.71,266.64,269.86,272.60,270.30,275.33,278.01,280.40,281.72,
+279.81,284.47,286.23,288.09,288.83,293.28,296.06,295.58,297.74,298.94,
+303.49,302.36,304.67,308.24,306.74,313.04,310.26,315.09,319.69,316.27,
+319.61,322.48,324.85,327.14,330.52,331.52,332.92,332.09,336.72,340.21,
+337.86,342.69,345.14,345.21,347.02,354.78,348.58,353.48,355.21,356.41,
+357.31,356.69,363.47,367.10,366.21,365.06,371.20,374.03,372.55,373.09,
+377.19,379.62,377.60,382.98,383.98,387.60,390.21,389.06,393.50,398.51,
+394.88,397.89,398.39,405.53,402.11,409.65,410.93,408.98,409.89,413.15,
+413.15,417.45,417.70,422.03,422.65,426.56,425.05,427.42,432.75,432.97,
+438.66,434.69,437.90,438.87,443.56,444.59,440.83,450.22,448.16,452.64,
+453.91,452.79,454.35,456.09,459.79,462.90,465.00,466.88,468.95,476.99,
+467.49,476.05,477.19,478.77,478.69,479.67,481.11,485.68,485.26,490.51,
+490.76,490.99,491.45,495.31,500.68,502.67,500.38,503.77,507.29,509.21,
+505.01,508.78,507.94,513.67,516.85,519.54,521.03,522.66,522.82,528.04,
+526.63,531.18,530.41,531.81,535.08,535.25,538.28,540.42,547.09,543.37,
+549.85,548.68,553.78,554.74,551.97,557.18,560.57,558.84,560.90,563.34,
+15.65,17.43,19.45,20.86,22.65,24.64,25.07,27.20,28.13,30.13,
+31.64,33.11,34.34,36.25,37.38,39.69,40.16,44.03,44.76,45.28,
+46.95,49.35,50.96,51.27,52.56,53.93,55.80,58.58,58.26,61.06,
+63.63,64.13,63.84,68.53,70.34,69.55,72.43,73.05,74.44,78.57,
+78.88,79.84,80.74,83.07,85.03,86.36,89.55,90.28,93.38,91.51,
+94.74,93.76,98.49,97.53,100.29,102.47,103.88,104.36,106.88,110.21,
+108.72,112.37,112.57,114.83,117.30,116.46,119.33,122.60,120.81,124.84,
+124.81,127.55,130.30,130.01,129.50,132.70,136.46,136.89,138.60,139.40,
+139.41,140.97,146.00,145.30,149.19,147.72,151.73,153.90,152.82,154.65,
+157.24,157.34,159.15,157.49,162.95,165.53,166.93,168.80,171.48,169.55,
+171.24,175.42,174.44,174.99,178.29,184.48,182.18,186.51,187.38,187.57,
+189.21,188.16,190.04,192.79,195.30,196.82,196.32,201.12,201.05,200.99,
+203.78,206.44,210.59,208.78,211.01,209.54,212.54,215.42,216.76,215.82,
+222.37,219.32,221.86,224.98,226.14,225.90,227.57,231.93,230.99,234.35,
+234.16,236.66,239.49,240.63,243.05,241.18,243.59,245.97,248.10,248.39,
+250.91,252.43,253.35,254.16,256.19,259.47,262.89,259.08,262.67,263.77,
+268.03,267.18,270.87,269.70,270.85,271.87,276.09,276.70,280.22,279.13,
+281.66,283.40,286.29,285.68,288.94,291.62,289.53,293.97,295.69,294.57,
+296.46,300.74,302.40,302.95,304.56,305.96,302.72,306.77,311.15,312.34,
+312.15,311.71,312.83,319.28,319.41,323.71,322.60,325.19,324.01,330.31,
+329.74,330.42,332.93,335.51,335.64,334.28,339.21,340.30,340.63,344.76,
+341.71,346.54,349.78,348.89,347.60,353.56,355.02,359.13,360.01,362.73,
+357.96,365.73,365.11,367.64,363.96,367.32,367.41,372.16,374.24,376.08,
+376.49,375.18,381.61,375.41,381.40,381.82,385.23,383.15,391.12,390.14,
+383.76,394.44,394.88,393.65,397.88,402.13,401.80,401.40,401.04,406.91,
+405.57,406.56,409.87,411.28,409.61,409.70,420.52,416.76,420.68,419.94,
+420.26,424.64,427.33,428.25,429.71,428.29,433.94,436.57,431.88,436.45,
+437.83,439.05,447.68,443.43,440.62,448.85,446.65,448.87,453.47,452.28,
+452.06,456.01,456.22,460.32,454.73,462.29,466.46,466.14,464.27,465.16,
+13.05,14.98,16.30,17.36,18.65,20.33,20.95,22.00,23.30,24.73,
+26.12,27.99,28.73,30.65,31.13,33.02,34.22,34.76,37.08,37.85,
+38.89,39.49,42.69,43.01,44.51,45.29,46.21,48.84,51.76,49.02,
+52.39,53.91,54.40,57.66,57.97,58.62,58.93,60.78,61.16,62.41,
+65.64,65.12,68.02,69.62,70.96,72.83,72.96,74.04,76.39,77.37,
+77.55,78.37,81.46,81.93,83.07,84.15,84.20,86.33,88.51,87.29,
+90.52,91.44,92.95,93.79,96.11,98.77,97.66,101.30,99.89,102.55,
+102.67,104.00,106.01,106.75,110.14,113.86,111.22,110.81,114.80,114.47,
+118.52,117.73,119.29,120.10,121.37,123.04,125.10,123.47,126.64,126.46,
+131.22,127.37,134.28,133.62,136.68,135.76,136.85,140.53,140.96,139.40,
+142.48,144.52,146.71,147.07,146.88,147.56,148.23,153.60,152.14,153.15,
+154.39,156.43,159.52,159.86,159.15,161.42,162.99,167.53,165.75,166.10,
+171.39,168.81,172.72,172.78,171.72,175.82,179.88,174.38,176.72,178.74,
+179.18,185.94,182.76,184.32,187.44,186.13,188.87,190.93,192.64,190.85,
+195.04,194.18,198.87,196.43,200.49,198.22,204.31,202.16,205.92,209.80,
+207.87,206.56,206.30,215.41,211.85,214.98,215.00,216.64,218.00,217.52,
+216.47,220.90,224.10,225.04,223.46,227.06,225.87,227.63,228.69,231.90,
+231.78,233.55,236.97,233.95,238.55,241.20,239.53,240.49,245.22,244.59,
+247.39,246.27,245.89,249.05,252.05,251.70,254.38,255.58,254.24,254.75,
+256.62,259.50,263.21,263.78,264.55,262.41,265.01,268.59,268.71,268.98,
+272.03,273.58,276.05,273.04,277.14,281.11,281.33,277.90,282.89,286.28,
+282.96,284.82,289.55,288.42,289.18,292.18,291.80,293.25,295.98,298.37,
+295.66,297.32,299.26,303.11,301.58,302.50,306.98,306.94,305.24,308.44,
+315.28,311.50,314.39,317.60,312.50,320.24,316.37,321.31,322.33,325.74,
+323.38,324.51,322.88,325.13,329.77,327.45,329.32,330.80,334.37,330.99,
+336.25,337.39,337.99,341.50,337.42,342.79,340.16,345.56,345.04,347.69,
+346.82,353.37,355.00,355.54,354.90,353.11,357.43,357.15,358.20,364.96,
+363.69,362.85,367.90,363.44,366.82,364.80,367.90,372.85,372.06,374.57,
+378.40,372.05,376.63,376.56,379.69,385.87,382.43,382.98,383.94,389.90,
+11.14,12.32,13.28,14.00,14.94,15.22,17.44,18.04,19.27,20.61,
+23.07,22.52,23.69,26.03,25.94,25.89,28.98,29.36,30.14,30.00,
+33.62,32.01,34.75,35.87,36.74,37.54,38.63,40.29,41.18,42.09,
+42.25,44.13,45.96,46.78,47.42,47.45,48.97,51.91,51.38,52.56,
+53.89,53.14,55.62,56.32,58.63,60.34,59.27,63.04,65.14,62.67,
+65.61,66.21,64.92,68.41,68.76,70.66,73.56,71.95,72.41,72.30,
+75.26,76.08,77.92,77.91,77.88,81.90,82.00,82.32,86.25,83.96,
+86.02,86.91,85.98,90.43,91.27,92.25,93.77,92.43,92.95,96.25,
+96.36,97.06,99.58,100.26,99.48,99.38,100.90,103.48,104.84,107.50,
+108.41,110.20,107.59,111.98,113.57,111.82,111.84,114.20,116.10,118.91,
+118.95,117.63,120.67,122.15,121.52,124.54,126.05,126.16,125.78,126.50,
+125.91,129.51,126.65,129.86,134.58,134.47,135.23,134.49,137.72,139.47,
+137.54,138.59,141.52,143.65,143.83,142.08,143.41,144.93,146.28,147.55,
+150.77,150.39,151.46,153.75,156.14,155.08,156.33,155.94,156.59,159.51,
+160.00,160.88,164.92,164.95,163.34,167.11,164.63,164.25,168.65,172.31,
+170.59,173.03,172.62,173.56,173.32,177.11,175.55,178.56,180.12,179.94,
+183.42,185.19,186.07,184.97,186.14,189.87,186.66,190.25,192.34,190.53,
+192.25,194.83,194.04,198.93,193.25,198.00,198.48,199.65,204.06,203.63,
+201.26,206.22,208.18,207.18,207.01,208.60,213.32,211.22,212.91,211.72,
+216.86,214.99,216.20,216.36,217.72,218.71,218.51,223.34,224.58,222.65,
+224.62,222.36,229.42,227.59,229.21,231.24,231.27,234.26,232.47,235.92,
+237.25,233.27,233.95,240.88,240.60,239.59,243.24,240.47,240.36,245.11,
+245.41,246.15,251.25,248.12,251.99,247.19,251.47,253.02,254.04,258.18,
+258.14,259.74,258.55,260.96,261.61,261.21,261.69,262.24,265.83,263.38,
+265.83,267.96,267.24,267.90,271.64,272.94,271.44,275.27,276.13,276.83,
+279.92,279.18,276.06,277.49,277.62,280.21,282.81,285.11,292.31,286.91,
+286.55,289.50,292.29,293.85,294.70,295.64,292.58,294.62,296.42,296.88,
+300.48,301.14,301.44,305.63,309.45,302.79,306.05,306.29,310.55,308.11,
+310.77,310.65,311.21,312.12,314.77,313.29,318.34,312.98,316.87,320.18,
+9.21,9.55,10.99,12.19,12.59,12.90,14.75,13.66,16.41,17.22,
+17.61,18.66,19.39,20.59,21.70,21.97,23.87,23.89,25.25,26.22,
+27.80,27.24,28.35,30.79,30.80,31.06,32.15,32.70,34.09,34.30,
+33.28,36.09,36.53,38.70,38.11,39.92,39.73,40.34,43.86,43.45,
+45.41,46.31,45.05,46.15,47.94,49.36,50.17,50.12,51.61,52.36,
+53.70,53.47,56.78,54.59,55.16,56.42,57.00,57.47,60.17,61.80,
+62.50,62.21,66.77,65.26,66.23,66.11,67.96,67.88,68.76,70.04,
+70.81,70.16,72.23,75.05,74.50,73.34,73.98,75.80,76.21,77.49,
+79.50,79.90,82.65,80.71,83.61,85.88,84.06,85.91,86.14,87.68,
+90.39,91.72,89.08,90.80,88.50,92.46,93.66,94.24,94.39,95.37,
+93.83,97.65,96.41,99.93,100.82,100.94,103.44,100.57,103.35,104.29,
+106.46,105.80,106.63,111.08,107.84,110.67,110.54,112.67,115.12,111.99,
+115.89,115.87,115.61,114.44,118.77,118.45,119.36,118.59,119.55,122.95,
+122.75,123.81,124.00,124.89,125.46,128.16,129.60,126.29,130.44,129.24,
+132.28,132.31,133.85,134.09,134.42,136.68,136.11,139.71,139.98,140.81,
+142.52,140.10,139.68,143.99,143.72,143.57,145.60,146.92,145.02,144.45,
+149.97,147.53,152.92,151.82,156.12,152.31,153.34,155.46,154.32,156.47,
+159.80,158.40,159.88,160.91,160.36,161.31,166.71,163.19,165.60,165.38,
+166.29,168.18,167.55,168.29,170.53,172.90,174.62,173.12,172.89,173.86,
+177.33,174.47,176.86,176.97,180.67,176.44,182.11,183.00,182.75,185.18,
+182.44,183.88,183.82,184.80,192.56,191.95,190.13,191.25,190.21,190.45,
+197.83,190.91,197.11,197.06,195.64,194.22,198.79,198.12,201.10,200.21,
+199.05,202.24,206.43,206.97,204.69,207.87,204.80,208.55,203.93,209.49,
+210.87,212.33,212.74,211.73,214.75,217.56,214.95,214.62,219.78,218.09,
+219.54,218.49,221.11,223.76,219.97,221.44,224.37,225.34,227.66,231.12,
+230.78,227.53,230.49,231.78,232.64,233.58,236.99,233.92,238.16,237.67,
+235.93,238.12,236.66,241.43,242.72,242.41,240.11,240.62,244.47,247.52,
+244.17,243.69,243.35,248.88,253.53,247.26,249.71,250.79,249.02,252.47,
+255.18,255.18,252.02,258.13,253.22,256.11,260.38,261.85,260.19,262.69,
+6.75,7.95,8.90,10.07,10.77,11.35,11.27,12.73,13.41,14.62,
+15.72,14.92,15.80,17.06,16.63,19.20,19.28,19.67,20.42,19.94,
+21.93,22.42,23.02,24.36,24.32,24.75,25.29,27.35,27.98,29.62,
+29.46,29.39,29.80,31.16,32.65,32.94,33.37,34.48,33.10,36.07,
+36.70,36.41,36.72,38.81,39.00,38.91,40.62,42.46,43.26,42.00,
+43.46,43.98,45.91,45.75,44.90,45.33,47.15,47.73,49.01,49.50,
+49.57,51.72,52.44,50.73,54.04,53.42,54.98,54.59,57.05,56.46,
+58.56,58.59,60.37,60.93,60.50,62.98,64.67,61.75,63.33,64.53,
+64.93,66.78,64.87,67.36,67.13,67.55,71.79,70.35,70.65,71.23,
+72.61,71.08,73.49,73.91,74.93,76.01,75.42,77.00,76.50,79.75,
+79.07,79.30,80.33,80.64,82.13,84.20,83.06,84.29,87.34,84.02,
+85.59,85.44,87.47,87.37,90.20,90.47,94.19,91.27,92.79,91.40,
+93.47,93.90,93.92,97.81,96.13,97.45,98.77,98.80,99.97,99.16,
+97.70,103.19,102.35,102.31,99.96,105.26,102.26,108.35,105.41,107.90,
+108.06,108.52,106.47,110.10,109.95,108.78,112.45,115.52,116.99,114.69,
+116.92,114.06,117.97,114.80,119.31,118.09,116.47,120.26,118.88,121.92,
+123.33,120.73,122.74,123.27,122.89,124.63,127.06,128.31,128.42,128.67,
+127.32,129.30,131.06,133.27,131.18,135.59,133.37,133.31,135.58,134.07,
+136.40,137.17,137.44,140.11,137.87,141.32,142.59,143.18,142.22,145.71,
+146.49,145.73,144.51,147.87,143.42,144.44,145.91,150.04,151.01,152.59,
+153.04,151.31,151.22,155.41,154.02,154.98,153.26,155.49,159.42,157.08,
+156.12,158.45,162.09,162.27,162.84,164.35,163.00,162.69,162.04,166.40,
+166.44,167.16,166.83,168.84,166.08,166.37,167.37,171.83,169.37,171.59,
+172.16,174.28,171.62,178.77,174.94,174.64,177.32,179.27,177.00,175.72,
+181.38,182.13,181.17,183.30,181.69,183.87,182.79,184.24,185.31,185.81,
+188.18,189.32,189.44,185.06,190.44,188.19,189.33,191.72,194.67,191.90,
+196.77,191.62,197.16,197.99,194.50,196.11,197.78,199.09,201.01,198.48,
+201.66,199.52,200.37,204.25,207.53,206.97,203.22,205.63,208.10,208.02,
+210.05,207.73,210.83,209.62,213.20,209.37,212.65,211.16,212.98,212.44,
+6.00,6.83,6.90,7.88,9.14,9.04,9.42,9.87,10.84,11.46,
+12.38,12.51,12.63,14.29,13.68,14.62,15.24,17.39,16.28,16.06,
+17.42,17.42,19.22,20.58,19.08,21.82,21.94,21.54,21.86,23.64,
+23.66,23.59,25.67,25.71,25.31,26.69,27.51,27.50,28.70,28.90,
+27.54,31.07,31.20,31.92,31.47,32.09,31.67,32.84,34.53,34.33,
+34.50,36.62,36.91,37.87,38.21,38.47,39.40,38.63,40.48,43.23,
+42.36,41.65,41.91,43.64,43.05,44.51,45.90,44.63,44.90,46.43,
+47.26,47.65,47.00,50.01,50.62,51.42,50.78,52.90,51.02,54.48,
+54.69,53.91,55.25,55.85,54.75,55.24,58.43,59.10,58.52,57.23,
+59.80,58.03,61.33,59.31,61.56,61.67,62.88,63.75,63.05,66.41,
+63.73,65.50,66.77,65.80,67.65,68.01,69.31,70.14,67.11,70.15,
+70.04,72.15,71.25,72.45,71.65,73.28,73.02,75.27,77.62,76.86,
+78.05,76.83,78.60,79.31,80.32,81.15,80.19,81.78,81.89,82.92,
+83.26,82.00,82.11,87.11,83.43,86.02,88.46,86.61,87.22,86.87,
+88.54,89.44,89.63,89.71,88.72,90.19,88.69,95.95,91.44,94.06,
+94.50,93.31,95.68,96.52,96.28,98.08,97.78,96.00,99.80,99.48,
+100.32,99.20,99.77,101.83,100.46,103.36,102.34,103.94,104.29,108.69,
+106.58,108.76,105.65,106.49,106.36,107.89,108.68,110.77,111.19,112.46,
+108.75,113.62,110.94,113.01,112.97,115.03,114.73,113.57,120.30,118.30,
+116.75,120.94,118.93,119.93,117.28,120.31,120.10,120.61,124.08,124.89,
+124.23,122.16,124.81,123.66,125.59,124.21,126.29,126.69,128.96,127.07,
+130.14,130.68,131.97,132.53,133.81,133.33,133.87,132.31,132.97,135.08,
+132.52,135.79,133.63,133.46,138.78,137.46,139.60,138.40,142.44,140.76,
+141.16,141.58,141.40,140.94,144.44,146.79,142.44,145.66,146.62,147.10,
+144.60,151.16,149.36,149.60,150.34,150.94,148.22,151.94,150.52,152.60,
+150.31,155.72,155.22,154.47,155.46,151.62,154.24,155.44,157.80,155.37,
+159.42,160.42,161.31,157.95,160.21,163.59,159.16,159.69,164.21,165.66,
+164.59,160.61,166.11,165.81,166.29,166.68,170.12,168.65,170.78,170.95,
+169.87,170.74,172.66,176.64,175.06,172.27,174.47,171.08,177.90,172.78,
+5.02,5.18,6.01,6.40,6.52,7.79,7.23,8.37,9.54,8.89,
+9.43,10.58,10.90,11.63,11.44,11.39,13.00,13.49,13.82,13.47,
+14.44,14.34,15.44,16.26,16.39,16.65,17.82,18.04,19.01,18.30,
+19.91,20.24,19.75,20.52,22.51,23.03,22.47,22.79,23.83,22.62,
+24.45,25.56,24.89,24.24,26.26,25.46,26.47,27.65,27.39,28.80,
+28.66,28.70,30.92,31.04,30.28,31.49,32.16,31.55,32.87,34.25,
+33.69,33.62,34.90,35.52,35.59,35.34,37.02,35.90,38.02,37.49,
+38.02,39.09,40.17,39.20,39.86,40.99,41.90,41.49,41.73,41.35,
+44.79,44.72,44.49,44.62,47.70,46.52,46.18,47.68,46.99,47.10,
+48.45,47.23,50.18,52.49,50.21,50.04,50.86,50.52,51.81,52.06,
+51.33,53.33,54.64,54.58,55.78,55.00,56.22,54.46,54.92,56.02,
+57.68,58.16,57.48,58.54,58.61,60.56,59.72,61.35,62.35,60.94,
+62.70,62.58,62.94,62.08,64.86,65.77,66.98,66.64,66.33,66.04,
+70.43,67.30,67.30,69.76,67.03,69.11,68.41,69.41,70.40,73.77,
+71.80,73.59,75.06,70.68,73.27,75.35,74.88,74.97,74.23,77.12,
+77.11,78.05,78.29,76.74,79.16,78.53,80.07,77.09,80.36,81.59,
+79.96,80.77,83.06,84.21,85.24,84.97,86.00,84.11,84.86,86.07,
+86.95,84.97,87.64,85.39,89.27,88.39,89.98,88.31,92.64,93.10,
+90.41,91.14,90.53,93.42,94.96,95.02,95.01,93.89,94.85,95.22,
+94.60,96.25,98.26,97.99,98.42,97.72,99.16,99.97,100.97,101.70,
+102.95,99.44,102.45,102.16,101.94,100.89,104.58,104.49,104.97,104.39,
+108.15,104.59,103.96,107.60,107.65,107.70,110.36,107.77,107.56,109.16,
+111.02,112.43,111.59,109.56,112.95,111.26,113.55,111.95,113.70,114.34,
+114.33,115.33,116.73,118.05,115.04,119.30,118.36,117.74,119.33,121.22,
+120.09,121.85,118.47,123.47,123.63,121.16,121.83,123.19,122.61,126.32,
+124.43,125.48,123.97,126.75,124.90,128.14,126.09,126.62,129.64,130.04,
+131.25,129.63,131.47,129.97,130.40,129.02,132.77,132.00,133.27,134.41,
+135.99,135.14,135.81,134.16,134.09,138.35,137.82,138.19,137.69,137.75,
+137.38,141.81,138.93,141.69,139.64,139.31,144.74,143.46,140.90,138.86,
+3.69,4.72,5.09,5.45,5.19,6.30,5.73,6.82,6.66,7.60,
+8.54,9.37,8.69,9.61,9.04,9.46,10.65,11.08,10.99,11.41,
+12.06,12.55,12.65,12.98,12.74,12.98,14.35,14.91,15.86,15.02,
+15.90,17.34,16.50,18.61,16.70,17.53,18.72,18.43,19.25,17.99,
+19.04,19.80,19.93,21.80,20.81,21.33,23.12,24.18,21.82,24.50,
+23.66,22.82,25.42,24.72,26.01,26.36,26.72,26.98,26.82,26.65,
+27.23,28.23,29.26,28.24,28.39,29.96,29.78,29.48,29.51,29.52,
+31.14,31.27,32.85,33.23,35.32,33.38,33.23,33.54,34.62,35.84,
+36.45,37.31,36.92,36.83,36.47,37.59,36.98,38.26,37.97,39.95,
+38.00,40.09,39.39,40.02,41.55,39.09,42.12,42.31,44.34,42.05,
+42.97,43.18,44.94,45.47,44.32,45.91,45.05,45.70,45.14,45.10,
+47.27,45.89,49.15,48.73,47.68,49.23,51.01,48.53,49.73,49.81,
+50.24,51.23,52.08,49.29,51.61,55.10,53.47,53.49,54.08,54.85,
+56.86,54.90,55.86,54.51,54.15,57.01,57.87,56.61,56.56,58.93,
+61.25,58.55,58.95,58.19,60.26,61.53,61.60,61.93,63.28,60.97,
+62.83,61.71,64.03,62.55,63.89,64.27,65.33,63.69,66.06,66.40,
+65.62,63.72,67.78,66.96,68.94,65.39,68.24,67.42,69.27,69.42,
+69.76,72.79,71.88,72.00,73.16,70.66,75.02,73.85,73.04,74.12,
+72.70,74.45,74.34,77.16,78.06,77.73,79.56,74.50,74.65,77.46,
+77.63,78.08,76.88,79.18,81.12,80.78,81.48,79.85,80.57,83.05,
+82.22,85.03,81.66,82.70,84.89,84.99,84.28,84.19,84.44,86.07,
+85.49,88.68,85.76,86.82,85.86,87.00,88.03,89.94,90.85,88.50,
+91.75,88.63,91.53,91.52,91.00,93.99,91.82,92.88,94.23,93.75,
+92.33,93.32,96.25,94.52,97.98,95.87,97.47,96.30,94.80,96.25,
+95.21,95.42,98.28,96.96,101.02,96.70,100.36,100.23,103.50,100.06,
+100.57,101.18,102.04,101.17,102.31,103.21,104.02,101.24,106.64,101.48,
+105.96,107.89,103.83,105.09,109.19,106.82,106.38,109.45,107.35,110.83,
+111.49,109.93,112.86,110.25,110.02,111.39,111.34,113.18,110.13,110.90,
+111.58,114.71,113.08,113.22,117.64,113.73,111.63,118.59,116.61,116.32,
+2.80,3.81,3.97,4.52,4.64,4.96,5.09,4.58,6.37,5.65,
+6.51,6.96,7.21,7.18,7.13,7.98,7.79,8.85,9.73,9.50,
+9.71,9.40,9.44,10.42,11.81,11.77,11.12,11.56,11.70,11.89,
+12.77,13.50,13.46,13.83,14.08,14.20,15.25,14.61,15.09,16.62,
+16.03,16.72,16.12,16.09,16.14,18.50,18.50,19.10,17.27,18.89,
+18.73,19.36,19.59,19.77,20.18,19.64,21.05,20.46,20.96,22.34,
+22.30,22.86,25.17,23.37,24.07,24.39,24.21,23.91,25.78,24.15,
+25.77,25.44,25.35,26.75,26.00,26.65,26.36,26.58,29.42,28.70,
+30.07,29.38,29.80,30.56,29.19,30.43,29.73,31.20,31.38,30.07,
+30.95,32.37,33.00,32.38,31.85,33.74,33.49,34.49,33.86,35.16,
+34.71,35.04,34.77,35.45,36.51,35.71,37.29,36.19,36.53,38.56,
+38.87,39.60,39.65,38.26,40.31,38.83,40.85,40.90,39.73,43.33,
+41.32,42.94,41.96,43.23,41.75,42.51,43.08,43.87,42.75,44.02,
+43.62,44.71,47.15,46.87,47.36,45.33,46.76,46.94,46.16,48.63,
+46.42,49.42,49.29,47.64,48.76,48.46,49.40,52.11,50.13,50.40,
+51.26,50.73,51.39,50.15,53.51,51.93,52.37,52.55,53.16,53.07,
+55.42,56.00,55.78,54.90,56.52,55.33,54.43,55.51,56.75,58.82,
+57.54,57.72,58.22,58.34,59.30,58.61,58.20,59.58,59.50,59.24,
+60.16,59.59,60.53,62.49,60.68,62.36,64.17,63.41,63.84,60.22,
+63.13,64.18,62.46,62.80,66.25,64.91,65.32,67.97,65.69,66.48,
+66.52,65.06,68.63,67.73,68.50,70.17,68.04,68.94,68.64,69.40,
+67.51,69.65,72.38,70.09,70.11,72.35,71.73,71.39,73.22,72.76,
+71.68,74.19,74.32,73.55,74.47,74.64,75.62,75.70,73.66,72.55,
+76.89,76.44,79.75,77.60,77.11,80.65,77.50,74.80,80.22,80.03,
+80.33,77.86,79.98,81.22,81.37,83.91,79.24,80.25,79.96,81.84,
+81.99,82.31,83.73,83.65,84.32,85.19,86.24,85.28,84.26,85.21,
+85.87,84.55,83.14,89.68,86.41,85.01,85.48,89.39,88.93,89.36,
+87.71,87.13,89.78,91.00,89.14,88.74,92.49,90.02,91.04,93.46,
+93.05,93.67,92.30,93.02,94.43,94.15,94.62,95.82,95.23,96.45,
+2.52,2.46,3.63,3.51,3.62,4.23,4.01,4.72,4.70,5.10,
+5.60,5.92,5.86,6.10,6.53,6.43,7.42,6.75,7.20,7.54,
+8.32,8.84,9.68,9.04,8.81,8.86,9.50,9.00,9.58,10.11,
+9.94,9.64,9.92,11.73,10.99,11.14,12.15,11.40,12.89,13.02,
+12.74,13.04,13.28,13.65,15.10,14.26,15.09,14.51,15.23,15.29,
+15.94,16.57,16.94,16.19,17.28,16.58,17.59,18.13,17.24,17.71,
+17.58,17.93,19.80,19.09,18.67,19.10,19.29,19.79,19.67,19.74,
+20.04,20.91,20.04,22.01,21.67,22.16,22.76,23.65,22.29,23.63,
+22.20,23.91,24.19,24.27,25.72,25.66,23.95,25.30,24.65,24.78,
+26.89,25.01,25.62,26.00,26.31,26.98,27.02,28.42,27.17,28.19,
+28.12,26.82,30.37,29.80,30.12,29.02,29.87,31.56,29.88,31.78,
+31.07,31.15,31.67,31.38,30.76,32.84,31.64,34.43,33.38,34.71,
+32.54,34.73,34.58,35.29,34.91,34.41,35.85,34.35,35.74,34.67,
+36.24,35.75,36.77,37.05,36.50,36.90,37.30,38.44,38.16,37.98,
+39.66,41.12,40.15,39.03,39.15,39.94,40.90,40.51,39.97,40.73,
+42.42,41.12,43.47,42.25,43.42,41.17,42.80,40.83,41.40,44.55,
+43.46,43.47,45.68,47.42,44.46,46.73,46.74,45.92,46.60,45.50,
+46.74,48.65,45.58,45.11,46.65,48.05,47.42,48.28,47.03,47.58,
+48.96,50.64,50.05,50.00,49.26,52.23,49.03,50.02,52.57,48.45,
+52.75,49.52,51.44,51.08,54.38,51.26,52.89,54.32,52.90,52.76,
+54.10,56.15,54.96,54.15,54.38,57.00,56.05,55.67,57.77,56.46,
+58.62,56.61,57.57,58.63,58.13,58.67,57.30,57.22,58.37,59.90,
+57.99,60.45,58.77,60.73,62.53,59.59,60.96,58.25,60.76,59.78,
+62.30,61.61,60.59,61.74,63.28,63.50,61.24,64.91,64.52,67.67,
+66.21,64.46,63.81,64.76,66.41,66.86,65.46,65.77,66.65,67.26,
+70.24,67.04,67.49,66.17,69.30,66.91,69.76,69.75,66.07,67.96,
+69.99,70.65,69.08,70.82,69.12,70.64,71.81,69.73,71.59,73.94,
+71.41,72.34,73.26,72.86,73.56,71.15,75.55,73.19,74.67,75.80,
+74.18,75.36,74.77,76.29,73.91,75.27,75.63,76.80,76.93,78.16,
+2.23,2.74,2.70,2.76,2.66,3.33,2.91,4.06,3.97,3.74,
+4.28,4.65,4.64,4.68,5.27,5.16,5.31,5.75,6.45,5.36,
+6.10,5.25,6.70,7.09,6.76,7.48,6.89,8.35,7.66,8.70,
+8.86,9.04,8.55,9.62,8.74,9.80,9.45,9.60,9.64,10.95,
+10.52,10.35,11.05,11.14,11.64,11.04,12.66,12.40,12.69,12.39,
+11.39,12.97,12.91,13.49,13.20,11.73,14.37,14.65,14.35,13.49,
+15.50,15.58,15.72,15.94,15.05,15.26,15.41,16.44,16.37,18.47,
+16.16,16.56,17.58,17.57,17.64,16.71,18.68,17.47,18.11,18.72,
+19.50,19.57,19.96,18.90,18.33,19.95,19.97,21.42,20.62,21.18,
+21.91,22.24,21.16,21.86,22.10,21.16,23.34,21.12,22.57,21.82,
+23.31,23.40,22.58,23.64,24.12,25.28,25.25,24.41,24.13,25.18,
+24.61,26.35,24.70,26.58,25.06,26.05,26.93,27.44,26.76,27.84,
+28.67,26.51,26.97,29.56,27.53,28.56,28.68,28.32,29.54,29.25,
+29.88,29.32,28.32,28.62,31.79,30.14,30.42,30.23,30.86,31.97,
+31.68,31.92,32.42,32.84,30.98,30.62,32.20,32.62,35.05,32.34,
+31.86,35.57,34.84,33.51,33.63,34.73,35.89,34.23,33.78,34.42,
+36.70,36.72,34.97,37.04,37.14,37.33,35.27,38.24,36.88,38.69,
+36.79,36.94,38.55,38.62,36.78,36.70,39.07,39.81,38.73,40.54,
+39.39,40.70,38.68,40.27,40.52,41.80,42.10,41.13,41.91,42.54,
+40.33,42.37,41.90,41.13,44.05,41.05,43.78,44.74,42.86,43.11,
+43.72,43.15,45.35,44.40,44.12,44.80,45.58,46.26,44.63,45.99,
+44.32,44.82,47.18,47.03,47.70,47.74,45.05,45.72,48.06,47.59,
+47.03,48.88,49.95,49.09,48.50,48.85,50.51,48.36,50.18,50.61,
+51.40,51.69,49.28,50.20,50.61,50.58,50.90,50.74,52.33,55.24,
+50.75,52.52,52.15,53.99,53.47,53.49,53.23,53.01,54.94,53.80,
+55.14,54.79,55.23,55.59,55.21,57.23,57.26,57.19,57.52,57.27,
+55.14,55.47,57.03,56.19,57.81,57.51,57.32,58.25,57.47,57.63,
+56.84,61.02,59.66,60.60,59.13,61.38,59.90,59.20,60.29,61.66,
+62.82,60.60,60.76,62.21,61.89,60.79,63.60,61.68,61.79,61.67,
+1.62,1.94,2.11,2.34,2.65,2.55,2.61,2.49,3.12,3.10,
+3.24,3.56,4.54,4.54,4.68,4.72,4.34,4.66,4.80,4.27,
+5.67,4.98,6.33,5.06,6.22,6.14,6.30,5.64,5.99,6.02,
+6.66,6.49,6.22,6.41,6.77,7.99,8.62,7.86,7.36,8.10,
+8.40,8.20,8.00,9.20,9.70,9.74,9.93,10.18,9.07,9.34,
+10.56,10.77,10.04,10.52,11.05,11.14,11.04,11.18,11.07,12.07,
+10.83,11.80,10.90,12.41,13.09,12.55,12.90,13.11,13.20,11.31,
+14.16,13.89,13.54,14.62,13.84,14.26,14.71,13.97,15.86,16.07,
+15.24,14.88,15.20,15.50,14.66,16.18,15.61,16.24,16.73,16.32,
+16.98,18.79,18.61,18.55,17.57,17.99,17.75,18.09,18.52,18.34,
+18.94,19.24,18.41,18.57,20.02,20.54,19.63,20.80,19.46,18.93,
+22.02,21.19,19.94,19.45,20.46,23.15,22.66,20.34,20.94,21.03,
+21.88,23.40,22.43,21.04,21.90,21.21,22.54,24.32,22.17,23.22,
+25.29,24.52,24.57,24.16,24.34,25.56,23.33,24.77,25.26,25.73,
+25.91,24.05,25.82,26.73,25.83,26.80,26.45,26.86,26.13,27.91,
+27.37,27.03,28.56,27.25,28.25,28.14,28.23,27.30,29.65,27.89,
+27.90,28.88,29.91,29.58,32.10,29.92,29.00,29.34,31.09,29.59,
+30.01,30.89,31.14,30.63,30.68,32.94,33.61,32.09,29.60,31.04,
+32.28,31.94,32.72,32.62,33.93,32.56,33.85,34.61,33.83,33.30,
+32.79,32.38,33.23,33.67,35.57,35.59,34.26,33.91,35.03,35.16,
+36.29,36.80,34.03,35.08,37.13,37.38,36.48,35.71,36.55,36.71,
+37.19,38.29,37.32,37.23,37.96,38.01,39.59,37.47,38.50,39.60,
+38.71,40.11,37.33,40.44,39.40,38.42,41.80,40.13,39.47,39.56,
+40.93,41.44,41.05,42.46,42.44,43.00,41.94,40.85,40.25,43.21,
+43.61,42.35,43.53,42.27,41.88,44.42,44.54,43.11,44.14,44.03,
+45.49,43.97,42.26,43.95,44.78,44.65,45.54,43.57,45.68,46.83,
+45.22,45.82,46.10,47.43,45.63,47.78,47.28,46.82,47.48,47.13,
+46.90,46.63,50.60,49.33,47.71,47.96,49.59,46.45,48.08,46.66,
+49.09,48.12,49.02,50.68,51.39,50.84,51.47,52.04,49.58,51.25,
+30.16,35.35,36.22,40.68,43.00,45.70,48.66,51.18,55.08,58.95,
+61.02,64.62,67.11,69.05,72.56,76.30,78.86,81.88,83.18,89.59,
+92.68,95.46,96.59,98.85,103.46,105.53,109.81,111.11,115.86,118.89,
+119.44,122.75,125.26,130.54,133.96,135.30,137.81,138.87,141.01,145.46,
+151.56,153.98,155.85,160.32,163.04,165.83,170.51,171.57,173.75,179.01,
+181.63,182.83,186.27,189.28,190.66,196.93,198.46,199.95,205.20,207.20,
+210.18,215.92,217.75,218.46,221.33,225.72,230.69,230.58,234.70,236.26,
+240.06,241.63,246.57,245.91,250.95,256.98,259.75,259.53,264.73,265.36,
+269.12,272.84,277.81,275.87,277.31,284.32,290.56,291.66,295.48,295.44,
+299.71,302.22,305.77,308.35,312.52,314.45,318.53,322.89,325.19,327.95,
+327.88,332.00,335.98,337.90,340.03,345.85,347.39,348.80,354.08,356.81,
+360.69,367.17,364.27,367.44,371.22,372.51,379.02,380.73,383.32,389.53,
+389.41,392.18,395.30,399.42,401.17,403.30,407.99,411.94,410.79,414.06,
+417.75,420.72,424.86,429.35,431.56,437.86,436.07,437.64,439.75,445.08,
+448.37,449.86,457.21,455.75,461.09,464.39,467.87,471.17,472.19,479.56,
+475.88,477.19,484.58,490.38,489.69,490.61,496.72,502.99,503.75,507.11,
+507.59,511.81,514.37,516.75,521.95,522.09,527.19,528.59,533.42,537.33,
+540.32,544.09,546.48,547.15,549.39,553.67,557.82,560.25,559.29,563.29,
+571.24,575.78,576.92,578.08,579.46,581.87,587.23,588.86,594.52,594.80,
+601.07,600.92,605.15,610.24,607.69,608.37,615.79,619.44,619.09,623.48,
+629.98,632.48,629.71,644.33,644.01,643.34,645.47,646.65,646.32,657.94,
+657.59,661.48,663.61,665.35,665.32,675.90,676.59,676.93,682.76,684.94,
+689.70,692.47,695.35,691.64,703.02,703.50,704.17,707.37,709.53,714.25,
+716.66,721.17,722.64,728.85,732.10,732.24,738.75,740.42,740.82,749.02,
+748.43,749.18,754.43,756.31,761.66,759.57,764.78,768.43,778.49,773.39,
+778.24,782.83,785.23,778.93,790.00,793.16,790.16,796.40,803.34,811.05,
+810.29,811.57,814.55,816.64,818.38,817.46,823.15,829.09,835.97,837.30,
+835.19,837.76,842.59,848.31,851.52,853.13,854.59,861.62,859.18,866.90,
+869.26,873.43,869.08,876.07,874.80,877.32,884.98,890.95,891.83,896.24,
+26.38,28.16,31.40,33.89,36.26,38.25,42.38,45.17,47.16,49.66,
+51.71,52.92,56.31,60.11,63.81,63.62,66.86,68.27,71.30,74.17,
+76.09,80.49,81.90,85.98,87.73,89.26,91.47,94.23,97.91,101.26,
+103.18,105.12,107.05,109.96,114.09,114.52,117.94,119.67,121.80,124.84,
+128.38,130.32,130.49,135.92,138.31,141.80,141.17,144.16,148.50,149.98,
+150.57,154.53,156.04,161.07,163.44,165.09,165.06,168.97,172.73,174.72,
+179.75,181.76,182.52,184.70,187.28,189.67,193.28,195.11,199.13,198.72,
+204.32,204.05,209.62,210.56,215.17,212.79,218.01,222.60,221.72,225.33,
+227.09,230.50,234.06,235.51,240.04,240.77,246.16,245.12,250.71,251.22,
+250.38,253.68,259.40,261.98,262.77,267.73,271.16,274.18,273.04,276.17,
+279.43,282.66,283.52,286.54,291.64,290.54,296.55,296.98,298.00,302.84,
+305.76,306.22,308.08,312.09,317.17,314.27,324.28,320.33,327.42,326.93,
+329.57,332.41,335.77,340.14,342.74,342.53,345.10,347.03,352.10,353.70,
+353.55,359.58,360.98,363.08,367.33,368.58,370.71,370.02,375.49,377.98,
+378.07,382.36,384.75,388.36,391.35,393.34,393.95,400.97,402.87,402.38,
+405.85,407.17,411.51,410.26,417.40,418.33,421.14,424.68,427.33,427.40,
+429.49,433.73,438.26,439.34,442.33,439.76,449.86,450.56,447.32,457.57,
+458.25,456.51,463.14,463.78,467.62,468.87,470.82,472.56,476.77,481.23,
+484.06,483.57,486.57,493.01,489.21,494.53,493.33,494.76,503.23,503.43,
+501.95,507.04,514.74,514.80,516.59,518.83,521.80,524.12,525.46,524.94,
+532.28,535.51,534.38,537.99,541.26,542.57,549.46,548.91,550.45,558.02,
+557.12,563.76,565.27,564.85,570.22,567.28,572.98,569.68,580.92,580.59,
+586.30,584.29,591.25,591.90,593.41,592.14,598.51,599.42,603.60,605.17,
+612.93,608.58,615.15,614.94,613.46,619.09,621.10,627.08,629.71,634.08,
+632.26,638.35,634.53,642.76,643.51,645.50,643.78,647.90,652.82,656.71,
+660.11,662.13,662.34,668.80,664.20,672.00,675.90,677.99,681.97,680.48,
+688.00,685.76,685.12,688.67,689.53,699.51,695.56,702.07,703.46,709.02,
+711.63,709.72,713.99,717.66,718.14,717.56,727.60,725.92,730.48,733.32,
+734.78,736.89,740.79,743.12,744.71,745.20,750.03,754.40,754.29,759.67,
+23.30,24.11,25.66,29.85,31.41,32.69,35.74,37.03,39.00,41.68,
+44.80,45.61,46.97,49.50,50.85,53.66,55.99,58.04,61.11,62.54,
+64.41,65.08,68.82,72.36,75.12,75.33,77.36,79.06,81.62,85.55,
+86.50,89.18,90.52,94.37,94.27,95.95,99.95,100.04,104.21,107.82,
+108.19,109.90,111.88,114.70,114.63,117.67,121.42,122.24,125.02,126.01,
+130.25,132.29,132.93,136.74,135.02,138.90,141.66,146.75,146.53,148.08,
+148.59,150.82,153.54,159.42,156.72,163.23,164.90,165.23,166.90,168.54,
+171.96,171.75,173.91,175.26,180.78,182.15,184.09,186.13,187.19,191.47,
+196.58,194.76,196.87,198.15,201.93,203.35,205.51,204.80,210.29,209.97,
+214.83,218.91,214.34,217.98,223.71,224.51,226.62,227.33,231.43,232.88,
+235.20,242.00,242.40,241.19,245.09,244.75,251.32,251.48,251.88,254.98,
+258.44,258.31,264.46,265.55,265.73,266.74,272.02,271.13,274.53,276.30,
+276.98,277.92,283.06,288.45,285.32,287.82,291.64,292.97,295.46,297.88,
+299.29,302.60,307.46,307.24,308.99,312.26,310.52,315.52,316.83,317.16,
+322.38,326.78,326.17,328.57,329.72,328.78,337.65,341.71,340.13,340.38,
+341.12,345.90,346.54,347.80,350.61,354.71,352.89,357.78,360.97,360.22,
+362.79,367.18,366.98,369.42,372.30,374.50,378.02,379.32,380.40,378.50,
+382.28,391.13,388.07,394.12,393.45,394.62,398.70,396.11,404.69,403.22,
+407.60,405.19,407.73,413.88,413.28,413.26,419.27,420.37,422.43,423.30,
+423.46,429.92,432.48,433.01,436.53,440.36,441.12,440.89,441.22,450.03,
+451.40,451.74,450.36,454.10,460.84,460.04,459.56,461.64,467.89,472.74,
+467.40,473.51,473.10,475.00,478.67,482.17,481.27,487.05,487.51,489.89,
+494.72,491.92,498.09,496.46,499.81,503.90,505.11,507.46,510.44,515.24,
+515.08,516.65,516.27,521.00,524.14,527.34,525.63,526.45,528.15,529.70,
+537.62,538.94,538.59,540.89,545.56,544.83,547.18,548.03,550.00,551.36,
+555.96,562.42,557.39,565.41,566.04,567.11,564.63,572.84,572.28,572.62,
+578.47,578.23,579.84,585.42,590.27,590.88,593.01,596.74,596.23,594.61,
+596.94,600.12,599.58,606.17,607.61,610.42,606.39,613.25,619.60,614.16,
+618.83,620.68,620.28,624.88,624.93,629.14,636.02,642.08,635.72,640.58,
+18.29,20.86,22.75,23.51,25.63,27.15,29.55,30.13,33.58,33.41,
+36.33,39.19,40.59,40.97,44.01,45.98,47.37,48.87,51.37,53.97,
+55.45,54.72,58.06,60.63,60.98,64.55,64.55,66.20,67.65,70.48,
+71.54,73.69,75.26,77.08,79.01,80.01,82.36,85.51,86.39,89.58,
+90.00,90.32,93.32,93.85,99.09,99.81,101.33,103.14,104.62,105.51,
+106.55,110.71,112.87,111.52,115.93,116.05,118.52,122.98,123.51,124.70,
+125.58,129.20,130.75,132.57,133.06,137.81,134.55,140.09,141.48,144.65,
+144.39,147.67,146.74,151.00,150.63,153.47,154.87,157.16,158.49,158.78,
+162.82,165.24,167.40,168.31,167.70,169.67,175.75,175.28,174.30,180.60,
+180.81,184.38,181.17,187.29,186.18,190.33,190.63,193.39,195.08,195.14,
+198.48,200.12,198.74,206.06,203.29,205.60,206.30,212.44,211.43,214.61,
+214.68,217.89,218.33,220.62,221.00,228.40,225.30,225.76,231.52,231.62,
+233.69,236.71,240.55,238.27,240.86,245.38,243.49,244.70,247.05,250.26,
+251.81,253.31,251.39,258.12,258.29,263.38,265.38,265.30,267.63,269.44,
+268.12,270.12,270.92,275.16,274.28,281.26,277.74,282.81,284.22,290.03,
+287.53,289.52,293.16,293.49,293.90,296.52,297.52,298.85,300.75,301.00,
+303.07,308.96,309.37,310.07,311.27,318.18,312.15,317.87,323.58,324.49,
+326.38,324.63,327.05,328.63,331.11,335.86,335.08,337.15,340.81,335.64,
+344.17,343.46,342.23,346.41,346.17,351.07,353.42,351.42,354.14,359.41,
+358.68,359.60,365.40,365.53,369.52,370.59,372.68,370.61,374.00,376.46,
+379.35,376.30,383.74,382.33,382.26,386.76,390.74,388.68,390.77,390.38,
+394.09,395.67,400.20,399.56,398.73,399.42,409.74,411.77,412.72,415.69,
+414.27,411.12,413.79,417.41,423.89,421.07,428.28,425.04,425.44,427.91,
+430.44,430.71,434.19,435.12,433.88,441.16,442.04,440.50,446.73,446.77,
+448.30,447.10,453.86,455.07,455.72,457.12,460.87,463.23,459.36,465.77,
+463.69,469.51,470.68,467.72,474.15,472.85,476.92,478.33,480.06,482.46,
+486.00,487.12,484.71,485.47,489.23,492.49,495.21,498.47,502.62,502.34,
+500.49,503.32,509.34,510.55,505.27,513.09,512.77,513.76,517.10,518.99,
+519.65,518.22,525.41,525.23,522.53,528.73,526.20,531.54,538.18,536.76,
+16.12,16.49,17.84,20.03,21.82,22.38,24.00,26.72,27.40,29.70,
+30.26,32.17,33.67,34.59,36.64,38.87,39.79,40.97,41.82,45.07,
+46.13,47.30,47.52,48.90,53.80,51.96,53.30,54.57,60.22,59.16,
+60.29,61.94,62.76,66.26,66.33,68.00,72.05,69.45,72.93,73.63,
+76.60,78.16,81.39,81.05,80.61,82.27,85.54,85.27,88.32,90.75,
+91.94,91.76,94.86,94.87,96.05,97.16,98.42,101.28,102.76,102.66,
+107.36,105.50,107.51,109.86,112.76,115.96,114.10,116.56,116.05,117.98,
+120.17,121.62,125.66,124.40,125.85,129.71,129.84,130.03,130.12,132.67,
+135.38,136.12,138.12,140.78,142.89,145.02,145.84,144.35,147.79,148.08,
+152.26,152.04,154.82,154.73,158.20,157.43,159.08,159.69,161.70,166.63,
+163.00,167.41,168.45,169.62,174.22,173.87,177.72,176.90,176.01,180.32,
+178.97,182.95,183.35,186.90,183.79,188.55,188.62,190.40,193.06,195.77,
+195.82,195.31,198.19,200.78,200.45,204.92,204.27,207.79,207.85,211.32,
+211.86,212.81,215.75,213.82,213.78,217.70,221.40,219.92,224.59,221.56,
+225.90,227.75,229.26,230.13,229.32,232.43,232.36,236.92,238.22,237.84,
+238.57,243.83,247.47,240.71,243.09,249.54,247.96,251.43,251.04,254.28,
+259.10,254.87,258.70,258.01,265.44,265.00,261.94,268.01,267.68,269.50,
+266.67,275.55,275.67,270.23,280.50,279.88,279.81,284.29,281.83,282.79,
+285.41,291.77,288.50,291.27,289.25,291.04,293.18,294.06,300.74,298.01,
+297.09,302.31,305.52,310.65,312.38,310.82,308.60,312.04,312.05,316.65,
+314.89,316.60,317.83,317.33,323.64,322.24,324.84,333.08,327.88,328.81,
+331.60,332.36,334.42,338.56,333.15,339.71,341.07,341.16,344.37,342.93,
+344.60,346.32,348.44,355.86,355.63,351.70,352.39,355.34,357.67,355.74,
+358.15,360.50,368.12,364.82,366.30,366.87,366.72,375.73,373.87,376.51,
+377.11,376.50,379.06,382.99,384.46,383.39,388.10,388.39,388.61,388.09,
+388.12,389.62,397.95,397.34,394.26,399.26,404.22,398.43,402.61,404.15,
+403.93,407.33,411.63,409.96,412.05,411.87,415.24,413.89,416.14,424.05,
+420.39,425.25,418.53,426.67,430.62,427.55,433.74,433.67,431.17,432.78,
+436.92,434.67,438.63,443.21,440.75,448.83,445.71,446.52,447.34,456.43,
+12.66,14.06,15.64,17.44,17.35,19.39,20.56,21.27,22.39,24.21,
+25.23,26.75,27.89,30.07,29.73,31.97,33.59,34.90,35.61,36.55,
+37.43,40.24,40.97,41.56,43.50,42.88,46.43,46.27,47.62,49.11,
+50.17,52.26,52.13,53.83,56.44,56.93,57.13,60.14,60.64,61.79,
+63.28,64.38,66.06,64.64,68.95,69.83,69.83,72.63,73.39,74.42,
+76.39,76.90,78.53,79.94,81.81,82.27,82.10,84.06,85.01,87.01,
+87.27,90.02,90.22,89.41,91.92,92.57,97.35,98.52,101.15,99.72,
+101.68,100.82,104.42,103.57,105.41,105.83,107.16,107.22,107.53,111.06,
+113.44,111.31,116.56,118.20,118.43,119.93,120.62,123.63,119.89,121.00,
+125.25,127.04,127.24,128.84,130.56,130.76,129.98,134.91,135.85,138.54,
+136.28,140.83,142.72,143.47,145.69,147.37,146.90,146.98,149.78,148.57,
+152.32,150.36,152.30,153.67,158.07,155.80,158.05,160.98,157.71,162.60,
+164.59,165.40,166.23,166.48,167.54,170.29,173.00,169.81,173.53,173.95,
+178.54,180.43,181.21,180.20,181.98,180.65,182.92,184.81,187.98,191.28,
+188.85,189.87,190.75,192.72,193.73,192.86,197.22,196.04,198.47,200.43,
+201.55,202.18,202.04,206.45,208.28,209.19,209.75,210.89,211.94,211.29,
+213.05,213.84,217.90,221.31,218.42,218.57,221.76,220.79,222.13,226.90,
+226.71,227.25,228.43,228.91,233.57,234.13,235.01,231.74,240.98,238.78,
+242.31,240.55,239.66,243.09,243.70,243.95,242.83,249.55,248.84,248.72,
+249.15,254.35,255.15,258.19,256.18,258.61,256.59,259.86,259.99,265.73,
+261.80,265.23,268.72,265.76,271.91,268.37,272.80,274.80,270.87,276.33,
+273.30,278.62,278.00,280.43,282.65,280.91,284.44,284.04,287.34,289.61,
+290.93,288.75,288.14,291.51,294.77,295.77,290.63,293.54,295.74,297.14,
+302.24,299.56,302.24,301.48,302.77,306.32,305.72,308.67,310.07,310.57,
+313.90,316.29,315.27,316.85,317.05,322.00,317.82,326.41,320.77,326.18,
+323.72,325.83,329.71,331.22,334.63,331.70,332.31,333.50,338.23,335.22,
+338.62,337.32,344.40,341.34,342.34,347.86,345.90,347.40,347.39,354.29,
+353.22,353.89,348.83,355.63,353.57,362.12,361.90,359.88,358.90,363.67,
+361.44,363.71,364.94,366.34,371.02,370.56,368.98,372.16,376.50,373.60,
+11.49,11.88,13.11,14.09,15.05,16.73,16.21,17.41,18.40,19.07,
+20.96,22.37,23.29,24.79,26.72,26.86,28.06,28.40,29.59,31.20,
+33.31,33.28,33.43,34.87,35.35,35.72,38.39,39.71,41.66,40.78,
+41.91,42.95,43.30,47.98,45.37,48.29,48.55,50.41,49.41,52.69,
+53.29,54.91,55.31,56.00,55.92,58.56,58.32,58.03,59.57,61.67,
+64.07,65.46,65.17,66.21,66.37,67.19,68.31,70.46,68.94,69.62,
+73.68,74.42,73.69,75.56,77.03,77.85,81.16,80.05,80.39,81.94,
+85.02,84.40,87.34,87.45,89.79,87.73,89.66,90.69,93.59,90.97,
+95.60,95.02,94.56,95.88,95.19,97.37,101.04,99.13,102.42,104.79,
+104.72,106.16,104.53,108.53,108.28,110.22,112.38,111.47,110.13,114.91,
+115.22,115.72,117.99,116.42,119.75,120.47,121.62,120.39,121.66,124.41,
+126.77,126.84,126.86,129.33,128.99,130.19,127.83,129.26,135.36,134.24,
+134.17,137.56,139.43,140.19,139.73,138.36,143.44,142.08,145.91,145.88,
+146.94,148.17,149.29,150.45,153.09,152.04,154.12,155.86,153.50,156.20,
+155.34,158.29,160.43,158.42,158.32,162.94,163.04,162.90,164.48,166.19,
+170.99,167.47,168.37,172.33,175.97,171.42,175.88,175.96,179.81,176.94,
+178.27,178.87,180.79,179.55,180.19,184.69,181.87,187.28,186.09,184.72,
+186.54,189.48,191.94,189.74,192.10,191.15,195.04,196.25,194.34,198.51,
+198.10,201.32,200.30,203.42,203.08,205.82,205.94,206.25,205.25,205.28,
+207.65,213.34,210.68,213.69,212.89,211.93,216.34,216.92,219.06,219.72,
+222.56,220.31,220.36,222.41,223.88,223.26,222.41,225.21,225.40,229.83,
+228.07,230.53,230.01,231.47,232.96,235.05,237.78,237.86,235.91,238.54,
+240.23,237.54,240.28,243.37,242.60,247.03,245.10,244.83,248.81,248.53,
+250.63,251.46,255.01,252.34,254.15,256.24,253.37,258.72,263.19,263.57,
+258.67,259.25,262.67,266.97,266.73,265.52,267.11,272.04,272.46,269.76,
+270.23,275.23,272.07,274.85,273.76,273.14,276.70,278.12,279.01,282.09,
+283.63,282.28,284.45,288.89,284.93,285.83,288.62,292.92,291.91,290.64,
+288.57,291.45,289.27,293.22,300.84,295.15,296.07,307.45,300.00,304.02,
+302.19,302.85,306.79,301.96,308.91,308.90,311.25,312.18,311.38,315.51,
+8.83,9.95,11.02,12.33,13.11,12.78,13.72,14.49,15.84,17.96,
+17.31,18.65,19.05,20.39,22.28,20.46,22.12,23.91,25.27,24.55,
+26.08,27.82,28.19,27.95,28.66,32.20,31.53,32.45,32.40,33.52,
+34.93,36.92,36.53,36.13,38.59,39.91,40.39,39.84,40.10,42.68,
+43.74,44.26,45.30,45.93,47.88,48.92,48.51,49.85,51.58,51.28,
+52.53,51.30,53.23,54.82,54.26,56.06,56.94,58.48,61.02,62.18,
+59.93,64.26,62.46,63.53,65.01,67.51,66.16,66.45,66.62,68.20,
+70.78,68.85,72.45,70.78,72.09,72.16,72.03,72.97,75.46,77.29,
+77.44,78.68,77.44,79.54,82.03,84.44,81.85,81.91,84.05,86.93,
+86.34,86.80,89.41,90.81,88.58,89.56,93.89,94.58,91.51,94.46,
+95.67,97.61,97.34,97.02,99.90,99.50,101.77,101.07,105.39,104.43,
+105.00,105.34,105.97,104.36,105.94,109.66,111.60,108.75,111.93,113.96,
+111.63,111.60,115.25,115.92,115.09,117.27,117.85,115.70,121.17,120.24,
+121.89,124.63,121.52,126.08,124.36,124.82,124.81,126.46,127.78,130.98,
+131.87,131.11,129.95,133.43,135.37,130.82,135.32,136.75,140.00,137.84,
+136.83,139.53,137.28,141.02,142.99,142.61,142.59,147.04,148.30,148.02,
+148.95,150.55,148.30,151.76,150.77,152.01,150.90,154.57,154.81,156.10,
+155.79,156.62,161.39,159.95,159.86,160.21,162.87,161.68,164.52,166.06,
+161.82,162.92,162.75,168.81,168.06,169.81,171.31,170.13,171.72,172.41,
+173.78,171.17,174.82,176.11,178.93,180.69,179.64,179.11,183.30,181.14,
+182.31,179.35,184.74,180.30,186.52,188.34,188.02,191.74,187.40,191.10,
+191.63,189.72,190.17,190.12,197.76,191.85,193.70,194.07,198.51,198.44,
+198.84,199.47,200.65,201.97,201.29,204.27,205.44,203.82,205.24,209.35,
+211.31,209.21,210.05,211.24,212.02,212.69,214.53,212.53,214.99,215.78,
+216.61,216.47,216.80,219.19,216.96,220.69,223.49,221.37,221.24,222.68,
+224.97,223.38,225.55,227.58,230.79,229.78,230.78,231.14,232.63,233.72,
+232.00,233.50,237.90,236.62,235.75,239.58,236.85,241.85,243.25,242.48,
+241.96,244.61,244.41,247.45,246.89,246.26,248.11,248.60,250.60,250.12,
+252.27,251.21,254.41,255.52,255.54,257.15,256.08,259.75,257.88,256.31,
+7.83,8.54,9.90,8.92,10.38,10.88,11.15,12.49,13.66,13.79,
+15.26,16.22,16.06,17.46,16.97,17.48,18.93,20.28,20.86,21.74,
+21.73,21.63,22.68,24.26,25.07,25.09,26.93,26.14,28.40,28.16,
+29.79,28.81,31.40,32.03,30.41,32.21,32.79,34.32,35.35,35.85,
+34.78,36.56,37.56,38.42,38.49,40.46,40.88,41.88,41.53,43.65,
+42.00,42.26,45.90,45.12,45.53,47.59,47.10,48.91,47.97,49.06,
+50.06,51.20,51.51,53.05,51.14,54.75,56.99,56.39,56.75,55.40,
+57.83,58.72,59.61,62.23,58.54,58.21,63.98,62.17,62.46,62.80,
+63.34,65.49,66.84,68.74,69.45,68.15,69.44,70.07,69.70,70.00,
+73.56,73.01,73.39,71.76,73.35,75.46,75.30,75.91,79.07,78.30,
+80.44,78.79,83.33,81.41,83.68,81.89,80.27,84.58,85.03,87.14,
+85.04,85.94,89.58,87.61,88.60,89.48,91.07,90.26,91.49,92.64,
+92.31,94.31,92.80,96.54,95.75,96.15,95.71,98.58,98.11,102.92,
+100.87,104.01,99.43,103.10,104.99,106.25,103.61,106.85,105.99,107.90,
+108.39,109.77,107.01,110.91,113.38,109.73,113.74,112.06,111.55,112.52,
+112.46,114.74,114.79,117.67,118.88,115.83,117.50,119.30,122.84,122.44,
+120.21,124.06,126.27,124.13,126.15,123.00,123.88,128.73,127.88,126.02,
+128.78,125.97,129.33,133.15,133.06,131.09,135.31,134.69,130.90,135.43,
+138.76,137.40,137.75,139.39,141.48,140.49,139.35,140.92,141.51,143.00,
+144.43,146.25,145.59,144.47,146.50,146.32,148.19,145.60,150.52,148.91,
+151.21,149.99,154.70,152.01,153.25,154.80,156.19,153.13,160.05,154.35,
+158.48,156.75,158.34,158.28,161.83,162.25,163.84,162.41,163.97,164.09,
+164.46,165.02,166.01,168.06,168.94,166.40,171.58,168.72,170.35,170.12,
+172.32,174.01,171.60,177.39,174.80,175.36,178.54,177.96,178.46,179.54,
+178.06,176.86,179.31,183.55,182.66,185.72,181.16,185.17,184.50,185.83,
+188.19,186.73,188.06,190.35,185.15,189.74,189.78,194.59,189.36,194.96,
+194.07,194.71,193.71,194.10,197.64,198.01,198.37,198.25,201.81,197.91,
+201.90,197.64,201.46,204.35,201.31,201.08,209.16,206.81,205.31,203.45,
+206.32,207.13,211.89,211.27,211.22,210.52,213.40,211.95,215.09,214.90,
+6.30,7.11,7.15,8.34,8.83,8.93,9.99,9.80,10.76,11.12,
+12.74,11.85,13.00,14.59,14.30,15.79,14.32,16.28,16.64,19.24,
+17.37,18.19,19.93,20.83,20.38,19.56,20.30,21.04,22.97,24.86,
+23.91,24.70,25.79,25.34,24.83,26.83,28.41,28.15,28.77,28.91,
+29.23,30.28,31.02,32.00,32.12,32.99,34.15,34.30,35.54,36.01,
+33.82,36.21,38.65,36.78,37.81,40.65,39.83,39.88,40.99,40.22,
+40.43,41.58,42.37,42.04,42.27,42.69,45.30,45.26,44.90,46.12,
+45.95,48.97,47.98,50.33,51.79,50.89,51.20,53.34,52.54,55.19,
+53.45,54.36,55.74,56.11,56.19,55.62,56.54,57.98,58.08,60.06,
+59.56,60.10,60.48,61.31,62.62,60.54,63.66,64.76,64.52,65.22,
+66.24,66.37,66.32,66.79,68.99,69.53,68.91,72.23,69.28,70.58,
+71.32,72.64,73.78,73.50,74.39,73.40,74.06,73.23,76.75,75.84,
+76.09,77.57,78.34,78.78,79.34,79.31,80.09,79.16,84.13,84.74,
+82.11,83.89,83.90,83.87,87.10,88.33,88.12,86.77,86.88,88.63,
+89.95,89.30,88.28,91.40,89.77,91.59,91.45,95.36,93.44,93.53,
+94.29,96.37,95.61,97.63,97.40,95.03,98.66,98.27,100.23,100.31,
+100.01,102.66,100.43,104.03,100.71,104.38,101.70,106.39,107.23,105.20,
+105.59,107.45,106.56,107.54,111.56,110.36,109.99,109.66,110.51,113.02,
+111.48,113.33,113.21,111.99,116.75,112.77,117.40,117.75,118.83,116.57,
+118.11,118.65,121.25,119.20,122.03,119.06,121.83,121.18,125.23,124.19,
+125.30,124.88,123.71,125.93,126.49,125.53,129.71,127.25,128.49,129.61,
+129.50,131.37,128.64,130.61,132.34,134.92,134.19,134.89,135.90,137.32,
+137.84,137.97,139.43,136.89,139.02,139.85,140.75,142.25,141.58,142.46,
+141.76,139.51,142.26,143.00,148.51,144.36,145.25,146.39,147.60,149.06,
+149.60,147.94,148.06,146.78,149.65,151.14,150.38,153.27,154.61,153.47,
+156.66,155.02,156.78,155.90,154.30,157.81,159.31,158.32,162.55,159.35,
+160.04,161.64,159.97,160.62,161.48,164.12,162.51,160.12,163.33,165.03,
+164.53,165.63,166.68,167.85,166.05,166.36,168.41,172.55,168.05,172.30,
+173.06,170.46,173.48,169.59,172.19,174.10,178.59,174.74,176.81,173.66,
+5.02,6.06,6.02,6.15,6.91,6.83,7.61,8.63,9.63,9.74,
+10.30,10.04,10.95,11.25,11.66,12.51,13.77,12.41,13.66,14.37,
+15.67,15.94,15.98,17.53,17.37,17.26,15.89,18.65,19.12,19.21,
+19.25,20.72,20.68,21.15,21.21,22.98,22.40,22.43,24.59,24.21,
+24.73,26.09,25.19,27.27,26.81,26.10,27.45,27.01,28.76,28.85,
+28.57,29.77,29.14,30.26,31.68,31.29,34.48,33.01,34.21,34.70,
+33.40,35.29,35.93,35.97,35.96,36.61,38.50,38.18,38.66,39.70,
+38.67,40.06,39.80,40.35,40.73,40.90,42.70,41.46,42.84,43.48,
+44.86,44.04,46.49,45.13,46.24,46.95,49.19,47.37,49.51,48.60,
+49.48,48.51,49.74,49.82,49.26,51.01,54.60,53.29,53.32,53.66,
+54.37,55.71,55.07,54.82,57.11,55.97,56.04,58.05,59.12,59.41,
+60.31,61.18,59.71,61.25,61.78,58.84,60.19,63.21,64.12,64.69,
+62.97,62.61,61.63,64.50,66.09,66.80,65.25,65.44,66.14,66.18,
+68.64,69.51,69.72,70.59,69.63,71.82,70.33,71.97,73.98,72.24,
+74.19,71.48,75.03,75.00,74.62,73.97,76.22,77.07,78.42,80.62,
+80.19,80.92,77.42,80.55,80.52,81.11,81.30,83.14,80.90,83.63,
+83.86,83.37,84.66,84.97,84.68,86.48,83.76,86.71,87.56,87.09,
+89.96,86.62,87.67,90.16,91.30,92.20,90.75,92.07,93.87,93.01,
+93.72,93.24,92.39,93.35,93.50,96.41,95.22,98.35,99.97,95.59,
+99.42,96.47,97.43,98.75,99.35,100.50,101.02,98.39,102.06,104.29,
+103.73,103.73,104.05,104.03,104.94,106.63,102.89,105.52,104.29,106.67,
+109.15,107.21,107.66,108.86,109.73,112.51,114.59,109.61,111.73,114.80,
+112.16,110.61,110.52,110.86,115.55,112.90,117.48,114.54,116.30,119.18,
+117.77,120.02,117.17,120.59,119.51,116.60,121.33,116.75,121.24,122.39,
+122.98,123.54,122.48,122.85,126.76,124.34,122.27,124.71,125.83,128.49,
+122.86,127.75,128.33,126.45,127.56,129.43,127.97,131.25,134.11,130.54,
+130.70,132.74,131.43,133.37,134.05,134.00,135.62,138.32,139.20,132.94,
+134.82,140.10,137.20,138.42,139.81,137.00,139.73,140.72,140.88,144.75,
+142.83,144.13,144.59,141.30,145.29,145.97,146.66,145.69,147.11,145.70,
+4.60,4.91,5.25,5.68,5.45,6.18,7.00,6.62,7.43,7.52,
+8.82,8.79,8.49,9.62,9.62,9.54,9.97,11.57,11.47,12.18,
+12.50,12.69,13.93,13.09,13.51,14.24,14.07,15.72,16.31,16.34,
+15.58,16.75,18.27,17.61,17.49,18.36,18.73,19.99,19.13,20.15,
+21.05,20.81,20.98,21.38,22.74,22.61,22.26,22.27,23.57,24.42,
+23.04,24.06,25.18,25.72,25.36,26.57,26.18,27.06,28.98,26.73,
+28.97,29.11,28.44,28.38,29.76,28.73,30.92,31.78,30.29,33.24,
+32.86,32.29,34.56,34.58,32.61,34.45,36.43,34.60,36.25,34.30,
+36.10,35.10,38.58,37.75,38.59,36.78,39.05,38.64,38.85,40.29,
+41.53,41.81,40.51,41.77,41.67,42.35,41.99,43.47,42.70,42.94,
+44.31,44.73,45.76,46.85,45.56,46.76,45.01,45.89,46.21,47.57,
+46.46,47.70,51.37,49.77,51.14,52.24,50.83,49.97,51.23,52.12,
+52.41,53.10,52.75,53.33,55.64,53.38,55.85,55.08,54.37,56.79,
+58.08,55.07,57.52,56.28,56.81,60.99,59.73,57.82,58.41,60.71,
+61.12,61.26,62.39,60.35,64.34,64.05,61.30,63.94,62.15,63.08,
+62.92,64.81,66.99,63.27,64.74,66.93,67.13,67.45,66.16,69.30,
+67.21,70.36,68.82,67.27,69.98,69.00,69.72,70.58,70.84,73.03,
+74.96,70.58,73.11,74.30,74.28,72.38,75.62,76.22,75.97,76.28,
+78.60,77.62,77.20,80.22,78.34,77.40,77.98,77.28,80.30,79.19,
+80.03,80.63,80.92,80.40,81.77,82.14,82.75,83.21,84.11,83.54,
+83.36,85.77,84.50,85.61,88.29,85.80,86.14,87.27,87.18,88.08,
+92.12,87.35,90.75,85.58,91.44,90.33,90.99,91.92,89.71,94.17,
+92.27,91.42,94.90,95.26,94.01,93.48,92.20,95.15,93.53,95.52,
+97.70,95.66,98.03,95.77,99.42,98.01,95.87,102.60,98.23,102.96,
+101.18,100.02,102.39,99.80,100.82,101.65,104.58,101.06,102.31,102.37,
+108.27,104.92,104.74,107.84,109.02,109.88,107.29,107.47,107.81,108.51,
+107.99,109.38,109.56,109.18,109.02,111.25,111.05,111.13,111.00,113.30,
+111.78,113.91,113.93,110.67,114.13,116.92,116.41,115.91,117.18,116.52,
+116.36,117.03,116.48,120.78,117.14,119.62,119.00,118.43,118.00,122.73,
+2.98,4.08,4.50,5.29,4.30,4.67,5.22,5.58,6.08,7.43,
+6.37,7.07,7.67,8.04,7.66,8.52,8.03,9.00,9.42,9.88,
+9.82,10.01,10.96,10.98,11.08,12.35,12.23,12.67,13.23,12.93,
+14.07,14.00,13.83,14.97,15.16,15.15,15.64,15.10,15.52,16.46,
+16.78,16.05,15.29,17.07,19.32,17.38,17.54,18.50,20.29,17.99,
+19.77,20.74,20.70,21.30,22.45,21.91,22.07,21.63,21.58,21.89,
+22.48,23.29,24.58,23.80,23.27,24.93,25.60,25.12,26.64,27.03,
+25.80,27.16,26.94,28.41,27.70,27.20,30.23,27.56,28.40,31.79,
+28.74,29.72,30.50,31.02,31.54,33.50,30.79,33.64,32.82,33.23,
+32.83,33.64,34.93,31.73,34.94,34.89,34.46,36.42,37.06,37.46,
+37.04,35.77,37.96,36.68,37.26,37.45,38.34,38.20,39.36,39.40,
+39.00,40.41,40.74,40.71,41.28,43.41,40.95,42.38,42.41,43.09,
+42.47,42.48,44.86,45.33,45.42,44.03,45.72,46.16,46.43,45.98,
+44.52,44.59,46.66,45.93,46.87,47.29,47.98,47.48,47.04,50.02,
+51.82,50.66,49.25,50.78,52.56,48.56,51.19,51.49,52.37,51.99,
+52.60,53.20,54.76,56.04,53.92,54.30,53.40,54.22,56.69,55.55,
+55.76,56.30,58.66,58.64,56.20,56.24,61.01,56.10,58.09,57.10,
+58.91,59.04,61.02,60.92,61.78,61.31,61.59,63.62,63.23,61.09,
+63.00,64.05,63.08,63.56,64.63,65.68,64.05,64.75,64.78,66.96,
+66.26,64.98,66.72,67.36,67.03,69.17,67.98,67.83,67.74,68.38,
+70.13,70.39,68.27,68.77,72.60,71.73,70.10,69.66,72.17,70.88,
+70.20,72.59,74.17,72.79,74.23,75.09,75.29,75.95,77.71,76.28,
+75.20,75.51,76.12,75.46,76.15,78.97,80.25,77.13,78.68,80.36,
+77.68,79.97,79.77,82.10,78.93,83.27,81.49,82.82,81.44,83.31,
+83.73,81.00,83.58,83.31,82.72,84.22,82.21,85.22,82.68,85.64,
+85.16,85.50,88.50,85.32,86.05,87.53,90.33,87.08,89.83,88.77,
+88.61,90.08,89.48,88.77,91.48,92.73,91.34,90.87,93.52,90.37,
+93.18,94.94,93.53,93.45,92.37,92.90,93.32,94.29,95.10,95.91,
+96.95,93.60,98.53,95.28,96.53,99.67,95.55,98.50,96.71,97.65,
+2.56,2.74,3.68,3.93,3.99,3.96,4.50,4.01,4.42,5.52,
+5.08,6.11,6.36,6.54,6.99,6.72,8.38,7.43,7.52,8.43,
+8.67,8.05,8.96,8.90,9.30,10.48,9.55,10.75,9.82,10.92,
+10.78,11.74,12.23,10.95,12.16,12.36,13.05,12.98,13.51,13.53,
+13.80,15.41,14.68,15.04,15.37,13.89,15.17,15.30,15.12,15.89,
+16.63,17.80,17.12,16.67,18.43,18.54,18.61,18.63,20.35,18.77,
+19.30,17.55,19.43,20.20,20.49,20.10,20.87,20.85,21.30,22.51,
+22.30,21.39,23.39,23.21,23.11,23.21,22.80,23.41,23.38,25.00,
+24.78,25.62,24.99,25.58,24.62,25.08,26.38,24.62,27.42,25.50,
+27.46,28.45,26.71,27.10,28.92,28.76,29.15,28.91,29.59,29.54,
+27.98,30.70,29.48,29.98,30.58,29.25,32.43,31.53,31.49,32.50,
+32.88,32.59,32.49,35.30,35.08,35.51,32.99,35.15,36.98,34.97,
+35.20,35.03,34.35,37.02,35.66,37.26,38.91,37.21,38.85,37.64,
+40.57,38.26,37.82,37.95,38.35,39.14,39.95,38.64,37.80,40.02,
+41.06,40.42,40.20,41.90,42.37,39.96,44.21,43.76,42.67,44.47,
+44.78,43.28,44.05,44.79,43.78,46.45,45.39,43.17,44.42,46.89,
+45.08,46.21,46.68,45.76,48.04,48.75,47.97,48.94,49.85,48.31,
+49.73,49.03,50.44,49.23,50.21,50.99,51.08,50.56,52.22,51.88,
+53.32,51.85,52.96,53.94,52.26,52.37,53.85,53.65,51.58,55.21,
+53.46,57.99,55.15,53.74,57.65,52.57,56.17,54.26,57.33,57.28,
+54.89,58.51,56.11,59.27,59.42,59.16,58.41,60.81,58.50,59.89,
+57.69,59.78,62.50,58.95,61.10,60.63,60.94,62.96,63.27,60.99,
+62.32,63.25,63.67,63.23,63.55,64.93,62.75,62.41,65.56,66.07,
+65.72,62.32,64.50,65.12,67.13,66.51,69.09,67.22,66.99,67.91,
+67.16,69.28,69.17,65.77,69.61,69.96,68.64,69.38,69.03,71.00,
+69.42,69.24,71.42,74.09,70.62,75.22,72.46,72.17,70.93,72.89,
+73.44,71.28,74.61,75.54,71.72,73.39,74.95,73.59,76.15,72.76,
+74.06,74.50,77.47,74.84,77.96,76.86,77.16,77.26,77.76,76.05,
+79.67,76.24,81.27,78.61,82.28,78.11,78.89,78.96,80.19,81.60,
+2.27,2.51,2.45,3.62,3.11,3.96,3.54,3.82,4.24,4.19,
+5.12,5.37,5.13,4.71,5.84,5.24,5.36,6.21,5.83,6.23,
+6.11,6.55,7.23,7.03,7.31,8.06,7.91,7.50,8.22,8.29,
+8.40,9.85,9.11,9.39,9.88,10.35,11.57,10.47,10.95,11.89,
+10.96,11.15,11.96,12.34,11.53,11.85,12.55,12.50,13.33,13.06,
+13.57,13.72,13.67,15.72,14.55,14.18,15.27,15.16,15.29,15.70,
+16.22,16.85,16.67,16.22,16.48,16.54,16.97,17.59,17.49,17.85,
+17.55,17.82,17.54,18.62,18.80,18.32,18.01,17.69,18.93,20.91,
+20.97,20.23,20.89,20.84,18.41,21.16,21.76,21.63,22.58,21.63,
+22.45,22.53,22.09,23.69,23.49,23.02,23.71,24.21,23.14,23.10,
+25.25,24.44,24.74,24.24,25.29,24.55,26.44,25.70,27.29,25.82,
+25.44,26.44,27.53,28.24,27.65,26.47,26.98,26.41,28.73,27.38,
+29.73,29.46,28.92,30.59,29.88,30.07,31.77,31.07,31.00,30.61,
+32.83,30.95,30.78,32.76,32.78,33.50,33.11,32.17,32.73,34.61,
+34.59,33.36,33.83,34.05,34.20,33.85,32.80,34.46,35.51,34.09,
+34.84,36.41,36.10,33.27,36.21,36.32,38.68,39.46,36.85,37.93,
+36.74,36.65,39.54,35.99,37.83,39.79,38.47,37.81,38.37,40.56,
+40.00,39.79,40.39,39.64,39.36,40.70,44.00,41.36,42.49,40.43,
+41.26,42.16,42.58,42.81,42.37,43.45,44.27,43.86,43.37,42.56,
+43.59,44.10,44.45,45.19,45.59,45.88,45.12,48.01,45.67,46.60,
+46.69,45.72,47.45,45.97,46.93,48.17,48.56,47.19,49.75,47.99,
+50.60,49.89,48.55,49.39,51.88,49.15,50.28,51.25,49.83,50.99,
+51.52,51.24,51.80,52.03,53.31,52.76,51.25,52.61,51.23,52.14,
+53.94,53.71,53.29,53.29,54.83,52.44,53.99,55.82,55.66,56.13,
+54.73,55.83,54.81,58.98,55.54,57.54,58.59,57.63,56.64,56.10,
+56.52,57.52,56.17,59.92,60.32,57.13,59.12,59.87,58.92,59.03,
+59.45,61.22,60.17,60.96,61.89,59.57,61.43,61.28,61.72,62.72,
+62.23,64.76,61.69,61.99,63.26,61.69,60.86,63.69,62.50,64.47,
+65.85,63.71,64.02,66.10,62.99,66.07,64.85,64.26,66.38,66.32,
+33.71,38.39,41.41,44.19,47.07,50.04,54.20,57.58,61.97,62.48,
+66.89,70.24,75.22,76.70,81.55,83.82,86.14,90.10,93.90,96.82,
+101.04,104.08,105.86,108.85,111.24,117.39,120.73,123.98,125.17,130.69,
+134.49,136.19,138.42,143.16,145.80,150.54,153.54,157.44,160.43,163.58,
+165.48,168.62,171.85,175.50,179.03,183.57,186.68,190.10,193.21,197.06,
+197.92,201.57,205.15,208.62,213.92,216.60,220.05,220.68,225.71,230.05,
+234.07,235.45,235.13,242.23,245.16,247.69,251.85,253.63,257.78,261.24,
+261.99,268.95,272.67,273.97,274.83,281.06,286.30,291.60,294.17,294.13,
+294.72,303.04,305.59,309.00,311.08,314.74,318.80,322.20,322.42,326.75,
+332.85,333.67,336.46,341.58,345.47,343.66,351.65,351.35,358.07,362.82,
+364.40,369.26,371.24,374.38,378.87,383.03,385.66,386.37,393.03,395.26,
+397.54,402.91,403.18,408.53,408.74,415.03,414.23,420.89,423.40,425.73,
+430.00,433.53,437.05,436.55,442.78,443.76,448.64,452.78,453.77,462.37,
+464.82,464.72,467.40,471.87,475.01,477.25,482.96,485.59,488.57,493.10,
+494.62,496.92,500.75,508.53,506.96,510.92,513.13,519.18,521.41,526.46,
+528.83,531.59,539.75,539.52,541.60,548.42,546.97,549.03,555.16,558.81,
+557.57,562.36,573.05,569.50,574.33,577.65,580.96,584.31,585.38,590.85,
+593.57,600.23,598.27,603.62,607.35,613.70,611.03,621.06,619.24,626.79,
+631.55,629.36,635.63,634.91,642.25,645.87,647.59,646.88,651.92,652.85,
+664.26,663.73,667.70,668.82,673.53,678.35,683.06,689.54,686.08,692.44,
+692.36,697.44,698.73,702.32,705.05,709.75,711.33,720.06,719.37,722.85,
+728.14,727.77,732.18,738.19,741.09,743.82,746.25,747.56,753.54,755.74,
+760.25,756.63,766.95,771.34,780.72,774.21,781.42,781.64,780.99,791.09,
+795.92,798.73,801.40,800.46,806.40,805.76,814.89,814.60,816.29,817.02,
+822.53,826.13,830.70,834.03,835.21,845.39,840.68,845.48,850.77,854.37,
+859.86,863.68,864.10,870.32,874.40,874.29,879.62,878.55,883.64,886.45,
+887.79,894.02,901.23,902.77,906.32,907.85,910.64,915.23,920.55,925.14,
+925.83,924.31,932.36,933.04,935.77,938.40,948.31,943.50,950.57,954.03,
+954.77,958.66,963.42,970.24,972.73,972.84,976.35,977.09,983.39,988.88,
+27.62,31.72,35.41,38.40,41.46,43.26,45.10,48.79,51.59,53.88,
+57.55,59.68,64.23,66.99,68.65,72.81,75.21,77.02,81.28,84.44,
+84.86,88.03,91.01,95.24,96.13,101.16,102.75,107.07,107.25,111.99,
+113.94,117.76,119.53,123.61,127.00,126.73,129.81,132.89,136.94,140.81,
+143.49,144.29,147.94,151.78,153.58,157.91,157.77,161.63,162.22,168.66,
+172.46,174.49,174.88,177.06,181.42,186.17,187.79,188.78,191.90,195.98,
+198.63,201.26,202.63,208.47,210.17,213.91,216.04,216.34,220.60,222.75,
+226.69,231.12,233.09,235.92,238.66,241.28,245.75,244.23,248.27,250.81,
+254.75,260.44,258.51,263.43,268.40,268.01,271.89,275.92,276.88,279.82,
+284.35,286.24,289.38,293.69,295.24,297.13,302.38,303.83,307.90,311.71,
+313.18,317.09,316.68,322.61,319.31,325.00,328.04,332.19,333.97,334.43,
+339.18,342.84,344.83,352.36,349.84,351.24,354.75,357.74,360.39,366.39,
+368.44,370.48,372.59,378.52,378.26,381.71,386.33,387.81,390.98,388.72,
+399.40,398.58,400.59,406.32,408.84,411.88,415.32,421.50,420.66,424.41,
+424.69,428.00,432.96,430.38,436.67,435.95,441.19,444.60,447.82,449.84,
+453.00,456.77,461.26,458.61,462.08,469.87,471.04,476.72,477.11,477.73,
+479.56,489.50,488.14,491.96,491.65,493.29,495.88,497.85,507.53,503.16,
+510.79,508.50,516.77,515.87,520.99,528.13,527.42,532.42,538.39,531.47,
+532.74,538.12,540.07,548.51,547.64,550.59,555.44,557.88,561.83,559.75,
+569.10,569.66,574.13,574.64,576.33,581.95,583.74,588.89,586.09,595.12,
+591.61,600.21,597.34,601.23,606.58,608.30,611.82,612.22,615.17,624.04,
+627.73,626.91,625.16,635.07,634.85,634.64,641.92,640.06,637.23,647.59,
+649.13,652.79,660.76,661.65,658.46,663.10,664.58,665.99,672.73,677.76,
+675.97,683.87,686.35,684.78,690.35,692.85,696.00,694.81,701.53,703.17,
+706.57,712.99,715.21,714.86,723.46,718.84,721.88,723.79,733.39,727.19,
+738.41,737.98,736.96,739.92,746.55,749.70,751.46,754.88,759.29,760.64,
+761.63,768.11,765.69,766.26,771.47,774.43,782.37,781.03,788.78,786.74,
+790.67,790.66,799.11,800.61,801.65,806.71,811.68,811.93,814.86,818.05,
+823.81,826.01,826.98,827.79,829.44,833.90,840.98,836.16,843.14,842.28,
+24.87,26.95,29.30,33.02,35.23,37.53,39.72,41.59,43.79,47.26,
+48.90,51.50,54.55,55.99,58.76,60.84,64.33,65.62,67.42,70.85,
+72.22,74.89,78.94,81.40,84.76,85.54,87.62,89.62,91.55,95.18,
+98.68,98.97,101.13,104.27,106.80,109.76,113.86,113.10,116.28,119.46,
+121.72,124.70,125.51,128.19,132.54,134.04,134.86,138.36,142.05,143.80,
+143.68,146.97,151.76,152.86,152.89,159.26,160.13,163.79,165.28,167.11,
+168.89,173.06,175.13,175.59,176.59,180.62,182.40,185.45,187.38,191.63,
+194.62,198.12,195.95,202.28,203.42,206.40,209.71,211.15,211.12,218.35,
+216.81,221.94,226.25,226.72,227.14,228.73,234.57,235.64,237.84,240.42,
+239.13,245.93,245.80,248.03,251.93,253.87,255.30,260.72,261.60,263.85,
+266.60,267.54,269.61,272.99,278.15,276.61,278.49,285.51,281.15,289.23,
+289.10,292.63,295.87,294.51,304.75,302.11,306.47,308.76,310.69,314.32,
+318.68,314.68,319.47,322.07,322.45,324.45,329.57,332.31,333.64,333.60,
+340.17,341.46,342.88,346.26,347.42,353.39,352.54,353.71,359.07,358.79,
+358.89,361.96,367.51,369.54,370.13,373.54,380.72,378.43,386.70,385.98,
+384.77,388.29,389.70,390.58,393.88,399.54,403.17,404.20,402.60,411.21,
+408.51,413.26,411.86,418.19,420.14,418.35,424.13,428.22,431.67,428.21,
+436.78,431.66,442.90,441.90,451.36,446.26,443.85,451.33,452.76,454.82,
+458.80,461.74,462.14,470.65,470.08,472.54,474.28,473.81,484.15,478.22,
+482.79,487.94,485.65,489.16,496.40,494.78,498.77,500.88,500.05,506.80,
+500.19,508.76,510.92,515.91,516.83,522.24,519.56,527.82,524.47,527.75,
+532.03,533.99,537.09,540.08,541.53,541.88,541.92,546.67,551.23,555.72,
+557.02,554.83,557.13,561.98,563.26,567.82,568.98,570.88,575.97,579.80,
+579.88,583.21,581.46,587.34,593.73,590.55,592.19,595.16,598.66,600.27,
+604.66,611.49,608.43,611.43,613.89,614.04,619.30,622.61,623.18,623.93,
+631.02,627.78,633.80,629.70,638.00,641.49,642.75,646.82,647.16,649.02,
+649.17,656.03,653.57,656.98,661.54,662.15,667.18,665.64,674.81,673.21,
+678.21,678.43,677.46,678.67,684.29,686.45,690.35,697.21,694.00,695.92,
+701.45,698.92,705.44,706.03,710.37,713.81,712.87,714.48,719.13,727.30,
+21.37,23.15,25.49,26.34,29.93,30.35,34.54,36.66,37.35,40.63,
+42.15,43.93,45.96,47.79,50.14,52.86,53.98,55.83,58.38,60.45,
+60.93,65.11,66.84,68.52,69.64,71.42,74.94,78.49,79.11,79.85,
+81.73,85.31,85.58,88.61,91.42,95.17,95.89,96.14,98.58,99.89,
+104.06,105.13,107.92,109.57,112.93,115.09,117.13,118.21,117.71,120.35,
+120.05,126.16,128.33,129.03,131.13,132.96,137.50,138.92,141.42,142.67,
+145.99,144.90,146.97,149.97,152.26,154.33,155.85,159.53,162.44,161.22,
+161.96,169.91,170.20,169.70,174.51,175.16,179.70,180.78,181.85,183.62,
+185.64,186.18,189.14,194.70,194.20,196.44,199.16,198.51,202.50,203.80,
+205.32,209.66,210.88,211.92,217.56,214.17,218.55,218.80,222.74,225.10,
+226.92,228.49,230.95,233.38,237.44,237.98,238.13,241.22,243.28,246.05,
+248.37,249.54,252.21,252.66,256.50,257.29,257.94,260.46,264.14,265.17,
+267.97,267.38,272.64,271.70,271.25,277.89,277.81,281.91,284.21,282.51,
+292.06,292.43,291.45,292.03,294.79,294.93,298.78,304.63,304.87,306.49,
+310.54,310.61,315.93,312.51,316.92,319.51,321.28,320.94,327.54,324.14,
+329.77,328.77,331.80,332.27,333.23,338.14,340.38,345.82,344.13,346.23,
+350.61,348.09,351.45,356.39,356.37,356.87,359.01,359.86,363.94,368.59,
+370.21,370.34,369.13,375.08,378.17,377.67,382.06,385.37,388.21,384.25,
+388.65,392.64,393.86,396.87,399.43,400.35,401.90,403.27,407.27,405.29,
+408.76,413.66,415.23,419.30,417.08,423.92,422.23,421.28,429.86,428.56,
+434.20,429.85,438.47,437.32,437.20,440.05,445.48,446.56,448.52,448.88,
+451.44,451.37,452.59,454.22,459.14,468.36,461.94,464.26,470.18,467.54,
+475.15,473.48,472.30,479.20,481.24,482.48,484.07,487.15,487.15,492.58,
+487.97,493.14,500.92,494.57,498.50,506.40,507.02,503.13,512.95,511.38,
+510.22,514.25,518.87,519.17,522.32,522.84,523.25,523.35,526.74,535.54,
+532.94,536.80,536.34,539.71,537.89,543.72,548.51,548.89,550.27,555.84,
+555.65,551.40,557.75,561.27,562.08,558.91,566.32,565.63,565.48,569.08,
+576.29,575.49,580.50,579.48,584.05,585.40,584.68,589.02,590.31,593.01,
+594.45,596.30,598.73,602.08,605.02,602.19,602.32,610.30,612.11,611.05,
+19.21,19.78,20.63,23.04,24.15,27.79,28.75,30.20,32.26,32.57,
+34.89,37.73,38.97,40.32,42.23,45.82,45.66,49.36,48.69,51.77,
+52.95,54.84,54.99,57.24,58.68,61.72,62.50,66.71,66.37,67.00,
+69.93,72.42,73.88,74.15,76.68,78.74,79.47,82.39,83.68,84.50,
+85.57,89.96,91.23,92.42,94.31,95.33,94.32,98.80,100.52,102.52,
+105.69,106.49,108.00,110.92,110.27,115.55,116.24,115.72,118.13,121.45,
+121.16,125.33,127.67,126.71,130.02,132.31,133.10,135.06,135.86,141.31,
+138.99,137.91,143.28,146.53,149.53,149.16,150.16,152.01,151.35,155.70,
+159.02,158.51,161.09,164.68,161.13,167.44,166.92,165.12,171.46,170.26,
+174.59,178.41,176.03,179.33,180.47,183.19,181.86,186.78,185.81,192.60,
+192.11,192.45,195.51,197.90,202.01,199.58,200.29,203.72,207.24,206.14,
+209.27,210.34,212.56,214.91,217.45,219.55,220.61,217.60,220.86,228.41,
+224.32,229.72,228.19,231.80,230.70,233.94,234.85,242.73,240.82,241.94,
+243.79,246.37,248.70,248.11,248.71,251.19,254.66,255.42,257.56,260.85,
+259.25,263.92,264.61,268.31,267.52,271.26,269.60,272.79,274.81,272.39,
+276.12,277.53,279.22,283.37,286.06,284.41,287.95,295.04,291.18,295.20,
+295.13,298.56,299.57,300.51,304.31,305.18,308.55,310.08,310.94,314.68,
+316.94,314.88,319.69,316.35,321.37,318.71,326.53,321.87,324.36,327.39,
+332.96,329.87,336.92,335.27,339.28,335.54,343.30,343.29,346.12,346.05,
+349.25,348.49,355.25,353.48,347.56,357.56,360.29,359.01,362.79,358.55,
+360.19,368.66,366.87,371.43,372.04,374.78,375.89,378.38,380.07,381.01,
+382.76,381.62,383.22,386.96,387.06,394.20,397.02,394.86,394.72,399.69,
+394.76,402.77,400.14,404.56,404.87,407.77,407.97,407.55,420.57,414.22,
+417.12,418.07,419.59,422.91,422.51,427.98,422.36,430.27,430.39,431.51,
+435.36,431.99,438.88,440.65,443.65,442.83,442.57,444.73,448.07,453.10,
+449.78,455.50,453.43,454.26,462.91,457.45,463.98,462.94,464.91,468.75,
+469.36,466.80,474.93,481.02,479.21,483.23,477.82,480.48,484.61,485.87,
+485.71,488.79,487.34,494.24,493.64,496.93,493.68,495.52,500.22,504.81,
+509.07,509.28,508.95,506.78,510.46,512.79,512.05,516.03,512.72,519.45,
+15.20,16.46,18.00,19.76,21.90,21.43,23.29,25.66,27.72,28.09,
+30.00,30.48,33.31,33.46,34.65,37.96,38.72,41.06,41.65,42.73,
+44.68,47.53,47.91,49.68,49.66,51.86,53.65,55.08,56.00,57.40,
+60.34,61.60,61.89,62.66,64.99,65.54,69.61,70.18,71.80,73.02,
+73.50,76.73,76.35,80.62,81.02,82.74,80.44,82.33,84.21,86.45,
+86.25,90.95,91.22,90.56,93.28,93.90,98.39,98.40,99.82,101.66,
+101.96,105.92,103.52,105.06,109.80,109.51,110.38,112.05,113.95,115.66,
+116.25,119.58,121.69,119.22,123.03,126.41,125.14,129.33,129.74,132.72,
+132.88,131.26,134.76,136.98,139.23,141.54,141.79,141.74,144.13,145.11,
+144.98,145.29,150.29,151.49,155.29,153.96,157.91,159.55,161.47,161.53,
+162.37,163.97,167.14,165.52,169.20,172.02,169.65,171.99,175.61,173.03,
+176.11,177.04,180.10,180.37,181.57,181.69,187.19,188.05,187.58,189.85,
+191.83,194.62,195.77,193.78,202.54,197.48,199.30,201.85,202.53,205.83,
+206.65,203.82,209.86,208.85,211.80,210.75,213.13,216.52,216.52,218.93,
+219.75,221.03,222.74,223.26,227.35,228.58,229.04,230.59,234.16,231.94,
+234.78,235.81,236.97,240.00,240.97,244.92,244.28,248.51,248.10,248.54,
+249.66,248.46,254.15,253.98,254.21,262.55,259.55,260.49,261.51,262.99,
+263.99,267.27,266.51,271.25,269.83,273.69,275.89,273.41,276.71,277.36,
+279.47,279.01,284.66,279.70,281.81,285.54,288.68,286.98,288.61,293.34,
+290.63,296.05,296.45,297.46,301.35,304.63,304.12,304.70,304.08,305.96,
+304.20,313.36,310.99,312.41,313.73,315.14,315.97,316.36,319.06,321.55,
+322.40,320.67,324.41,327.57,329.46,328.81,334.18,334.20,334.87,337.22,
+338.39,341.18,336.58,343.33,341.99,346.42,347.86,345.82,347.55,350.12,
+353.36,358.06,354.41,356.78,356.56,360.14,361.53,357.16,365.16,363.14,
+369.27,366.24,371.32,375.13,374.63,369.97,377.28,378.03,380.86,383.26,
+381.75,381.98,386.13,384.68,386.55,391.90,392.64,392.02,388.48,390.85,
+397.99,396.50,398.36,404.10,406.54,402.95,408.18,407.44,406.94,409.42,
+413.41,417.76,412.28,417.20,416.02,417.76,419.43,420.17,424.74,423.73,
+421.71,425.89,429.07,431.20,432.18,431.32,433.00,436.34,432.32,442.88,
+13.28,13.56,14.27,16.91,17.16,19.41,19.92,21.20,23.34,24.70,
+25.20,26.93,28.88,30.48,30.56,31.55,32.71,32.63,34.31,37.95,
+37.44,37.85,40.16,40.37,42.38,43.36,44.15,45.92,46.94,48.89,
+50.47,50.44,51.96,52.68,53.56,56.62,55.40,58.89,59.46,60.08,
+63.31,62.04,63.03,66.35,65.82,68.18,69.80,71.35,71.25,72.37,
+73.86,75.30,76.74,78.05,78.31,82.21,83.67,81.36,83.40,86.18,
+86.64,89.67,88.21,90.01,91.76,93.46,93.50,94.46,96.66,97.88,
+99.09,99.56,100.74,105.39,102.73,105.99,107.53,107.60,109.30,110.30,
+114.12,110.91,113.31,115.30,115.47,116.82,120.17,118.76,122.37,121.80,
+123.18,123.42,125.48,128.43,129.02,132.11,131.00,132.86,136.28,133.26,
+138.40,135.76,139.49,140.62,141.57,142.83,142.26,144.32,146.99,147.81,
+150.45,151.17,151.05,152.19,154.69,152.86,156.27,155.18,155.65,162.96,
+163.44,160.26,165.43,165.75,165.94,167.17,166.43,168.89,168.87,171.07,
+172.62,172.61,176.33,178.66,177.09,180.33,181.57,182.48,179.58,187.14,
+186.33,188.65,186.76,187.91,188.89,193.39,194.04,195.32,195.74,194.60,
+196.71,199.91,201.10,200.34,207.78,204.59,207.59,205.68,207.83,209.33,
+208.33,210.76,212.70,214.33,216.03,217.97,216.91,216.65,220.10,222.22,
+225.32,224.48,224.87,225.98,229.12,228.36,230.67,233.31,232.53,233.50,
+235.89,237.15,236.72,237.27,235.20,241.24,238.76,243.16,245.91,245.53,
+245.54,246.78,254.13,247.39,249.88,253.27,255.17,258.41,258.06,259.47,
+262.38,261.10,264.28,261.05,264.55,265.63,265.69,271.77,264.99,272.10,
+275.67,272.65,276.79,273.79,282.65,277.97,279.54,283.42,282.51,285.10,
+285.62,287.19,284.45,291.11,290.70,290.39,293.20,292.05,293.66,291.91,
+297.75,296.20,301.22,298.98,305.62,302.98,299.84,305.27,304.15,305.75,
+306.38,312.81,312.48,314.22,311.84,315.44,316.69,314.89,315.95,321.23,
+320.32,327.80,320.56,322.24,326.85,332.74,328.47,330.57,335.30,330.84,
+336.44,334.75,338.88,335.38,338.06,339.82,340.52,337.36,349.19,343.76,
+347.17,346.99,351.58,349.18,353.56,351.94,357.23,354.87,355.12,356.10,
+358.56,361.63,363.06,360.68,361.76,362.88,366.50,369.06,367.37,370.99,
+10.59,12.24,12.80,13.59,14.77,17.33,16.83,18.61,18.02,20.69,
+20.21,22.05,22.19,23.46,25.73,25.78,28.36,27.65,29.09,29.81,
+30.81,32.26,33.36,35.61,36.36,37.04,37.70,38.79,40.75,41.21,
+41.41,41.99,42.94,45.05,44.86,47.90,50.38,48.93,50.68,51.09,
+53.70,51.88,55.26,55.08,57.59,56.90,58.61,59.59,61.46,61.48,
+62.41,64.07,64.55,65.95,65.16,68.55,70.46,70.62,71.31,72.51,
+73.28,72.49,75.16,77.85,75.40,78.08,78.27,79.98,82.57,81.15,
+81.61,85.15,85.57,88.12,89.89,90.10,88.47,88.94,90.47,93.40,
+95.19,95.42,95.39,92.75,98.49,98.98,99.57,101.12,101.75,101.90,
+106.59,104.19,106.25,106.80,108.42,109.33,110.33,111.47,110.09,113.16,
+115.29,115.56,116.78,117.37,119.74,119.00,119.37,120.95,122.94,126.45,
+123.61,129.09,125.28,128.27,128.88,128.37,128.84,130.35,132.54,134.24,
+134.96,137.87,136.93,140.95,138.69,141.41,141.72,143.50,141.26,143.92,
+145.42,147.66,147.33,150.49,149.77,150.96,149.77,154.43,151.73,154.43,
+156.90,155.62,158.27,156.90,158.85,159.41,161.23,163.55,165.03,164.91,
+167.86,168.95,167.42,169.53,167.98,172.23,170.08,177.63,171.76,176.68,
+175.99,179.25,177.93,178.34,176.48,180.28,183.12,188.76,187.52,185.14,
+186.79,187.59,188.79,192.50,193.25,191.97,192.12,195.33,192.11,195.45,
+195.80,199.74,200.18,198.22,202.72,203.62,202.64,205.13,207.57,205.97,
+208.22,208.73,207.38,209.82,211.63,211.18,214.07,217.22,213.98,219.26,
+218.82,220.86,217.91,221.01,220.12,223.29,221.74,226.60,225.82,226.28,
+230.37,233.80,228.76,232.71,232.79,236.34,233.74,239.12,239.69,238.97,
+238.65,239.30,240.53,242.68,245.27,245.07,244.39,245.04,246.94,247.10,
+248.51,251.00,252.30,249.30,250.40,254.71,255.96,255.42,258.01,254.08,
+263.06,261.25,259.75,260.04,261.65,263.31,269.84,265.29,269.92,270.04,
+270.55,270.66,274.35,273.09,272.93,273.82,274.46,279.44,278.85,281.86,
+274.43,279.60,281.80,285.53,284.76,286.25,287.01,286.15,285.79,290.16,
+288.93,293.83,291.26,293.05,298.07,291.30,299.59,298.54,300.22,302.54,
+303.01,298.20,305.14,307.52,303.44,305.90,307.58,309.27,309.19,311.65,
+8.12,9.11,11.04,11.78,12.49,13.03,14.94,15.65,15.27,16.96,
+18.19,18.74,19.56,20.04,21.18,22.11,22.84,23.04,25.39,25.85,
+26.31,26.94,27.70,28.36,28.78,29.21,32.18,31.14,34.43,34.98,
+35.47,36.00,36.58,38.77,39.09,40.38,40.70,40.81,42.21,42.62,
+42.94,42.82,46.30,46.52,46.74,47.47,49.76,50.03,52.23,50.99,
+53.34,55.10,54.82,54.95,55.98,54.74,57.74,58.76,56.77,59.55,
+60.67,63.02,62.77,62.52,63.73,65.84,63.44,68.14,68.22,69.50,
+69.02,71.56,70.69,74.96,76.11,74.29,74.20,75.67,75.57,77.42,
+77.77,78.30,80.95,82.44,83.48,83.18,85.17,84.21,84.71,88.48,
+86.08,87.88,89.06,87.98,90.43,91.27,93.78,91.32,95.31,93.94,
+96.58,94.52,96.26,101.00,97.73,99.15,100.98,103.05,104.14,102.81,
+104.63,105.72,106.17,108.66,107.75,109.05,112.39,108.98,111.17,114.60,
+111.48,113.00,117.01,115.02,118.55,118.86,121.02,118.15,120.38,120.60,
+124.08,121.65,126.08,124.86,121.59,127.13,130.66,129.59,125.70,129.59,
+129.27,131.38,134.84,135.55,134.65,135.26,135.96,134.93,137.67,137.59,
+142.65,144.30,138.09,140.44,140.69,143.00,146.72,146.22,146.25,147.07,
+149.89,148.90,148.69,149.99,149.74,154.75,153.45,156.86,156.16,153.70,
+155.84,159.58,159.10,160.88,161.09,161.68,162.98,163.46,159.91,164.78,
+165.50,168.36,166.32,166.57,170.22,173.36,168.86,174.09,172.03,174.25,
+174.46,176.45,179.15,175.48,177.96,177.51,176.63,181.46,180.78,180.12,
+183.43,182.99,184.85,186.57,189.71,187.29,189.39,187.85,190.79,193.09,
+193.08,193.61,192.31,195.59,192.96,195.85,194.30,199.54,200.38,198.49,
+197.38,203.46,201.86,204.93,203.30,206.27,204.41,206.64,206.38,206.17,
+209.64,210.50,212.14,208.60,213.61,214.22,212.96,216.94,209.34,212.90,
+220.87,219.78,220.26,219.33,221.67,221.17,225.41,220.86,223.52,226.74,
+225.18,229.28,227.48,226.21,230.91,229.58,228.49,230.17,233.38,234.34,
+233.19,230.85,235.75,240.07,239.06,241.20,240.22,240.99,243.08,242.53,
+240.79,242.77,243.22,243.51,247.72,251.80,246.11,251.06,247.38,251.13,
+251.73,251.25,256.80,257.24,255.49,257.83,258.47,256.59,258.03,256.37,
+7.48,8.15,9.12,9.31,11.22,11.43,11.62,12.57,13.48,13.75,
+13.86,15.32,16.19,17.51,18.11,19.95,17.74,19.44,21.38,21.68,
+21.20,22.91,24.22,24.47,25.40,26.86,25.71,28.61,27.42,29.47,
+28.13,29.40,30.67,32.39,32.19,32.48,33.71,34.30,35.11,36.11,
+37.35,37.15,37.70,38.42,40.19,38.30,40.67,41.24,42.27,43.79,
+43.80,43.79,44.33,46.85,47.77,49.12,47.18,50.49,51.66,49.92,
+50.14,52.41,52.59,54.28,54.22,55.79,55.75,57.19,58.03,57.48,
+58.17,59.54,60.27,61.61,61.33,63.46,62.03,64.25,64.04,62.59,
+63.29,64.54,66.60,68.33,68.19,68.41,71.00,71.38,69.73,71.93,
+71.62,72.68,75.05,74.68,75.14,76.01,78.09,76.96,79.22,80.78,
+81.19,80.52,81.36,81.59,84.53,84.40,83.28,82.89,81.95,87.99,
+86.09,86.84,87.45,88.76,91.44,89.55,91.83,92.18,93.45,92.41,
+93.60,96.00,99.51,96.52,96.80,98.92,98.65,99.92,101.38,100.96,
+100.34,103.45,107.48,105.67,106.04,106.19,109.11,108.68,108.21,109.94,
+106.58,110.31,114.18,109.84,113.64,112.52,112.73,116.69,114.98,115.32,
+115.82,114.31,118.16,121.13,116.23,120.10,122.64,122.45,122.63,121.48,
+124.38,122.28,126.99,124.11,124.54,127.35,129.52,129.60,129.76,133.43,
+132.40,131.23,132.44,131.56,135.03,135.74,135.32,135.97,136.20,137.67,
+137.47,139.57,142.39,138.18,139.61,137.92,145.33,143.22,143.44,146.36,
+148.78,146.56,143.40,145.04,147.02,152.18,151.50,147.07,152.07,152.88,
+150.13,151.90,153.45,151.41,156.71,158.65,157.88,156.98,158.25,161.00,
+161.41,159.83,158.95,158.74,161.43,165.38,168.34,165.55,167.58,171.06,
+165.63,170.86,170.49,167.50,173.83,167.82,173.08,176.25,177.18,174.43,
+176.37,172.81,176.97,175.83,175.90,180.24,180.60,178.71,184.93,179.74,
+182.53,178.87,186.71,184.60,188.57,185.99,188.27,187.76,187.98,191.56,
+188.96,190.99,191.98,190.42,191.04,194.13,192.57,191.57,194.91,195.38,
+196.81,197.51,196.11,196.03,200.54,201.53,203.00,198.42,203.64,199.30,
+201.49,201.79,203.50,203.10,205.61,206.56,209.25,210.65,206.21,207.49,
+214.59,212.69,210.80,215.09,216.44,214.23,218.03,220.01,216.87,215.70,
+6.29,7.00,7.97,8.56,8.94,9.36,10.31,10.82,10.09,10.73,
+13.11,12.85,13.85,14.28,14.80,15.87,16.48,15.90,18.06,18.12,
+19.04,18.51,19.82,20.14,20.61,21.65,21.80,22.54,22.86,23.43,
+24.47,24.50,26.85,25.15,28.17,27.45,28.73,28.50,29.87,30.93,
+32.00,30.53,31.68,33.00,31.32,33.67,33.77,33.85,34.55,36.96,
+37.53,34.76,38.93,38.56,37.94,37.42,40.39,40.72,41.69,41.09,
+43.06,44.15,43.88,46.07,45.88,46.84,45.08,46.46,47.52,46.69,
+47.45,49.59,49.80,50.18,51.36,52.10,52.25,51.89,54.33,53.38,
+55.04,56.78,56.10,56.51,57.86,56.22,58.10,58.30,60.74,62.80,
+60.92,62.31,62.07,61.91,64.59,65.45,65.56,64.81,67.61,66.24,
+66.44,68.26,65.55,68.88,69.48,68.98,70.96,70.77,69.43,74.21,
+72.50,73.94,74.69,73.68,76.21,76.30,78.75,76.79,77.08,79.66,
+78.88,80.37,81.23,83.34,79.45,80.13,82.95,82.68,85.45,83.16,
+85.61,85.49,85.37,85.02,87.33,85.28,89.05,89.96,90.27,91.08,
+90.58,92.20,91.81,91.26,93.79,96.16,95.30,91.38,94.44,97.77,
+97.78,97.47,99.99,100.71,101.90,100.03,101.80,102.68,102.29,100.81,
+102.36,103.76,101.89,103.28,106.83,107.01,108.03,106.73,108.32,108.44,
+106.92,109.30,110.16,108.73,112.52,110.67,113.58,114.06,116.89,115.36,
+114.00,116.00,115.30,118.95,116.71,119.02,121.21,119.48,120.13,120.19,
+119.22,120.70,121.23,123.76,125.12,124.74,125.40,127.64,124.09,126.28,
+123.96,125.39,128.94,126.46,130.98,128.14,131.42,133.01,132.37,131.58,
+136.87,132.30,135.92,135.28,133.87,137.78,140.10,134.73,136.02,139.93,
+138.88,140.77,142.16,142.26,143.00,144.62,142.63,144.73,144.21,146.16,
+146.81,149.69,145.71,143.72,147.44,148.58,146.58,150.39,150.52,153.10,
+151.29,153.98,153.08,153.32,155.26,154.35,158.10,155.37,163.00,160.27,
+157.55,157.92,159.09,162.29,160.39,161.47,160.53,163.48,163.10,165.01,
+167.06,162.55,169.08,168.61,168.92,168.45,165.45,168.39,171.60,169.28,
+167.67,171.89,169.37,172.29,169.19,173.79,176.83,173.28,172.88,173.62,
+176.23,180.00,176.15,178.49,178.95,180.59,182.74,177.90,185.41,178.22,
+4.50,6.46,5.88,6.22,7.49,7.47,8.16,8.71,10.05,9.35,
+10.10,11.13,11.74,12.17,12.92,13.60,12.95,14.22,14.84,15.26,
+16.02,14.91,16.44,16.30,16.73,18.27,18.62,18.15,19.66,19.56,
+20.90,21.15,21.45,22.01,22.23,23.44,24.81,23.90,23.90,25.79,
+25.63,25.18,26.60,26.40,27.54,27.86,29.11,28.51,28.26,28.97,
+31.04,30.71,32.29,32.59,32.85,32.95,34.33,33.73,33.94,34.56,
+35.63,36.33,36.68,36.95,37.39,37.92,39.23,39.16,39.13,39.63,
+42.10,40.47,41.18,41.78,44.89,43.67,46.96,43.40,44.45,44.65,
+45.18,47.53,48.44,47.27,47.51,49.08,46.99,49.71,50.02,50.17,
+49.30,50.67,49.30,52.06,52.20,53.31,53.03,54.44,56.80,54.01,
+56.62,56.30,57.23,57.26,57.80,58.21,59.70,57.31,61.17,59.74,
+60.46,63.51,62.11,63.54,62.07,62.21,63.41,63.29,63.95,67.18,
+65.97,66.09,66.76,67.51,65.71,68.59,69.37,72.43,68.81,70.39,
+70.21,73.15,70.42,68.28,72.81,72.40,75.23,74.13,73.03,76.67,
+75.93,76.19,76.63,77.43,79.60,77.23,79.94,80.52,80.20,80.08,
+80.49,81.17,81.61,82.72,82.30,85.58,85.44,86.22,86.73,87.83,
+85.86,84.36,88.09,85.85,89.56,88.26,92.28,88.23,90.80,90.48,
+89.50,89.34,93.31,93.42,95.48,94.54,94.30,95.12,93.24,94.00,
+96.26,97.65,98.93,99.36,98.94,102.36,99.27,99.39,99.71,98.43,
+99.60,102.61,102.60,102.64,102.42,101.70,105.60,104.20,104.67,105.97,
+105.13,106.89,107.97,105.79,109.20,111.46,107.38,108.62,111.27,108.09,
+112.02,111.61,113.79,112.73,111.39,112.83,112.73,114.06,113.84,117.49,
+118.91,118.38,117.44,118.89,119.31,119.94,120.78,117.53,120.71,122.97,
+122.33,122.41,124.46,123.73,123.50,123.86,122.51,126.72,128.91,124.59,
+129.36,125.11,128.93,127.91,128.32,132.29,129.02,130.78,133.14,130.53,
+132.56,132.84,129.51,131.33,131.73,132.69,134.42,137.50,137.20,136.17,
+137.98,137.44,139.21,138.33,140.17,139.60,139.73,140.19,141.43,142.74,
+140.52,138.61,141.73,146.03,141.56,142.61,144.57,144.69,146.15,145.07,
+147.47,146.70,150.38,150.77,150.37,146.19,152.78,151.34,152.96,150.18,
+4.66,4.31,4.57,6.05,6.25,7.18,7.23,7.54,7.58,8.78,
+8.86,8.62,10.03,9.58,9.94,10.01,10.72,11.12,12.85,13.36,
+12.52,12.02,13.94,13.97,14.24,14.51,15.40,15.75,16.13,17.63,
+16.98,18.51,17.95,18.20,18.90,20.01,18.74,20.31,19.88,20.90,
+21.91,21.83,22.10,22.22,21.51,22.65,24.18,23.31,24.49,24.31,
+24.86,27.03,25.20,26.53,28.22,27.49,29.10,29.97,29.62,28.54,
+29.42,30.57,30.42,30.49,31.82,31.10,31.86,31.97,31.59,32.49,
+32.53,34.14,34.85,33.69,35.05,36.76,37.10,35.80,37.15,38.12,
+38.42,37.95,37.48,38.38,39.95,40.78,39.52,40.89,40.80,40.51,
+42.92,43.14,41.90,44.09,45.33,44.99,44.52,44.84,44.90,44.50,
+49.53,46.03,47.42,47.43,48.92,46.37,48.41,49.61,46.94,50.02,
+51.83,50.22,52.70,50.96,54.04,54.61,54.70,54.22,53.82,55.37,
+55.55,55.74,55.46,57.60,56.81,58.08,58.90,56.40,60.37,59.51,
+58.79,60.66,59.45,58.45,61.79,60.98,61.26,61.62,62.38,64.62,
+62.14,64.24,65.86,64.14,64.97,66.74,65.10,65.00,65.47,66.06,
+67.09,67.67,66.32,71.37,70.49,70.55,69.93,71.83,70.04,72.54,
+71.32,73.94,71.52,73.61,71.00,72.88,73.30,75.83,76.05,77.05,
+77.52,77.89,78.69,76.99,80.69,78.31,78.43,75.95,80.67,80.12,
+81.50,81.14,82.57,81.97,81.83,85.03,81.72,84.82,83.76,83.51,
+85.45,83.03,86.07,83.89,89.53,87.62,87.86,88.83,86.97,86.75,
+86.39,89.18,90.00,91.29,88.28,91.36,89.58,91.81,91.24,91.81,
+91.78,90.31,93.44,89.65,94.83,96.61,94.93,96.31,93.43,97.26,
+94.01,98.69,94.80,99.97,98.24,99.83,100.81,103.99,102.12,101.72,
+99.16,102.12,102.82,102.71,100.12,102.25,100.03,104.24,103.00,104.17,
+107.76,107.30,106.68,107.57,107.75,107.25,108.08,108.34,106.90,108.74,
+109.36,112.79,113.71,112.42,112.37,113.49,112.86,112.47,112.61,114.45,
+111.03,115.64,113.92,115.07,111.45,117.98,113.41,120.56,118.02,115.73,
+119.12,117.77,119.74,117.14,120.77,120.97,117.33,119.94,121.19,123.62,
+122.31,121.36,120.31,122.78,122.75,124.07,124.47,124.42,128.72,122.42,
+3.52,3.85,5.22,4.52,4.84,5.86,6.14,5.74,6.70,6.99,
+7.00,6.71,7.62,8.37,8.59,8.95,10.18,9.11,9.35,9.77,
+11.22,11.20,10.80,12.89,12.60,12.43,14.71,13.18,14.43,13.56,
+13.82,15.04,14.26,16.46,16.01,16.51,15.59,17.39,17.16,18.10,
+16.32,17.19,19.29,17.68,18.01,18.65,19.47,18.85,20.75,20.96,
+20.20,23.29,20.64,21.95,21.44,22.73,22.02,23.69,24.30,23.96,
+23.81,24.79,25.74,25.47,27.21,27.78,26.63,25.77,28.73,28.05,
+28.92,28.15,28.58,30.54,29.99,31.47,30.19,30.69,30.73,30.34,
+31.37,32.47,31.58,32.23,31.77,34.30,33.58,33.32,35.63,35.95,
+35.32,34.78,35.89,36.56,36.12,38.20,37.22,39.94,38.01,38.81,
+38.71,38.38,39.11,40.80,40.83,41.59,42.68,42.14,40.38,41.49,
+42.69,41.55,41.23,45.24,42.48,46.15,42.91,45.86,45.41,45.44,
+45.02,46.04,47.06,47.63,46.08,47.33,47.94,47.36,47.68,50.15,
+49.01,50.81,50.06,49.99,50.92,50.36,50.97,52.10,53.19,51.44,
+51.85,53.01,52.81,52.98,54.17,53.71,55.35,55.01,56.34,57.60,
+54.42,55.68,55.87,56.63,55.87,57.92,58.35,57.28,56.87,59.40,
+58.81,59.88,60.89,61.36,63.88,58.86,61.96,61.84,63.35,61.48,
+63.77,66.01,65.60,64.33,66.46,66.49,64.62,64.53,64.56,67.38,
+67.35,66.62,66.75,68.46,68.66,66.83,68.35,69.26,69.94,68.53,
+70.33,68.76,70.30,73.38,69.40,72.12,70.57,68.94,75.13,73.43,
+71.70,75.10,73.20,72.55,74.17,76.21,77.63,77.51,75.69,75.95,
+76.57,78.04,77.52,77.33,81.04,79.97,78.32,82.11,81.31,81.70,
+79.35,76.95,79.18,83.98,83.86,83.66,81.57,84.78,85.79,84.43,
+83.94,86.22,85.34,86.31,85.06,83.69,85.22,86.61,86.09,86.70,
+86.08,85.05,87.15,89.12,92.91,88.27,88.13,89.92,89.88,89.87,
+91.27,91.89,92.21,91.52,92.21,93.36,93.13,95.86,93.91,97.49,
+94.78,92.61,96.75,99.03,96.28,93.34,96.26,96.66,95.41,97.86,
+97.08,95.46,99.50,98.54,100.13,98.94,102.49,101.80,102.95,102.93,
+103.50,103.32,101.96,105.63,101.41,103.69,104.23,102.27,102.59,106.87,
+2.69,3.77,3.84,4.17,4.31,4.47,5.27,5.34,4.51,6.32,
+5.92,6.04,6.41,6.56,6.42,7.17,7.38,6.76,8.64,8.62,
+9.04,8.47,8.57,9.60,10.04,10.97,10.48,10.70,11.25,11.26,
+11.49,11.65,12.43,13.06,11.77,13.86,13.62,13.01,14.29,13.94,
+13.51,14.54,15.66,16.75,16.91,15.66,18.30,17.45,17.18,17.28,
+18.32,18.67,19.04,18.49,16.91,18.98,20.01,19.90,20.39,20.34,
+20.77,21.12,20.84,22.02,21.49,21.20,21.36,23.32,23.40,22.72,
+22.07,24.75,23.01,23.26,25.57,25.14,25.15,25.35,24.80,26.79,
+25.19,27.61,27.14,26.78,26.82,28.10,27.35,29.05,29.71,28.95,
+28.42,27.56,29.88,29.26,31.90,30.87,31.23,31.23,31.39,32.80,
+31.86,33.15,32.07,31.76,31.69,34.88,33.76,33.71,34.33,35.90,
+35.15,34.99,36.10,36.57,35.72,37.26,37.70,37.85,36.57,37.17,
+36.19,36.52,38.80,37.35,37.73,40.20,41.91,40.09,39.13,41.55,
+41.74,41.56,41.00,41.16,42.17,43.32,42.11,41.77,44.11,43.13,
+43.10,44.87,44.78,45.87,44.07,42.73,45.29,44.05,45.60,46.41,
+46.42,48.14,48.60,47.88,47.79,47.71,46.77,49.56,47.72,49.51,
+49.61,49.91,48.62,50.35,49.73,50.05,50.78,51.16,51.43,51.76,
+53.22,50.94,51.70,49.63,54.73,51.77,53.59,53.55,54.12,54.37,
+55.45,55.75,54.84,55.73,56.41,56.98,56.12,58.34,57.26,58.30,
+56.95,59.02,59.09,58.93,59.78,60.23,62.13,58.32,61.26,61.86,
+60.27,58.39,63.44,61.99,60.44,63.95,65.39,62.25,62.58,63.09,
+64.03,64.92,63.73,65.77,64.25,64.88,66.11,67.31,66.85,66.55,
+68.80,68.95,68.33,66.98,68.92,65.66,68.25,68.44,67.61,68.59,
+68.58,71.56,69.36,70.36,69.97,70.43,70.87,70.44,72.24,70.67,
+71.30,70.77,73.22,72.96,72.66,73.93,74.54,79.00,76.57,74.15,
+75.16,77.18,77.28,78.36,74.63,75.75,78.95,76.10,79.85,79.21,
+76.84,78.28,78.22,79.88,79.38,78.87,80.91,81.21,81.57,81.50,
+83.45,81.53,80.98,80.45,82.34,82.84,82.17,82.41,82.69,82.50,
+84.48,87.62,84.86,84.21,86.02,84.45,88.00,86.79,89.31,87.57,
+38.45,41.88,44.18,48.61,51.53,57.41,60.13,63.00,67.05,71.19,
+73.64,77.37,80.73,85.23,87.78,91.74,95.57,100.84,102.46,107.24,
+109.59,114.65,118.59,122.41,124.54,128.53,132.34,135.36,140.67,142.57,
+147.21,151.04,153.20,157.42,159.67,165.73,167.71,170.68,175.08,178.05,
+183.66,186.80,190.73,193.79,198.68,199.88,204.28,207.32,208.94,215.86,
+218.01,221.82,225.88,229.46,231.88,238.35,240.69,244.45,247.08,251.29,
+255.76,258.24,264.98,267.94,268.24,273.10,280.22,280.32,285.18,288.73,
+290.23,295.84,296.34,302.56,303.21,310.93,314.95,315.61,320.63,325.69,
+326.78,331.75,336.30,337.39,343.34,345.82,349.97,352.98,355.13,355.96,
+363.97,365.03,371.48,374.88,376.37,382.25,384.59,385.84,395.24,394.44,
+399.75,404.93,406.12,412.08,416.95,418.87,419.96,427.75,431.76,433.76,
+437.71,440.51,444.21,449.27,451.79,454.59,458.32,461.33,465.93,468.56,
+474.35,474.29,475.74,482.50,489.59,490.74,490.58,499.37,499.49,507.60,
+506.01,512.69,516.99,521.99,527.90,528.46,528.42,533.44,537.10,538.36,
+548.13,550.70,553.22,556.02,557.14,563.50,564.25,567.24,576.38,575.82,
+580.73,583.08,589.04,593.85,595.29,600.07,602.35,607.54,611.40,614.68,
+619.10,616.93,621.31,624.07,633.02,636.81,635.87,644.76,648.79,646.18,
+652.20,656.60,662.98,665.82,672.18,673.98,668.90,673.41,683.33,689.09,
+686.42,693.32,699.44,703.55,703.49,708.61,710.53,717.12,717.92,723.99,
+725.86,727.02,732.51,740.49,742.33,744.10,745.71,754.23,751.97,762.74,
+760.78,764.68,772.79,773.19,772.07,781.78,781.42,787.62,791.94,794.05,
+795.23,798.95,806.44,816.33,812.92,820.75,820.15,820.88,832.04,830.95,
+839.45,837.79,842.42,844.13,849.89,854.60,858.15,859.60,861.64,871.08,
+869.95,872.83,882.87,879.20,887.24,888.42,890.27,893.05,900.42,899.51,
+908.12,914.07,919.57,920.10,919.45,927.03,932.21,934.43,936.56,940.74,
+948.39,946.75,947.35,953.15,960.01,957.82,968.14,967.22,974.79,976.71,
+976.02,982.85,982.40,989.48,992.73,991.81,1006.43,1004.21,1007.32,1015.38,
+1016.40,1017.90,1021.77,1025.17,1025.72,1028.59,1039.72,1040.04,1044.57,1046.15,
+1051.03,1060.05,1060.19,1065.06,1063.70,1071.51,1073.65,1074.26,1079.66,1082.72,
+32.36,36.08,38.59,41.81,45.90,48.50,51.98,54.45,58.70,59.65,
+64.51,66.81,70.44,72.44,77.49,80.81,82.21,87.56,89.03,91.97,
+95.33,99.26,100.33,105.98,107.05,111.43,114.99,116.02,122.63,124.14,
+129.53,129.03,132.72,136.07,137.79,140.50,147.42,148.06,152.24,153.91,
+158.74,161.09,164.99,165.58,171.79,173.01,178.00,178.08,182.14,184.83,
+189.80,193.06,197.32,198.93,203.65,203.21,207.84,213.44,213.71,220.64,
+222.06,225.60,228.64,229.77,234.41,235.65,240.14,242.71,244.09,250.42,
+250.53,256.21,259.29,262.51,264.46,269.48,271.81,273.99,276.69,282.36,
+283.05,286.95,290.96,290.34,297.98,300.32,305.70,306.08,305.38,312.87,
+314.65,318.71,322.06,324.59,329.10,331.64,336.56,335.73,340.40,341.90,
+348.70,347.73,350.68,353.46,359.91,362.85,364.58,368.75,371.70,375.81,
+378.76,380.63,384.45,390.00,388.61,392.64,400.37,402.04,399.86,406.48,
+408.11,415.63,417.23,417.89,419.79,426.83,429.98,431.00,435.48,435.99,
+438.17,445.04,448.60,452.42,451.43,457.45,459.40,466.26,465.84,471.41,
+470.43,477.42,474.81,480.29,489.47,490.60,491.74,494.83,495.09,502.45,
+504.65,503.69,509.39,513.23,517.54,520.15,521.31,527.78,529.62,533.51,
+535.07,541.52,543.46,544.54,547.67,551.29,553.16,554.71,561.64,566.87,
+564.21,571.81,573.82,572.74,579.47,580.93,582.20,587.25,593.79,596.20,
+599.01,601.62,607.17,606.82,607.01,616.53,620.74,619.81,626.44,623.89,
+625.10,632.52,635.45,637.62,646.77,647.43,648.36,654.38,655.21,659.71,
+664.79,664.73,668.66,668.57,669.97,675.28,685.80,683.06,685.44,691.37,
+689.96,690.89,696.36,697.30,703.72,708.22,711.05,709.57,717.35,720.37,
+724.07,723.27,729.46,736.12,738.61,736.63,739.14,744.74,751.60,752.50,
+750.00,758.67,760.60,759.52,764.06,766.40,775.82,774.77,785.83,790.00,
+789.90,787.12,790.62,793.84,799.47,798.32,799.10,804.10,807.10,813.57,
+813.00,820.17,824.93,828.96,830.65,833.96,839.86,838.00,845.08,846.73,
+850.37,850.38,857.11,855.51,864.07,866.03,869.68,867.37,877.06,878.37,
+877.82,880.61,885.46,891.98,890.76,900.18,902.29,898.08,904.00,908.00,
+914.48,914.23,916.79,922.80,917.98,926.58,935.28,936.99,941.80,941.00,
+27.85,30.96,34.46,36.40,38.96,42.18,45.01,47.04,49.85,53.19,
+54.81,57.72,59.82,64.03,67.51,67.60,71.39,73.74,75.82,78.92,
+81.85,86.04,87.72,89.30,95.14,94.26,100.31,101.94,105.77,106.56,
+109.72,111.79,115.06,117.60,118.48,122.04,125.94,127.05,131.88,135.04,
+134.72,137.51,141.25,142.92,147.64,148.68,152.74,156.81,160.12,160.59,
+166.19,165.26,168.76,173.56,177.25,177.12,181.94,181.65,183.21,189.59,
+193.72,194.92,193.21,199.23,200.87,207.63,209.29,208.60,211.91,214.88,
+216.88,222.63,223.45,227.22,226.75,232.47,231.38,234.86,238.05,243.19,
+246.78,246.53,254.20,250.10,255.57,259.31,261.74,260.14,267.08,267.15,
+275.58,273.51,279.15,282.09,282.99,282.95,288.63,288.31,293.58,296.41,
+298.80,298.96,301.92,307.63,311.78,313.01,315.14,319.38,322.65,323.82,
+322.25,329.19,331.92,337.54,337.96,337.77,342.52,345.65,351.10,348.13,
+349.08,357.73,358.83,364.17,365.41,369.72,366.20,371.96,372.52,378.43,
+379.72,381.25,382.65,389.44,390.21,396.30,393.15,394.01,404.86,409.11,
+410.92,404.73,408.73,415.16,418.64,418.63,425.06,428.18,429.17,433.14,
+440.14,440.19,440.49,444.74,447.16,448.92,446.35,454.97,456.06,459.88,
+463.84,463.91,469.42,467.63,475.15,471.22,477.88,479.15,480.88,484.36,
+490.75,493.61,496.50,497.56,502.14,499.33,506.50,508.20,512.67,515.37,
+517.13,516.83,522.18,525.92,522.68,529.15,532.63,539.40,538.01,540.21,
+543.68,550.95,553.09,552.39,551.62,556.30,558.38,559.83,562.60,571.31,
+571.10,572.59,577.50,579.83,577.45,582.73,586.64,588.76,595.08,595.42,
+596.51,598.08,601.24,603.06,606.42,609.90,617.15,608.15,621.92,624.26,
+622.71,625.69,632.75,628.40,637.39,638.60,635.34,641.69,643.00,646.97,
+654.40,657.38,652.01,651.90,666.81,661.73,668.54,668.40,678.41,680.11,
+679.97,677.54,686.49,686.36,688.78,692.05,691.48,701.86,700.38,697.88,
+704.40,706.87,709.31,717.75,720.02,717.62,722.80,723.34,724.83,727.62,
+736.39,732.03,740.69,744.26,745.76,746.98,752.37,756.11,753.81,758.26,
+761.24,761.84,765.79,768.58,771.72,774.61,777.81,781.37,780.61,782.56,
+790.30,790.54,792.37,801.52,799.60,806.06,803.47,810.18,805.75,814.45,
+24.66,26.64,29.84,32.45,33.97,36.90,38.62,41.05,43.31,44.59,
+47.21,51.07,53.18,56.20,58.05,58.44,60.06,62.07,65.71,68.49,
+70.72,73.83,76.55,77.15,82.50,82.22,85.87,87.05,89.59,92.01,
+94.47,96.64,99.20,101.52,103.48,107.18,108.76,110.16,112.08,114.37,
+117.54,118.50,120.87,122.84,125.76,129.19,132.62,131.04,136.02,138.13,
+141.40,143.55,146.89,150.61,150.05,153.97,152.82,158.06,159.13,160.98,
+164.88,166.45,167.82,173.80,173.84,178.07,178.09,179.00,182.86,185.78,
+188.47,191.29,191.81,197.26,196.13,200.13,200.58,201.65,204.15,207.24,
+212.29,213.31,216.49,218.36,218.49,221.26,225.70,225.52,229.40,229.60,
+231.72,238.66,240.32,239.66,242.75,246.65,248.14,250.86,251.64,254.19,
+257.54,261.31,265.62,263.26,265.00,268.56,269.96,273.00,271.12,280.45,
+281.50,284.69,285.24,286.57,286.43,290.89,296.19,293.50,299.05,298.74,
+301.29,307.14,311.29,312.95,311.91,316.59,320.07,319.40,320.30,325.98,
+323.02,328.50,332.11,336.06,338.14,337.48,339.59,342.35,350.16,346.10,
+350.00,352.33,353.77,357.98,354.84,361.74,365.03,364.47,372.89,372.54,
+375.88,370.69,379.96,383.56,382.22,384.25,386.79,389.36,391.85,391.89,
+400.87,402.34,400.86,405.64,407.54,411.47,410.55,414.31,418.69,419.66,
+418.26,424.62,429.78,427.38,426.04,431.35,436.70,438.13,439.51,443.76,
+443.17,446.73,449.17,453.37,451.55,454.35,459.19,461.10,461.14,464.53,
+463.95,470.80,474.64,472.35,473.26,476.61,483.30,479.47,485.24,489.36,
+491.42,492.70,494.87,496.99,497.89,502.01,505.21,506.82,508.90,510.58,
+513.61,514.13,519.82,517.87,527.45,526.47,529.23,530.88,526.33,531.34,
+537.68,545.50,546.71,543.37,550.66,547.78,555.94,556.40,556.24,564.07,
+558.55,562.27,568.61,569.16,567.24,569.20,577.81,573.75,577.03,576.34,
+586.40,588.21,589.32,585.95,592.25,591.77,597.55,607.31,602.76,601.00,
+606.43,609.65,608.70,612.19,620.40,614.39,617.03,624.06,623.05,627.83,
+631.31,633.06,637.55,638.94,635.54,641.65,640.72,639.80,644.99,650.94,
+650.11,651.08,660.57,663.12,660.78,663.47,668.21,673.73,670.64,676.57,
+671.23,683.68,687.30,683.56,685.30,686.81,692.97,692.80,690.31,701.36,
+19.43,24.24,25.36,26.49,27.99,31.13,32.53,33.71,36.08,38.69,
+39.66,43.07,44.55,47.65,48.47,50.34,52.17,55.34,55.88,57.42,
+60.29,62.08,64.15,67.70,68.85,69.21,72.65,73.72,75.36,79.50,
+80.93,81.89,83.94,87.17,88.95,91.33,95.46,93.38,99.06,98.07,
+101.28,102.92,103.66,107.41,109.20,108.20,111.66,116.40,117.00,118.04,
+122.34,123.47,123.84,127.88,128.76,131.72,132.91,133.01,135.89,138.75,
+138.19,143.14,144.01,146.86,149.28,152.07,153.68,157.56,158.58,159.75,
+160.25,165.75,163.48,167.10,170.48,173.23,171.19,175.17,175.72,178.59,
+179.75,184.66,185.56,184.70,190.19,190.38,192.29,196.85,194.47,198.38,
+200.94,202.54,203.47,207.25,208.80,217.85,213.19,216.59,216.12,219.19,
+223.57,222.06,224.41,224.78,229.44,232.42,231.84,235.35,239.20,236.95,
+238.13,245.18,247.37,248.29,246.66,245.81,254.96,256.17,256.54,258.78,
+262.79,263.95,265.58,268.75,268.78,272.84,275.11,271.66,274.21,279.44,
+280.80,281.49,285.95,281.38,287.17,290.22,290.62,290.10,296.12,298.09,
+301.57,299.65,301.43,303.08,307.23,313.09,312.36,315.85,313.91,319.10,
+317.62,322.82,322.16,324.84,327.56,327.77,332.82,334.48,333.37,340.36,
+339.51,340.70,350.84,345.25,347.30,347.82,355.32,352.50,356.63,359.81,
+359.78,366.43,367.38,368.13,369.60,369.56,370.25,374.19,372.75,381.76,
+381.82,380.01,380.60,389.31,388.39,387.57,389.52,392.26,398.44,397.75,
+399.83,403.03,398.16,406.46,410.95,411.93,414.67,411.25,417.27,418.32,
+417.41,423.08,423.26,424.77,424.85,431.19,435.02,429.69,436.59,436.82,
+440.06,444.18,443.73,447.07,442.89,450.79,453.36,452.98,457.83,453.78,
+460.52,460.02,466.29,469.83,465.16,469.94,472.05,472.09,477.02,478.25,
+474.32,477.92,486.95,486.11,488.55,492.05,489.63,493.03,495.90,498.45,
+498.71,504.55,507.27,509.58,512.20,511.47,513.54,513.29,511.62,517.27,
+520.88,526.35,527.79,528.48,528.52,531.85,529.89,536.66,534.10,539.96,
+539.70,543.97,544.91,547.73,553.65,549.38,554.75,556.36,556.60,558.60,
+558.11,564.37,563.13,569.39,567.75,570.40,566.17,574.85,572.39,581.23,
+582.27,583.58,582.80,588.46,588.43,593.92,593.27,593.58,597.77,597.33,
+17.41,19.77,20.73,22.13,25.05,26.55,27.91,30.06,30.24,32.73,
+33.70,38.18,38.73,40.24,41.27,44.26,45.54,46.38,48.04,51.00,
+51.51,53.71,55.42,57.04,58.88,61.61,62.58,62.84,65.02,65.89,
+68.87,70.67,72.83,75.64,75.97,76.89,79.13,83.74,82.44,83.43,
+85.08,87.26,88.65,91.88,92.87,93.07,96.39,97.05,99.39,100.64,
+101.71,105.80,105.96,111.02,110.43,111.17,114.69,114.58,116.66,120.95,
+116.43,120.11,123.41,124.98,125.78,129.09,129.19,132.42,133.60,138.09,
+135.10,139.72,140.95,143.52,144.69,142.65,145.13,148.65,151.00,151.41,
+154.21,154.66,160.31,162.52,158.35,164.91,161.59,166.61,167.89,170.82,
+171.01,172.67,176.15,176.64,178.91,178.73,180.36,183.91,183.71,184.32,
+186.90,189.92,192.94,192.36,196.59,193.68,199.14,200.50,199.49,200.81,
+203.62,205.43,207.90,212.99,210.51,213.59,215.28,216.27,217.76,224.04,
+221.52,225.12,222.74,229.37,229.41,229.05,232.38,234.57,234.49,238.99,
+240.48,242.07,241.18,245.26,247.71,247.95,247.03,254.46,254.14,258.72,
+256.31,259.99,263.68,261.68,263.20,265.11,264.82,269.71,270.39,275.25,
+271.33,277.13,277.18,278.16,282.00,282.97,283.19,286.82,288.26,289.82,
+291.44,291.89,289.77,293.50,296.12,299.25,303.44,305.30,303.65,303.30,
+304.98,307.65,311.74,312.52,311.31,315.42,317.47,318.78,323.20,321.86,
+324.01,329.83,330.04,327.28,333.66,333.11,336.22,335.86,339.37,343.68,
+340.94,345.05,346.87,347.95,348.52,345.20,351.50,352.70,358.94,363.62,
+361.50,359.86,363.23,364.12,366.33,365.26,372.36,370.06,373.31,372.63,
+378.80,375.30,376.56,383.05,383.01,382.23,385.63,388.46,388.78,385.83,
+390.69,393.38,399.13,397.92,398.25,400.95,407.23,403.04,407.66,407.66,
+407.29,416.76,411.57,413.53,411.53,419.42,421.21,417.40,424.23,425.27,
+433.73,424.57,430.77,430.38,437.58,433.25,439.07,437.10,442.63,444.06,
+444.89,444.53,446.47,448.28,450.94,452.81,454.62,453.96,459.31,459.14,
+456.84,459.36,465.52,466.00,462.94,472.49,467.76,476.70,473.33,478.39,
+479.93,479.02,481.31,482.69,486.85,482.79,488.79,486.01,493.51,490.56,
+493.52,491.52,497.26,502.21,502.00,509.06,505.84,506.46,510.11,511.62,
+15.29,17.28,17.61,19.91,20.06,22.51,24.07,25.51,25.90,27.90,
+31.03,31.47,31.38,35.46,36.03,35.57,39.64,39.69,40.25,42.18,
+43.30,45.09,47.53,49.13,50.68,52.43,53.67,54.49,56.86,58.08,
+58.38,62.04,62.04,62.70,64.84,65.01,69.18,69.47,71.52,72.52,
+72.72,75.45,75.99,77.08,77.94,81.08,81.32,83.35,85.58,86.19,
+87.02,90.31,90.30,91.64,92.83,96.87,96.99,99.39,100.53,101.44,
+102.48,105.49,104.05,108.39,106.26,109.16,111.92,112.07,112.03,114.07,
+117.19,117.77,118.66,121.49,121.41,122.67,128.06,126.34,128.51,129.53,
+131.03,133.59,135.35,137.04,137.49,136.75,137.68,143.01,140.26,144.21,
+141.70,146.09,146.78,148.98,150.12,152.64,155.49,157.14,157.99,158.47,
+161.92,162.98,160.57,162.30,165.29,166.87,168.81,171.23,172.38,174.83,
+176.60,175.66,179.41,182.41,180.64,181.15,183.43,184.64,187.47,188.88,
+186.49,188.92,193.86,196.34,197.44,194.57,196.40,198.74,202.12,201.59,
+205.95,208.41,205.86,206.60,206.40,210.12,213.59,215.02,218.54,215.07,
+218.11,224.05,222.34,222.13,223.50,226.74,229.61,227.68,229.35,232.13,
+234.28,233.54,236.04,238.09,237.01,241.99,245.24,240.07,243.61,246.81,
+250.53,247.41,248.60,254.07,255.31,258.74,260.44,261.19,256.04,262.30,
+263.40,261.49,265.75,269.52,268.64,265.70,269.29,270.62,273.06,272.09,
+275.19,281.85,276.38,284.44,284.18,283.65,287.42,285.06,288.96,289.87,
+292.28,291.16,289.90,295.49,299.38,301.86,303.30,301.16,303.09,304.91,
+302.74,302.44,307.40,308.49,307.98,312.76,314.49,314.50,319.72,315.60,
+322.53,318.74,322.23,321.40,329.42,325.38,330.37,331.34,336.11,333.32,
+335.14,338.21,333.94,336.54,338.51,340.92,339.35,350.84,347.52,346.77,
+346.24,352.41,353.57,349.58,357.50,360.52,363.72,355.85,359.55,365.49,
+367.16,366.75,368.65,367.88,367.93,367.17,371.12,373.58,374.71,376.50,
+378.62,383.45,378.34,378.18,384.59,381.12,390.55,387.63,389.63,392.36,
+394.44,397.88,400.11,395.24,397.61,404.06,401.65,403.11,406.62,408.30,
+403.44,403.50,407.81,413.51,412.04,413.19,417.87,415.04,418.27,421.54,
+422.78,425.47,426.64,424.14,427.91,430.76,432.16,434.32,436.69,435.26,
+12.91,13.75,15.07,16.09,17.36,19.04,20.25,21.12,23.51,24.48,
+25.78,27.07,28.39,29.73,30.88,31.10,33.13,33.40,34.30,35.36,
+38.22,39.64,40.30,40.48,42.71,43.62,45.52,46.05,48.31,48.63,
+49.06,50.91,51.95,50.52,56.18,56.66,57.09,59.21,61.20,60.22,
+62.91,63.97,63.97,67.19,68.52,68.90,70.19,71.87,70.68,73.30,
+74.86,74.50,75.88,79.21,79.65,80.91,82.76,83.83,85.25,86.56,
+86.60,88.10,89.31,91.98,91.55,93.20,94.78,93.72,97.29,100.23,
+100.14,99.42,103.36,102.99,102.77,106.11,107.30,106.51,105.31,111.01,
+109.99,114.05,115.65,115.03,116.27,115.09,121.73,121.73,120.57,122.61,
+124.67,123.21,127.89,128.06,128.61,129.87,134.42,133.61,135.21,134.44,
+135.16,135.52,142.09,139.90,141.49,143.02,145.58,144.06,148.20,148.30,
+149.12,149.55,151.70,151.10,152.86,154.79,158.04,155.77,161.96,161.68,
+160.20,162.11,162.04,163.87,167.70,166.19,169.28,170.41,174.35,170.01,
+174.27,174.79,179.44,182.46,178.20,183.80,182.00,182.70,185.68,186.06,
+184.04,188.73,192.56,190.62,189.17,191.94,192.77,192.40,193.42,196.06,
+196.86,200.06,198.95,199.44,200.27,205.24,205.98,204.27,207.42,209.93,
+211.41,214.74,211.54,213.52,216.13,216.93,216.94,218.88,222.07,221.00,
+223.71,224.42,225.74,230.46,227.53,231.15,234.14,231.12,234.34,234.46,
+237.28,239.91,238.83,235.06,236.92,239.55,240.51,247.57,247.68,247.38,
+250.31,247.59,249.52,251.17,252.42,250.98,257.56,257.66,259.84,258.34,
+263.50,261.54,261.39,263.13,263.42,268.87,267.80,269.02,267.60,269.80,
+276.15,274.39,279.31,276.15,276.47,276.60,278.55,280.72,280.86,279.60,
+280.35,286.64,286.61,285.62,290.93,292.20,289.65,291.57,296.55,293.94,
+298.07,296.37,298.01,303.27,304.46,302.30,304.68,308.56,306.67,307.55,
+311.69,310.31,310.93,309.21,315.93,313.24,315.75,317.71,316.45,314.78,
+324.08,321.10,321.99,325.84,329.51,323.99,328.99,330.54,329.32,334.68,
+334.92,338.84,336.70,334.37,340.17,340.82,341.28,337.14,350.00,341.71,
+346.60,352.41,346.10,348.61,349.62,352.21,351.52,353.29,355.16,357.60,
+357.39,360.72,359.80,359.89,364.61,366.92,365.79,363.27,371.21,368.65,
+11.07,11.64,13.84,13.37,14.69,16.31,16.77,18.38,19.09,19.92,
+21.19,22.48,23.64,25.78,26.35,25.35,27.55,28.45,29.69,31.61,
+33.57,32.57,34.62,34.88,35.21,37.81,39.53,39.10,40.44,40.62,
+42.34,43.99,45.56,45.14,44.72,48.60,49.29,48.58,49.97,50.01,
+52.27,53.63,54.10,57.75,56.81,58.22,59.50,60.94,61.07,60.17,
+61.21,63.21,65.71,65.88,65.27,67.52,70.24,70.27,71.91,73.07,
+74.50,74.88,79.28,77.53,77.42,77.61,79.34,82.56,79.59,84.75,
+88.09,86.45,86.78,86.98,88.53,89.14,90.99,91.70,91.41,92.58,
+94.25,94.46,95.79,97.17,97.00,101.28,100.03,103.82,104.23,104.07,
+105.24,107.03,106.08,108.26,108.70,109.41,111.65,112.54,112.74,115.58,
+114.75,116.86,116.72,117.53,118.30,119.20,122.91,120.32,123.36,123.12,
+127.28,125.21,130.54,131.83,130.80,131.59,132.28,133.64,137.00,135.67,
+134.08,139.65,135.82,139.31,138.93,142.58,142.04,144.10,144.50,148.48,
+147.25,149.09,149.07,153.25,150.58,151.56,156.19,155.75,157.30,156.10,
+158.91,158.49,158.68,162.16,161.92,165.56,163.00,165.06,165.95,167.21,
+165.09,169.82,170.26,167.24,170.25,176.12,173.96,174.19,179.60,176.71,
+180.49,180.91,179.21,181.28,181.42,184.38,184.79,184.80,188.04,188.16,
+187.18,189.80,190.68,191.37,192.33,196.24,193.77,192.70,195.27,198.66,
+197.27,200.87,203.30,206.38,203.54,205.00,207.68,209.26,209.73,210.64,
+213.63,212.15,209.05,211.45,215.61,215.76,217.10,217.69,217.71,219.24,
+221.60,222.46,220.24,225.50,227.79,225.27,227.38,227.31,228.11,231.83,
+230.25,230.41,232.13,233.13,234.91,237.00,234.94,237.68,238.54,242.81,
+241.10,239.79,245.14,245.32,247.31,248.30,248.81,250.01,248.12,250.48,
+256.31,255.35,251.84,257.66,255.59,257.25,258.35,256.71,257.08,257.28,
+262.02,268.75,267.05,262.51,266.33,272.48,270.13,270.34,273.12,270.80,
+271.94,277.77,276.71,276.06,277.44,275.79,276.99,281.25,279.89,279.88,
+284.38,283.93,282.52,285.05,291.35,284.08,291.75,295.89,291.17,297.21,
+292.80,290.98,300.67,298.71,300.86,298.83,297.60,301.25,302.32,304.76,
+304.35,310.27,306.52,303.53,313.78,312.20,311.23,308.82,313.13,314.68,
+10.43,9.93,11.09,11.60,12.56,13.44,14.79,15.97,17.07,17.69,
+17.60,18.71,20.45,21.00,22.14,22.01,24.50,24.70,25.91,27.16,
+27.59,27.63,28.22,28.44,30.85,31.92,30.88,32.55,34.52,34.79,
+36.48,35.89,37.91,37.26,38.91,39.96,41.42,43.58,43.07,44.13,
+43.92,46.55,45.28,47.97,46.80,49.43,49.14,50.99,52.48,52.63,
+53.36,53.84,54.85,54.10,57.01,58.84,59.88,60.12,63.12,60.82,
+63.89,59.70,64.17,64.86,65.52,66.97,68.13,67.60,69.42,68.83,
+72.13,73.26,73.64,72.74,73.84,77.68,75.41,76.71,80.63,78.88,
+78.65,81.24,82.10,81.17,82.34,84.89,86.30,87.10,85.50,87.95,
+89.75,90.63,91.99,92.81,92.60,94.31,93.37,94.69,95.66,94.47,
+98.88,98.80,99.53,101.34,101.62,101.86,103.44,103.05,103.14,107.29,
+106.93,108.45,107.66,107.09,110.21,110.08,112.46,115.05,114.57,117.45,
+117.59,118.55,120.89,117.75,118.21,120.22,118.95,122.89,117.51,123.01,
+125.50,124.97,127.32,128.28,127.57,129.98,129.09,131.12,133.10,135.99,
+133.80,137.19,134.00,137.30,139.98,139.12,139.91,141.43,136.52,139.82,
+144.76,139.16,145.92,147.16,145.83,146.41,149.29,149.83,148.43,149.46,
+149.33,150.67,152.75,154.70,154.15,154.73,155.41,158.79,156.92,157.55,
+163.79,160.82,163.16,162.17,163.50,165.03,165.69,165.05,167.77,165.39,
+170.13,169.29,171.28,171.17,171.75,173.35,171.53,172.24,175.39,175.29,
+179.00,180.49,179.18,174.96,177.33,180.59,184.95,184.68,181.71,184.96,
+184.62,183.31,185.62,186.71,192.65,191.23,188.86,194.80,196.06,195.62,
+194.06,198.97,202.08,199.22,199.89,202.87,198.23,198.65,202.59,203.01,
+205.20,207.15,205.24,207.98,204.50,209.47,209.87,210.21,211.93,212.30,
+214.94,215.96,215.09,216.18,216.00,217.39,215.84,219.52,220.25,218.98,
+223.49,219.04,222.34,224.96,224.28,227.91,229.68,232.95,227.14,226.84,
+227.66,235.22,236.17,233.35,238.38,238.15,234.88,237.61,234.38,241.15,
+242.61,242.11,240.24,240.33,241.94,244.33,247.93,248.54,245.48,250.71,
+248.23,248.10,244.53,248.10,247.10,255.45,255.61,248.99,258.67,258.19,
+257.48,257.12,257.12,260.89,264.55,263.47,261.67,257.96,266.20,266.94,
+7.97,8.95,9.76,10.08,11.40,11.85,12.37,13.53,13.46,14.84,
+16.37,15.87,17.26,17.78,18.74,19.70,20.23,21.86,21.64,22.51,
+22.59,23.69,24.97,24.90,26.03,26.07,28.24,29.52,29.36,29.80,
+30.25,30.81,32.34,32.46,33.86,35.63,34.03,34.60,36.40,36.34,
+38.47,38.30,39.13,39.67,38.12,40.95,43.23,41.84,44.31,43.80,
+45.43,45.67,46.82,47.48,47.63,48.72,50.03,51.14,50.69,50.66,
+52.20,52.24,51.34,55.27,55.09,54.62,56.83,59.85,58.59,57.91,
+60.41,61.93,63.03,63.26,62.53,64.13,65.18,65.17,64.88,66.55,
+67.36,68.88,68.93,67.50,71.25,73.66,71.94,73.49,74.46,71.87,
+75.96,76.80,77.54,73.75,77.32,79.30,78.93,82.88,82.39,83.21,
+82.63,84.13,85.19,85.09,85.65,88.37,86.60,88.40,89.27,88.17,
+90.83,89.73,90.19,94.29,93.86,91.11,97.17,92.58,95.92,97.83,
+97.28,99.10,99.91,100.44,100.48,99.87,105.00,104.62,101.25,105.11,
+105.31,106.73,105.79,105.51,108.20,109.37,107.51,109.38,113.69,113.50,
+112.22,112.55,114.86,113.07,116.75,115.62,117.49,118.19,120.75,122.41,
+120.72,121.59,116.05,122.11,120.97,124.36,121.70,126.78,125.47,129.13,
+125.17,130.13,130.03,130.04,130.79,131.49,129.96,134.18,133.46,133.27,
+135.14,135.90,137.00,134.45,139.53,139.52,137.86,139.67,140.14,145.46,
+145.08,142.35,145.02,142.41,145.49,148.10,148.12,151.82,148.55,147.49,
+149.96,152.93,152.63,154.00,153.29,151.28,153.89,155.02,156.09,156.26,
+158.58,158.99,162.17,157.39,161.80,158.26,161.44,164.21,160.57,163.67,
+165.98,164.12,166.57,167.33,168.12,168.56,169.48,169.17,169.62,171.87,
+172.00,169.13,174.97,174.40,174.72,177.46,177.31,180.56,178.25,175.61,
+179.44,179.11,181.31,184.46,185.68,183.48,180.84,188.92,187.91,186.35,
+187.26,188.01,194.01,190.17,189.54,191.66,193.76,191.87,195.35,196.11,
+194.39,196.36,198.54,198.60,199.90,200.35,198.79,197.62,198.90,202.73,
+200.94,202.07,205.56,206.18,203.27,207.03,207.12,208.60,210.47,209.66,
+211.12,208.97,216.53,215.70,210.23,213.69,213.58,217.80,216.86,217.32,
+215.93,219.28,218.25,218.24,223.38,223.04,219.69,222.24,224.38,221.59,
+6.56,7.12,8.17,8.80,8.23,9.81,10.23,11.72,11.78,12.33,
+13.24,13.32,14.51,15.52,15.72,15.73,15.54,17.60,17.79,17.39,
+19.68,19.14,20.16,21.65,22.43,21.19,23.80,22.86,23.89,23.94,
+25.07,27.92,29.18,27.63,29.45,26.94,29.39,30.86,29.86,31.86,
+31.64,32.39,32.17,34.41,33.77,34.34,36.81,36.16,37.87,38.70,
+39.01,40.84,40.70,40.11,41.46,41.53,42.84,41.27,44.29,43.74,
+44.05,46.95,44.33,45.38,46.69,46.02,49.36,48.05,49.21,49.59,
+49.83,52.35,51.95,53.18,53.62,53.24,54.06,56.58,55.33,55.08,
+56.67,55.36,59.06,59.68,61.40,60.56,60.81,61.71,59.95,62.52,
+62.49,67.89,63.95,64.99,65.93,64.18,66.63,65.91,66.41,70.50,
+71.54,69.34,71.45,69.72,73.20,76.25,74.83,71.63,76.37,76.63,
+76.55,77.39,78.37,78.60,79.97,80.17,80.28,79.86,83.03,82.77,
+82.95,84.03,84.42,85.89,83.10,83.34,83.54,86.82,84.72,87.56,
+86.89,85.65,91.06,88.70,94.62,91.83,91.75,92.70,93.77,93.06,
+93.48,95.73,97.20,95.91,98.60,96.02,100.49,100.32,101.24,101.19,
+101.13,103.90,101.34,107.28,106.83,105.04,107.52,105.00,105.94,104.11,
+110.28,109.85,109.31,110.54,112.05,110.42,109.71,112.36,110.61,114.69,
+114.84,117.34,112.93,112.63,114.81,114.65,118.32,121.61,118.97,118.26,
+122.47,122.66,123.03,122.00,123.58,123.63,125.86,123.59,124.63,124.66,
+125.48,127.81,126.00,131.64,130.26,127.25,131.32,131.95,134.07,135.25,
+134.99,135.59,133.24,133.33,134.14,135.23,137.71,135.17,136.94,140.48,
+137.00,139.80,140.84,140.91,140.82,143.22,144.69,143.15,141.98,142.75,
+147.42,145.79,145.90,149.25,151.55,147.52,148.27,148.63,149.15,151.06,
+152.55,155.20,152.89,152.88,154.96,153.16,157.49,156.49,160.89,159.74,
+156.56,160.28,160.64,159.00,165.29,161.63,161.35,163.74,164.39,166.14,
+165.86,161.00,164.69,165.69,166.75,165.24,165.89,168.44,167.02,172.52,
+170.81,171.27,177.26,171.75,175.22,177.36,176.13,176.75,177.38,178.95,
+175.73,175.06,179.52,177.19,181.19,180.11,181.79,180.96,182.66,181.03,
+184.95,184.65,185.13,187.44,187.16,184.51,184.27,188.83,191.74,191.15,
+5.56,5.87,6.76,7.64,8.18,7.82,8.84,8.22,10.16,10.88,
+10.36,11.64,12.41,12.78,13.44,13.72,14.37,15.07,15.08,15.54,
+15.34,17.51,17.80,16.37,17.52,18.70,19.17,19.45,20.11,20.00,
+21.71,21.92,23.18,22.96,24.26,23.99,25.19,24.04,24.13,26.94,
+26.63,27.99,28.72,28.45,28.73,30.98,29.46,31.33,32.18,31.94,
+32.91,33.13,32.65,32.06,33.92,34.68,37.40,35.19,35.96,35.89,
+36.42,37.66,38.85,38.29,40.15,40.18,38.96,40.21,43.07,41.82,
+43.11,42.89,44.81,44.49,45.99,45.53,48.30,47.13,46.53,46.84,
+48.37,48.71,49.33,49.59,51.29,47.40,48.94,50.65,53.38,54.06,
+52.38,53.72,54.58,56.27,56.30,55.66,57.28,56.74,57.91,59.31,
+58.87,59.23,61.01,60.12,60.79,60.42,62.88,61.59,63.34,62.93,
+63.24,63.52,67.73,65.45,64.83,67.92,66.92,66.94,68.51,68.01,
+69.75,70.21,72.28,67.98,70.86,72.29,73.18,72.87,73.94,76.05,
+77.45,73.89,75.72,76.29,78.78,77.59,77.12,77.45,81.25,77.64,
+80.54,81.66,82.36,79.57,77.83,82.66,82.06,88.14,84.61,85.77,
+88.20,87.63,81.47,84.29,86.68,87.80,86.97,90.90,93.49,91.13,
+88.56,94.04,92.72,93.34,93.07,94.54,94.59,92.86,94.10,95.52,
+97.56,99.42,97.13,96.51,100.60,96.14,97.84,100.80,102.27,102.80,
+102.23,99.86,102.27,99.59,104.86,105.58,104.98,105.72,105.39,103.44,
+102.94,106.98,111.31,110.05,110.51,108.71,111.95,111.21,108.95,112.36,
+110.51,112.32,115.17,113.61,113.88,114.12,112.91,117.18,120.23,117.25,
+118.92,116.16,120.68,117.25,116.81,119.57,117.87,120.62,117.89,122.57,
+123.32,121.84,123.42,124.57,123.78,125.41,124.43,127.92,129.88,128.31,
+130.30,126.53,128.25,128.54,127.81,126.96,133.34,130.28,129.06,134.67,
+130.73,132.37,133.81,132.07,134.28,136.98,136.16,138.24,138.88,135.67,
+141.68,140.48,141.26,138.19,139.85,139.70,143.27,142.79,140.72,141.76,
+144.33,148.00,145.34,147.98,144.97,149.80,144.61,148.16,147.12,144.18,
+152.32,149.47,150.67,148.47,153.15,153.98,151.61,151.45,152.50,154.37,
+155.29,155.14,151.53,156.31,158.73,155.54,157.01,152.27,155.50,156.32,
+4.77,5.04,5.90,6.33,6.38,6.90,6.60,7.77,7.42,9.03,
+9.14,9.81,10.07,10.53,10.87,12.03,12.23,12.41,12.92,12.32,
+14.22,14.32,14.48,16.47,15.91,15.91,16.06,18.00,17.69,18.59,
+18.36,18.42,17.56,18.74,21.67,19.80,20.33,22.01,19.52,21.25,
+22.95,23.87,22.51,24.08,25.07,26.49,25.54,25.19,26.38,25.75,
+26.78,28.66,28.42,27.86,27.09,29.66,29.34,31.27,29.97,29.56,
+31.49,32.46,33.17,32.93,33.48,33.83,32.78,37.30,35.28,35.40,
+35.74,36.18,34.31,35.35,39.48,39.36,36.80,41.01,40.22,40.23,
+40.24,40.60,42.42,42.74,41.96,43.73,44.27,45.20,44.01,44.31,
+43.58,43.86,45.80,47.13,44.85,46.53,47.16,47.42,50.42,49.42,
+50.06,48.24,50.06,51.34,49.76,50.61,50.88,53.67,51.80,53.37,
+53.88,57.10,54.96,54.35,57.25,55.94,56.68,54.92,60.31,58.91,
+59.40,58.19,56.24,60.20,57.73,63.08,60.16,59.30,61.71,61.99,
+63.06,62.66,64.52,65.35,64.19,65.66,65.44,66.31,65.86,66.58,
+69.17,68.82,70.17,70.38,70.50,71.47,70.83,69.79,68.30,71.30,
+71.13,70.12,74.20,71.49,72.49,74.18,75.60,75.14,74.38,73.61,
+76.45,75.42,76.32,77.65,78.19,78.64,81.00,78.93,79.83,80.58,
+81.10,77.97,82.26,84.71,82.15,80.28,80.78,84.50,84.94,85.38,
+85.45,85.21,82.17,89.81,89.00,84.88,87.43,86.62,89.53,88.70,
+89.45,88.07,90.86,91.34,95.70,92.20,93.53,94.20,91.75,93.57,
+95.46,97.47,96.37,94.32,96.55,96.07,97.01,96.81,96.92,97.77,
+98.92,98.16,102.31,101.57,98.67,102.17,106.35,100.79,99.23,101.06,
+108.41,105.31,102.77,102.96,104.10,104.52,104.44,105.82,107.94,106.33,
+106.33,111.18,107.45,109.12,107.28,109.38,110.23,113.31,111.32,114.78,
+114.19,111.81,112.04,116.28,113.10,112.93,110.45,113.58,115.77,114.17,
+115.12,119.82,119.73,117.49,117.09,118.14,123.80,120.10,120.04,120.25,
+119.61,120.87,121.20,120.85,122.86,122.45,125.01,124.61,124.78,126.10,
+125.35,124.72,127.34,128.28,124.19,123.08,126.61,128.09,127.34,129.44,
+130.19,129.15,129.20,132.71,129.88,131.25,132.52,133.62,133.98,133.42,
+4.41,4.31,4.18,5.23,5.36,5.99,6.05,7.16,7.19,6.53,
+7.73,7.91,8.23,8.92,9.36,10.08,10.04,10.98,11.21,10.82,
+11.79,12.31,11.84,12.51,13.66,13.80,13.28,13.60,13.88,15.22,
+15.10,16.71,15.38,15.51,17.44,15.96,17.36,18.54,18.34,18.29,
+19.16,19.12,20.09,20.09,20.82,19.43,21.48,22.16,22.37,24.45,
+20.94,24.68,22.39,22.40,26.66,23.99,25.66,25.59,26.65,25.37,
+27.30,25.69,27.10,26.93,27.83,29.38,28.65,28.82,28.79,30.63,
+28.87,30.57,31.26,30.91,31.69,30.47,31.72,32.98,33.47,33.27,
+33.12,36.73,33.42,34.17,36.28,36.98,34.68,36.85,37.56,36.52,
+37.41,38.81,39.35,38.01,39.68,39.42,39.72,41.80,42.43,43.06,
+41.61,41.32,42.94,43.28,44.53,46.15,44.03,41.73,44.47,43.73,
+44.98,46.24,45.51,47.56,47.80,46.95,47.32,47.84,48.10,46.90,
+47.64,50.68,49.26,50.05,51.90,50.12,48.92,53.15,51.90,53.30,
+53.18,53.04,54.07,53.58,54.09,56.79,55.38,57.91,54.25,56.12,
+55.96,58.13,56.92,56.69,59.86,57.63,61.85,58.73,60.25,60.27,
+60.30,60.75,60.16,58.54,62.20,60.92,60.69,64.57,64.11,61.76,
+62.78,63.52,64.72,64.53,66.54,64.73,65.74,67.64,64.97,67.95,
+67.47,66.39,69.53,69.57,70.27,67.11,72.21,72.70,71.12,71.16,
+69.86,70.17,73.27,73.08,72.42,73.16,71.76,75.53,76.98,74.29,
+74.70,75.30,75.98,75.42,76.95,80.88,77.12,79.04,79.49,80.25,
+76.58,78.67,78.15,78.27,78.22,80.83,83.50,79.83,79.93,83.00,
+79.76,80.28,84.02,81.38,86.25,86.49,85.35,87.66,85.99,88.05,
+84.84,90.01,85.44,85.36,86.24,89.94,90.24,90.33,89.15,89.50,
+88.84,91.24,90.87,88.57,92.64,91.47,91.15,92.50,91.82,93.17,
+91.25,94.91,95.42,95.00,93.59,98.09,94.29,95.91,98.35,99.18,
+98.01,97.82,97.88,98.73,99.19,101.48,100.89,100.30,102.31,102.50,
+101.56,103.05,103.71,104.33,102.03,102.53,103.44,102.46,105.53,106.71,
+104.23,106.30,106.19,108.54,104.81,105.58,110.04,105.62,106.20,110.78,
+106.76,111.38,110.34,109.06,109.70,111.74,114.32,111.07,111.36,112.20,
+41.52,45.29,48.55,54.58,57.01,61.43,65.19,70.65,73.41,76.56,
+81.82,83.65,90.05,93.01,97.36,100.29,105.74,107.38,112.47,115.33,
+121.59,124.59,129.01,132.41,137.49,141.15,143.84,149.15,152.65,158.62,
+159.10,163.67,170.87,171.39,177.09,179.85,185.67,189.50,193.76,196.45,
+200.63,202.97,205.47,211.18,217.34,221.11,223.04,227.23,233.79,235.14,
+240.04,244.25,248.35,253.76,255.80,260.44,264.31,268.97,269.00,277.86,
+278.86,281.98,287.08,292.69,296.95,300.37,302.16,308.22,310.81,315.93,
+320.64,325.85,328.88,329.91,335.31,340.14,338.45,348.20,351.99,356.78,
+359.86,362.21,366.71,369.43,376.21,376.77,381.75,388.85,389.02,392.31,
+396.72,402.60,403.80,407.67,414.57,419.72,427.62,428.68,430.26,436.93,
+436.35,440.73,443.00,449.81,456.70,457.80,465.24,465.36,471.17,474.98,
+477.35,483.49,484.09,489.06,492.23,499.08,502.13,511.42,511.46,513.63,
+517.68,521.48,524.90,529.39,532.42,537.17,541.88,547.61,549.67,551.12,
+558.35,562.12,568.19,569.26,570.28,574.65,582.03,586.56,591.28,594.04,
+593.69,602.93,604.64,612.44,611.08,618.42,619.44,622.97,629.11,634.93,
+636.22,638.11,644.09,649.15,655.27,657.36,662.72,662.51,668.32,669.18,
+675.45,683.06,683.50,687.35,689.31,698.76,701.26,705.04,709.91,711.62,
+709.79,719.60,729.29,729.30,734.70,740.02,736.03,742.80,745.69,751.75,
+757.46,758.76,762.30,765.12,771.12,773.95,778.48,778.42,785.98,794.99,
+792.78,798.28,803.87,804.69,814.42,821.57,816.08,824.41,823.32,829.56,
+840.07,838.46,845.68,845.89,855.13,855.36,857.38,862.58,862.20,872.69,
+874.43,874.09,885.07,888.24,891.80,895.55,900.06,903.05,904.53,905.30,
+912.87,919.16,917.25,929.45,932.87,931.61,943.83,942.05,946.71,951.22,
+954.77,958.22,964.70,964.66,968.63,971.67,978.36,980.40,986.84,990.98,
+993.58,1000.39,1001.49,1003.56,1008.80,1012.21,1019.19,1021.48,1024.51,1024.18,
+1033.27,1041.29,1041.19,1048.45,1045.79,1055.75,1062.05,1056.18,1066.41,1070.91,
+1075.72,1073.96,1084.42,1083.98,1089.21,1094.56,1098.37,1109.30,1103.85,1110.20,
+1111.70,1115.46,1122.24,1124.96,1126.59,1137.04,1138.94,1137.93,1146.52,1146.55,
+1154.14,1160.52,1160.43,1163.27,1167.59,1171.71,1176.55,1181.69,1186.42,1190.82,
+36.73,41.01,42.75,47.03,49.81,53.19,56.41,59.90,62.83,66.36,
+69.53,75.30,77.44,82.70,85.94,87.29,92.03,95.27,98.90,103.05,
+105.86,110.97,112.66,115.98,119.93,123.18,126.69,130.52,132.53,137.51,
+140.54,145.17,147.75,149.85,156.18,158.89,161.11,162.70,168.98,171.44,
+174.50,180.07,183.58,185.28,189.81,196.03,196.09,198.28,202.20,205.69,
+212.13,213.85,218.69,223.34,225.47,228.85,231.08,235.78,240.18,241.41,
+246.72,247.88,252.69,256.81,256.05,263.98,266.56,268.08,273.62,274.57,
+279.01,281.58,286.28,290.65,291.91,297.58,301.90,304.58,306.38,314.06,
+313.47,320.68,323.50,322.79,326.33,332.55,337.30,338.28,342.54,343.38,
+351.38,349.71,356.04,357.33,363.43,367.86,371.74,370.97,378.87,382.72,
+383.48,390.16,389.07,393.13,397.76,402.39,405.36,408.70,407.74,417.36,
+421.17,423.74,427.83,428.44,434.50,437.66,438.22,443.08,445.63,447.79,
+455.65,456.65,460.32,465.85,469.08,470.64,471.75,477.89,478.61,487.45,
+487.72,491.13,493.44,496.48,506.26,503.61,510.14,510.73,514.56,521.29,
+525.71,524.47,529.12,536.48,533.33,538.61,542.57,549.42,550.40,554.60,
+561.22,561.55,563.32,565.12,567.07,570.22,577.34,583.29,586.98,585.09,
+595.04,596.42,600.29,603.64,604.64,608.32,610.14,618.16,621.42,629.40,
+625.70,628.44,631.22,636.20,642.21,647.58,648.77,651.82,655.18,657.68,
+662.56,671.01,670.88,672.84,674.17,679.54,685.12,686.05,691.16,690.61,
+698.18,699.99,699.53,705.46,710.55,715.22,718.85,721.93,725.18,725.96,
+732.50,735.60,738.00,740.76,746.50,748.77,754.35,751.64,760.91,765.27,
+766.16,768.65,772.42,772.74,779.00,785.30,789.29,794.56,789.84,797.73,
+802.68,805.56,806.65,810.32,817.63,816.23,822.19,827.36,826.63,831.07,
+836.26,840.76,834.78,845.43,852.08,856.92,858.66,857.87,860.78,867.49,
+873.51,873.17,879.00,881.09,885.74,882.50,891.91,895.32,900.31,903.57,
+905.86,908.01,909.47,916.88,920.28,922.99,926.62,927.99,936.67,936.47,
+942.09,942.01,946.96,947.90,953.68,956.60,963.03,962.81,963.10,969.10,
+971.68,976.22,983.58,985.71,991.42,997.53,994.80,1000.80,1001.01,1005.45,
+1014.15,1012.87,1018.81,1020.12,1022.37,1033.81,1031.74,1032.77,1038.35,1038.86,
+32.13,33.81,37.88,40.71,42.67,47.39,50.81,51.17,55.95,58.72,
+62.46,64.90,68.38,70.90,74.00,76.42,79.98,82.95,85.98,89.83,
+92.10,97.65,100.04,102.46,105.38,108.64,111.73,112.90,118.05,119.66,
+123.72,127.92,127.52,132.68,134.72,136.80,138.87,144.59,146.55,149.57,
+153.47,154.61,160.81,160.70,164.49,168.55,171.41,175.61,176.76,182.27,
+181.64,185.63,188.30,192.05,194.85,198.65,200.30,205.57,206.94,208.36,
+213.02,218.73,220.27,222.03,229.30,228.07,231.10,232.24,238.21,240.42,
+245.03,244.54,252.10,254.87,257.78,262.28,262.08,265.77,265.87,270.99,
+274.08,280.79,277.22,283.28,286.81,290.41,291.94,293.07,299.40,303.59,
+304.07,311.64,314.32,311.90,316.23,318.08,321.08,325.95,331.67,331.62,
+336.84,338.23,339.32,345.97,348.20,351.44,354.04,355.26,361.96,361.49,
+363.88,369.20,370.57,371.66,379.35,380.92,384.33,389.73,392.83,391.28,
+393.43,396.49,404.36,405.94,407.88,409.44,414.68,416.06,419.84,423.33,
+426.02,428.48,431.86,433.07,438.61,441.05,445.63,446.51,449.44,457.01,
+454.15,454.68,463.62,467.69,468.56,471.92,475.90,476.46,478.23,486.00,
+483.61,491.12,490.37,497.23,497.60,501.11,507.00,507.61,509.81,512.48,
+515.95,522.98,524.56,523.03,529.90,527.29,536.86,537.67,541.68,543.38,
+544.00,543.47,551.84,557.21,558.52,563.23,573.31,571.25,573.16,573.38,
+581.53,582.85,583.75,587.29,593.48,592.19,596.44,600.44,606.33,601.48,
+610.87,610.02,611.96,615.97,613.63,621.28,627.47,630.64,634.72,638.61,
+635.52,641.39,643.25,650.42,645.55,651.62,656.51,658.68,663.07,665.11,
+665.54,667.60,680.13,684.21,682.14,688.48,687.12,689.10,689.88,694.74,
+698.90,701.21,704.84,706.49,713.32,712.42,715.56,724.50,725.29,732.03,
+729.95,729.04,739.03,736.88,738.45,745.09,746.93,753.44,753.11,751.46,
+756.99,761.87,765.71,768.22,769.10,780.50,777.72,782.14,781.65,788.55,
+790.34,797.07,799.56,801.24,799.55,808.78,804.51,815.56,812.56,818.43,
+823.95,822.43,830.98,830.95,831.31,835.75,837.34,843.59,841.75,853.60,
+855.46,854.55,858.08,858.68,860.87,868.82,872.43,870.32,877.29,878.91,
+877.45,886.12,884.93,893.74,890.97,895.21,900.81,898.37,905.70,910.47,
+27.17,31.54,32.68,35.25,38.95,40.60,42.42,45.02,48.73,51.95,
+53.10,56.14,58.58,60.68,63.54,66.41,70.23,70.33,74.89,77.36,
+80.62,82.77,85.12,88.15,89.98,93.97,94.67,97.16,101.29,106.03,
+108.45,108.61,112.47,114.75,117.87,120.33,122.21,124.40,129.91,131.23,
+134.42,136.19,138.19,142.96,145.56,145.24,148.19,150.83,156.20,157.32,
+159.18,164.71,164.77,170.34,169.78,171.68,176.36,177.93,182.17,181.23,
+185.49,189.42,189.90,194.10,198.03,198.40,202.78,204.48,206.44,213.02,
+213.77,212.78,217.99,220.05,226.99,224.78,230.66,229.72,233.25,235.07,
+237.00,241.23,242.25,246.76,249.40,253.35,255.82,258.56,257.77,264.27,
+266.38,265.98,268.81,274.90,270.79,278.07,280.12,281.72,286.86,292.00,
+290.24,297.69,295.74,296.81,303.90,303.18,302.40,311.22,311.74,316.51,
+315.67,317.66,323.96,324.38,330.15,333.56,333.16,340.58,342.90,336.72,
+345.51,348.56,349.48,349.16,352.84,360.67,358.46,360.32,366.49,365.59,
+370.15,372.57,374.21,374.73,377.25,381.81,384.30,392.84,392.90,397.04,
+396.07,399.24,401.03,404.64,408.28,409.52,412.05,412.13,416.13,420.46,
+423.84,423.49,428.05,431.19,433.11,437.87,442.24,441.18,445.12,443.67,
+445.99,451.15,456.19,455.24,462.90,464.64,464.23,469.72,470.62,475.66,
+479.84,479.75,478.41,478.38,486.15,488.69,494.89,496.48,498.19,498.33,
+508.31,505.67,506.72,510.11,511.64,516.83,515.36,522.73,521.97,526.45,
+528.22,523.37,537.65,536.87,535.49,544.18,541.64,552.31,552.64,552.37,
+554.98,560.69,561.38,560.38,565.75,564.75,573.18,570.04,577.31,579.13,
+585.79,589.22,587.10,593.23,593.34,591.57,600.37,603.96,605.31,609.46,
+606.99,611.49,612.80,615.52,616.07,620.12,622.01,622.86,628.21,634.40,
+640.96,636.97,640.62,644.78,643.75,647.94,649.04,650.91,655.99,656.44,
+662.73,663.82,661.77,665.22,672.69,680.22,675.54,676.00,674.96,685.57,
+687.17,687.79,692.79,692.49,699.73,700.31,696.46,712.08,706.78,712.81,
+716.07,715.03,715.52,722.94,726.47,722.34,729.97,735.24,730.52,739.85,
+738.45,741.02,742.10,750.80,751.64,753.61,754.48,759.48,761.07,763.96,
+768.00,769.70,774.17,775.93,774.65,781.56,780.01,785.75,788.08,788.95,
+23.56,26.92,27.25,30.47,33.48,34.96,37.97,39.11,40.78,43.45,
+46.77,49.15,51.68,52.86,55.99,57.54,59.37,64.08,64.74,69.51,
+68.54,73.39,75.04,76.38,78.92,81.93,83.00,84.56,87.19,91.34,
+92.23,93.35,95.66,98.92,101.62,105.63,103.96,108.99,112.90,114.91,
+116.51,117.04,120.34,121.72,125.53,128.56,129.31,131.20,130.89,135.79,
+139.16,140.66,142.07,144.56,146.21,149.49,151.59,154.74,154.23,159.27,
+162.60,162.57,163.51,165.82,167.37,170.34,173.69,178.75,179.17,181.76,
+182.67,188.25,189.37,189.38,193.79,195.63,196.66,198.93,204.43,205.72,
+206.62,206.49,207.97,212.00,215.99,219.59,220.64,221.53,223.20,226.23,
+230.59,232.75,232.31,239.24,239.47,240.42,242.78,248.27,249.18,250.24,
+249.11,251.51,257.50,258.90,261.66,264.33,268.58,268.54,272.69,273.38,
+276.54,276.60,280.99,279.87,284.32,283.62,292.42,292.02,291.30,292.63,
+300.49,304.61,300.34,304.18,311.80,309.78,316.13,313.28,317.77,321.14,
+321.87,323.82,324.57,327.99,329.99,335.16,334.66,339.36,342.95,340.64,
+342.77,346.63,347.38,349.68,353.95,352.74,354.76,360.39,361.65,364.20,
+367.38,371.96,370.73,377.24,375.86,377.55,381.89,385.61,386.11,386.59,
+392.94,391.42,393.66,391.27,398.83,394.92,402.76,406.59,409.54,411.53,
+412.82,415.63,416.32,417.23,422.23,423.97,429.04,429.29,432.09,431.86,
+440.36,434.80,438.75,440.79,452.23,449.29,446.07,448.20,457.70,453.69,
+458.59,459.86,462.65,468.51,467.95,466.05,470.61,475.20,472.61,483.17,
+480.53,485.01,485.72,484.77,490.51,488.87,493.75,499.72,501.54,507.04,
+501.44,509.77,512.02,513.14,514.88,516.05,514.80,522.33,526.32,520.69,
+529.65,528.23,531.12,535.72,534.66,539.46,543.54,551.09,542.84,544.98,
+553.21,553.83,558.82,558.11,555.57,561.72,561.89,565.41,569.63,571.91,
+576.55,580.01,576.00,582.72,580.99,587.84,586.88,589.71,591.70,594.04,
+595.73,591.59,601.07,603.02,607.34,600.05,608.78,608.07,614.97,615.68,
+618.96,618.95,623.10,623.26,622.04,632.76,636.93,635.22,638.53,639.55,
+640.61,641.24,644.83,648.90,647.70,654.20,653.75,658.46,660.14,662.83,
+666.05,665.65,670.15,667.72,678.76,677.50,682.52,674.94,682.08,680.93,
+20.59,22.56,23.53,26.81,27.91,30.03,33.01,34.29,37.16,39.08,
+40.16,43.26,44.13,44.88,47.66,50.14,52.16,55.16,56.48,57.52,
+60.53,58.84,64.56,64.40,69.34,71.19,72.93,74.73,74.68,78.68,
+78.96,81.43,85.05,85.36,89.85,90.15,92.55,94.23,96.17,96.41,
+99.43,101.62,103.23,105.91,108.58,108.12,111.41,114.54,116.23,116.16,
+120.04,122.26,124.05,125.97,127.48,128.96,132.73,133.60,134.84,136.13,
+137.86,142.56,142.30,144.37,146.69,146.68,150.79,152.97,154.84,157.76,
+159.28,159.44,161.48,164.81,168.12,169.97,171.88,174.00,175.00,175.17,
+178.00,181.78,183.18,184.79,185.16,185.61,194.15,190.91,196.04,194.44,
+199.46,197.74,201.48,203.79,206.37,208.35,213.54,210.49,216.03,218.55,
+215.86,223.42,224.02,225.42,226.26,228.05,230.51,237.48,233.66,234.36,
+238.21,239.77,241.44,245.06,244.44,248.27,249.28,255.70,250.82,253.44,
+258.19,261.00,261.90,262.85,266.50,266.27,268.53,274.86,275.19,276.83,
+275.79,280.06,282.09,284.55,284.38,284.69,288.56,288.24,297.25,297.18,
+296.38,298.42,300.83,302.96,301.04,305.83,305.19,307.38,316.13,312.82,
+316.92,318.40,317.45,321.09,324.50,327.07,329.63,328.56,334.48,335.47,
+337.45,340.48,337.27,347.94,345.25,349.48,345.09,351.03,352.07,357.32,
+357.70,360.90,359.76,363.70,361.36,363.12,370.18,369.42,369.19,379.61,
+375.94,375.31,376.72,383.60,386.72,383.32,391.82,390.85,393.30,399.65,
+393.29,397.98,402.25,404.13,406.12,406.76,410.40,413.24,410.92,411.57,
+416.99,414.17,421.84,420.51,420.81,425.80,425.49,426.44,431.40,437.96,
+435.19,435.27,435.41,439.79,439.73,449.05,449.50,448.47,449.58,455.43,
+450.84,458.67,460.16,459.36,463.40,465.94,468.34,470.88,476.18,472.55,
+475.46,477.20,479.04,478.05,485.21,479.87,489.53,491.27,490.68,492.92,
+498.78,498.43,497.50,502.33,505.44,504.56,506.22,505.88,513.44,515.04,
+514.98,516.24,517.60,525.22,522.74,521.10,522.25,531.50,531.95,533.99,
+535.87,545.06,536.08,542.62,540.74,544.24,544.95,549.75,551.85,553.80,
+552.99,551.65,559.14,563.50,560.99,563.85,570.57,568.18,565.36,568.07,
+577.94,576.42,578.57,584.34,588.46,583.98,588.01,587.33,589.41,589.92,
+17.77,19.88,22.00,22.45,23.41,26.47,27.36,28.99,31.95,31.75,
+34.81,36.62,38.06,40.40,42.02,42.00,45.80,46.55,47.97,51.18,
+53.50,53.25,55.36,58.19,58.93,59.00,62.82,63.94,65.42,67.92,
+68.84,71.79,72.52,72.03,75.80,77.30,81.36,80.53,83.02,83.18,
+86.92,86.08,90.07,89.14,91.84,92.49,96.40,96.35,99.73,100.33,
+102.20,103.69,106.87,108.91,110.75,112.24,113.90,114.60,116.53,118.36,
+120.71,123.41,123.73,127.93,126.16,126.82,131.33,131.61,132.80,135.90,
+135.57,137.26,141.46,141.64,144.70,146.77,145.93,149.90,153.69,150.40,
+154.19,157.31,158.99,156.95,160.94,163.00,163.81,163.85,165.82,171.00,
+169.65,170.95,175.70,178.94,178.57,178.63,182.10,179.49,184.71,188.06,
+188.55,190.42,190.93,191.74,199.95,196.02,200.26,198.32,204.60,201.94,
+204.50,207.21,211.75,209.11,212.75,213.98,211.49,216.88,215.90,222.36,
+221.23,225.34,224.77,225.09,229.80,234.01,230.57,234.81,234.92,236.51,
+239.75,239.51,241.81,244.83,245.49,251.39,255.00,255.50,254.18,258.25,
+253.59,260.00,259.90,257.14,262.75,266.33,264.66,268.62,269.65,270.13,
+275.07,274.16,277.34,278.44,279.36,279.70,281.34,285.61,284.38,289.77,
+292.48,290.04,293.77,298.49,297.76,301.09,301.72,305.85,305.12,302.22,
+305.95,309.77,306.90,313.38,318.18,315.32,320.98,316.69,321.49,322.32,
+325.20,323.94,327.84,328.48,333.82,336.91,338.08,337.05,333.46,338.44,
+338.59,346.17,343.27,345.65,347.27,347.07,353.36,353.57,359.56,357.21,
+361.83,356.50,359.62,360.52,366.00,365.54,370.70,374.29,371.86,371.47,
+373.44,377.47,377.56,382.38,380.28,384.81,385.20,384.12,388.86,399.41,
+391.90,398.73,399.69,398.37,400.29,403.39,405.17,404.81,408.83,405.38,
+412.70,407.81,412.81,415.00,418.53,412.65,422.84,420.01,422.22,421.70,
+426.86,425.14,431.45,432.87,436.57,433.76,438.11,440.24,438.33,441.77,
+440.48,445.80,448.12,449.15,448.20,458.56,452.15,455.14,457.62,454.90,
+458.74,461.82,467.00,467.39,471.64,470.88,473.01,475.33,475.63,478.02,
+476.54,478.36,482.69,482.65,483.81,482.35,484.19,492.14,492.25,491.10,
+501.96,497.07,495.65,501.64,500.60,504.29,500.80,506.56,507.76,507.86,
+15.20,17.48,18.83,20.22,20.38,22.94,23.53,26.60,28.02,28.20,
+29.77,30.87,32.56,34.32,34.94,36.64,40.25,40.43,42.13,43.26,
+44.53,46.75,47.07,48.88,50.52,50.32,52.80,55.21,57.41,55.97,
+57.40,62.32,61.04,62.28,65.77,66.72,67.96,69.52,71.32,71.39,
+73.46,75.43,76.06,79.72,78.55,81.42,84.63,86.74,86.30,85.82,
+87.81,90.99,91.21,93.27,92.83,95.53,98.85,98.32,98.71,102.57,
+101.45,104.06,107.75,108.22,110.47,111.69,111.88,113.53,112.70,116.69,
+118.74,120.31,118.55,123.38,122.76,123.68,124.29,128.57,130.13,129.84,
+131.44,135.45,133.98,137.03,140.01,138.16,141.94,142.70,145.17,147.22,
+147.28,144.97,148.46,152.45,153.87,152.89,154.88,158.57,157.00,158.60,
+163.47,163.14,165.73,164.90,167.10,170.41,170.59,172.65,170.67,176.26,
+174.89,178.06,178.79,181.04,183.96,185.18,185.69,186.60,190.12,188.76,
+191.66,191.34,192.40,198.63,198.65,198.58,202.59,202.70,205.21,200.77,
+204.12,204.39,212.22,209.09,215.34,215.00,215.67,215.72,217.74,219.46,
+222.06,222.07,224.96,228.43,229.30,227.58,229.88,228.22,230.82,236.60,
+234.16,237.53,239.79,243.38,237.28,243.21,246.60,246.82,247.06,249.47,
+255.32,255.20,254.22,256.61,255.66,255.33,257.63,257.22,262.77,260.65,
+265.22,265.05,270.22,267.40,267.87,273.03,273.02,271.50,277.63,280.68,
+276.52,280.67,282.91,284.72,283.15,283.85,291.24,289.72,288.86,291.56,
+290.47,295.89,295.97,297.08,299.47,300.27,301.53,302.43,305.96,305.94,
+304.85,310.74,309.09,316.55,311.34,320.79,315.99,317.81,320.96,319.39,
+323.78,323.33,323.00,330.36,329.36,326.09,332.23,335.41,332.58,335.64,
+333.25,341.90,338.39,343.99,340.21,344.87,345.51,344.55,346.52,350.86,
+354.47,353.25,353.47,354.44,358.36,363.00,360.17,363.84,362.96,365.76,
+367.50,368.49,370.25,370.72,375.16,377.97,378.66,378.63,380.11,378.85,
+384.23,387.13,383.86,380.69,391.23,390.10,391.17,394.30,392.27,392.39,
+400.02,398.91,400.91,403.99,403.12,405.23,405.85,401.90,405.61,408.79,
+408.35,409.43,415.18,412.17,417.04,416.39,418.95,419.25,425.57,421.97,
+424.46,427.51,429.18,429.94,436.20,435.72,431.85,435.61,438.90,438.68,
+12.67,14.56,16.17,16.52,18.10,19.39,21.28,22.14,23.01,24.54,
+26.89,28.28,28.77,29.64,30.71,30.99,33.55,33.58,36.00,37.98,
+38.29,38.64,41.18,41.37,42.58,43.69,44.91,46.97,49.05,49.53,
+51.23,51.31,53.74,54.70,55.20,56.74,61.84,60.13,61.00,63.36,
+63.27,67.43,64.66,69.11,69.97,70.53,70.23,72.25,72.17,74.74,
+76.92,77.40,79.85,78.92,80.64,83.00,82.39,84.24,85.77,88.13,
+87.04,88.03,91.23,92.45,94.17,94.81,95.91,99.55,101.13,100.88,
+99.11,100.52,105.29,102.68,106.59,106.88,109.52,109.27,111.07,113.68,
+114.75,116.58,116.50,116.85,119.77,120.25,120.92,122.56,125.41,124.56,
+126.38,126.39,128.03,129.74,129.41,131.87,137.03,133.88,135.65,139.68,
+134.67,139.07,141.14,145.27,144.85,149.31,146.29,146.04,147.85,149.21,
+147.98,152.62,153.04,154.94,157.40,160.85,156.45,160.58,162.36,164.51,
+158.56,165.93,165.07,167.97,166.42,172.75,172.33,172.32,174.82,174.00,
+177.99,175.58,178.87,178.20,180.24,180.91,185.09,181.04,186.27,192.11,
+188.61,188.61,188.79,195.65,193.13,193.76,195.62,200.98,200.62,200.73,
+202.37,202.34,202.78,206.58,201.44,210.18,211.20,210.88,211.92,211.02,
+216.36,215.83,215.66,217.18,219.42,220.80,220.84,222.22,224.16,222.98,
+226.03,231.66,229.28,233.68,233.29,231.61,236.44,237.88,235.02,238.63,
+237.41,240.77,239.17,243.18,244.33,243.22,248.59,248.50,249.81,250.59,
+253.62,255.29,256.31,260.38,255.84,257.18,260.14,259.61,267.11,259.47,
+263.25,265.32,267.98,266.18,267.41,269.55,271.39,274.98,271.89,276.40,
+277.36,279.20,278.43,279.16,285.62,283.26,280.75,287.13,286.49,289.81,
+296.41,288.78,293.16,294.67,295.77,293.22,297.99,298.07,301.95,299.90,
+303.96,300.32,304.08,302.21,310.35,306.58,305.56,310.80,307.67,311.22,
+312.14,317.17,316.16,320.89,320.40,321.00,319.36,324.11,325.65,320.95,
+327.59,328.00,329.80,326.68,329.44,336.41,334.11,336.94,337.94,335.37,
+340.10,337.47,340.01,343.72,347.46,348.82,349.83,348.70,347.77,354.08,
+354.50,358.77,353.02,354.09,363.56,357.69,357.78,362.36,362.15,363.35,
+365.55,366.45,367.40,368.35,369.20,371.10,374.26,373.99,376.55,375.64,
+11.41,11.76,13.81,15.24,16.11,16.70,17.29,19.75,20.74,21.38,
+21.93,22.81,24.43,26.09,26.49,28.51,27.75,29.61,29.88,31.50,
+32.33,33.47,34.30,36.58,35.84,38.06,40.42,41.85,42.66,42.94,
+43.67,43.32,44.64,48.05,49.26,50.05,50.01,51.22,53.35,54.80,
+52.91,54.37,55.93,57.93,59.07,59.85,58.64,61.69,62.52,61.43,
+63.45,66.72,66.02,66.81,69.73,70.37,72.69,73.51,72.19,74.03,
+72.99,76.40,76.85,78.15,81.83,83.70,83.61,86.20,85.06,86.88,
+86.98,88.08,86.71,86.84,87.88,93.16,92.79,93.62,93.20,96.37,
+98.88,97.25,100.20,102.79,103.73,101.50,104.37,104.22,105.21,109.12,
+106.67,109.89,110.72,111.70,113.67,114.87,114.78,114.53,116.18,116.93,
+116.89,120.37,121.84,120.56,123.59,125.60,122.12,126.91,127.25,129.51,
+131.99,130.00,132.78,133.78,135.41,136.27,137.61,136.73,137.25,136.96,
+141.22,143.05,143.00,142.59,145.82,145.72,146.37,146.27,148.99,145.43,
+152.16,152.44,156.21,155.71,154.79,156.91,158.25,159.73,158.17,160.16,
+161.17,164.20,160.34,168.81,164.70,166.14,168.40,169.51,172.12,173.66,
+173.54,171.61,174.19,166.67,177.39,180.50,180.54,177.47,181.12,182.22,
+182.56,182.76,188.00,189.43,188.10,190.87,192.41,187.86,195.17,196.34,
+192.37,193.78,200.04,193.69,196.87,201.91,198.18,205.88,199.43,203.23,
+204.53,205.98,204.25,211.42,208.29,210.34,210.87,212.94,212.68,212.53,
+213.98,218.65,216.52,216.90,220.69,223.25,222.26,222.89,224.64,226.10,
+224.05,229.05,226.84,231.20,227.41,234.86,230.61,234.56,235.01,237.99,
+240.61,239.81,240.70,240.33,241.03,243.04,245.97,247.92,245.56,246.77,
+247.57,250.06,251.69,246.67,255.43,250.56,258.30,255.62,255.63,260.17,
+259.27,258.65,265.80,265.70,262.36,269.96,267.82,268.44,266.30,266.55,
+272.94,273.75,272.43,271.82,275.58,277.35,275.02,276.27,277.04,282.09,
+279.77,283.49,283.65,282.91,281.99,282.74,285.12,289.08,290.07,290.87,
+287.15,290.45,290.04,291.65,292.15,294.51,298.37,295.10,302.11,298.61,
+301.15,303.84,303.83,300.46,303.88,307.50,306.92,307.99,313.09,307.74,
+307.97,315.80,318.14,317.92,322.23,320.69,319.30,317.80,318.18,318.21,
+9.41,10.22,11.01,12.83,12.98,14.25,14.92,16.65,16.19,18.55,
+18.91,19.98,21.20,21.16,21.39,22.85,23.62,25.32,26.29,27.36,
+28.13,29.53,30.02,30.56,32.40,32.95,34.45,34.26,35.93,38.31,
+38.74,39.90,40.21,41.05,40.71,42.90,42.51,44.88,45.76,46.15,
+46.11,46.52,47.60,50.23,50.90,50.72,52.22,52.63,52.72,54.73,
+54.77,57.35,58.12,59.20,58.16,59.46,63.09,62.41,62.67,65.75,
+65.44,63.60,67.76,68.45,67.14,71.53,68.25,72.74,71.19,72.35,
+74.39,74.46,76.89,78.48,77.10,76.12,80.42,81.47,78.36,84.23,
+83.96,83.42,85.52,86.02,86.54,88.48,86.20,91.95,92.05,91.47,
+93.55,93.86,94.18,96.20,95.71,97.16,98.39,102.26,100.91,96.98,
+102.44,99.92,104.28,103.91,106.76,108.62,105.67,108.68,110.33,112.23,
+111.67,111.10,114.22,114.97,114.89,115.73,116.57,117.18,118.73,119.42,
+117.86,120.39,119.10,124.29,123.48,126.16,126.40,128.57,125.38,129.79,
+133.54,129.35,129.90,132.89,134.89,136.08,139.21,133.00,139.94,138.43,
+135.65,139.46,141.03,142.45,142.47,143.65,143.04,145.11,144.39,148.34,
+149.43,147.96,147.99,149.65,149.59,151.84,151.76,155.59,155.39,155.68,
+156.26,158.42,162.65,156.47,158.12,162.73,160.76,162.19,164.74,164.00,
+164.39,165.51,165.28,167.87,168.64,169.51,170.95,173.84,169.60,175.20,
+174.14,172.52,176.45,181.12,180.17,177.21,179.44,177.54,180.83,182.89,
+182.96,185.66,184.70,189.48,187.33,187.28,187.32,190.37,189.45,196.00,
+191.83,191.02,198.04,199.64,197.39,199.52,197.49,199.22,201.08,203.35,
+204.47,202.40,206.71,205.76,205.84,205.55,205.87,209.21,211.56,213.97,
+212.57,209.80,214.79,210.93,214.15,221.83,222.71,216.48,218.15,216.69,
+218.98,219.34,220.29,223.68,222.73,224.84,229.22,223.52,226.56,231.56,
+229.18,234.68,228.17,233.18,238.63,233.94,235.82,237.93,241.02,239.32,
+237.98,240.70,246.51,241.77,241.22,245.19,243.01,248.26,244.12,250.01,
+246.48,248.88,251.72,250.55,253.40,253.24,252.76,256.57,258.90,251.28,
+258.29,261.22,258.39,261.65,260.54,264.80,265.34,268.02,262.15,268.33,
+269.39,271.01,270.50,270.42,270.21,275.22,272.21,275.68,278.85,275.86,
+7.90,8.71,9.95,11.20,11.06,11.69,12.83,13.57,15.31,15.28,
+15.82,17.44,18.73,18.45,20.70,19.54,21.98,21.63,22.63,23.37,
+24.00,24.62,25.81,26.80,26.76,27.37,28.35,29.71,31.56,31.12,
+32.63,32.74,32.90,34.23,34.30,36.52,38.06,38.19,38.22,39.33,
+39.57,41.55,41.47,41.89,41.95,43.87,43.96,44.86,45.51,45.31,
+48.72,45.88,49.81,49.35,49.54,51.67,51.12,50.39,53.31,54.74,
+54.27,59.21,57.71,58.00,58.14,57.88,58.88,62.35,59.84,62.73,
+60.94,65.66,64.35,64.45,65.76,66.44,66.19,69.02,68.28,70.99,
+72.30,71.13,74.24,75.05,73.05,74.43,75.38,75.34,78.64,77.70,
+78.89,78.70,80.29,81.88,80.05,81.72,84.82,86.22,84.66,87.23,
+85.71,87.85,88.24,88.73,89.88,90.67,90.57,94.25,92.80,95.67,
+95.18,97.34,94.43,98.88,99.03,96.83,98.98,99.55,102.33,100.51,
+102.28,100.81,104.95,107.36,103.26,109.19,107.51,107.67,109.44,110.36,
+109.91,110.20,111.62,114.53,111.86,113.72,113.35,115.60,120.22,114.84,
+116.91,118.77,123.07,119.64,118.77,122.81,124.18,122.92,124.17,122.99,
+127.35,131.75,124.27,129.72,127.44,130.04,131.81,128.51,133.72,133.25,
+133.22,133.56,137.77,136.03,140.13,139.89,138.42,139.04,141.79,139.94,
+138.60,142.28,144.82,143.16,145.37,147.20,144.69,147.39,146.07,150.34,
+146.94,149.89,155.02,150.47,147.93,156.61,151.90,156.34,156.89,154.78,
+159.68,157.59,158.02,161.34,158.20,161.46,160.87,165.18,163.26,162.07,
+165.29,164.61,164.85,168.22,171.36,168.12,170.47,169.09,168.91,173.50,
+175.20,175.96,169.23,176.23,173.97,178.22,177.31,177.35,178.64,178.80,
+179.86,181.67,180.57,181.77,182.34,187.33,181.40,190.00,189.30,188.08,
+187.78,191.64,190.53,189.58,194.12,191.60,194.28,194.52,199.09,199.36,
+200.17,197.29,195.66,203.66,202.66,201.82,204.27,201.62,205.69,206.34,
+206.02,204.89,208.82,209.64,207.53,212.54,208.97,207.79,209.67,213.22,
+213.97,218.22,213.66,213.79,216.79,219.38,216.10,217.08,218.35,223.33,
+220.46,221.89,222.71,225.12,224.65,223.57,223.41,228.18,223.60,230.19,
+225.73,230.25,230.21,229.85,236.98,232.86,230.36,232.13,232.87,231.65,
+6.19,7.67,9.23,9.50,9.58,10.48,10.76,12.23,12.12,13.14,
+14.59,14.66,15.04,15.21,16.98,17.86,17.84,18.58,19.78,18.70,
+19.83,21.89,21.82,22.19,23.90,24.29,23.75,24.52,25.86,26.08,
+26.83,27.59,30.16,30.10,29.32,30.81,30.62,30.59,30.72,31.88,
+34.20,33.73,34.79,33.02,36.72,36.36,37.49,39.01,38.69,38.37,
+39.52,41.59,41.72,42.00,44.62,45.32,43.28,44.74,46.12,46.36,
+46.10,45.98,50.08,50.96,50.70,52.24,49.73,52.00,51.76,52.06,
+53.79,53.24,55.83,56.28,56.52,58.10,55.42,59.59,58.59,57.32,
+60.35,60.21,61.62,62.88,63.71,63.87,65.32,65.89,63.76,65.79,
+67.56,66.82,70.22,68.69,69.09,68.85,68.87,72.38,70.08,72.43,
+73.05,76.79,74.22,75.66,75.47,76.50,78.18,80.97,80.84,81.88,
+79.75,83.91,82.47,81.80,83.77,85.26,81.95,85.82,84.89,87.49,
+87.91,88.58,88.19,90.65,91.29,93.19,93.15,91.06,92.64,93.52,
+95.39,96.83,97.23,93.21,99.17,95.78,96.75,98.78,98.42,101.74,
+100.55,103.50,103.07,104.70,102.55,103.50,103.46,106.17,106.42,103.96,
+107.61,104.84,108.11,111.39,112.32,110.23,112.30,113.25,111.31,115.80,
+113.71,112.64,115.24,117.75,115.26,113.76,117.42,116.92,121.88,122.51,
+121.09,121.79,125.48,122.48,123.47,122.51,122.64,123.94,130.16,125.26,
+128.01,126.93,129.44,127.88,129.28,131.55,132.56,132.58,135.32,135.97,
+135.05,135.39,133.63,139.10,137.65,139.98,139.59,137.33,136.04,140.48,
+142.67,141.33,138.94,142.05,140.94,140.57,144.76,146.34,145.78,146.50,
+148.67,147.31,149.97,144.94,150.71,148.25,150.25,151.27,153.67,156.96,
+158.19,148.53,153.90,151.55,155.45,157.31,158.55,158.16,161.40,161.22,
+160.09,161.97,161.20,165.72,161.95,164.69,163.26,170.43,168.23,169.32,
+169.28,166.41,168.35,169.17,171.39,168.38,172.14,175.62,175.81,170.18,
+175.06,174.76,174.71,173.42,175.00,178.56,180.60,178.14,181.28,180.49,
+183.21,181.11,182.75,179.86,181.46,180.55,184.04,184.61,187.41,188.02,
+189.16,186.92,190.64,191.63,187.34,190.81,191.70,192.35,190.16,193.53,
+199.58,196.06,198.58,195.32,198.00,199.67,198.76,203.56,201.98,198.98,
+6.15,6.89,6.59,7.90,7.72,9.05,8.62,10.61,10.56,10.85,
+11.08,12.80,13.65,14.31,12.97,15.08,14.97,15.44,16.05,16.56,
+17.38,17.29,17.38,18.07,19.98,19.41,20.24,21.11,21.23,22.19,
+22.38,22.63,22.22,24.89,24.67,27.33,26.98,27.57,27.06,27.21,
+29.57,29.02,29.72,31.46,32.13,31.02,32.94,32.55,33.24,33.81,
+35.23,35.46,35.12,35.75,36.31,36.80,39.41,39.68,39.40,40.06,
+40.20,40.54,40.23,41.69,43.49,43.66,42.34,44.34,45.89,46.09,
+46.24,46.91,47.95,48.88,47.69,47.54,49.32,48.05,50.51,51.40,
+50.03,52.40,53.34,53.80,54.87,54.83,54.84,56.23,56.46,56.11,
+59.10,55.56,55.82,61.32,60.15,61.49,61.33,62.10,62.74,59.54,
+63.12,62.96,62.96,62.69,63.34,67.29,67.10,64.91,69.28,69.13,
+68.44,69.74,68.16,70.58,69.17,71.70,73.25,71.87,73.25,73.60,
+74.77,73.53,75.42,73.54,76.60,76.41,79.13,77.89,80.25,78.93,
+80.44,80.38,81.43,82.78,81.89,82.90,85.51,84.40,85.87,83.10,
+86.41,85.14,85.39,88.21,88.33,85.78,87.96,90.34,88.32,89.76,
+90.14,89.97,93.17,94.38,94.21,94.57,92.92,98.09,96.27,98.22,
+96.61,98.13,97.43,97.25,100.49,98.36,99.00,98.72,102.53,102.17,
+102.82,103.37,105.24,103.72,107.28,104.24,106.06,108.28,107.35,109.43,
+110.67,106.42,109.32,110.78,110.08,114.64,115.64,114.07,110.65,113.92,
+113.07,111.20,117.11,116.53,117.14,118.56,120.21,119.49,117.59,119.84,
+118.53,121.63,121.55,121.28,121.32,124.77,123.82,124.53,121.83,125.61,
+125.18,124.70,127.23,129.60,124.63,126.86,127.64,126.87,131.33,133.45,
+130.12,129.50,130.77,132.37,134.14,131.99,131.41,133.72,136.50,134.45,
+138.24,138.76,138.45,138.52,133.87,140.54,140.62,143.35,143.36,141.62,
+143.55,141.97,143.05,146.20,144.77,143.84,147.06,148.86,146.57,144.32,
+149.22,148.00,149.63,153.94,150.64,152.11,151.31,153.06,153.77,151.48,
+151.61,155.86,154.47,155.94,154.25,160.00,160.22,159.26,156.75,159.26,
+161.52,163.27,164.91,162.79,161.22,159.83,161.11,167.41,163.80,165.85,
+162.11,169.65,165.50,168.27,165.96,171.16,169.78,166.85,169.49,169.06,
+5.38,5.33,5.87,6.26,7.79,8.25,8.54,7.94,8.93,9.70,
+10.10,10.12,10.42,11.49,11.28,13.69,12.27,12.60,13.15,14.32,
+14.43,15.82,14.44,15.73,16.07,16.40,18.36,18.69,19.59,18.18,
+19.02,19.69,20.98,21.10,22.56,21.69,23.69,24.10,22.91,22.57,
+24.11,24.27,24.66,25.90,25.44,27.70,28.29,27.70,28.35,29.37,
+28.42,29.99,29.60,31.65,31.73,30.40,31.89,31.32,33.97,34.47,
+34.60,34.33,36.03,35.27,36.19,36.93,37.23,37.14,37.87,36.55,
+36.52,37.64,39.07,40.32,39.40,40.29,42.28,42.77,42.61,44.51,
+42.88,44.98,44.05,43.38,43.77,47.26,49.24,46.35,47.95,48.69,
+47.68,47.12,47.77,49.67,48.86,49.67,50.39,50.26,51.67,50.69,
+52.34,54.07,54.34,56.46,55.60,56.61,55.06,54.54,55.58,58.58,
+56.97,58.30,59.70,59.64,58.55,61.41,63.02,62.39,63.73,62.21,
+62.59,64.35,64.07,66.52,60.33,66.80,68.17,65.87,67.57,69.39,
+68.09,71.31,67.38,69.27,69.16,70.59,72.24,70.59,72.91,71.48,
+73.83,75.03,78.67,75.27,75.44,74.66,75.92,76.42,77.26,76.66,
+77.35,78.68,80.18,79.02,79.35,80.27,80.57,81.84,81.76,83.46,
+83.86,81.22,83.96,85.62,86.41,82.54,83.81,85.46,86.28,86.60,
+88.12,87.68,90.22,86.47,87.25,87.53,89.88,92.19,91.17,92.37,
+91.84,95.53,95.08,94.25,93.27,95.21,97.66,93.33,94.32,98.54,
+96.22,97.02,97.60,100.16,100.00,100.53,97.70,97.80,102.27,102.59,
+104.94,102.80,100.44,104.08,105.41,105.67,104.73,103.23,105.73,107.68,
+106.02,107.72,107.48,110.34,108.53,108.84,108.74,112.57,109.71,110.32,
+108.55,112.00,112.36,114.98,110.84,113.47,113.52,114.63,114.66,117.07,
+116.81,117.92,118.46,119.97,120.13,120.00,118.67,117.12,121.16,122.91,
+121.60,123.39,122.30,120.62,126.36,126.61,127.25,121.64,125.25,125.14,
+128.46,126.61,125.80,127.03,125.80,129.08,129.82,128.17,131.23,130.31,
+132.87,128.32,131.87,131.67,132.17,129.10,132.85,134.37,132.81,135.90,
+136.35,134.55,136.03,134.03,137.88,140.18,136.23,139.95,142.03,143.64,
+139.39,140.17,145.90,142.81,145.80,144.19,141.12,146.89,142.68,144.17,
+45.63,49.39,54.62,58.57,62.55,66.07,72.53,75.58,79.70,84.56,
+88.85,93.36,96.70,101.83,106.46,110.72,113.46,118.83,123.30,127.78,
+132.35,136.80,140.67,146.27,148.31,154.38,157.05,163.49,167.30,170.90,
+175.63,178.50,183.37,187.69,190.53,196.88,200.27,204.53,210.07,214.13,
+220.44,223.49,226.77,230.59,236.21,240.10,244.82,251.97,253.97,259.21,
+263.38,265.30,270.63,275.96,278.17,285.55,286.03,291.03,296.67,299.35,
+304.50,312.29,313.42,319.65,323.19,328.80,330.46,333.33,339.81,341.96,
+347.47,352.50,356.12,363.51,365.50,372.11,374.81,378.02,383.04,386.37,
+390.49,397.24,402.15,403.74,406.46,416.06,417.38,422.77,426.18,433.39,
+436.84,442.41,445.88,449.03,448.81,455.62,460.28,466.16,467.77,474.13,
+479.58,486.67,490.27,492.85,498.34,500.45,507.23,510.61,513.40,520.64,
+524.47,528.98,528.98,535.69,539.39,543.57,551.17,556.32,554.32,557.76,
+563.82,569.79,572.72,579.66,582.94,582.38,593.78,599.04,600.41,604.99,
+606.48,615.51,621.97,617.14,625.14,630.00,633.92,640.20,644.73,647.51,
+652.49,654.55,660.17,664.63,666.84,672.45,675.74,681.25,685.91,688.93,
+700.28,699.48,705.07,709.20,709.02,713.31,721.28,725.85,732.92,735.83,
+741.03,739.17,748.55,750.28,753.86,757.27,763.20,768.69,775.14,776.02,
+781.81,784.62,788.64,794.96,797.80,799.33,808.32,813.28,816.72,819.32,
+826.24,827.59,830.39,841.88,842.90,844.80,855.44,859.39,863.07,863.55,
+870.41,872.90,877.80,880.01,883.95,890.43,893.42,899.07,906.11,905.69,
+912.50,914.59,921.13,922.98,929.94,931.15,941.14,944.38,947.21,949.08,
+957.42,962.12,965.06,971.64,968.74,976.69,983.45,987.20,986.77,995.01,
+993.22,998.88,1003.32,1009.75,1016.40,1017.75,1024.74,1026.49,1031.50,1038.92,
+1043.17,1042.11,1046.50,1054.25,1058.60,1061.59,1064.97,1070.42,1076.85,1082.51,
+1088.71,1084.93,1091.69,1094.38,1106.26,1105.53,1114.45,1114.91,1119.13,1125.33,
+1127.33,1132.60,1136.37,1142.62,1148.04,1144.38,1157.88,1158.66,1160.45,1167.34,
+1173.33,1176.23,1179.39,1188.47,1189.48,1194.58,1196.69,1203.29,1207.30,1211.78,
+1216.74,1220.91,1223.61,1224.64,1234.00,1236.09,1245.51,1244.67,1249.56,1254.90,
+1259.08,1259.86,1258.71,1271.26,1275.09,1279.95,1287.46,1290.07,1293.20,1295.21,
+40.16,44.18,48.93,51.12,56.55,58.28,63.20,66.14,71.08,73.81,
+79.29,80.81,86.64,89.07,93.62,97.22,101.41,104.39,108.05,113.44,
+117.71,122.22,123.95,126.72,131.49,136.94,139.94,144.02,146.60,152.16,
+155.63,158.41,160.30,169.14,171.03,171.22,179.37,182.53,186.31,189.63,
+192.88,196.38,202.17,203.92,209.39,212.36,219.18,219.74,222.86,227.93,
+229.39,235.85,241.13,241.61,249.47,251.58,255.09,259.73,263.48,268.28,
+269.17,274.39,277.33,281.26,288.13,288.55,289.83,297.81,299.59,304.19,
+309.17,313.43,315.82,319.53,326.75,324.36,332.12,336.25,339.11,344.01,
+346.92,353.48,357.05,358.67,364.91,363.74,370.05,374.53,381.89,385.77,
+383.20,388.99,393.63,394.97,398.12,405.98,407.39,412.08,416.39,421.42,
+424.74,428.19,429.62,432.37,437.78,442.94,447.06,453.73,452.98,459.37,
+462.49,466.15,465.50,473.81,475.61,482.94,485.22,487.44,492.21,498.51,
+500.47,501.74,509.97,510.40,515.48,519.46,523.68,525.23,528.81,535.87,
+537.38,543.45,544.57,552.43,558.02,563.00,562.06,564.18,570.73,574.22,
+577.20,578.92,585.38,588.95,593.27,595.01,602.07,602.99,609.37,609.96,
+618.30,617.06,622.77,626.17,630.27,632.27,641.44,645.02,643.40,651.39,
+654.18,657.62,656.38,666.46,674.19,671.32,674.71,678.88,687.82,688.41,
+692.55,697.14,696.86,700.99,708.39,711.26,715.33,721.00,719.34,728.04,
+731.14,739.83,739.48,742.93,741.13,751.22,754.79,755.51,765.53,766.18,
+764.54,771.93,773.92,773.84,781.40,791.32,794.67,797.14,794.05,805.55,
+810.27,811.27,816.68,820.99,819.42,825.46,829.50,838.50,839.36,840.88,
+846.18,855.66,849.00,856.19,860.81,868.16,870.52,873.21,877.75,878.32,
+885.98,884.07,891.44,889.96,896.21,903.94,905.63,913.84,917.70,916.17,
+919.82,925.62,928.84,934.35,937.78,941.97,945.83,952.15,948.89,956.79,
+960.48,965.82,969.24,972.57,970.29,980.67,988.05,990.16,991.06,999.84,
+993.88,1005.82,1007.73,1013.99,1011.32,1019.39,1021.58,1028.10,1028.73,1033.09,
+1037.49,1045.38,1042.48,1050.47,1053.49,1059.86,1056.73,1064.47,1072.74,1071.45,
+1077.43,1077.15,1082.12,1090.10,1088.64,1094.28,1089.16,1100.02,1105.41,1106.40,
+1118.51,1120.84,1121.52,1122.95,1129.72,1134.68,1137.83,1138.53,1143.00,1145.56,
+34.65,40.03,41.46,44.83,48.84,51.17,55.11,59.34,62.70,67.34,
+69.13,73.99,76.15,80.03,82.36,86.39,89.14,92.00,95.95,99.45,
+103.45,106.40,109.55,114.74,116.20,119.18,121.52,127.60,130.64,135.05,
+136.63,140.78,144.97,147.90,151.09,154.54,156.87,161.24,165.13,167.29,
+171.45,173.44,178.02,181.79,185.03,188.21,191.06,194.11,195.59,200.94,
+205.22,207.74,210.85,213.02,218.22,219.63,225.63,228.89,229.82,234.25,
+239.33,244.04,246.32,247.50,252.26,253.15,259.43,262.09,266.50,272.17,
+272.17,275.75,282.51,280.54,283.22,287.78,289.89,296.19,299.95,302.79,
+305.80,309.77,312.81,316.02,321.97,322.38,324.91,326.13,331.10,335.24,
+340.90,342.19,345.83,349.31,356.45,361.73,359.66,364.71,368.05,369.99,
+373.26,377.97,382.23,381.21,388.32,390.81,396.65,396.58,400.27,401.83,
+410.41,410.54,416.63,412.05,421.12,425.71,427.18,434.21,435.92,435.48,
+444.37,444.52,446.16,450.89,453.38,458.22,458.73,464.42,469.93,468.34,
+475.78,474.70,478.35,483.55,491.92,490.18,499.80,499.65,503.05,502.77,
+510.28,515.31,514.94,517.31,516.08,529.44,527.55,531.65,536.60,539.53,
+540.61,547.92,549.98,555.60,559.42,559.84,565.70,568.06,568.81,578.00,
+576.77,580.71,578.65,587.67,589.68,589.91,596.20,602.18,607.25,607.10,
+609.14,614.55,618.29,621.21,623.91,624.98,632.35,636.25,640.87,635.96,
+647.11,648.34,652.91,654.98,661.85,661.94,663.33,663.80,672.65,671.58,
+676.48,683.25,686.05,691.64,689.67,694.18,698.49,700.45,710.00,708.79,
+712.92,719.90,721.06,720.82,729.79,734.07,731.81,732.97,736.79,744.23,
+746.64,746.72,752.40,751.86,759.78,764.22,770.13,771.03,769.87,775.65,
+783.69,789.95,782.13,790.40,793.92,791.62,804.36,806.87,804.74,812.70,
+817.57,824.73,823.41,822.78,826.81,829.88,833.93,836.42,848.73,847.21,
+843.14,854.69,854.00,859.74,856.98,867.46,866.69,868.01,872.82,877.97,
+887.37,885.30,890.67,888.03,895.29,900.11,900.57,899.25,907.59,906.69,
+918.62,921.72,922.74,923.18,926.82,928.24,941.34,941.77,942.75,947.30,
+945.12,955.62,953.83,958.43,968.54,965.72,967.20,971.54,975.45,977.02,
+980.66,987.38,988.28,991.30,988.74,998.09,1004.11,1009.09,1012.11,1016.62,
+30.79,33.54,36.73,40.12,43.12,46.64,48.07,53.00,55.80,56.67,
+60.82,64.00,66.04,70.71,73.34,76.10,77.00,82.24,83.52,86.95,
+92.20,93.70,96.72,100.22,102.44,106.67,107.67,111.53,113.39,115.62,
+118.55,124.18,125.46,129.85,131.14,135.06,136.49,140.92,143.33,145.60,
+148.41,150.19,153.48,159.76,162.09,164.55,168.02,172.68,172.89,175.77,
+180.50,181.91,185.33,189.27,192.36,195.05,198.42,201.94,203.28,205.50,
+212.33,211.86,217.66,217.83,221.65,222.47,229.08,231.46,235.53,236.75,
+239.15,243.87,244.69,249.85,249.48,256.67,256.88,262.43,263.94,265.95,
+268.78,273.11,276.34,277.83,281.93,284.24,289.51,290.69,292.05,295.46,
+301.20,303.45,304.36,306.52,310.77,314.31,316.18,321.37,321.50,324.35,
+330.12,334.73,334.30,334.83,343.41,344.44,346.04,350.17,352.11,351.80,
+356.59,361.38,364.43,365.50,371.12,372.79,375.02,378.16,381.86,384.72,
+390.11,394.60,392.40,396.60,401.40,402.73,404.24,406.00,413.97,413.00,
+415.81,422.16,422.92,427.54,429.71,436.44,436.62,435.34,443.75,444.85,
+446.37,448.23,452.73,460.34,461.87,462.04,462.42,470.12,465.73,473.76,
+477.04,481.08,485.14,487.38,483.35,495.21,498.92,498.72,500.76,503.10,
+508.62,509.69,513.27,513.08,516.06,520.22,524.62,528.02,534.72,534.10,
+539.13,539.96,543.71,547.14,543.93,555.43,554.95,558.80,562.23,560.86,
+567.50,568.75,567.99,571.70,577.95,583.62,582.79,588.30,589.51,595.02,
+597.42,601.52,599.11,608.34,608.22,610.33,613.95,618.28,619.46,621.41,
+626.34,630.17,634.90,634.54,637.02,643.09,642.47,643.25,652.40,654.76,
+660.63,658.98,665.05,665.92,668.10,669.93,672.68,674.34,677.32,686.47,
+687.46,693.64,693.57,696.92,701.80,703.74,698.70,707.40,708.32,710.83,
+710.60,714.83,721.23,723.58,726.10,727.72,730.05,735.60,736.03,741.01,
+744.69,746.74,750.70,753.08,753.97,765.36,766.29,767.33,770.51,767.52,
+778.63,781.91,778.64,781.91,785.86,786.75,790.97,797.67,799.25,798.02,
+801.84,805.79,811.29,806.89,813.73,821.15,825.75,824.01,823.15,828.95,
+839.98,835.77,834.35,841.83,846.78,843.07,848.77,860.59,858.61,858.74,
+865.06,866.14,870.54,876.17,871.36,878.76,874.82,884.71,894.83,894.47,
+26.64,30.07,32.87,35.48,38.04,40.65,42.74,45.40,49.38,50.22,
+52.82,56.90,58.09,61.32,62.24,66.55,69.02,71.08,74.69,77.95,
+80.19,81.12,85.11,86.66,89.46,94.25,93.59,98.78,99.14,102.45,
+105.76,105.91,109.81,114.72,115.72,117.85,119.53,122.48,124.83,129.08,
+132.34,133.26,135.82,139.07,140.83,143.86,148.12,148.93,150.73,156.60,
+156.25,162.18,164.43,166.06,168.87,170.43,175.05,178.09,177.94,182.53,
+183.96,186.51,188.58,191.78,193.87,195.30,199.03,199.76,207.75,208.13,
+210.14,210.61,216.65,218.46,221.16,222.95,222.37,227.77,229.70,233.54,
+235.60,239.63,240.24,242.15,246.06,248.56,251.86,254.32,256.76,261.66,
+263.26,261.82,267.65,269.68,275.76,273.99,277.02,281.28,283.18,286.05,
+287.98,289.20,295.61,299.31,299.67,300.16,299.83,307.20,307.03,310.16,
+313.62,315.75,315.72,325.86,323.92,326.96,328.46,332.63,332.85,339.48,
+340.34,343.06,345.00,350.18,350.01,355.68,356.88,358.66,364.27,366.20,
+368.67,369.48,369.34,373.45,371.98,375.94,383.73,386.21,386.22,388.94,
+394.24,388.85,397.85,397.79,396.29,403.16,400.01,413.72,414.52,412.61,
+421.47,422.24,427.41,424.40,428.92,433.54,432.73,434.98,438.89,440.96,
+447.96,446.35,450.75,450.49,454.13,456.69,460.34,469.20,464.32,468.78,
+473.93,476.33,478.58,473.33,480.77,482.60,481.56,487.67,490.08,494.74,
+494.28,501.62,501.39,507.20,507.66,510.31,512.56,511.79,515.12,517.00,
+519.68,528.06,525.48,529.48,531.12,537.49,535.40,538.37,547.59,547.44,
+548.06,549.94,559.87,554.19,558.40,561.51,564.36,567.99,570.37,570.12,
+572.60,579.45,583.54,582.14,586.34,586.45,590.32,594.23,594.43,603.05,
+604.31,598.53,605.15,604.77,608.66,617.72,614.37,615.39,624.61,623.83,
+632.94,630.52,632.86,633.40,632.79,643.96,642.68,645.02,646.22,658.84,
+651.73,649.77,659.66,659.17,661.07,666.81,666.98,669.12,677.22,679.16,
+679.63,682.95,685.15,680.63,688.49,691.89,692.22,697.05,704.16,698.78,
+707.49,704.26,713.00,708.99,714.05,713.56,721.21,720.27,725.34,725.64,
+732.52,736.44,731.87,735.14,740.60,741.36,745.40,744.87,751.29,761.33,
+758.13,752.77,762.41,767.79,772.33,773.10,766.54,777.78,777.87,785.02,
+23.54,26.39,29.66,30.29,33.92,35.65,37.97,40.43,41.97,43.04,
+47.19,48.20,50.72,54.38,55.49,59.50,59.86,63.00,65.93,67.88,
+69.17,72.88,73.10,77.27,78.29,82.40,82.86,85.43,89.82,91.05,
+92.89,95.79,96.38,98.95,100.49,104.54,104.97,107.47,109.86,113.77,
+116.81,115.79,118.08,121.88,124.32,125.72,126.62,131.03,130.47,135.94,
+138.18,140.83,143.46,144.85,147.22,147.90,151.28,152.72,155.11,159.03,
+160.36,162.84,165.40,167.48,169.82,170.80,175.14,172.14,179.87,182.59,
+184.02,184.90,188.91,192.03,193.00,196.03,198.54,198.13,201.24,203.31,
+203.75,205.95,209.44,210.55,214.24,217.58,219.86,220.82,223.65,227.46,
+226.99,230.86,233.20,232.70,238.45,239.52,242.64,246.64,245.46,251.48,
+249.64,253.78,256.83,255.08,257.86,266.10,268.20,267.51,271.75,273.35,
+273.76,275.91,282.09,288.35,279.97,289.59,291.84,291.62,291.44,297.60,
+294.56,299.34,303.31,306.15,304.08,310.98,308.16,314.76,317.52,317.25,
+317.38,324.31,322.99,327.20,329.69,332.63,337.21,335.63,337.61,336.56,
+344.71,349.34,349.83,350.29,349.65,354.06,357.25,358.49,361.30,363.86,
+363.65,370.45,370.01,370.98,375.06,376.38,377.85,382.42,380.65,386.83,
+386.56,390.40,395.57,397.18,394.61,401.46,402.10,401.24,405.18,413.29,
+411.24,413.85,415.56,417.53,420.24,418.85,419.07,428.04,429.68,431.08,
+432.94,441.50,439.94,442.46,443.44,445.33,448.28,452.42,453.07,456.74,
+460.87,455.81,459.37,465.55,466.40,467.53,470.17,472.62,471.44,476.45,
+483.82,480.04,483.67,485.62,490.27,493.30,491.37,495.67,497.80,499.68,
+502.48,501.98,502.46,511.76,510.90,515.26,517.30,514.22,521.60,519.95,
+524.28,529.78,531.03,529.92,536.50,539.78,538.10,540.42,543.88,546.06,
+549.18,553.26,552.23,556.36,555.00,557.22,563.63,561.02,563.66,570.45,
+570.86,571.37,574.13,573.43,581.10,581.37,586.82,581.12,585.10,593.87,
+592.35,589.78,601.11,601.36,597.33,601.24,606.84,606.17,609.04,612.43,
+612.91,622.88,620.38,621.06,622.18,625.01,632.75,631.63,639.95,630.05,
+641.40,639.30,644.74,642.47,646.20,651.51,652.80,656.23,657.57,660.60,
+653.97,656.68,665.92,667.63,671.03,676.58,678.96,680.93,687.88,682.27,
+21.93,23.23,24.59,27.41,30.03,31.70,34.12,35.20,37.73,39.02,
+40.87,42.98,44.63,45.77,47.92,51.38,53.47,54.22,58.34,58.97,
+60.21,63.47,63.76,67.04,69.69,71.38,72.75,73.19,74.91,76.66,
+79.19,81.52,86.70,85.87,87.75,90.75,92.94,91.92,95.33,97.84,
+99.47,102.75,103.01,106.82,106.70,110.59,113.51,112.45,116.35,119.46,
+120.91,121.26,125.96,126.67,128.61,130.03,132.22,133.83,135.11,139.72,
+137.83,138.91,142.26,148.13,147.57,150.15,152.51,154.33,155.65,156.07,
+155.94,161.11,163.72,167.44,169.53,171.36,174.54,174.77,173.56,178.01,
+176.85,180.16,187.69,185.51,185.85,189.22,194.39,195.63,198.12,195.59,
+201.85,201.62,205.25,205.33,206.89,209.94,214.95,213.89,215.55,217.98,
+219.72,221.72,223.91,224.54,231.62,231.01,227.90,233.20,237.21,237.40,
+238.38,241.91,243.63,246.44,248.12,246.86,253.14,253.61,256.86,257.08,
+261.04,260.87,264.64,260.85,264.07,268.65,267.94,276.10,278.91,278.11,
+278.26,281.98,280.08,283.17,283.05,287.83,291.65,291.91,297.51,297.06,
+300.57,298.69,298.98,302.40,304.52,307.46,309.75,308.73,315.35,316.14,
+317.07,321.53,323.03,325.14,327.62,331.96,330.64,331.46,334.70,338.06,
+338.56,344.90,338.81,345.76,346.70,351.34,353.83,354.31,350.75,352.69,
+356.29,360.08,360.73,364.02,369.24,365.80,367.87,375.50,374.90,378.68,
+379.29,383.72,385.27,382.72,383.67,385.94,385.15,390.83,396.51,395.27,
+400.88,400.06,403.91,401.60,406.68,404.28,410.55,410.53,415.46,414.00,
+419.46,423.26,421.50,422.38,427.34,425.39,431.63,432.33,433.80,435.03,
+438.80,440.32,441.54,444.55,448.54,451.52,450.22,449.06,454.21,458.56,
+456.54,458.20,460.59,465.58,462.56,468.73,471.11,471.56,473.90,473.17,
+472.14,476.94,484.35,488.77,486.69,485.62,488.07,493.12,494.28,496.84,
+492.34,499.92,503.93,504.23,504.00,507.28,509.18,507.31,512.71,513.40,
+516.90,519.19,519.89,520.58,524.33,525.93,528.98,528.78,529.90,535.23,
+537.55,539.26,539.55,543.50,543.05,549.77,545.11,550.65,549.53,554.65,
+558.07,560.59,561.12,560.89,562.60,569.60,570.66,569.17,573.75,575.50,
+578.93,577.40,578.03,578.21,590.15,585.08,586.45,591.56,588.61,594.64,
+18.12,20.11,22.64,23.30,24.34,25.78,27.72,30.32,31.42,34.55,
+33.37,38.01,40.19,40.79,41.44,42.60,43.20,48.97,49.56,51.30,
+51.76,54.22,56.62,58.15,61.12,61.36,65.03,66.49,64.83,69.00,
+70.53,71.44,74.08,76.01,76.51,78.44,78.93,81.10,85.01,86.81,
+87.00,90.06,89.42,93.66,93.83,96.87,97.28,97.33,102.99,105.73,
+104.95,106.74,110.91,110.07,113.67,113.31,113.60,113.11,119.84,120.96,
+120.67,123.24,124.36,126.61,128.01,129.29,131.45,134.21,134.41,136.80,
+139.07,139.34,141.75,143.19,147.77,146.25,145.22,152.35,151.19,158.46,
+154.61,159.51,161.70,158.44,165.94,163.14,168.56,170.32,171.95,170.56,
+173.45,176.95,180.82,179.24,180.62,182.17,184.61,184.75,192.31,187.70,
+189.01,190.21,194.47,195.95,196.82,196.04,202.03,203.74,206.92,208.22,
+209.60,214.86,212.45,215.00,212.58,217.78,221.79,221.68,223.59,223.08,
+227.58,227.57,228.20,231.38,236.75,230.44,232.65,239.51,239.25,242.21,
+243.35,242.53,246.35,246.19,250.65,253.12,252.56,257.00,258.34,256.43,
+257.12,262.18,263.77,264.75,265.27,272.04,271.83,275.03,272.03,278.46,
+277.06,279.84,280.02,282.31,282.01,283.86,287.93,290.75,293.05,293.01,
+293.83,300.04,299.13,296.80,304.54,304.64,307.82,304.61,311.00,314.79,
+310.32,313.05,316.82,315.79,316.27,322.57,321.07,324.74,326.56,329.73,
+334.18,330.78,332.63,339.42,333.82,335.86,343.14,340.95,342.10,346.20,
+343.90,348.87,346.51,353.74,351.32,353.04,360.02,357.60,355.44,363.52,
+362.57,367.78,364.35,375.92,367.35,372.11,373.03,377.14,379.34,382.08,
+385.41,379.64,385.74,382.92,389.86,390.04,393.54,390.53,387.85,397.69,
+395.98,397.10,403.48,408.18,404.03,408.92,410.94,414.59,410.40,414.25,
+414.87,417.67,421.21,419.90,423.75,424.38,428.20,428.10,424.15,430.95,
+433.81,434.67,434.35,439.91,437.27,442.73,442.85,442.38,446.94,448.86,
+447.71,448.29,453.47,457.88,461.47,457.15,457.20,464.11,464.53,463.02,
+464.41,470.19,473.33,471.07,472.20,481.86,470.51,483.67,480.50,481.59,
+481.87,487.99,489.22,486.96,489.72,492.15,491.13,498.18,497.51,504.71,
+501.26,501.48,506.05,504.59,509.61,508.68,513.23,514.54,512.86,517.21,
+16.17,17.19,18.67,19.57,21.25,23.77,25.04,25.66,27.95,28.93,
+30.42,32.69,32.05,35.94,37.76,39.02,39.67,39.90,41.73,44.19,
+46.48,47.38,49.77,49.16,51.01,54.15,54.83,55.07,58.58,57.46,
+61.25,65.04,64.60,65.47,66.28,67.73,68.86,72.15,74.78,77.51,
+74.73,77.88,76.88,83.54,79.89,82.37,84.48,84.75,86.90,89.68,
+91.46,90.34,92.06,98.06,95.60,96.83,98.09,102.92,104.12,105.08,
+104.02,105.81,108.33,108.29,113.72,113.04,115.25,116.22,116.06,119.56,
+121.38,120.25,122.58,124.71,125.99,125.35,129.34,132.38,133.05,134.81,
+136.42,135.13,138.82,138.99,140.38,142.38,147.43,146.03,149.60,150.08,
+153.00,154.64,151.18,152.10,156.95,156.70,158.63,159.97,165.55,164.90,
+162.06,165.46,165.62,171.06,168.44,172.20,174.65,177.72,177.28,185.23,
+178.72,183.28,184.41,184.75,185.96,189.25,187.55,190.44,191.59,191.32,
+195.06,194.93,199.13,202.04,201.59,202.34,208.93,203.56,204.97,211.21,
+211.42,212.12,213.38,216.71,220.16,219.66,220.16,220.96,220.09,224.11,
+224.75,225.72,226.75,230.09,232.26,235.73,237.28,241.01,235.69,237.05,
+244.08,239.81,246.06,241.66,250.14,251.10,249.99,250.75,249.98,255.37,
+255.07,257.87,261.19,259.58,263.63,265.11,266.71,267.43,270.62,267.80,
+270.94,274.96,273.93,275.76,276.46,277.69,279.95,281.76,280.80,284.48,
+284.11,284.53,289.22,292.83,292.92,292.04,290.90,297.22,296.94,299.22,
+300.29,301.34,306.29,305.39,308.66,303.77,306.72,310.24,312.44,310.77,
+314.23,318.83,317.71,321.53,318.29,323.60,328.29,327.77,327.73,326.68,
+329.84,328.67,334.52,336.25,332.64,336.94,341.75,335.65,338.71,343.42,
+350.65,346.58,352.35,349.82,352.49,350.94,354.86,356.20,350.89,358.72,
+360.29,362.17,363.79,365.85,368.51,368.06,371.43,371.48,372.30,372.74,
+374.66,376.38,378.22,382.58,380.91,386.80,386.36,386.87,384.11,388.72,
+390.62,392.52,390.53,389.04,397.19,396.59,398.65,402.49,404.21,401.38,
+406.46,404.71,407.81,409.06,412.91,412.71,410.02,419.66,419.35,417.72,
+420.51,422.64,424.57,421.68,425.31,421.93,430.38,427.64,429.71,434.30,
+435.71,436.72,436.74,446.02,435.39,444.05,442.50,443.36,446.14,448.63,
+13.21,14.61,16.49,17.25,18.56,20.35,22.59,22.96,25.02,24.99,
+27.77,27.09,30.21,30.11,31.98,29.79,34.26,35.33,37.85,38.85,
+40.40,41.50,43.02,42.55,43.89,45.82,48.82,48.57,49.98,50.47,
+53.80,52.59,54.47,57.64,57.61,59.60,59.08,61.13,61.81,65.09,
+65.55,68.04,66.78,68.63,69.59,72.62,72.38,74.85,77.43,74.12,
+78.50,79.73,79.08,81.19,82.81,84.65,85.65,86.22,93.42,90.20,
+94.01,95.18,96.64,94.25,97.70,99.51,100.19,100.41,103.45,103.42,
+105.04,104.73,105.12,107.19,109.30,109.79,112.81,112.57,116.05,116.28,
+119.88,118.39,119.59,120.01,124.89,123.48,124.97,128.28,126.95,128.28,
+131.78,130.98,134.46,135.62,135.39,135.82,139.59,139.93,143.17,139.59,
+146.58,144.04,150.12,144.79,146.92,151.62,150.53,153.07,155.00,156.49,
+155.08,155.46,159.40,159.62,162.02,164.72,167.72,164.59,165.05,168.72,
+167.85,174.60,172.07,174.81,172.13,175.99,172.22,177.73,181.56,182.41,
+182.02,184.63,182.03,186.66,188.35,188.59,194.26,194.44,193.43,195.50,
+197.30,198.63,198.70,197.73,200.46,201.68,202.92,207.62,208.94,207.80,
+206.62,211.19,213.96,210.16,211.98,213.72,215.98,216.38,215.83,222.33,
+219.43,221.61,226.67,220.36,226.51,231.35,233.42,231.03,232.41,233.89,
+233.87,232.83,238.83,238.53,237.93,239.98,243.99,244.78,247.98,244.48,
+248.04,247.54,250.49,250.73,250.36,251.69,255.95,256.27,256.56,260.26,
+260.73,259.76,263.56,261.95,269.28,263.81,267.89,273.62,266.34,274.67,
+274.29,274.60,271.20,277.46,276.08,278.95,282.54,281.11,282.74,285.33,
+289.29,287.97,290.67,292.36,289.13,291.49,295.69,294.31,295.68,299.42,
+299.37,300.94,300.63,299.39,304.94,306.92,306.54,304.30,312.26,313.14,
+316.86,312.08,314.52,316.21,319.88,318.25,322.93,318.30,325.83,323.06,
+323.51,323.66,330.26,326.33,329.15,332.29,335.15,335.83,337.60,331.70,
+338.72,341.86,343.36,346.82,344.62,344.02,348.66,351.19,349.45,347.31,
+348.36,350.57,353.87,350.79,357.05,356.55,360.77,361.57,363.41,359.15,
+366.71,361.64,364.85,366.29,369.38,372.87,373.08,371.56,374.88,375.66,
+381.00,380.68,378.75,382.14,380.48,380.35,385.96,384.24,384.70,391.08,
+12.34,12.76,14.70,16.31,16.22,16.71,18.96,18.99,21.72,22.59,
+23.56,25.26,23.76,26.66,26.62,29.45,29.34,31.68,32.35,33.56,
+34.43,34.92,36.99,36.54,38.80,40.60,40.71,43.44,42.24,44.57,
+47.70,47.44,49.39,50.79,49.29,52.22,51.94,52.23,54.51,54.87,
+59.52,58.60,57.89,61.78,60.00,62.69,63.49,64.46,65.00,66.74,
+66.56,71.12,70.77,70.41,71.82,72.00,75.23,75.90,77.97,76.26,
+79.73,78.86,79.88,81.66,83.55,85.26,87.33,87.85,90.53,92.39,
+87.50,90.23,91.84,91.52,95.47,92.58,97.19,100.53,100.75,100.85,
+100.04,101.95,106.23,104.84,107.19,107.02,110.53,111.23,111.30,110.57,
+112.38,114.43,114.57,118.99,117.02,119.45,122.53,121.93,125.22,121.33,
+123.49,125.90,125.37,128.85,130.88,128.88,130.59,133.94,133.50,133.50,
+134.63,135.58,135.49,137.58,136.30,140.47,142.05,140.75,144.32,144.30,
+146.90,151.05,153.15,151.49,149.71,152.97,154.67,151.47,152.96,156.49,
+155.60,161.43,162.69,160.94,161.71,164.50,163.76,168.77,167.01,168.76,
+167.87,172.90,173.77,173.62,173.90,173.76,178.86,175.82,174.68,181.13,
+180.20,182.08,183.78,180.41,181.72,185.96,183.65,189.71,191.21,188.03,
+195.56,188.28,191.08,195.26,196.21,196.24,197.57,203.58,196.18,205.79,
+201.29,200.69,208.26,208.06,209.75,209.59,209.09,209.49,212.64,213.83,
+214.90,213.34,214.90,217.61,217.59,217.67,218.47,225.01,222.97,223.46,
+226.04,225.51,227.94,231.73,230.08,229.02,236.44,232.78,231.76,234.31,
+241.60,239.67,241.96,239.43,236.70,240.00,245.06,241.15,248.46,248.01,
+251.12,249.43,249.69,254.25,250.39,250.33,254.19,250.85,256.96,256.18,
+254.63,258.21,258.25,260.24,261.61,266.26,263.74,265.37,269.05,269.05,
+271.00,272.75,272.44,272.09,272.22,274.05,280.02,276.56,275.59,282.52,
+281.26,279.10,286.36,284.09,285.41,290.49,289.49,291.14,293.81,289.91,
+291.30,296.57,295.33,294.38,294.62,298.98,297.46,304.92,299.07,301.66,
+298.64,307.19,310.58,305.98,303.95,310.65,309.27,307.86,312.11,313.82,
+318.69,311.30,324.46,317.11,325.24,319.35,320.94,320.62,326.16,327.30,
+327.99,327.21,330.41,325.25,326.82,333.02,334.88,332.96,335.93,333.60,
+10.66,11.62,12.05,13.86,13.61,14.47,16.27,16.53,18.09,19.45,
+19.25,20.04,21.57,22.29,24.09,25.36,25.95,25.87,28.19,28.23,
+29.38,29.89,32.07,31.22,33.88,33.91,34.94,35.63,37.73,38.30,
+39.16,40.99,39.76,41.60,43.60,43.85,44.51,45.36,48.54,49.18,
+47.94,50.07,50.28,52.38,52.07,53.33,54.04,53.44,56.31,57.55,
+60.13,60.23,59.80,60.40,62.25,64.17,64.43,64.21,66.11,69.17,
+67.11,70.05,69.25,70.84,74.17,73.17,74.16,75.70,78.28,74.51,
+77.46,79.97,82.00,80.84,83.22,83.43,85.78,85.69,85.17,86.92,
+87.21,86.65,88.99,88.51,90.02,92.64,94.13,93.97,94.37,96.59,
+99.58,98.70,101.30,101.15,103.78,104.93,104.77,105.94,107.66,107.21,
+106.60,105.72,109.33,114.74,111.15,112.54,112.58,114.33,114.54,113.61,
+116.25,117.33,122.00,122.84,120.08,121.09,122.69,122.33,124.75,125.78,
+128.61,128.18,129.39,127.96,131.81,130.48,132.88,133.32,136.43,134.27,
+136.60,135.00,136.65,138.54,141.03,138.58,141.62,142.50,142.81,142.64,
+147.03,146.77,147.56,148.20,148.34,152.69,147.26,148.82,154.54,153.42,
+153.68,155.42,156.03,159.62,159.33,163.12,161.68,159.74,165.42,163.52,
+163.05,164.56,167.12,169.55,169.00,168.73,167.86,169.66,172.35,174.63,
+173.59,172.31,176.28,174.82,182.58,180.12,178.39,184.30,183.26,183.61,
+183.84,184.01,183.14,188.16,187.01,189.20,194.50,191.61,191.67,197.24,
+195.11,195.20,195.97,200.83,201.95,198.81,200.78,197.19,199.15,203.57,
+205.29,204.00,205.76,206.00,208.37,208.27,205.66,212.57,211.73,212.22,
+216.46,217.72,218.99,214.36,216.48,217.11,220.36,217.74,218.38,224.17,
+227.07,222.82,224.73,232.65,227.40,224.20,228.12,229.67,232.88,237.17,
+231.41,231.37,235.74,236.09,239.51,240.10,239.14,240.37,239.01,239.69,
+245.92,244.58,246.08,241.78,244.26,244.74,252.99,249.54,246.09,251.78,
+253.80,255.12,252.50,257.17,253.98,257.65,259.82,260.94,259.44,262.07,
+260.07,264.88,265.72,268.95,266.57,270.43,270.07,266.32,271.96,273.88,
+273.01,271.40,271.55,271.51,273.90,280.23,278.12,279.69,276.59,279.40,
+287.09,283.82,287.18,282.10,288.11,282.67,284.75,290.06,291.95,289.40,
+9.01,10.11,10.67,10.80,12.64,13.45,13.97,14.04,14.45,16.86,
+17.08,16.79,18.01,20.69,20.83,21.98,22.44,23.70,23.90,26.01,
+24.74,28.28,28.05,27.85,28.96,29.65,31.93,30.66,31.40,32.33,
+32.75,34.12,34.35,36.23,37.81,37.41,38.26,37.91,40.22,41.24,
+41.66,41.83,41.71,43.88,46.82,45.82,46.10,48.15,47.97,47.77,
+49.43,50.56,51.40,53.50,54.66,56.39,55.99,56.02,54.80,58.58,
+59.38,58.27,60.49,62.86,61.65,64.61,62.48,65.73,64.85,66.70,
+69.67,67.61,69.89,68.95,69.11,71.04,72.62,73.32,74.26,73.68,
+75.55,77.29,77.03,77.98,80.80,79.81,79.03,83.85,83.51,85.73,
+84.53,82.50,86.19,87.96,86.15,89.50,89.46,90.10,92.30,93.03,
+92.33,92.59,93.32,95.22,95.27,97.90,99.29,98.06,100.01,101.43,
+102.74,101.27,101.84,103.53,101.45,105.12,107.86,105.02,105.61,108.03,
+110.33,109.86,109.20,111.61,112.89,111.67,115.05,115.58,118.05,118.33,
+118.72,116.93,117.41,121.82,123.49,120.28,120.82,121.11,126.06,124.35,
+127.73,123.48,129.85,126.52,129.77,132.70,128.32,132.79,131.57,133.78,
+133.93,135.48,136.94,139.03,138.65,135.74,138.69,140.51,142.76,142.89,
+139.57,142.95,143.63,142.28,141.68,147.32,147.62,146.28,149.75,152.82,
+151.85,146.44,156.59,151.66,154.20,154.27,158.79,156.48,159.18,156.08,
+160.40,158.06,158.92,162.59,162.09,168.33,161.79,161.66,160.95,166.65,
+167.85,170.68,169.20,170.85,173.16,169.93,174.24,173.87,172.37,175.82,
+172.72,175.73,174.98,178.02,178.84,181.29,182.46,180.72,182.70,185.27,
+185.90,184.85,186.86,188.59,187.94,189.31,187.71,185.84,191.34,190.20,
+194.09,193.91,194.48,195.07,195.96,196.59,196.93,200.00,198.22,200.06,
+202.31,200.70,204.61,207.48,203.90,202.72,209.11,208.59,205.45,209.59,
+210.19,211.43,210.39,210.47,206.63,215.16,210.55,212.88,216.78,220.78,
+216.50,218.44,222.08,218.71,222.07,214.82,218.83,225.99,224.39,228.12,
+225.42,226.74,226.22,230.63,227.87,233.44,231.81,232.39,234.15,234.29,
+236.72,237.17,237.69,237.45,238.38,235.53,238.71,242.68,238.58,242.20,
+241.31,241.07,245.28,240.22,243.05,244.93,248.21,249.90,247.80,253.82,
+7.54,8.81,9.39,9.55,10.08,10.94,11.51,12.83,13.78,13.60,
+15.42,14.95,15.22,16.65,15.38,17.93,17.90,20.11,19.63,21.15,
+22.09,21.56,24.31,24.92,24.45,25.32,26.47,26.52,28.75,29.08,
+29.15,28.92,32.13,31.95,30.99,33.98,33.23,33.30,33.12,34.59,
+36.25,36.84,36.07,39.53,41.16,40.28,41.33,40.88,41.59,43.16,
+42.79,44.54,44.54,44.53,46.97,47.19,45.24,49.90,48.88,49.09,
+50.87,52.37,49.80,52.95,56.15,54.50,57.46,54.48,54.02,56.21,
+58.47,58.40,58.99,57.81,60.16,63.21,61.50,64.95,65.06,65.40,
+64.53,65.33,66.04,65.77,68.49,67.93,70.48,67.84,71.26,70.81,
+68.61,74.26,73.02,72.65,74.95,77.38,72.58,76.59,79.00,77.63,
+79.90,79.86,83.19,80.38,83.36,82.17,85.28,82.97,85.18,84.08,
+86.61,86.24,86.14,88.44,88.95,92.42,90.54,90.02,90.69,96.14,
+94.63,98.23,98.21,96.33,99.00,96.70,98.43,97.27,101.58,105.25,
+99.72,98.21,102.12,103.10,106.44,104.02,106.56,107.83,106.58,108.05,
+108.94,107.91,110.21,111.14,109.51,109.81,112.85,114.36,114.24,117.16,
+113.87,115.58,117.77,117.61,117.72,116.05,119.57,122.26,119.31,121.22,
+118.64,121.24,124.10,126.55,127.61,128.40,127.78,127.42,128.53,130.41,
+131.31,129.82,129.96,136.27,133.37,132.23,131.65,134.04,136.50,133.93,
+134.07,138.75,141.48,137.66,137.89,140.91,141.51,145.70,144.17,143.13,
+147.12,144.28,146.60,144.48,149.02,149.38,149.18,148.84,151.95,150.71,
+151.19,150.75,154.61,155.32,156.34,152.83,154.63,156.39,156.56,159.24,
+159.93,156.94,161.44,161.61,161.21,161.36,163.97,162.90,163.51,166.15,
+166.42,164.37,171.21,167.79,168.45,164.08,173.65,172.29,168.57,175.84,
+169.82,175.80,175.72,176.72,175.46,176.24,179.84,175.07,176.15,174.90,
+177.25,179.98,182.63,180.48,185.38,183.17,183.28,183.05,182.53,187.39,
+182.39,185.12,190.85,190.29,190.83,189.50,190.98,192.50,190.43,194.96,
+195.82,197.39,192.03,194.34,195.33,198.56,200.25,198.22,201.26,203.81,
+200.74,202.21,202.66,207.88,201.54,205.69,207.84,210.09,207.45,208.31,
+210.39,212.30,210.38,213.14,213.69,214.01,216.89,211.19,216.14,222.91,
+6.37,7.19,6.85,8.33,8.88,10.05,10.27,10.95,11.14,11.88,
+13.17,12.69,14.64,15.14,14.69,15.51,17.25,16.59,17.07,17.95,
+18.15,18.20,20.69,20.66,21.82,22.06,22.54,24.01,24.26,25.26,
+23.27,26.41,26.49,26.11,28.52,27.90,27.67,28.18,32.16,30.11,
+31.94,32.34,33.31,32.51,33.20,32.89,35.72,36.22,36.01,37.52,
+37.89,37.11,39.30,38.93,38.75,40.80,42.32,41.34,42.83,43.24,
+43.92,43.94,43.70,44.57,45.71,47.16,47.09,47.87,46.85,48.97,
+47.46,51.23,52.17,52.30,51.59,55.03,52.90,54.76,54.21,55.86,
+55.31,56.41,55.20,59.29,58.60,60.77,61.84,60.31,62.45,61.35,
+62.15,64.00,61.46,65.23,66.12,66.49,66.57,65.41,67.75,65.53,
+67.34,66.60,70.28,69.59,70.08,71.37,71.12,73.51,77.75,73.74,
+72.38,76.07,75.53,74.87,74.56,76.75,79.95,78.04,78.74,78.53,
+80.95,81.82,81.34,82.15,84.62,83.42,84.71,83.29,87.09,85.46,
+85.15,86.57,89.13,89.12,87.73,87.78,88.65,91.27,92.85,91.77,
+94.51,94.05,95.64,95.87,100.07,98.82,97.25,97.06,97.16,98.49,
+98.01,98.14,101.19,100.19,101.18,103.03,101.58,100.98,103.50,102.86,
+103.36,107.53,105.76,106.27,105.75,108.15,108.70,111.94,109.54,110.83,
+113.48,112.40,109.99,113.42,114.73,114.06,114.44,117.10,119.47,117.60,
+116.58,117.45,119.21,116.89,119.70,121.69,121.71,120.08,122.37,120.48,
+123.78,123.41,126.10,126.18,125.02,129.17,127.89,127.44,129.30,131.47,
+129.03,129.75,130.52,131.31,134.08,134.46,133.10,133.43,133.69,135.84,
+137.35,138.60,136.14,140.03,138.11,141.63,137.97,140.93,143.02,144.66,
+143.24,142.22,144.22,143.38,144.50,149.41,148.03,146.13,148.86,148.07,
+152.50,150.32,149.03,153.03,152.02,152.29,155.71,152.95,154.16,152.69,
+155.11,153.53,156.20,159.99,156.00,159.67,159.55,155.93,160.81,160.42,
+156.75,160.41,160.84,165.29,165.68,163.69,166.07,165.87,167.84,168.43,
+169.95,165.70,164.35,169.37,168.98,170.62,167.13,170.22,173.00,168.73,
+172.64,175.96,172.82,174.26,173.34,180.55,172.96,176.37,177.13,175.19,
+180.76,178.57,182.84,177.81,184.12,183.70,186.97,185.83,185.63,183.50,
+50.11,54.92,58.33,64.07,67.96,73.68,77.49,84.08,86.85,92.23,
+96.12,103.06,106.53,109.68,115.70,120.29,123.50,130.93,135.25,139.53,
+143.40,147.33,152.96,156.80,162.78,166.86,171.54,177.06,182.00,186.36,
+192.88,195.44,202.14,204.52,210.77,214.17,219.11,223.59,228.51,234.38,
+239.54,242.21,247.87,252.49,256.95,261.64,265.52,271.84,277.49,279.14,
+285.07,290.59,292.93,298.24,304.02,310.05,311.67,317.70,321.17,327.13,
+333.20,338.52,336.95,344.48,349.17,358.42,359.73,366.25,367.83,371.82,
+376.42,381.80,386.90,395.19,399.80,402.21,408.79,409.76,416.69,421.61,
+426.73,429.45,434.39,441.82,444.29,448.50,454.48,461.21,465.90,467.04,
+474.51,478.46,483.25,488.69,492.73,498.92,503.48,503.44,511.38,514.70,
+516.12,526.77,529.10,538.13,536.60,543.05,550.00,554.09,560.42,563.96,
+569.84,571.03,577.48,580.18,585.19,589.51,593.18,601.61,601.36,608.50,
+612.55,623.77,621.90,626.34,631.89,639.66,639.89,644.55,651.87,654.20,
+663.50,668.18,670.39,673.19,679.93,682.75,685.01,694.69,700.48,706.54,
+712.85,714.88,719.71,721.10,731.75,732.49,733.85,737.27,744.25,748.75,
+750.36,758.52,764.97,774.69,777.10,778.97,783.73,787.25,790.50,798.93,
+800.12,807.68,809.43,816.57,817.89,824.51,827.89,835.24,841.63,844.72,
+846.77,856.08,856.04,864.82,868.21,873.36,876.97,882.38,885.71,891.74,
+895.35,902.25,902.17,912.17,917.86,919.20,926.59,932.76,939.45,936.48,
+939.58,949.98,952.95,956.89,957.31,967.34,972.08,976.87,981.09,988.34,
+994.53,997.82,998.15,1003.51,1013.12,1015.68,1013.04,1026.50,1019.05,1032.33,
+1039.54,1044.78,1045.63,1056.23,1057.25,1061.65,1069.84,1073.50,1073.10,1081.02,
+1080.93,1088.93,1092.85,1098.82,1105.92,1111.06,1110.10,1113.57,1130.19,1126.43,
+1126.21,1137.06,1142.87,1145.31,1147.06,1157.97,1156.96,1162.91,1168.35,1171.05,
+1180.69,1184.51,1188.22,1191.22,1194.55,1201.10,1208.35,1210.05,1215.81,1220.54,
+1223.57,1232.57,1237.33,1244.78,1247.99,1252.61,1254.15,1254.64,1267.59,1269.64,
+1268.52,1275.38,1278.22,1283.87,1291.47,1296.18,1300.00,1306.01,1307.04,1318.62,
+1322.46,1327.71,1327.77,1338.86,1337.04,1338.39,1348.64,1351.93,1356.00,1362.69,
+1368.96,1375.93,1374.95,1380.09,1387.62,1387.96,1392.24,1401.04,1401.84,1411.28,
+43.66,48.22,53.32,56.92,62.30,66.44,69.96,74.45,79.63,81.96,
+86.50,90.43,94.42,99.51,102.90,107.61,110.39,115.43,120.26,124.25,
+128.63,132.46,136.78,143.73,145.84,149.99,153.52,158.77,161.56,164.34,
+170.55,173.31,178.62,182.57,187.19,190.15,197.02,200.71,206.04,207.97,
+212.96,218.01,222.05,226.64,231.58,234.49,235.68,242.66,244.78,251.38,
+254.23,259.12,263.90,267.26,273.51,277.33,280.19,284.49,289.85,291.97,
+299.59,303.53,304.89,308.93,313.34,318.60,321.78,324.63,331.98,335.14,
+338.21,342.12,347.88,353.96,356.07,359.33,363.58,367.77,374.28,374.22,
+382.67,384.87,389.83,395.29,397.39,402.83,407.31,412.30,412.71,417.87,
+423.83,426.91,431.43,438.67,439.10,444.05,452.16,451.68,454.47,463.14,
+466.42,467.05,474.75,481.94,483.14,484.86,491.64,494.56,498.45,500.12,
+508.61,511.17,514.36,519.86,525.27,528.38,533.55,533.62,544.29,547.98,
+552.14,555.98,560.06,561.78,569.39,567.52,574.88,579.87,584.48,587.84,
+593.29,597.28,598.85,601.96,608.15,614.04,621.99,620.67,625.57,630.43,
+632.52,639.71,645.84,648.75,652.96,653.80,658.22,665.09,669.18,673.01,
+677.08,680.03,683.08,689.16,692.93,694.28,702.75,706.66,711.21,715.26,
+718.26,721.02,726.57,732.32,739.01,740.41,748.69,747.47,750.03,758.26,
+763.97,767.96,768.22,773.59,779.76,784.65,786.25,790.42,794.57,799.35,
+802.99,804.98,811.30,814.41,819.39,824.73,826.63,829.81,833.60,841.43,
+846.69,842.77,856.78,855.67,861.46,867.78,867.93,871.80,878.47,881.69,
+889.46,894.66,898.19,900.54,909.33,908.98,911.45,913.98,921.51,924.92,
+928.42,937.92,939.12,941.73,942.80,948.29,950.96,956.48,959.92,971.14,
+967.25,973.55,979.20,987.15,985.27,992.58,997.44,996.42,1005.12,1008.96,
+1012.72,1014.86,1022.45,1026.64,1029.74,1038.60,1041.73,1038.45,1043.82,1054.72,
+1056.74,1059.44,1063.11,1067.50,1073.86,1071.40,1079.38,1083.24,1088.19,1095.74,
+1098.86,1099.42,1108.41,1109.20,1114.48,1116.54,1125.37,1125.65,1130.81,1137.92,
+1140.43,1146.34,1151.88,1157.65,1152.84,1166.70,1165.71,1167.00,1177.55,1176.10,
+1183.35,1183.69,1196.27,1189.95,1196.86,1198.96,1207.87,1212.73,1221.91,1214.23,
+1219.66,1226.98,1235.50,1229.82,1242.55,1246.57,1255.68,1256.59,1254.33,1261.71,
+39.48,43.69,47.26,51.08,54.73,58.06,61.00,66.62,69.74,73.28,
+76.95,80.65,84.47,88.06,92.82,95.61,99.30,104.28,106.34,111.21,
+113.21,117.96,121.04,124.27,130.24,132.83,136.12,141.85,145.45,148.42,
+152.96,153.05,159.42,161.52,167.03,168.46,176.10,177.56,181.78,186.90,
+190.56,195.13,197.62,203.00,205.19,209.61,214.46,217.21,219.33,225.54,
+225.28,232.39,234.69,237.53,243.85,245.73,251.84,253.29,259.54,263.39,
+266.88,270.28,274.65,276.58,279.76,283.23,290.24,288.79,294.31,296.97,
+301.09,305.58,309.54,314.82,319.37,317.61,329.36,328.00,333.24,340.06,
+341.33,345.46,347.35,354.79,357.43,359.60,359.50,366.79,368.26,376.39,
+378.19,381.16,384.88,388.28,392.34,397.97,402.36,400.15,407.94,408.76,
+415.34,420.32,419.82,428.01,430.23,435.17,440.41,444.27,444.59,453.13,
+454.05,460.06,457.34,464.97,468.73,469.09,474.21,480.13,486.90,483.53,
+490.25,494.93,497.77,498.56,507.88,508.27,516.05,514.04,517.96,522.60,
+529.48,533.21,535.13,538.82,543.44,545.80,548.52,557.60,556.59,559.89,
+564.89,570.85,576.07,575.71,579.48,579.79,590.84,592.46,596.18,601.31,
+601.80,605.80,612.14,611.94,620.74,619.35,625.07,626.97,634.22,637.63,
+638.95,643.69,646.29,651.80,653.58,654.71,665.59,668.24,672.50,674.41,
+676.51,681.94,688.33,691.36,695.18,695.66,702.99,704.09,705.16,710.90,
+717.13,717.31,722.71,730.06,730.05,730.89,735.96,738.53,744.51,749.47,
+756.36,758.37,762.33,764.87,764.69,773.13,774.96,778.10,784.41,785.52,
+788.89,794.06,800.88,798.07,804.30,810.28,816.90,823.20,826.64,822.76,
+828.19,831.09,837.33,836.80,843.95,847.78,852.99,858.33,861.51,859.91,
+865.96,863.19,874.58,871.26,879.70,887.48,884.00,894.01,895.14,895.12,
+900.73,905.31,916.66,911.05,916.17,925.29,927.80,930.81,935.81,941.00,
+942.10,949.50,949.50,947.46,958.13,964.34,962.08,966.24,968.65,977.53,
+985.04,981.94,988.83,990.40,992.04,994.19,1006.61,1004.67,1006.00,1008.28,
+1013.13,1022.32,1022.72,1025.63,1033.43,1034.33,1040.40,1045.57,1048.75,1048.48,
+1050.61,1054.85,1056.87,1064.43,1069.07,1075.01,1081.83,1083.57,1083.66,1090.74,
+1091.10,1092.02,1098.45,1101.53,1113.31,1111.47,1116.94,1118.33,1119.83,1120.48,
+36.46,37.66,41.48,45.20,49.14,51.99,53.92,59.76,60.87,63.78,
+69.06,73.03,74.47,79.61,82.15,87.32,89.26,91.27,93.31,97.99,
+100.73,107.00,108.77,110.19,112.91,117.74,121.76,125.96,129.12,132.71,
+136.65,139.30,141.61,143.73,147.22,151.77,155.58,159.97,159.00,165.30,
+168.79,174.54,175.22,179.17,180.30,186.46,188.84,194.85,196.39,201.26,
+202.26,206.97,208.86,212.72,211.72,218.60,220.00,224.87,229.26,228.29,
+233.44,238.14,245.14,248.27,247.54,253.87,255.98,258.68,261.33,265.14,
+267.19,271.33,277.74,279.45,282.74,286.93,289.43,293.17,294.14,301.63,
+301.76,304.99,308.14,313.70,313.28,318.96,322.24,323.98,331.15,329.54,
+337.04,336.24,342.51,345.30,350.26,351.80,353.46,358.79,363.26,366.59,
+370.88,374.77,374.03,379.93,380.56,386.61,389.05,395.24,395.06,398.23,
+403.88,406.60,412.19,410.25,416.70,421.23,421.37,424.70,426.92,433.25,
+435.39,438.75,446.96,441.82,446.16,451.17,454.19,457.72,463.63,462.46,
+469.32,473.07,473.06,480.77,483.47,483.48,489.10,490.14,496.58,498.08,
+498.35,504.55,508.25,510.66,517.03,519.39,525.62,526.08,530.37,533.95,
+536.01,535.99,542.46,543.55,549.84,553.11,557.82,558.58,561.28,570.61,
+572.91,569.75,578.69,578.24,584.97,588.13,587.40,594.13,597.21,600.52,
+596.43,606.56,608.13,613.97,617.46,619.05,624.22,628.88,629.46,633.91,
+636.05,634.48,641.82,644.69,650.13,647.50,656.97,656.88,661.41,670.02,
+672.27,670.16,678.10,685.23,682.55,686.85,686.41,694.04,696.77,697.16,
+700.99,709.87,712.55,716.78,712.19,717.39,725.94,724.98,730.62,731.38,
+731.71,745.36,738.80,743.67,750.25,751.99,754.03,757.45,760.00,767.10,
+767.81,773.54,774.92,776.99,785.15,788.26,788.88,791.29,794.44,802.24,
+801.69,809.83,809.29,816.29,820.12,822.42,821.74,828.05,831.93,836.99,
+834.05,839.44,848.02,844.73,846.67,854.60,853.43,858.89,865.96,870.17,
+870.04,873.15,877.99,880.81,880.02,886.50,890.17,891.08,899.94,896.50,
+905.04,906.41,914.40,905.69,920.11,917.30,915.51,929.88,933.81,935.76,
+939.39,936.78,942.73,946.45,946.96,954.94,957.15,961.92,965.72,967.08,
+972.70,977.14,981.21,982.04,986.00,985.79,990.39,991.09,998.04,1000.28,
+31.71,34.39,36.48,41.44,42.66,45.88,48.75,52.09,54.42,56.88,
+58.16,63.17,66.42,69.47,71.95,73.16,78.88,83.75,83.13,87.93,
+87.95,92.45,95.65,98.50,103.53,105.69,106.69,111.46,114.03,116.69,
+120.30,122.32,126.11,126.43,132.12,135.82,138.40,141.22,143.83,147.18,
+150.19,153.86,156.75,160.41,158.90,160.97,168.12,169.71,174.03,176.50,
+181.11,183.64,184.42,188.73,192.90,196.28,196.92,201.54,200.82,203.17,
+206.79,209.38,211.00,217.42,220.14,223.40,227.92,230.75,233.46,235.66,
+236.32,241.16,245.29,245.69,248.57,251.02,258.79,261.81,262.10,264.16,
+270.53,271.33,274.19,276.99,282.77,279.92,285.37,290.70,291.97,295.02,
+296.19,300.55,303.60,303.72,308.86,315.51,313.19,317.65,319.91,322.57,
+324.48,327.87,333.47,333.60,338.45,339.75,340.45,347.68,347.72,354.94,
+355.53,357.81,366.18,363.15,369.21,374.08,371.43,376.75,383.16,381.73,
+387.46,395.07,390.93,390.66,393.84,403.85,402.03,409.87,415.55,414.84,
+412.64,419.53,417.82,424.80,428.32,434.23,434.41,434.86,437.57,436.37,
+445.24,451.46,453.11,453.47,456.42,455.87,467.43,466.93,470.40,472.79,
+473.90,479.03,480.12,486.18,487.03,489.41,492.06,496.20,502.30,503.34,
+502.72,505.58,507.33,513.70,512.21,517.60,524.39,521.63,528.65,535.84,
+536.30,536.21,538.37,541.60,545.21,545.27,548.52,552.87,561.39,557.76,
+564.58,567.86,568.98,570.49,576.30,577.08,578.63,584.30,587.48,588.43,
+597.39,595.05,599.21,605.09,604.74,608.06,612.63,620.18,615.46,619.98,
+622.17,624.46,623.88,630.60,637.46,635.21,642.59,643.70,646.65,649.98,
+650.20,657.33,657.89,665.49,664.29,665.32,666.39,675.68,672.68,683.81,
+683.98,683.99,691.13,687.25,696.47,702.72,698.46,697.69,706.49,709.97,
+719.20,712.13,712.86,720.38,717.13,727.26,727.64,734.74,741.06,736.83,
+741.04,746.74,744.29,753.49,754.65,749.71,756.72,764.02,762.68,769.20,
+768.33,768.48,780.57,783.36,787.54,786.24,785.28,794.83,793.98,793.27,
+804.01,803.81,805.77,808.00,813.18,817.56,821.41,823.83,824.34,826.79,
+829.61,828.41,834.80,839.49,838.23,844.90,850.82,849.29,854.84,861.71,
+858.99,865.97,867.06,869.29,875.55,874.18,881.90,885.54,882.58,880.07,
+27.86,29.47,32.11,35.63,37.77,42.01,43.51,45.89,47.92,51.27,
+52.45,56.20,58.05,61.69,64.68,65.10,71.25,72.73,73.44,77.97,
+78.30,82.42,85.89,85.81,90.56,92.52,96.89,99.55,100.81,102.67,
+106.18,109.43,111.34,111.99,117.86,119.22,121.30,123.56,128.22,129.55,
+131.69,136.80,136.89,141.82,142.89,145.75,148.93,150.70,153.95,155.67,
+157.86,157.39,163.64,165.34,171.05,173.59,171.88,175.07,178.66,182.60,
+182.39,188.54,188.99,189.68,194.47,197.53,199.69,206.74,203.74,207.51,
+214.28,211.45,214.82,218.00,218.41,221.75,225.21,228.36,230.34,232.87,
+233.27,239.78,242.75,247.19,249.73,246.54,252.30,253.26,258.39,259.11,
+261.86,266.62,265.50,267.46,279.13,276.68,276.79,283.68,283.76,288.57,
+289.74,291.69,297.14,296.34,300.17,301.28,302.49,305.78,306.65,310.78,
+314.88,317.80,320.16,321.89,327.70,328.32,333.26,333.99,335.47,341.52,
+337.02,341.70,348.15,350.40,346.68,350.83,355.13,361.28,361.38,361.99,
+367.40,372.18,371.80,375.01,374.70,379.59,384.54,386.66,391.91,391.45,
+392.58,397.81,399.53,402.06,402.13,403.74,408.40,410.38,413.70,418.38,
+419.29,422.90,424.35,428.29,429.34,434.76,431.78,438.74,440.92,441.31,
+448.84,444.34,449.77,455.49,460.55,458.67,465.00,461.24,468.38,469.44,
+473.58,474.73,478.13,481.47,476.46,486.62,485.15,491.06,491.33,493.80,
+499.62,502.91,502.15,505.39,507.71,511.27,510.74,515.43,517.67,521.67,
+522.97,529.21,529.01,530.06,533.95,540.73,541.66,542.75,548.20,542.93,
+545.04,557.45,555.94,557.41,556.27,562.34,562.57,571.23,569.54,573.41,
+573.29,576.02,581.88,582.61,585.48,585.47,594.30,595.95,597.01,598.30,
+606.28,603.91,610.53,611.61,613.47,619.03,619.45,614.37,622.38,625.08,
+628.89,630.53,633.90,638.99,645.29,641.63,645.70,646.74,651.60,659.03,
+653.38,656.63,661.39,665.10,664.37,661.97,668.12,677.38,677.75,682.19,
+682.22,685.92,686.42,684.74,695.26,697.20,695.02,696.35,706.32,702.40,
+710.19,711.79,713.78,720.83,717.36,720.35,726.39,724.49,725.90,725.05,
+728.25,742.32,737.31,738.71,740.47,745.83,744.02,753.42,754.93,760.53,
+762.14,763.07,768.80,767.29,772.79,775.41,777.53,773.53,779.89,788.82,
+24.66,25.56,28.94,31.47,33.80,34.76,36.93,40.51,43.05,44.83,
+49.03,50.10,49.42,54.66,55.42,59.28,62.23,62.19,66.77,69.30,
+72.21,72.28,76.33,77.73,80.93,83.25,83.20,87.05,88.54,90.43,
+90.60,96.77,98.39,99.29,101.02,105.35,107.53,108.28,111.58,114.02,
+115.68,116.60,121.90,123.69,125.50,129.26,131.93,134.99,135.99,140.89,
+140.30,140.94,146.57,146.61,149.36,148.80,154.48,154.65,157.45,160.88,
+162.14,164.79,166.07,170.49,167.41,172.87,177.84,179.08,180.05,184.05,
+184.34,188.56,190.99,192.39,192.27,200.37,201.09,203.19,206.14,203.71,
+208.95,210.51,213.82,215.84,215.60,219.89,224.69,223.66,226.35,231.58,
+232.05,233.91,235.44,238.47,240.02,243.05,245.75,247.81,250.94,250.85,
+255.21,259.19,257.14,263.37,266.71,265.98,269.70,271.44,270.15,274.37,
+276.31,280.46,283.82,286.04,284.07,291.11,293.68,291.02,295.20,297.54,
+296.59,302.45,308.88,307.44,309.19,312.93,316.11,318.14,319.18,324.61,
+327.33,321.72,325.26,334.03,329.38,337.20,337.45,337.66,340.26,345.93,
+344.92,347.65,354.59,352.94,354.26,358.54,362.20,362.08,363.75,368.32,
+368.62,373.84,373.49,375.42,377.62,382.82,384.26,387.76,392.15,387.29,
+391.69,394.55,392.60,403.39,404.12,407.50,403.25,406.48,413.42,415.23,
+414.40,416.96,421.64,414.22,426.31,430.96,432.79,434.55,434.52,435.79,
+440.98,440.45,442.05,446.03,445.75,452.60,448.14,457.15,457.56,459.20,
+456.65,464.54,467.46,467.01,472.98,469.50,473.67,480.16,477.54,482.37,
+484.39,485.60,485.93,489.62,498.06,498.93,502.08,505.10,499.22,511.14,
+506.80,507.18,508.58,513.53,515.82,522.31,518.46,527.13,523.99,529.32,
+538.25,534.83,534.79,537.82,535.63,538.61,542.36,549.34,547.86,550.29,
+549.23,559.53,553.84,563.29,562.18,566.23,564.01,568.24,573.56,573.00,
+577.66,576.34,579.66,586.61,586.16,588.80,591.72,591.62,595.66,598.13,
+600.65,610.17,605.94,610.52,613.29,613.34,614.07,613.52,617.29,620.79,
+623.22,620.20,627.04,634.27,631.55,633.97,636.07,641.48,641.35,646.51,
+649.87,646.61,652.77,661.90,655.55,659.39,659.22,660.70,661.89,665.47,
+670.84,674.73,675.38,677.71,680.41,682.17,684.12,681.27,690.89,694.43,
+21.35,23.61,24.55,27.70,30.57,31.72,32.39,35.80,37.72,39.70,
+40.51,43.78,43.98,47.93,47.81,51.93,53.00,57.02,59.11,60.50,
+61.66,65.22,66.85,67.83,70.58,71.32,73.05,75.57,76.38,79.48,
+84.22,82.34,87.15,87.98,92.24,92.35,93.23,95.95,98.69,99.87,
+102.77,104.81,104.55,109.29,109.42,112.43,114.64,116.16,117.61,120.26,
+121.53,125.04,127.30,128.99,130.68,132.53,134.63,136.90,140.05,139.14,
+141.56,143.97,147.99,148.56,151.92,154.27,156.80,157.56,158.39,159.10,
+164.19,163.40,166.86,168.18,172.59,174.18,171.16,174.92,180.07,180.92,
+185.26,183.78,186.83,190.53,190.63,193.76,196.72,200.12,197.62,201.56,
+202.32,207.81,209.68,207.79,210.88,215.09,216.16,219.24,219.37,220.53,
+228.58,224.44,226.34,229.91,231.20,233.91,236.66,235.49,241.25,240.50,
+245.98,244.06,248.88,247.98,253.55,252.49,255.55,258.80,262.27,258.59,
+263.96,266.89,267.57,268.71,272.55,272.18,276.69,282.22,281.08,280.75,
+283.50,284.31,289.73,292.43,294.75,295.95,299.00,300.76,300.51,300.13,
+304.52,303.08,308.74,310.66,316.30,312.44,314.68,317.84,321.53,321.60,
+321.62,322.42,334.25,328.27,325.22,332.86,336.18,340.07,343.37,344.59,
+345.42,347.67,348.67,352.05,352.33,355.73,358.17,354.68,360.20,364.38,
+367.73,367.34,373.03,371.01,375.48,371.48,383.73,379.84,381.08,383.91,
+386.30,391.48,391.32,395.28,391.92,394.63,398.43,399.55,405.94,403.19,
+405.48,406.11,409.82,418.19,411.97,419.84,417.52,422.43,428.77,422.82,
+426.10,428.17,429.82,436.09,436.81,438.81,443.96,443.94,439.27,445.25,
+446.99,441.06,458.35,453.67,450.52,455.15,460.25,462.98,467.94,466.65,
+469.01,465.91,471.70,476.19,472.16,473.34,479.84,483.85,481.75,485.75,
+492.37,485.81,495.04,496.55,496.09,499.25,498.89,501.86,502.46,508.14,
+508.37,510.48,508.42,509.77,516.03,517.38,519.23,524.57,525.16,522.84,
+523.51,529.51,534.24,533.92,532.92,534.96,542.05,540.41,541.77,545.02,
+546.74,549.09,551.80,557.09,554.55,560.98,562.20,560.80,563.77,563.28,
+565.61,575.40,576.23,574.88,575.72,574.39,581.83,580.96,584.00,586.49,
+587.21,597.35,588.85,591.11,598.05,599.73,597.47,606.45,600.86,601.36,
+19.32,20.19,23.07,24.44,25.68,28.17,30.18,29.74,32.46,35.27,
+36.59,36.44,38.58,39.72,45.13,48.20,47.22,49.82,50.22,53.52,
+55.45,56.67,57.34,59.40,62.22,64.55,65.01,67.28,68.58,68.44,
+70.89,74.10,74.49,77.62,79.09,81.27,84.76,85.39,87.15,89.54,
+90.61,91.67,91.24,95.58,96.16,98.20,98.72,99.83,103.33,107.04,
+106.58,110.55,111.80,112.25,115.98,116.89,116.40,121.29,122.06,127.02,
+124.94,127.34,127.35,133.06,131.18,132.29,137.74,137.76,138.43,143.16,
+143.47,143.99,147.62,144.66,150.23,154.77,151.72,158.11,159.54,158.45,
+164.16,164.79,164.81,167.60,167.89,167.22,171.27,173.70,176.17,175.22,
+178.95,180.26,178.88,183.32,187.38,190.61,191.43,191.34,192.24,196.03,
+195.35,197.08,200.93,201.79,201.38,206.13,204.73,209.18,209.93,209.70,
+212.37,216.17,215.90,219.55,221.25,224.33,222.23,224.74,231.18,231.59,
+233.44,235.69,236.22,236.68,239.37,241.40,247.09,243.06,244.64,248.76,
+249.40,253.35,252.25,252.94,258.50,260.42,260.11,260.66,267.30,266.63,
+266.77,265.75,270.98,276.12,272.46,275.10,277.16,278.30,283.29,284.04,
+291.82,287.31,289.91,290.08,294.08,291.86,294.62,299.77,301.34,301.24,
+303.99,305.06,304.74,304.92,310.02,314.08,318.33,317.43,318.25,315.95,
+325.55,327.56,327.60,329.52,327.72,332.10,331.52,330.62,335.51,339.48,
+343.32,344.92,340.84,341.07,347.46,346.44,351.89,348.86,353.29,354.16,
+357.12,355.72,355.29,363.39,362.42,365.81,362.51,371.07,375.46,374.16,
+374.48,375.23,377.80,379.41,381.30,380.98,386.72,393.12,388.38,392.07,
+386.18,396.31,391.11,392.36,398.44,399.20,401.83,404.03,405.70,403.79,
+411.22,410.29,408.98,409.91,420.71,418.25,426.99,421.21,424.34,425.96,
+428.81,430.85,432.88,429.32,432.50,440.69,438.30,441.55,440.13,449.16,
+449.80,450.32,452.16,450.02,453.87,446.68,456.02,454.30,464.02,458.72,
+461.41,467.47,460.65,464.95,470.51,474.77,474.87,479.73,475.33,478.62,
+485.45,488.56,484.59,484.25,482.73,488.81,495.65,495.16,494.46,491.97,
+498.46,503.54,497.08,503.33,505.21,513.32,510.25,514.99,512.76,511.45,
+512.60,517.50,521.63,520.70,524.47,529.66,525.18,527.67,531.86,533.87,
+16.24,18.21,20.63,20.65,23.62,24.86,26.43,28.25,29.09,30.98,
+31.10,33.39,35.57,35.71,39.32,39.53,40.09,43.14,45.10,45.48,
+46.01,47.75,50.07,51.12,54.93,56.22,57.65,58.59,61.92,60.95,
+62.65,64.07,66.72,68.97,71.25,70.66,71.66,73.58,75.24,76.51,
+78.45,80.34,81.63,82.75,85.69,85.61,85.07,89.89,91.18,93.01,
+95.30,93.87,97.95,99.80,98.24,101.75,101.97,105.64,107.11,108.94,
+109.65,112.95,112.45,115.98,116.09,115.30,117.39,117.79,122.53,125.58,
+125.62,127.20,127.45,130.36,129.52,133.72,134.04,136.62,135.74,140.65,
+143.44,144.32,144.61,142.37,147.01,149.42,148.15,150.46,152.20,152.80,
+157.75,157.38,161.03,163.71,162.72,164.21,166.00,165.09,169.31,172.02,
+173.31,174.09,175.81,177.69,177.98,176.56,180.72,184.37,184.03,186.01,
+189.63,190.22,189.40,193.28,195.77,196.22,194.36,198.56,199.66,200.30,
+202.81,204.61,207.22,209.91,212.06,210.33,212.22,214.52,216.94,218.37,
+222.02,219.34,223.57,221.47,225.42,231.09,225.48,230.77,229.35,231.97,
+238.28,235.93,234.47,238.91,241.47,243.35,244.02,247.68,248.48,249.58,
+249.91,252.75,254.82,251.94,256.27,256.77,256.18,264.22,261.69,262.94,
+269.77,266.68,270.70,270.33,275.58,273.72,275.24,277.48,278.48,281.54,
+279.66,283.74,287.98,281.54,283.48,288.60,291.82,294.61,295.44,293.13,
+292.98,297.34,296.91,298.34,301.29,302.52,310.76,311.36,308.06,311.87,
+314.56,312.97,317.36,319.07,316.25,322.37,323.94,326.19,328.02,326.37,
+327.24,329.09,329.98,332.21,338.26,331.38,335.85,340.44,342.85,337.41,
+340.87,346.07,347.53,350.12,350.15,355.14,351.99,352.46,359.46,355.47,
+356.76,360.77,367.69,360.38,370.03,370.49,370.20,371.52,374.70,369.31,
+376.79,374.84,377.21,378.15,380.30,380.31,383.24,383.95,383.86,389.64,
+392.79,387.65,390.65,398.19,394.91,402.51,400.19,399.86,403.34,402.27,
+410.34,403.37,408.93,413.33,411.89,413.24,419.52,423.35,419.47,416.96,
+420.35,428.19,422.86,432.75,429.60,427.65,431.29,432.27,434.03,433.90,
+445.39,436.77,439.88,438.04,445.79,446.10,449.45,442.38,452.51,448.78,
+454.78,458.82,455.71,458.61,457.68,459.28,462.32,462.94,464.92,470.14,
+14.26,15.62,18.07,19.05,20.91,21.62,22.77,25.14,25.59,26.59,
+28.43,29.44,31.94,32.96,33.20,34.24,37.58,35.54,38.08,39.32,
+41.34,42.50,45.24,45.95,48.74,47.34,49.61,50.05,52.42,54.34,
+55.61,55.87,58.74,58.92,61.32,61.29,63.77,62.90,65.63,67.48,
+69.39,68.28,71.91,74.33,74.93,74.70,77.03,77.59,78.30,82.74,
+80.69,83.93,83.11,88.58,87.47,90.99,87.49,91.31,92.81,94.25,
+94.79,97.03,99.14,100.13,100.74,102.28,103.58,105.62,106.10,107.65,
+108.30,110.48,114.49,111.55,113.31,116.89,117.47,121.84,121.10,125.04,
+125.10,123.68,121.88,126.98,131.56,128.46,133.38,132.94,134.20,135.56,
+137.09,139.79,142.08,141.40,142.32,142.40,145.75,146.68,145.60,153.67,
+150.94,149.81,152.89,152.53,155.43,159.77,159.93,159.13,162.22,161.99,
+161.62,166.85,164.18,166.86,168.91,173.39,173.77,170.31,173.99,176.34,
+174.66,178.27,177.96,179.09,181.78,184.05,186.55,188.83,187.34,192.52,
+193.06,196.44,193.09,196.60,192.49,197.47,201.37,200.75,203.28,208.06,
+207.04,210.57,207.93,209.81,212.06,210.60,212.51,216.35,214.61,219.49,
+218.94,219.61,224.76,222.15,220.01,225.14,229.00,230.31,228.09,232.67,
+234.47,232.75,233.81,239.34,236.39,242.70,239.34,243.25,243.64,246.44,
+246.75,250.59,248.84,250.46,253.42,253.32,253.46,256.96,258.34,258.67,
+259.16,263.24,264.11,262.17,263.39,265.27,268.33,267.77,272.17,271.08,
+271.80,274.80,277.69,275.16,276.41,279.17,282.30,278.65,284.64,288.60,
+288.36,285.94,291.31,289.87,289.91,297.93,299.03,294.66,295.94,297.65,
+303.89,305.38,304.01,303.42,307.02,308.15,309.62,306.04,315.12,315.98,
+308.31,317.89,315.27,318.08,322.97,319.08,326.30,328.67,322.27,326.30,
+327.71,330.35,331.45,334.02,334.69,330.30,334.42,336.48,342.35,334.82,
+342.18,341.61,341.72,343.36,348.29,352.55,348.32,351.35,347.51,351.26,
+355.02,355.02,356.53,357.07,362.04,363.36,358.91,364.50,367.18,371.06,
+367.56,371.27,366.34,374.90,370.98,371.38,378.93,376.42,375.48,377.11,
+380.58,383.08,381.12,385.30,387.43,393.81,388.92,391.75,397.71,395.94,
+395.11,398.48,400.57,404.96,402.28,402.60,404.35,404.38,402.71,407.43,
+13.39,14.49,15.23,16.77,16.74,18.32,19.55,21.87,21.81,23.61,
+25.44,25.81,26.18,28.26,30.06,30.84,31.28,33.01,34.20,34.35,
+37.04,37.62,38.91,39.75,41.47,40.52,42.30,45.47,45.68,47.61,
+49.69,49.56,51.52,53.00,51.89,53.80,55.73,55.73,56.28,58.43,
+59.63,62.10,61.58,62.63,64.90,65.83,66.39,68.31,70.01,70.87,
+71.43,73.75,74.25,74.12,75.42,78.59,80.02,78.99,84.87,83.49,
+84.37,87.84,85.46,86.22,86.81,88.28,92.57,90.59,94.52,93.06,
+95.61,97.68,98.61,94.96,102.76,100.65,103.81,101.57,105.96,106.57,
+109.52,106.23,108.35,111.22,115.45,112.18,115.12,118.51,117.72,118.15,
+118.55,121.10,123.06,126.01,125.65,128.88,127.25,127.25,128.44,127.70,
+129.78,132.75,134.20,133.49,135.88,134.70,138.33,142.37,142.48,142.08,
+143.41,144.08,147.76,146.41,147.63,149.44,148.85,150.11,150.74,150.63,
+153.43,155.60,160.14,159.79,161.25,162.06,164.89,163.41,165.24,168.32,
+165.37,168.10,169.91,172.70,169.06,171.62,171.00,175.89,177.79,177.53,
+177.99,181.92,179.60,180.59,184.20,185.01,186.82,188.67,189.54,193.33,
+192.71,193.27,191.89,193.22,192.77,196.29,204.81,201.12,203.14,202.44,
+202.46,203.08,205.61,203.44,210.84,210.93,210.38,214.44,208.58,212.44,
+211.46,215.07,221.38,217.97,216.88,222.00,221.03,220.78,226.04,224.28,
+227.95,224.32,228.00,229.80,228.60,230.96,234.31,238.49,239.01,238.08,
+239.35,241.69,244.18,240.98,246.97,243.90,246.34,244.35,250.32,247.73,
+250.69,250.33,257.24,253.74,253.71,252.51,256.72,256.43,263.61,263.92,
+260.30,267.57,264.01,266.49,261.88,267.56,269.68,273.54,273.16,272.67,
+272.87,275.24,276.15,272.16,278.77,277.39,284.06,279.86,280.75,286.61,
+285.59,292.23,285.94,290.17,289.45,289.63,292.44,296.68,293.94,296.80,
+295.36,299.36,301.85,302.27,305.04,307.20,304.86,308.97,312.14,309.00,
+307.77,304.20,315.36,311.68,315.58,317.63,317.39,319.94,316.65,317.10,
+325.38,319.00,322.61,330.51,326.26,328.32,326.01,332.36,333.87,335.46,
+332.18,336.41,334.51,337.19,339.65,340.04,342.54,344.36,343.15,342.08,
+348.73,343.24,348.65,350.41,354.86,351.86,350.00,351.06,352.99,358.26,
+11.60,12.28,13.11,14.73,15.09,16.37,17.16,18.69,20.23,20.10,
+22.80,23.69,23.10,23.09,23.51,27.90,28.61,29.16,29.48,31.59,
+31.71,31.83,33.72,33.86,35.22,37.49,38.06,38.22,39.78,40.03,
+40.56,43.54,43.77,44.81,46.66,47.60,47.55,49.27,50.34,51.82,
+51.95,51.89,57.55,55.59,56.66,57.73,57.28,58.41,60.57,63.98,
+62.20,63.45,65.50,66.57,64.59,68.36,71.10,69.72,70.99,71.75,
+74.07,74.56,74.73,75.70,79.43,76.93,80.81,79.28,81.56,83.52,
+80.94,83.97,85.08,87.23,87.91,88.13,88.06,91.90,91.75,92.56,
+94.50,96.12,96.01,96.27,97.14,99.73,100.81,99.61,101.96,104.03,
+102.03,106.04,103.71,104.17,106.82,111.55,111.65,111.68,114.38,114.12,
+114.73,114.21,116.11,119.04,117.18,119.91,119.70,120.96,119.19,122.93,
+121.32,125.80,125.17,128.34,129.01,128.49,131.85,133.78,135.22,135.51,
+136.55,137.32,139.78,139.89,136.79,141.16,139.91,142.52,145.42,143.69,
+143.57,146.43,147.99,148.76,147.15,148.94,149.09,151.56,153.81,152.70,
+155.32,161.85,161.27,159.38,161.63,163.30,163.72,164.00,166.76,162.82,
+165.02,169.04,164.64,170.18,168.37,170.65,172.32,175.26,175.80,177.00,
+179.25,177.78,176.50,178.28,181.51,183.74,180.30,187.51,185.15,186.45,
+187.01,183.14,189.12,193.83,191.63,192.67,192.41,195.65,194.39,198.50,
+198.20,201.65,199.78,199.60,200.57,201.88,202.79,205.37,205.39,204.96,
+208.87,210.80,212.44,204.51,211.59,214.50,218.81,214.20,214.92,219.01,
+218.25,221.00,221.70,218.85,219.40,227.04,224.90,228.63,228.83,223.28,
+229.67,230.09,236.41,233.48,234.68,233.50,235.71,235.73,236.64,238.59,
+238.19,238.26,238.93,241.35,245.29,242.93,246.09,243.64,246.83,244.76,
+246.49,254.00,251.88,253.49,252.64,256.36,256.68,252.22,254.49,254.86,
+262.96,260.91,262.70,260.69,264.13,263.28,268.03,265.75,267.69,269.53,
+270.98,270.18,271.19,278.12,271.25,281.29,277.44,277.24,272.95,283.91,
+277.39,278.92,280.09,284.52,283.50,288.54,289.93,287.50,288.03,293.58,
+291.49,284.52,293.89,296.09,297.37,298.48,297.68,296.11,299.45,300.64,
+305.55,306.29,300.04,303.06,304.59,312.90,301.75,305.27,306.95,309.78,
+9.15,10.24,10.99,12.27,13.20,14.12,14.38,15.51,15.86,17.29,
+19.01,19.34,20.12,20.27,22.73,23.32,22.26,24.65,25.87,28.11,
+27.32,27.30,28.76,29.47,30.76,33.48,32.52,34.12,35.35,36.93,
+36.11,36.18,38.47,38.93,41.95,43.42,41.48,42.85,44.17,43.21,
+45.11,45.26,47.94,49.14,48.22,48.91,50.18,52.28,55.17,55.37,
+54.66,54.69,57.28,57.19,59.66,59.00,61.50,62.79,59.45,61.76,
+63.93,66.64,63.77,67.98,68.17,66.59,68.43,69.81,72.51,72.99,
+71.71,71.09,72.12,74.55,76.88,80.44,80.61,80.32,80.84,81.09,
+78.58,79.82,82.20,84.22,83.62,85.26,89.81,87.30,89.36,87.96,
+90.85,93.97,93.29,91.85,94.13,95.28,96.25,98.74,98.03,95.73,
+101.55,100.20,100.21,105.72,104.37,103.62,107.96,106.68,108.02,108.15,
+106.86,109.61,109.30,112.19,113.52,115.24,115.40,117.00,117.65,118.20,
+116.40,118.77,116.10,119.71,122.22,121.66,123.16,123.65,128.70,125.05,
+129.48,127.95,129.37,131.70,132.38,130.51,133.69,131.42,134.25,132.22,
+134.20,137.47,139.02,138.74,142.75,140.79,142.00,140.42,144.44,140.63,
+142.27,143.00,148.36,148.56,152.08,151.33,150.02,150.36,153.77,155.07,
+152.59,152.98,156.26,154.61,158.51,159.08,160.56,160.05,163.73,162.95,
+161.60,163.75,163.28,164.05,167.12,167.53,168.07,172.54,170.66,169.22,
+172.02,169.00,171.98,172.88,178.42,173.13,177.74,181.05,180.98,177.29,
+178.34,182.24,179.81,185.14,186.28,188.77,188.67,188.38,185.49,189.77,
+191.85,188.61,194.38,192.07,193.92,196.04,197.17,197.90,198.96,197.36,
+202.64,203.22,204.14,205.87,203.09,207.84,204.88,210.91,207.35,206.05,
+208.95,210.87,209.85,211.92,211.98,207.90,213.62,214.80,218.38,218.06,
+213.32,218.25,218.36,219.00,222.37,221.97,221.57,227.70,224.32,225.13,
+222.84,225.31,230.42,232.77,228.34,228.75,225.12,232.45,233.53,232.66,
+231.10,239.73,236.80,236.31,236.45,237.71,242.49,242.31,245.31,245.35,
+248.35,239.76,246.52,247.64,247.77,246.78,247.57,254.53,250.40,251.20,
+254.50,249.98,253.89,260.76,255.79,256.18,256.65,254.59,258.77,259.48,
+260.29,263.83,264.10,264.73,263.65,268.14,264.81,265.00,265.25,271.75,
+7.87,9.26,9.33,11.47,11.49,12.11,13.45,14.30,13.99,15.94,
+15.96,15.99,17.55,18.42,20.11,20.78,21.94,22.58,23.25,24.18,
+24.57,24.66,25.25,27.56,27.74,27.44,28.85,29.97,30.00,30.39,
+31.46,32.37,33.51,34.42,35.73,36.05,34.74,38.56,38.81,39.70,
+39.64,40.69,41.35,42.62,42.65,43.29,44.91,47.90,46.77,46.69,
+47.40,50.34,48.15,48.51,49.77,54.00,51.13,54.13,52.46,52.26,
+55.28,56.04,56.74,57.94,59.02,60.45,59.40,63.14,62.42,63.52,
+62.26,64.79,63.82,65.40,67.18,69.88,67.19,67.05,69.30,67.57,
+70.61,72.26,72.59,72.08,78.10,74.49,76.16,75.86,77.91,80.56,
+80.02,78.03,77.78,81.36,81.57,84.19,84.02,82.90,86.39,86.08,
+87.54,87.54,89.60,90.14,92.48,92.01,91.36,92.74,93.22,93.85,
+94.71,92.92,93.74,95.34,99.59,98.36,100.71,98.85,101.86,100.42,
+104.58,100.60,104.36,105.79,103.69,107.08,105.72,110.97,107.70,110.59,
+110.33,106.59,109.54,112.14,114.38,113.19,113.45,114.27,116.46,113.20,
+120.75,116.83,121.67,122.56,121.97,118.18,126.06,125.36,124.02,127.43,
+125.11,125.89,126.03,130.09,128.66,129.72,127.11,130.44,133.25,133.09,
+133.32,135.88,132.62,131.79,138.30,133.51,137.85,136.48,139.15,144.25,
+138.17,143.48,146.07,145.10,148.93,145.62,146.59,150.16,149.88,148.93,
+148.45,152.23,151.76,153.83,151.79,155.05,155.43,154.74,154.57,156.36,
+152.38,158.51,155.48,161.11,162.75,161.64,161.62,162.12,161.80,169.61,
+167.20,170.84,168.83,168.62,172.76,167.46,169.87,171.06,175.99,171.36,
+172.02,170.26,178.01,174.11,176.50,177.73,174.26,178.66,176.37,178.97,
+181.19,182.30,185.19,180.18,185.54,191.01,184.37,185.12,190.14,183.97,
+191.19,185.63,189.87,193.55,195.53,195.01,193.24,194.83,195.14,196.53,
+195.55,195.19,196.73,198.77,197.93,196.98,206.07,203.65,201.23,206.53,
+202.41,199.32,207.85,208.07,202.37,209.04,211.91,207.62,213.16,213.84,
+212.45,211.25,211.69,214.19,214.79,217.83,214.84,218.13,219.49,215.90,
+219.10,225.01,223.69,221.80,223.81,222.67,225.90,224.55,234.72,231.60,
+228.50,225.31,234.04,230.08,229.87,227.16,235.49,234.75,236.27,236.95,
+54.44,59.61,63.46,69.14,74.37,79.12,83.90,91.42,94.45,100.42,
+105.62,109.44,115.95,120.31,125.00,129.38,135.66,141.67,147.86,151.23,
+156.62,160.79,165.87,172.00,174.83,180.58,188.84,190.63,196.76,201.34,
+208.59,210.82,217.48,220.82,225.74,232.59,236.46,243.44,248.68,254.38,
+257.91,264.17,269.15,273.39,277.91,282.01,290.57,294.93,300.94,303.12,
+309.64,314.78,318.36,324.81,328.77,332.49,339.69,342.51,349.28,357.41,
+359.43,363.08,371.66,375.83,382.81,386.97,391.62,398.34,402.48,409.28,
+410.96,417.15,420.52,423.60,430.65,437.33,439.45,450.15,451.64,457.63,
+462.90,467.37,471.02,479.19,479.78,486.27,489.74,497.58,501.62,508.67,
+512.65,517.67,526.08,529.36,532.17,538.90,544.84,550.64,553.51,559.66,
+566.86,569.13,575.68,575.72,583.42,589.64,594.80,597.34,605.71,610.29,
+616.33,616.95,626.45,632.21,632.93,639.49,646.34,651.16,656.80,665.34,
+664.70,669.97,674.51,680.70,683.97,692.19,697.64,706.25,705.65,712.82,
+716.81,720.25,726.24,727.94,736.56,740.79,747.15,751.78,754.44,759.15,
+766.82,771.04,778.39,785.36,790.45,794.55,797.14,801.31,807.50,812.65,
+817.61,821.92,828.08,832.05,840.12,842.47,851.49,855.91,860.12,861.81,
+875.06,875.42,882.60,884.49,891.71,898.08,899.24,905.96,911.76,916.29,
+917.51,925.92,930.31,930.74,943.22,944.70,952.12,957.60,964.68,968.91,
+971.45,981.96,981.45,988.04,991.32,997.55,1005.55,1009.56,1013.16,1017.09,
+1018.77,1027.53,1031.69,1037.94,1040.53,1045.82,1052.76,1057.17,1064.26,1070.53,
+1076.68,1080.22,1086.97,1088.22,1094.84,1098.45,1106.26,1110.79,1113.08,1114.94,
+1121.42,1131.93,1131.21,1139.99,1143.84,1148.70,1157.36,1161.54,1164.18,1172.28,
+1176.82,1179.48,1185.02,1191.99,1197.31,1199.18,1206.81,1210.49,1217.16,1217.86,
+1226.10,1233.81,1238.21,1237.60,1248.97,1250.84,1256.61,1261.46,1267.09,1271.53,
+1281.61,1285.06,1289.17,1295.58,1299.19,1298.47,1309.31,1314.52,1315.62,1326.63,
+1324.76,1334.83,1342.74,1348.58,1348.66,1355.60,1361.19,1361.80,1365.98,1377.93,
+1379.56,1390.25,1384.15,1396.34,1399.25,1405.19,1410.32,1417.06,1420.88,1418.26,
+1427.47,1437.87,1440.15,1446.06,1453.52,1467.21,1460.96,1466.78,1472.11,1474.44,
+1481.46,1488.39,1490.21,1502.47,1497.72,1504.55,1515.69,1512.27,1521.37,1524.70,
+48.91,52.89,58.11,61.89,67.26,71.93,76.33,81.40,84.12,89.11,
+94.68,98.78,104.34,108.91,112.11,117.60,124.02,126.71,130.87,135.03,
+141.14,145.80,148.92,154.71,158.02,163.68,168.84,175.33,178.64,183.21,
+187.09,191.88,197.79,200.35,207.46,207.95,214.23,219.24,223.91,227.89,
+232.74,236.84,242.97,246.98,252.95,256.36,262.43,262.18,268.87,274.52,
+278.59,280.53,287.57,292.34,299.15,301.05,307.91,312.04,314.93,320.68,
+324.64,331.63,335.20,339.88,341.21,344.49,352.29,358.82,363.46,366.95,
+371.80,376.82,381.29,386.53,388.75,391.47,397.75,402.02,408.52,413.80,
+415.78,421.21,426.20,430.76,438.70,439.89,443.82,450.70,452.46,457.98,
+464.17,467.26,473.31,474.01,481.98,490.90,491.30,494.72,499.29,503.78,
+507.45,512.73,518.70,523.08,528.26,529.83,539.30,537.42,545.96,553.27,
+554.96,557.98,564.12,568.82,577.63,579.30,582.82,584.65,590.24,598.42,
+599.81,604.58,611.89,614.87,620.94,625.84,631.69,636.95,639.39,641.64,
+651.71,652.19,660.37,659.19,663.31,669.28,677.80,678.22,686.57,690.64,
+692.16,699.60,705.63,709.43,713.77,720.24,721.50,727.65,726.54,737.06,
+740.69,748.07,751.63,751.20,756.39,761.32,764.00,774.16,775.20,787.57,
+787.64,789.29,793.85,798.57,805.06,807.53,814.02,822.46,820.32,830.28,
+834.42,836.91,839.15,846.22,846.87,859.25,856.87,865.41,867.80,872.91,
+875.44,886.45,888.98,891.12,895.05,902.36,905.34,908.69,918.80,918.34,
+922.64,931.35,934.16,936.98,938.44,947.01,953.08,957.10,961.88,967.91,
+967.82,974.30,974.13,985.28,989.98,996.20,1000.20,1007.96,1005.94,1011.70,
+1017.49,1024.64,1027.20,1031.96,1035.34,1041.17,1048.39,1048.32,1050.85,1058.93,
+1060.71,1063.39,1066.58,1080.76,1082.87,1086.45,1088.22,1091.39,1100.56,1106.53,
+1109.70,1110.21,1121.47,1119.17,1123.28,1132.98,1139.13,1144.02,1144.48,1150.85,
+1153.39,1164.32,1164.06,1167.38,1174.84,1182.59,1181.01,1186.11,1191.27,1194.76,
+1199.98,1205.00,1211.78,1217.11,1222.73,1225.09,1228.67,1230.91,1232.82,1243.84,
+1250.28,1255.10,1258.80,1264.56,1261.57,1275.57,1274.99,1280.00,1291.45,1286.61,
+1296.16,1292.27,1304.81,1311.14,1313.58,1307.70,1314.62,1325.69,1329.98,1334.99,
+1336.48,1346.03,1349.44,1354.22,1359.31,1361.56,1366.98,1373.13,1376.27,1377.93,
+43.89,48.71,51.55,56.07,59.57,64.23,69.12,73.10,77.38,80.82,
+84.85,88.66,93.85,97.18,101.40,106.34,110.11,115.56,118.15,122.61,
+127.46,133.34,134.02,137.42,145.27,147.47,151.67,154.61,160.95,163.38,
+171.14,171.47,175.79,180.68,182.43,188.74,193.69,197.90,202.24,207.91,
+209.90,215.55,216.00,223.58,226.78,229.43,235.47,236.94,243.22,248.49,
+248.58,255.17,259.08,262.96,268.61,271.33,273.87,279.80,286.81,290.67,
+294.47,296.65,300.66,303.88,309.92,317.79,318.20,321.33,327.00,329.34,
+335.67,337.90,342.87,343.60,349.45,358.07,358.47,364.25,368.50,371.33,
+374.99,381.93,385.48,387.55,395.92,395.88,402.42,406.51,410.78,411.62,
+415.24,423.74,429.95,431.39,434.80,437.84,444.16,444.28,451.58,452.42,
+461.25,462.06,467.63,472.13,476.71,481.33,485.12,492.32,493.58,496.08,
+503.40,504.05,511.69,511.95,519.31,519.94,530.64,528.99,535.28,534.20,
+543.91,542.75,546.19,558.01,556.82,567.45,567.87,574.01,575.76,579.29,
+579.52,589.03,591.61,597.86,599.33,601.80,609.09,612.26,619.71,622.38,
+625.75,632.16,635.77,637.94,641.86,647.81,651.69,654.83,661.91,662.00,
+662.61,669.90,674.07,676.49,682.34,691.54,690.03,696.13,700.17,702.81,
+708.66,716.73,716.08,718.43,721.38,722.31,736.18,735.86,736.02,746.77,
+750.12,753.50,757.16,764.95,762.32,770.55,774.24,779.21,783.19,785.85,
+791.24,795.10,797.61,807.23,810.14,813.11,816.42,818.93,824.37,824.83,
+833.85,840.74,837.34,843.92,856.39,852.08,856.02,865.23,866.88,872.81,
+871.30,877.62,885.00,890.42,887.96,902.33,895.38,903.32,906.09,912.64,
+912.45,919.16,927.60,929.34,935.15,936.57,939.75,942.62,952.98,955.16,
+957.66,962.84,963.41,970.36,977.07,981.87,989.96,988.58,994.27,998.68,
+997.55,1006.29,1007.54,1010.39,1017.43,1019.86,1025.07,1029.15,1031.63,1036.93,
+1038.79,1043.80,1045.76,1052.15,1053.50,1061.75,1063.96,1064.98,1072.07,1079.82,
+1084.03,1084.52,1088.24,1096.29,1100.92,1109.05,1098.94,1111.81,1114.40,1119.60,
+1125.24,1131.95,1132.70,1134.40,1142.34,1135.46,1137.90,1152.81,1159.07,1164.78,
+1162.72,1165.27,1173.49,1177.90,1182.37,1181.34,1195.07,1195.67,1195.80,1204.81,
+1209.58,1207.87,1216.48,1217.88,1219.83,1226.71,1231.90,1231.90,1237.12,1233.94,
+40.74,42.52,46.67,51.37,54.61,58.20,62.43,64.23,68.23,72.35,
+77.29,81.56,85.39,87.70,90.63,94.16,98.94,103.05,108.15,111.92,
+115.25,119.20,120.78,125.13,130.76,135.03,135.93,140.27,144.16,145.97,
+150.57,155.01,160.29,162.22,164.93,168.30,174.33,177.02,180.97,185.29,
+188.42,190.56,196.71,199.75,204.28,210.36,210.47,212.53,217.02,224.04,
+225.88,228.61,232.53,235.74,242.30,244.56,249.68,255.61,256.76,259.93,
+261.99,267.53,271.93,273.88,275.38,281.04,286.11,288.14,293.64,296.93,
+299.53,302.98,305.96,308.96,312.88,319.93,320.70,325.24,332.26,331.57,
+339.64,340.44,348.01,348.36,354.52,359.28,358.71,365.50,365.36,371.74,
+374.99,380.15,381.34,387.28,391.69,394.17,396.04,402.85,409.57,408.95,
+410.10,416.09,418.45,423.17,427.67,431.28,430.91,439.56,442.44,443.45,
+454.05,454.17,458.59,463.63,465.84,471.05,472.12,474.51,480.52,481.24,
+487.39,488.10,496.14,498.76,503.39,504.45,510.89,507.76,520.17,520.95,
+523.11,526.77,531.05,533.13,540.56,544.88,547.96,549.28,555.51,560.39,
+560.94,567.18,569.56,574.07,572.01,580.53,588.36,590.44,590.44,592.26,
+597.86,599.53,606.35,611.32,611.80,615.01,619.07,623.29,628.88,631.02,
+636.34,635.65,643.51,647.23,651.51,656.89,658.24,657.92,667.93,665.29,
+673.60,678.90,683.64,685.50,690.73,691.92,697.83,700.85,704.52,710.01,
+712.30,718.96,719.95,722.39,728.41,730.84,734.67,736.92,742.17,745.45,
+745.94,749.50,756.98,756.19,762.26,768.23,771.78,774.14,776.35,782.76,
+782.97,787.11,792.90,799.05,795.37,801.18,810.12,807.23,815.82,818.24,
+822.39,831.70,832.17,837.30,841.19,840.52,847.96,848.97,851.81,861.44,
+860.97,862.26,865.78,874.39,873.95,879.75,880.34,883.96,892.03,889.23,
+890.95,899.81,906.29,910.87,910.04,918.19,923.65,924.97,923.25,933.68,
+933.73,937.78,945.01,942.28,941.26,952.85,956.42,964.57,968.73,966.49,
+969.21,974.40,978.78,984.00,980.10,988.00,994.46,997.38,1002.28,1007.80,
+1009.07,1012.72,1018.68,1022.15,1021.53,1027.70,1032.83,1032.50,1037.87,1033.88,
+1055.31,1051.58,1052.74,1054.85,1062.41,1066.44,1064.66,1068.11,1074.39,1080.48,
+1082.14,1091.96,1094.26,1096.37,1101.49,1099.82,1103.65,1110.01,1114.10,1118.57,
+34.92,38.51,41.03,44.91,49.80,52.11,54.85,59.58,62.15,65.28,
+68.14,72.61,76.15,78.84,80.93,86.28,89.10,91.16,93.59,98.43,
+103.22,105.00,107.65,113.24,115.08,120.07,123.57,125.25,127.70,131.18,
+136.34,137.67,142.64,146.33,148.97,149.83,155.78,159.30,162.97,165.64,
+170.87,169.39,174.56,179.90,181.28,184.96,188.64,191.11,195.92,199.25,
+202.41,204.56,206.88,213.21,217.81,219.83,223.97,225.28,231.29,234.73,
+236.03,240.39,241.08,244.48,247.29,254.45,255.65,260.60,261.31,266.42,
+271.13,272.06,274.67,279.17,280.27,284.17,286.65,291.88,295.29,296.18,
+300.46,305.01,309.66,312.63,316.52,317.56,320.95,328.64,328.33,330.84,
+335.73,339.78,342.95,344.92,348.75,352.62,355.89,357.96,366.19,368.10,
+368.50,371.48,375.19,376.94,379.82,390.99,392.12,391.91,395.67,397.07,
+404.12,404.85,408.97,412.33,416.96,421.83,424.82,426.24,429.77,430.27,
+436.48,438.14,445.32,448.65,447.48,455.50,454.95,462.09,462.02,464.10,
+471.76,468.31,478.03,481.57,481.91,481.50,491.57,496.70,499.40,498.71,
+502.48,504.12,507.94,511.10,515.03,520.30,522.48,531.16,526.47,538.23,
+532.85,542.97,540.55,544.38,554.29,557.96,550.11,554.42,565.55,566.59,
+569.30,570.23,580.33,582.49,583.03,585.26,587.76,591.85,594.47,599.63,
+599.00,606.29,611.14,613.48,618.61,621.76,618.30,627.64,632.61,634.15,
+635.59,632.97,645.91,646.07,652.62,653.25,657.95,659.00,664.54,665.88,
+667.92,672.71,677.03,684.76,689.99,685.08,693.62,692.47,691.95,698.46,
+701.04,708.10,709.98,712.12,713.54,722.53,724.67,732.57,728.11,732.99,
+737.89,737.74,744.13,748.57,746.95,754.29,752.08,761.73,769.11,766.37,
+771.12,770.31,778.26,775.64,787.00,787.94,790.22,792.72,799.95,801.06,
+809.20,806.41,811.76,812.81,819.03,822.16,827.10,825.86,832.15,830.61,
+833.37,843.35,846.54,854.58,853.35,853.70,855.80,859.30,865.83,868.96,
+872.66,870.90,872.79,878.84,881.70,886.79,895.73,887.54,898.74,899.67,
+902.68,912.19,912.10,911.51,919.11,921.81,926.06,934.84,933.40,928.62,
+936.55,946.03,943.93,943.32,951.26,952.30,952.04,961.84,967.84,966.37,
+967.20,975.35,982.97,985.04,988.02,988.34,991.24,989.80,991.97,1003.13,
+31.28,34.44,37.22,41.14,44.69,48.49,48.68,53.22,55.84,58.21,
+61.56,64.50,68.08,71.61,75.19,76.83,78.03,81.95,85.53,90.41,
+90.12,92.69,97.28,98.31,102.92,106.88,109.81,111.50,115.33,117.40,
+118.98,125.40,125.20,130.08,132.09,136.06,137.87,140.43,145.50,147.03,
+152.24,156.65,157.42,157.76,163.21,167.45,169.55,171.66,172.50,177.36,
+181.50,181.47,187.49,190.18,194.00,193.45,200.33,200.25,204.63,208.80,
+208.65,212.90,215.02,217.86,223.20,226.22,227.82,232.71,234.22,239.42,
+243.27,243.99,244.12,248.81,250.14,255.28,262.75,261.30,265.83,267.65,
+265.83,274.86,276.80,283.20,279.91,284.58,284.27,294.60,296.03,298.03,
+302.26,304.26,302.24,311.43,314.89,318.43,313.59,319.71,323.81,325.10,
+328.76,335.14,333.43,336.07,346.05,343.63,348.83,354.50,358.79,355.60,
+362.55,362.97,367.74,369.79,364.50,377.43,378.07,378.39,383.55,387.59,
+387.63,394.25,393.71,398.77,402.24,404.33,404.02,413.45,410.35,415.05,
+418.52,422.52,423.95,429.07,426.95,434.38,435.29,438.33,444.37,447.73,
+445.64,455.36,455.32,459.93,461.31,464.58,469.06,467.73,473.61,476.32,
+482.74,484.33,487.40,491.09,494.23,494.00,496.86,495.51,507.70,506.64,
+508.79,512.78,516.86,515.74,519.82,522.11,525.98,526.02,535.80,536.15,
+539.35,539.80,547.61,549.26,551.12,556.64,557.61,559.17,562.16,569.77,
+566.93,570.36,575.69,581.75,579.39,587.58,587.61,587.62,589.42,596.37,
+594.57,602.05,600.75,606.68,612.86,615.62,621.46,623.54,622.02,621.03,
+630.89,630.86,631.62,636.83,642.03,643.34,649.27,648.75,653.34,655.51,
+656.69,665.13,660.35,664.97,671.82,669.42,675.95,683.76,678.48,680.54,
+688.20,686.84,693.04,696.27,698.33,700.27,699.46,706.35,713.06,710.42,
+720.14,718.30,723.60,723.73,725.50,728.80,733.78,740.49,744.37,737.81,
+749.53,752.30,751.78,751.07,759.79,762.19,764.12,765.07,770.23,775.12,
+778.96,781.71,780.99,792.00,785.55,791.79,791.21,798.34,802.29,802.27,
+803.93,811.84,813.59,824.20,818.93,815.41,824.70,836.06,825.50,835.40,
+841.38,838.90,843.08,846.54,854.00,856.20,857.41,853.41,860.25,859.53,
+864.41,868.38,868.90,876.95,872.79,886.25,886.94,888.91,890.60,897.39,
+27.91,31.91,33.84,37.21,39.01,40.71,42.61,46.60,50.65,51.91,
+54.53,57.35,58.69,63.89,65.66,67.12,70.25,74.22,76.80,78.40,
+81.89,82.77,87.07,89.34,91.91,93.74,95.44,98.10,103.44,105.63,
+108.63,112.76,113.61,116.09,119.96,119.86,124.33,126.00,127.07,131.90,
+135.38,139.81,139.70,143.65,141.78,148.07,152.69,153.51,155.86,162.42,
+156.69,163.01,165.05,168.69,172.73,172.42,176.96,179.74,182.66,185.22,
+186.07,188.22,194.68,195.40,198.61,201.54,202.15,203.16,208.08,213.53,
+214.45,214.88,217.65,224.60,226.34,225.94,232.42,234.20,236.71,234.60,
+244.15,244.41,248.61,246.89,250.95,252.94,256.71,259.65,260.82,264.40,
+267.87,268.43,276.22,275.15,280.51,277.56,285.25,286.31,291.99,293.76,
+291.98,297.60,302.32,305.18,302.80,306.78,310.10,315.72,316.55,319.58,
+321.90,322.65,325.20,328.74,330.76,334.79,334.70,339.57,349.47,345.10,
+349.17,347.83,353.18,359.17,359.80,357.25,365.27,364.56,369.17,368.55,
+370.74,376.40,378.82,381.55,386.04,386.55,391.60,393.35,398.02,397.41,
+399.90,404.10,405.49,409.46,413.02,413.02,413.35,418.48,420.38,425.24,
+426.00,428.73,428.30,437.61,437.18,440.35,444.85,445.16,447.47,450.65,
+453.62,459.57,462.78,463.15,465.71,464.90,473.14,474.02,475.60,476.65,
+479.76,482.69,480.23,484.69,487.33,493.41,496.48,498.28,497.18,509.89,
+505.96,510.90,511.03,512.66,516.87,516.66,522.00,521.92,527.92,532.11,
+531.52,538.20,538.83,537.40,546.20,545.34,546.94,550.05,555.75,558.51,
+554.72,560.63,563.63,569.03,572.63,573.11,575.25,578.69,576.56,574.62,
+588.30,587.55,586.44,596.22,596.02,599.84,600.01,606.35,606.92,615.18,
+617.24,614.61,621.40,619.74,618.24,630.09,625.00,633.92,629.79,631.73,
+644.04,640.42,647.24,653.41,656.25,649.72,651.96,655.59,661.59,664.49,
+663.96,668.39,673.13,672.64,672.29,675.82,677.31,682.64,687.01,692.64,
+685.97,696.59,698.73,699.75,704.90,709.67,706.59,709.97,712.50,721.47,
+717.68,715.99,725.48,726.14,731.59,734.58,734.61,734.06,741.26,745.11,
+745.64,744.96,752.38,751.16,758.63,761.96,766.17,766.52,765.06,759.59,
+772.10,775.07,778.42,778.29,787.53,779.76,788.29,792.78,792.36,797.35,
+25.39,28.43,29.67,31.15,34.51,37.36,39.64,41.79,45.09,46.27,
+48.30,50.45,54.24,54.55,58.79,59.10,60.74,64.37,67.19,69.81,
+71.67,75.13,76.81,80.04,79.57,86.71,87.11,88.06,91.52,93.98,
+95.61,97.81,100.56,101.96,102.89,106.31,109.93,113.24,111.07,115.98,
+119.91,121.66,124.39,126.73,127.61,132.87,132.08,137.71,137.45,141.25,
+142.88,145.22,148.24,150.82,152.35,154.00,157.63,161.27,165.60,166.68,
+164.82,168.79,172.41,176.00,175.33,181.86,178.79,185.34,186.80,185.88,
+192.33,189.62,194.15,197.25,197.09,198.10,203.87,210.18,208.20,209.25,
+213.45,213.96,214.87,219.07,225.25,227.31,227.69,229.59,231.17,235.29,
+240.89,240.52,243.02,245.82,250.82,251.69,249.89,257.41,258.02,260.68,
+262.50,263.10,264.68,266.79,273.95,269.85,275.24,278.23,281.48,280.24,
+285.25,288.69,290.19,292.00,293.23,297.66,296.83,301.18,309.77,302.42,
+310.86,311.90,317.18,315.35,318.99,320.20,323.49,326.52,328.67,331.10,
+332.43,334.79,338.83,338.18,339.27,350.28,347.75,344.06,348.37,353.61,
+356.12,358.15,364.11,362.56,364.33,366.81,370.72,373.53,374.22,375.07,
+377.51,377.63,385.40,387.62,385.45,392.19,393.62,393.30,398.30,397.52,
+404.46,406.04,411.13,410.59,413.65,415.74,416.86,423.27,419.48,423.72,
+427.33,431.22,427.13,434.89,436.79,440.52,440.23,448.35,447.03,449.95,
+449.45,453.84,457.37,456.75,463.13,462.15,465.17,470.66,468.88,471.19,
+473.42,475.67,476.60,482.27,480.05,482.96,484.21,492.65,495.29,495.31,
+501.07,502.06,504.17,503.57,509.21,510.97,515.50,515.05,521.64,520.18,
+515.77,521.92,527.06,520.89,527.84,537.00,536.98,540.75,541.15,545.20,
+546.61,548.14,546.21,557.39,562.87,559.77,559.99,564.62,558.55,568.49,
+566.85,577.93,572.80,577.59,572.60,577.79,586.70,583.77,589.21,591.91,
+594.08,599.49,595.15,605.47,601.87,607.26,605.43,606.80,605.76,615.98,
+618.24,612.54,619.47,623.39,621.26,629.78,630.90,635.39,633.13,638.01,
+641.20,641.29,647.11,647.60,646.45,652.65,651.61,656.21,661.95,661.59,
+660.91,669.00,668.18,670.22,672.99,676.55,677.18,676.43,681.24,683.53,
+689.25,687.43,693.85,695.77,695.31,695.45,705.40,703.87,706.98,712.72,
+22.12,24.44,26.56,28.96,29.86,33.01,35.86,37.96,38.64,41.55,
+42.66,44.43,47.64,49.25,51.30,55.02,55.16,58.26,60.17,62.14,
+65.62,65.71,69.29,73.10,72.27,74.35,76.20,76.93,82.49,82.83,
+85.83,84.96,89.40,90.55,94.07,94.99,97.37,98.69,101.72,103.15,
+106.93,107.52,109.01,114.08,114.82,117.25,120.09,119.55,123.82,123.32,
+127.92,130.38,129.66,135.28,136.47,137.56,138.17,140.54,144.08,147.57,
+146.47,147.86,150.76,155.10,156.63,156.14,163.10,165.38,170.54,166.24,
+165.87,169.70,172.42,174.68,174.90,178.21,179.71,185.64,188.72,190.77,
+188.78,192.41,194.90,194.96,198.68,197.86,202.68,201.92,208.93,208.96,
+209.15,210.29,215.63,216.07,218.33,222.97,222.82,226.63,228.69,227.67,
+231.29,230.61,233.28,239.34,237.48,242.42,243.86,245.65,248.49,253.60,
+255.11,252.44,257.09,260.84,260.84,262.50,261.37,267.82,271.55,276.45,
+272.17,275.04,280.57,279.52,282.05,287.91,287.52,289.55,289.86,293.99,
+292.35,297.77,299.73,300.93,306.45,306.20,305.31,310.16,315.66,311.06,
+317.19,315.75,321.27,320.52,324.56,327.24,328.74,334.97,332.98,341.98,
+333.58,339.08,342.78,344.65,345.88,344.89,351.74,352.81,356.33,353.24,
+354.98,361.46,361.59,362.47,365.16,372.19,374.25,369.20,373.63,376.23,
+377.10,378.36,381.69,385.37,384.90,389.71,391.67,394.74,391.68,392.17,
+398.79,401.27,402.59,400.07,407.68,408.51,413.22,412.65,414.06,419.10,
+421.74,424.20,420.97,425.18,425.85,434.76,438.09,434.21,441.97,441.42,
+445.80,445.30,446.66,446.87,455.13,454.11,454.57,454.92,452.33,464.42,
+460.93,468.77,472.01,468.46,471.55,476.49,473.32,477.41,481.85,486.59,
+485.74,489.16,486.26,491.21,489.59,496.43,491.16,504.57,499.79,506.39,
+508.12,510.67,506.69,515.15,513.71,513.14,513.36,520.58,522.57,519.27,
+525.72,527.53,526.51,529.92,528.15,539.44,544.26,542.71,541.71,544.47,
+543.47,549.81,551.66,555.74,551.83,555.32,562.75,563.20,568.28,563.65,
+567.15,571.06,570.17,575.98,575.72,576.74,578.93,584.12,582.80,585.48,
+584.66,593.61,591.09,596.66,600.91,599.57,603.49,601.91,601.31,607.70,
+612.83,615.68,605.65,622.65,620.98,618.72,621.51,626.92,625.04,628.37,
+20.00,21.69,22.92,23.21,26.80,28.01,30.09,31.39,34.49,36.84,
+38.88,39.90,41.41,45.18,46.87,49.11,49.04,50.61,52.57,52.63,
+56.74,59.41,59.50,62.51,63.18,64.60,68.06,68.35,71.88,75.84,
+76.13,78.30,77.72,80.65,84.37,83.43,86.47,89.37,90.09,92.74,
+96.62,96.67,97.87,102.59,101.61,102.57,105.56,107.88,106.54,109.61,
+112.49,114.18,117.06,117.21,120.10,121.43,125.37,125.71,128.80,129.11,
+132.58,133.95,132.68,136.54,141.09,144.67,143.18,145.05,143.22,149.79,
+151.02,154.95,155.06,154.92,156.37,161.44,162.12,165.29,164.03,164.69,
+168.49,170.00,171.21,171.43,173.82,177.26,181.25,182.33,181.13,187.15,
+184.62,185.85,191.19,193.05,196.25,200.18,196.65,197.60,203.08,200.67,
+208.32,208.06,208.35,211.38,216.07,214.13,213.58,219.78,224.31,221.45,
+223.00,229.17,229.11,229.57,231.95,232.29,235.15,235.89,235.77,238.99,
+246.19,241.88,243.83,249.16,249.78,251.94,251.74,252.93,258.49,256.17,
+258.94,259.81,261.71,267.80,269.85,272.04,272.15,278.68,280.35,276.74,
+276.55,282.77,282.57,285.87,289.89,288.66,291.87,292.70,293.83,300.03,
+298.61,301.04,303.79,303.54,304.28,309.95,310.11,311.86,310.07,317.11,
+315.14,316.62,322.95,322.19,327.32,325.50,329.45,331.29,330.73,331.10,
+336.59,334.69,336.71,341.90,337.05,347.58,346.68,344.76,352.19,351.62,
+357.16,354.28,363.04,361.69,355.62,363.88,367.61,366.85,368.94,372.38,
+369.99,374.52,379.79,375.75,383.75,381.80,382.18,389.25,389.01,388.57,
+388.40,390.18,392.05,396.21,394.24,402.34,400.59,406.08,403.41,407.93,
+406.87,414.89,409.48,412.75,416.34,419.27,420.28,421.47,424.08,429.76,
+418.61,432.14,434.56,429.42,438.94,433.99,440.38,439.39,443.87,443.85,
+450.55,445.61,452.41,459.61,451.39,451.73,455.54,459.63,464.48,468.98,
+463.21,471.00,469.24,470.67,472.47,470.97,481.52,479.36,479.07,482.93,
+485.88,483.39,485.03,484.95,487.59,494.79,502.06,500.34,501.03,502.50,
+500.38,509.17,512.03,503.27,514.82,511.31,511.74,514.30,519.80,526.50,
+519.57,524.31,525.68,526.53,523.00,532.61,533.01,536.40,539.28,538.18,
+541.88,544.55,549.63,547.41,550.22,549.45,549.69,547.96,551.98,554.99,
+16.94,18.50,21.08,22.65,25.15,24.87,26.63,28.76,30.38,32.38,
+34.86,35.30,36.45,37.26,42.43,40.70,43.80,46.64,45.39,49.41,
+51.15,53.03,52.91,55.05,59.26,59.01,61.02,60.55,63.20,64.20,
+65.80,68.99,70.26,72.24,71.56,76.86,76.41,79.60,80.18,81.20,
+83.86,84.72,84.40,89.45,88.62,88.62,91.54,94.05,94.44,98.50,
+97.22,99.22,102.44,102.27,105.54,107.62,110.85,110.68,113.11,114.97,
+114.32,116.13,121.62,122.12,120.27,123.38,126.27,124.05,124.24,132.18,
+133.54,133.41,134.81,139.11,138.71,140.38,143.61,146.93,146.39,149.49,
+148.07,151.08,153.37,153.39,155.30,157.42,158.07,155.07,162.47,165.87,
+162.18,166.99,168.55,169.83,169.17,176.53,176.60,174.18,178.22,184.00,
+182.12,182.72,182.00,188.04,184.64,191.00,193.84,189.70,195.73,194.38,
+198.59,200.06,198.60,203.44,206.04,207.09,206.06,210.52,211.12,213.44,
+218.68,213.30,214.13,221.93,218.63,219.38,226.78,230.10,226.37,228.97,
+233.40,233.82,228.92,235.31,238.41,243.86,236.74,245.64,245.64,242.97,
+247.31,249.69,252.61,251.49,250.14,250.86,258.11,261.26,261.04,261.51,
+262.71,267.94,267.63,266.94,271.24,273.07,271.55,275.87,277.74,278.74,
+275.68,282.14,282.29,285.75,288.95,289.68,289.00,291.26,295.00,296.21,
+298.53,294.04,301.20,303.18,301.30,307.14,314.06,306.41,309.32,314.03,
+314.07,311.99,316.94,320.55,322.82,325.10,323.29,327.12,324.79,334.21,
+326.50,330.17,325.90,333.40,340.82,338.94,338.79,343.18,343.90,345.05,
+341.07,346.32,347.26,352.59,352.51,352.69,354.55,354.89,359.90,363.39,
+365.81,365.21,363.27,365.41,368.16,373.29,372.63,373.43,373.86,371.28,
+382.52,379.29,383.45,383.07,385.73,384.51,389.79,392.94,388.06,393.62,
+395.63,398.94,400.52,400.26,402.72,404.79,405.17,408.55,404.42,414.14,
+411.16,410.59,412.43,416.72,421.24,411.90,425.97,421.78,421.25,429.30,
+432.16,428.94,428.99,433.44,437.05,439.71,440.12,441.47,441.43,441.40,
+442.45,446.13,446.12,451.16,456.02,447.29,454.93,459.09,456.13,462.89,
+459.87,466.04,463.15,472.34,465.56,480.19,473.83,470.86,471.74,477.09,
+475.94,476.02,477.39,486.19,487.99,490.82,487.57,488.88,495.13,492.26,
+17.06,17.37,18.55,19.69,20.60,21.95,24.19,25.72,27.93,29.48,
+31.52,30.52,34.24,34.06,37.73,36.44,38.58,39.49,39.79,42.86,
+45.30,45.95,47.84,49.22,49.91,53.65,52.87,54.26,56.35,57.72,
+60.83,61.89,60.07,62.77,64.90,66.55,66.81,67.86,70.94,72.88,
+74.26,76.12,76.14,78.77,81.26,82.42,82.14,84.58,86.62,85.89,
+90.19,88.41,90.18,93.16,92.76,96.34,96.99,100.82,100.80,101.77,
+104.34,106.41,104.63,106.58,105.92,111.10,112.48,110.25,112.89,118.26,
+119.14,117.87,120.40,120.84,121.15,125.52,127.96,126.49,129.42,127.30,
+132.41,134.55,135.52,136.22,139.43,138.20,137.50,139.26,142.24,147.71,
+145.67,147.15,147.57,148.23,147.78,153.13,156.33,155.90,155.62,160.17,
+160.76,162.87,161.18,168.70,166.49,170.03,167.02,169.82,170.43,174.76,
+175.64,177.27,179.74,180.88,179.37,178.42,185.25,182.86,187.59,188.81,
+187.67,190.51,192.28,194.91,196.79,195.38,199.86,201.60,202.12,202.67,
+202.21,201.72,207.84,205.94,209.04,212.91,212.19,211.95,214.96,215.98,
+218.48,220.00,224.04,224.91,223.56,223.94,224.89,227.85,229.77,235.08,
+232.29,232.17,239.71,237.13,239.10,241.10,243.09,242.16,245.41,248.17,
+248.21,247.44,248.93,250.92,253.74,256.44,257.37,254.01,257.95,261.32,
+262.92,258.08,265.72,263.27,270.02,269.70,269.41,270.82,274.10,277.35,
+280.15,274.28,281.49,277.99,286.91,279.55,288.91,284.79,291.39,291.65,
+291.31,300.89,294.94,294.21,297.94,300.95,296.39,301.10,308.20,305.39,
+304.61,308.02,307.16,309.08,310.75,316.79,311.37,316.86,318.79,318.67,
+326.79,323.11,322.24,326.57,324.61,330.15,331.03,330.15,327.87,336.09,
+334.67,334.36,339.99,343.62,339.05,340.72,344.60,338.31,353.43,342.94,
+352.34,353.06,358.69,354.77,356.55,358.10,359.00,365.87,355.50,361.23,
+367.25,364.44,368.62,367.43,368.83,368.97,373.79,372.20,376.30,372.43,
+379.17,376.33,379.46,382.78,383.87,381.52,389.39,389.27,394.29,396.62,
+393.80,390.82,397.60,399.19,395.63,402.59,400.73,402.75,409.73,405.00,
+403.84,412.36,414.92,413.36,415.24,419.36,413.85,417.96,416.08,418.63,
+425.12,423.91,422.38,424.28,428.29,433.41,433.01,431.16,432.64,435.12,
+13.62,15.11,15.06,18.56,17.99,19.92,20.62,24.16,23.66,25.89,
+25.62,26.49,28.40,30.11,31.03,33.40,35.16,33.90,36.62,37.07,
+39.16,39.56,41.68,43.77,44.48,44.14,45.93,47.50,48.41,51.86,
+52.28,54.04,55.88,55.63,58.14,59.63,61.39,61.17,64.84,63.89,
+64.20,65.39,69.22,68.22,67.42,71.92,73.98,72.21,76.30,77.70,
+77.09,78.78,78.89,81.71,83.71,82.42,86.79,84.84,86.80,88.79,
+90.33,93.64,93.64,95.77,95.42,96.76,98.70,99.46,99.71,101.81,
+100.93,106.24,106.87,106.82,106.88,106.19,110.26,114.79,116.79,113.44,
+114.24,116.83,115.00,120.48,121.25,123.07,124.90,127.79,128.36,124.92,
+126.14,125.53,129.10,131.91,133.14,136.19,138.08,136.51,138.70,142.18,
+143.65,139.89,143.84,143.49,144.39,150.16,150.52,148.78,154.05,153.93,
+155.87,158.67,156.07,156.91,158.70,157.51,161.27,164.11,162.57,166.12,
+171.03,166.81,169.61,171.61,172.36,171.85,171.82,177.36,176.15,176.41,
+179.41,180.96,184.97,185.06,185.21,187.83,187.69,188.30,191.70,190.99,
+194.23,193.31,196.37,196.67,199.56,201.00,203.43,200.59,200.21,203.82,
+206.59,208.09,206.84,209.74,209.91,212.12,211.84,214.14,214.57,214.95,
+212.77,218.63,220.66,220.84,223.96,224.16,226.29,224.94,226.44,227.51,
+227.91,235.84,231.50,232.97,236.28,237.23,238.16,242.55,245.13,242.47,
+240.38,244.52,247.05,248.37,248.90,252.59,251.40,253.33,253.38,258.48,
+253.69,260.06,256.25,263.77,262.89,264.63,261.94,266.54,265.62,269.71,
+270.39,269.91,276.51,272.48,272.15,275.48,284.90,276.55,279.75,286.30,
+283.50,284.56,285.33,286.95,287.90,288.58,288.68,288.95,291.54,294.90,
+295.41,295.40,292.06,299.27,302.77,300.15,304.20,304.36,303.06,307.33,
+305.49,308.37,307.46,312.38,311.73,311.38,317.40,314.84,314.31,319.05,
+318.86,322.82,325.72,326.22,325.38,325.39,328.39,329.26,332.54,327.63,
+334.51,337.91,337.77,340.03,341.88,341.03,343.04,338.85,343.01,346.68,
+342.97,345.96,349.41,350.62,350.95,349.34,350.91,358.46,355.15,360.22,
+359.31,361.29,362.05,362.14,364.68,360.02,363.80,372.43,373.53,366.34,
+371.58,374.48,375.82,372.96,371.92,375.55,377.94,384.53,385.67,382.36,
+10.60,13.89,14.05,15.27,16.49,17.26,18.64,20.26,19.86,22.47,
+24.14,24.27,27.00,25.57,26.56,28.89,29.92,30.41,31.59,32.72,
+33.07,35.11,36.79,37.89,38.73,40.17,41.95,42.98,42.01,43.66,
+45.06,46.22,46.67,47.90,51.33,50.36,51.84,54.65,53.68,55.77,
+55.99,56.34,58.94,60.32,59.60,64.81,64.80,65.03,65.48,68.40,
+68.37,70.47,72.63,72.70,71.93,72.90,75.57,76.74,78.84,77.91,
+78.30,78.41,80.93,83.75,82.63,84.77,87.16,90.50,86.38,90.31,
+90.47,92.17,92.66,94.70,97.31,94.39,98.06,97.62,99.74,99.20,
+101.61,105.09,101.65,107.35,108.73,105.12,108.78,107.42,111.31,115.09,
+113.68,118.47,112.25,116.15,119.96,120.77,120.84,119.94,123.20,124.12,
+123.68,123.76,128.61,129.36,128.62,132.71,130.84,133.50,131.15,133.53,
+135.11,136.21,134.59,136.73,139.17,141.80,143.73,145.93,142.73,147.98,
+146.89,149.44,150.20,156.96,149.12,155.15,153.42,156.05,156.93,157.49,
+161.39,158.86,158.89,164.03,163.05,163.16,164.15,169.47,165.79,167.65,
+169.49,169.31,170.41,172.70,175.69,172.24,173.01,177.31,176.15,179.45,
+184.40,178.46,181.65,184.79,185.60,189.23,189.07,189.51,191.81,191.53,
+188.96,191.39,196.89,193.88,198.19,195.94,198.46,197.80,202.85,200.95,
+200.54,203.96,206.84,206.44,211.01,210.64,214.07,211.22,214.55,210.35,
+213.87,215.52,215.51,217.41,222.49,222.35,221.82,227.22,222.27,220.73,
+226.48,225.55,227.29,231.70,230.17,229.56,235.37,232.41,236.91,236.60,
+236.96,239.55,238.86,239.12,240.97,240.62,242.82,244.40,248.36,246.45,
+249.93,251.35,249.76,250.25,253.10,253.46,254.30,253.13,249.55,257.65,
+259.01,261.36,260.04,264.47,267.15,262.56,262.29,266.19,270.54,269.18,
+267.86,269.32,275.58,277.30,280.15,279.62,281.95,279.48,280.14,281.23,
+284.13,285.75,280.84,281.38,288.36,285.59,294.94,291.53,292.56,290.35,
+290.51,293.41,298.89,295.86,297.41,299.71,301.04,300.87,301.76,302.10,
+307.59,312.14,303.84,310.87,306.29,311.30,315.08,310.61,313.80,314.56,
+314.91,318.67,314.18,321.76,324.33,319.65,324.83,323.03,327.56,323.63,
+325.01,322.88,329.95,329.07,331.30,333.80,332.08,337.36,337.93,341.59,
+10.05,11.53,11.80,14.18,13.81,14.86,15.79,16.74,18.60,19.12,
+19.66,20.38,22.74,24.59,24.84,24.82,28.26,26.68,27.61,29.02,
+29.82,31.37,33.10,34.15,34.90,36.21,36.42,36.24,38.28,39.86,
+38.45,40.55,43.39,42.58,42.70,43.70,47.62,48.78,45.50,49.01,
+52.57,49.59,52.50,53.04,53.21,55.80,57.51,58.10,56.33,59.13,
+60.52,60.14,63.47,63.35,64.01,66.60,64.47,68.61,67.16,66.62,
+69.87,70.27,72.16,75.39,73.15,74.43,76.69,77.16,76.19,79.50,
+77.36,80.15,84.40,80.73,82.28,84.66,85.30,84.26,89.55,88.85,
+88.67,90.36,92.55,94.35,96.30,95.16,96.75,96.55,95.06,99.00,
+97.98,99.05,102.76,103.15,105.38,108.06,105.93,107.36,110.65,108.95,
+112.41,107.90,111.14,112.30,116.42,115.19,114.93,119.59,118.91,117.35,
+119.47,117.57,125.49,122.12,123.98,127.10,124.17,124.99,126.84,128.70,
+130.04,129.95,130.88,132.78,133.06,133.25,135.75,136.87,140.87,138.65,
+140.09,140.85,140.87,140.37,142.45,147.69,143.64,144.68,148.72,147.02,
+150.29,149.71,149.22,153.71,149.45,150.48,154.37,157.85,157.49,157.67,
+159.36,159.71,162.58,162.87,162.85,162.84,167.03,167.82,166.51,168.65,
+169.21,171.54,167.16,174.34,176.06,172.60,174.83,175.09,178.33,180.34,
+174.20,179.09,182.54,181.61,182.39,186.94,187.05,187.04,192.27,187.83,
+189.07,192.84,187.67,193.69,195.46,191.88,195.66,195.06,195.06,197.22,
+199.95,199.47,204.90,200.25,199.32,203.92,208.69,204.32,207.46,207.55,
+208.95,209.30,209.37,213.44,213.88,218.55,214.37,215.63,217.96,217.26,
+221.77,218.00,220.64,221.03,222.68,222.59,226.18,224.88,231.05,228.32,
+230.43,232.68,236.11,230.19,236.24,234.46,231.61,238.23,234.65,237.53,
+242.46,237.28,240.10,239.75,243.62,244.93,246.47,248.59,244.18,248.85,
+247.12,251.35,250.57,252.27,243.99,251.54,253.94,255.17,254.51,256.50,
+262.59,259.56,260.16,261.19,262.07,260.33,263.14,261.50,264.26,267.96,
+269.03,271.11,270.02,271.90,274.00,276.75,275.27,275.86,270.63,276.48,
+280.54,276.23,282.94,280.70,285.37,281.91,283.17,283.37,289.55,288.89,
+287.97,291.42,290.43,290.99,290.62,293.19,294.18,295.59,287.14,297.40,
+58.60,64.20,69.76,74.73,81.15,86.43,91.23,96.86,102.20,109.48,
+113.66,119.76,124.70,130.36,136.35,140.68,145.83,150.29,157.12,162.19,
+167.69,174.20,179.79,184.99,191.13,196.01,203.40,206.29,211.45,218.04,
+223.77,229.51,231.30,242.63,244.85,250.30,254.64,261.66,269.24,273.42,
+276.62,284.79,288.75,295.99,299.64,307.53,312.25,317.13,324.44,329.27,
+332.06,339.32,345.90,348.85,355.99,360.79,366.74,372.42,376.81,381.82,
+388.31,393.68,400.80,405.38,412.03,417.54,418.09,428.39,433.24,437.88,
+444.16,448.80,454.28,461.85,464.67,473.93,477.74,482.36,489.11,492.67,
+498.42,505.17,512.11,512.01,520.77,522.66,532.75,539.07,543.40,548.05,
+553.20,559.14,564.54,569.12,574.86,581.07,588.53,592.46,595.27,602.36,
+609.48,612.71,619.68,624.43,630.43,637.09,641.74,647.47,651.73,658.83,
+663.90,670.12,676.13,681.58,685.80,691.05,693.16,702.85,709.78,715.10,
+718.33,722.75,729.89,737.70,738.08,747.52,750.75,756.45,763.30,766.98,
+775.67,782.80,785.24,789.23,796.88,798.96,807.56,809.25,816.64,820.36,
+827.50,831.50,839.07,845.84,854.56,859.31,858.38,867.45,871.19,878.48,
+880.95,884.75,891.78,899.30,906.09,908.52,914.64,919.44,929.21,932.05,
+939.34,944.75,947.86,954.99,959.96,963.28,973.34,974.62,981.40,987.59,
+995.78,1000.46,1003.48,1007.27,1013.42,1019.66,1027.00,1032.75,1038.06,1043.43,
+1047.07,1051.21,1059.96,1067.02,1070.17,1075.35,1079.09,1085.67,1094.63,1096.16,
+1100.06,1107.22,1116.44,1120.91,1126.42,1128.66,1136.09,1144.84,1141.29,1151.67,
+1156.06,1164.02,1168.24,1172.96,1176.30,1186.87,1187.56,1195.18,1202.33,1211.91,
+1217.70,1217.13,1223.94,1231.02,1236.30,1243.52,1245.06,1251.52,1258.16,1263.37,
+1268.43,1274.02,1280.21,1285.64,1291.64,1299.53,1300.87,1308.75,1312.91,1315.38,
+1321.06,1327.86,1331.20,1337.96,1344.79,1349.75,1360.27,1368.88,1364.88,1370.31,
+1379.02,1382.58,1383.49,1396.20,1401.80,1407.04,1416.63,1416.87,1423.33,1428.71,
+1433.64,1435.70,1442.74,1449.21,1450.58,1458.27,1469.70,1473.12,1477.54,1486.20,
+1488.78,1493.46,1496.52,1509.64,1514.73,1511.17,1522.26,1523.82,1533.40,1537.80,
+1546.82,1554.38,1552.95,1557.58,1563.92,1571.63,1580.46,1586.37,1588.48,1590.60,
+1597.61,1606.54,1610.87,1616.63,1624.76,1627.22,1635.47,1645.06,1642.60,1650.43,
+53.49,58.40,62.54,69.03,73.61,77.94,83.48,89.29,94.54,99.10,
+103.01,108.56,112.73,118.76,124.05,126.64,132.58,139.08,143.88,150.34,
+154.89,158.45,164.51,168.75,173.50,178.35,184.64,187.29,193.56,199.63,
+203.98,208.08,214.36,219.51,224.31,230.26,232.34,238.05,242.27,250.96,
+255.83,258.42,263.90,268.80,272.91,280.33,284.62,287.65,297.57,298.05,
+305.20,310.36,313.67,319.76,323.24,329.88,333.12,340.69,345.25,349.08,
+356.05,357.48,365.82,368.51,376.17,377.85,384.35,386.60,395.02,396.89,
+403.52,407.82,415.82,421.05,424.28,429.88,435.64,439.12,445.14,447.87,
+455.66,459.96,465.93,469.82,475.56,477.21,486.44,490.21,492.83,497.47,
+504.81,512.70,520.16,520.39,524.94,530.57,534.01,545.84,547.41,548.79,
+553.18,563.13,565.79,571.32,577.41,580.05,587.50,592.95,595.07,599.50,
+607.36,610.60,615.95,621.07,627.38,631.73,638.53,641.48,645.41,651.74,
+659.01,664.38,666.11,672.72,676.30,682.45,687.32,694.79,699.92,702.61,
+709.12,712.07,713.70,718.77,726.37,733.93,740.27,739.74,741.27,756.52,
+758.64,762.82,769.82,770.70,777.01,778.58,783.56,792.39,801.32,801.62,
+807.49,811.18,818.20,821.23,825.50,833.59,835.31,844.48,849.06,852.49,
+858.47,861.45,868.64,873.47,879.77,880.84,887.09,892.58,896.32,900.45,
+907.05,909.96,915.92,924.20,928.17,931.99,938.62,944.21,947.41,957.69,
+955.15,957.52,969.88,969.31,978.61,979.91,988.13,990.24,998.89,1002.81,
+1008.80,1016.60,1016.95,1022.60,1025.01,1032.48,1037.80,1048.44,1051.07,1052.04,
+1059.30,1060.64,1066.90,1069.16,1076.73,1085.91,1087.71,1092.71,1099.95,1105.37,
+1107.89,1110.08,1117.50,1124.39,1129.92,1136.01,1136.84,1144.90,1150.82,1151.70,
+1157.72,1162.60,1166.04,1170.30,1176.04,1180.62,1185.19,1194.79,1196.68,1204.82,
+1210.20,1215.00,1218.11,1225.74,1227.04,1236.64,1235.98,1246.01,1249.72,1253.46,
+1259.77,1262.88,1271.85,1269.80,1279.09,1286.50,1295.68,1294.40,1299.35,1310.30,
+1308.76,1315.82,1318.20,1321.97,1327.59,1335.13,1339.26,1346.98,1354.10,1357.88,
+1356.27,1364.44,1367.28,1377.41,1382.82,1387.27,1389.43,1397.09,1401.12,1398.67,
+1413.84,1415.42,1415.38,1428.59,1431.38,1430.46,1439.33,1444.42,1456.80,1457.60,
+1459.40,1462.51,1472.14,1475.46,1475.34,1486.50,1491.07,1492.87,1502.15,1502.75,
+48.48,52.46,57.47,61.56,66.11,71.82,75.90,80.55,84.72,89.66,
+93.55,100.50,103.71,109.27,111.86,118.09,122.16,127.45,132.59,135.13,
+137.92,145.10,148.43,155.19,158.57,164.66,165.64,172.60,177.06,180.81,
+184.48,189.27,193.67,200.31,203.58,209.74,213.88,219.10,222.07,226.98,
+226.85,235.94,239.95,248.10,252.31,255.41,260.58,264.20,264.92,271.35,
+277.51,280.80,284.39,292.21,296.55,297.36,305.22,305.65,313.34,316.07,
+323.77,328.55,333.06,335.97,338.89,344.29,352.83,356.24,360.09,363.12,
+366.78,373.31,377.57,383.89,388.06,390.58,396.17,402.75,404.87,409.32,
+413.58,418.17,421.91,429.58,431.70,436.87,440.82,447.20,450.52,456.86,
+461.50,464.03,466.75,473.63,479.18,483.54,487.21,493.75,499.28,502.79,
+505.86,511.66,513.48,517.75,525.07,531.16,533.97,538.89,540.38,549.33,
+550.75,553.32,559.33,563.38,569.31,577.67,579.08,583.96,583.89,593.70,
+597.73,602.62,606.39,614.60,614.09,618.83,624.06,630.22,630.50,639.77,
+636.32,643.80,653.26,656.85,659.91,668.22,669.51,674.20,679.71,685.38,
+692.11,692.91,697.86,704.64,710.02,706.60,720.69,724.75,729.23,731.89,
+731.88,737.12,751.39,745.88,753.27,761.71,763.76,771.43,769.90,771.83,
+783.59,782.94,786.27,792.75,796.87,805.18,809.99,817.54,817.83,824.84,
+827.88,832.66,833.10,839.74,845.61,852.43,849.26,855.58,860.18,868.48,
+870.48,878.20,879.51,886.63,892.96,897.72,896.23,904.58,912.63,916.35,
+918.70,923.68,924.40,926.84,932.37,933.49,940.74,950.63,956.24,957.18,
+961.72,966.28,973.69,978.68,976.77,982.12,990.83,998.69,997.40,1010.07,
+1008.80,1011.60,1015.74,1022.93,1023.05,1026.52,1036.82,1041.97,1044.41,1050.35,
+1058.85,1061.67,1062.86,1063.11,1073.68,1081.76,1080.48,1087.66,1094.43,1098.32,
+1096.45,1107.35,1107.84,1113.39,1114.96,1114.78,1128.75,1130.57,1142.38,1135.29,
+1149.89,1150.40,1152.37,1161.85,1161.11,1167.08,1170.28,1177.76,1185.42,1188.80,
+1196.05,1194.96,1198.26,1202.81,1213.05,1213.50,1219.33,1229.43,1229.63,1229.45,
+1232.33,1240.51,1244.70,1254.51,1252.52,1259.36,1266.50,1268.81,1279.44,1283.67,
+1279.88,1288.18,1293.60,1294.29,1305.28,1307.77,1308.79,1313.21,1314.51,1327.97,
+1334.07,1332.62,1333.38,1339.67,1347.41,1353.48,1351.85,1361.97,1368.87,1370.15,
+44.52,48.46,52.70,56.75,61.19,64.36,70.42,72.81,76.41,79.63,
+86.56,89.64,94.33,96.22,102.56,106.41,109.72,115.09,119.69,123.12,
+127.98,131.54,135.28,138.52,142.04,147.18,152.00,157.52,159.73,163.65,
+165.39,172.98,177.56,180.75,184.37,187.29,192.88,197.06,199.40,204.51,
+208.75,213.25,217.33,222.70,227.73,232.34,235.88,239.26,245.49,246.72,
+251.65,254.51,260.75,264.17,266.82,274.15,277.32,280.37,287.40,287.16,
+293.87,297.01,301.12,306.43,309.99,314.39,319.50,323.49,328.17,328.83,
+334.01,341.56,341.19,350.41,349.51,355.24,358.86,364.05,370.34,371.79,
+371.37,380.91,384.16,391.07,392.90,400.99,404.98,403.19,409.76,414.36,
+413.83,421.25,428.05,429.11,436.25,437.45,439.82,445.84,450.90,452.84,
+457.34,463.18,471.09,470.07,475.95,478.72,483.19,491.13,489.55,494.36,
+501.93,499.99,506.49,512.89,514.86,520.12,522.93,526.56,534.81,536.85,
+542.67,546.61,550.23,554.46,559.80,561.75,567.85,571.64,574.36,576.39,
+587.23,587.29,589.65,599.89,592.69,603.47,606.87,612.50,616.48,624.06,
+625.42,632.94,634.41,637.07,641.48,648.77,654.20,652.02,657.61,661.63,
+668.19,673.44,673.32,674.32,685.88,687.37,691.24,694.08,701.56,704.63,
+703.06,712.97,716.78,720.15,726.98,728.69,732.39,734.64,734.95,746.75,
+749.28,754.48,754.31,762.74,769.46,770.98,776.41,777.17,780.70,790.46,
+791.50,799.16,799.67,803.16,808.20,806.97,819.85,822.17,822.01,825.29,
+832.88,838.40,844.09,844.20,849.63,852.75,852.57,855.70,865.37,877.13,
+874.87,877.99,885.08,885.91,892.19,895.58,897.85,904.47,916.21,918.08,
+911.90,917.20,921.63,923.20,929.95,931.17,939.41,947.88,948.27,951.72,
+951.50,956.58,963.19,967.31,975.69,974.11,978.98,984.70,992.70,993.37,
+996.84,1000.54,1007.93,1009.43,1020.01,1016.64,1024.98,1026.39,1028.37,1038.08,
+1037.76,1044.24,1048.61,1053.88,1055.95,1057.81,1068.39,1066.50,1066.15,1079.61,
+1081.56,1079.80,1087.80,1091.93,1095.85,1104.32,1105.47,1114.70,1113.54,1114.73,
+1120.20,1122.63,1134.40,1141.39,1139.92,1146.07,1147.09,1151.08,1158.12,1158.81,
+1163.22,1173.35,1165.72,1175.03,1183.26,1188.82,1187.64,1194.88,1195.30,1197.30,
+1206.47,1212.79,1215.02,1218.98,1219.02,1226.70,1231.32,1236.64,1241.69,1246.63,
+40.77,45.10,47.42,51.71,54.23,57.21,63.62,65.67,69.86,74.23,
+78.95,81.28,84.28,88.30,92.28,96.09,101.20,103.30,106.76,111.93,
+114.05,119.49,122.75,126.18,127.74,136.20,138.45,144.47,147.29,150.15,
+153.62,155.97,158.71,164.90,166.66,171.43,174.31,180.11,182.51,187.64,
+189.85,193.52,198.83,202.53,206.24,209.06,213.37,219.08,218.63,223.11,
+229.62,233.20,236.96,238.29,242.61,244.74,250.31,252.63,259.24,261.58,
+265.60,266.46,273.38,278.68,281.10,284.92,287.06,291.74,298.19,299.09,
+303.58,308.56,311.84,315.35,317.96,322.88,320.78,328.98,335.58,338.82,
+339.45,343.07,350.19,350.61,358.89,360.34,361.80,364.57,369.68,372.82,
+380.83,378.72,383.41,389.85,393.78,393.70,398.99,401.26,408.67,409.30,
+418.42,416.18,425.26,426.73,425.93,432.46,439.99,437.77,442.19,446.61,
+456.07,458.08,460.21,463.69,467.93,475.77,474.84,478.81,481.11,487.16,
+490.55,495.59,496.94,505.22,509.30,510.34,509.99,519.32,524.13,526.31,
+527.25,532.35,535.65,540.00,544.55,542.87,550.04,554.04,556.60,562.42,
+562.96,568.55,575.85,575.61,580.14,588.62,589.27,587.70,596.87,596.68,
+601.55,609.05,609.93,617.40,618.83,623.69,627.77,630.77,631.32,636.66,
+641.32,644.40,650.58,653.43,654.12,658.94,664.13,669.32,671.39,673.82,
+675.83,684.51,684.72,692.77,693.46,695.17,704.75,703.58,709.07,719.05,
+718.10,718.31,719.51,728.66,731.21,734.78,733.20,741.18,744.87,751.02,
+754.17,755.77,756.82,765.27,768.83,774.03,777.04,779.52,786.26,790.56,
+786.15,791.38,799.92,802.06,808.40,809.80,809.55,816.65,817.40,823.90,
+823.64,831.06,834.08,843.90,849.45,851.07,851.32,860.96,857.52,863.59,
+865.34,862.60,877.81,878.20,879.83,888.77,887.95,894.92,896.78,897.90,
+903.74,910.90,908.09,917.00,913.38,924.06,931.85,925.17,935.39,942.69,
+936.14,949.96,949.13,955.02,956.88,959.67,961.36,970.38,967.03,974.75,
+978.58,984.44,983.78,986.50,991.38,994.47,1004.59,1005.00,1013.76,1009.43,
+1014.68,1016.18,1023.02,1026.87,1028.15,1033.77,1035.72,1042.38,1050.70,1048.67,
+1058.68,1055.81,1061.08,1065.25,1064.23,1070.78,1068.33,1082.07,1078.88,1081.52,
+1089.78,1097.67,1105.40,1101.47,1105.74,1104.40,1111.59,1116.13,1117.64,1124.94,
+37.03,39.44,43.60,46.52,48.55,52.60,55.16,60.72,62.22,66.02,
+68.78,71.32,76.52,79.89,83.66,86.42,90.20,93.18,96.96,102.34,
+103.32,106.75,107.98,115.18,114.94,120.96,124.60,125.62,131.87,134.45,
+137.42,141.43,145.18,146.82,151.93,153.88,157.77,160.66,166.35,169.35,
+173.30,175.99,178.35,184.14,185.41,190.04,190.52,193.58,198.30,205.26,
+204.64,206.22,213.12,214.70,219.26,219.83,227.16,228.89,233.11,236.88,
+243.24,244.46,246.31,246.98,255.46,254.07,260.20,261.24,266.79,268.46,
+271.01,272.07,277.36,283.45,288.87,289.61,294.69,300.02,298.20,299.70,
+305.01,308.90,312.51,316.84,320.57,328.85,326.24,332.62,334.38,339.33,
+340.89,342.16,346.76,351.90,358.17,360.21,360.99,359.85,363.48,370.68,
+377.66,377.85,380.42,383.74,390.55,393.69,395.67,394.86,400.97,407.85,
+412.11,416.85,417.07,421.14,423.66,425.42,429.74,435.31,433.64,440.97,
+441.51,444.03,452.24,454.69,455.99,458.02,463.30,466.03,469.31,472.92,
+480.27,480.15,482.11,490.17,486.63,494.88,499.48,499.42,503.54,503.82,
+509.97,509.54,520.79,523.75,522.01,525.96,534.18,529.69,541.05,542.87,
+541.82,549.10,554.41,556.33,557.11,564.00,566.47,568.80,570.53,576.42,
+576.57,583.35,584.61,591.61,589.36,596.57,603.90,600.55,606.66,605.66,
+614.68,619.68,617.07,622.79,628.56,630.42,635.86,633.70,639.93,642.26,
+648.78,652.23,651.65,657.66,660.05,667.82,665.70,669.32,671.59,672.87,
+684.41,683.91,684.66,689.36,693.55,698.19,700.00,702.42,706.17,708.58,
+710.87,716.67,715.11,725.88,723.66,727.30,728.03,739.12,736.18,740.70,
+749.56,754.62,751.06,759.98,764.93,768.37,765.37,773.87,779.01,777.43,
+782.61,779.00,787.61,790.17,793.54,799.33,799.80,805.82,809.42,805.64,
+822.11,823.93,821.38,825.10,824.02,829.49,839.15,842.60,842.31,852.12,
+854.67,857.10,850.79,858.76,864.42,864.23,869.67,876.50,875.88,878.24,
+884.37,886.52,887.25,893.53,899.34,903.75,905.79,910.83,917.03,906.41,
+917.45,916.01,917.49,924.18,938.94,933.74,938.50,943.31,949.47,947.95,
+947.04,958.63,957.11,963.33,966.26,971.49,975.61,974.14,975.36,981.62,
+980.76,992.43,994.78,999.89,991.91,998.14,1001.37,1009.43,1015.13,1014.81,
+32.63,35.01,38.52,41.45,43.30,47.66,50.35,55.39,56.44,58.34,
+62.70,65.42,69.08,71.95,76.10,77.80,79.78,84.86,87.88,88.69,
+94.27,96.43,101.17,103.31,105.78,108.54,111.65,114.65,118.86,120.80,
+125.89,127.90,127.86,132.34,137.63,140.41,144.58,143.74,148.12,150.02,
+152.44,158.15,161.31,162.41,167.86,170.50,172.75,174.32,178.70,184.79,
+188.07,187.38,192.31,193.72,198.59,200.94,206.05,208.83,211.14,210.40,
+216.10,218.97,221.35,227.26,226.22,229.98,234.75,235.87,237.10,244.36,
+247.85,249.27,248.99,255.18,255.45,262.04,265.97,270.44,268.90,273.40,
+274.65,281.76,283.88,285.61,287.39,291.14,297.22,297.05,297.54,300.73,
+303.79,309.02,312.72,317.27,321.12,317.86,328.05,329.24,335.18,339.24,
+335.89,339.39,343.66,347.73,347.85,355.95,352.86,361.42,360.45,366.11,
+369.91,372.36,376.14,374.80,385.20,382.82,386.38,386.06,390.58,394.62,
+397.66,402.08,403.25,405.09,409.49,412.80,414.92,420.29,420.56,426.48,
+428.23,428.99,435.08,439.68,437.75,443.65,445.51,447.87,453.83,456.19,
+463.44,460.11,462.85,470.59,473.45,472.39,482.50,482.34,488.57,488.81,
+491.52,489.58,495.45,497.57,500.05,509.81,503.73,514.76,515.40,518.04,
+519.69,519.43,529.56,532.88,534.35,537.68,540.84,547.27,544.30,549.69,
+550.10,552.03,558.06,560.79,564.60,568.26,567.81,570.32,576.48,574.52,
+582.94,584.57,587.73,586.76,594.20,600.23,598.52,604.36,606.35,609.28,
+613.18,625.27,618.04,620.77,628.01,626.69,636.98,634.66,638.53,641.00,
+640.77,640.14,653.81,657.82,654.05,658.14,654.81,660.20,668.96,670.74,
+669.64,670.56,684.77,681.90,687.07,686.39,691.86,696.55,692.12,699.19,
+700.99,711.04,709.32,712.84,707.08,715.87,721.76,723.82,729.20,731.04,
+736.69,740.52,741.26,743.86,747.58,752.50,751.33,753.69,760.11,761.71,
+758.13,766.81,766.74,776.49,776.56,776.61,779.18,784.50,789.70,789.75,
+795.86,802.68,801.50,801.24,810.87,804.85,807.90,823.27,814.38,820.32,
+825.94,825.75,832.30,843.38,838.04,841.11,845.87,844.26,846.72,853.39,
+858.00,856.90,859.60,864.75,864.83,872.94,872.62,882.14,879.70,889.09,
+884.56,885.71,886.05,895.61,903.26,912.28,904.88,908.81,909.16,918.73,
+29.72,32.17,34.69,38.24,40.51,43.28,44.35,49.66,49.96,54.48,
+56.27,59.75,62.24,63.99,66.87,69.16,72.62,76.06,78.64,80.58,
+81.81,86.33,92.24,92.25,94.60,97.06,99.27,103.96,108.76,108.58,
+109.72,113.61,115.43,117.91,123.53,124.43,127.00,132.38,132.70,135.54,
+138.58,143.08,144.73,149.66,151.69,155.18,155.05,159.63,160.53,163.10,
+166.00,167.50,173.32,176.27,176.40,181.13,182.94,182.22,189.54,189.52,
+194.67,194.68,198.87,202.93,202.52,210.75,212.53,213.74,218.62,216.08,
+219.65,225.59,229.52,228.21,233.78,236.79,233.67,240.07,245.43,244.99,
+247.68,252.82,251.19,257.18,258.91,262.79,263.99,266.93,266.02,271.05,
+274.51,280.79,280.91,285.15,284.39,288.92,293.25,297.73,298.94,300.88,
+304.07,303.41,307.53,313.46,312.72,315.54,320.47,322.90,327.25,329.13,
+330.02,334.69,335.43,337.61,338.38,348.63,350.27,354.83,352.19,356.58,
+356.41,360.04,365.20,368.44,370.18,371.78,373.15,379.52,380.76,377.20,
+386.18,391.75,394.05,396.08,401.76,399.10,400.69,405.76,410.26,411.99,
+415.50,418.57,417.38,419.07,427.45,428.75,434.17,433.26,433.41,441.58,
+439.96,441.06,445.87,451.99,452.69,451.46,454.78,461.56,459.21,464.58,
+469.61,465.96,472.01,471.94,477.72,477.83,485.26,486.64,492.08,493.11,
+495.35,499.07,501.48,500.76,506.75,506.65,517.70,512.69,516.83,525.59,
+519.40,526.64,529.50,529.15,533.76,539.30,538.53,551.78,543.71,546.63,
+555.39,555.51,554.65,559.57,562.71,563.97,568.41,573.10,573.91,571.36,
+580.44,579.20,582.12,590.19,586.70,589.89,596.75,593.90,598.42,599.19,
+604.98,602.28,615.47,608.37,618.78,619.42,619.49,618.90,623.70,633.31,
+634.12,640.09,636.55,638.98,646.14,648.01,643.35,649.40,658.00,659.08,
+660.18,658.25,660.69,663.40,673.66,678.53,678.51,679.90,684.29,686.91,
+691.07,681.78,695.45,700.64,701.81,701.21,702.27,708.25,710.19,714.29,
+713.06,718.36,716.49,722.21,734.18,731.34,732.51,728.43,738.07,740.11,
+740.81,745.52,745.03,750.15,752.90,757.42,758.26,760.74,769.38,773.19,
+767.26,771.34,781.63,770.17,778.26,790.92,789.27,789.12,792.45,795.38,
+799.39,802.67,800.01,805.49,810.58,806.84,816.14,816.53,818.50,822.84,
+27.41,27.25,31.35,34.17,34.28,37.91,40.38,42.25,46.63,47.07,
+51.43,52.70,55.97,58.02,59.33,62.41,65.73,67.38,70.93,72.73,
+76.36,76.77,79.11,82.36,85.94,87.45,89.32,92.16,94.44,97.91,
+98.04,101.75,104.34,109.04,111.98,112.77,112.94,116.66,118.42,122.89,
+124.78,126.65,129.63,131.79,131.66,135.95,139.81,143.66,141.56,148.86,
+148.48,152.83,155.60,155.93,158.43,160.16,163.99,166.49,168.91,172.51,
+174.45,178.08,178.86,180.37,183.37,184.28,189.29,190.24,192.07,198.67,
+199.51,200.72,200.78,204.42,210.19,212.22,215.17,217.57,217.63,221.27,
+227.87,223.22,227.75,228.05,235.43,235.86,236.69,242.64,243.76,241.95,
+248.35,250.47,251.37,256.09,260.95,254.99,262.05,266.34,268.71,274.23,
+270.27,276.14,275.64,279.41,284.14,286.66,282.79,292.83,292.67,293.79,
+298.82,301.01,303.83,302.63,303.89,307.50,309.24,316.07,314.27,321.01,
+325.43,322.59,328.08,329.64,328.02,336.94,338.91,336.12,342.47,338.52,
+345.99,346.05,349.60,349.30,353.90,354.41,359.66,357.76,357.94,370.03,
+371.35,373.56,377.45,380.33,381.64,380.04,387.08,389.94,387.72,393.18,
+394.76,397.11,397.40,405.68,406.65,411.44,411.25,409.95,418.20,419.93,
+417.46,424.15,428.28,418.42,424.04,429.58,438.06,432.44,443.94,443.04,
+443.18,449.46,448.52,453.29,454.43,460.06,460.94,463.99,460.71,467.00,
+469.62,470.13,475.03,480.03,479.97,479.96,484.24,486.57,493.92,489.92,
+492.65,497.05,499.99,500.84,504.33,501.06,501.51,508.31,507.21,515.14,
+511.69,521.84,521.98,525.84,522.53,529.38,536.64,537.61,539.69,543.44,
+543.61,543.55,546.32,553.27,553.59,558.00,558.15,559.92,563.69,565.76,
+562.66,568.56,574.07,582.27,581.01,583.01,583.20,582.89,582.08,592.94,
+592.50,592.51,600.33,600.64,599.03,610.49,612.56,609.57,612.75,612.36,
+623.14,613.72,622.17,619.53,623.74,626.60,635.61,634.99,636.52,640.71,
+639.22,645.38,643.84,648.67,651.58,655.88,653.39,656.34,661.75,663.07,
+669.80,668.03,673.38,668.40,677.20,680.03,685.50,684.66,683.12,690.89,
+690.38,692.70,700.84,702.25,699.61,702.82,706.10,704.64,711.92,708.71,
+717.00,724.38,721.69,722.39,723.58,724.81,721.75,723.39,739.92,743.24,
+23.05,26.54,27.36,31.28,33.21,33.83,35.92,39.18,41.33,43.98,
+46.98,46.26,49.73,53.25,53.42,56.20,58.42,60.53,62.68,65.67,
+68.98,69.42,73.50,74.85,75.94,78.56,80.58,81.16,87.32,85.72,
+88.51,89.18,94.14,94.02,100.90,101.12,103.38,103.37,106.38,108.49,
+112.65,110.34,115.61,116.51,118.07,121.44,124.25,127.39,129.73,130.83,
+134.01,137.47,137.61,140.21,142.84,146.92,147.06,147.63,150.79,154.94,
+157.10,156.55,159.22,161.22,167.72,165.23,172.46,167.35,173.56,174.15,
+178.10,178.26,182.82,189.23,191.06,188.41,190.29,194.25,192.42,200.28,
+203.40,204.08,205.78,205.49,211.94,213.72,214.15,216.32,218.68,223.33,
+221.34,223.02,224.51,224.76,229.87,236.26,234.84,234.91,237.33,236.44,
+244.07,243.02,248.76,251.82,252.36,254.68,256.48,259.11,258.12,264.73,
+265.49,266.07,270.29,271.30,276.00,279.01,284.85,283.09,278.90,285.96,
+286.17,291.35,291.52,298.20,295.81,301.69,300.31,302.09,306.61,303.38,
+309.46,313.28,315.69,312.45,314.04,324.01,323.71,327.33,329.36,329.40,
+331.61,333.79,339.45,341.10,338.21,342.92,341.84,347.45,350.10,353.64,
+349.48,356.81,356.40,356.93,360.58,362.09,368.58,371.41,367.55,375.76,
+374.63,374.66,382.04,382.82,388.33,386.45,390.00,396.61,394.60,393.56,
+404.45,398.23,403.25,405.56,404.25,405.78,411.51,413.48,416.96,422.49,
+420.96,418.19,418.97,426.10,427.45,433.11,434.72,438.13,435.73,441.25,
+441.33,443.02,443.10,445.54,447.91,452.93,458.96,462.20,457.86,461.26,
+462.98,466.09,466.50,466.78,478.22,472.32,473.87,480.30,485.77,484.45,
+484.39,486.44,491.50,499.87,493.83,499.04,498.18,500.66,504.37,504.24,
+510.44,510.75,509.17,513.07,517.79,517.80,527.29,521.84,528.17,529.90,
+534.16,533.63,532.76,534.22,540.06,536.53,545.06,545.03,545.19,552.74,
+555.25,552.28,556.93,560.66,553.68,559.32,571.43,569.67,576.79,577.82,
+571.73,573.65,582.27,584.01,578.69,586.00,582.82,591.35,596.66,595.34,
+593.65,595.57,606.00,605.25,601.14,601.56,612.41,605.48,610.76,617.19,
+617.67,619.27,624.56,620.39,629.63,636.90,631.21,633.62,637.08,636.70,
+648.38,647.41,647.33,646.98,656.75,655.43,655.95,649.54,662.57,656.04,
+21.51,21.69,23.67,27.67,28.48,30.25,32.97,33.97,35.41,38.87,
+41.50,42.81,44.02,45.85,47.22,51.06,51.94,54.09,56.61,57.14,
+61.20,63.22,63.92,66.97,66.64,69.42,71.14,75.10,75.33,76.22,
+79.77,81.48,81.79,86.39,88.22,91.57,93.06,94.27,95.26,96.78,
+97.39,102.87,103.60,106.57,108.19,113.25,110.05,115.96,118.71,116.96,
+118.85,122.38,123.42,124.12,128.93,127.49,132.45,132.67,134.11,136.64,
+138.98,138.03,142.06,144.47,147.30,149.32,151.30,150.80,156.66,158.13,
+156.47,157.73,165.65,165.78,166.79,170.45,170.06,173.20,172.76,176.29,
+176.71,182.57,184.24,185.75,186.61,187.61,190.94,197.02,191.52,196.22,
+197.20,199.59,202.03,205.87,207.75,207.30,209.63,214.04,214.72,214.31,
+219.43,223.82,219.92,222.95,227.01,228.93,228.58,236.20,234.54,239.97,
+239.26,239.48,244.71,247.73,242.92,247.83,249.32,252.69,253.56,256.41,
+258.15,260.66,261.90,267.29,268.74,264.53,271.09,274.80,275.31,277.63,
+278.21,277.56,283.20,286.56,287.10,284.58,293.83,290.59,290.13,293.62,
+299.53,297.62,298.48,301.79,305.67,311.37,305.96,310.38,314.62,309.52,
+320.20,319.97,322.12,324.57,322.88,328.31,331.39,332.48,333.01,334.30,
+337.31,337.67,342.64,344.09,345.20,345.63,344.37,351.95,352.96,356.19,
+352.95,361.67,358.81,361.51,364.82,364.58,370.38,370.29,368.48,375.61,
+376.31,376.10,374.45,380.02,382.88,381.34,390.33,391.80,393.22,389.61,
+399.76,396.00,402.38,400.72,404.03,407.49,404.24,411.57,411.21,412.05,
+411.91,413.68,415.50,423.36,416.97,427.92,429.68,428.38,428.52,430.00,
+434.89,436.85,440.52,436.63,440.51,448.08,442.09,453.41,451.23,451.60,
+455.40,451.80,452.65,461.27,462.36,465.48,468.01,467.94,475.98,474.88,
+475.46,474.69,475.73,480.71,485.55,482.12,488.86,491.75,489.30,494.68,
+490.93,495.79,498.56,501.26,503.57,500.05,508.34,509.52,506.40,511.72,
+514.67,516.34,521.68,519.50,520.94,526.17,532.04,524.01,535.21,537.40,
+530.18,535.08,535.29,539.10,546.94,545.88,542.38,547.29,551.32,552.75,
+550.37,556.72,558.86,556.00,560.28,561.99,564.70,565.20,570.24,569.02,
+570.91,573.03,576.53,579.21,583.71,579.57,589.11,582.74,582.67,592.25,
+18.67,20.05,21.14,24.18,26.25,27.12,30.01,32.08,33.61,34.33,
+36.13,39.84,39.70,40.08,43.49,45.64,46.84,49.14,50.02,53.59,
+52.41,54.61,58.04,60.32,61.82,63.89,65.53,62.85,66.10,68.79,
+69.33,74.18,75.04,76.97,77.96,80.27,82.16,85.20,86.72,86.99,
+87.41,91.99,90.74,96.69,94.11,97.76,99.70,103.93,102.78,105.54,
+106.78,105.20,107.55,111.67,110.19,114.84,113.11,120.02,118.98,120.92,
+127.02,128.75,127.99,129.62,132.45,133.93,132.32,134.76,138.17,144.08,
+141.74,143.52,147.32,144.47,152.45,152.16,151.36,155.00,155.88,157.87,
+157.67,161.54,165.11,165.73,170.98,170.96,173.04,170.59,172.57,175.46,
+178.25,177.98,181.31,181.54,188.16,188.46,189.58,188.96,191.13,195.30,
+198.83,194.36,197.78,200.63,201.46,208.20,204.20,207.27,206.98,211.04,
+213.40,209.83,217.80,216.30,222.93,221.51,221.02,224.95,224.77,227.12,
+225.51,228.36,233.11,237.09,236.58,238.27,240.04,243.50,244.12,249.94,
+244.07,249.51,254.65,252.54,253.95,257.67,257.93,258.26,261.37,261.72,
+264.40,264.22,266.39,271.92,272.61,280.50,275.71,277.06,282.56,278.42,
+278.51,281.85,288.21,289.20,289.43,290.85,291.47,295.43,298.05,295.94,
+298.56,297.70,303.80,309.11,310.90,306.53,309.95,312.56,313.78,315.03,
+320.68,316.74,319.60,324.16,324.53,327.52,329.60,330.11,329.42,332.38,
+333.26,338.43,335.47,344.08,337.40,341.29,348.86,347.04,353.14,345.19,
+354.67,359.55,355.56,360.65,360.21,364.56,357.86,366.08,370.34,369.07,
+373.20,367.38,371.24,373.61,376.40,381.03,378.05,386.09,382.98,390.31,
+386.32,393.92,391.27,393.25,392.79,398.07,399.00,400.78,400.00,401.09,
+404.40,409.63,412.34,414.10,417.03,408.40,417.99,422.04,418.60,420.39,
+427.18,422.42,428.47,430.47,432.20,432.52,434.31,431.27,436.64,441.70,
+434.58,443.44,440.93,452.52,448.36,447.74,455.61,457.38,452.50,455.59,
+452.14,458.27,463.50,467.85,466.01,471.69,469.67,468.38,472.85,474.16,
+475.68,480.44,477.45,480.08,480.95,483.54,487.83,493.88,493.30,496.37,
+491.62,496.28,492.75,492.18,500.54,500.58,501.53,504.42,511.83,511.14,
+513.21,514.03,511.69,510.55,517.70,517.14,520.31,522.26,529.49,524.79,
+16.82,19.22,19.37,21.20,21.90,24.31,25.88,26.41,29.44,29.71,
+31.48,34.83,35.22,35.93,38.44,39.69,42.09,45.03,45.46,46.90,
+46.44,47.81,49.70,53.12,55.16,55.41,59.49,58.04,60.52,60.51,
+64.71,66.82,67.87,68.97,70.72,71.03,72.08,73.56,76.69,79.24,
+80.64,82.46,83.31,84.41,86.25,85.65,88.61,90.72,92.83,91.83,
+94.19,96.49,99.15,100.15,104.27,102.41,100.18,104.86,110.70,108.17,
+110.07,112.75,118.36,115.38,117.05,118.42,118.90,121.34,122.40,124.76,
+126.82,128.61,129.79,130.09,133.45,134.09,132.55,135.56,141.14,142.14,
+141.83,140.37,146.07,148.47,146.86,149.18,150.93,150.32,155.55,156.36,
+159.21,158.54,161.13,159.54,163.29,163.24,168.73,165.72,167.93,170.13,
+172.81,171.13,179.20,175.24,180.14,180.14,187.27,187.15,188.40,189.62,
+190.88,192.87,194.99,195.76,194.65,199.66,201.67,199.65,201.65,203.05,
+204.28,203.19,207.45,209.34,209.78,210.30,212.53,216.06,215.75,220.45,
+222.63,225.41,223.17,223.34,231.16,227.77,229.49,237.15,231.56,235.91,
+233.75,238.34,241.96,239.04,241.67,240.77,244.46,245.52,247.38,250.87,
+247.65,257.55,251.48,252.14,261.60,263.03,259.85,264.50,266.74,269.76,
+270.42,267.29,273.24,276.76,274.43,272.78,277.66,275.94,285.34,279.98,
+282.08,280.95,288.54,292.12,289.58,293.51,293.24,297.84,298.32,294.14,
+301.50,304.62,301.56,297.17,311.65,308.17,308.89,306.77,313.25,315.36,
+313.12,315.43,321.43,320.85,321.99,323.78,323.44,330.04,325.29,324.64,
+328.89,333.33,336.58,341.26,340.23,335.21,339.15,347.06,339.76,345.73,
+348.32,351.25,350.42,355.78,349.87,354.44,351.15,355.97,360.42,359.82,
+363.06,358.34,362.89,367.06,368.95,372.62,376.49,371.24,377.18,378.29,
+372.90,383.74,382.45,382.65,386.86,382.15,388.29,385.69,391.50,395.22,
+396.22,389.28,399.07,394.63,395.02,403.61,411.43,407.23,404.10,406.14,
+406.53,413.73,417.12,412.03,410.79,414.43,415.45,424.07,423.33,421.05,
+424.76,431.98,432.32,430.64,426.09,435.69,428.61,434.56,436.80,439.82,
+443.98,446.31,445.17,445.43,444.69,451.90,455.04,455.68,448.40,456.61,
+458.51,461.58,456.26,461.46,457.00,463.55,463.24,463.63,471.04,465.79,
+14.33,16.90,17.40,19.49,21.66,20.80,23.66,23.84,26.10,27.91,
+29.29,31.19,30.96,32.63,34.12,34.82,38.24,38.75,39.05,42.30,
+42.59,43.89,45.78,46.80,45.75,48.90,51.21,52.76,53.51,54.29,
+55.55,58.70,60.43,63.05,59.51,63.98,63.92,66.72,66.05,69.61,
+71.67,71.24,75.79,75.33,75.72,78.14,78.92,78.89,81.12,83.47,
+86.28,85.75,89.50,90.14,89.76,90.76,93.72,94.29,96.86,95.76,
+100.00,98.53,101.25,102.01,106.16,105.63,106.81,106.26,111.88,110.77,
+110.87,112.89,115.11,117.13,119.79,119.65,117.81,124.53,124.56,125.54,
+125.55,128.56,127.26,132.10,134.16,132.94,136.78,137.19,133.78,139.26,
+142.14,139.60,142.62,144.47,146.97,149.54,146.83,148.40,151.38,153.22,
+156.51,155.90,155.16,159.70,156.63,159.80,163.66,166.13,167.04,169.85,
+166.10,170.36,176.87,171.80,175.54,176.05,172.35,179.06,179.93,179.28,
+186.77,182.36,186.48,186.90,191.18,189.96,195.58,188.97,191.42,194.61,
+194.28,196.51,195.11,203.83,200.12,202.49,205.62,207.17,207.84,206.90,
+211.81,210.72,213.47,216.96,213.55,219.31,219.32,221.01,218.31,224.46,
+226.72,227.00,227.69,229.19,226.55,231.50,231.39,228.84,233.74,230.61,
+241.37,237.81,244.41,242.28,240.99,243.92,247.17,248.78,250.08,254.22,
+252.80,257.94,261.29,255.65,260.10,258.25,260.47,259.15,264.37,262.45,
+266.26,266.80,271.61,268.56,271.27,272.66,274.65,276.36,279.59,278.94,
+275.17,284.68,287.25,283.73,284.03,287.11,289.39,292.53,294.34,290.18,
+292.11,296.87,293.05,300.32,302.34,298.31,303.17,304.56,304.74,304.32,
+307.54,308.17,310.91,308.73,312.06,312.66,321.21,319.76,318.22,320.37,
+317.08,324.38,325.17,327.71,328.00,330.67,334.05,333.39,330.85,332.04,
+339.51,334.35,342.46,343.99,340.95,343.95,345.86,345.02,345.34,346.79,
+352.31,349.93,350.00,354.29,353.88,360.18,359.24,363.62,364.79,359.39,
+368.69,365.41,364.18,358.94,370.46,374.40,368.67,374.44,371.84,378.90,
+380.49,383.50,382.03,381.32,378.72,385.69,387.79,390.24,391.12,386.70,
+393.43,392.43,394.20,393.69,401.05,392.70,403.57,404.91,405.42,409.92,
+400.43,406.68,410.54,415.67,413.35,413.35,412.95,415.21,412.44,423.57,
+13.09,14.34,16.05,17.25,18.93,20.11,19.08,20.75,22.94,24.27,
+24.65,26.58,28.56,30.35,32.30,32.70,33.11,33.21,34.43,37.55,
+37.70,39.69,42.17,42.12,41.49,45.25,46.06,47.48,48.47,48.71,
+51.73,53.59,50.12,54.82,55.40,58.56,58.37,59.86,59.96,62.48,
+61.65,64.10,65.29,66.52,69.04,69.74,69.69,71.80,74.45,71.72,
+72.35,77.54,75.74,77.54,80.56,80.47,83.14,84.30,86.94,87.47,
+85.54,89.38,90.77,90.91,92.13,92.82,95.77,96.33,97.62,100.66,
+100.56,100.92,103.58,105.88,103.67,106.60,109.48,109.39,110.45,112.09,
+112.86,115.38,113.88,114.90,116.06,121.06,118.96,124.68,121.91,126.73,
+125.99,125.11,127.54,127.61,130.84,129.45,129.92,131.68,135.58,132.72,
+139.12,140.79,140.09,142.81,141.31,144.04,147.64,145.12,145.20,144.55,
+150.78,152.93,153.54,153.18,152.88,155.46,154.39,155.14,161.63,162.86,
+163.65,165.37,165.61,165.42,170.71,165.58,169.40,171.57,169.15,175.33,
+174.55,175.81,176.24,182.59,184.90,182.76,183.55,183.61,185.00,185.41,
+185.38,187.87,189.47,187.60,192.79,195.14,193.10,199.55,196.40,196.44,
+198.08,200.57,202.29,203.76,200.66,204.07,207.90,211.29,210.19,210.61,
+213.07,212.00,216.65,213.57,220.30,216.25,220.35,224.58,224.33,224.33,
+226.66,229.28,224.17,227.77,228.92,229.49,233.63,230.58,235.12,235.15,
+235.70,239.02,236.41,237.05,246.31,242.51,244.14,248.60,244.30,250.38,
+244.44,250.19,249.19,253.92,251.85,253.91,256.54,257.72,262.83,262.42,
+260.00,263.99,263.75,263.92,265.42,267.36,269.14,268.43,274.40,276.98,
+271.01,276.59,278.07,277.30,282.02,280.19,284.13,281.67,284.84,283.61,
+289.36,285.82,286.56,292.73,291.48,291.73,287.48,295.24,298.15,303.31,
+300.09,300.78,305.75,300.65,304.72,303.44,303.18,313.87,308.17,310.33,
+313.39,313.75,313.18,321.78,316.44,323.23,321.25,316.20,322.60,323.16,
+318.39,328.89,325.61,331.61,331.21,330.23,332.51,333.70,330.38,339.94,
+331.06,334.27,340.89,337.67,344.84,341.97,342.95,347.85,345.64,346.76,
+349.32,351.06,350.98,355.62,360.02,349.06,355.03,353.06,357.20,358.99,
+359.97,366.70,365.31,365.18,369.14,371.24,368.32,362.76,372.97,371.58,
+63.36,68.91,75.70,81.08,87.13,93.45,96.61,103.74,110.85,115.83,
+122.78,126.88,134.91,140.23,146.47,151.24,158.64,163.73,169.79,174.81,
+180.37,187.26,191.60,198.60,205.28,211.17,217.61,221.93,228.74,236.09,
+240.71,247.68,252.94,257.62,264.90,269.46,276.10,280.55,285.12,293.24,
+301.72,306.52,311.51,315.84,321.08,329.31,335.77,342.32,347.22,353.32,
+357.28,365.31,370.78,377.45,382.04,388.87,393.32,401.60,406.74,412.25,
+417.41,422.12,428.52,437.59,440.89,445.56,451.40,458.79,466.40,471.51,
+475.77,481.63,489.12,493.03,501.86,505.57,513.11,519.63,524.09,530.45,
+538.39,540.08,548.98,553.81,557.41,565.26,571.06,574.20,582.43,590.18,
+591.91,601.58,606.87,615.79,620.84,625.41,627.42,637.39,643.52,650.45,
+651.58,660.24,668.56,674.29,677.10,684.51,690.98,696.00,705.01,708.58,
+711.51,719.76,726.05,729.87,739.01,746.54,749.08,755.22,761.15,768.97,
+773.36,778.20,786.10,788.28,796.25,802.16,805.44,812.60,818.31,826.88,
+834.11,838.02,843.26,846.89,852.41,862.83,867.21,872.45,881.94,883.93,
+888.52,897.84,903.18,912.09,914.35,918.72,927.95,930.75,934.74,942.77,
+950.89,957.78,963.73,967.67,975.68,981.22,986.39,995.39,1000.83,1002.11,
+1008.32,1019.35,1020.52,1029.34,1033.96,1038.72,1047.11,1050.55,1056.59,1061.24,
+1066.43,1075.68,1081.30,1084.61,1093.77,1104.01,1100.73,1107.82,1115.57,1119.58,
+1125.26,1130.19,1134.28,1145.76,1150.58,1154.88,1160.22,1173.69,1175.16,1183.14,
+1190.66,1193.81,1200.64,1202.31,1209.04,1218.40,1218.48,1227.42,1230.20,1235.20,
+1242.20,1251.41,1259.07,1263.58,1273.83,1272.78,1279.27,1287.53,1291.37,1293.63,
+1305.55,1309.17,1316.93,1327.80,1327.95,1328.35,1342.69,1347.35,1346.78,1355.69,
+1358.95,1372.14,1380.41,1379.60,1389.73,1392.46,1401.07,1405.38,1410.22,1417.79,
+1425.12,1427.98,1432.71,1440.30,1448.23,1451.93,1460.59,1462.88,1471.25,1473.33,
+1483.77,1490.31,1491.87,1499.37,1511.60,1510.74,1517.38,1522.06,1532.93,1538.93,
+1538.73,1548.38,1551.99,1558.94,1572.71,1570.32,1579.60,1581.91,1588.71,1598.55,
+1596.98,1605.32,1614.88,1615.10,1629.21,1631.59,1640.79,1641.49,1647.74,1656.79,
+1662.80,1667.04,1671.05,1678.42,1687.12,1688.41,1688.82,1701.80,1705.35,1713.28,
+1717.03,1722.64,1726.53,1737.79,1738.76,1748.87,1759.17,1756.98,1764.33,1774.03,
+58.09,63.86,69.85,75.56,79.28,85.14,89.30,96.44,102.19,107.39,
+112.45,118.42,123.88,129.59,133.49,138.53,146.20,150.32,155.50,160.80,
+167.82,173.74,178.80,183.99,191.04,194.51,199.22,205.06,210.55,218.00,
+222.31,226.06,232.51,237.23,243.33,248.64,254.09,259.11,266.06,270.50,
+274.05,281.38,287.24,293.76,297.54,303.07,310.24,313.45,318.87,325.98,
+332.08,335.62,343.54,345.91,351.82,356.41,359.71,368.69,372.88,381.05,
+386.18,391.25,398.58,402.06,404.95,409.88,418.99,425.59,429.00,435.38,
+439.19,443.64,450.38,456.91,462.55,466.40,469.77,477.02,484.28,489.62,
+492.12,501.27,505.14,510.69,515.23,521.58,527.58,532.57,536.40,545.59,
+547.74,553.25,560.33,565.18,571.25,574.70,580.89,590.02,593.80,598.20,
+604.17,608.89,613.78,619.21,624.00,627.67,636.26,638.26,647.65,652.20,
+657.50,661.44,667.73,669.62,679.58,684.91,692.73,697.69,703.77,704.41,
+711.87,716.78,726.41,729.35,738.70,742.59,747.93,750.10,757.33,761.68,
+765.21,772.72,778.61,782.27,787.80,793.99,801.18,806.33,809.42,814.32,
+821.70,827.43,832.42,839.70,845.51,850.32,856.31,860.51,866.88,867.28,
+875.00,882.20,887.67,888.67,899.87,902.75,908.13,915.87,915.65,926.16,
+934.39,933.45,940.07,946.22,950.47,955.96,965.07,972.42,974.94,979.80,
+987.22,990.67,998.10,1000.25,1006.90,1014.00,1016.78,1025.40,1029.83,1034.83,
+1039.47,1042.50,1050.48,1055.76,1061.22,1065.66,1071.08,1077.37,1084.87,1087.58,
+1096.07,1098.63,1106.28,1106.77,1116.98,1120.30,1125.88,1130.27,1137.99,1145.11,
+1146.87,1153.50,1159.11,1162.64,1172.60,1178.31,1181.65,1188.12,1192.15,1196.77,
+1205.77,1204.58,1218.30,1221.78,1225.55,1231.03,1236.81,1239.33,1250.55,1248.17,
+1255.52,1266.66,1264.26,1269.90,1281.83,1286.14,1287.09,1296.98,1300.19,1311.36,
+1312.92,1318.89,1324.21,1324.66,1334.99,1332.06,1348.18,1347.56,1352.31,1358.75,
+1365.42,1375.03,1377.97,1385.04,1387.29,1392.21,1401.23,1407.33,1413.37,1420.38,
+1424.01,1425.59,1433.27,1436.76,1444.17,1451.72,1451.43,1464.99,1466.05,1471.86,
+1479.35,1480.36,1490.68,1492.84,1500.77,1502.78,1509.15,1514.56,1520.24,1524.68,
+1527.90,1533.97,1535.68,1544.58,1551.11,1557.68,1561.45,1566.07,1570.79,1577.92,
+1589.84,1595.18,1594.53,1597.86,1612.20,1609.45,1621.12,1621.37,1633.57,1634.97,
+55.82,59.30,63.25,69.32,74.32,79.30,82.98,88.51,95.02,98.35,
+103.52,106.89,113.89,116.97,122.79,127.75,131.87,137.76,142.67,148.24,
+153.75,157.57,165.15,167.56,174.03,177.50,182.70,188.59,194.10,199.17,
+202.95,210.88,214.21,217.82,223.93,227.42,234.83,240.96,244.23,249.65,
+253.44,258.27,266.11,268.34,272.39,280.21,286.97,289.42,294.91,294.90,
+305.22,307.39,313.44,317.52,325.81,329.04,335.19,342.61,343.62,350.70,
+352.97,359.06,361.41,369.67,375.99,379.34,382.03,388.43,393.81,398.77,
+403.73,409.77,414.58,418.33,424.39,428.91,434.94,439.41,445.99,446.46,
+454.37,461.36,464.54,470.96,471.64,476.79,486.69,490.13,495.16,496.33,
+505.95,510.82,515.33,521.46,526.68,529.59,532.92,538.80,545.38,550.28,
+552.84,559.13,562.70,569.93,573.38,579.40,582.11,586.01,596.30,600.18,
+606.48,609.45,608.08,621.55,626.77,633.06,631.54,644.83,646.74,651.34,
+655.92,662.67,662.32,672.99,678.32,681.21,686.24,691.10,692.88,700.79,
+704.80,713.97,718.30,722.76,724.59,729.13,734.67,738.67,746.78,746.51,
+756.07,760.47,764.53,769.53,776.90,781.44,786.70,788.65,794.57,802.93,
+810.26,814.35,812.91,820.44,822.79,830.82,838.53,837.52,843.07,847.08,
+857.76,855.94,864.10,872.43,879.56,876.82,879.19,892.29,899.10,897.50,
+904.27,907.20,913.89,921.48,925.30,926.08,938.39,937.11,947.72,945.91,
+953.92,962.08,961.94,970.78,973.46,979.53,983.84,992.24,992.70,1005.92,
+1008.32,1015.27,1012.01,1022.48,1027.42,1033.98,1036.68,1039.18,1041.08,1047.88,
+1054.28,1061.68,1060.58,1073.02,1072.82,1079.52,1085.23,1092.16,1096.48,1100.73,
+1106.04,1109.14,1114.34,1128.34,1126.15,1129.22,1137.35,1139.22,1141.87,1152.48,
+1155.02,1159.27,1164.58,1173.49,1172.99,1183.78,1186.66,1192.41,1198.90,1203.53,
+1201.57,1211.43,1218.97,1223.93,1222.85,1230.25,1236.57,1239.65,1244.79,1258.33,
+1258.80,1259.09,1264.02,1268.83,1276.52,1284.79,1283.56,1291.37,1298.23,1303.06,
+1302.71,1310.40,1312.99,1321.01,1329.04,1332.38,1336.62,1345.13,1349.37,1349.40,
+1358.92,1362.28,1368.35,1373.78,1379.32,1383.48,1383.64,1389.33,1400.41,1399.12,
+1409.96,1417.14,1414.47,1424.88,1426.15,1433.84,1434.85,1441.58,1449.49,1451.69,
+1460.49,1462.04,1466.40,1471.43,1484.26,1477.92,1487.96,1485.52,1491.90,1502.39,
+49.81,53.73,58.69,62.79,67.85,70.86,78.78,80.96,86.21,89.37,
+94.35,100.12,103.29,109.64,113.29,116.99,123.16,127.28,132.41,137.44,
+141.60,148.35,151.08,155.41,160.41,167.33,168.16,172.53,178.77,180.78,
+185.23,190.30,196.13,198.71,204.09,210.63,214.07,217.46,222.15,227.09,
+232.01,237.44,241.96,247.73,249.92,254.58,260.49,264.99,269.38,275.10,
+280.20,281.88,289.30,293.06,297.22,301.35,305.69,311.60,315.49,320.56,
+324.51,332.31,334.92,337.58,344.14,346.46,356.69,358.03,364.11,364.23,
+368.77,375.10,379.29,381.55,391.65,392.07,397.66,402.69,405.73,413.27,
+417.85,422.67,426.81,430.74,436.10,437.75,445.84,451.21,454.16,453.18,
+462.04,467.13,474.16,477.98,483.02,482.03,489.96,494.93,500.04,507.11,
+507.17,512.34,518.74,521.69,525.15,531.87,533.14,543.26,544.29,550.08,
+553.48,557.09,564.61,570.17,577.03,577.02,580.34,586.77,591.23,595.90,
+601.85,607.30,604.17,614.80,619.98,620.28,626.38,632.24,639.55,642.25,
+649.68,650.81,654.64,662.74,664.77,668.13,675.61,677.12,683.97,686.00,
+691.47,694.86,700.88,706.40,712.11,718.14,721.15,727.89,730.48,732.47,
+737.43,745.69,748.49,754.22,757.24,759.29,767.54,773.25,774.60,779.84,
+784.06,788.80,787.95,795.66,800.02,805.42,812.08,813.42,824.93,824.16,
+831.06,831.48,839.23,847.36,848.11,851.72,855.25,860.72,864.69,876.08,
+871.49,881.31,885.50,891.53,896.43,903.58,901.96,909.69,915.32,919.07,
+923.11,925.19,931.64,937.61,940.48,940.87,944.61,953.05,957.08,965.93,
+969.55,973.12,973.80,979.75,986.02,992.62,998.56,997.28,1003.59,1010.57,
+1016.70,1017.45,1025.89,1023.42,1027.49,1035.10,1039.14,1042.06,1056.30,1051.45,
+1056.09,1065.89,1062.92,1070.22,1079.92,1084.04,1081.93,1087.60,1095.12,1106.33,
+1104.80,1106.28,1111.96,1119.45,1125.54,1124.44,1130.90,1133.27,1141.19,1146.34,
+1147.93,1157.34,1160.57,1162.89,1172.75,1175.49,1180.60,1179.46,1190.20,1192.43,
+1194.83,1203.25,1205.29,1210.11,1215.85,1219.69,1225.08,1226.18,1235.26,1237.09,
+1243.31,1243.25,1249.47,1256.28,1262.88,1270.45,1272.28,1273.72,1282.57,1283.97,
+1287.13,1294.93,1295.90,1309.56,1306.47,1312.09,1320.62,1313.80,1327.15,1327.13,
+1335.13,1337.04,1350.33,1342.46,1355.69,1361.45,1357.89,1370.74,1372.21,1374.40,
+44.98,49.93,52.60,57.94,61.84,64.94,69.82,73.43,77.26,83.62,
+85.43,90.68,96.00,99.16,105.04,108.45,113.30,114.97,120.84,124.23,
+131.75,134.36,135.09,142.39,144.94,148.55,153.07,157.13,161.90,166.59,
+170.45,177.30,178.81,183.22,186.17,193.03,194.48,198.77,204.74,209.43,
+213.13,214.52,221.40,227.69,229.29,235.27,238.79,241.10,245.43,249.97,
+256.86,261.40,260.07,268.34,270.91,274.17,279.54,283.59,288.88,292.47,
+296.11,302.39,304.48,309.38,311.71,316.84,323.87,326.27,330.65,336.95,
+338.92,344.62,348.33,346.52,359.02,362.97,362.81,370.15,376.21,375.69,
+378.99,384.47,392.63,389.53,396.45,404.29,406.68,408.14,418.11,420.19,
+418.78,429.55,432.23,430.36,441.60,441.89,449.11,451.21,459.40,459.02,
+464.17,468.79,473.22,479.96,482.10,485.64,490.77,491.73,499.01,504.57,
+505.01,511.32,515.86,520.51,524.23,526.79,535.14,536.74,539.11,545.16,
+547.46,554.08,553.78,564.43,563.07,571.80,571.14,574.56,581.47,587.70,
+590.14,595.63,599.17,606.59,605.13,614.25,616.70,617.84,624.21,631.53,
+632.25,634.29,644.80,646.36,650.68,650.13,659.52,663.95,670.46,674.17,
+674.27,677.46,682.45,685.10,692.24,696.18,702.56,704.97,710.86,715.22,
+716.83,724.14,722.97,727.57,731.47,735.82,741.83,751.81,747.86,752.98,
+759.47,760.03,769.83,774.98,772.99,780.10,790.55,784.92,791.93,799.20,
+791.55,803.96,808.13,808.25,817.45,822.92,822.59,832.38,836.82,840.28,
+844.58,844.27,854.58,855.53,858.09,868.24,865.55,871.65,875.60,881.60,
+883.89,886.87,893.90,896.74,900.14,906.78,908.42,918.67,920.71,923.80,
+926.95,931.63,936.00,942.01,946.83,952.80,947.81,950.63,963.30,967.29,
+968.45,976.80,973.92,977.72,987.33,986.92,995.69,999.53,1001.15,1010.48,
+1008.34,1016.98,1016.95,1024.31,1029.17,1032.66,1040.15,1034.62,1043.96,1047.44,
+1051.64,1061.97,1058.14,1063.03,1072.60,1072.61,1078.44,1088.77,1091.71,1092.23,
+1093.61,1100.53,1098.89,1108.09,1116.13,1118.57,1117.81,1117.79,1128.53,1133.25,
+1136.07,1144.85,1143.94,1151.66,1155.30,1150.58,1159.06,1165.43,1167.45,1176.96,
+1176.92,1181.98,1188.94,1189.40,1201.05,1195.86,1208.84,1205.86,1210.69,1213.82,
+1219.10,1220.67,1225.66,1235.07,1237.12,1245.36,1248.68,1249.13,1255.08,1259.69,
+41.21,45.06,49.25,52.97,54.66,60.01,64.66,67.08,70.86,73.72,
+78.80,82.22,86.61,91.13,96.79,98.64,103.16,107.06,107.45,115.44,
+118.73,121.16,123.60,129.56,133.01,137.06,140.52,145.54,148.40,151.90,
+156.21,161.33,162.93,168.37,170.82,174.24,177.02,183.32,187.35,187.06,
+195.31,201.22,201.51,203.70,209.63,214.49,214.28,219.81,226.40,228.83,
+233.00,235.12,240.03,241.94,247.86,251.95,256.77,260.67,264.89,266.12,
+270.02,274.54,276.83,280.43,284.20,291.78,291.58,295.05,301.48,303.37,
+308.47,312.29,315.55,321.83,325.04,331.15,329.39,334.86,338.90,346.91,
+346.95,350.76,353.72,358.85,362.35,366.45,368.88,375.69,376.01,383.25,
+384.22,386.97,392.06,395.45,396.67,405.76,409.63,412.71,411.96,419.14,
+419.83,424.27,432.33,434.10,437.68,441.92,448.94,451.07,455.68,460.02,
+461.11,469.73,468.34,470.31,476.89,481.69,487.43,488.70,491.68,495.86,
+501.14,504.13,510.09,513.02,516.75,520.74,525.74,527.01,534.08,534.86,
+539.33,543.78,549.33,548.61,556.15,559.85,562.74,565.46,568.90,576.11,
+578.14,582.16,586.51,589.93,591.75,600.75,597.64,604.96,608.65,616.84,
+615.12,619.19,622.97,624.80,630.90,631.59,637.32,642.41,645.19,651.48,
+656.46,659.69,658.03,662.29,666.10,670.09,678.96,682.76,683.22,683.69,
+695.35,689.85,702.38,704.49,703.34,709.78,713.48,713.89,721.99,727.12,
+733.54,731.02,734.93,743.46,741.82,749.83,751.77,763.24,758.72,764.43,
+765.65,773.89,779.33,782.58,786.51,790.99,788.67,799.32,793.68,808.23,
+804.46,808.66,817.69,818.23,821.42,825.43,827.73,838.98,840.28,841.94,
+847.69,847.84,853.47,856.47,862.57,868.11,863.56,872.88,882.15,876.67,
+884.61,886.91,889.07,895.35,895.70,906.50,907.08,909.70,910.04,920.08,
+923.75,925.02,935.41,930.94,938.32,937.55,937.21,952.48,947.96,959.38,
+962.07,966.56,967.65,972.05,975.60,975.72,982.19,990.12,994.48,997.42,
+1001.41,1010.03,1006.68,1020.39,1012.39,1020.21,1017.35,1029.61,1032.32,1030.15,
+1040.52,1040.78,1041.16,1049.99,1054.92,1052.95,1062.13,1059.91,1065.18,1074.22,
+1078.12,1081.86,1084.69,1081.46,1086.33,1089.04,1098.29,1095.03,1100.95,1111.72,
+1112.77,1115.51,1118.24,1127.29,1123.56,1130.23,1134.58,1130.24,1141.79,1149.82,
+37.92,41.77,43.91,47.08,50.77,55.87,57.88,61.98,64.75,68.10,
+71.81,76.70,78.47,82.56,86.30,88.31,94.91,95.66,100.69,104.53,
+106.14,109.42,114.44,117.12,120.84,126.33,126.30,133.88,133.57,139.04,
+140.62,145.14,149.64,152.57,159.74,159.17,162.24,168.17,173.24,172.39,
+176.79,177.95,185.24,187.66,189.82,196.27,197.70,205.04,205.91,205.51,
+213.76,216.46,218.87,220.69,227.81,227.02,231.21,238.28,240.44,244.29,
+247.62,247.15,253.00,258.14,261.54,268.61,267.72,274.94,275.20,282.45,
+280.06,282.64,289.27,292.05,293.74,299.34,298.82,303.21,306.41,312.64,
+319.28,319.51,322.22,324.35,330.34,333.27,336.37,343.02,344.01,346.91,
+352.20,353.44,358.44,366.31,365.25,369.89,370.96,374.41,384.08,383.69,
+386.29,391.50,392.12,394.72,397.93,400.88,406.40,408.50,410.20,416.01,
+420.27,425.96,426.01,429.02,437.68,439.08,444.54,448.24,452.06,452.37,
+452.56,459.17,461.71,466.75,463.62,474.19,479.58,482.94,483.60,485.41,
+488.28,494.84,496.73,496.15,504.74,508.57,508.71,509.09,521.95,521.14,
+524.10,530.40,531.41,535.09,539.43,538.75,545.60,547.61,555.43,564.22,
+560.27,565.58,571.97,569.47,571.07,577.69,581.79,581.82,590.60,593.08,
+594.79,596.92,603.29,605.77,610.03,611.40,616.10,618.99,622.43,625.46,
+630.30,633.26,639.65,644.63,642.07,646.27,654.75,650.69,656.20,656.75,
+663.91,665.72,670.44,672.96,676.48,680.28,684.00,688.51,690.76,698.70,
+693.76,702.11,709.08,711.20,712.48,721.07,724.22,722.96,729.60,725.26,
+731.10,741.04,742.48,743.60,752.40,753.70,756.25,756.73,761.08,766.64,
+766.45,774.57,779.29,779.60,780.32,787.69,788.20,793.27,793.43,797.77,
+801.22,811.02,816.97,822.95,812.08,825.15,818.68,825.77,828.37,837.64,
+838.77,839.58,845.07,849.46,853.21,856.56,860.87,863.00,863.40,874.17,
+869.95,883.15,876.43,883.91,894.73,890.98,894.73,897.24,900.32,906.20,
+911.45,910.91,917.05,915.53,922.73,918.65,924.56,932.41,937.78,942.38,
+943.45,946.30,953.44,954.70,956.78,964.47,966.60,965.41,970.52,976.93,
+977.93,982.91,984.60,985.95,985.01,994.88,1001.42,1002.36,1007.05,1010.56,
+1011.79,1018.10,1020.31,1025.41,1019.43,1031.42,1032.83,1037.97,1037.39,1045.73,
+34.62,36.55,40.14,41.59,46.87,49.34,52.30,55.21,58.78,62.06,
+64.80,69.72,70.76,73.72,78.78,81.91,84.45,88.16,92.22,92.87,
+95.54,100.11,102.40,106.62,111.21,113.61,113.11,119.75,121.28,126.32,
+129.44,131.67,135.09,138.50,140.76,145.26,149.38,152.69,154.01,156.21,
+161.32,167.77,169.20,168.65,174.27,174.30,179.15,181.46,183.19,189.25,
+192.42,195.79,195.90,201.56,205.34,206.30,212.84,211.75,216.60,220.49,
+224.32,226.12,231.09,234.96,236.12,238.08,241.93,248.12,246.29,251.73,
+258.80,258.41,263.75,263.19,269.37,274.00,275.61,276.84,281.40,281.12,
+285.75,287.24,293.66,297.71,299.61,301.18,304.72,309.11,311.83,315.53,
+324.07,320.31,327.38,327.94,333.47,332.95,339.97,338.85,343.04,348.00,
+347.17,357.34,356.12,360.39,364.58,363.16,370.90,374.70,375.20,379.09,
+382.88,383.23,386.63,395.87,391.03,399.67,399.42,408.90,404.20,410.83,
+411.54,411.90,420.42,420.03,425.90,429.83,429.92,432.89,438.08,442.12,
+447.25,447.37,451.85,458.41,461.24,460.91,460.81,472.30,469.11,469.62,
+476.63,478.64,485.19,483.28,489.25,488.99,497.62,496.93,502.72,509.76,
+509.87,514.02,515.36,521.81,519.83,524.63,528.23,527.41,533.95,536.88,
+537.93,543.75,542.75,548.08,555.92,557.87,558.80,562.50,566.36,576.53,
+569.83,576.25,583.18,577.20,580.56,585.25,593.75,598.59,593.45,596.42,
+605.08,608.20,611.75,615.41,614.96,621.46,619.86,626.43,624.14,632.07,
+637.35,633.73,640.46,649.29,644.07,654.22,651.34,656.55,658.98,663.15,
+665.37,675.21,673.27,683.96,675.66,686.59,686.57,687.05,688.80,704.42,
+699.67,700.48,700.65,709.06,715.60,721.22,718.05,725.49,721.52,730.28,
+731.08,727.30,734.89,738.31,741.36,747.17,752.23,751.47,756.99,759.74,
+764.03,765.56,769.20,773.89,773.88,777.77,778.76,784.83,784.28,787.42,
+793.62,798.18,794.80,800.81,805.16,809.48,808.51,818.13,820.56,821.85,
+824.58,831.80,827.99,832.34,841.00,843.14,847.16,847.53,855.39,856.06,
+856.13,859.69,862.88,862.31,867.42,873.65,876.63,884.47,882.58,881.38,
+894.40,893.66,892.62,902.39,902.47,907.07,902.29,908.93,911.62,922.48,
+916.74,916.86,922.97,923.45,932.76,938.22,932.31,939.78,941.63,949.62,
+30.77,33.23,36.12,38.20,42.24,45.12,46.81,49.84,53.61,57.05,
+58.81,61.36,63.96,68.05,71.28,74.84,76.64,78.20,81.42,84.30,
+88.87,89.87,94.48,95.20,99.49,102.31,105.58,109.43,111.26,115.58,
+116.08,119.66,120.37,125.23,125.82,131.10,136.94,137.50,139.80,146.04,
+146.18,149.00,152.25,152.96,156.94,159.77,159.15,163.54,169.97,170.63,
+175.36,174.74,178.47,182.74,183.94,188.80,191.57,192.54,195.52,199.13,
+202.61,202.98,208.78,211.11,214.49,220.60,223.65,224.06,223.63,230.30,
+232.04,235.25,237.24,242.40,244.57,246.60,246.37,256.73,257.82,259.60,
+260.20,261.87,267.84,270.31,272.20,277.64,277.99,280.75,281.16,287.30,
+291.51,294.41,294.72,295.72,298.84,305.17,309.97,311.77,315.60,315.42,
+315.74,320.61,320.67,325.34,328.98,330.73,333.49,337.87,340.35,344.38,
+347.05,343.64,355.59,356.29,360.86,356.17,364.96,365.86,369.30,369.20,
+373.29,377.30,378.08,382.14,392.43,388.37,387.91,394.86,401.16,398.98,
+402.87,408.43,407.97,408.69,413.81,418.06,419.20,419.90,426.41,425.71,
+430.25,434.67,437.06,440.60,442.75,446.85,451.08,453.49,454.69,457.89,
+463.00,468.84,470.24,470.78,475.82,476.75,478.97,477.71,483.38,488.86,
+487.97,492.69,498.95,500.76,501.40,507.86,506.52,510.04,512.50,518.38,
+522.55,524.71,521.07,527.07,529.52,536.70,534.25,534.30,537.77,544.31,
+550.06,551.87,557.29,556.42,559.65,561.42,565.27,569.87,573.18,571.96,
+570.63,579.56,580.31,582.96,586.55,590.25,598.90,597.43,593.80,604.45,
+606.68,603.68,613.17,608.28,613.88,617.25,622.33,628.04,631.13,624.83,
+635.63,638.28,639.25,646.16,649.61,652.55,648.90,649.27,655.70,653.85,
+659.60,667.48,669.74,669.35,674.56,676.78,680.58,681.36,686.89,692.71,
+689.97,700.70,695.37,701.10,701.67,701.93,712.43,708.40,718.46,715.36,
+716.36,726.69,721.11,723.19,736.58,727.02,738.01,738.48,742.98,747.05,
+745.12,752.60,753.53,752.92,753.31,763.75,762.30,768.49,766.91,775.15,
+773.54,780.34,777.08,778.99,790.22,797.52,792.98,801.43,803.04,797.70,
+801.82,809.46,810.63,816.32,819.10,814.58,821.39,827.31,826.82,829.40,
+834.63,839.55,841.99,840.62,847.35,850.11,853.80,853.03,852.38,859.82,
+28.01,30.59,33.89,35.93,38.54,39.49,43.50,46.21,50.18,51.73,
+53.10,56.55,59.08,62.92,64.46,64.00,67.64,71.82,73.23,75.85,
+78.66,82.20,85.65,87.42,92.19,93.80,94.80,96.84,99.97,104.30,
+106.68,108.54,111.94,110.61,117.33,118.63,119.23,123.44,123.02,129.70,
+133.18,131.80,136.26,142.11,143.32,143.12,146.62,151.39,155.33,153.14,
+156.62,161.97,161.12,163.44,165.53,169.02,171.97,176.67,177.60,182.74,
+184.22,186.20,186.20,190.42,194.80,195.29,194.84,200.94,204.32,207.23,
+207.10,209.85,213.44,219.33,220.05,223.93,227.20,229.37,225.92,235.48,
+235.78,237.71,240.36,242.66,249.90,247.80,248.11,252.81,253.77,256.42,
+259.43,265.89,265.25,267.11,268.86,275.97,275.17,280.17,283.19,284.36,
+287.50,291.45,289.36,297.20,296.01,301.47,305.01,307.85,307.66,311.69,
+317.07,315.40,322.20,321.41,325.76,325.04,328.48,332.76,332.98,336.37,
+339.65,338.36,349.14,344.77,357.07,351.63,357.68,359.63,362.47,364.70,
+367.79,366.17,369.56,376.38,378.05,377.80,382.20,382.81,385.00,390.70,
+392.67,395.30,393.70,400.45,401.10,402.73,409.08,420.09,412.93,413.23,
+422.81,420.68,423.84,426.68,427.96,430.08,430.83,435.11,431.53,438.60,
+446.80,447.24,448.37,461.50,457.91,456.27,456.46,460.11,465.43,469.35,
+465.31,469.06,474.20,474.51,478.57,483.63,482.57,492.83,493.24,490.03,
+498.78,497.41,502.45,499.02,505.08,512.77,515.19,511.15,516.80,514.23,
+519.17,524.10,525.67,533.83,534.78,531.31,530.70,540.85,536.98,545.18,
+549.97,554.84,556.39,562.85,556.15,556.12,558.93,563.95,567.03,573.28,
+575.34,572.91,575.34,579.76,584.05,586.21,588.59,589.11,598.16,596.02,
+599.89,605.11,606.13,609.99,613.09,611.57,614.95,612.92,621.55,622.88,
+626.51,628.19,633.19,635.27,635.50,633.42,636.88,647.70,642.98,649.31,
+640.83,655.51,655.46,660.99,663.75,666.05,664.08,667.68,675.23,671.48,
+670.88,686.86,679.54,692.17,684.52,687.75,691.69,693.75,697.70,704.64,
+707.14,714.23,708.57,707.48,716.21,717.08,716.15,722.65,723.69,728.08,
+729.52,732.00,737.94,737.99,740.78,747.23,744.54,742.94,747.62,744.89,
+758.81,754.43,765.74,764.20,753.44,766.00,770.25,773.75,772.63,775.65,
+26.90,27.79,29.46,30.85,35.24,37.55,38.75,42.25,42.47,45.71,
+48.55,51.05,54.44,55.57,58.11,61.06,63.30,67.61,67.31,70.56,
+71.65,73.75,76.49,79.99,80.51,85.76,88.50,89.72,92.68,94.88,
+95.94,95.49,102.03,102.66,104.14,107.13,110.38,111.22,114.68,117.42,
+120.55,123.16,125.06,122.87,127.95,132.79,131.30,135.45,136.88,141.25,
+139.98,143.02,145.62,152.83,151.77,153.30,154.10,158.28,161.45,164.03,
+166.04,167.85,169.26,172.25,175.54,177.20,176.99,182.09,185.44,187.04,
+189.14,191.42,192.25,198.93,196.75,199.54,199.66,206.12,205.50,209.66,
+213.22,214.16,216.90,222.60,221.87,222.55,223.82,228.87,231.62,235.07,
+236.09,237.09,240.23,243.23,242.94,249.90,251.25,252.55,255.19,259.57,
+261.55,259.01,263.35,265.30,272.04,272.58,270.85,280.40,284.68,276.94,
+277.69,287.56,290.74,285.21,292.93,289.91,296.75,293.72,300.34,306.12,
+305.63,305.98,312.03,309.56,317.53,318.99,322.66,320.00,317.30,325.00,
+329.30,330.62,337.49,339.11,338.52,340.65,344.42,350.33,352.50,352.32,
+351.38,351.31,355.50,360.36,363.56,366.35,368.50,370.84,373.94,371.41,
+379.15,381.37,384.02,389.60,389.16,388.96,386.18,393.04,397.57,394.42,
+400.30,403.45,403.75,407.32,408.68,414.02,409.32,415.49,418.26,419.47,
+421.56,427.24,425.89,433.25,432.99,437.50,440.58,440.72,446.85,452.41,
+448.52,449.01,449.82,451.51,456.19,456.07,461.12,467.94,463.12,471.75,
+466.62,470.76,480.13,478.67,486.90,484.38,486.33,486.72,490.39,488.57,
+498.14,496.88,499.17,502.04,501.38,508.30,508.75,513.10,516.31,514.20,
+518.90,514.66,518.90,524.71,523.92,534.08,530.98,528.94,538.99,537.86,
+538.94,548.34,538.87,556.14,547.14,553.82,560.18,560.90,554.37,560.61,
+565.04,564.41,564.77,580.56,574.61,574.38,576.01,576.25,588.67,589.76,
+589.71,588.31,593.73,592.10,598.03,600.12,603.07,608.65,609.49,609.46,
+611.62,616.12,621.95,625.30,620.73,629.64,624.43,633.88,626.90,634.04,
+634.67,635.24,647.16,643.63,644.42,644.21,652.91,654.87,650.75,651.28,
+659.72,655.46,665.89,664.97,664.52,672.01,672.83,675.09,678.55,675.99,
+683.18,683.67,690.33,692.10,686.14,694.05,704.96,700.42,699.48,703.70,
+22.52,25.16,26.15,28.93,30.55,32.94,35.70,37.74,40.89,42.12,
+44.52,47.36,48.35,50.61,52.59,56.67,56.72,58.24,61.80,63.25,
+65.41,65.53,71.51,71.18,73.29,75.53,79.01,80.08,82.30,83.37,
+84.08,89.23,88.81,92.68,93.43,98.37,98.63,101.80,101.72,104.45,
+108.05,107.70,112.11,113.63,115.59,117.55,124.32,120.94,123.36,127.99,
+131.78,130.83,133.28,137.10,133.58,139.75,137.94,144.21,144.84,150.65,
+150.74,152.65,153.09,152.75,161.03,160.52,163.92,166.35,166.80,168.64,
+170.72,171.60,172.03,180.54,180.23,179.21,183.50,187.36,186.45,188.03,
+192.42,196.09,197.26,199.03,201.05,203.25,202.93,211.27,208.05,211.56,
+215.75,215.25,216.54,219.99,221.70,223.60,228.45,230.16,231.17,236.04,
+237.44,239.17,235.15,241.93,242.97,243.66,245.65,248.54,249.83,253.11,
+253.39,254.51,261.81,260.60,263.51,262.22,269.09,265.73,269.46,275.22,
+281.18,272.94,279.99,285.29,287.60,286.83,288.54,289.71,289.93,296.79,
+301.26,303.70,303.16,304.77,304.30,306.67,309.40,309.40,312.89,317.16,
+316.88,324.77,321.15,325.56,331.48,331.00,332.70,338.06,337.13,338.12,
+341.77,338.71,350.08,346.65,349.68,351.57,352.82,356.23,352.91,354.68,
+366.61,360.03,368.07,371.09,364.63,373.52,377.05,372.23,377.02,379.99,
+383.52,383.11,389.04,386.17,390.49,394.41,396.03,400.18,399.79,403.01,
+405.46,407.16,408.66,407.79,418.29,416.38,417.61,416.26,422.80,424.80,
+422.00,426.06,426.91,427.80,434.00,435.34,434.01,441.14,440.91,446.24,
+444.29,446.18,448.10,452.62,457.88,457.21,453.04,464.96,463.57,465.70,
+467.16,468.55,472.50,469.25,482.55,478.80,482.53,485.52,491.75,489.33,
+488.53,488.04,493.24,498.16,496.48,499.10,506.90,502.68,504.67,508.52,
+504.19,505.31,515.06,519.18,515.28,516.65,530.20,520.89,528.10,524.77,
+532.49,526.80,532.96,536.69,538.18,540.14,541.73,543.37,548.26,552.28,
+550.12,554.41,554.84,560.50,563.77,567.86,560.76,570.90,567.25,570.13,
+571.36,574.31,575.99,579.79,581.36,585.65,584.20,591.24,586.06,595.99,
+597.92,589.38,601.31,603.47,601.49,603.50,603.64,613.71,614.00,608.17,
+620.52,621.05,618.79,622.74,620.89,624.55,629.99,637.58,633.76,630.42,
+21.02,21.89,24.88,27.21,26.54,30.11,32.32,34.10,35.09,37.42,
+41.82,41.39,43.79,45.97,47.04,46.87,49.97,52.71,53.98,56.62,
+59.51,58.57,62.69,64.49,66.70,68.88,69.10,72.95,73.59,76.09,
+78.01,79.88,80.43,84.88,84.80,86.73,90.73,90.42,92.97,96.25,
+98.42,97.37,101.51,102.45,106.36,105.51,104.80,109.96,113.71,113.18,
+117.97,117.99,118.69,124.59,124.19,127.62,128.29,128.82,129.72,135.45,
+133.61,137.33,137.14,142.41,141.46,144.95,145.23,147.98,148.51,153.62,
+155.46,155.54,154.47,158.81,159.74,161.83,165.69,168.96,168.40,174.26,
+169.27,172.15,177.87,181.45,181.31,181.08,186.09,186.64,189.26,187.04,
+194.50,194.27,195.02,198.14,199.19,204.21,201.10,207.41,208.37,206.67,
+210.73,215.54,217.03,216.04,218.09,221.81,226.41,226.08,226.35,230.37,
+232.15,232.67,237.86,235.15,241.12,239.75,242.51,246.79,246.91,246.18,
+249.44,250.81,256.02,253.66,255.91,257.81,256.42,262.13,262.44,270.05,
+269.74,269.32,273.62,272.20,277.63,275.98,278.97,279.32,289.98,284.00,
+289.10,290.05,294.94,290.12,299.17,298.82,297.08,303.29,299.55,301.25,
+308.62,311.59,312.17,316.65,317.95,318.40,318.11,320.48,324.59,325.41,
+324.07,328.94,327.19,331.23,335.78,332.28,338.58,335.98,341.63,343.58,
+337.88,352.50,349.55,350.59,349.33,353.56,355.80,356.83,357.03,359.04,
+364.75,366.53,369.35,369.16,372.33,373.36,375.42,377.34,375.27,379.44,
+382.56,386.78,392.19,391.48,389.61,394.44,393.65,399.56,400.29,405.03,
+400.74,399.67,407.75,409.76,407.91,418.36,416.50,418.86,415.04,422.47,
+421.01,421.54,422.71,423.77,429.90,433.58,429.81,436.90,441.19,446.62,
+441.15,440.57,445.31,439.84,442.15,449.82,451.29,455.81,457.76,457.15,
+453.81,460.83,466.91,465.47,472.85,472.38,473.36,468.63,475.95,477.49,
+476.81,486.97,486.92,478.30,488.07,487.05,486.56,499.58,495.33,499.27,
+497.98,500.94,503.28,507.81,505.14,510.86,511.31,510.81,513.36,518.07,
+518.31,514.27,515.16,530.67,525.04,528.06,522.04,528.89,533.04,537.61,
+537.47,534.93,543.47,544.75,547.14,547.90,548.39,551.67,550.33,551.45,
+553.98,556.99,563.39,556.30,561.47,564.31,562.56,565.99,566.25,573.95,
+19.13,18.82,20.85,24.28,26.14,27.10,28.74,31.36,33.18,33.50,
+34.37,37.69,39.09,40.78,44.90,43.60,46.13,47.54,49.14,51.05,
+52.85,55.75,55.33,56.33,60.44,62.65,60.56,63.71,66.30,67.53,
+69.62,72.86,73.71,77.02,75.88,81.01,80.35,82.85,85.69,85.24,
+87.74,85.97,87.99,92.83,93.20,96.59,98.22,98.56,102.18,103.20,
+105.10,103.95,105.24,107.07,110.26,110.58,112.09,118.76,115.75,119.57,
+122.61,123.69,124.30,130.66,130.01,132.61,128.34,133.69,133.19,136.75,
+141.33,144.77,143.17,144.23,146.61,146.80,150.05,148.18,149.74,152.08,
+157.50,158.08,163.89,161.68,163.99,167.82,163.16,166.97,171.34,172.66,
+175.78,174.96,175.91,174.29,183.67,182.91,186.50,183.65,185.42,187.78,
+191.00,192.57,193.76,199.01,196.47,202.75,200.12,202.50,203.73,204.31,
+207.96,210.17,213.16,208.15,215.60,215.71,223.98,217.08,218.37,222.11,
+225.17,226.17,225.94,232.02,235.53,234.76,235.37,241.02,240.32,242.10,
+245.17,240.08,244.03,241.02,249.92,247.83,250.96,251.66,257.94,261.39,
+257.62,259.54,261.64,262.81,262.78,263.08,264.76,274.44,276.65,274.15,
+278.44,277.95,281.60,282.29,282.04,282.03,289.90,290.85,293.29,289.58,
+291.12,295.42,296.53,302.19,299.89,300.56,304.20,309.07,308.96,305.25,
+311.76,309.61,314.04,312.53,319.91,318.51,322.36,326.39,324.17,327.19,
+332.14,329.60,327.46,332.79,337.89,336.38,334.95,333.29,339.07,344.10,
+348.96,347.90,344.23,351.21,350.13,355.44,353.01,356.93,363.64,363.47,
+360.66,365.97,365.72,370.95,370.07,372.77,374.16,377.13,371.96,375.73,
+378.76,385.82,378.47,382.23,388.56,386.56,388.80,395.33,398.39,396.17,
+397.24,395.65,402.33,401.38,402.16,403.89,407.45,406.05,415.43,418.94,
+416.56,421.07,420.68,417.31,421.09,431.56,417.39,423.25,423.61,433.29,
+429.48,432.34,433.63,435.82,440.31,440.83,443.86,443.03,446.96,444.99,
+447.26,452.53,451.41,452.19,455.92,456.80,454.17,460.30,461.31,461.69,
+473.15,468.64,467.08,468.30,470.23,473.38,477.88,474.36,483.55,480.52,
+484.45,488.00,484.44,485.95,491.53,488.48,495.84,498.16,495.25,496.66,
+496.27,504.32,502.67,501.72,508.97,513.84,506.63,516.50,507.17,509.12,
+16.26,18.68,20.70,21.11,23.40,24.72,24.69,28.61,30.35,29.80,
+32.58,33.77,33.24,37.63,39.60,39.82,40.94,44.02,45.48,47.22,
+47.84,49.70,50.61,51.99,55.27,55.03,58.07,59.09,59.09,61.23,
+62.19,64.57,68.63,67.08,69.11,70.88,73.48,73.01,74.94,75.59,
+80.97,80.31,81.81,83.81,82.77,87.08,86.64,88.88,93.14,93.64,
+94.80,95.28,97.34,100.01,100.86,102.29,102.42,102.53,104.80,108.34,
+110.81,110.29,112.57,116.54,118.50,116.66,120.85,118.75,121.81,122.94,
+122.57,128.33,129.44,129.33,130.86,131.03,135.16,136.58,139.43,139.70,
+138.37,140.13,143.98,145.79,145.64,148.60,148.11,151.62,155.26,152.41,
+152.56,157.50,156.69,158.41,160.45,166.60,164.81,165.37,168.38,167.99,
+170.31,171.69,171.19,176.33,176.53,180.79,176.82,178.89,182.93,183.38,
+182.85,187.11,192.14,191.26,194.16,199.01,195.25,197.02,198.78,202.28,
+203.78,204.47,209.01,210.93,206.67,206.54,213.06,209.64,211.12,213.62,
+216.73,218.71,220.05,219.99,224.03,224.31,226.29,229.77,230.75,232.84,
+233.39,238.16,238.71,243.16,242.98,243.75,242.96,241.77,247.76,245.83,
+250.40,246.86,254.97,253.57,254.56,257.16,255.04,257.71,257.68,261.73,
+262.03,265.36,267.42,271.52,272.02,271.40,277.40,278.55,276.81,277.46,
+279.65,281.63,283.09,286.47,285.32,287.58,288.65,295.85,295.19,294.01,
+294.05,297.10,295.74,306.32,301.22,303.56,305.02,308.58,305.86,313.49,
+307.41,313.30,313.28,315.87,316.70,320.94,316.75,321.93,320.49,323.72,
+325.06,329.47,332.25,332.71,334.30,335.54,334.27,330.72,333.53,347.65,
+345.58,340.83,341.12,348.97,343.63,349.98,350.51,349.53,348.69,352.30,
+356.37,362.03,360.86,366.23,369.47,358.93,368.17,362.47,369.87,369.90,
+373.06,376.01,369.57,375.78,380.48,377.95,382.44,383.01,380.56,384.99,
+387.48,388.96,386.93,391.79,391.12,387.82,401.00,403.71,400.41,409.96,
+403.85,406.14,403.92,418.09,405.24,408.57,409.81,413.40,423.43,416.12,
+420.80,416.11,420.44,423.58,418.38,428.14,427.68,430.46,429.60,436.84,
+438.16,436.59,431.18,440.33,440.45,439.36,446.93,444.85,450.53,447.01,
+454.60,455.65,454.79,456.10,458.51,455.05,453.26,459.66,459.95,460.33,
+68.20,73.80,81.22,86.37,93.21,100.04,104.81,112.76,118.16,124.14,
+130.69,137.18,143.40,150.32,156.23,161.70,168.22,176.02,181.78,187.32,
+196.05,201.28,207.71,212.42,220.99,226.24,232.45,239.66,243.76,252.82,
+258.76,264.38,271.54,276.34,285.37,287.23,296.29,300.27,307.67,314.95,
+320.60,325.92,332.70,338.78,344.82,354.98,357.15,366.86,370.90,377.94,
+384.68,390.45,395.90,402.71,408.19,419.79,422.68,428.35,435.71,441.75,
+448.35,451.83,461.64,465.54,474.59,477.63,486.65,491.23,498.54,503.61,
+510.17,518.96,522.66,529.92,536.07,542.17,549.70,555.06,561.68,568.97,
+572.63,582.47,588.17,591.10,600.14,609.60,611.83,616.90,626.05,631.13,
+638.00,644.77,651.88,655.09,661.76,667.73,673.13,679.72,687.88,693.43,
+699.63,709.21,714.34,718.09,724.79,733.11,739.26,744.79,752.67,757.07,
+763.91,770.26,775.47,781.40,793.13,795.91,802.44,811.40,815.12,819.50,
+828.79,835.36,839.85,845.72,853.09,856.28,865.72,875.92,877.96,885.07,
+887.21,896.98,907.46,906.98,919.05,923.99,928.17,933.10,942.38,946.27,
+952.63,960.47,968.73,972.28,981.63,986.69,989.27,997.59,1003.97,1011.88,
+1018.55,1025.31,1030.01,1038.08,1037.57,1051.25,1055.93,1061.21,1065.54,1076.38,
+1082.82,1087.86,1095.78,1100.67,1106.85,1113.54,1123.23,1126.14,1133.08,1136.71,
+1143.93,1151.66,1154.97,1166.71,1169.29,1175.56,1185.76,1190.47,1196.94,1204.42,
+1207.40,1212.24,1220.60,1227.54,1234.00,1236.42,1241.81,1254.10,1260.48,1263.63,
+1266.24,1275.11,1280.98,1286.58,1293.26,1300.26,1310.19,1310.50,1317.49,1329.16,
+1333.90,1336.62,1343.10,1354.62,1357.97,1365.41,1375.85,1375.23,1387.62,1393.05,
+1397.60,1402.57,1408.81,1416.60,1422.96,1424.25,1432.26,1439.91,1453.04,1455.25,
+1463.37,1471.06,1474.58,1477.63,1482.82,1489.86,1499.10,1508.21,1512.72,1513.94,
+1527.37,1526.56,1538.09,1544.90,1550.38,1557.40,1562.86,1572.46,1574.52,1577.72,
+1587.01,1591.62,1602.59,1610.45,1609.94,1623.17,1626.26,1625.44,1634.16,1644.90,
+1651.43,1653.38,1659.16,1669.52,1679.12,1679.01,1686.26,1698.06,1698.09,1707.73,
+1712.72,1722.37,1728.35,1734.38,1738.08,1748.16,1747.09,1756.05,1763.11,1766.24,
+1778.62,1781.05,1791.25,1795.24,1804.73,1806.89,1818.64,1820.39,1830.90,1832.22,
+1841.03,1845.07,1850.43,1859.49,1866.99,1873.80,1881.81,1879.16,1888.49,1895.08,
+63.40,68.34,76.45,81.30,86.03,92.47,98.57,104.31,110.06,116.17,
+122.28,128.33,134.33,139.87,145.87,152.66,156.14,164.07,167.68,174.53,
+179.80,185.68,192.53,198.77,205.32,210.43,215.33,223.68,228.20,233.31,
+238.93,246.48,252.19,258.77,265.64,269.20,275.37,280.67,286.34,292.03,
+298.48,304.17,312.31,316.30,324.02,329.13,334.79,343.67,345.69,350.80,
+358.64,366.39,371.08,374.86,382.41,387.75,390.02,399.23,408.40,412.88,
+416.25,423.25,426.98,434.97,441.18,447.52,451.90,460.08,463.39,467.98,
+474.05,480.89,487.94,492.54,498.87,506.49,508.45,517.82,525.38,529.31,
+534.45,539.66,548.36,554.95,558.31,562.55,569.42,574.01,583.45,590.38,
+593.81,596.61,606.17,610.75,616.88,620.68,627.92,634.38,641.78,647.15,
+654.01,657.23,664.35,671.98,676.18,681.04,685.88,691.93,698.96,708.18,
+712.74,716.05,720.23,732.49,736.80,741.75,747.07,753.48,757.49,767.05,
+772.86,775.63,782.47,789.43,795.40,799.18,804.87,810.05,816.59,823.28,
+828.58,835.80,838.32,847.24,853.00,859.21,864.84,868.62,874.38,881.25,
+888.52,893.47,898.27,902.36,910.43,915.79,922.97,932.26,940.47,940.92,
+951.10,952.43,958.62,964.70,971.84,977.14,983.70,991.85,992.02,1001.57,
+1003.48,1013.22,1017.48,1025.73,1029.09,1036.51,1042.19,1047.28,1050.74,1060.30,
+1068.16,1071.09,1076.18,1088.45,1089.88,1093.54,1103.06,1109.62,1108.56,1121.34,
+1126.47,1128.11,1134.95,1141.50,1144.11,1150.39,1158.21,1159.88,1173.37,1180.33,
+1181.76,1188.30,1194.63,1200.83,1205.33,1211.57,1218.31,1225.66,1225.36,1233.09,
+1244.73,1247.79,1252.83,1258.41,1264.47,1269.78,1277.02,1282.00,1287.21,1296.68,
+1301.21,1303.91,1312.93,1320.09,1324.47,1331.34,1337.12,1343.85,1348.20,1351.64,
+1359.49,1365.18,1373.68,1378.86,1388.86,1384.85,1399.72,1400.55,1402.60,1417.05,
+1417.93,1427.05,1429.26,1435.21,1438.97,1447.59,1455.78,1465.00,1466.98,1465.89,
+1481.04,1485.01,1493.14,1496.58,1498.24,1508.57,1516.54,1516.03,1524.74,1526.46,
+1535.16,1543.14,1551.38,1555.95,1559.07,1564.09,1573.46,1579.26,1582.07,1588.75,
+1597.78,1604.51,1605.64,1610.72,1622.88,1624.90,1629.17,1639.45,1646.49,1646.93,
+1653.82,1662.62,1665.62,1669.88,1679.14,1687.83,1687.84,1695.76,1704.94,1712.81,
+1711.47,1718.95,1727.60,1731.49,1736.52,1744.28,1754.62,1747.30,1759.73,1767.34,
+59.20,64.55,69.68,76.17,80.83,85.26,91.77,96.83,101.66,109.66,
+113.41,118.76,124.67,129.14,135.52,139.97,147.42,150.89,158.52,163.46,
+168.36,174.28,179.75,184.10,191.51,197.19,200.35,206.50,212.43,216.59,
+222.58,226.53,235.03,240.50,243.81,248.69,257.05,260.28,268.17,273.08,
+276.39,283.79,287.94,293.92,297.81,304.64,312.01,314.10,322.37,324.27,
+333.08,337.35,343.59,347.87,353.50,360.23,364.64,371.36,377.27,380.59,
+386.94,394.35,401.79,400.54,407.24,415.32,419.58,423.54,431.00,435.38,
+441.17,447.19,453.61,459.73,463.25,466.30,475.43,482.80,482.98,490.48,
+492.76,499.43,504.56,513.28,518.74,522.28,531.36,536.13,541.07,544.58,
+549.79,558.00,562.33,565.87,572.89,579.52,587.62,591.46,595.76,597.16,
+607.73,608.29,615.03,622.20,627.63,632.60,637.11,645.17,649.94,651.34,
+659.93,669.84,671.84,675.97,679.34,689.38,692.50,698.77,703.49,710.50,
+718.34,720.23,724.94,733.38,739.49,739.95,750.64,752.95,754.84,766.38,
+769.82,775.42,780.86,783.12,789.85,791.90,803.66,809.74,810.64,817.40,
+824.43,832.14,838.35,844.18,850.64,848.44,857.09,863.00,869.44,872.27,
+877.19,885.21,888.62,894.70,900.96,903.28,914.57,916.12,925.99,928.10,
+933.59,938.12,945.29,950.92,954.01,957.73,967.41,973.42,977.21,981.91,
+989.11,993.92,997.96,1003.20,1015.07,1014.47,1020.54,1028.14,1037.56,1038.74,
+1044.39,1049.05,1057.42,1057.77,1068.66,1068.53,1071.22,1082.96,1088.07,1097.54,
+1091.78,1102.13,1108.41,1110.27,1127.41,1129.09,1132.75,1136.67,1144.34,1145.40,
+1152.75,1160.20,1166.73,1166.97,1173.52,1183.55,1181.82,1192.56,1194.04,1201.75,
+1205.44,1209.81,1212.94,1222.65,1236.15,1237.21,1239.05,1248.04,1253.30,1256.41,
+1263.04,1267.74,1270.94,1276.51,1283.11,1291.10,1289.58,1301.71,1312.50,1312.70,
+1316.43,1322.75,1327.66,1334.15,1338.51,1343.13,1346.50,1354.14,1357.71,1362.69,
+1367.73,1369.84,1381.07,1387.30,1399.40,1405.05,1402.32,1413.45,1416.91,1418.12,
+1423.40,1429.91,1437.72,1441.89,1444.23,1449.06,1459.90,1466.07,1466.95,1470.79,
+1482.60,1486.54,1486.78,1492.43,1507.37,1510.14,1510.63,1520.01,1524.06,1529.64,
+1531.67,1540.04,1550.15,1547.45,1560.48,1566.01,1565.20,1569.80,1577.92,1588.03,
+1590.43,1596.78,1604.62,1608.79,1613.33,1618.47,1621.12,1629.68,1634.03,1637.42,
+54.12,58.78,63.54,70.90,75.70,80.22,83.06,89.20,95.18,99.90,
+104.67,109.27,115.06,120.95,125.49,130.62,135.48,139.07,144.91,150.26,
+156.99,160.79,165.89,170.97,176.97,180.10,186.97,190.95,195.02,199.08,
+203.79,210.86,217.63,222.62,228.84,231.51,235.46,242.32,248.87,251.99,
+257.08,261.34,265.94,272.61,275.85,283.14,289.32,292.38,297.98,302.85,
+310.00,312.86,317.21,323.43,329.62,333.88,339.04,345.08,351.30,355.27,
+357.95,363.22,368.26,371.61,375.63,384.00,389.65,393.32,398.39,402.59,
+408.19,413.39,423.45,424.34,428.45,431.92,437.91,444.62,445.20,455.51,
+456.76,463.44,470.17,474.05,479.64,487.36,490.73,498.35,502.71,501.30,
+509.11,516.15,518.66,527.21,534.18,535.55,542.85,545.68,548.51,555.69,
+559.85,566.79,567.65,576.50,579.35,582.52,588.45,591.98,601.67,609.54,
+610.15,613.62,621.27,629.65,631.74,635.64,641.98,645.99,651.98,657.23,
+664.22,665.22,669.37,676.88,683.07,692.55,695.84,697.62,703.70,703.29,
+715.66,722.56,719.45,726.14,737.09,738.10,740.00,750.84,753.12,757.63,
+767.34,766.42,774.66,771.57,785.38,787.94,794.16,799.46,802.09,810.58,
+809.43,814.80,822.29,827.11,831.13,839.23,846.65,849.66,852.45,863.63,
+865.74,869.43,873.84,878.40,885.44,883.50,899.57,894.31,906.30,910.77,
+915.01,918.43,928.13,929.97,934.50,937.50,945.79,952.57,955.06,961.33,
+961.45,972.04,972.56,981.21,983.24,991.25,995.38,1000.85,1000.56,1011.15,
+1021.08,1020.32,1023.24,1030.06,1036.13,1041.52,1037.86,1046.54,1056.50,1060.03,
+1067.37,1069.81,1076.02,1087.62,1087.33,1093.15,1095.06,1100.81,1109.03,1114.61,
+1119.62,1123.88,1129.54,1132.47,1136.45,1138.34,1149.65,1149.67,1156.89,1167.09,
+1170.98,1175.46,1175.95,1179.46,1189.40,1190.07,1197.18,1206.28,1207.97,1220.31,
+1221.43,1228.57,1224.80,1238.58,1235.28,1243.65,1246.32,1257.99,1254.22,1262.07,
+1259.90,1279.11,1274.93,1288.64,1286.67,1292.41,1297.75,1307.03,1308.40,1314.25,
+1314.36,1323.27,1324.28,1339.72,1338.69,1348.15,1349.00,1350.21,1362.17,1364.97,
+1376.03,1375.86,1378.77,1388.24,1392.68,1395.67,1395.19,1402.41,1408.65,1420.01,
+1420.10,1423.06,1440.67,1434.08,1440.53,1441.11,1449.96,1458.03,1460.97,1464.78,
+1472.15,1476.73,1478.45,1493.91,1486.63,1499.19,1508.65,1505.93,1513.08,1520.15,
+51.35,56.18,59.49,64.29,69.39,72.89,78.05,81.09,85.75,92.62,
+97.50,101.77,106.05,109.31,116.16,120.08,125.15,130.91,134.49,138.52,
+143.26,150.00,151.18,160.11,161.14,166.77,170.13,175.11,181.79,187.07,
+191.33,192.95,199.84,203.69,210.21,214.74,219.76,223.19,226.72,230.34,
+234.05,241.89,249.18,249.87,256.75,258.59,264.26,269.07,272.89,280.36,
+281.62,287.93,292.24,296.03,304.17,304.51,312.23,317.04,319.44,328.81,
+328.75,333.48,337.17,344.08,350.81,354.87,357.58,362.87,368.13,374.63,
+377.89,380.52,388.79,395.13,395.92,403.14,405.15,412.57,413.50,420.15,
+426.62,428.98,433.86,440.46,443.32,449.27,452.73,455.15,460.03,466.72,
+465.63,476.63,481.46,480.86,493.00,493.52,499.60,504.73,510.25,511.10,
+516.28,522.18,527.87,529.30,533.14,546.14,544.55,553.01,553.52,559.09,
+567.46,567.78,575.41,577.34,583.43,591.03,590.44,598.32,600.28,606.86,
+610.39,613.73,619.44,624.39,630.03,634.65,636.47,643.62,646.09,651.98,
+654.57,664.12,663.39,670.22,678.15,680.88,684.79,691.57,690.73,699.08,
+702.20,703.45,714.35,718.68,725.77,727.38,733.54,733.48,745.27,747.00,
+750.90,755.34,761.05,764.82,771.59,772.53,779.39,781.38,790.46,794.45,
+801.40,804.11,809.28,812.72,815.74,827.87,826.01,832.93,836.19,835.49,
+844.31,855.25,854.37,856.81,874.96,871.52,873.45,874.50,882.14,889.96,
+891.26,900.83,898.85,903.75,905.91,913.54,918.06,921.88,929.84,933.26,
+937.37,940.45,944.84,956.14,951.78,963.15,969.35,963.17,977.10,980.20,
+988.04,988.69,992.35,995.24,998.97,1008.94,1014.70,1016.61,1024.15,1024.20,
+1029.98,1038.57,1043.61,1045.86,1050.20,1060.59,1058.15,1068.62,1068.74,1071.98,
+1082.84,1080.63,1088.39,1096.16,1094.19,1097.83,1110.92,1108.78,1109.35,1124.21,
+1120.18,1127.33,1131.40,1139.68,1144.93,1150.39,1151.88,1157.79,1162.89,1165.31,
+1173.97,1179.12,1181.16,1180.63,1191.18,1194.14,1197.99,1207.59,1208.27,1217.49,
+1213.32,1221.80,1232.96,1234.91,1234.61,1241.98,1246.02,1253.32,1256.05,1269.76,
+1263.68,1271.84,1277.36,1283.32,1283.62,1289.81,1288.83,1295.02,1308.26,1304.01,
+1309.52,1318.21,1317.72,1327.24,1331.79,1337.73,1335.48,1347.79,1351.01,1353.18,
+1363.42,1362.83,1372.91,1377.63,1376.15,1385.44,1389.79,1388.04,1400.13,1405.85,
+46.65,50.04,54.80,60.04,64.08,66.44,73.04,76.54,79.41,84.73,
+90.20,94.11,96.95,103.22,107.18,111.32,115.10,118.98,125.51,126.50,
+133.31,137.87,140.01,144.72,150.22,154.01,157.06,162.21,168.94,171.78,
+175.26,179.75,184.80,189.73,194.30,195.93,198.47,207.02,212.17,213.46,
+218.14,221.16,226.42,231.51,234.26,240.48,247.10,247.26,252.29,256.13,
+262.04,268.16,273.73,273.64,280.84,282.09,285.98,289.80,296.67,300.37,
+301.54,307.79,315.51,316.19,322.24,325.52,328.70,330.30,337.28,342.64,
+349.25,350.94,356.42,361.43,365.40,369.54,373.25,379.73,382.86,388.41,
+389.30,395.38,399.23,402.07,409.15,409.86,417.41,422.03,425.69,427.89,
+430.57,435.11,442.21,447.94,450.44,457.80,459.30,462.63,468.70,476.39,
+478.42,478.92,485.89,490.74,495.10,494.12,506.40,509.51,513.06,514.33,
+520.03,524.03,529.60,533.60,542.45,538.12,544.23,548.05,550.53,558.20,
+563.92,565.58,572.19,575.13,579.29,588.80,588.70,595.40,593.19,600.55,
+602.41,611.95,617.53,619.26,626.02,630.52,632.73,639.51,647.12,648.58,
+649.70,654.47,658.41,661.93,665.95,665.83,675.92,681.49,685.92,692.26,
+695.34,694.34,705.30,706.24,710.71,718.58,716.06,717.77,727.10,729.10,
+732.64,742.38,738.70,748.62,750.72,758.81,762.30,767.27,767.82,775.30,
+777.04,782.30,786.46,788.84,796.27,804.18,805.35,808.69,809.06,817.88,
+821.07,821.64,829.40,834.54,843.79,847.28,845.26,845.39,859.38,861.14,
+864.44,867.35,875.20,876.40,878.35,888.73,889.30,890.98,899.41,908.83,
+909.86,909.71,915.33,920.95,925.78,929.70,931.02,937.65,938.51,949.89,
+950.07,949.72,961.52,964.03,969.14,973.94,974.96,983.47,977.78,990.44,
+992.61,997.80,998.69,1007.10,1009.02,1017.26,1020.52,1020.11,1027.19,1031.91,
+1033.33,1039.92,1048.84,1053.40,1055.33,1060.72,1066.59,1064.34,1071.99,1073.44,
+1082.54,1094.39,1088.47,1096.60,1095.61,1101.65,1099.10,1107.39,1119.14,1114.98,
+1124.51,1131.21,1131.76,1138.80,1133.64,1138.78,1143.83,1148.82,1160.73,1164.43,
+1162.40,1167.32,1166.10,1176.81,1179.96,1184.74,1189.14,1197.73,1201.03,1202.10,
+1206.02,1213.97,1217.12,1219.04,1229.00,1227.60,1232.39,1235.52,1245.44,1244.87,
+1254.87,1256.58,1258.04,1261.92,1275.04,1274.81,1276.36,1289.68,1290.23,1282.00,
+41.34,46.65,51.32,55.04,58.26,62.19,64.98,71.34,74.13,76.53,
+81.30,87.26,89.92,92.52,97.61,101.92,105.25,110.96,115.05,117.85,
+121.97,124.88,131.10,134.69,134.95,140.75,146.09,147.44,155.00,156.97,
+160.81,164.38,171.55,172.93,178.15,178.51,187.06,189.86,191.52,199.23,
+201.64,206.71,208.54,213.44,217.85,220.86,223.78,227.96,230.20,233.97,
+243.48,243.05,249.48,252.03,254.70,264.92,264.69,269.57,271.89,274.25,
+280.64,284.64,289.81,289.93,298.34,297.27,304.39,307.76,313.35,314.63,
+317.86,324.02,333.55,329.41,335.02,339.14,343.70,348.03,349.07,353.95,
+357.70,362.39,364.23,371.08,373.25,377.96,379.75,388.31,391.09,394.03,
+396.57,403.68,404.89,411.57,416.25,418.65,424.12,426.89,431.32,433.14,
+440.06,444.56,446.91,449.90,452.82,457.31,460.37,464.88,471.39,469.56,
+476.73,482.63,488.68,495.10,492.61,495.53,502.57,504.54,510.56,512.51,
+517.72,524.52,522.00,527.78,533.06,538.23,544.83,542.70,551.57,555.40,
+555.80,560.12,566.81,571.25,574.65,580.21,583.48,588.59,590.22,593.72,
+595.72,602.70,600.18,606.86,618.43,614.47,617.90,623.56,626.97,633.51,
+630.91,641.42,643.32,646.55,654.37,657.50,660.76,665.00,668.72,674.63,
+676.73,680.66,684.18,686.93,687.17,694.57,702.54,703.55,710.62,710.54,
+721.36,721.18,723.61,725.91,732.84,733.40,739.62,737.85,750.10,753.77,
+751.65,757.56,761.45,762.31,766.61,773.65,776.55,782.31,788.86,785.72,
+790.43,796.44,802.35,810.44,811.56,815.84,817.49,823.78,830.54,826.51,
+832.89,837.89,845.28,845.31,848.42,851.64,855.32,863.08,866.45,868.57,
+869.98,876.47,882.62,889.50,879.39,892.68,898.37,901.72,903.55,909.13,
+913.54,918.76,921.08,926.41,928.59,934.04,941.60,939.15,943.16,949.48,
+953.53,950.23,959.14,967.30,967.90,972.45,972.36,983.67,981.10,986.73,
+989.31,993.82,999.34,1006.00,1006.94,1012.13,1021.18,1020.01,1028.59,1028.28,
+1036.69,1031.41,1037.69,1037.44,1046.92,1044.14,1059.41,1056.82,1066.92,1070.15,
+1070.65,1074.57,1073.57,1085.08,1085.52,1089.45,1099.45,1096.21,1104.03,1101.54,
+1111.34,1116.21,1117.07,1117.59,1130.82,1134.28,1135.30,1133.00,1140.14,1141.35,
+1152.42,1152.33,1156.80,1161.99,1175.74,1175.14,1168.38,1182.09,1185.03,1188.55,
+38.79,43.03,47.12,49.15,53.90,57.72,61.78,65.98,69.45,72.19,
+75.37,78.53,81.36,86.39,91.57,93.97,97.47,101.60,104.77,107.81,
+111.49,112.98,118.90,124.35,126.46,129.77,132.93,138.45,140.06,145.12,
+148.49,150.14,153.97,159.88,162.67,166.05,168.01,171.46,176.62,177.89,
+184.13,188.72,192.57,193.65,199.69,199.65,208.75,211.60,213.28,218.81,
+221.31,221.21,225.77,231.26,234.13,238.80,243.76,246.97,246.86,256.14,
+255.55,257.52,262.27,264.05,268.25,277.78,276.20,281.63,287.75,289.81,
+291.46,297.38,298.08,305.62,308.41,314.40,318.93,320.27,321.37,326.68,
+331.76,336.22,333.91,341.89,340.08,347.94,352.92,352.08,359.00,361.74,
+366.46,370.69,373.38,375.04,381.38,383.72,390.21,395.48,396.10,400.18,
+405.83,406.85,410.69,411.31,413.64,421.72,421.62,429.88,430.99,431.98,
+436.74,438.57,445.22,448.83,452.64,457.04,461.53,465.40,468.14,469.92,
+475.93,476.43,483.36,478.13,495.76,490.77,497.90,506.45,506.38,508.99,
+510.51,510.53,515.98,519.15,524.68,530.29,531.58,531.95,539.16,547.79,
+549.89,550.42,550.68,559.21,559.37,566.45,569.10,573.55,574.77,576.36,
+578.38,589.33,594.89,594.36,600.69,603.79,606.47,606.97,614.02,620.07,
+621.66,623.25,623.84,633.14,636.99,638.28,639.12,648.90,647.06,653.75,
+657.77,657.95,664.25,664.15,670.21,670.14,677.31,685.08,684.73,691.65,
+696.46,693.59,697.31,702.74,705.76,709.74,708.25,720.91,720.99,726.20,
+730.54,733.09,732.37,743.98,740.06,748.68,752.93,751.51,764.34,764.83,
+770.11,770.45,770.20,773.88,777.76,781.09,785.82,784.44,792.14,795.03,
+797.32,801.78,811.61,811.37,819.63,822.56,823.25,825.26,829.46,834.00,
+838.96,841.87,842.00,845.85,850.91,850.78,861.72,860.05,866.24,868.52,
+872.88,878.26,884.83,887.11,885.49,890.13,893.94,898.86,900.83,906.11,
+914.46,922.19,917.16,919.77,928.94,924.00,932.59,941.00,937.70,941.76,
+946.78,948.55,956.78,958.83,962.31,972.37,976.54,964.53,977.34,976.94,
+984.69,985.99,986.62,997.01,998.34,1004.74,1007.79,1018.55,1012.91,1019.18,
+1020.63,1023.69,1022.74,1029.52,1031.40,1041.76,1031.78,1042.51,1050.03,1051.13,
+1055.56,1060.46,1059.53,1074.68,1070.40,1079.03,1078.94,1080.96,1076.20,1089.06,
+34.87,38.74,43.81,45.48,49.09,52.91,56.04,58.79,62.96,65.16,
+69.64,72.65,76.27,78.54,84.01,84.91,87.68,91.26,94.17,97.30,
+102.29,105.79,107.88,111.92,113.46,119.55,121.31,124.02,128.50,131.53,
+133.95,139.70,143.16,146.18,149.34,150.69,156.14,157.71,162.94,165.54,
+169.25,172.30,173.18,176.50,184.61,184.25,189.81,193.13,193.69,197.12,
+203.28,202.92,206.55,211.68,217.31,218.33,220.86,226.27,226.28,230.19,
+232.85,241.68,242.16,246.55,247.30,251.30,255.17,256.52,261.43,266.79,
+266.98,275.75,278.56,278.61,286.32,282.48,285.11,291.40,294.11,302.31,
+299.61,307.04,308.48,313.17,313.27,316.21,314.85,323.17,329.02,330.20,
+336.56,340.82,341.78,346.62,348.47,348.68,354.68,357.00,362.77,364.12,
+365.64,373.43,375.75,381.18,381.10,382.79,387.03,390.52,393.06,398.78,
+402.32,406.70,408.74,413.53,414.93,414.48,422.05,425.25,429.93,429.02,
+439.77,439.73,442.78,441.89,446.17,452.50,454.97,457.16,463.59,465.08,
+466.27,470.30,474.02,477.62,479.98,481.20,488.64,490.67,497.15,500.09,
+499.55,505.75,503.43,509.32,516.25,521.02,517.20,523.12,527.36,531.35,
+537.46,536.40,542.29,547.00,552.59,553.69,553.65,559.79,564.16,566.96,
+569.27,570.60,577.45,578.20,583.49,588.28,585.59,590.49,596.97,593.68,
+604.57,604.85,607.19,610.70,612.75,620.00,624.50,628.38,628.38,631.76,
+635.86,637.10,641.43,639.46,650.81,653.82,656.46,652.82,658.97,663.36,
+666.63,672.08,671.42,676.06,677.77,679.12,691.42,690.38,697.78,693.52,
+701.41,703.26,712.53,709.15,715.30,717.77,714.74,721.63,734.69,730.75,
+730.90,733.93,739.67,740.75,748.54,752.12,755.28,757.21,763.90,764.91,
+770.88,763.69,773.44,780.96,778.65,783.89,791.12,788.77,799.92,796.87,
+801.04,801.41,801.67,814.69,808.79,817.96,822.22,823.23,827.86,827.26,
+834.06,839.84,836.32,842.67,845.87,850.50,854.29,859.74,859.62,864.73,
+865.90,879.87,875.56,876.26,884.66,879.99,885.96,893.54,895.01,891.18,
+897.61,895.54,898.14,910.16,914.24,919.92,923.97,922.40,927.42,936.20,
+939.25,936.14,939.58,942.83,945.24,955.45,958.70,958.16,960.03,961.30,
+973.42,973.44,968.12,984.80,984.04,988.38,987.73,988.01,1000.59,995.36,
+32.10,35.92,38.32,41.13,43.80,47.64,48.80,55.04,56.28,60.10,
+61.44,66.23,70.06,70.10,76.18,79.71,80.94,84.21,88.77,90.04,
+93.83,97.33,99.14,100.33,104.31,109.53,113.72,115.91,116.81,121.59,
+125.82,127.81,129.36,132.83,134.25,138.80,142.36,146.80,146.68,151.38,
+155.10,158.20,158.80,163.03,164.09,170.26,173.55,180.61,180.41,181.16,
+184.75,186.66,192.71,197.05,198.69,199.51,203.43,206.12,208.46,210.71,
+217.78,219.48,222.31,222.21,228.89,230.80,235.44,235.93,241.62,243.12,
+247.11,247.85,249.60,252.89,255.10,261.24,267.55,268.77,270.91,277.82,
+277.51,282.52,282.63,284.41,288.65,289.12,295.78,298.94,300.22,301.96,
+309.30,308.54,313.82,314.33,315.88,321.39,324.81,328.51,335.06,336.47,
+334.81,336.52,343.75,346.95,345.71,348.97,357.17,358.76,364.79,363.34,
+365.40,371.04,372.81,376.81,376.80,384.00,385.74,387.60,391.05,392.66,
+397.99,402.96,406.35,404.12,410.87,413.24,412.97,422.85,416.67,422.85,
+428.11,430.05,436.18,440.25,440.68,441.13,445.30,448.15,454.51,453.64,
+454.97,463.42,461.23,469.22,475.40,470.71,479.07,478.31,480.75,484.43,
+489.06,489.38,496.08,499.35,502.48,505.05,507.05,512.47,511.62,518.75,
+519.78,520.10,524.51,528.48,526.96,536.71,538.06,541.03,540.77,551.06,
+550.98,555.51,550.32,562.34,563.48,568.30,569.66,570.13,575.30,579.47,
+586.32,585.43,587.52,595.29,597.45,597.46,595.18,607.57,603.91,605.08,
+609.45,616.01,618.70,618.67,618.64,626.80,632.14,632.23,630.68,642.72,
+641.45,646.73,646.04,651.85,652.75,656.69,661.55,660.53,660.66,671.56,
+668.02,682.40,675.50,682.24,677.92,688.74,690.08,689.55,697.20,692.43,
+702.64,708.05,707.03,709.55,709.24,716.13,721.26,723.86,725.52,729.10,
+728.29,733.57,739.87,739.10,745.92,751.35,748.25,753.42,750.19,761.87,
+765.64,772.25,768.99,772.22,774.38,773.45,778.50,779.85,789.37,790.72,
+801.13,802.34,796.76,800.19,808.62,806.24,815.36,816.74,820.99,822.29,
+821.84,829.02,835.24,830.22,834.10,835.41,841.89,845.02,848.16,858.35,
+847.37,855.43,860.97,869.61,864.10,865.00,875.67,874.28,875.47,885.87,
+880.53,882.26,884.49,894.98,900.02,892.99,905.93,904.03,914.20,915.02,
+31.21,32.06,35.17,38.09,41.87,43.40,46.45,49.98,51.36,54.30,
+59.03,60.55,62.82,66.19,69.41,73.94,74.64,77.68,78.91,82.94,
+84.21,88.55,91.11,94.05,95.33,99.92,103.33,105.45,109.38,110.80,
+113.45,115.82,117.91,121.22,123.18,126.67,129.17,132.99,135.42,137.74,
+141.66,143.26,149.42,151.00,150.11,156.39,156.55,159.28,161.18,167.11,
+166.99,170.35,173.18,175.09,179.36,183.91,185.03,187.59,190.67,193.39,
+194.55,201.02,199.91,203.16,205.90,211.02,211.89,218.30,219.71,220.96,
+227.01,226.73,225.25,231.96,232.07,238.13,239.76,243.92,246.25,250.91,
+251.52,251.16,257.95,258.26,264.68,264.71,269.04,269.90,275.16,274.92,
+283.71,281.46,289.42,287.10,287.00,291.85,296.35,295.76,306.63,305.17,
+307.21,309.43,314.66,318.46,320.62,321.92,326.23,327.26,327.33,337.41,
+330.95,337.94,340.77,341.81,347.10,350.98,352.57,355.50,364.72,355.27,
+362.53,372.00,372.89,371.61,375.15,380.43,375.96,386.31,384.46,395.46,
+388.73,392.44,396.45,400.21,408.02,406.94,409.03,406.46,408.55,412.42,
+416.78,421.04,425.87,431.64,432.02,435.14,434.19,438.95,443.76,441.92,
+447.59,448.31,455.74,456.41,459.94,459.21,461.72,467.92,472.01,468.34,
+477.86,476.02,480.35,486.15,486.18,485.72,495.24,493.70,494.26,497.43,
+503.90,506.92,507.02,512.66,518.99,518.30,515.83,522.44,527.52,523.86,
+530.31,532.73,531.64,539.41,539.60,547.32,548.25,549.07,550.30,556.09,
+559.05,558.52,570.71,561.10,566.24,571.32,575.30,578.57,576.38,577.63,
+586.32,590.33,587.66,592.22,595.93,598.86,603.78,608.15,608.86,612.54,
+616.55,615.49,611.74,621.99,620.06,620.95,632.83,628.96,637.75,632.83,
+644.81,642.32,646.39,649.68,655.63,653.46,655.11,659.28,662.08,668.03,
+665.44,675.67,683.16,678.97,678.58,686.19,688.29,692.40,694.21,699.67,
+693.62,703.70,709.53,699.51,706.43,715.75,713.98,720.38,716.75,725.87,
+723.39,727.80,732.31,731.31,732.76,738.77,742.13,744.72,738.69,751.34,
+752.01,753.90,757.44,756.57,759.74,768.88,763.25,769.70,775.04,781.39,
+783.68,782.31,782.58,787.60,796.03,793.55,795.78,799.46,802.66,808.17,
+806.78,821.77,813.85,817.38,820.62,819.82,821.18,823.96,828.63,842.92,
+26.85,30.66,32.85,33.81,37.23,41.17,41.88,44.59,46.77,49.62,
+52.69,54.69,56.71,58.58,63.05,65.11,68.54,68.54,73.09,75.09,
+79.22,80.16,81.41,87.53,88.22,90.84,92.43,93.31,96.90,99.57,
+102.56,107.63,109.80,113.09,112.21,118.73,117.82,120.73,124.33,127.87,
+130.47,130.90,133.05,138.64,138.13,141.20,144.91,146.98,150.55,152.04,
+152.02,155.67,161.90,163.03,165.13,165.98,171.62,174.03,175.99,177.11,
+180.64,182.46,188.20,186.99,190.36,191.84,196.70,199.24,200.31,202.37,
+203.13,206.18,208.03,212.09,213.72,214.74,217.17,221.15,225.92,227.58,
+224.98,231.69,236.60,234.81,237.98,241.32,247.47,247.37,248.41,248.88,
+254.94,259.22,263.30,259.75,266.16,265.00,269.22,268.91,273.21,276.32,
+280.94,286.24,289.46,291.08,289.59,292.11,295.79,299.20,302.56,307.79,
+305.62,306.48,312.57,318.37,314.10,318.07,320.17,323.97,327.69,328.53,
+330.65,339.92,330.54,342.66,345.28,345.41,350.19,351.79,349.34,348.72,
+359.32,364.28,364.93,366.77,368.14,367.80,375.23,373.31,370.36,379.15,
+381.74,383.72,384.66,390.96,388.60,394.93,399.16,400.64,402.29,405.09,
+409.08,414.18,415.16,412.43,420.11,421.40,416.22,426.35,426.63,431.58,
+434.90,435.58,441.29,440.98,440.88,443.24,448.40,454.20,452.90,452.36,
+456.75,459.53,463.62,468.41,470.30,475.13,479.78,473.60,477.66,480.25,
+483.09,481.41,481.59,494.15,490.37,497.15,495.77,496.57,510.92,505.87,
+505.86,509.70,513.51,515.36,520.11,526.50,526.90,522.77,536.19,529.73,
+535.02,534.13,542.15,534.23,544.07,548.23,545.97,554.78,560.17,558.95,
+554.41,563.04,561.87,564.95,571.59,570.94,579.34,571.91,581.41,582.47,
+584.81,589.85,589.79,599.37,591.65,593.17,598.33,605.95,602.32,612.95,
+609.83,612.38,609.35,617.47,617.46,615.84,626.80,629.51,632.42,635.65,
+636.76,639.14,640.70,642.99,644.78,649.34,648.40,647.45,654.84,662.81,
+663.03,660.85,672.90,673.29,678.11,677.80,678.31,681.66,674.69,684.74,
+683.92,689.99,694.42,689.21,700.83,700.63,695.25,705.93,708.20,712.91,
+716.92,720.27,715.73,714.52,726.26,724.24,724.74,733.08,736.28,734.72,
+737.53,740.18,741.41,746.39,750.67,757.24,758.33,756.42,758.67,762.26,
+25.89,28.21,29.70,31.70,34.63,36.73,37.38,40.71,44.53,46.91,
+46.30,51.07,52.59,54.77,57.79,59.76,60.94,63.40,66.48,67.87,
+71.24,77.26,75.25,77.10,78.92,82.58,82.78,86.30,88.97,91.50,
+93.65,98.67,98.03,99.55,101.22,105.96,108.45,111.65,112.01,113.82,
+118.82,119.91,121.40,123.03,124.44,133.02,130.79,134.81,134.45,138.28,
+139.00,141.47,143.72,150.09,154.58,151.00,157.54,158.49,156.17,161.27,
+163.90,165.03,166.61,170.76,172.94,176.81,176.29,180.30,185.41,182.15,
+184.39,189.23,194.01,192.65,198.21,197.49,199.86,201.61,204.11,209.26,
+208.86,211.82,215.93,220.89,221.30,222.27,221.50,228.23,229.68,231.50,
+237.01,236.66,236.01,236.05,241.84,246.46,248.40,250.51,252.81,254.31,
+259.05,256.98,262.00,263.62,271.11,266.45,270.50,269.40,273.45,271.94,
+277.73,278.73,283.11,283.45,288.99,291.23,293.78,293.29,294.62,300.22,
+300.57,304.93,306.52,309.90,309.61,310.46,316.14,318.99,318.30,319.86,
+322.34,329.31,328.72,330.66,335.29,340.49,338.65,342.14,345.68,348.91,
+351.58,351.90,353.33,358.29,353.47,360.03,364.50,359.71,362.86,372.70,
+371.59,375.29,374.66,374.69,378.56,381.18,386.99,385.80,388.03,390.19,
+391.98,396.89,399.36,403.46,407.62,404.82,410.68,404.43,412.02,416.24,
+422.53,420.42,423.78,427.35,426.43,430.53,433.68,438.35,436.64,439.14,
+440.90,442.35,449.16,450.80,446.76,455.13,456.49,456.85,459.61,458.69,
+468.59,469.73,469.68,469.83,472.43,476.60,481.86,473.51,488.16,484.65,
+483.19,487.98,494.97,495.93,492.18,495.34,497.06,503.02,504.21,509.30,
+511.64,515.90,516.13,525.41,518.90,523.62,523.57,522.48,525.01,536.70,
+526.77,529.60,535.81,541.80,546.48,546.65,547.02,549.23,551.18,552.84,
+555.69,562.68,557.62,567.62,559.88,567.96,568.52,572.73,569.01,576.71,
+579.37,578.82,586.65,588.20,587.50,588.25,589.44,595.35,601.96,595.45,
+600.22,606.37,606.84,607.98,616.28,608.36,614.84,619.27,619.70,629.52,
+625.46,624.98,629.66,636.04,635.72,638.53,646.98,644.03,647.15,647.30,
+645.02,658.04,656.08,655.76,657.32,657.27,659.44,664.50,667.29,663.09,
+670.79,664.31,677.52,676.75,681.12,686.14,683.71,685.61,686.05,692.51,
+21.81,24.42,27.30,29.30,30.28,33.49,34.28,37.43,38.17,39.91,
+44.41,44.69,46.01,48.95,52.28,54.87,57.08,59.68,60.91,64.79,
+64.38,68.64,69.02,71.97,71.54,74.07,77.08,79.03,81.51,85.75,
+83.79,87.21,91.08,92.92,93.30,96.00,97.05,102.50,102.93,103.08,
+105.92,109.68,113.80,112.50,115.52,114.80,118.12,123.00,127.26,121.12,
+129.79,130.22,132.81,134.11,134.64,137.87,141.70,142.19,142.80,143.24,
+150.96,152.26,152.08,154.24,159.22,157.06,160.20,163.24,164.27,166.56,
+170.83,174.34,173.95,174.65,177.68,177.74,178.63,184.03,185.59,190.75,
+194.66,193.21,195.38,197.75,198.99,202.10,202.19,207.77,209.21,214.54,
+213.16,211.59,217.66,216.46,222.23,219.29,228.40,225.97,229.05,230.47,
+232.89,237.60,237.76,239.38,241.13,246.39,242.09,246.66,254.88,248.49,
+254.88,256.18,258.09,261.22,256.58,263.70,265.74,268.64,275.18,274.37,
+276.52,279.24,278.69,281.23,282.81,282.68,290.26,288.32,290.82,293.37,
+296.56,298.24,302.70,305.62,310.31,307.48,309.20,309.31,312.73,309.49,
+313.77,318.25,324.69,325.37,329.70,323.20,330.98,327.88,333.16,339.65,
+331.83,335.33,345.63,341.51,346.32,350.79,352.89,356.63,354.81,357.20,
+360.38,364.37,368.60,363.76,368.76,371.51,367.02,373.09,373.63,376.00,
+378.47,381.14,383.38,383.31,393.38,388.90,387.19,397.49,399.17,397.40,
+397.08,402.21,407.44,406.73,410.23,414.83,411.65,411.80,422.77,413.87,
+414.16,421.61,427.63,424.34,424.22,427.84,435.44,435.63,437.55,443.28,
+443.83,442.30,446.63,450.07,452.57,455.64,462.02,456.38,454.08,463.81,
+461.79,461.08,469.40,474.84,469.56,473.30,474.98,479.93,479.40,486.66,
+485.72,487.72,487.03,491.94,496.58,491.50,496.88,501.12,500.39,505.37,
+508.10,501.06,513.97,510.42,517.23,514.88,517.30,520.82,520.04,528.30,
+530.98,530.22,526.78,533.07,536.75,536.30,539.84,542.25,541.90,542.73,
+545.53,551.09,549.32,554.25,559.05,554.87,557.40,565.65,565.66,564.17,
+570.02,570.80,572.16,572.35,580.50,580.19,583.64,588.98,590.22,584.53,
+590.70,595.65,598.40,594.59,598.45,601.37,610.13,613.10,600.64,612.20,
+613.45,610.37,618.53,615.61,616.43,623.47,621.23,629.71,622.46,633.51,
+18.78,22.44,24.74,26.98,27.84,30.98,32.80,34.40,35.33,38.40,
+38.94,41.64,45.89,44.82,46.38,50.17,52.22,54.49,54.48,56.80,
+61.56,61.31,63.60,63.46,66.19,70.42,69.74,72.79,73.22,75.93,
+79.26,78.33,81.09,83.81,86.26,89.56,87.92,92.22,94.56,95.10,
+97.56,97.12,99.26,104.07,102.92,107.23,110.85,109.61,113.56,114.22,
+115.18,120.37,119.50,121.82,124.93,127.08,131.95,128.54,130.93,133.66,
+136.60,140.60,139.26,143.88,142.29,141.77,142.56,148.02,149.44,154.11,
+158.08,154.66,157.56,158.23,160.40,163.99,167.67,165.55,171.20,169.74,
+170.15,173.82,176.29,181.76,180.12,183.99,182.92,185.59,189.68,187.46,
+190.51,198.59,192.18,196.25,203.01,200.37,202.11,203.34,209.74,210.57,
+214.29,214.06,217.06,215.66,219.84,218.06,223.51,221.26,231.69,227.45,
+232.30,238.40,239.97,242.12,236.86,244.47,241.43,244.12,248.90,250.75,
+256.15,251.19,253.45,254.32,255.60,260.04,262.51,265.71,263.79,268.78,
+269.11,272.85,272.18,273.52,283.21,273.30,280.28,285.20,282.43,282.04,
+289.26,289.08,290.45,289.87,298.00,301.60,297.81,301.73,301.51,300.19,
+304.70,304.25,311.97,312.20,313.99,319.67,322.19,321.54,324.32,321.82,
+325.46,329.75,335.20,331.22,333.84,330.27,333.27,338.08,345.57,344.70,
+350.26,347.19,347.87,351.97,353.21,354.87,354.20,363.55,354.33,364.06,
+372.19,366.17,366.33,366.30,370.43,378.84,377.38,374.89,382.94,381.57,
+387.68,382.46,384.38,388.27,389.96,393.86,398.65,400.25,399.45,404.45,
+399.67,404.00,405.64,409.96,415.50,416.18,412.93,423.83,418.72,423.11,
+420.87,418.92,425.01,432.36,425.58,431.80,432.16,432.42,440.43,447.61,
+438.41,446.63,444.49,449.39,451.09,450.24,452.41,451.11,454.21,454.21,
+458.53,464.74,463.35,468.60,463.15,471.43,467.67,473.04,477.17,473.74,
+482.36,479.78,482.48,484.85,487.86,489.65,490.27,492.59,493.67,497.93,
+500.81,503.66,496.35,507.01,502.15,503.32,508.74,508.30,510.48,510.32,
+514.60,517.25,523.40,530.32,526.51,529.11,531.83,533.04,534.17,534.39,
+537.07,538.70,542.44,538.90,545.21,546.72,543.90,545.92,547.06,557.04,
+557.00,555.95,559.00,563.87,561.57,562.80,570.75,566.38,573.80,577.06,
+71.79,80.38,87.09,91.81,100.47,107.70,113.92,121.07,126.33,133.87,
+140.81,147.64,153.61,161.16,168.35,173.07,181.78,187.91,193.25,199.26,
+207.50,215.00,220.69,226.51,235.55,242.96,249.02,255.52,261.45,267.38,
+274.26,282.38,288.59,294.64,301.73,310.40,315.16,322.68,327.96,337.07,
+341.02,349.33,356.73,362.46,369.82,376.59,384.92,392.05,396.95,403.26,
+410.17,416.62,424.62,431.71,436.77,444.28,449.97,457.52,464.87,470.72,
+478.32,486.24,492.74,499.47,506.96,513.40,518.62,523.96,531.65,539.31,
+545.87,553.20,562.60,565.52,572.18,581.45,584.39,593.92,597.42,607.98,
+612.43,618.66,627.14,634.59,639.81,646.96,655.04,658.98,668.83,676.16,
+680.89,687.88,692.86,702.58,703.83,712.85,723.86,727.25,734.18,745.17,
+746.57,755.34,762.69,769.54,774.41,779.39,791.01,796.26,800.39,806.53,
+815.40,821.60,829.85,834.45,843.89,850.42,857.95,864.43,867.92,874.11,
+883.38,887.29,893.79,904.94,913.71,920.35,922.40,930.52,940.01,942.17,
+955.03,959.97,962.97,972.16,979.07,986.73,988.50,998.85,1006.35,1013.19,
+1019.18,1027.82,1033.58,1038.52,1041.82,1054.06,1060.63,1061.25,1071.97,1081.11,
+1086.31,1092.27,1100.43,1106.89,1112.86,1122.25,1127.19,1131.34,1142.58,1142.71,
+1155.69,1159.43,1167.17,1168.91,1178.85,1190.67,1194.54,1201.85,1205.26,1211.36,
+1221.62,1230.42,1236.43,1241.08,1246.65,1249.89,1258.16,1265.54,1276.18,1279.63,
+1292.09,1295.57,1302.03,1307.33,1312.78,1321.79,1333.76,1336.66,1341.65,1349.54,
+1355.49,1364.72,1370.03,1373.00,1383.56,1393.87,1396.73,1407.18,1413.32,1417.17,
+1420.35,1430.58,1438.15,1443.50,1450.69,1454.96,1463.24,1467.99,1475.60,1487.24,
+1492.94,1498.75,1505.05,1511.39,1520.40,1524.25,1530.51,1542.36,1548.82,1556.45,
+1560.12,1564.37,1573.22,1582.52,1584.46,1587.78,1602.10,1606.40,1612.72,1621.00,
+1627.79,1635.45,1636.84,1643.97,1655.41,1662.27,1664.27,1669.33,1681.61,1689.76,
+1693.81,1701.63,1706.72,1718.77,1720.17,1728.27,1731.95,1740.94,1746.92,1758.09,
+1762.06,1771.17,1775.40,1785.41,1791.75,1796.17,1800.69,1810.90,1817.23,1822.84,
+1826.30,1835.04,1839.74,1850.03,1858.80,1861.70,1868.21,1872.25,1883.85,1890.89,
+1893.05,1900.88,1914.40,1915.96,1930.07,1928.15,1936.85,1938.36,1950.66,1958.27,
+1963.70,1967.65,1972.96,1977.70,1988.87,1999.96,2004.18,2013.40,2016.92,2025.61,
+68.55,74.69,80.64,87.85,93.10,100.51,106.20,112.89,119.50,125.46,
+133.88,138.14,144.74,153.08,158.24,164.28,168.76,177.69,181.65,191.23,
+195.90,202.80,208.14,213.65,222.50,226.56,235.30,239.76,244.97,251.00,
+260.95,264.45,271.70,278.89,286.23,289.30,295.52,300.38,310.36,315.46,
+321.64,331.15,335.83,342.72,345.27,354.34,360.93,366.50,375.27,379.74,
+387.62,393.15,399.13,403.19,409.93,415.70,424.39,429.58,437.26,442.68,
+448.19,455.62,460.78,469.72,475.43,480.91,487.65,494.60,502.18,505.06,
+514.03,517.63,528.00,528.52,539.52,545.12,548.88,556.46,559.07,570.14,
+577.57,582.38,589.45,595.11,599.83,609.01,614.15,620.45,626.12,632.29,
+637.43,645.46,651.96,657.12,664.30,670.80,678.54,683.60,692.22,696.11,
+705.21,711.38,717.76,720.01,724.86,732.51,737.56,748.35,751.70,759.38,
+763.78,776.20,778.64,786.33,792.26,794.66,805.10,815.00,817.14,821.75,
+829.75,839.37,843.95,847.77,852.23,860.15,865.11,873.18,880.61,890.53,
+893.60,898.55,904.69,909.34,920.72,925.53,927.26,942.62,944.73,948.00,
+955.06,963.43,969.12,974.56,985.48,988.11,993.46,1001.91,1009.12,1008.14,
+1023.71,1024.30,1026.70,1038.88,1043.89,1051.34,1054.75,1067.60,1073.71,1074.83,
+1084.54,1092.07,1098.26,1099.99,1108.27,1113.58,1121.06,1124.99,1133.69,1142.34,
+1147.46,1154.82,1158.29,1165.97,1168.81,1179.74,1183.44,1190.59,1200.53,1199.15,
+1212.52,1215.16,1221.74,1229.71,1236.44,1246.01,1251.02,1254.94,1259.88,1266.21,
+1273.29,1282.16,1287.70,1294.40,1301.07,1303.98,1310.85,1321.23,1324.06,1330.62,
+1341.13,1345.12,1350.17,1355.81,1363.13,1363.29,1376.61,1374.87,1390.26,1391.90,
+1398.95,1405.88,1413.96,1422.43,1425.63,1427.06,1441.75,1444.22,1452.29,1462.39,
+1464.41,1470.93,1482.30,1482.37,1490.14,1497.25,1500.34,1506.68,1516.47,1519.09,
+1529.37,1538.01,1539.80,1543.07,1551.07,1558.32,1566.92,1567.94,1575.62,1585.32,
+1592.23,1601.80,1606.91,1605.79,1616.10,1622.80,1630.68,1635.19,1644.88,1649.79,
+1656.62,1660.15,1669.08,1678.73,1675.10,1686.58,1687.85,1701.26,1705.33,1709.68,
+1719.38,1722.70,1737.09,1737.47,1737.26,1752.63,1758.77,1763.48,1766.08,1775.43,
+1782.48,1787.88,1796.22,1800.38,1808.41,1813.33,1816.06,1819.56,1839.83,1841.54,
+1839.85,1847.39,1859.32,1864.64,1870.20,1875.90,1882.00,1891.15,1895.23,1897.82,
+64.25,70.70,75.54,81.42,88.61,93.40,99.69,105.48,112.08,117.69,
+124.14,130.93,137.03,140.74,147.26,151.53,160.14,164.20,170.59,178.06,
+182.89,187.90,194.54,202.04,207.83,213.21,215.97,223.45,230.80,238.09,
+242.71,249.78,254.63,259.17,265.16,272.59,276.63,282.62,286.56,296.03,
+304.32,308.84,315.36,321.28,326.96,331.25,335.46,345.12,348.35,354.86,
+361.92,368.46,371.82,377.03,383.39,392.67,398.54,404.58,408.43,415.15,
+422.66,427.19,430.06,439.06,445.83,453.46,454.81,460.07,468.11,475.18,
+480.62,485.06,494.06,496.36,506.17,509.37,517.66,521.18,526.96,535.01,
+539.21,541.30,548.43,560.13,561.14,569.83,574.23,584.22,584.47,593.86,
+598.42,602.89,612.40,615.05,621.34,627.68,634.98,641.19,647.21,651.39,
+659.86,663.22,670.45,675.44,683.08,689.07,696.43,700.78,707.58,708.25,
+716.97,722.31,730.35,735.52,742.55,746.37,752.45,761.10,765.96,769.98,
+775.86,784.09,793.00,794.35,803.10,809.34,812.16,816.54,821.36,831.24,
+835.48,840.07,849.92,857.85,859.61,868.35,872.40,878.42,884.93,890.60,
+894.94,901.68,907.70,915.96,920.11,919.54,927.70,937.41,943.23,950.78,
+953.05,961.15,967.16,975.26,979.64,985.40,989.76,994.87,1002.88,1006.38,
+1014.68,1019.96,1022.65,1033.05,1040.23,1041.15,1055.75,1056.15,1060.79,1067.22,
+1073.40,1079.13,1090.91,1090.63,1099.45,1102.07,1113.56,1116.00,1119.43,1126.53,
+1131.49,1137.44,1147.66,1152.52,1159.28,1161.40,1170.87,1179.90,1177.24,1189.43,
+1190.94,1202.51,1204.49,1205.93,1221.53,1222.66,1228.91,1239.65,1239.47,1245.88,
+1251.82,1259.85,1266.16,1271.49,1274.69,1281.32,1289.96,1299.38,1297.38,1306.93,
+1311.58,1313.92,1322.02,1322.47,1336.38,1343.10,1346.18,1352.07,1357.53,1366.88,
+1372.69,1372.98,1389.27,1387.39,1395.43,1403.01,1406.61,1409.26,1418.69,1425.39,
+1430.41,1436.73,1444.34,1446.03,1455.01,1460.66,1464.30,1469.23,1477.75,1485.94,
+1486.44,1496.98,1500.78,1510.71,1509.39,1519.22,1525.87,1536.72,1535.70,1543.17,
+1549.33,1556.45,1560.18,1561.47,1573.39,1578.07,1580.29,1594.11,1594.42,1603.58,
+1609.16,1613.98,1616.73,1625.27,1628.02,1637.15,1645.10,1649.44,1650.86,1663.54,
+1668.53,1680.13,1679.56,1683.68,1693.01,1694.78,1705.94,1709.10,1714.87,1720.55,
+1726.70,1730.21,1743.99,1750.02,1746.37,1754.26,1760.57,1773.21,1777.10,1784.61,
+59.68,65.03,71.92,77.06,82.32,87.37,92.94,99.35,104.68,110.03,
+114.25,120.59,128.04,132.14,138.67,141.86,148.89,154.57,161.08,164.57,
+170.82,176.25,181.95,188.67,192.07,198.89,205.21,207.25,215.07,219.29,
+225.94,232.22,236.95,242.75,249.09,253.14,260.51,266.53,271.56,276.81,
+282.19,289.33,291.83,298.67,304.01,306.83,316.86,322.56,328.63,332.37,
+335.59,342.57,347.00,353.35,361.35,365.55,370.59,376.92,382.95,388.03,
+392.61,398.05,404.14,405.78,412.64,420.98,424.36,433.88,438.94,442.00,
+449.29,454.60,462.59,464.82,470.89,476.19,481.97,486.46,492.11,498.27,
+506.95,507.46,515.72,517.60,525.79,531.75,535.64,544.93,548.98,554.49,
+562.27,566.35,573.24,579.54,582.82,586.43,591.00,599.52,604.50,604.17,
+615.52,619.93,625.67,632.38,638.89,641.58,649.50,654.15,659.41,666.51,
+673.20,672.58,685.09,686.29,696.68,696.50,709.25,708.20,716.10,721.24,
+728.18,730.49,736.97,741.84,746.34,759.09,760.56,768.20,769.30,775.45,
+781.02,784.33,791.88,800.62,805.09,807.15,810.52,816.18,828.31,829.85,
+839.05,843.37,847.43,854.25,858.32,864.49,870.78,872.94,878.10,888.28,
+893.07,896.39,904.87,910.81,916.34,919.99,927.68,933.17,939.91,945.80,
+948.07,954.41,959.31,964.48,974.53,975.15,979.08,990.86,998.21,997.97,
+1005.07,1007.68,1012.32,1021.90,1022.79,1033.19,1037.35,1045.29,1046.03,1050.43,
+1059.12,1063.15,1070.16,1075.17,1077.47,1089.53,1091.89,1093.11,1102.89,1105.90,
+1112.29,1119.69,1122.93,1126.86,1138.08,1139.11,1148.90,1152.87,1162.89,1169.38,
+1171.79,1171.00,1179.96,1192.55,1197.61,1200.10,1205.06,1206.60,1217.66,1219.07,
+1226.41,1225.18,1239.59,1237.36,1251.33,1253.25,1261.48,1260.02,1266.89,1280.83,
+1276.45,1289.05,1291.04,1294.38,1303.93,1304.11,1315.18,1325.11,1323.35,1330.34,
+1340.47,1342.17,1349.27,1351.24,1354.91,1364.08,1369.48,1378.00,1386.11,1385.06,
+1386.09,1399.17,1403.38,1406.30,1419.61,1425.27,1425.15,1431.50,1435.05,1436.36,
+1449.46,1455.31,1455.86,1464.21,1466.49,1475.95,1477.01,1485.57,1498.41,1498.30,
+1501.35,1510.22,1507.48,1522.44,1526.61,1526.51,1537.00,1545.00,1548.09,1554.55,
+1549.60,1566.79,1567.50,1581.25,1582.66,1585.07,1596.31,1593.68,1603.52,1608.61,
+1612.78,1617.95,1628.40,1625.83,1637.66,1643.70,1650.46,1661.99,1660.50,1661.91,
+56.80,60.60,67.06,71.83,76.96,80.70,87.79,91.64,94.32,103.74,
+107.86,112.44,117.80,124.37,130.19,133.88,139.07,143.83,149.88,154.25,
+159.78,162.65,168.66,173.96,181.11,184.12,190.68,193.94,200.80,203.01,
+212.69,215.77,222.94,227.71,234.31,236.29,242.49,245.09,254.16,259.57,
+262.48,267.08,272.47,278.26,283.75,288.21,294.88,299.84,304.42,310.35,
+316.77,317.34,326.38,328.37,335.41,338.66,346.23,352.03,355.52,361.64,
+368.09,372.71,374.04,382.55,388.46,394.01,397.27,402.34,408.55,413.88,
+414.54,422.58,427.78,437.37,437.16,442.02,452.45,455.82,457.16,465.63,
+467.99,477.07,481.98,484.13,490.77,496.05,500.89,502.80,509.86,520.08,
+517.86,525.85,530.03,533.64,540.98,550.06,554.75,554.90,560.87,567.03,
+573.21,580.98,582.06,589.85,592.59,602.55,606.24,609.73,616.23,623.33,
+623.07,630.90,634.26,641.43,645.64,653.16,655.84,663.33,666.42,673.23,
+676.47,679.73,688.57,693.42,699.06,705.58,709.76,711.67,719.96,725.89,
+730.64,732.31,738.95,743.57,748.74,751.99,757.37,760.83,770.85,775.71,
+780.31,786.12,788.95,795.86,798.03,806.87,810.78,809.45,823.41,822.76,
+833.95,837.48,842.14,845.91,849.76,857.32,864.24,871.80,869.82,876.90,
+887.48,889.37,890.60,900.22,901.67,912.44,916.67,917.83,922.69,927.34,
+936.73,941.85,943.40,951.24,958.53,959.29,966.61,970.71,974.04,979.80,
+987.79,991.78,998.98,1004.74,1007.43,1014.82,1022.15,1021.48,1028.73,1037.50,
+1041.97,1043.89,1052.32,1053.33,1057.66,1062.43,1067.48,1073.84,1073.28,1088.86,
+1087.72,1091.21,1095.42,1103.46,1114.94,1120.98,1119.09,1125.29,1134.86,1135.80,
+1144.55,1142.71,1153.63,1153.43,1163.41,1167.48,1171.86,1181.62,1181.79,1191.14,
+1187.50,1197.86,1203.48,1207.53,1213.84,1217.61,1223.00,1234.04,1234.17,1241.35,
+1243.75,1255.36,1251.56,1260.85,1265.31,1271.00,1273.97,1277.14,1286.70,1294.74,
+1298.45,1300.54,1310.65,1314.38,1315.15,1324.05,1320.24,1334.70,1338.79,1339.50,
+1352.17,1347.86,1356.08,1364.39,1364.84,1377.75,1376.89,1392.10,1395.32,1396.72,
+1400.73,1409.12,1414.89,1421.16,1422.21,1427.87,1428.28,1442.60,1432.69,1449.63,
+1452.18,1457.20,1463.70,1469.02,1474.91,1478.99,1480.44,1494.80,1489.93,1499.52,
+1510.35,1512.17,1516.24,1527.30,1514.79,1529.48,1532.90,1545.59,1551.14,1549.90,
+52.31,56.55,63.50,66.08,69.92,75.88,82.11,86.94,91.26,96.18,
+100.40,105.48,111.53,115.18,118.16,124.34,130.65,133.14,138.93,143.55,
+149.92,154.26,159.18,164.59,167.75,171.97,178.58,180.46,184.43,190.52,
+197.91,199.79,208.25,211.38,216.30,219.84,228.65,229.93,234.19,240.50,
+244.22,248.98,252.92,260.85,263.54,269.97,275.50,278.47,281.52,288.47,
+293.52,297.15,301.80,310.37,310.32,317.34,323.88,327.57,331.87,337.16,
+342.29,343.66,352.43,351.32,360.34,364.96,370.56,373.20,380.82,382.45,
+392.29,393.20,399.89,402.18,409.07,413.32,418.47,422.73,424.47,429.62,
+441.79,441.38,448.82,455.10,457.04,462.50,463.25,471.93,474.06,479.63,
+485.61,495.08,494.79,500.71,505.19,506.26,513.18,518.33,521.86,533.75,
+532.42,540.24,541.17,550.09,554.18,557.15,565.06,566.28,571.14,572.94,
+578.03,582.29,589.57,594.21,601.98,603.38,613.72,615.35,619.44,625.02,
+626.08,634.33,634.68,637.20,645.56,653.55,658.34,657.21,667.43,676.39,
+672.21,684.50,685.37,689.19,693.41,698.96,703.39,710.74,719.11,722.23,
+725.22,734.71,735.35,742.37,740.07,748.26,755.19,764.37,763.51,767.49,
+774.85,774.98,789.16,788.74,791.24,796.37,804.58,808.63,814.51,812.00,
+825.96,826.96,831.63,836.81,844.19,848.49,850.12,857.43,854.32,867.59,
+868.43,871.96,880.82,891.06,889.55,892.20,902.98,903.71,908.12,915.60,
+917.76,924.51,925.71,932.42,937.47,942.83,950.62,951.41,955.95,967.03,
+966.40,972.60,968.40,984.98,986.51,992.57,993.46,999.24,1003.88,1011.36,
+1019.53,1015.70,1025.09,1024.62,1034.46,1039.91,1037.96,1045.85,1047.82,1054.87,
+1063.42,1067.10,1068.37,1072.85,1086.27,1085.33,1097.30,1098.92,1101.87,1107.41,
+1107.39,1113.91,1114.05,1127.30,1131.60,1136.44,1139.76,1141.71,1152.43,1153.73,
+1158.22,1167.66,1170.18,1177.46,1178.48,1185.76,1189.10,1189.93,1197.52,1200.91,
+1205.35,1216.56,1217.39,1218.56,1230.72,1231.45,1234.21,1244.06,1241.93,1251.51,
+1252.12,1257.99,1266.12,1270.41,1270.52,1282.03,1285.45,1286.00,1291.13,1294.12,
+1302.53,1309.91,1314.51,1324.34,1318.79,1325.65,1329.15,1341.02,1341.98,1342.47,
+1354.56,1352.77,1363.91,1367.49,1375.25,1376.61,1371.18,1380.02,1393.77,1396.24,
+1400.32,1402.16,1404.93,1416.09,1412.72,1426.47,1433.84,1435.62,1434.94,1443.69,
+48.70,53.05,57.23,63.60,65.57,69.65,75.83,80.46,82.73,89.04,
+93.41,97.56,103.25,105.56,111.52,113.64,121.32,126.94,128.83,134.36,
+138.12,142.44,146.86,149.28,156.00,160.69,163.84,166.70,174.67,177.89,
+181.51,187.06,192.28,192.56,202.13,205.87,210.81,212.36,217.05,220.82,
+224.35,231.82,234.07,241.53,246.65,249.88,253.96,260.17,262.22,268.39,
+271.07,276.86,278.06,286.88,290.25,295.66,295.80,304.36,307.16,310.12,
+315.60,319.35,324.84,327.73,331.37,339.46,343.72,348.30,351.91,356.16,
+358.75,368.42,370.52,373.13,378.69,382.14,389.28,390.14,396.16,403.87,
+404.39,410.12,414.45,420.37,427.43,429.95,434.11,435.46,443.02,448.10,
+450.25,458.25,456.30,469.09,464.31,470.88,479.87,480.93,485.24,490.52,
+495.69,497.43,503.27,507.75,512.09,517.99,523.33,526.29,528.56,535.61,
+539.69,548.04,549.64,556.57,559.58,561.98,568.01,573.03,574.17,575.72,
+585.98,586.08,598.59,595.76,601.63,608.13,613.28,619.00,622.28,624.76,
+631.11,632.03,640.46,647.72,652.46,652.46,652.78,657.70,659.74,670.02,
+676.53,684.06,683.72,687.34,690.46,700.27,701.06,707.37,714.10,714.83,
+717.75,720.22,726.93,729.54,736.94,744.52,744.54,748.97,754.49,759.65,
+766.37,766.30,774.49,777.51,779.90,783.84,787.43,796.99,794.76,798.98,
+809.32,813.61,817.99,821.83,827.69,829.37,832.53,840.84,841.47,847.12,
+854.49,860.81,861.16,862.59,871.50,878.12,876.70,886.27,883.99,891.85,
+896.03,901.85,908.55,912.31,912.86,918.21,929.21,933.55,931.69,933.33,
+939.98,947.15,945.54,958.23,957.35,967.92,972.93,974.16,974.56,978.91,
+986.70,988.79,995.38,999.82,993.28,1005.58,1008.14,1012.11,1026.06,1021.28,
+1025.23,1032.44,1043.44,1051.56,1048.71,1052.64,1054.79,1067.16,1057.14,1072.03,
+1078.26,1077.98,1087.95,1091.51,1090.48,1102.84,1105.92,1114.20,1108.96,1120.74,
+1117.05,1120.17,1133.31,1128.36,1141.10,1142.94,1143.89,1150.19,1160.49,1158.58,
+1166.43,1175.49,1176.15,1176.50,1184.37,1190.36,1194.14,1197.40,1199.08,1207.77,
+1206.67,1213.25,1222.82,1221.06,1231.31,1237.31,1236.12,1241.43,1248.11,1248.84,
+1257.88,1266.21,1254.98,1263.71,1272.51,1284.70,1281.66,1287.37,1298.87,1290.84,
+1305.82,1301.30,1311.55,1314.11,1319.17,1318.79,1327.22,1334.43,1336.79,1335.92,
+44.56,47.74,54.25,56.48,61.10,64.17,67.83,74.69,77.62,81.32,
+86.88,90.67,93.18,100.57,101.37,107.65,109.92,115.01,121.72,121.69,
+127.31,130.74,137.38,141.11,143.63,149.38,153.78,157.65,159.40,162.97,
+169.47,172.62,179.14,178.30,187.62,187.70,195.91,198.20,202.06,205.25,
+212.00,214.71,219.30,221.87,227.48,233.07,236.31,240.25,242.51,247.47,
+252.25,254.94,259.39,260.16,269.83,272.16,273.26,284.57,286.30,289.16,
+293.39,294.01,299.63,306.13,310.28,310.63,315.26,323.57,327.88,330.36,
+333.82,342.28,345.29,340.98,354.23,356.68,357.45,363.05,367.97,368.69,
+377.06,379.67,379.75,389.18,392.76,395.33,399.69,405.68,405.82,413.02,
+417.13,420.32,427.77,429.87,435.02,438.48,443.64,450.20,448.92,455.90,
+461.64,462.48,467.35,474.69,478.54,483.17,486.79,487.58,493.14,496.98,
+501.18,506.54,509.70,514.94,520.53,515.51,520.03,527.00,530.68,533.02,
+536.08,545.32,548.57,554.16,558.97,561.65,571.48,567.99,576.07,582.63,
+582.68,588.94,595.57,594.42,603.14,605.52,609.84,613.38,612.17,620.32,
+628.46,628.71,630.56,634.51,642.90,646.45,650.21,650.89,656.79,657.28,
+666.89,672.57,672.34,679.79,681.83,681.38,688.91,698.28,697.58,702.81,
+709.28,709.26,714.46,719.39,724.35,730.28,731.31,731.56,739.64,743.55,
+752.04,751.56,758.84,757.63,766.82,769.07,776.76,781.80,783.30,789.12,
+791.41,796.41,798.99,803.09,803.15,813.67,822.24,819.83,820.06,827.06,
+831.78,841.63,839.85,841.78,845.70,854.06,854.26,860.80,863.26,870.94,
+874.20,881.35,884.50,890.30,887.93,893.74,899.42,902.81,908.33,912.12,
+918.36,919.76,926.34,930.63,934.51,934.18,944.31,941.38,945.74,949.66,
+963.96,961.66,967.09,974.02,968.68,980.72,981.57,978.52,989.71,993.85,
+994.26,1001.43,1006.55,1008.46,1008.84,1015.12,1025.53,1023.98,1030.84,1037.78,
+1039.31,1045.11,1049.81,1053.84,1053.70,1059.46,1056.62,1064.98,1075.88,1072.45,
+1080.99,1079.66,1083.86,1094.90,1095.41,1105.29,1107.68,1111.38,1115.93,1119.98,
+1125.97,1128.08,1129.61,1139.77,1140.55,1137.26,1154.34,1151.63,1155.99,1160.83,
+1164.39,1170.54,1166.45,1173.71,1180.16,1181.80,1185.56,1193.26,1192.77,1206.37,
+1208.72,1210.35,1218.06,1218.78,1220.87,1231.40,1224.72,1232.42,1237.87,1238.28,
+41.35,45.29,48.26,53.02,55.19,60.47,64.99,69.31,70.09,75.29,
+78.77,83.56,86.38,91.54,94.45,99.77,104.02,108.93,109.45,115.48,
+118.73,119.19,124.31,130.61,133.58,136.70,141.14,145.59,148.30,151.59,
+156.24,162.99,160.17,169.22,169.76,176.91,180.03,181.88,185.06,192.42,
+195.34,199.72,203.73,204.84,209.64,217.71,217.90,221.63,224.06,231.02,
+233.55,237.26,242.10,245.36,247.29,252.19,255.53,258.49,267.29,269.13,
+273.53,277.31,282.06,282.93,287.76,290.05,295.79,298.28,305.69,305.23,
+309.20,319.30,317.44,319.12,327.02,330.55,336.19,336.94,336.58,347.78,
+349.16,354.40,354.20,359.60,362.38,372.46,369.07,379.27,379.54,384.21,
+384.57,392.33,398.05,394.98,402.66,403.92,410.33,418.53,415.08,420.65,
+427.21,432.07,433.18,433.91,442.35,439.69,446.07,450.33,454.86,463.37,
+464.84,470.23,467.04,476.09,481.02,484.53,489.71,488.83,494.40,495.03,
+505.37,505.86,508.95,510.74,521.01,519.37,528.20,528.55,532.66,537.61,
+539.59,540.38,547.09,555.45,556.85,560.79,562.39,563.62,564.04,577.78,
+581.37,578.80,587.55,592.55,595.67,594.20,598.96,609.41,609.74,609.29,
+617.02,620.18,619.10,625.62,629.32,633.56,636.96,639.39,647.10,651.36,
+655.14,662.56,659.59,665.48,670.38,674.60,681.07,679.36,683.23,689.57,
+691.73,698.75,698.62,706.95,705.76,705.73,713.50,721.25,732.76,724.52,
+731.06,741.77,739.61,738.68,744.20,753.05,755.92,761.11,759.62,763.59,
+778.89,770.58,782.78,783.64,785.98,792.10,797.33,795.06,801.89,806.38,
+812.98,811.22,813.93,821.24,819.39,827.77,833.49,836.10,837.47,834.70,
+849.48,850.05,858.27,855.00,857.91,860.68,871.04,878.51,874.57,883.17,
+885.27,895.60,889.53,897.68,902.93,901.30,908.06,908.19,914.07,919.70,
+924.10,928.31,934.37,929.41,935.38,946.27,946.74,952.05,959.75,960.06,
+959.65,962.55,967.01,971.87,978.24,978.60,982.26,994.12,996.36,993.60,
+994.65,998.76,1007.68,1016.92,1013.21,1021.25,1026.75,1031.02,1034.59,1042.85,
+1039.54,1037.19,1048.16,1044.62,1058.07,1063.11,1063.19,1064.48,1057.85,1078.77,
+1079.93,1082.79,1083.13,1087.51,1091.33,1096.27,1095.66,1101.84,1107.10,1110.44,
+1110.68,1122.08,1123.07,1131.03,1128.15,1131.42,1134.53,1139.00,1139.94,1148.13,
+37.87,41.54,44.68,48.93,53.44,54.86,60.28,59.84,67.82,71.61,
+75.80,77.93,80.92,85.54,88.47,90.62,94.32,96.48,102.98,106.94,
+109.38,113.08,118.04,119.67,124.30,126.30,131.99,133.02,138.39,142.31,
+144.35,149.13,152.82,155.58,158.20,164.99,168.57,171.45,172.55,174.50,
+178.36,185.36,189.10,192.88,194.89,194.92,200.35,207.03,212.94,210.99,
+211.15,220.82,220.11,227.23,231.99,231.90,235.89,237.10,244.67,249.79,
+251.06,254.80,258.28,266.23,263.86,266.68,273.08,272.40,277.36,280.45,
+287.86,292.46,292.81,296.20,300.14,302.96,304.78,311.12,314.00,318.85,
+320.29,324.28,329.80,334.72,337.71,341.67,343.32,348.64,348.23,352.26,
+356.41,359.56,361.25,364.37,371.31,372.54,383.17,380.91,388.48,390.72,
+387.60,394.17,398.70,408.46,406.66,408.92,411.70,419.79,420.79,426.89,
+434.31,433.44,435.23,437.16,440.85,444.25,450.71,452.25,454.18,459.05,
+465.38,466.01,470.08,474.04,473.21,483.68,489.27,487.52,489.07,496.80,
+499.73,501.46,508.51,510.87,511.14,514.88,523.22,523.38,524.41,536.66,
+536.91,536.78,541.09,544.56,544.39,556.50,559.99,561.10,560.62,563.45,
+568.88,570.97,579.71,577.97,585.80,586.86,591.55,595.18,597.92,601.05,
+605.04,610.66,609.57,611.94,626.46,620.13,623.64,627.99,637.21,641.83,
+637.14,639.82,644.16,653.97,651.15,650.64,664.61,664.16,669.76,669.61,
+674.51,682.26,684.55,686.99,691.47,694.40,697.58,698.76,702.96,714.10,
+709.00,711.36,713.49,721.48,727.78,736.22,736.80,741.24,738.25,739.58,
+749.92,746.76,750.79,756.80,762.36,760.34,764.34,774.89,779.38,775.35,
+781.32,783.71,792.09,798.26,792.66,808.21,804.04,803.38,808.94,816.60,
+819.99,821.73,828.90,826.50,836.13,836.95,838.54,845.24,845.92,848.66,
+854.74,854.80,857.16,858.20,863.76,870.17,871.29,874.92,875.40,885.51,
+885.82,891.48,897.72,898.03,898.46,902.50,910.00,916.63,918.52,923.51,
+921.64,935.01,931.04,936.71,934.01,939.08,939.87,951.52,958.50,951.93,
+960.07,961.50,968.35,971.12,974.39,981.58,981.68,979.27,988.22,988.29,
+992.93,993.43,998.37,1003.54,1002.76,1017.13,1015.55,1012.57,1021.30,1019.68,
+1028.55,1031.11,1033.31,1044.51,1039.83,1048.01,1046.71,1051.94,1063.80,1063.37,
+34.59,40.47,41.43,44.12,50.04,50.85,55.08,58.29,61.91,63.80,
+67.68,70.96,74.69,77.24,81.04,84.09,87.46,89.59,95.12,98.00,
+100.42,106.24,108.14,108.20,111.31,118.02,116.67,123.25,126.69,129.83,
+131.02,136.74,141.15,141.26,146.75,150.19,150.51,154.52,162.04,159.74,
+166.57,168.80,172.33,174.15,179.40,185.61,183.25,189.35,194.81,195.48,
+197.48,202.48,203.42,207.04,214.28,213.69,215.21,221.43,225.10,223.03,
+231.20,237.41,234.78,240.48,242.39,251.09,253.58,257.95,255.68,258.65,
+263.91,266.14,271.55,273.55,281.51,281.73,284.03,288.92,289.78,293.48,
+292.59,299.37,303.24,306.81,314.45,310.43,315.32,320.95,324.69,328.82,
+330.46,335.70,331.28,340.52,340.45,349.17,346.60,354.12,355.20,359.51,
+360.90,369.70,371.68,371.44,378.40,379.27,388.61,383.83,387.13,393.20,
+392.87,397.24,404.08,404.72,407.30,412.73,416.70,419.67,424.35,424.04,
+429.34,430.92,437.34,438.19,443.41,444.54,450.71,450.04,455.97,456.99,
+456.35,465.14,469.50,468.67,474.04,474.43,479.75,482.85,489.32,491.83,
+493.06,492.02,496.82,502.65,502.12,507.76,513.02,521.98,517.41,520.41,
+524.62,531.38,531.64,536.92,537.83,540.24,545.10,547.94,550.49,555.63,
+555.76,559.06,564.89,569.53,573.06,578.37,578.88,586.65,588.55,590.25,
+590.15,590.57,591.91,600.39,604.88,604.97,612.69,607.56,617.66,621.48,
+625.42,621.08,632.52,632.46,635.05,636.30,641.38,645.38,649.38,655.29,
+655.78,660.91,663.05,672.45,674.27,674.43,672.16,680.08,683.23,680.78,
+687.48,696.98,700.03,702.58,700.17,705.55,709.08,709.04,706.49,723.04,
+722.16,725.17,723.98,736.61,733.25,739.80,752.26,747.38,747.40,752.49,
+756.87,758.86,754.64,762.83,774.47,772.64,774.28,774.26,781.18,781.39,
+788.07,786.25,793.83,799.86,805.61,798.26,806.03,803.91,812.59,824.49,
+827.39,825.70,823.37,831.52,826.85,834.79,844.19,842.03,847.88,844.88,
+851.55,857.25,858.03,861.10,867.71,869.24,877.00,873.83,879.05,880.29,
+887.96,888.81,889.86,893.72,895.40,904.29,907.01,908.73,901.11,921.24,
+919.11,921.53,925.01,931.62,932.61,933.29,941.38,938.20,939.17,952.17,
+952.35,957.38,968.68,960.34,962.39,963.91,970.83,966.86,975.48,980.12,
+33.26,35.76,40.46,40.10,45.84,46.58,51.67,53.23,55.61,59.08,
+62.62,66.62,68.04,72.50,73.52,77.55,78.16,85.58,89.09,88.77,
+91.84,95.44,98.70,101.68,105.52,104.46,112.49,114.47,116.25,120.14,
+119.86,126.03,128.72,131.59,131.52,140.13,142.03,145.11,143.67,150.61,
+153.31,155.72,159.99,162.04,165.61,166.40,173.44,174.64,179.30,177.38,
+181.94,185.87,188.35,189.53,193.14,198.24,202.19,203.46,210.34,209.56,
+211.49,218.61,218.70,222.46,229.77,229.10,229.24,236.09,236.24,239.94,
+243.24,248.14,248.49,252.78,254.77,259.14,261.40,264.58,272.68,270.37,
+272.95,275.92,279.55,283.23,289.26,283.88,289.01,291.03,300.37,295.56,
+308.54,309.35,304.92,315.11,317.90,319.02,319.28,322.41,323.19,331.71,
+332.96,336.57,340.84,340.26,347.41,350.45,351.72,355.47,355.44,360.42,
+363.13,367.26,366.14,373.45,375.94,375.33,381.12,387.42,385.24,397.67,
+394.75,398.71,399.13,399.94,405.09,413.30,412.92,418.67,419.29,419.13,
+430.72,428.79,431.56,432.79,432.62,438.17,445.97,445.88,448.81,451.53,
+451.81,456.14,463.12,465.63,466.78,467.37,475.24,472.34,476.14,487.25,
+479.33,486.24,488.91,491.32,498.58,498.01,504.30,506.89,507.24,516.62,
+520.08,520.08,522.53,521.78,522.21,534.11,532.90,541.10,543.05,542.80,
+547.86,542.99,551.66,556.57,558.64,557.00,562.66,567.90,566.65,576.95,
+574.04,578.24,585.65,580.33,584.72,592.51,593.90,600.97,600.10,599.97,
+602.66,614.30,611.23,612.59,619.27,621.27,622.02,620.63,631.98,636.29,
+633.98,644.79,645.13,649.45,649.74,656.98,660.12,659.27,650.10,667.60,
+662.59,667.76,672.35,675.39,678.23,675.98,687.48,686.06,684.95,690.12,
+695.35,699.51,702.11,702.46,702.10,711.65,712.38,715.09,724.30,720.77,
+722.50,729.45,729.17,729.94,738.73,734.72,748.49,750.47,747.61,756.00,
+755.03,757.74,767.19,765.11,766.65,772.71,773.64,779.25,780.28,785.46,
+789.60,785.56,794.97,794.53,797.02,798.23,811.38,807.05,810.72,810.65,
+813.66,820.36,823.79,827.23,824.66,831.73,836.17,834.62,839.50,843.94,
+848.98,845.91,854.65,859.40,858.26,864.11,856.41,864.60,872.83,876.45,
+876.11,875.23,885.65,880.13,891.38,893.22,890.19,896.09,908.24,902.36,
+30.59,32.38,35.44,37.35,42.23,42.95,44.87,49.62,50.10,55.16,
+60.52,59.06,62.68,64.29,67.55,69.12,75.36,76.87,79.64,81.23,
+85.82,89.59,89.28,93.68,93.08,97.59,101.96,107.02,107.55,111.27,
+112.91,118.71,117.83,119.33,124.00,129.08,133.84,135.52,133.74,137.14,
+140.95,145.47,145.84,151.57,154.09,155.43,159.50,160.52,164.51,165.35,
+168.90,172.94,176.24,176.12,180.63,184.31,188.88,187.75,188.37,193.34,
+194.87,197.37,200.89,204.07,206.22,209.85,212.05,214.63,220.71,220.42,
+223.55,227.55,231.21,232.54,233.27,240.32,240.60,244.61,247.12,244.71,
+252.76,255.31,258.44,262.93,262.54,262.67,268.33,274.54,275.19,272.45,
+277.27,281.08,283.12,288.35,288.22,294.85,298.17,295.76,303.29,305.38,
+306.95,312.43,310.55,311.27,315.51,323.94,324.60,324.24,331.67,333.87,
+332.38,337.01,342.28,344.60,340.55,351.50,350.03,355.06,362.94,360.32,
+364.28,364.10,369.32,367.42,373.80,374.98,378.30,384.71,384.76,382.76,
+389.70,394.03,397.07,393.21,405.42,408.39,411.48,407.11,409.15,414.22,
+421.13,423.32,423.74,420.60,424.65,432.47,435.44,435.69,441.35,446.91,
+445.49,442.40,454.23,457.93,460.87,455.96,462.63,458.66,470.85,473.22,
+473.28,477.10,481.27,480.77,486.01,486.05,495.44,495.73,497.41,493.41,
+508.48,502.64,509.83,507.21,508.33,518.82,516.99,520.18,524.35,527.73,
+527.88,536.64,525.37,540.76,539.12,539.81,541.78,548.98,553.72,556.92,
+559.57,563.04,562.17,568.47,567.94,566.63,576.99,578.63,583.69,584.33,
+584.56,585.97,591.99,595.82,599.27,595.69,600.09,602.97,610.97,608.64,
+613.99,615.68,619.38,617.98,624.32,624.44,628.27,634.64,639.60,637.44,
+638.97,641.23,647.65,651.84,645.79,660.01,656.09,658.61,657.72,662.57,
+670.38,664.64,673.13,678.36,683.07,682.31,684.89,687.16,689.61,695.35,
+696.33,700.26,695.56,701.37,703.48,710.77,713.03,718.33,715.34,726.19,
+722.20,720.15,732.59,736.11,734.20,739.54,734.06,742.02,742.33,747.47,
+756.51,751.85,755.69,767.05,763.77,765.18,769.38,768.06,770.03,771.75,
+777.43,777.52,788.04,784.31,786.67,789.97,802.69,795.01,803.59,807.51,
+804.66,809.59,812.27,813.56,814.04,826.67,826.44,824.33,828.87,828.70,
+27.85,30.29,32.72,35.26,36.95,40.91,43.29,45.73,48.55,51.66,
+53.73,56.30,58.78,62.15,62.32,65.25,69.81,71.29,71.43,76.88,
+78.31,80.95,84.08,84.68,89.41,93.81,97.73,95.68,99.19,102.39,
+102.75,105.35,107.39,113.88,115.43,116.91,118.65,121.18,126.42,129.10,
+130.47,134.38,134.96,139.06,137.78,140.47,146.52,144.49,152.13,153.60,
+155.17,155.49,161.93,160.97,165.53,166.70,169.93,175.13,175.08,174.53,
+182.94,181.02,183.34,185.35,194.91,194.98,198.52,199.13,200.57,204.25,
+208.11,211.31,215.91,213.42,215.77,218.02,220.38,226.00,225.10,228.60,
+236.31,234.58,231.68,236.11,238.84,242.51,250.36,247.07,253.31,256.62,
+257.62,259.01,264.39,264.56,272.31,272.25,272.67,274.38,279.01,280.10,
+280.05,282.28,290.53,285.05,290.89,294.81,298.06,300.50,306.78,301.96,
+311.96,305.53,313.64,314.56,320.83,322.69,324.75,330.31,330.67,334.65,
+333.51,338.66,338.98,340.64,343.05,349.33,349.99,353.03,355.30,359.01,
+355.12,362.06,365.07,368.07,372.04,367.16,374.23,377.16,387.02,385.14,
+380.05,387.01,389.78,398.45,395.21,393.68,400.84,400.09,403.58,404.76,
+409.67,408.93,412.72,415.58,422.88,418.58,424.31,425.63,437.34,429.14,
+440.18,438.15,445.63,445.03,445.36,444.06,451.22,450.96,453.01,459.48,
+467.26,465.55,465.13,464.75,473.77,478.14,476.54,485.61,476.00,482.30,
+479.81,489.09,488.86,486.62,493.85,497.75,499.82,507.90,503.37,510.87,
+512.73,519.81,515.26,515.33,520.57,524.06,527.26,537.79,541.62,537.23,
+539.59,540.84,540.08,543.75,547.28,549.31,553.93,558.60,556.36,563.75,
+560.70,564.99,572.26,576.74,575.67,571.57,584.31,579.66,579.48,580.64,
+585.13,593.25,592.42,593.58,603.79,603.52,601.28,608.85,608.59,605.68,
+612.91,616.43,619.25,621.59,630.83,630.37,628.26,632.96,641.25,635.56,
+645.67,638.43,644.92,648.73,653.08,653.89,656.57,664.85,657.72,666.22,
+663.81,670.99,667.12,673.71,677.38,680.95,678.14,682.03,696.14,690.78,
+686.47,691.62,693.44,696.48,705.80,706.85,709.16,704.93,709.79,705.55,
+719.56,716.52,726.00,720.94,734.51,734.70,731.74,727.89,738.88,737.49,
+743.51,745.69,744.54,753.93,750.39,752.50,748.50,757.33,759.48,770.15,
+26.51,26.78,30.07,32.57,36.19,36.53,38.82,39.98,45.60,46.89,
+48.03,51.89,54.43,56.46,59.51,59.47,63.88,63.04,66.94,68.97,
+71.31,72.58,78.59,81.10,84.34,84.81,87.51,86.31,90.91,93.17,
+95.94,98.35,101.92,101.79,104.24,106.70,107.83,114.26,112.59,118.29,
+118.74,119.77,125.45,127.33,128.25,130.16,133.47,136.04,137.17,140.52,
+143.48,145.50,145.57,148.85,150.16,151.20,154.46,159.95,160.81,162.26,
+167.78,169.68,169.81,176.75,177.42,177.14,183.23,184.60,183.11,185.93,
+187.75,188.97,191.88,196.12,198.87,200.55,204.34,208.24,211.78,215.13,
+211.65,212.37,220.66,219.72,221.76,220.68,227.41,227.89,229.94,233.87,
+237.03,239.07,237.02,246.44,245.80,242.57,250.41,253.92,256.56,256.08,
+257.40,260.16,269.20,267.81,269.17,270.37,274.06,274.43,278.08,286.28,
+285.06,285.24,288.83,290.44,293.72,292.08,298.59,297.58,300.52,306.37,
+303.84,308.12,316.29,317.36,317.98,319.01,314.05,324.20,319.20,329.27,
+332.38,331.49,333.44,335.34,342.74,339.96,339.27,350.93,347.03,347.81,
+350.61,356.41,358.46,364.19,359.51,363.70,364.31,371.10,374.95,377.70,
+371.47,372.25,382.34,387.72,386.52,388.10,387.63,390.97,395.73,396.16,
+399.74,402.59,403.93,402.29,404.08,413.59,412.09,415.18,416.08,424.64,
+420.38,428.91,428.33,430.81,433.03,438.44,437.52,440.36,444.62,440.25,
+448.21,450.49,448.37,454.02,459.53,459.02,462.69,462.04,465.76,466.56,
+467.27,472.78,478.06,476.28,481.12,487.94,480.56,478.50,490.42,491.90,
+493.13,497.40,501.96,498.33,501.20,501.85,505.44,517.90,512.73,517.84,
+521.99,521.99,520.52,517.71,526.59,529.74,530.58,538.22,533.06,539.33,
+544.48,542.72,537.99,540.45,557.93,550.45,558.14,553.08,558.22,557.19,
+564.40,563.16,564.77,571.92,574.42,577.56,579.86,580.10,583.82,582.44,
+590.63,590.95,587.66,600.41,602.14,599.51,607.46,609.68,604.22,612.15,
+613.23,614.12,613.51,610.51,617.94,620.82,622.52,627.65,638.43,644.83,
+638.51,635.67,644.74,644.05,646.78,649.15,653.13,652.66,656.84,665.56,
+656.82,659.68,660.26,667.36,671.85,668.33,674.91,674.20,680.41,673.96,
+682.53,694.45,685.68,689.57,687.98,695.58,698.43,695.13,700.78,701.43,
+78.42,85.14,93.60,99.61,106.02,114.24,121.08,129.62,135.60,142.55,
+150.28,157.06,164.62,171.38,177.94,185.46,192.92,199.47,208.89,215.28,
+222.14,228.35,236.63,242.42,249.47,258.91,265.31,273.55,278.98,285.98,
+294.63,299.57,306.96,317.70,322.33,329.19,337.18,343.23,349.21,358.50,
+363.37,372.41,378.73,388.16,395.04,401.44,408.79,418.52,419.56,430.19,
+436.70,444.65,453.01,456.44,464.53,473.24,478.45,485.20,496.76,502.25,
+509.15,515.57,522.49,531.80,537.38,545.83,551.37,559.38,567.23,570.24,
+579.55,588.34,597.09,602.07,611.12,616.59,624.95,629.88,637.88,644.12,
+650.68,657.76,665.63,672.73,681.20,693.46,694.45,704.36,708.84,715.80,
+725.84,733.31,739.70,745.84,751.66,760.00,767.85,773.51,781.01,789.48,
+797.21,799.40,809.83,814.87,824.38,831.61,838.28,845.02,856.37,861.61,
+868.94,875.00,883.78,889.60,899.38,902.88,909.02,915.32,926.63,930.65,
+939.48,944.26,955.79,960.07,967.03,973.21,982.77,992.04,996.91,1001.62,
+1013.31,1018.00,1028.85,1031.34,1038.44,1046.03,1052.56,1062.56,1067.55,1075.44,
+1078.59,1087.54,1096.68,1103.90,1111.82,1115.21,1125.07,1134.20,1138.46,1145.18,
+1150.11,1158.92,1166.98,1172.60,1182.50,1191.67,1198.42,1205.77,1212.86,1217.87,
+1226.01,1235.61,1239.12,1247.48,1253.17,1263.58,1266.07,1276.51,1283.11,1294.05,
+1295.64,1307.33,1314.35,1315.38,1328.41,1329.45,1347.15,1346.84,1353.43,1360.69,
+1373.26,1377.80,1385.10,1392.98,1396.53,1403.74,1411.81,1420.42,1423.68,1433.82,
+1443.61,1452.23,1459.14,1465.15,1469.58,1477.29,1481.66,1494.35,1502.62,1507.63,
+1516.27,1515.17,1531.57,1533.70,1536.92,1546.88,1556.97,1564.63,1567.12,1576.30,
+1582.71,1589.42,1597.92,1604.59,1611.86,1619.77,1626.62,1638.57,1644.33,1650.65,
+1658.31,1666.26,1671.66,1676.25,1681.10,1691.33,1695.42,1706.74,1714.78,1725.73,
+1729.46,1734.14,1744.22,1751.46,1758.95,1765.53,1769.70,1781.08,1785.88,1795.12,
+1801.21,1807.18,1812.02,1826.21,1830.58,1832.17,1841.97,1847.90,1862.65,1866.21,
+1874.56,1879.06,1884.74,1891.24,1898.40,1906.97,1915.71,1921.24,1928.54,1933.92,
+1941.88,1952.54,1956.67,1966.48,1970.45,1977.05,1990.32,1996.06,2000.16,2013.47,
+2019.39,2026.98,2027.29,2037.80,2039.69,2051.92,2060.34,2064.76,2069.60,2080.53,
+2089.77,2091.76,2096.34,2107.63,2116.99,2124.19,2126.99,2135.43,2145.76,2152.63,
+74.62,81.95,87.39,94.44,100.64,109.02,115.24,122.90,128.07,134.29,
+142.76,148.55,155.41,162.54,169.55,176.53,181.49,190.30,196.03,203.61,
+209.90,214.81,221.54,231.11,238.24,243.29,249.42,257.87,264.24,269.63,
+277.94,285.67,290.49,297.43,305.69,314.16,319.14,324.67,330.54,337.99,
+345.16,353.02,359.78,369.12,372.16,380.12,389.12,392.57,400.65,406.14,
+415.90,420.72,429.46,435.73,441.87,447.09,455.14,461.23,466.35,475.14,
+482.48,487.51,494.23,502.23,509.93,517.78,522.63,530.56,534.92,544.17,
+548.30,558.24,564.57,570.22,577.52,582.84,591.63,598.43,603.70,610.00,
+621.16,623.70,632.15,638.02,646.76,651.51,658.36,664.46,672.48,678.80,
+689.16,692.82,700.71,702.67,711.93,719.49,727.28,733.62,741.07,747.82,
+756.16,761.24,771.58,774.31,779.50,790.58,793.70,801.36,807.84,809.35,
+820.22,826.38,836.08,847.78,853.01,854.82,863.24,868.69,878.47,879.18,
+887.73,894.11,903.11,909.36,916.60,926.21,929.07,939.54,945.06,953.42,
+959.65,965.87,968.05,976.88,985.68,993.80,1000.83,1005.72,1011.44,1024.01,
+1027.25,1033.09,1036.67,1041.25,1049.93,1057.31,1066.70,1073.85,1080.32,1091.03,
+1095.08,1099.02,1104.83,1118.55,1121.52,1128.32,1134.38,1138.09,1151.13,1154.80,
+1164.46,1170.08,1176.58,1181.27,1184.10,1193.19,1204.65,1206.80,1216.53,1221.03,
+1229.97,1236.91,1238.79,1249.68,1258.51,1262.93,1270.98,1275.97,1284.60,1289.56,
+1295.35,1306.64,1315.11,1321.68,1322.63,1331.05,1338.13,1345.35,1351.96,1356.42,
+1364.65,1371.61,1378.55,1385.36,1392.81,1399.06,1403.77,1413.14,1415.56,1425.76,
+1430.34,1441.24,1454.53,1452.26,1457.86,1466.19,1475.69,1486.52,1490.89,1496.25,
+1501.05,1507.44,1513.37,1521.86,1529.25,1537.47,1541.85,1548.27,1557.43,1566.97,
+1571.21,1577.57,1579.50,1586.91,1597.34,1598.78,1611.10,1619.41,1625.63,1626.26,
+1639.38,1647.08,1647.14,1655.22,1664.99,1673.80,1680.46,1681.52,1690.53,1691.67,
+1706.23,1708.39,1723.34,1724.72,1730.66,1740.01,1746.44,1754.39,1762.34,1769.62,
+1774.85,1780.01,1783.61,1788.15,1795.68,1810.32,1815.80,1824.27,1828.20,1837.10,
+1840.62,1848.68,1852.25,1861.14,1868.62,1874.87,1881.41,1888.09,1897.43,1904.81,
+1910.42,1920.36,1921.67,1936.83,1937.89,1947.99,1947.44,1961.24,1960.41,1969.45,
+1980.22,1986.54,1990.98,2002.20,2002.37,2012.74,2019.20,2024.10,2033.41,2036.57,
+70.57,77.52,83.76,89.57,95.55,101.89,108.87,115.30,121.70,128.11,
+133.48,140.58,146.34,153.27,158.98,166.39,172.11,176.32,186.02,190.09,
+198.21,205.28,212.17,217.97,222.96,230.19,238.09,241.58,249.61,256.78,
+262.25,268.71,274.87,281.60,286.19,296.14,300.92,306.52,311.51,319.72,
+326.79,335.28,338.48,345.95,350.96,361.20,367.70,370.48,379.67,384.39,
+389.86,396.42,402.91,411.40,418.74,422.55,429.89,438.31,443.24,448.91,
+454.00,462.69,468.77,473.80,481.76,490.15,494.98,502.16,507.01,512.79,
+522.50,525.91,532.82,540.48,545.21,551.53,557.28,562.60,571.64,577.08,
+583.98,589.74,598.92,603.86,610.84,613.07,621.31,629.91,635.53,642.60,
+648.74,655.42,659.32,669.88,675.72,682.25,683.95,690.54,701.41,706.72,
+709.45,720.41,725.09,733.53,737.71,741.34,751.02,757.29,763.50,769.57,
+777.22,784.24,786.66,796.19,805.18,806.17,812.42,821.24,828.84,837.06,
+840.68,846.84,853.65,862.65,867.44,870.66,876.73,887.13,896.52,896.02,
+906.34,911.66,917.43,924.13,931.31,933.32,944.26,949.20,956.32,963.63,
+965.01,973.80,982.08,990.91,996.92,999.23,1007.17,1016.68,1016.44,1030.52,
+1031.80,1038.23,1045.41,1051.10,1059.77,1067.09,1074.73,1078.58,1083.50,1093.84,
+1097.51,1102.06,1113.01,1119.36,1120.67,1132.86,1134.48,1142.16,1144.76,1157.85,
+1160.61,1167.54,1172.64,1183.19,1187.48,1194.16,1203.59,1206.90,1214.66,1222.68,
+1227.43,1229.48,1242.60,1243.79,1253.26,1255.93,1265.27,1271.69,1281.22,1282.63,
+1295.79,1294.22,1303.94,1312.96,1312.22,1325.83,1326.20,1335.95,1344.75,1346.72,
+1352.21,1362.45,1363.48,1373.09,1385.71,1387.52,1392.30,1399.42,1408.44,1411.05,
+1418.33,1424.59,1432.64,1438.32,1443.57,1456.10,1453.57,1466.13,1473.10,1478.40,
+1487.63,1485.54,1494.97,1504.88,1507.38,1516.28,1519.74,1528.86,1533.38,1539.94,
+1549.64,1555.67,1554.32,1566.01,1570.40,1577.63,1590.18,1592.47,1596.20,1609.78,
+1612.39,1613.14,1620.27,1634.71,1637.76,1644.36,1648.93,1658.99,1664.59,1671.90,
+1675.59,1678.91,1688.87,1692.92,1699.60,1707.86,1713.89,1720.38,1725.77,1730.45,
+1738.95,1742.91,1747.13,1760.15,1761.51,1769.05,1779.92,1779.27,1791.03,1793.11,
+1803.73,1808.00,1814.99,1820.61,1831.65,1832.48,1846.12,1843.92,1858.55,1861.96,
+1869.25,1877.09,1884.64,1887.65,1895.49,1902.80,1901.84,1913.23,1920.35,1926.03,
+66.25,72.61,78.16,85.35,88.85,96.83,102.83,108.56,114.25,120.35,
+126.49,133.45,139.53,144.91,151.67,157.17,162.84,168.76,175.32,180.97,
+186.90,191.44,197.43,203.29,210.30,217.73,222.37,228.02,235.90,240.82,
+246.99,255.66,260.25,266.27,271.99,280.70,283.25,288.70,296.23,303.39,
+307.55,314.16,320.12,327.34,332.30,336.93,345.93,351.16,357.60,359.70,
+367.63,374.99,381.37,386.40,392.20,400.75,403.79,413.39,416.06,423.08,
+430.76,434.88,440.89,449.17,454.66,459.06,463.67,469.34,475.87,478.34,
+488.41,493.43,502.66,508.79,516.01,521.57,528.24,532.12,540.51,543.64,
+548.90,559.57,563.74,570.15,576.14,577.93,584.18,594.94,599.53,606.67,
+610.16,620.25,620.76,625.65,630.44,642.36,646.27,652.92,661.77,665.62,
+673.59,677.97,685.01,692.99,692.45,702.57,709.16,711.55,720.26,722.51,
+731.38,737.96,746.42,749.54,758.71,759.85,767.58,775.02,780.72,785.97,
+792.68,800.06,804.34,809.96,815.80,824.06,828.09,834.93,841.12,844.89,
+854.98,861.21,864.63,871.84,873.92,882.50,890.69,895.48,900.50,906.27,
+916.15,918.33,925.26,929.09,941.86,947.00,953.63,957.93,965.82,968.47,
+970.32,981.36,986.46,996.19,1000.14,1007.84,1014.42,1016.11,1021.86,1033.66,
+1036.45,1041.51,1048.07,1053.43,1056.32,1059.37,1068.59,1079.50,1083.95,1087.74,
+1094.72,1099.48,1105.36,1113.96,1119.66,1126.41,1130.93,1138.54,1142.81,1153.47,
+1158.76,1165.06,1169.19,1168.97,1180.49,1190.87,1195.31,1201.89,1205.34,1212.76,
+1214.90,1222.78,1230.39,1231.98,1239.22,1247.20,1250.95,1260.04,1263.58,1270.31,
+1274.92,1283.42,1288.05,1290.73,1300.71,1307.66,1310.11,1319.64,1325.01,1327.41,
+1335.10,1347.01,1351.41,1357.68,1367.48,1367.91,1378.91,1380.52,1385.06,1394.43,
+1396.80,1404.13,1416.24,1417.92,1418.45,1431.54,1435.00,1441.31,1444.91,1453.00,
+1462.25,1465.68,1465.59,1478.40,1485.86,1484.89,1495.22,1496.51,1504.11,1518.06,
+1519.52,1529.75,1535.72,1535.00,1542.20,1548.98,1556.22,1565.48,1568.97,1570.80,
+1583.49,1586.11,1591.12,1600.03,1603.38,1610.30,1619.85,1622.30,1625.63,1641.76,
+1641.60,1645.05,1652.24,1657.89,1664.87,1669.08,1675.95,1683.53,1685.70,1693.19,
+1701.00,1708.85,1713.88,1717.39,1729.29,1735.21,1737.61,1745.40,1748.87,1752.62,
+1760.76,1766.76,1773.33,1779.62,1789.19,1795.07,1796.87,1810.64,1808.12,1817.59,
+63.42,68.49,72.82,78.83,85.38,90.65,97.27,99.55,108.00,114.09,
+119.78,124.92,129.50,135.92,142.22,144.40,152.77,161.75,164.54,170.59,
+175.68,181.12,186.85,194.54,198.44,203.82,210.02,214.59,219.84,225.43,
+233.02,237.06,242.16,250.59,257.28,263.91,268.74,274.02,276.97,284.66,
+291.90,297.08,300.91,305.07,311.16,319.81,323.50,327.73,334.59,337.57,
+347.04,354.95,357.49,363.30,368.07,378.69,385.34,384.38,394.33,394.09,
+403.90,411.12,412.81,420.19,424.10,433.41,434.99,446.69,449.57,459.36,
+459.37,462.02,469.28,475.98,483.76,490.89,496.65,496.79,506.75,513.60,
+519.56,523.80,531.92,533.56,537.90,545.01,550.57,557.17,564.61,569.45,
+572.75,579.28,584.80,594.28,596.19,605.81,609.38,617.09,619.72,623.17,
+628.42,635.55,643.50,649.62,653.55,659.28,668.30,672.41,675.92,682.69,
+685.16,688.40,697.06,705.73,712.62,716.96,725.67,728.67,734.97,738.23,
+746.60,755.19,757.10,764.81,769.20,772.10,779.36,785.02,795.77,803.54,
+805.16,808.50,812.58,819.20,826.30,830.66,834.43,843.29,848.65,854.64,
+859.90,859.68,869.98,878.80,882.33,885.87,891.31,893.86,907.12,913.48,
+915.51,925.41,929.09,933.06,937.28,947.74,949.44,949.22,965.11,969.25,
+973.86,977.95,987.65,990.34,998.34,1001.75,1010.01,1011.75,1018.32,1023.26,
+1026.08,1040.17,1045.14,1044.93,1052.63,1058.18,1065.62,1071.71,1077.39,1086.43,
+1087.14,1094.34,1098.28,1103.57,1111.25,1116.58,1124.94,1129.01,1132.01,1138.88,
+1143.88,1150.31,1156.17,1161.93,1165.24,1176.36,1183.10,1180.79,1192.32,1196.67,
+1202.48,1203.52,1216.12,1217.03,1227.72,1231.22,1233.36,1241.51,1247.25,1255.34,
+1258.64,1271.05,1268.09,1279.02,1284.64,1286.56,1295.68,1300.73,1306.07,1315.73,
+1313.31,1321.22,1327.58,1336.55,1337.27,1340.04,1351.89,1349.06,1354.18,1367.19,
+1373.96,1382.36,1384.24,1386.01,1393.35,1401.54,1408.91,1411.62,1417.88,1421.41,
+1430.03,1438.05,1438.05,1448.61,1450.09,1454.91,1466.85,1463.60,1472.70,1477.43,
+1490.46,1494.64,1499.59,1503.78,1507.29,1518.49,1519.79,1527.22,1532.61,1536.92,
+1541.74,1550.12,1558.13,1559.49,1569.43,1574.01,1578.44,1588.32,1595.78,1592.07,
+1596.90,1603.66,1613.62,1617.56,1620.01,1630.07,1625.95,1644.21,1645.68,1648.38,
+1661.42,1663.54,1664.45,1670.05,1678.96,1682.63,1694.81,1691.84,1703.69,1708.21,
+59.24,63.67,68.33,74.11,80.50,84.29,89.34,96.37,102.55,106.40,
+112.38,116.88,122.63,126.55,134.01,138.43,143.25,150.96,154.53,160.57,
+166.55,170.53,174.29,180.97,185.67,190.97,199.13,204.13,209.87,212.48,
+217.50,224.60,228.99,234.84,239.68,244.86,248.39,256.36,260.60,268.10,
+273.51,277.71,282.93,287.23,293.36,300.59,304.59,308.61,316.92,321.58,
+328.93,332.82,335.19,341.33,346.07,355.12,360.33,361.97,369.77,374.98,
+377.78,385.44,389.73,392.83,405.60,407.66,409.92,413.01,420.12,427.23,
+434.35,437.45,443.49,447.24,452.23,457.29,465.06,469.77,476.19,481.27,
+487.12,491.05,494.34,508.40,507.25,512.74,520.87,524.10,529.88,538.40,
+545.11,542.26,551.07,555.86,559.33,565.22,572.81,577.65,586.08,588.43,
+591.80,598.24,605.10,610.53,616.92,620.91,627.21,633.44,638.85,643.10,
+645.35,652.73,655.76,659.23,671.15,677.84,682.02,684.19,690.00,692.03,
+700.62,707.25,710.47,719.59,724.08,723.92,735.83,734.95,742.60,746.81,
+753.05,751.48,767.92,769.53,771.80,782.50,786.08,793.06,799.31,801.49,
+804.89,815.01,816.97,823.04,824.78,835.99,841.16,842.21,850.30,856.40,
+860.15,864.50,874.75,877.69,881.99,888.23,894.28,899.38,903.83,908.96,
+914.83,916.77,926.23,930.40,938.21,938.43,948.93,951.83,955.02,969.09,
+970.62,972.06,977.25,984.71,989.01,991.73,1001.93,1006.54,1012.78,1019.67,
+1019.63,1030.66,1028.61,1038.83,1052.02,1050.22,1051.48,1059.82,1066.94,1065.72,
+1071.66,1080.06,1083.77,1085.75,1091.89,1103.04,1108.59,1114.36,1118.48,1122.95,
+1129.27,1134.09,1142.12,1140.87,1147.78,1151.57,1161.40,1167.77,1171.87,1176.97,
+1182.83,1181.31,1190.25,1203.80,1202.65,1204.92,1215.60,1223.59,1225.83,1230.77,
+1239.71,1238.22,1245.18,1253.29,1253.19,1260.54,1269.65,1279.07,1275.18,1280.66,
+1291.04,1295.38,1297.99,1303.96,1310.79,1316.29,1317.03,1328.47,1331.28,1344.04,
+1342.04,1342.96,1349.97,1362.55,1356.27,1365.84,1376.64,1378.07,1384.39,1394.23,
+1396.46,1407.44,1409.25,1410.26,1417.46,1415.71,1430.70,1438.41,1442.24,1447.25,
+1448.63,1452.83,1456.85,1467.28,1473.15,1476.21,1486.87,1486.87,1494.93,1497.40,
+1500.75,1508.54,1510.90,1518.34,1525.84,1531.93,1533.00,1535.65,1543.06,1545.31,
+1559.73,1561.91,1566.99,1566.57,1575.95,1581.91,1586.21,1592.86,1592.40,1599.78,
+53.82,59.06,65.90,68.94,75.61,79.22,85.22,88.85,95.42,99.75,
+103.37,108.02,115.68,120.14,124.32,130.78,134.19,140.14,144.56,152.20,
+154.18,162.21,167.04,171.84,175.31,180.70,186.01,190.19,196.02,200.70,
+204.83,208.89,215.09,220.72,226.16,233.56,234.90,239.00,245.19,248.65,
+256.67,263.74,267.31,270.89,274.47,280.88,284.07,293.97,294.62,298.32,
+307.43,309.15,316.08,318.79,325.87,330.72,336.15,340.41,343.51,353.64,
+355.39,362.19,366.35,370.36,376.49,381.75,387.54,391.48,397.50,401.00,
+406.25,409.59,414.46,418.52,423.36,432.97,436.39,440.99,442.63,450.89,
+455.49,460.98,464.59,471.31,473.25,483.31,490.35,491.89,494.83,502.18,
+502.96,512.95,514.43,521.13,527.56,528.53,536.45,541.78,547.81,549.34,
+554.29,562.15,567.84,573.38,576.57,581.38,588.49,590.47,599.79,600.33,
+600.25,610.78,619.81,622.93,629.08,630.80,638.17,640.55,645.72,654.48,
+658.63,658.55,665.47,671.43,674.26,681.50,685.95,691.73,696.80,700.53,
+704.15,714.36,717.60,723.36,726.90,729.74,741.34,744.38,743.55,756.20,
+757.62,763.14,766.38,773.60,781.71,779.84,786.00,792.25,797.62,805.78,
+809.18,815.26,816.78,823.70,824.42,831.95,840.09,845.53,848.14,851.27,
+856.93,866.07,869.38,876.57,877.36,880.72,887.14,891.75,896.61,902.17,
+910.72,915.38,911.55,922.05,933.44,931.72,934.76,942.11,949.85,952.80,
+960.33,961.31,969.70,978.19,977.57,984.85,988.62,990.26,1001.14,1003.54,
+1007.80,1010.26,1019.37,1032.90,1025.95,1037.70,1041.70,1047.69,1046.80,1052.79,
+1055.77,1062.75,1066.74,1073.66,1076.34,1082.92,1088.05,1094.86,1104.67,1098.41,
+1110.56,1111.10,1120.17,1123.11,1134.65,1132.39,1132.35,1139.62,1151.82,1149.45,
+1152.75,1165.18,1165.50,1174.47,1177.98,1180.86,1188.98,1192.72,1196.61,1201.31,
+1210.26,1213.53,1217.86,1227.20,1228.59,1229.27,1241.41,1249.55,1251.84,1259.30,
+1254.81,1263.91,1269.20,1272.84,1280.61,1276.39,1287.18,1294.78,1295.93,1309.64,
+1312.19,1313.05,1317.56,1325.86,1327.59,1336.43,1341.35,1337.19,1347.01,1351.32,
+1362.97,1366.21,1364.04,1377.16,1379.68,1385.54,1388.86,1391.86,1403.49,1404.28,
+1404.68,1419.40,1412.31,1418.00,1424.94,1427.43,1439.16,1445.17,1456.08,1451.54,
+1463.25,1457.62,1469.26,1477.56,1478.54,1487.84,1481.87,1491.97,1498.26,1495.32,
+52.94,56.44,60.28,64.05,70.24,75.98,79.63,83.77,87.43,94.73,
+98.87,101.08,108.93,111.79,119.28,122.57,126.53,130.81,138.17,139.82,
+145.85,149.05,154.10,159.35,163.72,166.87,171.64,177.57,181.36,189.86,
+190.29,197.18,200.82,202.80,209.56,216.39,218.41,225.16,231.26,233.65,
+237.63,246.01,250.52,254.81,261.15,263.40,266.23,273.15,277.69,282.42,
+284.42,289.38,294.88,302.39,304.23,309.02,313.43,319.04,327.34,331.74,
+334.44,340.81,341.66,343.21,355.10,356.31,360.06,370.09,373.64,374.30,
+379.07,384.61,387.98,388.63,399.51,402.78,407.10,414.08,421.47,424.17,
+425.78,432.81,435.93,441.13,444.33,451.91,455.02,460.06,464.83,466.96,
+473.18,476.41,485.48,488.86,488.96,499.57,499.90,503.53,514.35,515.94,
+520.54,525.98,528.87,534.78,539.29,545.66,549.24,554.67,555.29,563.26,
+568.72,574.63,577.77,582.35,584.62,590.94,598.54,605.32,604.43,613.86,
+611.31,615.36,624.17,628.74,633.74,645.04,645.14,653.59,649.76,656.82,
+660.17,668.87,669.91,678.57,685.59,692.10,690.17,694.60,692.42,699.92,
+705.65,719.25,722.51,726.79,726.62,730.33,735.18,741.10,745.29,751.60,
+759.14,762.87,765.61,767.95,774.49,781.82,782.82,786.32,792.33,796.92,
+801.87,804.04,811.35,813.13,821.76,828.15,825.76,833.54,838.29,844.11,
+848.96,859.94,867.66,859.81,871.89,870.97,877.57,887.23,886.09,889.48,
+902.32,903.39,910.69,917.44,912.72,921.82,918.47,925.89,939.28,934.16,
+947.36,945.90,951.49,958.48,961.52,967.78,972.61,974.74,977.62,982.63,
+981.11,988.41,1000.74,1004.74,1014.34,1016.48,1013.94,1026.75,1024.82,1034.14,
+1035.38,1040.49,1041.88,1050.44,1054.95,1062.82,1068.19,1070.06,1070.22,1082.94,
+1080.22,1090.66,1098.56,1097.56,1102.56,1108.68,1106.53,1115.65,1122.74,1126.67,
+1137.19,1137.43,1138.62,1147.85,1151.15,1159.63,1162.63,1169.84,1169.28,1183.35,
+1179.79,1189.95,1188.61,1187.42,1191.46,1200.11,1202.89,1204.15,1217.08,1219.50,
+1225.34,1227.78,1239.08,1245.33,1242.18,1250.62,1254.38,1258.96,1256.92,1265.62,
+1277.12,1278.13,1279.41,1284.75,1287.00,1293.07,1302.12,1304.80,1308.28,1317.65,
+1327.13,1325.41,1332.97,1334.11,1334.63,1340.93,1351.69,1351.59,1355.44,1359.00,
+1368.26,1368.03,1377.96,1380.63,1387.36,1393.50,1382.98,1395.36,1403.95,1402.44,
+48.56,51.11,54.57,60.44,65.36,69.72,74.87,77.90,82.74,87.75,
+90.96,96.73,97.46,106.68,109.21,112.35,122.08,122.00,128.66,130.71,
+132.32,138.88,145.63,150.66,151.39,158.22,159.53,166.22,170.68,175.14,
+179.34,181.33,188.99,189.87,198.70,200.13,208.20,212.72,214.52,217.04,
+226.34,228.29,232.77,233.35,239.19,247.73,249.60,252.79,258.07,265.50,
+273.63,271.01,274.23,281.44,284.35,288.65,296.86,297.55,303.17,301.12,
+310.16,316.73,321.33,324.25,329.06,329.94,339.72,343.28,343.45,351.85,
+353.29,361.18,361.82,368.91,371.98,377.53,381.01,386.21,387.98,394.14,
+402.69,403.49,405.01,410.29,416.04,420.19,424.91,427.72,436.75,440.82,
+439.93,451.45,449.50,453.12,456.91,469.16,471.39,470.08,475.98,480.46,
+483.48,494.03,496.45,500.50,507.12,508.64,511.07,511.46,526.25,527.21,
+526.69,536.13,537.93,544.32,545.81,552.00,554.49,559.89,569.10,571.77,
+571.47,578.94,586.15,587.83,590.34,595.92,601.95,601.98,613.53,611.78,
+616.80,624.04,626.76,630.98,637.16,640.71,643.63,643.79,650.01,656.98,
+661.78,666.61,668.22,671.44,674.96,685.75,683.30,693.03,693.93,705.29,
+706.92,711.31,717.28,719.75,723.36,733.37,736.74,735.97,743.85,749.69,
+748.31,760.01,754.96,761.86,760.58,771.07,780.94,778.53,784.88,786.93,
+793.98,795.49,798.42,805.96,812.88,814.57,821.36,823.80,826.38,838.28,
+840.83,837.62,841.82,847.40,860.41,862.21,864.97,874.73,871.18,880.90,
+883.28,884.11,892.42,891.02,893.88,903.60,907.99,912.74,915.85,919.90,
+927.60,932.79,935.61,941.32,946.62,942.99,946.40,957.21,965.37,956.28,
+974.92,975.77,981.60,985.10,987.63,985.31,991.27,1002.34,1007.40,1003.10,
+1011.67,1015.08,1020.58,1017.80,1031.78,1032.51,1047.05,1051.17,1048.74,1060.50,
+1059.55,1068.25,1063.18,1077.60,1080.97,1076.95,1080.66,1086.00,1089.23,1096.42,
+1097.95,1106.77,1106.11,1111.69,1117.38,1120.55,1128.06,1134.21,1137.74,1144.54,
+1141.86,1154.88,1157.40,1155.96,1160.26,1163.48,1172.98,1173.73,1168.87,1184.62,
+1187.23,1192.52,1199.39,1200.04,1211.10,1211.78,1213.09,1214.07,1218.69,1229.34,
+1223.83,1238.68,1239.95,1237.86,1259.32,1256.64,1263.39,1267.09,1268.43,1272.13,
+1279.70,1275.86,1291.09,1287.11,1290.02,1296.21,1300.41,1305.22,1311.15,1321.17,
+45.59,49.05,52.52,57.71,60.48,66.09,68.32,74.15,77.11,81.78,
+85.21,88.44,92.19,99.03,101.89,106.98,109.02,114.32,119.06,122.38,
+127.48,129.44,132.87,139.90,140.60,146.43,149.22,157.00,156.48,164.00,
+167.19,170.22,174.08,178.80,183.67,187.25,192.81,192.43,198.02,203.95,
+210.40,209.81,213.98,218.66,227.85,231.79,237.08,236.05,243.15,245.42,
+253.28,256.13,260.24,263.61,268.79,271.50,275.72,277.95,281.05,285.14,
+289.58,293.57,298.16,301.48,305.81,311.46,316.07,321.55,325.39,330.45,
+332.67,336.25,341.13,343.47,345.81,349.67,354.07,363.05,363.61,368.49,
+371.62,376.27,383.02,380.82,386.83,394.98,398.12,398.03,405.61,404.24,
+411.11,416.75,417.41,425.69,433.35,433.65,439.65,441.13,446.91,448.50,
+458.95,457.39,461.19,466.74,473.80,473.03,479.63,484.56,486.46,488.88,
+490.72,502.99,507.44,508.18,513.66,516.55,519.17,528.41,530.10,533.79,
+533.65,541.38,544.40,542.74,552.20,555.57,558.73,568.45,567.48,570.08,
+573.42,581.61,582.54,588.75,592.30,598.44,602.58,603.90,610.24,609.48,
+618.79,620.95,626.07,630.56,636.02,632.64,642.68,650.74,652.62,650.39,
+663.58,665.71,665.67,670.24,673.28,678.16,685.95,687.88,694.05,693.60,
+698.18,700.30,712.17,713.72,716.67,727.69,731.07,721.54,730.60,734.15,
+740.78,745.02,749.39,750.90,753.84,756.19,764.80,765.83,768.59,778.12,
+780.42,785.79,793.08,801.08,802.16,804.86,806.49,805.38,813.91,816.74,
+825.27,824.71,830.44,830.99,837.34,845.65,846.87,850.85,853.20,860.71,
+870.74,872.16,871.04,877.46,880.79,874.37,883.08,890.13,893.50,895.50,
+901.34,911.64,915.35,916.43,922.00,925.06,925.96,927.95,935.03,942.52,
+950.46,952.11,948.41,954.11,966.21,961.15,972.34,980.61,979.77,990.22,
+989.19,989.59,988.99,1002.57,1001.21,1001.53,1010.69,1018.42,1019.57,1026.77,
+1026.93,1027.99,1036.46,1032.46,1048.41,1045.83,1049.10,1051.93,1067.69,1056.12,
+1064.86,1069.77,1080.33,1085.96,1085.11,1091.25,1094.80,1101.85,1104.25,1108.35,
+1107.27,1115.45,1114.77,1123.21,1125.63,1134.75,1129.20,1138.81,1151.88,1141.48,
+1159.01,1159.84,1159.43,1160.11,1164.28,1165.27,1176.36,1183.12,1187.63,1182.95,
+1191.48,1203.86,1200.74,1201.57,1212.03,1207.11,1213.87,1225.92,1222.42,1231.95,
+41.41,43.59,48.44,53.28,58.26,62.16,63.60,67.14,71.93,76.45,
+79.72,85.26,88.63,92.06,93.09,96.27,104.89,107.00,109.63,115.20,
+117.29,122.90,124.86,127.99,131.28,138.64,143.69,145.85,150.67,150.36,
+156.66,157.39,165.07,167.11,172.10,176.34,178.22,185.52,186.43,190.17,
+192.91,198.37,198.84,207.69,211.34,212.63,218.99,220.04,224.70,226.03,
+234.26,237.96,239.82,241.40,248.26,252.21,256.93,260.08,260.15,265.61,
+272.16,274.31,277.90,282.89,286.44,290.10,295.65,297.34,304.87,307.11,
+305.15,311.05,318.30,315.14,319.69,331.08,330.42,330.43,340.31,345.54,
+347.72,352.76,352.24,360.12,360.90,370.10,375.28,371.61,374.24,384.05,
+387.04,387.64,392.15,398.95,402.09,404.50,406.74,410.97,418.66,423.58,
+424.65,426.15,433.51,434.65,439.86,441.42,448.17,447.91,453.64,456.78,
+461.03,468.54,466.65,470.13,477.09,483.81,484.42,482.27,492.40,497.82,
+499.89,500.59,511.86,509.76,515.17,516.42,521.35,528.75,534.05,532.34,
+542.05,545.30,544.76,544.52,557.61,558.66,567.69,563.55,571.30,574.62,
+575.35,579.91,588.18,590.85,592.78,591.22,600.05,606.79,610.51,612.77,
+611.38,615.53,616.34,623.44,624.05,634.76,638.80,647.43,641.44,651.40,
+649.60,654.47,656.78,663.43,669.07,670.59,674.38,678.83,688.01,691.18,
+693.83,697.36,693.66,702.21,704.17,714.12,713.56,719.35,723.02,722.01,
+729.39,731.84,739.90,739.72,743.79,751.80,753.59,757.62,761.57,762.97,
+763.78,770.91,771.80,782.99,779.58,785.03,789.34,789.95,795.43,806.84,
+805.85,802.12,812.25,822.52,824.06,822.05,823.93,827.33,840.43,840.66,
+843.34,840.05,843.76,849.62,862.28,861.52,863.14,867.46,869.97,877.51,
+881.97,882.62,882.25,886.13,891.77,902.22,905.50,899.47,909.26,912.19,
+922.25,917.96,929.32,928.12,938.34,940.11,943.97,950.03,945.21,958.05,
+970.08,957.16,966.67,962.97,978.11,980.84,980.21,983.73,987.07,988.73,
+996.04,1006.76,1002.01,1007.89,1013.13,1013.24,1020.96,1027.03,1033.47,1032.11,
+1031.84,1036.98,1041.14,1047.85,1053.15,1053.67,1059.11,1058.18,1075.91,1069.05,
+1072.88,1070.11,1083.62,1082.95,1087.25,1094.68,1094.41,1100.16,1100.27,1109.14,
+1108.13,1113.97,1117.67,1113.20,1124.42,1131.12,1131.84,1138.19,1141.53,1153.11,
+38.72,41.76,46.19,49.80,53.13,58.78,61.08,63.86,69.62,71.32,
+73.24,79.62,81.56,85.60,89.27,92.29,99.59,100.23,104.40,106.73,
+108.19,114.54,116.66,122.46,124.91,127.75,132.43,135.36,139.83,142.51,
+145.66,149.04,150.21,154.96,159.53,161.98,166.83,170.56,173.51,182.96,
+178.69,184.19,187.16,193.38,197.46,197.26,202.49,203.03,209.70,211.25,
+217.75,221.90,225.34,227.68,233.09,236.34,236.19,239.62,243.87,249.13,
+257.70,255.88,256.28,264.28,270.08,271.72,269.36,278.60,278.54,281.54,
+286.86,288.82,294.58,295.21,302.41,303.72,308.90,312.18,318.22,317.41,
+322.15,324.24,330.12,332.83,337.75,343.85,343.47,346.53,352.91,352.70,
+356.78,361.15,369.00,372.56,372.38,376.03,383.57,382.11,386.54,387.67,
+391.92,402.61,400.43,402.69,406.34,411.30,415.55,417.65,426.26,428.34,
+427.49,435.33,436.42,440.76,441.29,446.76,449.03,451.88,458.65,461.37,
+464.01,466.81,473.70,479.18,478.88,483.37,483.89,490.70,488.11,497.46,
+498.94,503.63,507.87,512.84,517.88,517.49,519.40,522.64,529.87,535.39,
+538.74,536.48,547.83,544.02,554.72,556.27,559.00,561.19,563.86,567.26,
+573.05,578.02,582.44,588.16,584.20,586.99,586.14,592.63,606.34,606.45,
+601.26,610.19,615.16,621.99,617.28,623.02,626.51,631.02,635.26,633.49,
+640.78,650.19,651.13,653.87,657.11,662.44,660.72,660.65,669.45,674.35,
+678.45,679.84,687.97,690.01,691.07,691.81,700.45,703.31,707.52,705.43,
+711.67,720.31,721.12,730.89,732.55,730.76,730.65,738.19,741.22,741.92,
+752.44,759.04,759.41,754.46,759.50,762.69,770.11,781.83,779.55,780.01,
+787.09,791.03,792.34,796.86,799.78,804.90,805.56,808.79,818.71,818.35,
+831.71,829.04,828.75,838.22,835.85,842.22,842.23,840.13,844.53,853.96,
+854.81,860.00,860.75,867.84,872.18,877.85,880.57,880.94,882.92,887.40,
+899.11,899.38,899.59,904.10,904.45,904.02,916.44,912.46,918.80,921.63,
+931.10,929.44,932.20,940.34,940.55,948.00,950.05,952.85,952.99,955.14,
+962.77,969.03,963.84,977.20,973.80,973.64,983.26,990.92,993.81,998.79,
+1005.68,1008.17,1009.35,1008.90,1012.95,1023.61,1023.20,1032.35,1022.34,1036.73,
+1038.95,1036.73,1041.20,1046.69,1044.36,1047.00,1060.18,1066.11,1056.78,1059.03,
+36.63,39.76,43.32,45.85,49.02,53.67,54.96,58.47,61.96,64.21,
+69.13,73.17,73.87,79.03,84.00,87.48,88.89,92.44,96.07,97.84,
+104.48,106.01,111.72,112.56,116.54,117.72,119.89,127.73,126.60,130.69,
+133.62,138.75,141.27,141.31,149.48,153.97,154.34,156.62,161.61,164.30,
+170.02,170.89,177.42,180.72,181.07,185.18,185.74,190.12,194.94,196.55,
+199.13,203.36,205.92,210.10,214.69,216.30,222.80,224.71,229.59,230.36,
+234.21,237.80,240.67,244.80,246.97,252.44,253.01,258.94,262.00,264.34,
+269.89,270.01,274.66,274.65,280.44,287.54,288.80,292.32,290.98,297.69,
+301.35,300.53,307.27,308.65,313.63,312.87,318.90,324.60,328.51,328.65,
+333.44,335.55,336.25,341.08,344.93,346.29,353.67,358.21,359.07,367.32,
+370.90,368.91,371.99,373.23,375.32,378.77,383.72,390.93,392.87,395.19,
+399.46,402.79,403.79,412.12,412.19,414.50,417.89,423.71,425.55,434.84,
+432.89,434.34,439.87,442.59,441.00,450.81,451.01,456.95,463.08,464.41,
+464.95,464.89,472.26,477.00,483.70,479.19,484.51,490.44,494.95,493.90,
+496.67,505.75,510.03,509.35,511.60,514.56,517.88,520.98,522.00,529.22,
+532.70,539.87,539.12,534.63,541.35,546.95,548.99,556.20,557.94,560.25,
+564.10,566.26,568.55,575.15,580.11,580.24,588.18,588.69,592.88,592.09,
+596.45,597.07,605.81,603.07,614.47,610.73,620.23,624.27,618.39,629.85,
+629.58,638.88,640.80,640.41,640.69,646.30,647.04,654.84,657.32,661.04,
+666.51,669.60,671.74,673.60,678.46,678.29,682.15,691.29,688.75,694.47,
+696.64,697.68,699.24,707.18,707.41,714.21,719.05,721.16,731.15,723.56,
+731.84,738.88,732.34,736.40,744.06,748.84,749.65,750.61,756.14,757.19,
+767.30,762.61,766.38,768.24,776.41,776.81,783.97,779.42,791.07,795.16,
+796.52,800.97,802.93,812.98,813.72,811.20,812.23,815.69,827.49,829.16,
+824.26,834.65,837.95,841.53,838.47,846.46,853.19,851.44,853.51,859.17,
+869.38,868.29,871.03,871.17,878.87,877.74,883.56,881.54,886.40,901.30,
+892.73,897.85,900.31,901.18,905.83,914.91,916.99,919.77,917.59,916.67,
+933.76,931.15,934.89,936.31,948.24,955.83,950.13,952.44,950.26,959.58,
+965.00,960.88,973.57,968.81,970.78,983.99,979.41,987.11,982.60,991.37,
+32.57,36.54,41.04,44.06,46.73,48.82,50.84,54.95,56.51,62.33,
+63.05,67.34,70.82,74.44,76.50,79.46,82.23,86.03,89.54,91.44,
+93.71,100.56,100.63,104.45,108.17,109.35,113.09,113.78,117.75,121.30,
+123.78,128.10,130.10,132.87,140.32,143.82,142.98,146.53,150.95,153.47,
+155.34,160.43,164.05,163.59,170.69,173.06,179.81,177.07,180.70,185.51,
+187.39,190.89,190.90,197.89,202.01,201.06,203.76,210.79,209.12,214.13,
+218.83,221.39,225.87,226.41,229.41,232.83,236.10,243.07,240.10,246.28,
+246.45,253.44,253.97,252.72,257.85,262.90,264.10,274.33,270.62,275.28,
+280.43,284.81,283.94,287.31,292.21,293.93,299.98,298.00,304.61,305.68,
+310.65,311.59,317.10,317.76,327.54,327.49,328.96,331.59,334.32,337.22,
+339.99,343.79,344.54,352.33,352.14,353.75,360.43,359.31,364.64,373.84,
+370.03,373.55,377.16,386.86,383.18,388.28,392.34,393.47,394.89,397.46,
+405.06,405.40,407.26,413.10,415.26,417.77,417.37,419.08,427.09,430.63,
+432.20,431.98,437.96,440.24,444.94,445.55,449.35,458.84,454.72,463.16,
+465.79,468.83,472.41,470.64,478.39,472.97,479.21,482.80,483.78,495.18,
+496.45,495.21,495.87,506.29,510.77,513.67,516.76,511.50,521.06,523.64,
+521.64,528.36,536.01,531.20,535.32,539.22,543.00,541.60,546.36,553.82,
+557.61,558.32,555.87,565.48,560.32,572.12,575.65,579.48,578.96,587.27,
+586.34,590.03,595.70,592.84,597.13,605.43,602.44,611.50,607.74,617.85,
+615.76,616.42,623.70,623.97,637.92,633.41,635.92,635.36,645.49,653.13,
+646.82,651.98,650.04,654.87,660.30,656.88,667.05,677.04,675.05,676.24,
+680.64,677.64,686.34,687.12,692.21,690.21,695.40,702.49,698.73,704.02,
+709.28,717.57,707.95,716.68,722.76,728.29,730.28,734.20,728.94,738.27,
+742.86,741.95,756.76,750.84,752.00,753.46,756.30,760.60,761.92,768.87,
+767.89,774.63,775.47,780.95,779.89,785.93,791.69,792.09,797.10,794.50,
+800.16,802.36,811.31,813.45,809.04,818.72,817.21,823.53,823.21,825.04,
+832.63,833.74,842.79,838.94,843.39,854.10,849.95,855.60,858.39,868.09,
+865.35,868.50,875.42,870.14,880.28,879.00,891.40,884.88,881.45,888.22,
+895.72,899.31,899.39,904.56,909.13,917.60,914.21,925.32,919.80,924.79,
+29.80,32.97,36.98,39.19,43.41,44.21,46.23,50.62,56.27,55.20,
+58.15,63.67,65.56,70.65,71.53,74.66,76.02,79.01,83.71,84.06,
+89.00,90.56,93.99,95.00,98.90,104.95,103.25,108.44,109.11,113.32,
+116.92,118.96,123.55,125.75,126.78,132.35,135.62,137.22,137.69,140.00,
+145.07,148.75,149.20,154.90,156.03,161.71,162.33,165.24,166.01,168.78,
+175.80,173.43,180.70,184.29,180.07,188.95,193.80,194.02,194.69,196.84,
+200.90,203.53,208.53,210.66,213.23,218.52,215.07,221.68,229.59,226.10,
+230.04,234.91,236.62,239.69,242.97,243.56,247.03,250.43,254.66,258.73,
+255.75,262.11,266.03,268.09,272.50,274.41,278.67,281.05,282.46,283.52,
+283.52,290.42,292.40,295.78,298.19,302.08,299.58,307.43,313.01,314.65,
+312.80,317.20,325.38,324.12,325.65,328.25,331.46,331.83,341.78,342.45,
+346.56,346.36,352.87,354.05,355.87,364.30,363.05,364.93,370.48,366.19,
+376.74,380.44,381.65,376.74,381.54,394.09,392.53,397.38,396.73,402.91,
+401.73,404.15,411.98,415.47,412.27,415.65,423.11,426.61,418.40,423.79,
+422.37,430.47,437.01,438.82,438.27,441.30,451.07,444.49,455.80,458.25,
+457.32,465.24,464.26,463.30,466.98,471.15,472.48,470.28,485.04,484.86,
+488.83,485.14,488.78,499.32,493.90,505.47,499.68,510.22,510.36,512.84,
+519.61,519.72,523.21,524.31,530.14,529.28,530.24,542.70,539.18,542.40,
+546.06,547.75,552.14,553.11,550.53,558.92,561.31,565.24,566.46,573.68,
+573.32,578.41,577.07,588.62,587.55,582.66,590.55,597.50,590.83,594.55,
+601.09,603.55,608.00,606.90,618.10,619.49,616.46,623.18,622.12,627.50,
+626.36,632.14,632.02,639.00,641.64,648.76,652.04,648.13,650.82,652.36,
+655.60,656.40,666.52,664.52,662.33,678.85,674.01,675.69,678.32,692.17,
+681.40,693.51,690.94,688.67,696.22,698.37,700.97,705.31,705.03,714.52,
+720.05,715.04,715.80,726.43,726.50,730.00,728.35,740.20,734.74,747.74,
+741.88,742.09,745.55,752.89,757.40,756.73,754.75,763.89,769.04,764.94,
+772.13,771.40,778.67,787.33,787.28,796.23,787.38,796.22,792.76,800.63,
+804.47,801.07,802.16,804.27,813.70,811.70,819.12,814.07,821.65,826.68,
+832.36,830.13,829.49,839.97,845.81,838.97,843.62,853.35,853.59,855.06,
+83.90,91.66,98.51,106.71,114.77,121.79,129.61,136.50,145.12,152.05,
+159.76,167.11,176.43,181.18,188.75,198.64,204.80,212.75,221.50,227.14,
+235.10,243.86,250.61,257.47,266.55,272.67,281.50,288.56,297.28,303.77,
+313.61,318.61,327.33,335.25,341.73,349.46,356.55,364.32,369.26,378.47,
+386.70,396.36,402.31,408.78,418.33,424.80,432.55,439.54,447.66,455.98,
+462.59,472.57,479.60,486.70,492.23,501.37,508.35,516.86,522.56,533.35,
+540.82,545.01,553.30,562.49,569.26,576.57,585.94,593.13,597.19,606.92,
+614.34,622.32,628.08,637.54,643.96,654.64,661.55,668.44,675.47,681.83,
+690.36,698.63,706.42,713.78,722.74,726.04,737.95,741.67,750.78,759.47,
+767.86,773.30,781.57,790.29,798.29,804.75,813.12,818.45,827.71,832.73,
+842.47,851.43,856.98,867.03,873.32,879.71,889.71,894.41,905.00,910.16,
+920.16,927.78,934.39,942.20,949.38,955.76,963.49,972.34,980.72,989.54,
+993.83,998.96,1010.47,1017.53,1023.47,1030.93,1040.41,1048.33,1056.85,1061.10,
+1065.57,1075.95,1085.21,1092.25,1100.56,1106.71,1116.75,1123.99,1131.30,1141.14,
+1146.62,1151.97,1162.91,1169.02,1177.85,1183.09,1191.63,1198.56,1208.16,1213.32,
+1223.98,1229.20,1236.13,1243.96,1250.98,1257.08,1268.40,1273.84,1286.65,1287.72,
+1299.57,1307.35,1315.77,1319.48,1327.10,1335.60,1342.67,1353.63,1357.86,1366.32,
+1379.43,1379.02,1393.08,1395.29,1404.92,1411.00,1418.57,1429.08,1436.75,1443.07,
+1451.56,1457.04,1466.38,1474.99,1477.42,1486.72,1497.22,1499.55,1511.51,1516.34,
+1523.40,1534.74,1541.81,1549.50,1555.87,1564.49,1571.32,1578.41,1583.82,1596.17,
+1600.42,1606.69,1616.66,1624.47,1631.07,1640.86,1649.56,1654.07,1661.82,1664.83,
+1676.07,1683.25,1692.96,1701.56,1708.61,1719.47,1721.40,1731.97,1735.98,1744.66,
+1750.24,1761.52,1766.65,1777.90,1781.46,1786.51,1801.41,1809.47,1815.91,1820.49,
+1828.10,1837.55,1846.58,1851.67,1862.57,1866.11,1874.13,1881.25,1891.24,1898.84,
+1907.01,1910.64,1923.34,1929.82,1936.40,1945.08,1951.96,1962.34,1960.79,1971.43,
+1982.14,1989.01,1991.82,2006.79,2012.01,2019.15,2029.33,2033.13,2045.03,2046.55,
+2059.22,2063.58,2076.62,2081.47,2088.21,2095.96,2101.26,2109.32,2114.14,2125.26,
+2131.94,2139.14,2153.92,2155.84,2164.62,2169.48,2177.67,2184.89,2193.75,2201.45,
+2206.34,2217.41,2227.72,2231.36,2237.63,2245.70,2254.58,2258.51,2269.56,2274.51,
+80.06,87.21,95.16,100.94,109.18,117.42,123.12,131.03,139.10,144.79,
+152.87,159.32,167.12,173.59,181.96,187.49,195.56,202.16,210.25,217.85,
+225.61,231.82,239.55,247.12,254.41,259.84,266.82,277.51,283.10,288.56,
+296.56,303.31,314.36,320.22,327.40,334.38,342.59,350.28,354.58,362.99,
+368.88,375.25,383.48,390.11,398.52,406.20,413.99,419.06,427.83,435.88,
+441.92,452.51,457.36,462.29,472.17,475.34,487.28,494.92,499.42,507.85,
+514.90,521.15,530.45,535.61,542.30,548.53,558.90,564.21,573.25,580.20,
+588.02,594.98,602.35,609.65,616.70,624.76,631.31,636.89,646.26,650.07,
+659.49,666.70,673.52,681.48,686.77,697.12,704.79,708.58,716.67,723.34,
+733.21,739.74,746.90,753.56,760.39,771.64,776.67,784.95,789.73,795.97,
+806.20,810.88,822.32,826.63,834.51,840.03,848.21,858.04,863.56,872.74,
+880.76,886.89,894.58,898.01,905.18,912.63,919.01,928.49,937.52,938.52,
+950.71,957.15,964.89,971.86,980.78,988.19,994.41,1000.17,1007.84,1012.29,
+1022.69,1030.58,1039.71,1043.95,1050.33,1060.24,1066.35,1073.53,1082.08,1084.60,
+1097.26,1100.59,1109.25,1116.81,1124.70,1131.09,1136.03,1145.26,1151.10,1161.65,
+1167.80,1173.35,1179.64,1187.17,1193.88,1203.31,1209.93,1215.70,1224.46,1235.44,
+1243.05,1244.74,1251.94,1259.31,1269.28,1277.16,1284.70,1292.73,1295.16,1305.82,
+1314.71,1317.29,1325.78,1331.45,1339.86,1349.59,1355.38,1362.54,1370.12,1375.54,
+1386.04,1393.10,1399.54,1405.20,1413.26,1418.39,1425.54,1436.94,1445.09,1451.27,
+1457.48,1464.85,1472.05,1477.60,1488.29,1495.01,1498.57,1506.91,1515.69,1525.98,
+1528.71,1539.28,1546.55,1552.45,1558.88,1569.41,1575.89,1581.40,1588.58,1592.60,
+1601.78,1609.69,1613.81,1621.81,1632.01,1638.74,1644.05,1647.59,1662.32,1668.34,
+1676.67,1686.46,1690.07,1698.15,1701.30,1710.57,1718.21,1727.76,1735.46,1739.40,
+1745.49,1749.74,1763.99,1770.68,1775.33,1781.42,1792.27,1792.95,1808.98,1814.29,
+1822.96,1826.55,1835.89,1841.82,1849.62,1856.96,1865.47,1875.39,1876.11,1883.73,
+1894.18,1900.08,1905.76,1910.27,1922.45,1931.48,1936.42,1945.07,1946.10,1957.29,
+1963.33,1973.67,1979.47,1987.42,1991.95,2002.26,2009.75,2013.24,2027.63,2032.59,
+2035.42,2039.45,2055.64,2055.65,2063.98,2072.21,2081.71,2091.70,2091.22,2106.80,
+2113.23,2115.22,2122.78,2134.49,2136.30,2147.56,2153.66,2159.46,2164.57,2178.56,
+77.14,82.23,90.44,95.78,104.65,109.71,116.21,124.47,131.98,136.43,
+143.68,152.09,158.26,165.99,172.09,178.15,186.99,194.62,201.02,207.98,
+215.14,221.54,227.08,235.00,241.82,247.93,256.30,262.79,268.39,277.83,
+283.78,290.66,297.16,304.72,311.48,319.04,323.24,331.35,339.16,346.48,
+353.23,358.90,365.61,374.82,380.78,385.09,394.34,401.15,408.41,415.24,
+421.16,430.08,434.14,444.86,449.97,455.14,461.70,467.24,478.33,482.02,
+490.58,497.04,504.38,511.85,519.85,524.80,533.36,540.44,545.53,551.62,
+559.05,564.83,575.95,580.48,584.54,595.07,602.02,608.88,615.87,620.28,
+627.83,637.49,641.79,649.72,656.85,661.92,670.06,676.12,682.80,690.26,
+697.15,705.36,707.63,719.15,727.16,733.55,740.12,746.99,753.03,761.67,
+769.44,776.08,781.08,788.89,794.40,799.42,807.50,811.56,823.44,829.35,
+837.62,843.77,851.99,856.11,863.07,872.25,875.56,882.39,892.31,899.53,
+904.83,913.02,921.57,927.30,932.27,939.86,942.18,955.56,961.82,967.51,
+977.99,982.72,985.32,991.99,1003.40,1007.84,1016.31,1021.90,1034.95,1039.56,
+1042.89,1051.55,1057.98,1065.94,1069.08,1079.21,1085.16,1092.46,1100.41,1104.33,
+1111.55,1117.82,1126.24,1134.11,1142.21,1147.58,1155.57,1160.02,1168.17,1172.88,
+1181.91,1187.26,1193.72,1206.54,1208.20,1214.83,1215.01,1230.66,1235.53,1241.85,
+1250.92,1258.26,1265.66,1269.14,1279.13,1284.97,1290.57,1298.80,1305.88,1313.89,
+1319.95,1330.10,1333.69,1337.09,1349.44,1354.37,1364.55,1367.22,1374.33,1381.74,
+1390.78,1395.08,1402.90,1409.66,1420.03,1425.53,1431.92,1433.79,1443.89,1451.23,
+1462.18,1463.09,1471.80,1480.74,1486.03,1490.78,1499.30,1504.25,1513.97,1523.22,
+1529.95,1533.73,1539.06,1548.53,1557.62,1565.38,1567.78,1571.33,1583.64,1594.05,
+1598.02,1600.34,1606.42,1618.40,1629.74,1631.33,1635.16,1642.99,1652.39,1652.21,
+1665.85,1672.20,1676.75,1686.12,1693.55,1700.57,1705.44,1707.20,1717.58,1728.38,
+1733.49,1744.16,1749.02,1756.93,1765.85,1768.06,1782.15,1784.44,1787.15,1793.82,
+1800.64,1813.11,1819.81,1827.82,1836.47,1835.61,1851.46,1852.23,1863.26,1865.62,
+1869.82,1879.15,1887.56,1895.45,1902.37,1911.78,1910.90,1917.85,1935.62,1931.27,
+1941.12,1949.11,1951.83,1962.82,1971.15,1974.27,1986.83,1988.48,1994.78,2002.83,
+2007.67,2018.58,2025.65,2028.69,2038.99,2047.84,2050.61,2059.11,2066.59,2074.15,
+72.77,80.70,85.16,91.58,98.49,105.49,111.02,118.41,124.41,131.34,
+137.93,144.02,152.91,158.05,165.26,171.15,175.97,184.08,190.19,197.35,
+204.68,212.29,215.76,222.06,226.99,235.79,244.13,247.81,256.70,263.83,
+270.31,276.16,284.69,287.93,293.82,301.15,308.28,316.25,322.77,328.44,
+335.28,342.44,349.88,356.29,359.80,369.09,373.46,380.41,386.85,394.59,
+399.60,407.41,416.04,422.97,428.02,434.55,441.48,447.64,449.76,459.98,
+465.71,473.21,479.03,486.02,494.04,498.01,507.80,512.87,517.40,528.05,
+531.71,536.96,547.24,551.94,561.20,563.37,569.71,575.20,585.88,589.98,
+598.63,600.17,614.57,618.91,623.77,630.13,637.17,644.59,652.67,653.86,
+663.19,670.34,674.80,683.27,688.15,696.65,704.89,709.80,717.21,723.12,
+730.97,738.34,742.65,751.20,753.02,761.22,773.21,775.08,778.32,786.05,
+795.68,798.74,808.12,814.76,822.43,826.37,837.24,838.61,852.30,852.99,
+863.81,868.43,872.77,881.95,886.58,890.41,897.94,906.12,912.04,920.62,
+927.11,930.96,939.37,949.15,954.61,960.28,967.20,973.16,981.47,987.68,
+991.33,998.64,1002.51,1011.56,1016.39,1026.50,1029.92,1037.92,1042.28,1052.79,
+1059.25,1065.33,1071.20,1079.58,1083.43,1089.02,1097.06,1106.97,1110.90,1120.74,
+1121.65,1132.56,1138.92,1139.52,1150.12,1157.55,1168.37,1164.93,1170.18,1184.02,
+1189.65,1193.84,1201.99,1214.30,1213.95,1221.97,1231.62,1235.40,1243.56,1248.75,
+1258.26,1263.38,1266.27,1274.29,1281.58,1288.68,1294.08,1305.11,1308.27,1312.63,
+1319.15,1326.30,1329.29,1346.40,1349.14,1354.18,1359.13,1368.63,1372.43,1378.93,
+1390.86,1388.77,1396.58,1407.38,1417.79,1419.51,1421.39,1431.89,1442.74,1445.89,
+1447.45,1457.22,1464.42,1471.08,1480.77,1485.31,1494.40,1501.63,1507.29,1515.79,
+1517.31,1524.69,1533.53,1538.67,1546.37,1550.11,1558.43,1565.56,1568.85,1581.49,
+1583.99,1591.11,1596.35,1604.59,1611.96,1622.45,1624.53,1628.23,1636.53,1644.55,
+1645.60,1654.98,1662.11,1670.53,1675.26,1677.42,1688.32,1696.79,1705.70,1704.64,
+1716.42,1723.81,1729.35,1738.52,1743.25,1748.56,1757.56,1759.29,1764.09,1775.15,
+1774.02,1789.07,1792.77,1801.38,1809.92,1810.42,1824.37,1822.51,1841.55,1838.61,
+1847.38,1852.94,1864.97,1867.24,1879.55,1881.39,1881.73,1891.77,1907.06,1906.79,
+1914.29,1918.89,1924.29,1936.41,1942.53,1946.54,1951.69,1957.34,1961.81,1975.93,
+68.81,76.11,80.44,88.42,92.61,101.70,104.24,112.22,118.23,125.68,
+132.89,138.31,143.73,149.21,156.27,159.63,168.33,173.78,180.44,184.88,
+194.56,200.95,206.31,211.77,219.03,227.34,232.19,238.02,241.27,249.12,
+254.75,262.27,270.38,276.64,281.34,287.14,292.62,298.07,305.03,312.73,
+317.49,322.77,330.38,336.84,342.31,347.18,355.54,361.93,368.35,374.89,
+378.94,388.80,392.44,398.36,407.83,410.95,416.32,420.13,428.38,438.33,
+441.74,449.96,460.66,459.75,467.60,474.35,482.43,483.74,492.93,499.57,
+506.05,510.14,518.66,526.76,530.26,534.85,542.83,547.47,555.33,559.04,
+566.56,575.49,581.46,586.86,587.55,600.25,600.83,612.39,618.55,623.11,
+627.08,633.60,641.83,648.99,655.57,659.17,670.75,675.48,682.55,688.67,
+687.53,696.31,703.12,710.63,721.29,726.52,728.06,732.83,741.48,747.23,
+755.54,761.43,766.32,771.30,778.93,781.77,792.84,801.58,806.30,811.35,
+813.33,822.66,827.06,837.66,842.79,854.27,857.00,860.25,870.12,877.07,
+875.67,884.18,890.22,899.58,908.02,908.44,914.46,923.57,928.73,936.64,
+942.79,949.94,950.45,960.66,966.87,972.32,981.37,988.41,992.39,1000.76,
+1001.79,1012.39,1018.82,1026.45,1029.37,1041.62,1043.61,1046.11,1052.25,1063.02,
+1065.11,1072.22,1083.77,1082.37,1094.15,1096.37,1107.43,1112.90,1115.82,1120.93,
+1129.23,1134.84,1143.33,1151.21,1151.66,1159.10,1163.30,1180.00,1181.47,1186.65,
+1191.47,1202.14,1208.01,1209.63,1219.15,1224.87,1233.78,1235.98,1242.64,1247.18,
+1249.24,1260.02,1265.29,1273.40,1280.79,1287.25,1294.27,1301.71,1299.17,1314.28,
+1320.91,1317.31,1331.15,1332.14,1341.36,1343.34,1352.42,1360.92,1366.53,1372.44,
+1377.81,1381.79,1388.85,1398.22,1399.64,1408.09,1414.29,1425.50,1430.10,1434.85,
+1442.14,1446.11,1457.75,1460.35,1466.24,1474.15,1481.33,1491.91,1489.71,1495.83,
+1499.30,1509.99,1517.62,1523.87,1526.55,1537.63,1538.87,1543.19,1549.06,1556.75,
+1564.82,1574.81,1575.36,1583.17,1588.73,1597.57,1605.36,1606.46,1614.18,1629.51,
+1630.34,1633.64,1640.19,1648.55,1657.31,1654.42,1671.05,1678.31,1674.91,1681.06,
+1690.79,1698.86,1701.93,1712.23,1713.26,1721.04,1724.60,1737.53,1740.56,1752.76,
+1765.90,1760.12,1765.17,1776.18,1775.09,1787.01,1789.94,1798.54,1808.18,1808.67,
+1820.67,1821.51,1825.74,1836.98,1839.98,1848.33,1850.12,1862.42,1868.57,1868.82,
+65.32,71.07,75.80,84.10,90.09,95.15,101.84,104.81,112.40,117.74,
+125.15,130.58,136.56,141.78,148.37,154.15,158.67,165.11,171.51,177.91,
+183.77,190.27,195.58,201.27,208.12,209.76,219.50,225.30,228.73,235.63,
+240.66,248.86,255.42,259.81,267.85,273.01,276.87,285.48,289.81,294.88,
+301.90,308.35,316.76,320.01,324.57,329.80,336.40,342.90,349.12,354.35,
+361.38,367.97,373.23,377.80,382.74,389.96,397.72,401.68,408.98,415.04,
+418.84,427.13,429.22,437.26,446.67,447.61,454.26,463.20,466.78,472.15,
+473.70,483.96,492.63,493.33,503.82,506.52,514.98,519.96,525.74,535.62,
+540.69,542.82,549.01,556.08,561.76,566.21,573.76,576.50,580.85,593.61,
+596.18,606.60,605.10,611.94,622.83,629.78,633.61,639.33,645.29,653.27,
+657.51,662.04,668.12,675.26,679.97,689.01,697.37,696.15,703.87,713.49,
+714.19,721.96,726.73,736.27,741.23,744.76,748.81,757.72,764.91,768.76,
+773.13,779.16,786.42,793.91,799.37,803.43,810.99,814.41,824.19,833.12,
+835.23,841.19,848.61,853.20,856.79,862.28,868.68,877.04,882.29,891.15,
+895.19,901.27,909.91,910.14,916.26,925.17,928.10,936.24,940.83,947.26,
+950.97,960.92,962.39,968.85,973.64,979.32,992.47,992.87,1000.12,1004.25,
+1009.51,1021.15,1025.62,1032.35,1037.71,1044.35,1044.59,1051.18,1058.56,1070.23,
+1073.24,1072.67,1079.63,1084.86,1095.43,1102.44,1105.21,1110.50,1111.17,1123.70,
+1130.99,1136.02,1142.32,1146.97,1151.90,1166.94,1163.31,1178.22,1177.74,1185.49,
+1192.53,1189.95,1199.73,1202.02,1212.96,1220.08,1226.88,1227.96,1240.53,1241.18,
+1247.59,1251.68,1258.50,1265.73,1268.06,1272.98,1287.76,1286.78,1296.52,1302.60,
+1305.83,1311.32,1315.20,1322.56,1330.09,1340.04,1339.59,1348.93,1351.14,1358.12,
+1364.42,1376.59,1375.57,1385.89,1388.95,1394.35,1406.49,1404.14,1410.07,1420.52,
+1430.17,1435.77,1437.10,1447.26,1447.17,1458.45,1457.99,1462.98,1475.80,1480.04,
+1484.75,1495.97,1495.35,1500.97,1504.47,1512.62,1516.61,1524.53,1532.77,1539.63,
+1548.42,1552.76,1558.44,1556.61,1567.98,1580.19,1577.42,1592.56,1588.89,1595.68,
+1603.92,1610.27,1617.97,1626.74,1624.07,1632.81,1641.67,1646.76,1648.70,1660.05,
+1666.95,1669.46,1673.98,1679.39,1682.49,1691.74,1692.81,1702.36,1706.46,1716.18,
+1720.79,1723.77,1731.92,1732.44,1739.04,1750.66,1757.93,1762.50,1769.96,1778.40,
+62.00,67.32,73.18,78.91,84.47,90.37,95.05,101.26,105.23,111.21,
+117.64,124.10,128.60,134.51,138.24,145.24,150.29,156.11,161.85,167.44,
+170.96,178.67,183.59,189.73,193.21,201.96,207.54,212.27,220.58,225.11,
+229.88,233.53,239.53,245.41,253.28,260.85,265.35,267.65,276.96,279.56,
+285.58,290.13,296.88,304.01,306.79,312.79,317.71,322.11,331.61,334.61,
+342.67,345.68,354.44,358.77,363.26,371.22,374.58,379.93,385.67,393.21,
+394.32,401.29,410.51,414.79,418.59,426.80,429.76,438.66,442.29,449.44,
+455.14,456.93,464.37,472.04,476.48,480.30,488.27,494.04,497.18,502.30,
+508.73,513.96,523.82,527.15,530.55,537.97,540.54,551.63,554.98,557.82,
+561.69,571.22,579.80,583.39,588.29,591.60,601.43,605.12,611.74,616.33,
+620.28,627.06,631.51,636.38,641.16,648.91,659.44,661.75,669.11,666.46,
+674.88,681.46,685.53,693.52,701.35,705.58,709.35,718.65,723.52,734.91,
+733.90,738.79,744.22,750.29,756.07,762.31,766.26,769.84,777.16,786.14,
+787.87,791.84,802.41,806.65,807.74,814.17,823.12,829.34,828.71,839.43,
+846.39,850.95,857.10,866.60,868.27,869.86,877.20,882.92,891.48,892.94,
+897.29,908.59,911.23,922.61,923.37,928.40,934.50,942.29,941.15,949.52,
+956.63,960.02,969.75,971.45,982.17,983.67,995.08,995.04,1001.53,1009.84,
+1016.22,1020.83,1026.75,1032.46,1033.66,1040.03,1048.78,1052.63,1058.05,1068.42,
+1072.15,1073.91,1083.87,1084.30,1092.20,1097.39,1101.28,1108.94,1113.37,1114.60,
+1129.75,1128.96,1131.71,1146.69,1140.71,1153.77,1160.80,1163.25,1171.27,1174.28,
+1185.41,1187.77,1188.84,1197.44,1199.80,1206.15,1218.22,1224.58,1225.57,1232.70,
+1231.13,1241.57,1250.07,1250.71,1264.53,1264.26,1270.58,1274.29,1279.90,1288.66,
+1305.19,1300.64,1306.65,1312.89,1308.85,1324.41,1324.22,1333.94,1334.20,1342.19,
+1347.94,1356.75,1360.17,1362.23,1371.59,1381.00,1384.41,1388.45,1392.46,1398.02,
+1403.59,1409.83,1420.80,1421.84,1425.75,1433.50,1434.34,1440.69,1450.57,1456.67,
+1466.70,1465.98,1466.17,1477.07,1482.97,1483.71,1494.63,1497.40,1503.30,1502.86,
+1523.52,1522.64,1524.71,1529.89,1543.48,1546.79,1549.65,1556.07,1564.17,1565.70,
+1572.66,1580.62,1589.56,1590.63,1599.04,1601.08,1608.40,1615.62,1613.36,1622.05,
+1633.05,1631.13,1638.40,1639.13,1652.86,1657.90,1662.62,1676.10,1676.77,1674.35,
+57.42,63.03,69.12,74.77,81.37,84.34,88.83,94.10,100.79,105.75,
+111.48,117.07,123.08,126.24,132.92,137.49,141.59,147.60,153.78,159.20,
+164.47,171.18,175.84,179.96,185.60,188.25,195.27,204.58,205.72,211.01,
+218.24,222.46,226.76,229.62,239.74,242.39,250.54,256.33,260.78,264.05,
+269.75,273.65,280.20,285.23,290.70,295.45,300.43,308.67,309.71,318.92,
+323.03,326.54,335.53,339.40,343.31,348.31,353.05,357.80,365.11,367.87,
+373.53,380.27,384.62,392.72,395.56,402.54,402.97,411.48,415.77,427.18,
+427.78,433.05,439.93,443.63,444.02,457.67,459.95,466.68,470.29,473.10,
+480.25,490.48,489.30,497.50,500.18,510.48,508.78,517.44,521.50,525.01,
+536.70,538.62,538.76,547.24,553.51,562.94,570.90,570.36,573.68,583.06,
+589.04,592.24,598.40,601.36,606.81,611.30,620.47,627.97,629.64,635.30,
+639.23,646.21,647.59,653.53,660.74,666.11,669.57,681.12,678.76,689.00,
+692.73,695.44,697.06,707.17,715.45,720.79,723.69,727.39,734.30,744.36,
+745.12,748.17,756.28,760.39,764.54,773.25,776.03,780.20,790.98,792.32,
+800.47,803.08,812.88,816.90,816.91,825.55,834.04,836.28,838.81,848.55,
+853.30,859.54,863.10,867.25,871.94,874.45,885.93,889.09,898.51,898.52,
+902.43,909.26,914.51,913.59,920.11,932.33,935.90,940.45,947.97,955.07,
+957.72,965.00,967.79,978.81,982.64,986.37,994.73,994.07,999.39,1008.33,
+1006.44,1013.76,1021.01,1030.88,1037.42,1043.71,1039.34,1045.14,1051.77,1054.79,
+1067.03,1068.48,1079.62,1079.18,1085.39,1089.15,1097.41,1097.44,1104.47,1109.30,
+1118.81,1118.94,1127.63,1130.37,1135.61,1139.26,1143.28,1153.31,1159.09,1167.73,
+1165.37,1179.68,1189.24,1185.85,1190.49,1194.38,1203.10,1206.69,1210.80,1215.82,
+1222.25,1226.20,1229.81,1233.73,1246.34,1244.98,1254.98,1255.19,1264.41,1265.53,
+1270.92,1281.68,1290.75,1290.86,1292.02,1297.91,1306.11,1306.91,1317.55,1313.86,
+1330.89,1333.19,1334.95,1344.47,1349.96,1354.73,1356.62,1366.49,1366.79,1372.08,
+1378.31,1387.15,1383.60,1400.08,1399.12,1406.70,1415.32,1416.32,1420.81,1427.44,
+1430.92,1440.25,1450.76,1448.92,1449.94,1464.85,1461.92,1466.44,1475.94,1481.17,
+1492.56,1496.28,1498.17,1498.46,1505.85,1512.04,1518.99,1519.27,1528.23,1533.88,
+1542.06,1541.61,1552.18,1555.08,1554.30,1565.42,1572.67,1575.19,1583.97,1580.08,
+54.80,58.40,65.93,71.26,74.04,79.69,84.51,89.13,95.45,101.00,
+105.31,108.94,115.36,119.46,124.13,132.12,133.64,141.06,143.42,151.08,
+156.72,160.63,163.66,168.73,176.35,179.18,185.49,190.50,195.94,198.57,
+204.96,210.24,215.71,218.53,224.25,226.94,234.72,239.25,245.17,248.06,
+254.22,259.45,260.80,268.25,275.25,278.37,283.81,286.46,295.82,299.89,
+304.14,310.61,314.46,319.46,324.94,327.83,334.70,340.37,345.31,347.33,
+354.80,362.30,365.80,367.95,374.38,378.28,380.75,389.17,393.99,398.34,
+406.21,410.51,417.28,419.50,424.29,432.01,437.10,440.33,441.83,445.51,
+456.31,460.44,462.21,465.53,471.58,478.85,483.05,485.12,490.10,498.70,
+504.10,511.48,515.72,524.40,523.54,528.31,533.45,540.08,540.45,548.02,
+552.71,556.04,562.40,566.93,575.96,579.38,583.81,592.18,594.83,599.17,
+606.82,609.57,610.49,619.16,621.10,629.63,635.67,642.61,648.74,643.70,
+651.43,660.29,665.12,666.11,675.73,676.25,685.56,685.54,700.14,698.18,
+702.30,707.00,709.37,719.77,716.17,729.43,731.10,736.98,741.50,752.99,
+750.59,756.15,763.75,766.28,773.41,778.43,778.89,786.54,790.21,799.50,
+805.52,810.19,816.10,813.80,827.29,825.49,836.47,833.41,842.23,855.11,
+852.46,852.93,865.08,862.26,875.16,877.64,886.82,886.00,886.55,900.38,
+903.73,902.90,918.47,917.58,918.66,928.14,932.21,932.31,947.08,945.32,
+951.95,955.15,959.83,975.65,973.32,979.82,974.40,986.15,991.98,994.43,
+1002.71,1005.23,1013.35,1012.62,1018.43,1029.85,1037.63,1037.91,1046.11,1043.49,
+1053.82,1060.46,1065.11,1066.43,1077.45,1077.27,1074.08,1086.97,1093.74,1097.77,
+1104.68,1103.51,1113.06,1114.44,1122.19,1125.96,1135.15,1135.92,1147.44,1149.71,
+1151.78,1149.14,1166.67,1167.19,1176.84,1177.35,1184.75,1180.47,1191.18,1192.11,
+1210.35,1209.20,1219.54,1216.68,1224.51,1227.92,1223.38,1237.78,1242.35,1241.41,
+1251.34,1255.40,1259.13,1266.79,1265.75,1276.49,1285.06,1287.86,1295.54,1301.49,
+1304.93,1310.81,1310.44,1319.69,1317.38,1319.45,1338.44,1330.83,1340.15,1347.84,
+1353.88,1357.24,1360.89,1367.89,1370.21,1378.72,1386.85,1388.72,1390.94,1395.04,
+1402.47,1405.88,1419.52,1423.49,1421.99,1429.72,1426.75,1432.81,1442.54,1446.11,
+1451.82,1463.28,1465.06,1465.72,1469.80,1479.39,1480.70,1487.66,1485.26,1496.34,
+52.36,58.70,60.19,66.30,71.28,75.10,81.01,84.37,87.25,93.43,
+99.40,101.69,109.25,113.86,117.06,122.72,127.49,133.76,135.56,142.57,
+145.71,151.17,155.36,162.37,163.47,166.60,174.39,179.29,185.85,188.58,
+193.26,199.10,201.73,207.54,210.56,218.38,218.44,221.76,230.46,234.10,
+239.47,246.28,249.98,252.88,259.95,262.49,266.59,273.48,276.16,283.94,
+287.06,293.35,299.56,299.06,306.08,309.36,315.58,319.53,322.98,324.32,
+329.94,340.11,338.81,349.55,353.91,356.22,364.00,369.14,368.45,375.00,
+381.16,385.93,389.59,391.50,398.04,405.85,407.37,417.35,414.78,424.81,
+425.15,436.02,440.01,438.00,442.38,450.90,455.55,459.10,462.98,470.06,
+477.73,478.13,481.08,488.36,496.37,494.31,501.13,505.91,513.26,513.36,
+521.13,528.69,531.32,537.88,543.20,543.27,554.60,553.34,563.75,564.95,
+569.14,571.67,574.16,575.02,589.27,595.35,596.95,604.30,603.94,612.98,
+615.29,620.77,629.88,626.51,634.50,640.29,647.53,647.98,653.17,654.80,
+657.94,671.16,672.99,673.71,679.91,686.27,694.33,696.78,690.45,699.96,
+713.40,716.77,715.53,717.57,721.82,730.33,734.60,746.38,752.36,749.48,
+761.09,760.61,766.99,773.59,773.27,781.74,785.39,790.74,793.62,794.39,
+801.68,805.01,810.80,821.38,816.37,826.52,833.20,838.37,842.86,852.20,
+850.84,856.18,858.72,867.05,873.47,877.57,875.16,883.04,889.12,896.00,
+899.21,900.23,906.91,904.34,918.89,927.30,927.86,928.93,939.04,942.46,
+943.46,950.31,956.16,959.79,966.69,970.59,974.82,976.35,987.33,987.21,
+993.39,998.29,1003.61,1009.40,1009.90,1012.15,1022.42,1019.94,1031.73,1034.10,
+1037.73,1038.29,1047.52,1055.66,1058.62,1062.56,1066.61,1070.57,1076.21,1083.94,
+1082.41,1091.77,1089.12,1095.66,1096.58,1105.38,1113.90,1121.22,1120.54,1124.59,
+1131.83,1138.85,1139.99,1145.52,1153.79,1156.72,1159.16,1154.13,1171.92,1170.96,
+1177.97,1189.14,1189.28,1194.67,1203.76,1204.34,1204.80,1210.53,1217.89,1221.96,
+1220.80,1226.85,1239.63,1239.88,1250.31,1240.70,1264.77,1264.32,1263.77,1274.56,
+1275.27,1285.94,1286.56,1286.55,1287.99,1300.48,1309.49,1303.50,1310.53,1321.18,
+1322.56,1328.80,1332.45,1336.53,1338.49,1345.50,1347.02,1355.78,1362.19,1362.46,
+1369.03,1374.58,1380.53,1381.99,1388.01,1397.21,1402.94,1404.92,1405.10,1408.12,
+48.23,53.92,57.20,62.66,67.91,72.91,75.05,80.42,84.26,88.56,
+92.91,96.51,100.30,104.96,109.59,113.48,120.06,122.10,132.28,134.99,
+137.50,142.11,146.22,152.47,151.97,159.91,165.98,168.96,172.00,175.89,
+180.58,184.67,191.18,194.94,200.77,201.96,207.94,212.80,215.01,220.40,
+223.39,232.28,232.91,237.21,243.24,248.44,248.74,259.96,262.00,262.56,
+271.41,275.34,278.38,280.94,286.77,294.03,294.85,300.75,304.76,310.71,
+315.95,320.71,320.90,329.22,329.98,336.29,344.40,343.14,349.38,352.87,
+360.51,361.39,367.04,371.76,374.48,383.12,385.96,386.89,396.39,400.87,
+404.76,411.14,413.74,416.05,426.87,428.08,431.14,433.39,432.15,441.18,
+445.88,454.53,457.06,458.85,462.37,465.49,478.36,478.62,481.50,490.68,
+496.66,499.12,502.07,509.81,504.86,514.04,518.91,525.76,531.20,534.13,
+532.86,539.78,544.41,544.38,553.25,558.61,563.44,563.11,566.63,571.62,
+577.64,584.21,591.45,590.25,596.33,604.87,607.00,611.90,614.75,620.28,
+623.55,624.74,629.56,638.55,637.79,642.55,651.23,653.96,660.04,661.11,
+668.23,669.55,678.62,681.35,694.15,693.50,703.73,698.87,696.81,703.22,
+712.99,712.45,721.62,734.74,726.85,734.12,742.16,743.09,748.82,745.95,
+761.43,762.86,768.79,771.83,776.66,785.36,782.34,783.73,790.80,799.82,
+799.65,814.89,806.95,814.18,814.83,821.74,831.69,830.67,839.84,840.96,
+850.26,849.58,854.67,861.46,863.16,865.75,865.45,876.19,881.92,885.26,
+888.42,897.26,893.10,902.54,911.60,907.52,917.79,919.93,917.32,931.91,
+930.59,934.56,936.01,949.58,957.69,954.24,964.82,969.25,969.91,976.02,
+977.41,983.52,985.82,991.54,991.41,1001.80,1007.57,1011.54,1009.59,1018.53,
+1023.34,1023.83,1034.22,1040.97,1039.39,1049.42,1047.85,1050.75,1055.35,1062.84,
+1065.91,1075.67,1074.52,1077.23,1086.95,1088.98,1085.47,1096.02,1097.02,1111.49,
+1111.15,1113.21,1129.67,1127.38,1136.60,1129.21,1139.68,1154.27,1148.00,1154.95,
+1150.46,1157.60,1167.21,1167.81,1173.07,1173.75,1186.73,1186.73,1192.53,1188.99,
+1200.67,1200.31,1206.94,1211.49,1215.04,1224.19,1220.92,1226.96,1236.93,1241.21,
+1242.07,1250.59,1251.57,1253.17,1257.01,1261.07,1262.05,1266.53,1276.65,1284.21,
+1293.35,1289.33,1295.85,1297.26,1300.10,1311.61,1318.21,1320.32,1317.86,1325.01,
+44.50,50.29,54.49,59.82,63.78,64.53,71.00,72.73,79.42,84.86,
+88.14,90.17,95.72,102.56,101.65,106.65,113.94,115.55,121.12,124.85,
+127.75,132.73,139.02,141.69,144.95,148.49,152.23,156.24,164.14,166.08,
+172.68,175.56,178.65,188.15,188.93,193.69,196.32,199.43,204.56,207.64,
+209.72,216.44,218.93,225.38,228.58,230.38,237.66,243.18,245.27,248.88,
+254.48,260.65,259.20,264.87,273.18,271.93,278.96,285.25,284.51,291.22,
+293.37,301.98,302.04,308.12,311.73,316.51,319.59,323.64,327.65,330.69,
+335.75,342.09,350.16,349.49,356.91,358.57,357.20,368.49,371.07,373.48,
+377.26,379.04,385.94,392.36,394.61,394.75,403.29,407.61,410.91,415.48,
+424.68,422.25,431.20,432.09,437.18,442.46,440.93,442.60,449.13,458.22,
+461.03,461.85,469.68,472.91,483.18,482.45,489.86,488.85,493.93,498.62,
+503.91,509.06,508.64,517.94,514.69,522.62,531.72,537.14,540.45,543.04,
+541.92,550.59,551.71,558.95,564.04,564.24,568.98,574.93,577.79,583.71,
+583.40,591.49,594.13,600.03,601.16,612.90,614.16,618.66,620.02,626.23,
+620.11,633.72,633.98,640.72,648.55,651.89,652.87,660.77,666.89,672.15,
+675.77,678.16,678.87,682.35,687.66,693.08,697.87,699.43,703.97,712.54,
+713.83,712.26,722.59,724.46,732.10,731.83,735.52,737.27,747.87,753.28,
+751.51,757.91,759.80,765.83,772.52,773.07,777.71,784.00,785.12,788.66,
+790.46,797.91,802.03,807.48,817.25,816.69,816.07,831.52,829.07,831.86,
+833.22,837.85,843.08,841.58,860.88,857.13,858.73,864.55,862.75,872.08,
+877.95,880.94,881.99,884.03,892.61,899.91,903.04,904.97,909.67,914.93,
+919.65,926.54,924.44,941.14,938.48,940.92,942.32,945.22,953.59,957.33,
+958.15,964.17,966.81,974.85,981.27,983.68,989.68,990.60,997.36,1000.65,
+1000.93,1010.07,1016.89,1023.93,1020.05,1024.66,1032.02,1029.40,1033.16,1029.23,
+1038.71,1047.86,1050.88,1051.41,1059.62,1062.65,1070.03,1067.45,1077.86,1075.21,
+1084.22,1085.95,1093.07,1102.72,1101.46,1101.19,1109.95,1112.46,1120.27,1131.98,
+1123.17,1135.54,1136.27,1142.13,1142.30,1149.66,1152.21,1162.10,1154.78,1168.88,
+1168.47,1179.04,1166.73,1183.19,1181.99,1186.91,1193.53,1194.66,1207.14,1210.01,
+1213.77,1216.89,1219.85,1226.21,1222.51,1231.37,1239.48,1239.00,1252.49,1249.71,
+42.69,46.11,51.06,54.30,57.79,63.60,68.06,72.40,75.50,77.71,
+83.11,86.99,89.71,92.02,97.00,102.28,103.82,107.62,112.87,117.96,
+119.92,124.16,128.44,132.79,137.45,141.07,142.01,148.42,149.19,159.07,
+159.23,166.17,170.10,174.37,174.04,181.69,184.34,185.54,190.43,190.56,
+199.38,206.53,205.90,209.45,216.93,221.36,223.30,228.38,230.94,234.17,
+235.72,241.37,246.51,251.01,251.61,259.84,263.21,260.65,268.65,274.73,
+279.92,279.61,282.89,291.09,293.24,295.56,301.65,306.76,310.18,311.43,
+316.51,319.44,326.25,326.76,334.87,334.33,339.31,346.41,348.63,354.36,
+355.70,362.16,361.49,367.08,367.30,374.50,378.93,381.10,391.60,390.80,
+396.16,400.60,405.38,406.92,413.30,416.75,414.86,422.61,427.34,428.03,
+437.65,435.98,442.66,447.21,453.00,458.58,461.81,457.20,462.55,466.92,
+470.31,476.55,480.52,484.47,487.90,497.93,495.34,501.05,504.14,508.94,
+510.17,514.74,518.90,527.21,526.32,531.73,542.75,537.78,541.48,548.82,
+549.30,560.13,563.93,564.36,571.25,567.24,573.03,579.93,576.71,584.69,
+590.65,594.88,595.55,594.78,607.63,608.80,610.90,617.90,620.69,627.56,
+625.67,635.35,635.68,640.92,639.36,647.05,657.49,654.88,662.29,658.81,
+665.68,671.62,675.00,678.07,684.17,686.96,688.70,692.66,697.68,699.57,
+710.03,713.10,713.90,723.87,720.99,727.57,733.16,732.16,739.17,746.23,
+747.06,749.55,751.63,761.47,763.84,769.39,769.83,773.67,777.32,777.39,
+788.09,790.78,797.19,795.76,798.45,803.09,809.35,808.80,813.80,821.58,
+832.59,832.78,827.35,835.26,845.16,843.75,847.95,859.66,851.78,861.26,
+862.12,870.50,877.37,876.00,874.81,888.02,889.00,890.96,897.78,907.38,
+896.66,902.43,908.94,916.06,926.22,924.45,920.47,929.68,931.35,932.38,
+942.93,946.57,946.06,954.26,963.05,967.90,966.59,967.65,973.29,971.42,
+981.71,975.79,996.50,990.70,997.36,1003.77,1002.06,1010.01,1013.98,1015.25,
+1024.59,1022.59,1025.87,1033.79,1036.05,1041.93,1048.64,1047.99,1053.48,1047.83,
+1060.51,1066.45,1073.49,1071.61,1066.99,1082.88,1076.98,1092.53,1091.69,1094.69,
+1094.83,1098.26,1110.80,1103.23,1110.03,1110.08,1122.04,1121.42,1126.32,1133.02,
+1133.65,1143.05,1148.78,1147.83,1149.09,1156.07,1162.66,1162.90,1173.08,1177.02,
+39.71,45.15,48.29,52.58,55.05,58.25,63.92,66.55,69.12,73.16,
+77.79,81.76,85.14,86.94,92.87,93.54,100.30,101.63,104.51,109.17,
+114.94,117.74,121.40,123.68,129.81,130.12,137.42,142.78,142.69,143.44,
+150.25,156.55,156.16,161.02,162.11,168.33,174.90,173.93,179.90,186.06,
+188.10,190.64,198.55,200.73,201.76,200.53,210.27,214.12,212.79,222.16,
+226.60,228.13,231.88,233.14,239.07,242.72,247.87,251.35,250.81,255.78,
+258.64,262.31,269.81,271.05,275.05,283.63,279.86,284.03,291.14,294.13,
+295.30,301.98,305.53,304.39,312.23,316.13,314.61,323.29,325.84,331.25,
+334.98,338.24,341.72,347.76,351.80,353.02,355.06,355.42,361.14,365.12,
+374.53,376.58,380.65,379.83,389.19,385.58,389.26,395.20,401.08,402.68,
+403.83,405.89,415.32,423.09,421.71,425.15,425.74,438.64,435.56,439.76,
+443.20,448.86,449.50,453.79,459.58,464.62,467.78,472.53,474.11,479.03,
+482.02,480.86,492.25,493.87,494.27,506.08,500.39,506.17,511.34,513.66,
+517.51,519.30,522.01,529.43,533.76,536.47,546.19,539.81,547.63,551.64,
+553.56,555.00,563.13,568.52,563.26,573.12,574.50,580.16,584.58,586.45,
+590.80,599.32,598.68,606.33,601.20,612.59,611.98,616.98,619.93,620.23,
+625.33,630.83,629.95,636.89,645.99,645.27,650.33,652.49,664.02,656.09,
+664.91,666.08,673.50,674.97,677.82,682.59,683.70,693.95,696.02,702.74,
+699.23,708.66,705.59,709.74,721.33,717.59,715.04,725.96,728.88,728.97,
+732.26,746.11,742.35,746.61,748.65,759.23,754.55,764.91,764.73,766.55,
+775.28,774.23,781.01,785.68,787.80,787.62,800.64,793.54,802.00,806.92,
+811.01,815.64,814.23,823.71,823.89,828.65,829.04,840.42,842.64,851.11,
+846.23,853.11,858.79,863.60,864.01,865.38,874.74,872.03,879.80,878.89,
+886.11,884.25,883.69,899.49,901.68,892.64,913.14,913.99,912.72,918.73,
+919.99,926.72,928.94,928.15,936.39,936.95,938.21,951.72,956.05,957.59,
+956.12,962.96,964.47,971.26,970.80,978.17,978.95,985.89,981.94,994.52,
+994.26,1001.67,999.16,1012.81,1014.25,1011.37,1014.42,1020.97,1023.55,1031.43,
+1023.39,1035.63,1035.12,1041.41,1047.22,1051.21,1048.51,1053.97,1058.37,1058.14,
+1068.97,1067.17,1075.89,1076.04,1076.72,1084.26,1080.79,1090.04,1090.34,1103.81,
+38.39,41.17,45.09,46.95,49.66,54.85,56.53,63.51,65.06,67.55,
+72.12,74.36,80.42,83.83,84.75,89.42,92.56,96.81,100.41,102.58,
+105.70,109.53,113.51,116.99,120.43,121.65,125.11,127.46,132.15,137.99,
+141.95,144.35,145.79,150.16,155.56,156.69,161.77,164.52,169.41,173.34,
+174.58,179.28,183.09,187.64,186.78,191.61,193.14,199.60,208.72,208.75,
+206.91,210.58,214.25,219.95,223.08,226.80,230.09,235.26,236.07,242.79,
+246.67,249.81,253.45,253.15,257.19,263.39,263.18,267.87,270.25,272.03,
+274.60,283.35,282.85,292.80,291.61,292.01,296.41,301.79,307.03,309.93,
+311.87,315.06,318.30,321.11,324.23,331.75,331.89,341.54,344.86,344.74,
+347.20,355.41,353.33,360.74,361.39,363.17,372.14,369.16,372.52,378.63,
+382.32,380.35,388.94,393.32,398.93,405.77,400.48,406.95,408.43,411.06,
+414.10,421.37,422.60,432.23,430.26,431.25,436.16,440.37,444.60,436.96,
+449.51,457.40,455.56,456.72,469.26,470.03,469.68,471.97,479.92,476.81,
+476.97,488.04,488.08,496.14,499.06,506.34,506.75,507.62,512.87,518.69,
+518.89,522.61,524.96,529.93,531.22,539.52,539.61,545.41,547.16,550.71,
+551.87,558.51,561.96,563.98,566.72,568.39,571.06,573.54,581.90,583.86,
+590.23,593.57,594.57,600.79,603.14,603.03,609.27,613.68,618.94,620.73,
+621.09,631.60,626.79,632.34,635.48,637.21,643.04,647.01,651.76,651.51,
+660.67,659.75,663.34,665.49,671.38,676.59,673.98,678.69,680.10,683.52,
+688.57,694.97,698.94,701.16,701.57,703.57,713.67,721.12,718.55,722.69,
+720.38,732.91,730.15,733.09,737.72,737.70,743.33,751.23,754.20,749.75,
+760.54,767.11,766.15,769.08,769.26,785.84,776.96,782.28,785.03,796.13,
+791.07,793.61,807.33,804.04,810.68,820.57,820.97,814.61,823.98,822.24,
+833.35,835.06,838.13,834.83,841.54,843.99,845.85,849.92,860.17,866.18,
+857.34,874.05,870.44,869.32,877.03,880.94,889.72,885.60,882.84,895.11,
+895.88,907.47,897.38,907.77,905.75,909.83,915.53,914.23,921.69,936.81,
+932.06,935.39,936.73,946.20,945.09,944.46,949.34,963.81,958.10,966.72,
+960.80,981.89,966.02,967.98,985.24,988.46,990.03,987.45,991.35,989.58,
+1009.85,1005.10,1008.76,1009.59,1008.11,1019.53,1013.67,1027.63,1033.90,1027.23,
+89.56,97.78,105.24,112.76,120.78,129.73,138.14,145.61,153.91,160.70,
+169.26,177.05,183.57,192.76,202.54,208.68,217.66,225.15,233.22,241.24,
+248.24,257.75,266.27,273.86,281.04,289.34,296.03,303.91,312.37,320.57,
+327.29,336.96,345.18,353.77,360.69,368.31,378.20,385.22,394.67,399.46,
+410.41,418.13,423.28,434.43,441.29,449.01,456.91,465.57,471.18,479.52,
+491.28,497.75,505.31,513.11,519.63,528.63,537.54,544.63,553.13,559.41,
+568.93,576.42,585.28,593.30,600.16,609.62,617.69,625.81,634.06,640.99,
+647.41,656.34,665.18,671.14,679.74,689.19,697.59,705.31,713.25,722.70,
+727.88,736.62,743.60,752.64,763.94,768.42,777.00,781.22,793.20,801.75,
+808.98,815.50,824.03,832.09,841.40,848.14,856.19,863.37,870.80,882.38,
+888.39,896.88,904.77,914.07,916.43,928.08,935.64,945.26,950.85,962.35,
+972.63,976.71,985.45,993.22,999.13,1009.74,1017.90,1024.03,1034.45,1041.12,
+1047.59,1058.77,1063.21,1070.59,1082.28,1088.31,1097.29,1104.49,1113.96,1120.02,
+1127.81,1135.79,1145.41,1152.48,1162.25,1167.15,1174.99,1183.23,1189.67,1198.26,
+1205.56,1217.56,1223.96,1235.53,1240.16,1246.26,1258.17,1264.08,1274.10,1275.43,
+1289.80,1295.90,1304.74,1315.90,1319.64,1326.58,1338.16,1344.98,1353.14,1357.56,
+1369.35,1373.43,1382.89,1393.18,1400.51,1408.36,1417.47,1425.38,1432.79,1439.46,
+1446.01,1456.66,1466.51,1470.80,1479.06,1487.46,1496.71,1505.24,1511.35,1522.26,
+1528.80,1538.33,1542.43,1552.65,1562.03,1569.06,1575.20,1578.58,1595.28,1600.91,
+1608.19,1618.79,1621.90,1631.29,1638.53,1647.82,1653.44,1665.42,1669.89,1679.75,
+1686.35,1696.21,1701.79,1712.07,1722.16,1726.18,1735.37,1743.90,1751.45,1760.33,
+1765.44,1777.30,1781.87,1788.21,1800.34,1811.41,1815.66,1827.12,1833.89,1838.64,
+1849.46,1852.01,1861.22,1872.79,1878.84,1890.32,1898.66,1906.10,1912.73,1922.59,
+1929.64,1934.53,1946.41,1955.31,1959.78,1967.19,1975.16,1985.84,1990.99,1998.95,
+2006.64,2014.52,2022.07,2030.66,2039.26,2047.14,2054.11,2060.25,2070.46,2081.14,
+2089.12,2091.20,2106.29,2113.02,2119.65,2132.09,2137.37,2141.86,2154.07,2159.73,
+2166.58,2173.40,2187.82,2193.54,2197.19,2203.84,2213.58,2224.66,2228.00,2242.65,
+2246.30,2255.42,2261.80,2269.74,2280.62,2289.14,2293.84,2305.18,2310.47,2319.64,
+2327.27,2336.51,2338.18,2350.86,2355.75,2369.83,2375.16,2382.94,2390.75,2399.39,
+87.15,94.49,100.99,109.15,116.34,124.61,131.78,137.98,146.37,154.24,
+162.54,170.70,178.65,186.38,193.36,201.09,208.43,215.79,224.06,232.11,
+239.59,247.11,255.09,263.07,272.10,277.94,286.11,293.75,301.45,310.69,
+315.93,324.99,332.88,340.10,345.20,356.42,362.44,369.90,379.37,386.63,
+395.50,401.95,409.59,415.57,424.47,431.24,440.43,447.55,453.99,463.46,
+470.25,478.92,485.78,494.31,500.84,508.01,516.49,524.70,532.86,539.48,
+546.98,554.20,562.55,570.58,578.01,585.92,594.42,601.50,610.47,616.71,
+624.85,634.57,640.94,645.22,653.65,662.38,669.81,677.30,685.78,693.20,
+701.14,711.14,717.00,723.82,734.28,743.93,746.80,755.33,764.53,770.53,
+779.35,786.62,795.42,803.52,808.33,819.33,824.78,836.00,838.60,848.20,
+854.55,866.15,869.67,877.68,885.38,893.03,903.63,910.89,917.98,923.56,
+930.22,940.59,945.12,956.21,963.94,971.11,977.77,987.58,996.32,1000.61,
+1010.83,1019.64,1024.93,1036.27,1042.34,1045.12,1056.61,1064.18,1072.74,1077.65,
+1086.57,1093.58,1100.60,1108.03,1117.04,1126.19,1134.61,1142.09,1145.85,1156.69,
+1165.51,1172.60,1175.24,1188.07,1193.02,1198.85,1213.17,1217.06,1226.41,1230.73,
+1238.92,1243.56,1258.22,1266.54,1272.40,1278.61,1286.30,1293.93,1303.53,1312.24,
+1317.37,1323.93,1333.81,1340.03,1348.61,1352.48,1362.76,1371.74,1378.80,1390.77,
+1394.66,1401.48,1408.15,1417.23,1424.51,1431.87,1438.84,1446.96,1458.29,1466.54,
+1470.06,1479.82,1486.23,1493.57,1502.25,1505.64,1518.31,1522.42,1531.36,1542.05,
+1546.92,1554.25,1562.56,1571.21,1580.66,1585.29,1595.38,1604.05,1609.03,1621.70,
+1628.83,1631.09,1640.59,1650.20,1655.61,1668.71,1671.45,1682.55,1687.66,1694.50,
+1702.95,1710.69,1715.85,1728.08,1734.22,1740.83,1750.39,1754.85,1765.97,1774.52,
+1779.58,1786.83,1797.77,1801.40,1811.15,1817.72,1825.90,1829.22,1840.64,1849.46,
+1862.08,1862.62,1871.00,1879.32,1886.99,1894.86,1898.32,1907.04,1919.39,1927.61,
+1935.63,1942.00,1947.46,1958.39,1963.40,1972.28,1976.31,1989.64,1992.43,2002.64,
+2011.40,2017.08,2022.71,2034.03,2042.32,2045.84,2054.59,2065.42,2068.58,2079.23,
+2084.63,2094.07,2106.77,2110.89,2116.01,2122.98,2132.65,2142.26,2153.12,2155.55,
+2159.38,2170.36,2181.48,2192.59,2193.96,2204.68,2211.46,2217.68,2227.51,2235.09,
+2240.91,2247.51,2257.39,2263.03,2273.90,2283.91,2282.84,2293.93,2304.58,2311.15,
+81.41,90.77,97.35,104.89,110.75,118.83,127.04,134.04,140.95,148.87,
+156.17,163.24,170.01,179.18,186.58,193.43,200.33,207.99,215.82,223.69,
+230.17,239.22,246.37,253.16,259.87,267.33,273.31,282.94,287.50,295.99,
+305.43,311.16,318.43,328.28,335.56,341.42,347.46,356.37,362.55,371.51,
+381.36,387.46,393.75,398.50,407.97,416.63,419.52,429.86,437.75,443.79,
+453.61,458.59,466.17,476.27,480.64,488.76,499.70,503.27,509.31,519.76,
+525.19,532.58,541.18,546.00,558.27,565.76,570.98,577.67,586.64,592.21,
+596.83,609.82,613.76,622.79,629.52,636.98,645.29,653.90,657.35,665.66,
+675.27,682.49,690.98,695.80,701.64,712.02,717.22,727.63,734.84,739.25,
+745.23,754.25,761.00,771.63,777.37,785.21,796.38,800.26,805.24,814.01,
+823.02,831.79,833.59,844.58,850.54,858.60,863.77,875.79,880.37,893.09,
+895.38,902.32,909.40,917.09,922.74,933.72,937.79,948.17,951.55,961.59,
+972.87,979.14,984.59,991.69,1000.47,1009.22,1014.09,1023.09,1029.09,1034.90,
+1043.36,1052.00,1058.39,1065.32,1076.84,1083.38,1091.07,1095.50,1102.32,1112.27,
+1119.47,1124.07,1130.65,1139.81,1144.33,1153.83,1162.90,1169.18,1175.70,1185.78,
+1188.76,1195.77,1205.22,1216.04,1219.30,1224.65,1239.53,1239.96,1250.90,1260.37,
+1265.90,1272.92,1278.22,1289.45,1292.27,1304.45,1308.08,1315.75,1323.00,1333.63,
+1341.90,1345.15,1356.05,1363.63,1370.08,1378.50,1385.90,1392.96,1399.36,1406.86,
+1415.00,1421.17,1431.32,1440.49,1440.97,1446.37,1458.48,1466.74,1472.26,1477.87,
+1487.83,1491.69,1501.93,1511.70,1519.15,1523.58,1533.29,1536.69,1545.09,1554.16,
+1560.46,1569.34,1574.44,1584.63,1591.49,1596.06,1605.96,1613.36,1620.95,1633.83,
+1632.64,1642.66,1648.77,1656.71,1666.31,1669.90,1682.91,1686.03,1698.13,1701.08,
+1713.44,1717.31,1723.65,1734.00,1739.41,1747.31,1755.82,1763.22,1770.11,1779.46,
+1785.03,1788.27,1800.92,1807.64,1809.88,1817.77,1826.71,1841.82,1843.40,1855.05,
+1852.25,1870.39,1865.73,1879.41,1887.71,1889.68,1901.29,1912.50,1911.59,1921.12,
+1929.21,1933.63,1948.74,1954.76,1963.58,1969.59,1981.10,1984.79,1990.92,1998.89,
+2008.49,2010.28,2018.44,2029.65,2034.37,2046.76,2048.01,2054.17,2064.77,2074.87,
+2078.21,2082.70,2096.12,2103.02,2108.40,2114.92,2124.87,2123.97,2137.26,2146.29,
+2154.44,2157.87,2169.17,2177.51,2185.86,2187.14,2199.18,2197.57,2217.61,2216.38,
+80.39,85.75,94.34,100.62,107.78,113.96,120.66,129.59,136.14,142.54,
+149.93,157.15,163.92,170.52,178.29,185.56,192.29,201.83,206.91,213.93,
+220.03,226.13,235.64,241.68,249.65,257.25,263.48,271.61,277.65,285.62,
+291.12,298.51,306.80,312.11,322.73,327.65,337.07,343.03,348.66,355.35,
+364.25,369.09,377.07,385.37,389.81,395.56,405.19,413.51,417.65,426.96,
+432.00,441.23,446.07,455.34,463.07,469.58,478.47,484.20,490.12,498.19,
+503.45,512.29,521.21,527.32,532.02,539.21,549.73,555.45,559.84,569.39,
+579.97,582.02,592.26,596.64,605.79,608.82,617.28,626.38,629.14,637.50,
+647.66,652.29,659.38,668.15,673.96,681.95,689.21,696.88,700.04,707.13,
+718.31,723.21,731.21,743.11,748.60,752.57,759.54,770.35,777.39,784.76,
+788.88,795.33,801.48,810.32,816.91,823.04,831.18,835.89,843.61,854.04,
+862.51,866.42,873.03,878.62,888.65,895.91,902.91,905.25,918.79,924.29,
+928.94,938.94,946.54,950.14,959.98,967.62,970.32,979.74,985.85,993.23,
+1002.29,1009.69,1016.20,1022.50,1027.59,1037.64,1043.22,1049.81,1053.42,1064.86,
+1073.43,1080.23,1084.61,1093.79,1101.76,1109.11,1114.46,1123.49,1128.29,1138.77,
+1143.67,1146.47,1159.64,1164.14,1173.31,1177.51,1189.49,1199.62,1201.58,1204.41,
+1212.97,1222.16,1229.33,1238.70,1242.47,1251.76,1254.79,1261.08,1271.26,1279.22,
+1278.31,1291.08,1302.55,1310.50,1307.44,1316.40,1326.06,1335.03,1342.81,1343.60,
+1354.99,1360.34,1369.28,1376.86,1383.48,1391.22,1397.32,1406.73,1413.08,1418.43,
+1428.67,1435.42,1439.08,1449.56,1455.49,1462.45,1468.76,1474.10,1483.53,1491.68,
+1497.25,1502.99,1516.25,1519.45,1529.73,1529.99,1537.06,1546.14,1559.20,1564.04,
+1569.62,1576.99,1581.40,1586.48,1602.82,1606.22,1609.07,1624.15,1624.76,1630.95,
+1641.14,1645.22,1656.02,1661.87,1669.24,1678.61,1680.52,1690.43,1699.61,1704.58,
+1713.52,1720.14,1730.06,1734.15,1737.65,1746.27,1757.90,1760.74,1767.11,1774.84,
+1780.13,1790.61,1794.92,1802.11,1811.83,1820.18,1823.04,1834.30,1840.37,1849.57,
+1853.95,1863.14,1863.80,1873.94,1876.82,1893.13,1894.12,1903.80,1909.91,1919.60,
+1921.66,1934.77,1937.45,1944.11,1951.25,1958.13,1961.69,1978.84,1976.33,1988.41,
+1994.57,1998.88,2007.35,2013.50,2027.88,2028.28,2039.45,2047.18,2056.13,2057.84,
+2068.18,2068.04,2083.88,2092.12,2092.54,2098.52,2105.90,2111.27,2122.06,2136.28,
+75.78,83.16,88.77,96.98,103.07,110.23,117.06,123.93,128.38,136.54,
+143.78,150.27,156.78,164.05,170.13,179.33,183.26,191.77,198.07,205.43,
+210.58,218.13,226.71,231.28,238.72,246.52,251.26,259.75,266.13,271.75,
+278.81,285.32,293.61,298.54,308.09,313.27,320.41,325.30,334.18,341.54,
+348.00,353.18,361.10,366.89,371.50,381.64,387.05,396.71,400.52,408.93,
+413.73,424.89,429.36,434.84,441.14,447.13,456.35,461.20,466.80,476.50,
+485.17,487.77,495.33,501.27,510.28,517.72,522.44,529.75,536.07,545.92,
+550.37,556.79,563.77,570.04,578.75,584.99,596.19,599.18,608.49,609.37,
+616.90,626.85,629.01,639.39,646.10,652.37,660.44,668.85,672.50,682.12,
+688.09,693.18,700.05,707.08,718.28,719.98,727.26,735.59,740.62,746.87,
+755.59,758.87,772.35,775.48,781.99,788.01,793.93,804.39,809.31,816.62,
+823.84,831.34,837.09,843.05,850.69,856.33,863.40,876.73,876.46,884.27,
+890.07,900.44,902.09,911.98,917.92,923.75,931.28,941.12,942.10,950.65,
+953.46,970.93,971.28,980.20,986.59,989.55,998.01,1003.36,1014.01,1025.27,
+1025.18,1037.69,1038.37,1046.26,1055.18,1061.51,1066.57,1072.01,1083.18,1090.03,
+1091.99,1099.18,1108.93,1110.48,1121.00,1129.52,1138.31,1140.67,1149.94,1157.38,
+1165.94,1174.16,1173.69,1181.39,1189.02,1201.63,1200.14,1210.57,1214.33,1226.78,
+1232.19,1239.30,1245.23,1253.24,1259.86,1268.54,1266.82,1274.94,1286.09,1290.09,
+1299.77,1307.17,1311.47,1319.14,1331.11,1332.30,1343.08,1340.20,1352.26,1356.14,
+1366.93,1378.52,1377.73,1385.14,1395.75,1398.79,1404.82,1416.02,1422.62,1426.69,
+1435.20,1439.05,1450.50,1453.45,1462.43,1469.00,1472.11,1485.85,1485.73,1496.96,
+1504.57,1510.14,1516.21,1521.00,1527.73,1537.55,1545.94,1551.07,1556.55,1562.74,
+1573.05,1575.53,1587.13,1588.27,1599.09,1610.14,1609.41,1617.80,1630.12,1632.45,
+1639.59,1644.14,1655.58,1660.88,1666.07,1671.24,1677.44,1682.48,1689.50,1700.38,
+1706.28,1710.12,1718.74,1722.77,1739.58,1736.82,1745.91,1747.59,1762.42,1760.62,
+1779.10,1771.68,1783.95,1790.34,1800.77,1808.01,1812.97,1825.77,1829.94,1835.88,
+1843.01,1851.38,1847.18,1864.07,1868.76,1874.91,1887.54,1888.81,1893.18,1902.59,
+1912.61,1915.77,1923.54,1931.46,1938.06,1942.54,1955.05,1951.37,1966.72,1978.60,
+1972.88,1990.03,1992.23,1992.45,2004.92,2017.13,2021.62,2024.61,2035.01,2039.01,
+71.37,78.09,84.44,91.59,99.37,105.29,111.44,116.17,126.08,130.54,
+137.45,143.02,151.73,156.88,161.83,169.88,178.47,184.11,188.79,196.14,
+202.96,207.90,213.77,222.32,227.41,234.40,242.29,249.00,254.47,259.95,
+268.36,274.82,280.48,285.57,293.32,298.50,307.07,310.15,320.05,326.31,
+333.84,338.22,346.94,349.65,358.18,359.97,371.96,377.44,383.95,391.65,
+399.66,406.15,410.00,418.67,417.80,428.02,436.13,444.82,447.48,454.24,
+457.60,468.36,476.06,481.87,487.30,496.99,500.12,502.82,512.25,522.38,
+524.71,532.77,541.86,551.39,549.34,559.83,564.62,569.19,578.90,587.09,
+587.54,598.89,605.51,611.08,621.98,625.61,630.66,636.56,643.02,650.31,
+657.61,664.98,671.51,678.43,682.65,691.99,695.31,702.91,706.87,713.15,
+724.55,727.03,735.68,735.81,749.07,754.62,763.20,770.42,774.93,780.43,
+788.18,795.79,799.81,808.32,810.51,818.45,823.40,830.67,840.90,848.33,
+856.49,861.18,867.33,871.21,876.34,884.85,886.66,891.94,907.22,909.77,
+916.75,923.12,933.23,942.29,946.43,949.95,952.74,960.53,969.09,972.30,
+981.49,989.22,993.23,1000.59,1008.06,1015.20,1020.19,1029.58,1035.43,1040.75,
+1047.74,1054.51,1056.13,1064.03,1071.28,1075.60,1089.98,1092.07,1097.62,1109.30,
+1117.61,1120.73,1122.90,1130.18,1136.14,1147.24,1151.01,1158.40,1164.88,1164.31,
+1170.49,1184.02,1188.21,1196.08,1203.32,1208.59,1212.31,1221.44,1228.21,1233.55,
+1240.93,1242.40,1250.48,1262.48,1265.53,1278.82,1284.64,1284.22,1290.32,1306.22,
+1309.17,1313.84,1320.60,1327.30,1335.73,1336.96,1344.67,1351.03,1359.14,1368.97,
+1374.64,1382.37,1387.82,1389.23,1395.45,1404.41,1408.29,1415.96,1423.60,1430.79,
+1435.70,1444.78,1453.13,1452.59,1457.10,1468.21,1470.82,1484.13,1484.99,1494.90,
+1500.75,1510.69,1517.30,1520.62,1527.72,1534.64,1540.93,1552.27,1548.40,1564.58,
+1569.41,1568.66,1575.07,1583.41,1589.91,1592.81,1605.18,1615.81,1616.02,1629.56,
+1628.66,1636.88,1649.02,1648.16,1651.61,1663.09,1672.35,1674.25,1687.87,1691.24,
+1693.47,1704.67,1707.59,1715.22,1721.30,1727.21,1737.52,1744.16,1747.97,1751.95,
+1762.09,1763.60,1777.64,1782.07,1786.59,1799.68,1800.55,1803.90,1816.97,1824.53,
+1824.38,1835.82,1838.71,1844.48,1850.47,1855.71,1866.47,1875.35,1877.26,1883.68,
+1890.71,1900.32,1903.82,1905.53,1919.46,1920.38,1930.56,1938.77,1945.05,1946.76,
+68.18,74.23,82.05,86.97,93.47,100.58,104.41,112.67,118.30,124.63,
+131.50,137.37,143.57,151.32,153.68,161.44,168.47,174.32,182.13,186.57,
+194.16,198.84,204.49,211.90,217.69,221.27,230.88,236.41,241.87,248.06,
+254.89,263.35,266.30,274.45,279.38,286.27,289.76,298.13,306.23,311.91,
+318.36,325.19,328.97,335.00,342.28,348.69,355.29,362.24,365.18,374.93,
+378.80,384.39,392.44,396.87,406.56,410.24,418.68,422.90,428.66,435.76,
+440.81,448.68,452.95,457.37,466.24,473.93,477.64,486.62,489.50,498.08,
+503.01,512.02,515.03,521.55,527.16,535.88,534.42,546.68,549.02,560.35,
+565.53,569.49,576.00,583.88,587.41,601.00,604.76,607.27,617.43,619.93,
+628.00,637.27,644.02,647.77,652.50,659.29,665.74,670.13,679.03,681.72,
+690.73,698.59,702.11,704.12,716.03,723.15,727.09,730.67,738.83,748.34,
+756.50,758.51,766.37,768.37,775.06,787.80,787.03,792.27,803.30,806.12,
+814.03,820.98,827.52,833.10,838.08,846.23,856.70,857.06,865.71,870.62,
+874.09,881.87,889.82,891.88,902.43,905.14,912.89,918.65,924.23,928.94,
+936.11,945.56,948.01,953.68,958.41,969.53,968.56,981.53,988.33,994.40,
+999.79,1004.40,1013.54,1019.01,1028.40,1026.73,1038.54,1044.45,1049.72,1056.07,
+1060.84,1070.15,1079.14,1073.53,1083.88,1097.53,1098.71,1106.08,1106.06,1118.58,
+1127.65,1127.67,1134.48,1141.65,1149.18,1154.94,1158.01,1166.27,1168.88,1176.30,
+1187.87,1198.41,1197.22,1206.15,1211.07,1212.94,1218.39,1229.11,1237.24,1239.95,
+1245.58,1249.21,1256.68,1270.57,1275.24,1273.72,1279.48,1288.37,1297.30,1299.21,
+1312.83,1315.85,1320.63,1321.75,1329.65,1342.00,1350.97,1353.19,1356.40,1358.63,
+1368.23,1381.63,1388.03,1389.56,1389.44,1404.45,1409.95,1415.99,1424.21,1426.78,
+1431.23,1444.88,1444.67,1446.77,1460.00,1459.44,1471.61,1476.43,1484.86,1489.17,
+1494.66,1499.29,1511.16,1516.99,1523.66,1529.24,1535.75,1536.98,1544.65,1550.29,
+1556.51,1563.73,1567.32,1576.15,1578.97,1588.48,1594.65,1598.15,1601.50,1614.42,
+1626.61,1625.57,1635.27,1632.93,1647.42,1647.61,1655.04,1659.72,1671.94,1672.23,
+1678.58,1692.00,1698.17,1700.55,1703.86,1705.61,1719.38,1722.36,1732.39,1739.15,
+1745.55,1752.58,1760.93,1763.49,1765.89,1773.03,1782.59,1788.86,1793.54,1798.22,
+1804.15,1814.31,1821.71,1818.86,1828.64,1835.85,1844.36,1851.23,1858.69,1856.82,
+66.64,70.24,77.58,81.49,88.75,95.59,100.50,106.34,113.04,118.04,
+125.21,132.23,137.20,141.05,147.84,154.56,158.76,167.25,173.09,178.88,
+185.05,190.93,195.52,202.35,209.69,214.99,222.13,227.07,233.06,237.26,
+244.28,248.30,255.05,260.87,269.60,276.29,279.18,282.54,293.42,296.78,
+301.42,309.15,314.47,319.77,324.88,333.09,340.36,343.38,351.30,358.89,
+361.25,371.12,375.34,375.36,384.19,389.07,398.19,400.77,410.85,414.29,
+422.20,428.30,432.49,436.88,445.88,446.71,458.86,462.56,467.32,474.81,
+480.42,487.33,490.13,497.91,506.42,508.58,510.88,520.87,526.91,529.81,
+537.79,546.55,546.71,557.21,561.06,570.58,578.10,578.39,585.81,591.11,
+601.96,604.56,609.81,613.74,622.32,626.53,627.37,639.10,644.76,654.50,
+657.94,662.02,669.23,673.99,682.34,689.10,694.58,699.02,700.35,708.67,
+718.81,722.98,726.12,736.26,737.32,744.30,752.91,758.00,765.60,773.35,
+773.18,779.20,788.08,791.17,794.64,803.77,816.95,819.16,819.13,825.35,
+834.89,839.72,847.95,852.43,860.72,863.22,871.11,874.59,885.64,885.23,
+894.98,896.29,907.48,908.45,919.29,925.47,931.26,933.56,938.49,948.70,
+949.49,962.16,967.39,969.34,973.36,989.26,989.21,991.02,995.67,1010.26,
+1011.62,1016.88,1025.18,1026.77,1037.25,1037.27,1049.61,1056.11,1060.83,1064.60,
+1072.48,1077.85,1083.43,1086.55,1093.41,1097.62,1105.84,1112.04,1119.37,1119.49,
+1125.15,1140.10,1150.18,1145.41,1153.68,1164.37,1167.14,1168.34,1177.42,1180.88,
+1187.89,1194.33,1200.69,1200.61,1207.66,1215.76,1225.86,1233.37,1237.89,1247.84,
+1249.71,1251.14,1262.24,1260.29,1272.03,1281.10,1284.95,1287.44,1292.71,1304.98,
+1310.28,1313.69,1328.97,1328.10,1332.26,1341.24,1345.30,1347.99,1349.11,1358.66,
+1361.63,1368.81,1377.25,1387.26,1399.04,1400.72,1401.50,1409.57,1410.31,1412.71,
+1427.88,1425.21,1435.04,1446.02,1448.43,1449.66,1456.90,1466.93,1473.58,1471.02,
+1484.65,1487.53,1506.12,1506.95,1505.65,1517.82,1519.13,1536.39,1530.14,1542.02,
+1541.46,1558.12,1551.12,1564.87,1567.83,1574.57,1578.40,1582.61,1593.81,1597.00,
+1608.45,1611.36,1623.38,1619.19,1621.03,1629.63,1641.22,1643.90,1652.79,1656.34,
+1660.32,1672.76,1676.03,1678.99,1690.15,1694.02,1693.05,1705.18,1711.32,1717.44,
+1730.92,1727.49,1728.51,1740.83,1743.72,1746.56,1763.14,1757.64,1768.65,1770.07,
+62.26,68.25,72.80,79.81,84.58,92.09,95.56,103.62,109.07,112.75,
+118.00,126.13,129.40,137.51,142.14,145.64,151.69,158.99,164.22,170.03,
+174.10,181.18,187.48,190.95,196.44,202.96,210.69,214.20,221.29,226.56,
+230.97,236.75,241.85,250.07,252.85,259.55,266.65,273.42,275.37,282.66,
+287.14,292.04,300.54,302.77,309.84,311.54,320.81,326.80,334.16,335.67,
+341.76,351.63,352.05,359.62,364.89,375.84,377.32,385.86,390.57,398.01,
+401.97,407.26,414.40,415.49,419.26,427.37,436.90,439.70,445.28,450.81,
+457.54,462.67,466.18,471.92,479.37,488.99,493.15,496.47,500.28,507.40,
+513.28,517.91,527.69,531.56,535.71,537.83,545.56,558.05,554.65,567.68,
+570.27,572.38,580.85,590.50,588.73,596.65,603.84,601.91,616.93,619.17,
+628.76,633.96,634.59,642.11,651.13,659.97,659.89,662.27,674.08,678.34,
+680.90,686.85,694.20,699.64,706.01,713.70,713.21,719.02,726.50,733.57,
+735.25,744.75,746.97,752.41,761.10,772.24,775.49,780.87,785.10,790.57,
+797.97,803.70,808.26,815.26,817.12,821.74,832.18,833.53,836.08,852.27,
+851.54,856.04,862.51,870.01,877.39,881.77,885.91,890.17,898.11,904.10,
+904.84,909.14,917.49,928.51,935.14,933.56,943.09,942.85,957.69,960.62,
+963.27,966.84,974.84,977.46,991.36,993.86,999.11,998.09,1007.78,1012.87,
+1013.86,1028.09,1029.62,1038.10,1042.58,1046.83,1053.35,1064.80,1065.70,1070.34,
+1073.52,1080.28,1084.64,1090.25,1099.35,1105.53,1111.55,1115.21,1117.09,1122.83,
+1131.29,1139.75,1145.82,1150.07,1156.19,1156.20,1169.33,1168.73,1171.26,1181.52,
+1188.76,1201.55,1202.55,1202.40,1207.20,1219.45,1220.10,1218.82,1236.98,1231.26,
+1247.15,1248.39,1257.64,1263.51,1268.14,1271.41,1283.57,1284.79,1291.04,1295.49,
+1306.65,1306.37,1310.13,1312.18,1328.73,1321.22,1336.61,1336.97,1345.62,1346.60,
+1358.20,1362.35,1375.45,1371.87,1375.96,1389.64,1390.38,1397.50,1404.53,1410.26,
+1408.71,1421.54,1425.06,1432.21,1435.47,1436.87,1448.93,1450.37,1457.65,1468.13,
+1471.56,1475.28,1482.52,1490.50,1489.81,1494.23,1506.90,1513.46,1516.58,1521.36,
+1524.13,1533.86,1531.96,1543.03,1548.12,1545.68,1555.07,1571.37,1566.45,1569.94,
+1580.13,1590.89,1595.26,1606.73,1610.37,1609.79,1617.31,1623.98,1624.99,1630.45,
+1635.75,1641.72,1645.53,1651.60,1664.03,1663.74,1672.77,1675.17,1679.04,1694.03,
+59.53,63.77,70.16,75.03,78.37,86.23,92.03,98.20,104.73,106.20,
+113.85,119.01,122.83,130.64,135.36,140.28,144.45,150.86,156.91,160.83,
+168.61,173.86,177.29,184.42,190.21,193.53,196.89,205.03,211.69,214.46,
+220.72,225.49,231.77,235.03,240.09,244.16,253.54,257.25,261.15,266.81,
+275.34,280.63,283.99,287.19,294.44,301.17,307.66,310.84,316.31,321.15,
+328.24,332.49,339.08,342.88,350.51,357.06,361.74,366.93,370.50,374.83,
+380.58,384.78,389.84,400.89,399.98,405.48,414.12,420.01,421.08,429.72,
+433.91,439.94,448.47,452.13,456.79,458.73,469.62,469.12,478.05,479.53,
+492.63,494.97,502.32,506.59,507.14,515.20,521.95,526.86,531.98,535.95,
+541.01,549.12,557.32,557.17,564.09,569.43,569.68,584.68,583.04,592.89,
+596.05,598.43,607.39,611.43,614.24,620.87,630.05,630.67,639.89,642.21,
+653.39,649.81,655.25,661.74,671.23,672.46,681.47,683.77,691.33,692.54,
+698.01,708.18,715.41,717.18,722.21,731.31,731.72,738.34,741.05,747.37,
+753.01,753.02,765.93,773.12,773.43,780.20,790.30,796.37,794.98,804.14,
+808.57,816.93,823.70,820.88,831.87,838.19,842.69,847.33,848.06,856.57,
+860.42,870.82,876.08,873.86,882.23,892.44,897.18,904.20,907.90,913.99,
+916.30,918.33,931.18,927.99,938.71,939.28,948.76,952.62,957.57,960.44,
+970.25,975.59,974.29,988.49,990.62,996.93,1001.33,1008.70,1013.64,1024.93,
+1017.72,1029.87,1025.09,1039.43,1039.43,1048.86,1055.75,1062.78,1072.84,1075.40,
+1080.30,1083.33,1087.66,1097.74,1096.59,1105.31,1109.76,1113.92,1121.46,1119.91,
+1134.36,1133.44,1146.56,1146.12,1149.70,1151.40,1163.89,1173.75,1172.43,1179.46,
+1181.41,1186.98,1200.05,1201.81,1206.47,1207.73,1213.93,1222.44,1227.56,1231.70,
+1240.98,1246.67,1256.30,1252.12,1255.45,1262.04,1270.18,1275.50,1283.99,1292.03,
+1293.74,1301.70,1299.65,1313.18,1317.70,1318.10,1327.76,1333.16,1333.88,1334.91,
+1349.17,1354.16,1356.12,1360.26,1363.52,1374.28,1378.37,1393.65,1391.08,1388.36,
+1395.40,1411.96,1410.81,1418.99,1421.13,1418.39,1430.03,1440.44,1442.44,1449.35,
+1452.59,1458.28,1472.00,1467.12,1475.44,1483.61,1481.21,1493.06,1498.61,1503.85,
+1504.27,1505.55,1515.28,1511.96,1534.03,1534.68,1539.44,1539.52,1551.94,1554.89,
+1558.02,1571.28,1570.59,1579.71,1577.44,1582.38,1589.83,1600.53,1604.01,1603.70,
+56.61,60.68,67.17,71.91,78.35,81.94,86.56,91.95,94.97,102.76,
+104.84,113.89,116.64,123.61,127.52,132.43,137.67,142.69,149.29,151.27,
+156.75,163.53,170.00,173.47,179.99,183.83,190.39,193.40,201.65,203.44,
+210.79,215.04,217.88,224.69,227.09,235.42,242.60,245.23,248.78,254.07,
+258.07,264.82,271.17,274.50,282.32,283.84,287.99,292.61,301.93,303.14,
+312.37,315.85,320.22,325.95,329.15,336.20,341.11,343.87,349.93,354.70,
+363.97,369.20,371.39,376.74,379.88,386.79,393.46,396.99,408.67,406.00,
+412.95,419.38,426.73,431.70,434.24,438.56,442.63,447.94,455.43,459.17,
+463.14,469.67,475.19,481.19,486.15,494.97,491.76,502.72,504.98,510.91,
+515.21,522.67,523.10,528.15,535.54,537.73,547.63,550.58,558.08,563.78,
+563.96,567.82,575.80,580.78,586.17,595.12,598.95,598.39,606.11,612.43,
+613.82,621.86,625.00,633.93,629.99,640.99,643.95,652.33,657.90,659.08,
+665.97,667.95,677.15,682.22,686.60,694.87,702.40,698.57,707.53,715.55,
+716.09,723.75,728.96,730.80,733.88,746.09,747.58,754.53,759.08,762.55,
+770.52,770.67,779.03,782.14,791.60,789.76,799.00,806.25,807.10,816.43,
+824.10,827.47,830.06,838.22,843.03,846.84,849.00,856.92,856.12,866.19,
+872.44,877.73,881.10,887.28,887.78,896.71,904.53,911.80,917.17,923.39,
+917.45,924.41,932.51,939.36,938.88,950.31,954.01,961.70,959.79,965.34,
+964.91,976.31,982.08,987.39,990.04,1000.88,1004.66,1007.67,1016.79,1015.32,
+1026.19,1025.07,1037.94,1036.76,1040.79,1045.63,1050.53,1061.95,1062.45,1066.68,
+1077.68,1087.61,1083.94,1088.37,1092.11,1103.10,1105.33,1110.29,1115.33,1117.00,
+1127.31,1131.64,1133.86,1134.16,1148.18,1150.72,1154.54,1163.45,1170.42,1172.27,
+1178.40,1180.87,1183.27,1195.22,1195.65,1201.47,1210.56,1212.68,1212.81,1230.26,
+1226.09,1229.70,1239.69,1236.89,1245.71,1250.91,1257.78,1260.87,1266.01,1271.88,
+1277.13,1274.93,1291.56,1289.37,1300.57,1300.44,1315.80,1315.05,1319.97,1329.52,
+1328.84,1333.53,1342.55,1345.92,1357.72,1352.27,1362.53,1362.46,1364.98,1374.91,
+1377.58,1375.88,1388.63,1390.09,1406.99,1406.78,1411.48,1415.00,1418.92,1434.48,
+1429.33,1434.32,1438.83,1443.02,1455.21,1454.97,1460.73,1458.90,1474.50,1475.41,
+1478.21,1486.11,1485.65,1492.25,1507.08,1511.21,1506.83,1512.76,1517.22,1527.55,
+54.09,59.82,64.09,67.48,71.52,74.54,83.50,89.44,91.36,96.20,
+102.37,107.63,112.80,115.86,119.85,125.74,131.19,135.10,140.24,145.50,
+150.45,154.85,158.01,164.73,170.43,173.59,177.41,184.13,190.76,194.75,
+199.44,204.13,209.86,210.14,214.11,221.73,228.46,233.97,235.70,241.75,
+247.72,253.19,254.81,261.69,267.85,272.60,274.96,281.09,288.13,291.59,
+299.94,301.55,305.63,307.70,312.73,321.36,323.24,331.18,328.43,337.02,
+345.45,349.07,353.44,361.34,361.37,368.77,375.73,378.10,383.01,387.10,
+389.12,399.23,403.05,406.33,415.28,420.05,417.87,426.98,431.34,439.78,
+441.04,443.22,450.95,457.21,456.06,467.27,469.12,474.90,477.06,481.42,
+483.89,490.96,498.88,502.83,506.22,514.17,516.43,523.56,527.54,534.32,
+538.11,539.62,546.64,553.17,555.10,561.01,566.52,571.69,573.66,583.67,
+587.92,588.38,595.26,598.59,605.48,610.79,611.27,619.59,623.78,627.69,
+634.32,635.94,643.84,655.53,654.34,658.94,667.25,667.79,674.05,677.81,
+683.90,686.61,691.87,692.11,696.16,706.11,710.27,718.14,720.33,725.41,
+730.54,733.74,738.06,740.45,748.68,755.80,762.57,769.93,769.33,775.33,
+780.40,780.62,786.13,793.40,802.07,803.11,809.47,809.27,822.54,821.12,
+826.79,833.08,838.04,843.03,841.89,846.82,863.30,854.72,866.89,871.55,
+875.83,878.03,881.58,888.47,895.56,897.00,906.01,910.35,915.86,914.96,
+926.78,930.33,932.95,942.36,936.47,945.56,949.53,958.13,961.73,968.47,
+968.87,978.99,982.03,978.70,989.49,994.57,998.51,1005.56,1012.95,1019.72,
+1021.93,1026.41,1027.30,1030.39,1043.35,1040.75,1050.05,1052.37,1055.44,1061.29,
+1067.20,1075.07,1074.39,1083.58,1090.47,1092.85,1094.54,1101.40,1109.48,1113.01,
+1118.73,1121.27,1130.65,1129.87,1138.51,1143.10,1146.48,1150.04,1161.27,1162.12,
+1165.80,1172.45,1169.38,1176.17,1183.74,1185.26,1194.61,1199.10,1199.99,1204.59,
+1211.85,1215.20,1221.15,1227.47,1227.21,1239.28,1240.96,1245.36,1252.11,1258.69,
+1252.66,1265.45,1269.18,1276.36,1281.08,1289.42,1286.35,1295.33,1298.90,1301.64,
+1310.23,1320.61,1319.78,1328.56,1329.73,1333.65,1337.83,1344.07,1348.75,1356.85,
+1356.95,1365.64,1370.18,1382.72,1382.72,1381.08,1390.34,1395.13,1396.81,1403.38,
+1404.60,1408.16,1419.08,1419.88,1428.34,1435.59,1429.16,1437.33,1445.19,1448.39,
+52.50,54.92,61.04,64.93,67.83,74.34,77.50,82.89,87.01,91.30,
+96.38,101.43,106.41,108.66,114.22,119.99,125.29,130.65,133.24,137.44,
+144.04,145.83,153.09,156.61,161.84,163.35,169.76,173.95,182.46,185.49,
+184.49,194.08,199.84,198.85,207.75,210.77,215.32,219.28,223.72,229.07,
+236.97,236.31,243.30,247.32,250.37,257.66,262.06,265.55,272.38,278.66,
+278.70,284.49,289.20,293.58,296.43,305.43,306.83,316.35,319.52,321.51,
+323.80,329.67,333.00,339.74,344.19,343.63,354.04,356.78,362.10,366.35,
+371.08,379.92,381.91,387.48,390.53,391.65,395.58,404.33,412.23,415.07,
+416.87,419.53,422.89,431.06,436.63,442.49,448.38,453.34,447.80,454.62,
+459.82,465.58,470.99,475.66,481.47,484.12,494.82,494.08,498.32,507.73,
+507.72,511.83,515.99,521.71,527.00,531.75,536.42,543.03,554.07,549.31,
+554.42,559.15,563.02,568.49,571.01,576.70,580.00,588.49,591.38,596.94,
+600.68,605.84,604.20,616.13,619.28,622.17,633.90,626.93,635.67,639.38,
+647.14,653.13,655.92,656.23,664.05,674.44,668.05,677.57,685.41,687.06,
+691.88,695.57,694.40,708.51,708.15,712.25,722.37,725.67,725.62,727.81,
+739.80,742.33,745.32,751.69,757.28,763.81,766.32,772.73,778.39,775.45,
+780.20,785.99,787.83,796.46,796.68,804.36,810.57,813.75,825.83,822.12,
+825.30,832.92,833.26,839.78,845.60,848.51,857.10,863.61,868.57,876.70,
+871.53,875.36,881.71,894.93,894.61,901.61,897.88,904.43,911.41,923.62,
+919.81,923.81,938.53,930.20,943.56,945.18,943.33,955.47,963.35,961.54,
+963.76,978.95,977.88,989.84,985.01,983.90,996.97,997.37,1007.46,1003.97,
+1016.91,1018.57,1025.27,1023.48,1033.97,1038.15,1041.10,1042.44,1050.26,1055.19,
+1061.70,1067.53,1068.51,1070.28,1081.18,1074.23,1091.52,1083.77,1093.65,1098.53,
+1105.94,1105.83,1117.51,1117.87,1129.54,1131.96,1129.10,1142.31,1136.87,1146.16,
+1151.15,1152.92,1161.68,1169.35,1173.53,1171.62,1186.80,1180.82,1182.47,1190.15,
+1201.35,1205.13,1203.03,1210.66,1214.06,1216.57,1223.18,1232.65,1232.93,1231.82,
+1245.78,1246.02,1250.36,1250.99,1261.96,1265.03,1267.37,1274.96,1281.82,1280.84,
+1294.96,1287.72,1302.53,1294.67,1309.53,1299.56,1315.68,1316.63,1326.26,1327.77,
+1331.19,1335.88,1349.78,1344.73,1341.85,1354.23,1361.46,1371.05,1362.17,1379.08,
+49.41,53.82,55.86,60.31,67.77,69.48,74.41,78.68,82.13,85.88,
+92.37,95.45,100.50,105.40,110.75,113.41,117.63,120.24,128.55,131.52,
+134.75,139.77,142.44,149.03,154.25,159.57,162.96,163.65,168.82,173.71,
+176.84,181.09,185.35,190.66,197.14,198.21,204.43,212.40,215.44,221.29,
+220.35,222.80,230.01,234.85,237.87,239.52,242.39,251.80,254.58,260.38,
+259.16,273.08,270.36,276.32,282.29,285.23,289.80,298.07,296.12,304.70,
+312.24,311.49,321.17,322.20,329.38,328.42,338.01,340.15,342.48,352.14,
+347.91,354.15,358.80,366.06,367.25,370.74,377.89,382.32,388.54,391.12,
+395.15,403.36,407.09,409.10,410.32,414.00,420.57,427.55,430.02,429.53,
+439.64,442.09,443.61,456.01,457.07,465.22,464.30,465.94,470.53,473.56,
+479.20,486.00,488.93,493.16,497.32,503.19,508.62,516.31,516.54,522.21,
+528.94,530.68,534.40,541.29,543.89,548.23,548.98,554.63,559.07,563.71,
+569.28,574.03,576.31,578.19,583.01,594.31,593.00,600.57,602.19,604.17,
+610.53,621.58,620.70,627.34,626.82,634.27,636.96,645.51,649.78,649.92,
+648.67,655.59,662.01,667.17,671.64,675.22,686.37,690.08,692.22,695.40,
+694.41,701.53,704.87,714.39,725.45,725.61,722.70,723.53,733.55,742.10,
+742.88,745.49,753.19,756.61,755.98,768.46,772.17,775.46,781.30,780.12,
+781.70,786.62,799.02,800.47,803.07,810.69,811.88,812.52,819.50,824.30,
+829.00,832.58,835.02,835.15,841.32,855.72,855.30,859.68,859.44,862.67,
+876.35,882.61,887.74,879.92,887.97,897.70,897.98,901.96,906.16,909.40,
+919.49,914.62,927.18,918.10,936.32,937.64,942.84,947.46,955.10,959.08,
+957.75,959.68,962.25,976.33,984.38,981.02,983.64,988.19,985.86,996.13,
+1010.84,1009.16,1008.70,1016.64,1021.74,1024.57,1029.21,1035.49,1029.51,1050.36,
+1043.09,1049.22,1051.65,1057.87,1060.82,1075.47,1075.13,1074.24,1081.92,1085.41,
+1084.51,1103.43,1094.55,1098.16,1109.50,1114.85,1113.88,1113.07,1130.03,1126.88,
+1134.74,1137.63,1144.63,1147.60,1149.37,1156.85,1154.76,1156.74,1165.58,1170.73,
+1170.73,1170.43,1182.76,1194.31,1193.97,1195.49,1208.28,1209.13,1214.37,1209.11,
+1215.28,1221.46,1234.82,1235.79,1238.68,1240.33,1257.58,1255.50,1258.84,1257.29,
+1269.12,1263.15,1271.44,1280.43,1285.61,1282.84,1282.16,1290.87,1301.69,1301.64,
+46.59,50.45,54.87,59.28,63.62,66.65,70.80,76.70,78.34,79.96,
+85.79,91.21,93.43,99.25,103.27,106.35,112.18,117.12,120.81,123.24,
+127.38,132.53,135.28,137.83,144.93,148.12,149.80,156.82,161.38,166.69,
+170.34,171.53,178.44,179.66,188.54,187.98,193.50,200.44,199.81,208.18,
+210.46,216.30,222.51,219.69,228.80,227.59,234.38,237.64,240.63,245.09,
+249.45,257.91,264.98,262.19,265.64,274.44,274.99,276.63,283.89,289.50,
+291.70,295.23,301.73,307.89,307.78,314.54,316.50,324.53,325.11,327.12,
+335.17,339.82,341.12,343.30,349.67,355.13,360.44,363.44,366.55,369.47,
+373.03,378.95,378.80,386.56,386.58,396.49,398.51,400.40,408.99,410.02,
+414.94,419.52,418.64,428.14,433.16,433.92,436.49,448.18,450.98,452.82,
+457.58,457.72,467.52,471.21,466.65,479.17,483.09,489.91,495.31,495.14,
+498.50,496.86,507.67,512.92,513.89,516.12,522.32,525.34,534.00,535.53,
+539.41,544.25,548.09,555.30,552.10,563.15,561.57,568.26,572.86,578.41,
+578.74,586.57,583.23,589.39,599.91,599.73,605.83,603.78,614.84,616.13,
+624.14,623.19,632.91,628.47,644.31,636.63,653.49,648.06,656.78,660.83,
+660.77,669.29,670.76,673.40,679.05,681.88,683.77,688.07,693.85,695.08,
+701.19,709.88,711.59,717.10,723.24,723.58,728.45,733.47,732.84,746.25,
+741.03,744.72,758.06,763.19,762.51,769.46,770.04,774.63,776.02,786.76,
+785.71,793.92,797.39,793.50,802.81,799.82,805.50,811.12,816.86,817.56,
+821.22,833.74,834.37,840.48,844.73,841.78,853.83,857.69,866.18,863.63,
+858.38,868.95,874.47,879.41,881.17,894.06,893.96,898.35,906.74,899.09,
+910.15,913.44,919.55,917.01,921.46,930.91,933.35,933.30,939.89,947.63,
+942.86,963.89,955.63,961.93,961.37,966.93,970.33,973.41,977.48,987.25,
+983.55,998.79,1000.80,1012.76,1014.13,1005.98,1011.26,1010.30,1015.20,1029.87,
+1036.94,1040.47,1044.23,1054.65,1040.32,1054.93,1056.24,1057.92,1070.99,1066.82,
+1078.33,1079.69,1083.88,1080.76,1090.46,1101.08,1099.92,1101.85,1100.61,1113.68,
+1106.24,1116.70,1123.82,1125.49,1130.50,1142.43,1143.61,1147.63,1149.71,1158.20,
+1149.85,1155.65,1163.87,1164.01,1165.60,1174.26,1177.09,1180.94,1188.04,1188.87,
+1198.67,1200.97,1202.68,1200.95,1204.72,1220.67,1222.73,1226.56,1225.28,1228.61,
+95.81,102.89,112.36,119.76,129.09,135.86,145.12,153.65,163.28,169.63,
+180.39,187.05,196.26,203.75,211.62,221.38,228.97,237.51,245.53,254.18,
+262.41,270.52,280.62,289.19,296.70,305.17,312.87,321.74,329.77,337.58,
+345.21,354.77,366.04,372.06,380.98,389.29,396.55,405.30,413.87,422.02,
+431.05,436.47,444.89,454.55,465.68,473.97,481.77,489.62,498.24,504.76,
+512.19,522.28,530.88,542.22,546.63,555.79,566.34,573.45,579.90,588.11,
+599.32,607.16,615.02,623.12,631.78,640.98,644.74,656.60,666.06,673.94,
+681.76,690.29,696.67,707.25,716.41,724.60,731.82,740.21,750.61,758.09,
+765.88,771.95,782.64,788.22,798.67,809.30,814.31,826.00,832.46,843.65,
+850.98,858.45,865.56,873.67,882.23,891.26,899.19,907.77,915.51,925.46,
+935.10,943.03,949.71,956.99,967.18,976.82,984.61,993.35,1001.87,1007.71,
+1015.49,1026.21,1033.91,1041.27,1049.80,1061.06,1069.90,1073.59,1083.67,1091.90,
+1099.71,1107.33,1117.82,1126.49,1135.75,1141.72,1149.87,1158.86,1170.44,1178.03,
+1182.11,1193.47,1201.97,1207.70,1221.40,1224.66,1236.31,1244.46,1246.62,1262.79,
+1270.64,1275.00,1285.86,1291.16,1303.88,1311.46,1319.20,1328.05,1334.02,1345.41,
+1350.35,1359.65,1371.13,1378.02,1385.17,1398.16,1404.54,1407.93,1419.46,1427.57,
+1439.80,1444.13,1453.10,1463.13,1465.90,1478.12,1488.59,1494.76,1502.85,1511.17,
+1520.86,1526.34,1537.64,1544.03,1553.89,1559.83,1572.69,1577.63,1587.81,1593.61,
+1603.90,1611.76,1619.26,1629.14,1637.93,1645.09,1655.20,1660.56,1672.12,1675.84,
+1687.85,1695.34,1705.89,1714.34,1723.12,1730.18,1738.21,1749.01,1753.40,1762.81,
+1773.05,1778.22,1788.63,1796.93,1806.13,1813.85,1820.82,1830.97,1836.91,1844.95,
+1855.27,1865.37,1875.70,1879.39,1887.85,1898.07,1905.61,1917.97,1927.02,1932.05,
+1940.34,1942.90,1955.19,1964.95,1970.88,1981.73,1988.52,1999.09,2008.89,2014.99,
+2022.31,2030.18,2041.47,2049.55,2056.30,2066.47,2070.79,2081.25,2092.47,2099.40,
+2106.24,2116.40,2124.38,2132.99,2142.09,2148.44,2158.79,2168.17,2172.61,2180.72,
+2195.06,2201.07,2207.84,2218.08,2223.87,2232.17,2241.47,2247.56,2259.68,2267.48,
+2275.68,2284.16,2295.55,2302.62,2306.39,2318.56,2326.19,2332.74,2343.40,2349.11,
+2359.16,2365.33,2373.43,2382.61,2394.79,2400.16,2408.47,2415.09,2421.55,2433.79,
+2443.95,2445.79,2458.41,2467.98,2475.97,2484.43,2493.18,2501.33,2508.02,2518.63,
+93.34,99.96,108.08,115.77,124.15,132.06,139.74,148.14,156.73,166.56,
+172.68,182.07,189.38,196.64,205.50,213.86,222.30,230.09,239.55,246.29,
+254.18,262.07,270.67,279.02,287.61,294.49,303.96,311.78,320.90,328.55,
+336.85,343.61,351.76,357.93,370.53,376.68,384.61,391.48,402.93,407.81,
+416.90,426.06,433.65,441.41,448.66,455.24,466.37,473.76,482.04,489.13,
+497.07,506.59,514.51,523.71,531.85,537.00,545.77,557.27,563.33,573.83,
+580.68,587.81,596.16,604.15,613.01,621.77,629.64,634.73,645.06,651.62,
+660.93,670.40,676.99,686.50,692.78,703.84,709.92,718.93,727.09,734.48,
+744.48,752.98,759.42,766.18,777.13,782.71,791.06,799.54,807.60,817.91,
+820.96,832.61,840.64,847.82,857.15,866.02,874.37,879.87,888.42,896.85,
+905.19,914.51,920.29,930.26,935.57,948.97,954.68,961.50,969.97,979.01,
+987.10,995.28,1004.30,1010.29,1020.80,1024.83,1036.67,1041.21,1051.08,1063.86,
+1066.48,1077.83,1085.33,1095.17,1101.20,1106.98,1114.38,1124.22,1131.54,1143.82,
+1149.82,1157.23,1164.67,1172.02,1182.98,1191.14,1198.09,1208.34,1216.73,1224.78,
+1229.90,1240.21,1245.58,1254.42,1261.24,1269.17,1277.58,1286.91,1296.48,1303.48,
+1313.30,1321.21,1329.66,1335.81,1344.49,1352.23,1362.32,1369.51,1376.11,1384.64,
+1393.38,1401.64,1408.35,1417.68,1426.21,1433.37,1444.40,1451.46,1455.98,1464.57,
+1474.75,1484.36,1488.43,1502.12,1501.91,1513.66,1525.93,1533.56,1539.18,1548.22,
+1554.15,1563.01,1570.85,1580.35,1586.91,1598.81,1605.91,1615.26,1618.70,1629.79,
+1639.94,1646.57,1652.11,1659.63,1671.60,1676.13,1685.34,1692.39,1708.06,1704.42,
+1718.40,1727.77,1736.64,1745.64,1753.23,1759.56,1765.30,1775.24,1784.16,1794.33,
+1802.36,1806.83,1816.03,1824.48,1832.01,1842.40,1850.74,1857.42,1863.92,1874.43,
+1881.39,1890.03,1898.49,1905.36,1907.98,1921.84,1929.11,1935.76,1948.21,1955.62,
+1959.78,1968.21,1976.95,1985.64,1995.70,1999.84,2010.36,2019.39,2027.05,2034.30,
+2042.74,2054.85,2061.06,2069.95,2080.52,2087.42,2089.43,2104.01,2105.60,2116.51,
+2122.76,2131.18,2141.91,2146.42,2163.93,2168.39,2175.49,2182.49,2191.71,2198.68,
+2207.20,2215.10,2225.02,2231.50,2235.44,2246.25,2253.74,2264.12,2275.05,2280.93,
+2292.93,2295.15,2302.30,2309.30,2323.23,2334.01,2337.85,2346.44,2354.50,2363.04,
+2368.57,2378.50,2387.41,2393.62,2397.68,2412.72,2420.01,2424.62,2435.21,2445.09,
+88.63,96.76,104.88,113.96,120.35,129.00,136.37,144.39,153.00,158.44,
+167.22,175.68,183.62,190.46,200.20,207.74,214.65,223.47,232.06,238.29,
+246.84,254.65,263.25,270.99,277.28,285.31,294.69,301.77,309.70,316.58,
+327.49,335.44,340.21,348.51,357.15,364.95,371.25,378.81,388.35,397.53,
+404.77,413.13,419.63,426.59,438.04,445.40,449.54,457.60,468.27,475.81,
+481.50,491.93,497.94,510.02,514.46,521.70,529.93,536.93,543.13,553.77,
+562.85,569.47,577.25,585.39,592.93,600.94,609.60,617.14,625.44,632.70,
+640.41,648.97,654.16,664.75,671.29,679.99,687.57,695.22,705.35,711.76,
+720.67,727.45,737.75,742.27,750.58,758.83,768.27,774.88,782.31,790.50,
+797.85,804.85,813.77,820.22,827.73,836.51,845.49,852.20,862.77,869.67,
+878.10,882.60,890.31,900.96,910.02,916.92,923.43,933.65,939.05,946.83,
+954.65,965.68,970.32,977.92,987.52,996.81,1003.67,1007.90,1018.30,1028.05,
+1032.68,1041.57,1050.33,1062.86,1062.04,1072.84,1080.69,1089.45,1097.33,1104.53,
+1114.78,1122.39,1129.85,1135.92,1141.43,1150.92,1161.64,1167.36,1176.54,1183.82,
+1189.78,1197.06,1207.77,1212.26,1223.71,1230.36,1241.07,1244.97,1254.13,1260.69,
+1269.52,1275.05,1285.54,1294.30,1304.49,1308.49,1319.82,1324.09,1335.30,1341.64,
+1349.91,1357.52,1366.42,1375.02,1381.03,1389.62,1395.06,1404.14,1412.13,1418.75,
+1428.52,1435.19,1443.17,1449.74,1460.85,1467.16,1472.13,1484.82,1491.91,1500.95,
+1505.88,1513.90,1521.40,1529.66,1535.19,1544.64,1555.51,1561.10,1568.53,1581.03,
+1585.67,1592.97,1602.12,1614.34,1619.34,1622.08,1631.56,1638.09,1648.40,1659.26,
+1662.57,1670.13,1679.27,1687.94,1695.54,1703.27,1711.81,1717.63,1728.60,1729.65,
+1743.00,1747.15,1758.77,1764.09,1774.05,1779.10,1791.24,1794.50,1806.94,1812.72,
+1822.11,1831.04,1836.57,1842.32,1853.46,1860.52,1865.89,1881.65,1884.94,1890.01,
+1899.72,1899.62,1910.90,1920.39,1934.50,1941.10,1943.64,1953.29,1964.44,1968.92,
+1978.95,1984.10,1989.94,2001.59,2009.20,2017.18,2034.05,2034.90,2043.50,2048.68,
+2055.70,2065.76,2071.84,2078.52,2088.57,2100.37,2103.22,2112.44,2117.26,2130.59,
+2134.08,2141.93,2153.94,2157.23,2167.86,2177.93,2180.77,2188.70,2197.59,2204.99,
+2210.37,2222.90,2233.07,2236.91,2246.10,2252.80,2262.07,2269.10,2282.74,2287.08,
+2293.10,2299.02,2308.61,2316.54,2322.65,2334.00,2342.45,2349.05,2356.54,2366.83,
+85.61,93.60,101.36,108.53,116.73,124.82,133.19,140.25,146.29,154.70,
+162.46,169.52,176.67,183.48,193.32,201.41,207.33,214.22,224.77,230.53,
+237.22,246.29,253.08,260.52,268.65,276.88,284.63,290.39,300.23,308.04,
+315.07,321.43,329.41,335.76,343.71,352.86,362.61,369.05,375.00,384.23,
+389.80,396.70,405.75,412.40,425.38,430.41,435.62,442.82,450.82,461.37,
+466.55,475.22,482.13,489.00,500.02,504.36,511.17,518.12,527.42,537.93,
+545.56,550.75,561.50,565.78,572.88,580.79,587.86,598.15,603.56,611.21,
+619.68,626.29,633.82,641.79,649.26,658.30,664.37,673.22,677.37,686.65,
+696.22,701.56,710.26,716.97,724.48,735.92,741.12,751.86,757.09,763.33,
+772.56,779.41,786.14,793.51,800.47,807.66,817.31,826.34,832.18,837.55,
+845.58,856.52,861.13,869.47,877.02,883.50,893.79,902.41,908.62,916.15,
+923.84,927.45,938.24,947.14,953.32,962.40,973.15,979.10,982.65,989.71,
+999.05,1009.77,1016.65,1022.80,1030.78,1036.66,1043.76,1055.03,1060.18,1067.69,
+1074.67,1081.43,1092.24,1099.40,1107.46,1117.13,1122.43,1126.97,1136.12,1144.48,
+1153.04,1160.74,1166.37,1176.81,1180.56,1191.64,1198.83,1202.34,1213.88,1220.93,
+1230.30,1240.68,1243.56,1252.60,1256.90,1265.34,1276.73,1280.98,1290.84,1299.73,
+1303.47,1308.74,1319.47,1325.18,1336.43,1341.89,1346.73,1356.54,1364.76,1373.52,
+1378.12,1382.25,1396.99,1399.86,1413.74,1423.31,1429.00,1433.32,1440.51,1445.63,
+1459.60,1463.10,1471.91,1481.19,1486.74,1493.40,1502.40,1506.89,1518.37,1522.37,
+1530.92,1546.64,1546.64,1556.32,1562.16,1572.11,1577.98,1585.87,1594.74,1599.13,
+1607.23,1619.89,1625.52,1632.50,1642.06,1647.98,1653.82,1660.84,1671.74,1678.85,
+1683.39,1688.72,1703.61,1707.97,1714.34,1718.50,1732.61,1734.77,1749.00,1753.95,
+1765.23,1767.16,1775.39,1784.52,1793.83,1800.19,1807.46,1814.80,1818.28,1827.19,
+1840.88,1843.75,1851.72,1857.79,1871.66,1877.32,1885.76,1892.75,1895.32,1907.60,
+1915.65,1920.81,1926.82,1936.65,1942.20,1950.09,1958.49,1960.90,1971.60,1985.06,
+1989.14,1992.83,2007.78,2012.65,2017.36,2028.84,2037.51,2039.21,2046.46,2056.41,
+2064.01,2073.76,2085.64,2086.07,2094.92,2105.57,2109.39,2113.31,2128.24,2136.08,
+2142.41,2147.91,2157.96,2165.89,2174.46,2179.74,2191.42,2197.20,2204.41,2212.69,
+2215.48,2223.79,2237.57,2238.34,2250.60,2257.04,2261.69,2268.43,2279.22,2286.82,
+85.65,89.69,97.40,105.21,113.39,120.65,127.23,134.25,141.98,149.51,
+155.25,162.77,170.84,179.47,186.30,193.31,201.82,208.98,216.48,221.66,
+229.79,235.69,244.88,250.96,258.37,266.75,273.45,282.87,290.28,295.82,
+302.92,313.48,318.65,324.50,334.55,341.62,346.81,357.01,364.65,371.31,
+374.49,384.24,392.29,400.09,407.81,413.18,422.35,427.23,436.72,443.91,
+453.02,457.77,466.38,476.05,477.79,486.40,492.16,503.51,509.50,519.50,
+523.46,528.08,538.75,546.65,552.92,562.34,568.16,574.55,582.86,589.00,
+596.66,604.36,613.17,619.23,627.32,630.99,641.06,648.57,657.80,663.12,
+673.49,678.92,684.65,691.43,701.68,706.71,711.46,725.01,730.57,739.43,
+743.31,753.38,759.99,767.34,776.26,780.92,789.18,796.38,799.01,812.38,
+816.46,826.12,835.85,838.93,850.13,855.65,862.24,867.06,875.72,879.75,
+890.71,898.75,902.58,913.62,918.43,931.07,936.61,939.63,952.92,958.06,
+968.41,973.26,978.82,987.97,992.94,1002.14,1006.12,1015.57,1025.20,1031.14,
+1039.75,1044.69,1052.15,1060.24,1069.36,1078.19,1082.92,1086.99,1095.61,1105.85,
+1111.02,1120.20,1131.03,1131.91,1141.92,1148.26,1157.20,1162.06,1169.48,1175.54,
+1185.89,1195.72,1204.51,1206.21,1215.84,1223.78,1226.00,1238.74,1240.96,1253.17,
+1261.12,1266.79,1275.74,1281.30,1283.46,1293.81,1301.59,1308.62,1319.78,1322.84,
+1337.94,1339.63,1343.44,1358.03,1362.94,1368.39,1377.13,1383.33,1393.07,1397.83,
+1405.39,1413.48,1415.73,1428.10,1436.06,1438.91,1451.17,1459.13,1464.29,1473.72,
+1477.16,1482.78,1493.94,1500.07,1511.11,1517.01,1519.10,1530.22,1538.33,1548.28,
+1554.23,1560.52,1567.22,1577.55,1585.52,1589.61,1601.61,1604.68,1615.38,1620.03,
+1627.32,1634.04,1637.10,1644.27,1655.73,1664.44,1669.47,1677.84,1684.66,1693.18,
+1701.48,1710.86,1715.61,1719.22,1730.48,1735.61,1743.56,1749.29,1758.52,1761.12,
+1769.43,1778.17,1792.27,1795.79,1802.14,1810.52,1814.65,1821.16,1835.02,1834.85,
+1841.12,1858.82,1860.01,1870.11,1877.59,1884.73,1887.48,1902.16,1904.92,1912.04,
+1922.03,1927.12,1932.24,1943.47,1950.93,1957.45,1969.83,1967.01,1977.92,1987.79,
+1997.29,2005.81,2009.20,2013.19,2027.11,2030.31,2035.80,2044.22,2053.05,2066.20,
+2067.18,2076.50,2081.11,2096.36,2097.59,2101.31,2114.07,2116.60,2126.10,2136.49,
+2140.69,2152.87,2153.61,2160.88,2171.95,2175.60,2188.54,2192.57,2194.36,2209.20,
+79.88,86.72,93.08,103.66,108.46,116.96,121.50,129.76,135.75,144.29,
+151.62,157.49,164.54,170.81,180.06,186.77,192.39,198.40,206.19,213.81,
+222.71,228.78,235.86,242.93,249.14,257.46,265.39,270.80,279.36,287.03,
+291.81,299.63,308.30,313.21,320.25,328.04,337.69,342.46,348.83,357.36,
+364.33,370.51,378.34,385.00,393.04,397.86,407.28,413.33,417.99,424.50,
+434.59,442.61,447.78,454.59,462.24,469.72,476.90,484.38,492.18,496.39,
+503.40,511.13,516.97,526.04,532.07,541.72,548.32,555.55,562.89,570.55,
+576.49,584.38,590.40,597.12,604.17,613.84,617.29,622.97,632.75,640.26,
+646.46,653.14,663.51,668.44,673.29,679.81,687.23,699.10,700.69,710.84,
+718.91,724.67,731.92,738.33,747.88,752.81,759.47,767.83,775.66,781.45,
+788.90,794.72,802.90,807.80,818.98,824.34,832.77,836.64,843.34,850.20,
+861.84,868.17,871.73,882.07,888.21,893.90,897.61,906.26,917.03,925.61,
+931.58,940.78,945.74,952.99,954.99,972.51,970.84,976.67,988.77,994.81,
+1000.41,1010.43,1012.86,1020.77,1030.50,1034.81,1045.17,1053.60,1058.49,1065.57,
+1072.09,1076.64,1085.62,1094.23,1098.55,1105.87,1114.36,1122.98,1130.17,1137.11,
+1142.71,1149.23,1157.51,1168.21,1172.32,1177.44,1186.69,1194.47,1195.64,1208.08,
+1214.25,1219.20,1226.59,1237.50,1241.54,1248.13,1255.84,1257.14,1271.72,1274.93,
+1285.72,1290.18,1302.61,1307.27,1310.85,1319.59,1327.40,1334.09,1341.20,1349.32,
+1356.22,1361.57,1366.34,1382.42,1379.35,1390.12,1400.36,1408.66,1409.79,1418.57,
+1423.45,1434.05,1439.54,1446.89,1448.13,1461.13,1465.97,1478.32,1482.31,1489.06,
+1497.08,1500.94,1513.99,1517.54,1527.79,1533.99,1542.11,1544.48,1559.30,1559.68,
+1566.80,1573.83,1581.96,1590.26,1597.04,1600.45,1606.44,1615.65,1621.39,1632.88,
+1637.70,1649.08,1658.21,1657.69,1667.95,1670.53,1678.13,1691.35,1694.93,1703.84,
+1712.03,1715.00,1724.28,1731.90,1736.50,1748.02,1754.07,1755.14,1764.25,1772.16,
+1777.21,1787.05,1787.85,1804.57,1810.40,1817.05,1818.17,1831.98,1840.52,1841.66,
+1856.98,1863.47,1864.51,1870.90,1879.26,1889.87,1897.25,1906.51,1908.99,1909.24,
+1926.24,1926.66,1934.76,1942.50,1954.43,1956.96,1966.86,1973.66,1978.46,1987.74,
+1992.63,1999.70,2010.71,2015.99,2021.81,2029.48,2034.82,2038.34,2048.90,2059.60,
+2065.06,2074.02,2077.42,2088.20,2093.61,2099.56,2104.60,2112.52,2124.63,2128.69,
+77.41,82.33,91.56,98.49,103.91,110.70,117.05,126.56,132.75,137.75,
+145.19,151.78,157.88,168.23,171.53,180.86,188.63,191.94,199.01,205.76,
+214.85,219.92,226.59,235.47,240.92,247.84,255.09,263.25,269.31,277.24,
+282.46,288.53,296.68,305.61,307.53,315.74,321.92,332.31,335.99,340.76,
+347.06,357.05,361.31,371.56,375.49,382.22,390.35,398.56,403.01,412.16,
+417.98,425.97,430.36,439.10,444.42,452.79,459.65,466.94,471.92,481.21,
+489.36,491.14,499.02,509.42,516.06,519.88,528.04,534.00,539.55,545.95,
+556.72,563.17,564.45,571.72,582.76,590.23,597.90,601.33,611.77,617.20,
+622.69,627.29,636.52,639.85,649.41,658.74,662.61,672.88,676.24,686.02,
+689.37,701.19,704.26,710.68,719.55,724.57,735.91,738.77,743.62,752.43,
+760.20,766.51,774.57,776.44,790.01,793.58,800.25,809.03,815.19,821.20,
+822.78,832.54,837.33,847.16,849.00,863.91,864.96,874.68,882.48,885.91,
+895.28,899.86,911.45,918.63,921.19,926.33,935.75,941.30,948.72,958.26,
+969.85,970.04,978.15,984.77,986.49,997.77,1004.05,1014.25,1018.13,1024.41,
+1030.89,1040.11,1045.86,1046.23,1061.32,1067.77,1076.20,1081.09,1085.15,1093.48,
+1102.44,1108.47,1114.22,1122.81,1128.73,1138.03,1142.54,1151.12,1153.44,1165.22,
+1166.80,1177.98,1185.33,1189.71,1197.67,1199.37,1205.19,1219.93,1223.81,1228.99,
+1233.84,1241.55,1252.23,1253.78,1263.09,1267.85,1272.98,1283.56,1295.19,1300.51,
+1305.40,1309.95,1322.51,1325.14,1332.57,1337.33,1346.16,1352.57,1361.80,1370.01,
+1371.58,1385.42,1382.27,1394.82,1397.58,1403.35,1412.59,1420.06,1428.40,1431.10,
+1441.85,1445.34,1454.19,1461.58,1470.33,1475.62,1486.09,1493.77,1492.23,1503.57,
+1511.81,1516.42,1520.24,1527.99,1536.47,1547.79,1546.77,1555.80,1564.29,1570.79,
+1578.41,1585.06,1587.44,1596.18,1600.79,1609.34,1620.50,1628.04,1632.51,1640.53,
+1646.97,1651.26,1666.08,1667.21,1668.41,1681.53,1687.70,1699.02,1698.62,1707.41,
+1712.81,1722.43,1729.87,1735.63,1742.29,1746.59,1748.50,1763.39,1769.37,1778.56,
+1783.07,1789.72,1800.75,1796.28,1809.63,1816.34,1818.82,1828.02,1835.88,1842.84,
+1852.62,1861.89,1866.92,1869.32,1879.83,1887.18,1894.77,1900.50,1906.54,1908.05,
+1919.42,1927.39,1933.72,1939.55,1944.06,1950.57,1959.93,1965.55,1966.62,1977.73,
+1989.67,1994.01,2002.33,2010.63,2019.45,2019.94,2027.13,2031.96,2041.16,2048.58,
+76.16,81.26,87.62,93.36,101.64,107.21,112.96,119.62,126.79,135.05,
+140.42,146.81,153.78,160.38,166.04,173.40,178.64,182.96,193.15,198.40,
+205.19,215.42,218.54,224.85,235.20,236.53,245.11,253.51,256.82,264.51,
+269.66,276.99,283.57,291.93,297.74,303.40,311.13,319.14,321.65,329.88,
+339.00,341.32,350.75,355.97,365.67,371.19,376.29,382.87,389.39,392.10,
+405.01,410.12,416.93,421.09,429.55,437.00,441.95,448.81,457.64,460.87,
+468.90,474.48,479.56,488.52,495.65,499.54,507.35,516.76,521.06,525.06,
+530.88,544.54,543.58,551.02,558.23,566.67,573.68,580.04,585.88,592.93,
+600.22,607.12,612.66,620.80,630.88,631.48,639.09,647.65,649.15,658.27,
+668.66,674.82,678.19,682.75,685.77,698.96,705.96,710.10,716.62,725.23,
+729.05,730.55,744.15,751.64,755.89,762.71,767.61,778.28,781.91,795.48,
+793.34,802.20,816.30,817.70,817.66,826.98,834.37,844.52,847.73,856.14,
+863.92,869.89,878.78,886.49,887.26,894.97,904.19,906.64,913.72,921.55,
+924.16,936.12,947.36,950.20,954.45,957.23,968.16,972.64,979.36,985.76,
+993.45,996.24,1007.54,1009.29,1019.42,1028.11,1032.29,1044.05,1051.81,1049.70,
+1057.35,1064.59,1068.24,1078.82,1081.60,1089.66,1095.57,1100.61,1117.27,1116.79,
+1122.22,1128.89,1138.24,1141.55,1148.72,1157.97,1160.62,1173.99,1177.77,1179.46,
+1185.01,1201.40,1203.12,1214.86,1214.67,1221.94,1229.34,1233.89,1240.63,1250.29,
+1257.38,1259.60,1273.68,1279.96,1280.10,1285.54,1298.38,1302.72,1308.64,1312.81,
+1318.95,1328.25,1332.21,1335.87,1346.68,1354.74,1360.83,1365.79,1379.70,1374.96,
+1385.19,1390.97,1397.21,1410.91,1413.15,1420.96,1426.30,1433.53,1433.59,1449.14,
+1451.81,1463.86,1467.32,1477.90,1481.35,1487.80,1490.06,1496.83,1504.29,1509.79,
+1517.98,1524.11,1536.74,1535.92,1542.28,1552.50,1561.88,1560.66,1565.00,1580.25,
+1589.36,1592.43,1592.79,1602.46,1607.29,1613.92,1625.11,1634.45,1635.38,1644.03,
+1648.58,1651.59,1656.98,1668.44,1675.89,1679.11,1694.08,1694.18,1701.88,1712.79,
+1718.61,1722.57,1729.75,1731.53,1738.86,1743.60,1753.99,1761.40,1771.10,1776.23,
+1780.57,1783.81,1791.07,1811.10,1806.30,1811.51,1818.35,1831.48,1838.09,1839.46,
+1848.93,1851.92,1857.30,1871.32,1871.76,1882.04,1885.73,1888.41,1899.12,1903.34,
+1910.39,1918.49,1924.82,1934.56,1933.68,1938.83,1951.47,1954.62,1960.69,1970.57,
+70.48,78.42,83.65,90.94,96.89,105.22,109.55,115.48,120.34,128.70,
+134.20,141.87,146.72,153.46,160.00,165.73,171.70,178.79,185.42,191.60,
+196.61,203.72,210.25,215.24,224.42,229.27,234.69,240.04,248.67,253.20,
+260.24,266.12,273.74,280.30,286.11,292.54,299.64,304.12,309.69,317.57,
+321.73,327.21,333.72,345.09,347.88,353.76,359.59,367.64,371.78,378.83,
+386.93,391.33,401.08,405.90,411.31,418.65,423.10,431.46,436.78,442.83,
+446.64,454.91,462.98,468.78,477.72,479.59,487.81,494.06,499.55,508.43,
+510.81,521.37,523.27,528.15,536.07,541.03,550.86,554.80,563.55,569.43,
+574.81,585.97,590.34,594.98,604.19,610.58,613.85,616.73,625.94,632.32,
+635.19,643.10,652.85,659.88,666.54,671.46,675.43,687.65,691.56,697.33,
+703.50,706.83,717.46,716.27,728.59,734.20,736.03,741.50,749.98,760.86,
+767.37,768.18,777.92,781.74,788.26,797.29,804.01,809.80,814.84,822.65,
+826.27,834.52,841.44,844.17,850.22,856.56,867.52,869.36,877.31,884.56,
+893.07,894.54,902.55,914.14,914.49,923.82,927.55,932.67,938.86,945.69,
+956.24,960.55,966.50,967.26,981.25,988.25,993.13,993.39,1002.71,1012.31,
+1016.92,1020.54,1030.37,1034.49,1044.67,1051.29,1053.18,1059.39,1060.95,1071.47,
+1074.41,1089.45,1094.36,1103.34,1101.88,1108.77,1111.46,1123.07,1130.56,1138.43,
+1145.02,1152.66,1153.08,1161.15,1165.08,1181.63,1177.38,1187.50,1196.39,1201.45,
+1209.06,1211.84,1222.61,1222.31,1232.44,1241.12,1243.28,1249.69,1253.39,1260.51,
+1271.94,1277.65,1285.33,1285.92,1292.35,1304.79,1303.95,1310.89,1316.00,1324.69,
+1336.26,1337.09,1341.65,1354.40,1355.33,1365.05,1376.32,1375.17,1385.66,1383.03,
+1391.94,1399.38,1401.33,1415.04,1419.60,1429.41,1437.29,1430.72,1449.27,1450.19,
+1455.91,1467.61,1467.89,1476.61,1486.23,1492.35,1498.82,1508.92,1509.38,1517.17,
+1517.15,1529.28,1530.79,1538.29,1549.43,1556.82,1556.26,1557.81,1571.04,1575.24,
+1583.61,1589.53,1600.84,1603.91,1611.58,1621.72,1624.60,1620.68,1634.52,1652.29,
+1647.42,1660.59,1665.77,1664.29,1673.69,1678.63,1683.72,1687.96,1704.16,1698.53,
+1712.21,1714.01,1725.09,1727.62,1738.85,1734.23,1748.62,1746.92,1759.96,1765.49,
+1776.03,1775.20,1791.36,1792.60,1797.94,1807.13,1807.49,1813.28,1823.95,1837.40,
+1833.45,1838.34,1849.44,1856.02,1864.93,1863.17,1878.80,1876.19,1887.64,1889.26,
+68.03,74.60,81.23,86.19,93.96,99.75,104.97,113.08,116.90,122.38,
+130.05,135.14,141.56,147.53,152.09,159.17,164.14,172.13,179.12,182.07,
+189.59,195.46,202.86,209.47,213.64,219.69,226.93,232.26,238.43,243.41,
+248.12,258.41,260.07,266.74,276.82,277.43,286.65,290.17,296.64,305.76,
+311.08,318.05,325.63,329.45,334.51,344.05,346.76,351.38,358.47,363.96,
+370.13,375.25,386.29,388.83,393.66,402.60,407.04,412.79,419.33,426.09,
+431.17,438.06,442.37,447.68,457.30,465.72,468.30,476.49,477.45,481.48,
+494.32,498.92,508.81,508.67,513.20,522.35,528.34,535.77,536.19,546.31,
+548.35,557.32,564.05,568.07,573.98,583.22,591.50,596.61,604.17,604.20,
+611.39,620.11,621.25,633.62,631.55,640.33,647.90,653.99,666.17,662.29,
+674.87,672.86,689.86,692.73,700.73,706.09,707.43,718.54,720.80,729.02,
+731.65,738.01,742.54,752.74,760.77,769.84,772.35,777.16,781.95,785.97,
+793.59,801.02,806.56,809.77,816.79,824.27,831.62,839.56,848.35,844.29,
+859.63,856.31,867.20,875.60,885.24,885.75,893.25,901.25,904.90,908.29,
+916.18,924.15,934.93,940.38,939.93,941.91,950.27,958.20,958.89,970.39,
+977.40,981.71,987.80,997.94,1002.67,1003.74,1013.36,1014.07,1022.24,1030.91,
+1039.75,1046.27,1046.96,1053.79,1061.55,1062.75,1069.73,1077.50,1081.88,1091.05,
+1096.55,1103.45,1108.67,1110.87,1122.91,1126.72,1133.53,1135.50,1147.37,1145.95,
+1158.66,1167.99,1170.35,1176.39,1181.39,1189.12,1190.61,1198.91,1201.72,1215.11,
+1220.19,1218.44,1227.11,1237.34,1239.80,1245.29,1254.31,1262.20,1264.68,1266.68,
+1281.36,1287.36,1289.18,1298.39,1303.87,1309.35,1310.81,1321.28,1326.92,1339.22,
+1337.90,1347.90,1359.91,1355.19,1359.65,1372.14,1378.45,1381.46,1391.41,1388.86,
+1398.05,1398.54,1414.31,1412.98,1423.58,1422.93,1431.02,1445.91,1442.34,1454.05,
+1465.88,1468.68,1476.67,1481.01,1481.78,1492.12,1498.14,1506.29,1507.45,1511.00,
+1521.30,1526.37,1536.36,1544.49,1547.10,1550.17,1559.21,1569.49,1569.18,1579.54,
+1579.54,1591.65,1586.51,1596.25,1604.09,1612.55,1626.40,1622.46,1629.60,1632.35,
+1636.37,1643.81,1654.48,1662.88,1660.98,1672.32,1682.42,1687.91,1694.80,1693.18,
+1704.65,1708.57,1714.30,1719.19,1723.55,1731.50,1737.95,1744.08,1754.52,1751.06,
+1761.62,1771.80,1777.95,1783.88,1783.92,1794.52,1804.78,1801.91,1816.14,1815.33,
+65.21,72.66,77.25,81.58,90.78,95.71,100.97,105.10,113.04,121.58,
+126.56,128.96,134.61,138.70,146.00,153.74,157.90,165.66,170.43,177.23,
+183.71,185.78,191.33,200.60,204.07,209.90,215.81,222.02,229.72,234.45,
+241.00,243.76,251.60,257.73,262.59,269.65,272.63,281.36,284.93,293.95,
+295.95,303.08,308.75,314.82,319.96,327.95,333.08,338.58,343.26,347.84,
+356.52,358.95,363.26,374.26,377.68,385.05,389.89,397.23,402.10,408.42,
+413.04,421.41,425.35,435.98,438.00,441.64,444.94,455.99,460.98,467.13,
+473.12,481.65,482.36,489.67,493.16,501.75,506.75,512.27,523.05,525.04,
+529.03,534.71,539.25,548.90,557.54,558.49,561.48,570.31,576.21,582.21,
+587.33,591.67,600.05,605.29,609.57,620.12,616.63,625.52,632.86,642.66,
+645.51,650.12,660.04,660.96,669.72,673.66,678.98,684.47,691.70,700.26,
+701.60,710.83,713.65,718.25,722.72,730.88,739.07,748.18,752.63,759.47,
+757.38,770.46,771.74,782.25,780.71,788.81,799.20,801.65,807.52,819.19,
+818.09,828.83,830.44,840.64,847.48,849.94,849.52,855.75,870.54,872.70,
+875.54,883.32,888.91,892.68,898.40,908.49,910.95,917.25,924.09,933.17,
+939.64,943.59,944.61,946.37,956.78,963.06,970.41,974.65,983.03,987.07,
+994.43,999.83,1004.24,1005.97,1015.12,1022.20,1025.70,1041.96,1043.91,1045.90,
+1051.87,1053.16,1064.09,1065.40,1078.14,1084.21,1083.47,1095.81,1097.42,1106.42,
+1109.70,1111.27,1120.11,1127.43,1132.26,1143.44,1140.91,1139.14,1152.20,1159.81,
+1170.69,1171.49,1180.15,1187.43,1195.51,1199.12,1205.22,1204.92,1209.79,1215.97,
+1226.06,1233.96,1235.03,1244.24,1251.40,1250.91,1261.04,1265.86,1274.15,1278.38,
+1280.35,1290.87,1293.96,1304.44,1302.03,1310.32,1317.24,1327.97,1324.21,1331.49,
+1340.55,1346.82,1355.22,1358.99,1364.69,1365.52,1375.99,1382.42,1388.55,1388.69,
+1398.56,1407.97,1408.69,1427.26,1421.44,1443.36,1432.43,1438.42,1443.87,1454.39,
+1455.92,1461.05,1460.20,1477.00,1480.69,1490.56,1489.89,1498.31,1503.02,1507.45,
+1516.95,1521.53,1528.75,1534.50,1541.03,1542.35,1545.15,1557.76,1566.80,1565.12,
+1579.60,1578.04,1576.56,1592.95,1598.55,1596.54,1609.46,1608.76,1616.10,1622.06,
+1638.21,1635.20,1643.93,1652.90,1653.72,1663.94,1660.66,1679.55,1682.16,1688.71,
+1686.66,1692.50,1700.74,1701.61,1712.50,1724.11,1719.97,1735.35,1736.25,1739.38,
+63.40,68.64,75.66,78.88,84.85,90.99,95.30,102.59,106.93,113.22,
+118.56,124.89,131.36,134.79,141.81,147.02,153.36,159.01,164.16,169.76,
+174.21,180.81,186.17,194.15,198.83,201.25,205.90,212.99,219.79,224.29,
+229.98,232.06,241.62,247.18,253.02,256.36,260.99,264.64,274.42,277.00,
+285.47,289.38,299.21,305.64,304.25,312.37,318.62,318.31,328.55,336.95,
+337.70,347.69,351.99,358.50,363.21,369.33,373.67,378.19,382.06,389.77,
+396.07,403.79,408.39,410.07,420.09,424.43,427.63,435.91,439.11,446.99,
+450.91,455.98,468.54,470.62,475.60,484.07,487.80,485.97,493.62,501.96,
+506.26,513.96,522.59,524.82,530.26,533.37,542.93,544.95,554.20,559.29,
+566.16,570.05,571.02,577.69,587.68,588.76,593.64,601.92,607.68,613.34,
+614.60,624.56,627.15,634.03,643.45,649.08,651.57,656.17,664.23,666.21,
+673.86,676.50,688.53,692.09,698.88,702.85,705.89,708.86,718.61,726.24,
+724.13,734.11,741.14,742.89,751.89,759.61,766.42,771.62,773.95,776.77,
+783.77,791.50,795.35,804.16,810.77,812.26,821.20,820.70,829.62,832.12,
+846.82,848.04,850.75,853.30,859.32,870.41,875.73,874.72,885.84,887.22,
+896.03,903.00,909.16,911.09,914.82,926.04,928.59,937.99,940.73,951.01,
+952.56,956.60,964.72,972.49,979.43,980.47,987.97,989.54,994.03,997.54,
+1011.06,1008.15,1014.37,1027.50,1033.99,1032.25,1036.66,1051.23,1045.49,1049.67,
+1074.15,1062.76,1074.54,1077.91,1085.02,1090.74,1095.16,1098.97,1108.86,1113.05,
+1120.95,1119.99,1125.48,1137.18,1141.92,1148.97,1158.39,1155.62,1163.53,1169.35,
+1175.96,1182.15,1185.74,1189.23,1202.41,1195.52,1210.78,1220.82,1216.85,1226.77,
+1238.48,1232.08,1244.13,1243.03,1258.24,1261.67,1259.61,1262.93,1282.19,1281.74,
+1279.61,1289.31,1300.52,1300.67,1304.98,1303.71,1317.47,1320.49,1331.97,1332.57,
+1343.30,1345.77,1353.88,1359.08,1367.80,1367.12,1376.51,1380.66,1380.34,1391.70,
+1389.16,1400.60,1407.43,1419.83,1416.39,1426.12,1435.29,1445.51,1443.84,1443.53,
+1452.20,1452.92,1459.12,1470.05,1476.25,1473.53,1476.10,1491.30,1492.80,1508.35,
+1508.05,1512.99,1518.81,1517.73,1528.80,1530.93,1545.74,1544.49,1553.34,1561.46,
+1569.91,1574.32,1572.82,1581.79,1582.48,1602.67,1592.50,1601.87,1611.16,1610.32,
+1619.46,1624.16,1630.64,1635.73,1644.00,1645.95,1652.68,1659.95,1663.26,1669.33,
+58.03,64.38,70.15,74.47,81.31,86.78,89.88,97.15,101.81,105.87,
+114.36,116.10,122.61,131.43,135.57,139.83,147.08,151.13,157.15,160.93,
+170.21,172.46,174.94,183.21,188.87,191.09,196.15,204.60,207.83,215.62,
+219.67,225.33,231.83,235.53,240.75,246.23,252.72,255.89,263.93,267.99,
+271.78,278.25,285.81,288.54,294.36,299.87,304.33,310.41,316.60,321.82,
+325.90,331.63,335.28,341.74,348.11,348.32,357.19,362.08,366.71,373.48,
+379.40,382.73,390.29,394.42,401.59,405.68,414.12,415.56,422.02,426.83,
+432.60,436.79,443.09,449.18,456.92,460.16,467.29,469.47,477.94,480.25,
+488.31,490.18,494.61,503.45,507.89,510.43,513.11,524.11,525.90,532.29,
+538.53,544.69,555.00,554.40,560.55,559.51,575.30,577.94,580.76,586.68,
+591.83,594.18,603.83,606.03,613.92,619.71,622.75,628.36,638.99,637.35,
+644.63,646.91,653.59,655.88,667.40,669.79,677.79,684.01,684.90,692.71,
+698.78,703.93,705.81,712.30,722.25,722.24,728.89,738.30,742.80,744.72,
+749.93,755.36,767.96,769.57,771.68,778.04,784.34,788.11,790.92,797.65,
+803.11,808.46,816.85,815.87,828.49,830.97,836.58,840.56,843.44,846.40,
+855.35,861.76,869.09,873.72,876.11,886.83,885.08,888.50,901.03,906.22,
+907.89,912.98,925.05,929.33,930.07,934.82,940.73,953.75,950.71,963.26,
+962.63,971.31,975.77,982.63,983.81,996.62,1000.52,1000.57,1010.07,1012.45,
+1019.76,1021.58,1027.84,1029.07,1041.96,1043.31,1044.54,1055.99,1055.96,1068.29,
+1074.27,1077.19,1076.03,1081.67,1092.15,1097.41,1107.56,1104.06,1112.75,1117.12,
+1120.16,1132.36,1134.48,1145.07,1145.94,1144.70,1151.14,1159.01,1166.13,1169.96,
+1177.01,1184.48,1181.63,1188.79,1199.19,1194.88,1204.72,1208.13,1216.26,1226.67,
+1230.44,1236.47,1242.62,1250.09,1259.75,1246.70,1257.72,1266.86,1271.00,1278.39,
+1281.27,1294.92,1291.51,1302.34,1305.76,1311.02,1321.91,1323.24,1334.19,1326.81,
+1340.11,1338.59,1348.59,1347.77,1362.56,1367.90,1363.81,1373.49,1375.18,1387.46,
+1392.28,1397.58,1397.16,1401.71,1399.23,1422.80,1414.35,1429.10,1433.85,1441.97,
+1442.58,1452.18,1456.83,1457.77,1468.76,1467.75,1480.78,1475.27,1476.01,1486.12,
+1491.33,1505.40,1499.20,1518.10,1520.24,1525.02,1531.10,1540.03,1543.62,1546.40,
+1552.16,1556.72,1555.06,1565.63,1570.67,1575.72,1577.68,1589.22,1600.23,1599.26,
+58.06,64.40,67.81,71.95,80.37,83.86,88.44,94.04,97.57,103.27,
+107.77,112.77,116.93,120.95,127.75,131.76,139.22,145.14,148.04,152.64,
+159.41,164.47,166.32,173.71,180.03,184.11,188.39,196.30,202.90,203.93,
+210.27,210.56,221.97,223.74,229.16,234.44,239.67,247.81,253.59,258.63,
+259.54,265.70,271.81,275.50,280.96,288.44,292.48,298.68,297.75,308.59,
+313.90,314.53,322.96,329.29,334.11,334.43,342.97,349.27,352.80,356.34,
+362.59,367.30,373.41,376.26,380.53,390.20,393.60,397.62,407.52,405.07,
+411.77,415.90,423.70,428.08,436.13,438.86,445.09,447.25,453.22,459.06,
+462.21,470.19,473.69,478.24,487.25,488.56,492.63,502.12,502.60,512.01,
+517.06,524.10,528.13,528.67,532.59,536.01,545.81,548.59,554.85,562.17,
+565.18,574.23,570.93,579.73,588.95,591.14,593.36,602.88,609.66,614.12,
+620.43,619.22,627.97,632.11,638.03,640.20,644.92,651.97,654.55,663.27,
+673.00,678.46,674.88,679.80,688.88,689.05,699.40,698.85,706.87,714.14,
+718.57,726.69,726.24,731.84,743.55,744.88,748.40,752.63,760.00,766.39,
+765.75,774.82,776.17,779.02,789.90,792.91,798.14,801.10,814.06,822.64,
+822.95,822.31,830.87,834.80,839.48,847.08,850.70,858.85,862.41,860.11,
+876.28,881.79,882.61,891.26,896.35,899.12,898.16,904.64,910.56,914.55,
+924.28,928.22,927.85,932.84,943.23,945.82,945.75,944.77,962.58,972.91,
+970.52,978.94,983.36,985.00,993.53,1000.78,1004.58,1010.57,1008.78,1017.93,
+1018.90,1024.93,1034.42,1034.67,1052.87,1050.30,1057.68,1055.97,1060.24,1073.96,
+1075.91,1083.04,1080.48,1084.26,1098.57,1100.83,1102.07,1108.87,1111.13,1128.52,
+1119.63,1128.83,1131.12,1144.89,1147.42,1148.38,1156.67,1162.97,1167.30,1169.26,
+1180.88,1182.56,1186.63,1190.51,1193.71,1198.62,1210.93,1207.33,1211.30,1221.70,
+1225.35,1232.09,1239.86,1237.33,1250.41,1257.01,1258.52,1262.68,1263.80,1270.28,
+1282.57,1290.57,1288.60,1291.68,1303.20,1297.50,1311.14,1321.83,1317.71,1327.35,
+1327.39,1342.21,1334.19,1345.72,1349.48,1348.61,1356.54,1363.46,1372.88,1379.62,
+1384.14,1377.55,1388.42,1395.97,1390.79,1405.34,1407.90,1408.69,1426.36,1416.87,
+1440.88,1428.06,1446.25,1454.37,1449.78,1460.47,1463.63,1460.72,1473.24,1476.50,
+1489.10,1483.18,1497.61,1503.30,1508.95,1509.20,1509.75,1521.46,1522.43,1528.20,
+54.95,61.34,65.49,67.94,73.52,77.23,84.25,89.69,93.85,96.08,
+103.77,110.28,114.15,118.08,124.29,126.42,132.27,137.53,142.03,147.08,
+153.07,155.43,163.99,164.51,171.62,175.97,178.48,186.31,193.44,196.57,
+199.82,203.97,211.55,213.56,224.28,226.71,228.92,232.35,237.93,242.79,
+253.79,252.82,256.06,262.42,266.55,272.80,276.16,285.04,290.08,294.63,
+296.30,302.23,304.40,311.46,316.97,324.55,327.66,335.66,340.12,338.43,
+345.87,351.96,358.77,360.55,367.56,370.19,375.04,383.29,381.56,395.54,
+397.34,401.92,406.99,411.02,413.99,420.63,424.58,426.02,434.19,441.31,
+443.67,446.09,455.76,457.17,465.49,467.90,475.13,475.78,483.41,484.84,
+495.76,493.70,503.33,507.75,511.70,517.60,523.35,527.43,530.99,534.74,
+541.79,550.62,546.40,553.65,559.88,561.08,569.24,579.44,572.70,583.06,
+591.60,595.31,602.49,605.79,613.38,615.56,620.15,625.01,629.84,639.02,
+639.80,643.29,650.86,651.61,658.66,661.82,663.38,671.05,676.75,678.32,
+677.32,692.82,700.83,704.99,713.46,715.61,720.10,720.73,722.16,729.60,
+732.66,739.75,741.51,745.02,760.39,757.97,761.33,774.26,775.10,779.98,
+787.46,789.27,794.94,805.24,803.79,806.79,818.86,825.21,822.14,824.75,
+829.24,840.78,846.73,845.40,851.37,852.26,862.39,868.35,872.01,876.20,
+883.17,883.00,887.36,894.14,907.90,908.96,913.17,911.48,920.72,923.86,
+932.85,932.06,942.38,945.51,951.54,953.20,961.34,965.43,971.89,966.78,
+979.02,993.34,993.00,997.67,995.37,996.19,1010.84,1014.17,1013.20,1021.58,
+1026.33,1035.08,1039.62,1045.36,1041.95,1052.36,1051.39,1058.21,1064.11,1080.19,
+1077.06,1082.61,1082.77,1082.29,1092.75,1106.67,1110.46,1108.48,1108.84,1121.55,
+1121.65,1134.41,1135.52,1138.12,1136.91,1150.77,1158.04,1157.61,1165.83,1169.06,
+1174.24,1174.25,1174.00,1186.18,1191.72,1195.63,1195.95,1200.42,1213.39,1214.75,
+1223.15,1231.14,1231.29,1231.38,1238.54,1240.25,1246.13,1259.85,1266.06,1269.10,
+1270.80,1277.20,1277.97,1285.65,1290.32,1291.99,1303.59,1306.74,1312.89,1314.97,
+1320.44,1319.77,1331.04,1334.57,1343.13,1342.27,1349.54,1352.61,1358.23,1368.05,
+1373.67,1374.99,1379.99,1379.36,1387.13,1381.86,1396.34,1395.25,1403.72,1413.80,
+1420.93,1420.74,1428.10,1429.84,1428.35,1441.80,1454.55,1448.32,1453.14,1453.70,
+100.90,109.86,117.81,126.28,136.87,143.78,153.04,162.47,170.98,180.74,
+188.53,196.44,205.83,214.75,224.49,231.62,242.06,249.47,258.76,268.01,
+277.24,283.84,293.88,302.52,310.60,320.16,329.58,339.01,345.07,355.15,
+363.72,373.72,380.91,389.59,398.63,406.96,417.11,424.27,432.80,443.33,
+452.83,459.63,467.86,477.35,487.43,493.04,503.98,511.72,521.24,528.21,
+538.31,545.68,555.98,564.93,571.98,582.85,591.79,601.75,607.54,618.11,
+626.01,636.90,644.26,652.59,660.14,669.19,677.42,689.53,695.48,706.88,
+712.78,723.61,728.09,740.37,749.41,757.29,768.04,775.80,784.54,794.36,
+801.66,811.68,818.26,827.41,835.81,844.78,853.56,861.14,873.83,880.54,
+888.43,897.63,906.00,914.91,922.63,930.32,941.00,949.61,959.22,968.31,
+978.15,983.66,993.09,1001.85,1012.69,1020.67,1028.13,1036.41,1045.53,1054.67,
+1063.92,1073.19,1082.43,1088.59,1099.72,1107.61,1115.10,1125.41,1133.07,1145.15,
+1152.19,1161.37,1166.68,1178.34,1183.37,1195.11,1202.69,1212.02,1220.87,1230.93,
+1240.66,1245.94,1256.80,1265.15,1275.01,1281.60,1290.49,1302.24,1310.11,1317.95,
+1325.29,1332.29,1344.05,1352.70,1360.41,1370.39,1378.48,1388.95,1398.14,1405.83,
+1412.98,1421.84,1431.96,1438.21,1449.02,1459.95,1466.10,1477.28,1485.04,1487.66,
+1500.91,1509.97,1518.90,1528.05,1534.84,1546.55,1553.78,1564.49,1569.78,1580.66,
+1589.19,1596.35,1608.36,1615.06,1621.82,1633.84,1643.85,1649.16,1660.57,1667.16,
+1676.10,1684.90,1690.69,1704.24,1715.41,1720.98,1726.00,1742.01,1744.67,1754.66,
+1763.24,1771.77,1780.51,1790.72,1800.37,1807.16,1814.59,1826.46,1834.60,1842.51,
+1849.07,1857.31,1868.24,1877.39,1885.15,1896.19,1904.05,1911.74,1924.65,1930.26,
+1940.02,1947.38,1956.31,1968.22,1972.96,1983.70,1990.45,1996.75,2010.52,2017.88,
+2023.91,2034.29,2042.43,2052.61,2064.03,2068.52,2081.40,2089.50,2094.42,2106.92,
+2112.63,2122.39,2131.76,2141.04,2148.80,2160.83,2165.72,2170.79,2185.39,2191.41,
+2204.21,2207.59,2217.57,2226.94,2236.74,2245.27,2252.03,2259.08,2272.72,2280.20,
+2287.93,2301.93,2307.65,2316.89,2324.49,2333.52,2338.70,2349.27,2360.76,2367.04,
+2374.85,2384.15,2393.81,2404.51,2412.06,2420.38,2429.13,2434.44,2446.74,2454.68,
+2462.23,2471.42,2485.08,2491.39,2499.86,2506.50,2516.43,2526.48,2531.69,2538.41,
+2553.97,2560.11,2568.29,2576.51,2584.44,2595.53,2603.58,2613.40,2622.81,2634.11,
+99.45,107.46,115.64,123.06,133.84,142.01,149.55,158.95,165.95,175.65,
+185.27,192.74,200.53,212.51,218.88,228.03,235.91,243.56,253.57,261.11,
+267.96,278.62,288.00,294.68,303.73,310.71,320.61,328.94,337.04,345.85,
+354.57,364.49,371.18,380.98,388.12,398.37,406.94,415.19,422.68,433.32,
+440.50,449.86,459.41,466.36,474.82,484.93,492.38,499.73,507.75,518.06,
+526.74,534.02,543.67,551.67,561.41,568.44,577.22,584.29,595.20,602.62,
+611.17,621.12,630.58,636.22,646.23,656.06,662.40,671.90,678.32,688.75,
+696.78,707.66,715.67,723.20,733.90,739.43,747.77,756.66,767.30,771.56,
+782.63,790.46,798.28,807.68,815.77,825.24,834.71,844.23,850.50,860.92,
+866.31,875.49,886.96,896.58,902.30,912.36,918.29,924.47,935.63,944.03,
+954.02,962.92,970.82,979.36,988.16,995.89,1004.87,1015.51,1020.33,1028.81,
+1038.33,1048.47,1056.57,1064.56,1072.61,1081.70,1090.45,1100.08,1107.58,1115.85,
+1125.43,1131.01,1142.17,1148.52,1161.15,1166.38,1172.08,1182.65,1193.15,1200.60,
+1210.63,1217.60,1228.04,1235.17,1245.39,1249.42,1261.55,1272.13,1278.29,1286.56,
+1294.40,1306.45,1315.22,1318.11,1330.55,1336.14,1345.99,1354.68,1364.63,1371.65,
+1379.71,1389.18,1399.42,1406.68,1414.75,1424.99,1430.10,1436.20,1449.57,1457.17,
+1466.05,1477.01,1484.09,1494.38,1504.13,1509.90,1517.32,1523.15,1534.70,1543.52,
+1550.41,1560.11,1565.56,1578.60,1583.74,1594.30,1604.36,1613.47,1618.86,1628.42,
+1636.42,1646.09,1651.00,1662.05,1672.77,1681.57,1686.38,1698.23,1703.09,1713.98,
+1724.33,1731.50,1738.95,1745.86,1756.07,1765.93,1772.14,1782.31,1789.82,1798.59,
+1800.96,1811.85,1828.25,1831.47,1844.19,1848.40,1855.14,1868.95,1876.65,1886.38,
+1894.33,1900.85,1905.75,1919.11,1923.72,1936.47,1945.34,1952.15,1961.03,1972.87,
+1978.10,1987.98,1996.52,2003.75,2012.73,2024.31,2032.83,2036.43,2045.36,2057.97,
+2062.32,2076.27,2084.84,2090.60,2098.89,2106.06,2115.24,2125.41,2133.85,2140.73,
+2148.79,2158.63,2170.80,2176.11,2185.24,2191.69,2200.40,2209.46,2214.84,2223.63,
+2235.94,2245.08,2252.35,2262.68,2269.15,2276.19,2282.52,2293.54,2304.64,2313.32,
+2319.61,2329.42,2338.51,2347.70,2358.09,2363.87,2376.50,2381.32,2387.90,2399.03,
+2407.43,2415.19,2422.66,2436.66,2442.74,2449.69,2458.76,2467.03,2477.00,2481.46,
+2488.58,2499.57,2510.85,2518.27,2527.89,2537.69,2542.23,2551.28,2559.58,2569.15,
+95.97,105.74,112.08,122.58,130.06,138.40,146.94,155.73,162.91,171.73,
+180.49,187.99,196.30,205.37,213.13,222.56,228.50,238.64,245.28,255.97,
+262.99,271.12,279.09,289.62,296.75,305.90,312.51,320.33,328.53,338.69,
+345.98,354.60,363.93,370.73,379.43,388.14,395.39,404.04,413.58,420.94,
+429.37,437.97,447.32,455.73,462.26,470.77,477.42,488.56,496.58,507.08,
+513.62,523.22,528.33,537.75,546.40,555.74,562.65,569.86,579.75,587.23,
+595.68,603.91,613.79,623.72,629.46,639.40,647.83,653.33,662.46,674.58,
+681.00,686.75,694.62,704.18,711.99,719.96,731.20,737.56,745.79,752.95,
+763.61,769.58,776.09,788.09,798.34,803.16,813.68,822.02,832.02,836.56,
+846.43,854.42,862.71,870.66,880.09,887.16,896.01,903.54,917.47,921.55,
+930.40,936.39,946.92,954.79,963.46,971.58,980.62,988.78,995.54,1005.13,
+1014.44,1023.59,1029.35,1039.26,1044.86,1056.32,1062.74,1070.11,1082.07,1087.30,
+1098.25,1103.95,1112.04,1124.53,1129.38,1138.59,1148.20,1151.31,1160.25,1172.38,
+1181.54,1189.12,1195.73,1206.07,1213.66,1223.00,1228.38,1238.28,1245.18,1256.81,
+1263.19,1270.28,1277.87,1287.43,1294.93,1303.78,1311.98,1321.66,1327.86,1337.91,
+1346.68,1353.13,1363.08,1371.15,1380.72,1387.84,1395.91,1404.88,1412.31,1423.62,
+1429.92,1437.24,1446.53,1457.96,1460.35,1470.81,1479.61,1489.88,1497.61,1506.84,
+1509.61,1521.42,1533.10,1539.05,1545.32,1552.89,1565.29,1573.02,1582.84,1587.56,
+1592.96,1603.97,1612.15,1621.12,1629.62,1641.94,1649.33,1652.48,1664.27,1669.64,
+1679.79,1687.33,1696.88,1704.36,1712.08,1720.95,1729.95,1739.12,1746.04,1755.81,
+1764.46,1769.00,1778.42,1787.35,1795.24,1808.00,1812.00,1819.29,1833.57,1837.33,
+1841.57,1853.25,1864.71,1874.06,1877.58,1887.46,1897.14,1902.98,1915.23,1920.14,
+1932.89,1940.33,1947.23,1952.95,1961.39,1970.52,1977.38,1988.16,1997.86,2004.02,
+2014.24,2021.15,2032.21,2037.99,2047.33,2054.55,2063.25,2072.20,2080.02,2085.57,
+2100.82,2107.02,2114.40,2122.40,2129.81,2139.10,2150.53,2155.22,2159.69,2172.03,
+2181.82,2188.67,2192.58,2204.55,2209.07,2221.30,2234.35,2237.15,2249.14,2257.63,
+2265.41,2272.60,2285.48,2288.45,2290.79,2305.02,2312.73,2319.59,2329.70,2338.31,
+2345.71,2356.08,2362.89,2377.39,2376.63,2388.72,2393.32,2406.74,2413.26,2421.25,
+2427.82,2437.95,2446.85,2453.99,2463.17,2469.11,2481.60,2489.19,2496.27,2503.60,
+94.63,101.81,111.16,117.37,126.21,134.49,142.23,150.13,158.55,167.26,
+174.06,182.59,190.72,198.21,206.24,215.06,223.46,233.44,239.71,249.43,
+258.93,263.61,272.33,282.23,287.95,296.68,303.29,312.63,319.97,329.01,
+338.16,344.37,351.49,361.32,369.32,379.17,385.22,394.05,401.37,408.88,
+416.16,425.24,434.10,442.85,453.47,458.26,467.89,475.40,483.17,492.31,
+499.24,509.75,516.69,524.53,532.59,541.20,549.54,556.39,565.79,574.71,
+580.14,589.13,596.66,603.09,612.90,622.20,627.05,637.26,644.22,654.72,
+660.66,672.10,679.18,687.76,696.78,701.77,710.55,718.48,726.73,733.60,
+742.92,751.30,760.13,765.09,775.22,785.26,793.58,798.96,808.75,815.18,
+823.04,832.96,837.68,847.48,854.32,867.08,873.09,881.81,891.24,896.43,
+905.77,912.31,922.14,931.49,936.19,948.46,955.68,959.58,972.08,979.44,
+986.92,995.23,999.35,1010.86,1018.80,1029.47,1035.32,1041.99,1053.50,1056.94,
+1068.94,1076.07,1084.42,1092.31,1101.58,1108.12,1116.29,1124.86,1131.89,1139.97,
+1145.62,1156.36,1166.02,1173.28,1181.82,1188.09,1198.24,1205.23,1215.20,1222.12,
+1229.62,1236.28,1246.58,1254.85,1262.18,1270.34,1276.84,1289.04,1297.65,1305.63,
+1310.30,1317.80,1325.39,1335.81,1342.47,1351.87,1359.96,1363.83,1378.55,1390.90,
+1390.78,1404.13,1406.65,1415.23,1422.17,1432.85,1441.20,1451.62,1455.90,1468.86,
+1473.84,1483.58,1487.66,1500.28,1507.08,1512.31,1520.25,1530.73,1538.24,1548.95,
+1556.84,1564.23,1572.46,1579.37,1588.85,1591.41,1603.88,1613.26,1620.70,1630.37,
+1636.55,1643.85,1651.73,1664.60,1669.24,1675.14,1685.34,1690.95,1698.88,1708.85,
+1719.32,1727.48,1733.43,1741.37,1749.59,1759.47,1769.52,1771.07,1784.23,1792.42,
+1796.66,1806.50,1813.66,1822.19,1828.21,1840.07,1844.17,1857.32,1866.38,1873.60,
+1878.10,1885.46,1896.49,1904.54,1913.60,1920.43,1926.03,1935.35,1945.14,1951.01,
+1960.92,1967.55,1974.98,1985.10,1991.87,2000.06,2010.12,2015.66,2025.50,2034.07,
+2039.48,2048.66,2059.23,2067.78,2074.18,2083.64,2086.56,2098.47,2102.94,2115.66,
+2125.17,2132.82,2138.14,2151.47,2154.23,2167.95,2174.66,2187.36,2185.74,2196.51,
+2207.03,2215.01,2218.50,2225.45,2233.80,2243.67,2250.69,2259.97,2271.83,2272.56,
+2282.92,2291.84,2305.95,2308.88,2317.45,2325.05,2334.21,2339.35,2350.85,2358.53,
+2368.55,2380.66,2385.79,2391.22,2397.90,2407.03,2413.81,2417.46,2433.74,2441.32,
+90.14,100.29,108.34,115.88,123.60,131.47,138.41,145.68,153.87,161.83,
+171.39,177.82,185.14,194.66,203.74,210.95,216.02,225.75,233.57,242.51,
+248.47,256.79,267.03,271.91,281.25,286.58,296.52,304.46,313.53,320.00,
+329.06,336.26,345.75,350.17,359.12,368.24,375.82,383.05,391.29,399.62,
+408.94,413.98,423.18,431.67,438.21,447.67,455.19,461.36,469.89,479.44,
+483.89,491.64,501.16,510.18,516.30,525.61,535.63,540.21,550.15,558.09,
+565.53,571.77,582.13,588.28,599.30,605.50,611.82,619.09,628.77,635.80,
+644.72,653.24,659.43,668.09,676.11,682.86,691.04,698.37,706.94,716.84,
+724.56,732.25,736.90,745.96,755.57,763.16,772.50,776.56,786.60,792.07,
+798.19,810.19,818.37,822.60,835.57,840.75,849.08,856.34,864.84,873.42,
+880.21,889.54,898.76,902.92,913.50,920.38,928.24,935.37,943.15,948.52,
+961.43,967.76,973.95,983.76,992.09,1000.37,1009.51,1016.19,1024.67,1030.56,
+1036.65,1046.61,1057.18,1060.58,1068.64,1080.16,1088.07,1093.59,1097.05,1110.31,
+1119.40,1131.57,1130.65,1139.76,1146.55,1153.22,1163.25,1172.09,1177.49,1188.18,
+1198.36,1207.62,1213.92,1217.36,1231.05,1235.10,1245.76,1252.74,1261.34,1268.28,
+1275.86,1283.41,1294.47,1300.61,1306.42,1316.13,1325.33,1336.13,1337.68,1342.98,
+1356.69,1360.41,1373.86,1375.08,1386.58,1395.22,1402.46,1411.15,1417.10,1424.37,
+1432.40,1438.01,1449.06,1454.87,1463.07,1471.99,1479.10,1490.27,1494.61,1503.76,
+1510.65,1517.31,1527.11,1538.55,1544.74,1553.75,1560.79,1569.20,1578.96,1584.31,
+1589.84,1600.02,1607.50,1615.58,1620.76,1631.55,1640.41,1644.42,1652.22,1664.72,
+1669.47,1675.98,1684.45,1697.05,1704.28,1708.95,1721.06,1725.57,1732.97,1741.45,
+1753.39,1758.74,1768.24,1773.89,1782.66,1790.45,1792.09,1806.33,1812.15,1822.51,
+1826.55,1835.55,1844.24,1851.59,1860.63,1864.59,1876.36,1888.72,1890.00,1896.96,
+1906.41,1918.04,1920.99,1930.73,1938.68,1948.14,1958.58,1958.16,1966.92,1979.18,
+1986.96,1993.26,2005.34,2014.62,2016.76,2024.64,2029.13,2041.59,2047.96,2054.58,
+2066.32,2071.26,2083.58,2091.51,2097.25,2107.64,2118.80,2121.16,2129.80,2140.85,
+2145.64,2149.38,2158.59,2173.57,2179.08,2187.81,2190.40,2200.47,2208.91,2216.68,
+2228.24,2228.96,2239.91,2243.13,2253.89,2265.65,2270.18,2275.55,2285.22,2294.19,
+2306.62,2306.00,2312.81,2324.75,2333.72,2346.31,2346.92,2358.05,2366.69,2369.08,
+87.56,95.87,102.37,111.87,119.97,126.64,133.43,143.27,150.96,156.92,
+166.25,174.09,180.47,188.69,196.25,203.85,212.41,218.91,227.91,234.44,
+242.24,250.44,258.22,266.38,273.68,281.27,288.62,295.56,303.57,312.81,
+320.39,325.34,334.12,340.96,348.56,357.42,364.56,373.18,377.44,390.29,
+395.71,402.69,410.40,418.62,427.64,434.15,441.91,449.92,454.20,463.48,
+474.82,480.47,486.35,497.79,501.62,510.91,518.39,525.57,535.73,543.75,
+545.59,558.23,565.90,570.59,577.56,586.48,594.38,602.14,610.66,619.42,
+625.69,631.78,636.04,648.55,655.77,663.97,671.85,677.67,686.59,696.19,
+701.90,709.27,717.41,725.98,734.10,739.72,750.22,759.78,760.33,772.80,
+780.44,784.98,797.24,802.32,808.49,817.25,824.39,833.78,841.74,847.55,
+857.76,862.55,872.56,879.34,886.31,890.33,903.24,912.67,919.90,925.49,
+931.79,939.07,950.75,955.38,960.97,970.69,977.36,989.28,991.54,1002.52,
+1007.80,1014.51,1026.10,1032.59,1038.46,1046.13,1057.37,1063.20,1071.31,1081.30,
+1085.56,1093.75,1097.48,1109.60,1120.22,1127.02,1132.70,1136.66,1147.07,1152.37,
+1164.12,1169.91,1180.78,1184.29,1194.67,1199.05,1208.97,1215.40,1227.07,1230.32,
+1240.28,1246.00,1258.50,1263.20,1269.55,1282.48,1285.39,1295.46,1302.35,1308.58,
+1316.63,1321.82,1333.48,1338.07,1347.89,1350.80,1361.74,1369.75,1376.07,1389.28,
+1391.57,1401.86,1408.78,1413.28,1419.88,1433.53,1437.89,1446.22,1458.16,1462.77,
+1473.48,1477.92,1485.65,1490.67,1498.59,1509.30,1516.75,1523.40,1530.71,1538.15,
+1550.66,1553.58,1562.83,1569.46,1575.67,1582.38,1594.74,1600.07,1612.31,1609.72,
+1623.80,1628.76,1639.30,1644.98,1656.02,1656.70,1666.48,1674.98,1682.20,1692.98,
+1708.40,1707.27,1711.98,1723.42,1731.45,1736.09,1746.80,1756.05,1764.97,1767.85,
+1776.57,1785.33,1791.90,1798.75,1807.47,1811.45,1823.23,1827.76,1837.24,1846.04,
+1854.06,1858.04,1869.52,1868.88,1886.98,1892.18,1902.32,1907.19,1912.26,1922.51,
+1934.38,1936.33,1943.94,1956.78,1957.91,1966.40,1977.53,1982.01,1985.24,1997.47,
+2008.12,2012.88,2024.37,2027.57,2042.94,2047.30,2056.29,2059.17,2069.00,2074.68,
+2081.72,2084.51,2100.61,2110.54,2118.83,2121.21,2131.34,2138.20,2145.74,2157.16,
+2157.84,2167.90,2173.84,2182.29,2189.66,2198.60,2206.99,2218.36,2221.48,2230.31,
+2240.05,2245.30,2245.68,2257.68,2269.85,2277.76,2283.33,2291.59,2298.19,2299.08,
+85.42,93.89,100.70,109.17,115.77,122.66,132.88,138.53,145.47,154.76,
+160.62,166.86,175.14,184.45,191.11,197.07,203.44,211.47,220.89,227.09,
+236.18,243.09,250.74,256.54,266.80,271.41,279.92,287.38,295.24,302.21,
+310.23,318.55,323.95,335.46,336.51,346.34,353.41,361.17,369.67,379.36,
+385.17,391.27,399.86,404.59,415.25,422.91,425.91,434.84,443.75,451.60,
+460.59,466.63,473.11,481.85,488.92,496.82,503.20,512.38,517.78,526.15,
+535.21,537.07,547.62,556.45,561.65,567.76,578.57,584.73,594.24,598.08,
+607.73,614.06,624.17,631.76,640.23,644.03,653.08,661.47,666.57,674.20,
+682.65,689.75,695.57,702.38,711.46,720.03,724.14,733.96,742.18,747.99,
+759.03,763.07,770.16,779.97,787.04,793.55,803.57,812.38,813.87,822.65,
+827.95,835.11,845.87,851.37,860.92,866.27,873.21,886.11,888.53,895.44,
+901.22,907.87,921.46,925.56,931.16,942.71,950.77,958.61,963.74,975.05,
+982.84,990.12,991.60,1002.69,1010.23,1021.08,1022.97,1030.95,1040.42,1050.98,
+1055.48,1062.02,1069.74,1077.20,1083.01,1091.06,1099.91,1103.84,1112.25,1123.24,
+1129.18,1137.31,1139.78,1154.18,1160.14,1167.19,1170.78,1178.78,1188.79,1196.84,
+1203.90,1216.15,1221.67,1225.80,1231.57,1239.08,1247.56,1251.32,1261.80,1269.68,
+1280.24,1282.34,1290.68,1300.49,1307.45,1314.51,1321.30,1327.70,1335.73,1347.67,
+1349.39,1359.60,1374.10,1377.27,1377.49,1390.52,1398.95,1403.93,1408.97,1418.00,
+1425.80,1432.06,1441.16,1445.69,1459.62,1462.51,1468.21,1477.72,1483.81,1494.37,
+1502.68,1511.16,1514.51,1523.15,1524.26,1544.29,1549.07,1552.07,1559.04,1575.78,
+1571.14,1582.51,1589.55,1594.34,1609.11,1615.74,1619.31,1629.55,1634.60,1639.39,
+1650.51,1658.16,1667.19,1672.32,1681.33,1691.12,1695.88,1704.84,1707.73,1717.89,
+1725.29,1732.08,1737.52,1748.52,1754.44,1761.63,1771.66,1773.74,1783.63,1794.61,
+1801.08,1814.60,1813.09,1820.40,1829.56,1835.16,1844.78,1852.90,1863.78,1867.25,
+1875.65,1882.57,1893.28,1894.61,1900.24,1911.05,1918.09,1927.93,1936.07,1951.76,
+1953.73,1958.22,1962.73,1970.78,1978.50,1985.90,1992.94,1998.82,2002.54,2013.19,
+2025.86,2035.08,2039.13,2045.14,2049.59,2055.65,2072.35,2078.85,2084.37,2091.07,
+2097.18,2102.40,2114.87,2121.85,2125.07,2130.20,2142.77,2153.18,2153.98,2163.31,
+2173.56,2182.07,2191.01,2192.25,2205.72,2206.72,2207.65,2228.48,2229.26,2235.59,
+83.05,90.77,98.02,105.57,112.12,120.15,127.40,132.41,142.51,150.40,
+157.26,163.91,171.26,178.43,184.88,191.44,203.82,206.58,212.68,219.51,
+228.79,234.91,240.61,250.18,257.92,262.44,271.07,278.23,285.31,290.60,
+301.56,306.73,313.24,321.24,330.56,335.36,343.93,351.08,359.76,364.75,
+370.67,380.45,387.09,394.28,401.56,409.15,415.19,425.39,429.71,438.76,
+442.87,452.20,459.68,465.55,474.23,479.92,487.03,493.96,502.51,507.63,
+515.78,524.75,530.03,538.26,544.08,554.28,559.07,564.96,575.69,582.44,
+589.49,596.50,600.73,610.26,618.25,623.29,632.03,637.57,646.36,654.33,
+663.70,672.71,673.36,683.97,690.02,697.17,703.43,712.24,721.12,724.87,
+734.33,743.31,745.30,756.34,761.79,767.97,777.87,783.59,791.69,796.18,
+805.86,809.94,819.94,827.73,832.50,843.97,850.38,856.01,862.28,868.90,
+876.66,885.15,898.50,898.08,905.84,911.02,921.89,926.82,940.93,946.30,
+947.92,956.62,963.90,971.35,979.99,987.22,993.41,1001.32,1008.72,1016.01,
+1023.20,1027.78,1036.61,1042.33,1053.07,1056.86,1066.49,1073.25,1081.85,1089.57,
+1096.52,1102.78,1108.00,1113.42,1121.02,1131.85,1136.80,1145.52,1153.40,1162.12,
+1164.60,1174.16,1180.52,1186.93,1194.16,1201.69,1209.79,1216.58,1227.72,1231.45,
+1235.19,1242.80,1252.59,1263.55,1271.32,1275.70,1283.51,1288.50,1296.03,1304.50,
+1309.18,1317.08,1323.09,1332.39,1340.77,1342.86,1353.23,1361.86,1372.86,1379.66,
+1385.05,1389.39,1395.20,1406.83,1412.79,1418.62,1426.96,1439.03,1438.63,1449.60,
+1452.27,1462.85,1466.36,1474.32,1483.06,1490.27,1499.23,1508.56,1514.37,1519.80,
+1526.54,1536.38,1540.34,1544.79,1559.37,1568.81,1572.04,1581.17,1586.14,1591.87,
+1600.14,1605.52,1617.13,1622.51,1631.37,1636.52,1647.18,1651.50,1657.65,1665.15,
+1667.41,1679.78,1689.13,1696.23,1698.16,1712.83,1718.17,1723.20,1727.14,1739.40,
+1744.98,1751.00,1755.82,1764.22,1775.59,1777.46,1790.95,1795.60,1802.12,1809.75,
+1814.98,1825.18,1828.29,1835.01,1845.48,1852.07,1855.75,1864.25,1874.83,1876.00,
+1893.96,1893.98,1901.03,1916.63,1913.63,1923.53,1931.86,1939.21,1944.08,1951.24,
+1961.35,1975.78,1978.84,1988.63,1993.22,1999.01,2002.39,2014.81,2020.43,2026.46,
+2029.95,2037.78,2049.92,2056.78,2061.52,2067.26,2077.35,2084.22,2091.31,2093.04,
+2110.71,2109.83,2123.82,2128.10,2134.76,2140.93,2150.92,2153.88,2162.74,2169.23,
+80.57,88.39,94.37,102.47,107.92,115.07,124.30,131.55,136.87,144.40,
+149.73,159.70,165.80,172.32,181.71,186.32,194.93,201.06,205.90,213.37,
+218.14,229.62,233.49,242.18,248.35,254.85,263.62,267.61,274.78,282.96,
+291.62,297.39,305.49,313.02,322.30,324.36,332.51,342.16,346.53,353.82,
+362.11,370.43,376.41,381.52,387.36,395.81,400.27,410.74,416.51,422.45,
+429.64,437.77,443.57,449.82,459.71,466.38,472.12,481.17,488.65,495.72,
+501.09,510.73,514.84,520.29,529.38,537.02,540.15,548.03,558.22,563.67,
+571.29,580.83,584.22,589.24,602.67,603.99,613.92,619.28,625.82,638.32,
+638.88,644.90,654.58,662.28,668.02,676.16,680.91,693.63,698.77,703.02,
+708.35,716.37,729.30,728.38,735.90,743.46,754.92,757.98,766.95,771.82,
+779.04,785.57,793.51,801.92,807.90,813.08,823.07,833.66,837.93,842.62,
+848.35,860.79,866.03,874.67,874.97,891.97,892.16,898.24,904.79,915.40,
+919.62,932.62,939.03,938.51,944.13,954.00,961.87,973.74,977.26,983.75,
+988.88,998.35,1003.68,1012.31,1019.48,1023.85,1027.58,1042.10,1042.19,1055.19,
+1060.24,1067.38,1075.29,1083.60,1085.47,1091.47,1103.43,1106.08,1120.77,1126.88,
+1128.39,1136.59,1140.85,1146.39,1156.74,1171.00,1173.48,1182.40,1183.99,1193.70,
+1203.30,1209.58,1213.18,1224.73,1227.80,1230.03,1243.62,1251.16,1253.77,1262.49,
+1266.70,1282.01,1284.86,1292.24,1299.19,1306.97,1307.74,1320.20,1327.02,1330.16,
+1338.18,1347.69,1354.00,1367.08,1365.88,1376.10,1382.95,1388.23,1397.83,1405.94,
+1414.11,1420.96,1425.65,1429.00,1439.99,1449.34,1452.64,1457.24,1469.36,1473.05,
+1477.59,1481.07,1493.39,1503.09,1505.69,1515.60,1523.34,1528.11,1532.62,1543.42,
+1550.73,1553.25,1562.28,1571.16,1577.71,1582.35,1596.61,1603.73,1604.88,1615.12,
+1619.86,1627.29,1634.16,1641.62,1647.82,1650.96,1663.12,1671.28,1673.77,1681.68,
+1695.78,1699.57,1703.76,1709.06,1720.51,1724.28,1724.50,1737.58,1743.73,1756.75,
+1757.67,1764.59,1770.68,1782.92,1792.85,1788.43,1798.54,1808.69,1815.82,1826.04,
+1829.43,1839.45,1842.93,1849.22,1851.49,1864.58,1868.51,1877.61,1882.80,1894.37,
+1897.08,1907.12,1908.22,1922.33,1929.05,1934.67,1941.94,1951.37,1954.62,1960.57,
+1973.02,1974.76,1978.44,1994.47,1994.59,2007.58,2008.81,2014.95,2023.03,2029.23,
+2039.83,2044.18,2051.76,2061.72,2062.92,2074.95,2079.37,2094.01,2099.43,2103.72,
+79.08,85.56,91.25,97.85,105.15,111.59,119.65,125.85,131.87,139.55,
+145.22,153.25,159.45,166.75,172.31,178.69,188.62,194.37,198.88,205.18,
+214.31,220.53,226.41,235.49,241.82,246.24,255.28,258.91,267.27,274.51,
+281.10,287.92,294.22,299.95,310.11,313.26,319.81,330.08,335.02,341.59,
+351.48,355.44,362.67,370.57,378.99,384.86,390.74,394.87,402.75,409.26,
+420.59,425.42,429.28,438.66,441.59,451.53,457.91,462.86,472.19,479.16,
+480.90,489.89,497.16,506.64,510.19,517.57,524.53,532.85,535.74,545.41,
+553.83,556.11,567.43,573.76,583.17,585.89,590.40,598.17,605.88,611.74,
+617.29,625.92,632.85,640.65,649.31,653.56,658.96,668.70,673.97,677.27,
+687.03,697.19,693.61,707.48,714.15,721.82,731.45,738.60,742.79,747.81,
+749.14,764.59,769.12,774.37,781.52,791.14,801.73,801.45,811.19,818.28,
+818.88,829.54,835.32,846.23,850.16,857.74,864.68,871.11,876.94,882.50,
+890.18,901.22,905.29,919.11,923.41,925.52,932.25,937.44,944.51,952.11,
+957.78,963.70,973.46,984.55,988.52,990.41,1001.45,1009.99,1012.84,1019.64,
+1028.65,1028.41,1037.27,1047.72,1052.43,1058.82,1067.20,1072.85,1080.21,1087.74,
+1093.10,1108.69,1104.06,1111.16,1121.15,1121.40,1131.87,1143.39,1149.93,1154.86,
+1161.40,1169.08,1177.26,1181.05,1189.99,1194.07,1201.20,1211.00,1218.01,1221.90,
+1232.45,1241.05,1247.27,1252.74,1258.59,1264.43,1270.80,1277.92,1283.30,1292.43,
+1302.44,1300.28,1308.59,1317.02,1322.37,1332.99,1336.10,1346.57,1353.90,1356.69,
+1362.36,1371.01,1374.37,1381.81,1392.72,1405.65,1404.07,1408.82,1415.54,1424.33,
+1430.21,1439.99,1445.83,1453.94,1466.40,1463.50,1473.98,1475.40,1491.38,1495.25,
+1495.76,1503.82,1514.64,1519.40,1525.39,1533.33,1539.35,1550.25,1554.00,1560.51,
+1569.27,1572.91,1582.38,1593.41,1594.60,1599.41,1605.56,1615.82,1624.61,1631.61,
+1637.59,1644.13,1653.52,1653.33,1671.30,1671.86,1673.65,1683.12,1693.66,1701.25,
+1703.28,1713.66,1717.85,1720.22,1730.18,1742.67,1744.82,1744.10,1764.01,1761.61,
+1770.07,1779.88,1786.91,1792.93,1795.75,1804.49,1815.81,1824.71,1818.27,1834.29,
+1840.61,1845.51,1848.95,1870.39,1868.89,1873.26,1875.06,1889.85,1893.73,1897.05,
+1911.96,1915.31,1922.64,1931.26,1931.64,1940.21,1945.43,1954.18,1957.05,1963.35,
+1974.71,1985.09,1989.56,1994.90,1997.99,2004.12,2015.55,2016.75,2027.64,2033.85,
+76.82,82.09,87.58,96.30,100.18,106.58,115.73,121.79,128.10,133.20,
+141.62,148.50,153.55,161.41,167.48,174.12,180.84,186.40,193.19,201.06,
+204.87,210.69,220.36,227.90,234.19,238.41,247.52,249.91,259.19,264.44,
+272.35,277.82,285.32,290.95,300.05,305.85,312.19,319.12,326.68,332.69,
+336.89,344.28,350.51,357.68,364.82,369.33,374.99,382.06,393.05,396.91,
+406.39,409.43,414.98,422.92,430.48,437.26,438.77,448.65,453.37,462.73,
+468.06,475.65,484.05,486.19,492.54,502.98,507.50,512.86,525.46,528.51,
+536.02,541.44,546.97,557.33,562.18,563.29,571.16,579.09,582.11,590.67,
+603.21,608.00,611.19,617.76,628.09,631.57,635.85,644.59,653.34,658.21,
+659.27,672.15,677.66,685.07,693.66,696.34,707.87,710.12,715.20,724.54,
+731.30,737.61,747.38,753.04,754.29,762.52,767.37,777.62,786.57,790.46,
+798.95,801.66,807.38,817.83,820.48,829.42,838.73,838.18,847.04,852.25,
+863.73,865.58,874.84,879.33,887.95,891.66,906.24,904.35,909.88,924.12,
+924.83,934.00,937.58,944.29,957.45,963.68,966.61,980.38,978.43,988.73,
+990.27,1000.28,1003.35,1009.91,1020.87,1031.88,1035.45,1032.65,1048.58,1051.03,
+1061.16,1061.45,1067.42,1081.35,1085.09,1093.89,1097.22,1103.72,1118.51,1114.64,
+1124.63,1132.33,1137.23,1141.89,1152.77,1161.51,1163.05,1168.59,1176.04,1187.82,
+1190.10,1188.61,1205.99,1212.71,1215.69,1222.30,1230.23,1229.67,1241.43,1252.06,
+1252.10,1258.34,1274.30,1277.87,1282.65,1283.05,1297.57,1299.93,1310.01,1313.24,
+1321.21,1328.46,1328.18,1340.51,1346.09,1353.96,1356.64,1375.69,1373.83,1381.50,
+1379.50,1397.79,1398.92,1402.48,1416.40,1418.45,1424.10,1437.07,1434.95,1444.75,
+1450.66,1456.72,1470.99,1474.79,1473.51,1485.69,1488.84,1499.80,1500.51,1513.31,
+1515.77,1519.31,1527.25,1544.63,1547.13,1548.62,1556.38,1561.75,1559.26,1582.14,
+1583.17,1589.18,1593.62,1598.78,1612.49,1614.13,1627.78,1629.50,1632.28,1644.34,
+1661.36,1656.84,1655.98,1670.85,1674.44,1683.55,1690.48,1688.80,1703.16,1709.41,
+1712.33,1717.05,1725.21,1727.55,1736.22,1744.51,1749.34,1763.43,1765.19,1766.31,
+1780.94,1786.04,1789.05,1795.87,1803.93,1807.49,1820.25,1819.87,1831.31,1828.01,
+1850.67,1853.13,1858.83,1861.36,1868.25,1873.10,1887.63,1886.12,1896.44,1905.11,
+1906.23,1917.83,1923.96,1927.48,1936.48,1935.45,1955.60,1955.76,1967.76,1970.96,
+71.31,76.43,88.16,92.96,99.10,103.92,110.68,114.51,126.02,128.90,
+136.95,142.16,148.04,154.83,163.62,168.19,174.19,181.31,186.62,191.48,
+200.45,208.47,212.34,218.47,223.47,229.54,237.99,244.63,249.11,256.48,
+261.39,266.87,277.53,281.96,285.77,293.32,299.57,306.74,315.65,321.90,
+325.11,331.36,341.42,346.86,352.90,357.58,363.72,370.87,379.19,384.72,
+391.98,395.36,400.94,408.93,416.03,417.77,428.14,437.09,435.81,448.58,
+455.69,453.68,466.00,469.53,481.12,487.35,492.04,493.51,501.69,508.52,
+516.83,521.65,525.92,534.68,540.73,548.55,553.01,564.79,566.10,572.34,
+576.83,589.17,595.23,598.64,604.88,615.57,619.79,623.58,631.84,635.12,
+646.36,652.02,659.12,660.84,666.48,671.70,680.40,690.05,693.27,699.23,
+709.48,712.83,717.35,726.45,730.86,737.09,741.68,746.44,754.81,760.64,
+771.67,775.72,786.17,790.06,794.59,803.78,807.83,816.12,820.58,830.07,
+839.41,841.00,845.40,848.88,855.78,862.77,870.35,875.67,884.28,892.72,
+890.55,901.43,912.26,912.76,922.34,928.79,936.51,943.47,946.80,951.13,
+962.22,963.65,972.73,977.64,991.74,986.94,992.32,1002.43,1011.21,1013.16,
+1023.40,1033.93,1036.51,1047.99,1045.59,1057.64,1061.85,1071.14,1077.07,1075.87,
+1081.63,1096.65,1095.88,1103.77,1112.47,1114.78,1127.52,1131.90,1133.67,1143.35,
+1154.25,1159.34,1165.03,1164.55,1179.80,1179.01,1186.45,1192.27,1199.74,1204.30,
+1216.71,1217.00,1220.81,1231.55,1234.26,1243.72,1245.80,1258.29,1264.01,1266.33,
+1271.13,1279.07,1286.15,1298.47,1302.60,1309.56,1309.07,1314.46,1320.10,1331.74,
+1343.10,1345.05,1357.64,1359.19,1368.55,1379.45,1378.49,1383.57,1390.79,1395.74,
+1403.84,1408.70,1413.24,1420.67,1430.66,1435.91,1440.91,1450.55,1444.83,1460.31,
+1463.96,1472.53,1475.46,1490.31,1494.80,1497.37,1505.15,1512.07,1517.63,1521.97,
+1527.73,1531.84,1546.97,1540.45,1552.39,1558.80,1567.63,1576.24,1587.80,1586.48,
+1585.71,1604.35,1604.54,1602.42,1616.01,1622.26,1627.86,1633.68,1641.02,1655.65,
+1660.28,1669.80,1664.01,1670.10,1678.73,1682.58,1692.27,1698.04,1704.14,1708.65,
+1718.43,1726.39,1735.61,1744.19,1740.98,1752.31,1752.60,1762.02,1773.26,1779.07,
+1782.56,1783.39,1795.96,1807.25,1810.98,1813.40,1817.86,1829.29,1837.63,1838.79,
+1845.93,1856.59,1859.03,1863.06,1873.27,1875.34,1880.33,1893.52,1893.48,1900.32,
+70.78,77.62,83.81,89.42,95.68,101.77,107.72,113.13,120.58,125.27,
+131.48,136.86,141.03,151.59,157.63,161.44,168.30,176.23,178.56,186.51,
+192.46,201.22,205.16,210.17,217.51,226.62,229.34,236.35,240.75,250.11,
+253.61,261.01,268.24,275.42,278.98,285.91,288.99,296.97,304.61,307.93,
+316.18,319.43,328.65,334.89,339.88,345.32,352.98,355.68,365.88,368.57,
+376.33,382.39,389.45,397.35,399.86,404.72,411.82,420.29,427.33,431.60,
+441.01,446.49,451.10,457.06,461.28,467.25,475.91,478.73,484.28,490.66,
+497.70,504.83,508.81,517.49,528.31,530.43,534.66,542.03,550.64,554.76,
+558.25,567.18,569.78,577.10,581.45,592.49,600.48,600.43,610.37,614.62,
+619.80,633.05,631.21,636.71,644.73,653.63,659.03,667.97,667.23,676.98,
+683.69,693.64,696.91,699.69,708.30,712.26,717.97,726.78,731.22,739.24,
+739.50,745.84,755.38,758.43,772.55,769.76,775.97,787.77,793.51,799.09,
+803.05,809.49,813.64,826.87,832.02,832.99,841.56,842.22,851.34,861.58,
+864.93,873.85,878.16,883.43,889.98,893.69,901.95,908.92,919.15,921.26,
+930.03,931.45,938.30,947.12,952.73,953.31,965.18,971.06,974.24,983.79,
+985.03,992.83,994.84,1003.62,1011.01,1013.02,1026.41,1029.61,1042.70,1040.38,
+1048.73,1056.21,1059.71,1064.05,1077.68,1080.78,1083.42,1091.15,1100.99,1108.61,
+1111.93,1118.46,1116.47,1129.09,1125.82,1139.80,1145.91,1154.52,1163.96,1171.07,
+1174.08,1175.18,1184.86,1190.13,1199.67,1198.97,1206.22,1217.90,1221.03,1227.94,
+1229.18,1237.16,1242.45,1249.57,1256.94,1261.66,1271.27,1276.89,1277.07,1290.16,
+1289.96,1295.08,1306.44,1303.40,1315.71,1325.44,1327.68,1330.55,1337.71,1345.91,
+1353.59,1356.43,1367.56,1369.44,1379.82,1384.42,1393.68,1390.88,1402.94,1412.13,
+1417.51,1419.81,1427.88,1431.27,1438.45,1441.74,1446.65,1459.32,1464.81,1471.41,
+1474.76,1476.88,1492.71,1493.30,1498.66,1508.66,1514.53,1521.28,1524.16,1535.49,
+1536.17,1543.06,1549.29,1559.54,1569.28,1564.93,1573.30,1582.74,1582.75,1591.19,
+1596.31,1598.94,1613.01,1620.97,1625.65,1627.93,1637.37,1644.63,1641.96,1655.30,
+1651.65,1663.34,1668.77,1681.20,1682.16,1691.06,1691.88,1696.42,1711.35,1713.25,
+1722.62,1729.76,1731.94,1742.10,1752.78,1747.98,1764.70,1759.14,1768.48,1774.00,
+1789.16,1787.42,1797.24,1790.92,1803.02,1803.52,1816.68,1828.18,1823.55,1838.21,
+68.99,75.57,80.82,86.39,91.67,99.06,102.30,108.58,117.14,122.17,
+127.44,133.27,139.30,143.97,152.44,155.55,161.26,170.53,176.49,183.08,
+183.71,193.35,197.53,205.81,209.55,213.62,221.84,225.77,233.83,239.10,
+244.26,249.69,258.58,261.63,266.87,274.37,279.90,285.98,291.94,300.05,
+304.72,304.30,313.04,325.61,331.15,331.91,338.36,345.82,350.81,355.48,
+365.73,368.85,374.88,381.62,387.03,394.34,399.29,405.11,409.69,416.55,
+423.32,425.48,430.28,443.46,444.62,447.68,455.30,461.95,469.82,479.98,
+479.95,484.89,491.84,498.03,500.41,505.68,519.77,522.03,534.53,533.48,
+538.12,547.28,551.86,557.16,567.70,569.11,577.79,584.70,588.92,587.71,
+602.16,605.32,613.42,615.45,622.44,631.36,637.46,641.84,647.23,656.75,
+662.56,666.19,668.35,677.06,678.55,686.28,689.35,702.39,703.64,709.12,
+713.71,724.59,730.66,735.96,743.50,747.14,756.93,758.39,763.28,772.58,
+775.21,779.52,785.22,794.44,801.78,809.25,812.23,820.58,822.03,827.71,
+837.10,837.78,849.69,854.62,861.62,865.66,873.10,881.54,874.84,885.98,
+893.25,897.05,902.98,907.95,915.75,920.00,929.47,936.71,939.17,948.95,
+945.55,959.81,965.54,966.75,984.45,984.39,983.05,993.55,1001.31,1002.78,
+1012.24,1018.17,1020.99,1026.12,1035.86,1038.41,1045.79,1048.62,1060.47,1068.34,
+1074.84,1081.18,1082.22,1084.84,1093.66,1105.88,1100.95,1109.86,1122.07,1126.34,
+1125.95,1137.75,1141.15,1149.25,1141.95,1156.50,1163.11,1158.37,1172.70,1182.43,
+1195.40,1198.24,1199.93,1205.77,1218.15,1225.35,1223.14,1233.94,1236.52,1243.63,
+1249.65,1253.21,1262.41,1268.67,1272.06,1277.40,1281.37,1290.43,1292.42,1293.99,
+1308.36,1308.62,1317.03,1324.92,1324.75,1335.07,1343.75,1345.07,1359.97,1357.57,
+1371.87,1372.16,1379.59,1380.49,1395.82,1396.15,1398.93,1407.69,1414.57,1419.62,
+1425.56,1428.14,1430.42,1443.91,1450.36,1455.25,1455.42,1458.54,1472.66,1476.97,
+1485.09,1485.00,1497.87,1500.93,1507.19,1512.30,1514.73,1522.77,1531.75,1542.85,
+1546.05,1544.58,1561.06,1563.94,1568.85,1570.72,1577.80,1583.11,1586.49,1591.42,
+1601.22,1606.07,1616.84,1626.82,1627.35,1631.48,1635.82,1644.55,1652.59,1656.79,
+1656.38,1663.88,1676.16,1680.95,1683.76,1683.31,1693.91,1708.35,1711.41,1706.64,
+1720.50,1723.85,1730.71,1730.99,1744.97,1751.33,1759.00,1757.40,1768.76,1774.65,
+66.00,70.54,76.11,85.05,86.87,96.40,98.33,104.78,111.11,119.07,
+120.15,128.55,134.35,141.05,144.15,152.94,157.62,163.61,169.06,171.47,
+177.80,187.09,190.74,197.50,202.54,206.76,214.29,219.74,224.63,231.59,
+238.07,242.65,247.23,253.61,259.14,263.07,273.34,276.50,283.56,287.93,
+292.55,299.88,304.41,308.73,314.75,320.52,326.35,333.38,339.38,344.53,
+348.90,354.20,362.06,364.99,368.84,379.10,385.64,392.61,396.29,399.23,
+406.23,412.29,420.65,423.89,431.49,436.15,442.89,445.90,453.14,461.19,
+462.66,472.61,473.33,482.76,492.88,489.87,497.27,501.14,507.42,516.29,
+523.26,524.57,531.21,542.22,545.29,546.17,552.36,562.58,560.24,568.63,
+576.16,577.52,590.92,594.30,600.04,614.98,611.34,616.64,625.86,627.12,
+639.53,638.94,648.14,651.96,652.85,666.46,668.31,671.31,681.99,687.33,
+690.92,693.63,703.71,711.04,706.26,719.41,724.04,734.11,739.27,739.61,
+750.48,756.44,760.80,767.62,777.68,773.27,785.83,784.38,791.48,801.79,
+800.93,805.99,816.07,822.75,820.99,835.18,836.47,847.53,845.43,854.50,
+863.32,874.84,875.50,876.08,881.49,886.58,892.57,906.55,910.96,909.52,
+921.38,919.58,928.89,942.47,941.40,945.97,957.58,951.39,964.66,968.97,
+978.63,976.65,983.72,996.95,999.18,1005.76,1012.90,1015.21,1019.70,1035.65,
+1028.42,1037.27,1038.72,1048.43,1051.30,1059.47,1067.89,1070.06,1081.93,1089.63,
+1088.31,1097.71,1101.47,1107.32,1115.18,1115.37,1124.96,1133.60,1134.28,1140.71,
+1148.55,1155.00,1155.74,1162.02,1167.21,1171.55,1181.79,1176.55,1199.13,1198.18,
+1199.69,1211.15,1217.21,1211.54,1229.53,1231.73,1237.83,1243.45,1246.79,1253.45,
+1255.22,1266.87,1270.53,1272.34,1290.92,1295.04,1295.43,1298.63,1302.07,1307.07,
+1320.93,1326.69,1323.76,1331.58,1339.15,1339.72,1350.64,1359.56,1370.62,1370.72,
+1371.77,1375.06,1379.63,1391.66,1394.92,1402.73,1408.33,1415.74,1418.01,1421.34,
+1435.18,1443.03,1445.00,1439.17,1451.48,1458.72,1468.56,1470.58,1481.48,1478.91,
+1493.60,1493.41,1497.24,1504.36,1505.64,1520.55,1524.90,1531.80,1528.04,1533.72,
+1540.61,1550.32,1551.69,1561.01,1572.25,1579.08,1576.55,1584.57,1595.91,1594.76,
+1593.01,1604.16,1612.66,1614.56,1632.09,1626.81,1636.59,1640.22,1643.61,1653.83,
+1664.35,1663.02,1669.93,1675.42,1687.93,1689.50,1689.51,1694.24,1707.42,1709.69
+};
+
+static float sdNumAnchorBases[] = {
+10.47,11.01,11.78,12.26,12.43,13.04,13.75,14.08,14.11,14.49,
+14.74,15.81,15.99,15.62,16.58,17.02,16.57,17.20,18.15,17.63,
+18.48,19.41,18.70,19.14,19.41,20.03,20.56,20.43,20.46,21.47,
+21.07,21.28,21.95,22.04,21.45,21.87,21.85,22.52,23.14,22.68,
+24.44,24.88,25.07,24.79,24.77,24.21,24.11,25.63,24.57,25.71,
+26.63,25.26,25.82,26.59,27.08,27.18,26.79,27.40,27.87,28.39,
+28.63,28.69,28.37,28.13,29.13,28.40,28.26,28.58,30.29,29.36,
+29.27,30.63,30.50,30.40,30.47,31.36,31.66,32.16,30.65,31.06,
+31.33,33.04,31.60,31.30,32.57,32.25,33.19,34.46,33.39,33.76,
+35.66,35.45,34.05,33.60,34.05,33.54,35.39,33.48,33.98,35.37,
+35.47,35.37,34.47,34.45,35.48,37.37,36.96,35.51,35.45,36.88,
+36.00,37.86,37.11,36.21,36.95,37.47,37.76,36.66,36.94,39.30,
+38.64,40.25,37.89,39.25,39.20,39.72,38.75,38.20,39.80,38.60,
+39.18,39.95,39.50,40.05,39.19,39.39,39.75,40.84,41.96,40.90,
+41.09,41.94,42.65,42.19,42.44,41.95,43.42,40.38,41.79,42.58,
+42.63,43.22,41.99,44.15,43.54,42.93,42.62,44.10,43.52,45.30,
+44.53,43.04,43.82,41.83,44.01,45.10,43.07,43.83,44.61,44.22,
+45.09,44.35,43.61,45.44,44.24,45.08,46.18,46.11,44.42,46.81,
+47.87,46.86,47.20,46.83,47.57,47.77,46.85,48.27,47.12,45.91,
+47.64,46.51,46.94,46.54,47.73,46.77,47.58,48.01,49.24,48.48,
+49.64,50.33,47.30,49.43,49.17,49.16,49.40,49.20,50.15,50.35,
+50.16,50.48,50.41,52.25,49.77,51.13,49.52,51.88,49.93,49.93,
+51.53,51.99,50.03,52.41,52.12,52.67,51.51,52.13,53.48,51.00,
+55.47,53.08,54.04,52.05,54.49,53.65,54.21,52.09,54.54,52.10,
+53.39,52.05,53.08,52.88,53.47,54.10,55.17,53.77,53.75,52.87,
+54.31,51.63,54.04,51.98,52.86,52.60,53.18,53.72,55.21,53.85,
+55.10,55.41,55.97,54.85,57.14,55.80,54.56,54.35,57.05,55.40,
+54.66,56.53,57.00,56.78,56.06,57.99,56.74,57.98,56.36,57.59,
+57.44,56.94,58.87,58.33,59.83,56.46,59.84,58.13,60.17,58.25,
+9.56,10.26,11.00,11.51,11.35,11.61,12.45,12.73,13.85,13.28,
+13.99,13.89,14.51,14.99,15.52,15.43,15.91,16.43,16.34,16.38,
+17.26,17.17,18.18,17.89,17.91,18.79,18.28,18.89,19.11,19.44,
+19.34,20.24,19.36,20.00,20.52,21.07,21.31,21.57,20.92,21.12,
+21.64,22.34,23.25,22.31,22.61,23.07,22.42,23.03,24.49,23.28,
+23.62,24.21,23.22,24.50,25.41,23.47,25.75,25.26,26.43,25.67,
+25.17,26.18,26.84,26.07,26.25,26.91,26.77,26.50,26.73,27.25,
+27.76,28.47,28.64,28.50,28.44,27.56,28.56,28.85,29.96,29.16,
+29.70,29.35,29.16,30.31,30.32,29.47,30.77,31.91,30.42,31.73,
+31.24,31.25,32.16,30.70,29.87,32.96,31.23,32.38,31.45,32.33,
+33.01,32.50,33.86,33.05,34.16,34.10,33.54,32.66,34.69,32.55,
+33.77,32.95,34.95,35.38,34.65,33.64,33.58,35.00,35.10,35.93,
+35.53,35.73,36.55,36.10,35.79,38.67,36.78,35.08,37.44,36.84,
+36.39,35.96,37.65,37.51,36.47,36.38,37.70,37.51,37.72,38.30,
+38.36,37.93,38.11,37.37,39.07,37.42,39.56,37.40,38.95,37.25,
+39.43,39.32,38.83,37.60,39.77,39.52,39.34,39.11,42.60,40.24,
+40.91,40.61,39.90,40.65,40.49,41.66,39.34,40.09,42.12,41.02,
+41.20,41.84,42.77,42.42,43.18,42.32,42.25,42.62,42.26,43.06,
+44.71,44.38,43.06,41.01,42.74,43.44,45.33,40.56,43.72,42.62,
+44.02,44.73,43.79,41.65,43.55,43.57,44.97,43.39,43.64,45.97,
+43.90,43.80,44.26,45.03,46.56,44.30,45.31,47.23,46.31,44.83,
+44.93,46.23,46.43,45.11,46.11,46.02,46.77,46.56,46.11,44.88,
+46.49,44.97,46.18,46.67,47.59,46.20,45.87,47.94,47.13,47.84,
+47.02,47.81,47.10,49.44,47.11,47.08,48.83,47.29,49.14,49.03,
+48.90,48.86,48.03,47.36,49.04,48.95,49.14,48.17,48.15,50.56,
+50.42,47.08,49.83,50.17,50.29,50.88,51.74,51.25,51.04,51.66,
+49.98,51.01,49.78,51.07,50.31,52.12,52.07,50.89,51.93,52.22,
+50.90,49.80,51.78,51.46,51.85,52.67,51.15,53.96,53.38,53.17,
+51.70,53.75,52.70,53.35,54.86,52.85,53.49,53.79,55.73,53.41,
+8.69,9.29,9.82,10.40,10.37,10.74,10.97,12.08,12.15,12.39,
+12.49,13.37,12.76,13.16,13.99,14.71,14.19,14.55,14.92,14.75,
+15.45,14.99,16.85,15.16,16.58,16.37,16.64,17.00,17.21,17.92,
+17.36,17.82,17.82,18.42,19.03,18.92,19.18,19.72,19.80,19.52,
+20.78,20.42,20.34,20.73,21.22,20.80,21.00,20.59,21.84,20.55,
+22.01,21.36,21.84,21.27,22.67,22.46,22.23,22.35,23.01,23.21,
+23.70,23.97,23.89,23.05,24.39,24.13,23.86,24.10,25.42,26.32,
+24.67,25.54,25.76,26.04,25.12,25.55,26.16,25.96,26.15,26.44,
+27.04,26.08,26.38,27.94,27.95,27.48,28.91,28.04,26.95,28.03,
+28.06,28.15,27.83,28.55,28.90,29.44,28.93,29.26,29.03,29.20,
+29.47,30.00,28.76,31.08,29.00,29.51,30.36,29.94,30.07,29.81,
+30.77,31.59,31.37,31.80,32.17,32.31,33.49,32.86,32.30,32.92,
+32.15,33.49,33.59,32.62,33.99,33.24,31.62,34.42,33.03,33.84,
+32.10,34.86,32.33,32.96,34.94,32.93,34.62,34.88,33.83,35.01,
+34.46,35.90,34.49,33.69,34.40,35.77,35.23,35.97,35.11,36.22,
+35.81,35.74,36.77,35.59,36.07,35.45,36.83,35.85,37.41,35.37,
+35.89,36.75,35.54,36.98,35.41,38.07,36.69,36.67,39.06,38.60,
+37.77,38.04,38.13,37.74,37.76,39.67,37.92,38.63,37.85,39.22,
+38.83,38.73,38.44,38.46,38.85,39.29,38.90,40.86,37.43,39.20,
+38.83,39.62,40.43,41.14,39.82,39.52,39.78,40.80,41.11,40.18,
+39.97,40.05,40.96,41.72,40.55,41.80,40.45,40.50,40.48,40.82,
+41.87,41.41,43.18,42.56,41.71,43.47,41.45,42.56,41.75,41.98,
+41.38,42.93,41.69,43.82,41.82,44.09,42.65,43.07,44.55,44.37,
+43.73,43.09,42.87,42.68,44.39,44.78,44.53,43.78,43.71,43.75,
+44.69,44.83,45.66,45.52,44.70,42.64,46.14,45.22,44.08,45.28,
+46.20,46.36,46.60,45.22,45.23,46.88,45.12,45.55,45.94,45.77,
+45.08,47.70,47.10,45.16,46.24,46.30,48.71,44.74,46.16,46.23,
+49.22,48.37,49.13,46.88,47.71,46.29,49.22,47.38,47.71,47.29,
+46.92,48.50,49.40,47.63,47.81,47.61,49.05,47.33,49.09,48.72,
+8.02,9.03,8.96,9.19,9.76,10.10,10.52,10.25,10.66,11.13,
+11.88,11.55,11.99,11.76,12.80,12.32,12.18,13.14,13.76,13.83,
+14.01,14.37,14.77,14.15,15.29,15.29,15.88,14.86,15.89,17.12,
+16.18,16.06,15.60,16.65,16.74,17.46,17.49,17.53,17.67,18.14,
+18.54,18.00,18.25,18.11,19.00,18.33,19.43,18.97,19.80,18.99,
+19.29,19.50,20.15,20.15,20.47,20.81,20.83,20.53,20.31,20.75,
+21.63,21.19,21.30,22.40,22.34,22.76,22.49,22.53,23.64,22.75,
+21.91,23.19,22.61,22.27,23.28,22.80,23.82,24.02,24.65,24.39,
+24.57,24.14,25.94,24.98,24.92,24.56,25.23,24.95,24.63,24.85,
+26.19,25.60,26.20,25.71,27.19,25.00,27.19,26.25,26.55,25.75,
+27.27,27.36,27.38,26.79,26.66,28.48,27.73,27.38,27.59,27.52,
+27.48,28.11,29.52,29.32,28.55,27.46,28.02,29.49,29.03,28.86,
+28.01,29.29,29.70,29.49,29.57,28.89,30.14,30.05,29.55,29.46,
+30.51,30.64,29.75,30.29,31.83,31.25,30.85,30.20,30.58,30.41,
+32.38,31.78,32.15,32.48,32.08,32.22,31.49,31.54,31.31,32.19,
+31.45,32.27,33.73,32.72,33.20,31.46,32.63,32.15,32.84,32.11,
+33.79,34.11,33.85,32.58,34.70,33.39,33.26,33.73,32.08,36.08,
+34.24,34.35,34.55,35.32,33.89,33.98,33.69,35.67,33.21,33.27,
+34.18,36.49,34.81,35.64,35.40,35.15,35.07,35.48,35.97,35.60,
+34.97,36.79,38.13,36.25,36.20,37.01,34.80,35.88,35.97,36.29,
+36.45,36.39,37.32,38.23,38.10,37.44,37.20,37.77,36.99,37.42,
+38.40,36.59,35.61,39.24,38.46,37.78,37.20,37.93,38.11,38.18,
+39.07,39.71,38.84,37.75,40.45,39.63,39.36,39.70,39.06,38.06,
+40.69,38.95,40.75,39.81,38.19,39.11,39.41,39.81,39.71,38.80,
+39.59,40.75,41.73,40.73,40.05,40.37,41.04,40.51,38.26,39.18,
+39.82,39.30,41.84,42.37,42.42,40.89,41.78,41.47,41.65,41.37,
+41.39,39.79,42.37,43.24,43.60,42.35,43.18,43.15,40.88,41.83,
+41.43,40.46,42.80,42.29,41.16,42.19,45.37,42.82,43.56,43.49,
+42.83,42.40,42.81,43.31,42.89,42.77,45.01,43.54,43.29,43.03,
+7.17,7.75,7.57,8.13,8.50,8.79,9.66,9.41,10.40,10.53,
+10.47,10.40,11.07,10.76,11.46,11.11,11.78,11.60,12.30,12.34,
+12.56,12.34,13.27,13.45,13.95,12.46,14.63,14.36,15.16,14.39,
+14.05,15.01,14.95,14.83,15.99,15.05,15.71,15.84,15.62,16.59,
+16.16,16.09,16.28,16.59,16.51,16.46,16.88,16.72,17.33,17.86,
+18.51,17.84,18.35,17.94,18.16,18.70,18.17,18.91,18.96,19.79,
+18.48,19.07,18.77,19.56,19.74,19.37,19.95,20.16,20.22,19.72,
+20.61,19.42,20.95,20.23,20.97,21.26,21.91,21.77,20.79,21.41,
+21.89,21.12,21.93,21.48,22.16,22.78,22.26,22.62,23.02,22.49,
+22.84,23.51,21.86,23.52,23.43,23.54,23.02,23.02,23.65,23.17,
+23.90,23.76,24.33,24.40,23.56,23.38,24.03,24.49,24.95,25.30,
+24.64,24.65,25.43,26.15,25.29,25.67,25.32,26.21,26.49,26.82,
+26.09,25.34,25.30,26.62,26.97,26.65,25.77,26.39,26.78,27.78,
+26.80,26.38,27.70,27.13,27.38,28.22,27.56,27.20,27.90,27.38,
+28.45,27.78,27.91,29.54,28.74,28.19,29.41,28.91,27.81,29.47,
+29.29,29.49,29.29,28.76,29.34,29.47,30.14,29.63,29.84,28.77,
+30.25,30.68,29.88,30.42,31.51,30.33,29.94,29.50,29.37,31.81,
+31.10,30.23,30.83,29.52,31.06,30.30,30.69,31.49,30.16,30.65,
+31.66,31.65,32.29,30.79,31.49,32.81,32.28,31.97,31.71,31.67,
+32.29,32.08,32.02,35.00,31.76,33.24,32.68,33.99,33.14,33.47,
+34.35,33.60,33.68,32.16,33.21,32.60,34.88,33.61,34.83,34.29,
+35.01,33.32,32.48,33.52,32.10,33.06,33.51,33.77,33.73,34.48,
+34.34,33.58,33.71,36.69,34.62,33.81,34.22,34.72,33.63,35.19,
+34.41,34.80,35.47,35.96,34.78,36.28,35.74,36.38,34.90,37.63,
+36.98,36.05,36.95,37.96,36.57,36.56,37.94,36.97,37.06,37.10,
+37.14,36.52,36.25,37.03,37.86,35.31,37.49,36.85,37.41,39.25,
+36.79,38.41,37.12,38.33,37.49,38.34,36.96,37.71,37.45,39.72,
+39.04,37.70,37.31,38.21,38.50,37.04,36.96,38.55,39.00,40.08,
+38.83,39.36,38.54,39.31,38.83,41.77,39.01,38.49,38.57,41.40,
+6.18,6.59,6.85,7.42,7.20,7.97,8.11,8.39,8.35,9.47,
+9.40,9.12,9.03,9.79,10.07,10.65,10.20,10.69,10.76,11.07,
+11.09,11.60,11.33,11.54,11.64,12.22,12.29,12.18,12.01,12.83,
+12.63,13.00,12.87,14.51,13.70,14.27,13.63,13.74,14.52,13.79,
+14.24,14.19,14.73,14.16,14.72,15.24,15.40,14.71,15.52,14.70,
+15.62,15.96,16.25,16.24,15.85,16.01,16.72,17.01,17.13,16.98,
+16.90,17.35,17.52,17.99,17.08,17.01,18.64,18.58,17.46,18.23,
+18.38,17.82,18.52,18.15,19.42,19.37,18.37,18.98,18.06,19.38,
+19.63,19.21,20.00,18.89,19.74,19.97,20.33,20.92,19.78,20.80,
+20.61,20.36,21.14,21.29,20.56,21.98,21.10,20.59,21.49,21.35,
+21.71,21.26,21.47,21.74,22.09,21.38,21.72,23.71,22.43,21.07,
+21.86,21.54,21.95,22.84,23.04,22.79,21.34,22.58,23.05,22.78,
+22.88,23.76,24.33,24.16,23.73,23.48,23.36,23.62,24.09,24.58,
+24.54,24.75,24.25,25.46,25.99,24.75,24.35,25.42,25.09,24.53,
+24.52,25.22,25.59,26.26,25.29,26.37,25.45,24.68,25.95,26.27,
+26.00,25.37,25.82,25.92,26.09,26.73,26.49,25.32,25.54,25.83,
+26.17,28.32,26.39,27.60,26.78,26.38,27.64,27.57,28.21,27.98,
+26.34,27.21,26.69,26.57,27.62,26.68,28.06,27.91,27.86,28.49,
+28.15,28.37,28.42,27.88,28.58,28.31,29.04,28.32,27.93,29.52,
+28.71,29.28,28.92,29.70,29.02,28.96,29.12,29.38,28.51,29.52,
+29.51,29.33,29.29,30.80,29.98,28.84,30.84,30.09,29.60,30.13,
+30.71,30.71,30.45,31.67,30.42,29.60,31.27,30.58,31.42,30.33,
+31.04,31.02,31.09,30.07,32.20,31.27,30.53,31.96,31.35,32.16,
+31.42,32.19,31.58,30.05,30.80,31.05,31.65,31.94,32.05,30.87,
+32.83,32.37,31.21,32.71,32.19,31.77,31.36,32.83,32.18,32.65,
+31.91,33.01,32.28,32.45,34.65,32.32,32.38,31.68,32.94,34.11,
+33.57,32.93,32.96,33.12,34.33,35.06,33.69,34.05,34.57,32.64,
+34.35,34.42,34.32,32.94,35.26,33.53,35.25,35.38,34.48,35.29,
+35.38,34.15,34.58,35.72,35.26,35.44,33.46,35.70,35.23,36.74,
+5.22,6.39,6.40,6.96,6.62,6.71,7.25,7.59,7.82,7.97,
+7.96,8.20,8.59,8.87,9.12,8.60,9.12,9.71,9.46,9.85,
+9.74,9.88,10.56,10.19,10.51,10.63,9.92,11.47,10.31,11.48,
+10.66,11.65,12.54,11.77,11.57,12.32,12.58,12.79,12.74,11.87,
+12.40,12.80,12.86,13.79,13.04,13.58,13.62,14.16,13.70,14.00,
+13.90,13.36,14.65,13.83,14.95,15.33,14.55,15.00,15.31,14.89,
+15.87,15.13,15.13,15.52,15.07,15.47,15.42,16.10,15.58,16.04,
+16.06,16.41,16.26,16.13,16.10,15.71,16.78,16.69,16.71,16.68,
+17.04,17.62,17.16,16.60,17.60,17.52,18.01,17.50,17.93,16.58,
+18.09,18.84,17.94,17.27,18.38,18.63,18.51,18.57,18.97,17.24,
+19.59,19.84,18.74,19.10,19.83,20.01,19.85,19.19,20.48,19.59,
+20.22,20.24,19.51,19.97,20.66,20.02,20.81,19.83,21.33,20.92,
+20.87,20.46,20.97,20.50,20.34,21.05,20.94,20.81,22.20,20.32,
+21.85,20.61,21.86,21.76,21.14,21.84,22.34,21.79,22.34,22.56,
+21.92,22.50,22.59,22.15,22.66,21.91,22.48,22.42,23.38,22.05,
+23.32,23.63,22.83,22.36,24.30,23.38,23.40,23.79,23.91,23.48,
+22.98,22.97,23.97,23.76,24.40,24.06,23.40,24.84,24.05,25.33,
+23.40,24.17,24.76,24.56,24.45,25.31,24.87,25.23,24.45,25.11,
+24.68,25.32,24.29,25.24,25.35,24.51,26.24,25.98,24.52,24.42,
+26.49,25.94,26.97,24.54,26.61,26.67,25.79,25.81,25.39,27.24,
+26.18,26.67,27.60,25.53,26.31,26.64,26.96,27.71,26.44,28.82,
+27.30,26.88,27.89,27.42,27.16,28.12,27.22,27.44,27.59,28.29,
+27.32,28.55,28.44,26.85,27.79,27.09,29.37,27.13,29.35,27.90,
+27.90,27.82,27.35,28.23,27.65,27.53,28.66,29.33,28.55,28.26,
+29.01,28.85,29.56,28.44,28.59,28.46,28.33,29.86,30.67,27.71,
+29.19,29.03,30.43,28.83,31.05,29.56,28.77,30.31,29.60,29.02,
+29.69,29.31,28.25,30.07,29.45,29.51,29.96,28.95,30.24,29.08,
+30.04,30.54,29.78,29.76,31.07,29.91,30.24,30.54,29.55,31.02,
+31.52,32.30,29.75,29.41,29.59,31.46,30.65,31.48,31.64,32.84,
+4.86,5.47,5.14,5.76,6.03,6.68,6.88,6.17,6.58,7.33,
+8.23,8.24,6.82,7.81,7.71,7.84,8.59,7.98,8.76,8.89,
+9.22,9.21,9.16,9.37,9.53,9.59,9.08,9.69,10.16,9.78,
+10.93,9.39,10.31,10.55,9.75,11.26,10.95,10.60,10.97,11.18,
+11.11,11.99,12.03,11.45,11.06,12.30,12.79,12.20,12.50,12.21,
+12.57,12.51,12.45,12.83,13.22,13.52,13.42,13.53,13.64,12.72,
+13.43,13.97,13.92,13.27,13.88,13.34,14.38,14.73,14.26,13.56,
+14.57,14.52,13.81,14.71,13.89,15.72,15.30,14.43,15.06,15.16,
+15.24,15.40,15.42,14.98,15.91,15.34,16.00,15.47,15.75,16.14,
+15.91,15.96,15.93,16.54,16.46,15.88,16.94,16.55,16.66,16.09,
+17.05,17.16,16.91,17.16,17.02,16.40,17.23,18.53,18.66,17.88,
+17.61,17.59,17.75,18.34,17.20,18.46,18.19,18.28,17.68,17.97,
+18.82,18.16,18.01,19.00,19.26,18.45,18.43,20.44,17.79,19.05,
+19.43,18.95,18.83,19.73,19.73,19.54,19.06,19.64,20.31,20.62,
+18.95,19.82,19.01,18.85,20.49,20.31,19.03,19.28,19.78,20.34,
+20.00,19.78,20.98,21.25,19.51,20.18,21.44,20.65,20.77,20.35,
+21.45,20.93,21.31,20.58,21.08,20.53,22.21,21.88,20.66,22.32,
+21.32,22.31,21.32,21.93,22.18,22.15,22.38,21.28,20.99,22.64,
+21.86,21.65,20.83,21.97,22.65,23.66,22.77,23.25,22.90,22.84,
+22.08,22.83,22.39,22.39,24.37,23.12,23.03,22.45,23.93,23.47,
+23.04,23.88,23.41,23.04,23.13,23.94,22.64,23.27,23.98,23.43,
+23.23,24.66,23.52,23.79,24.36,24.69,23.94,24.22,25.92,24.51,
+24.77,24.77,24.88,24.26,23.50,25.33,24.58,24.64,23.89,23.79,
+24.70,24.17,25.62,24.99,24.88,24.93,26.32,24.90,25.20,25.50,
+25.52,25.47,25.57,25.53,25.05,26.17,25.44,25.03,25.55,26.04,
+25.66,26.40,25.72,24.61,25.62,26.82,26.52,26.96,25.66,25.85,
+25.90,27.28,25.56,27.30,26.49,26.23,26.75,27.19,25.81,26.16,
+26.45,26.64,27.76,26.06,27.72,27.25,27.62,27.12,27.74,26.97,
+27.12,27.80,28.38,28.67,27.91,29.03,27.97,28.02,27.86,28.42,
+4.36,4.42,5.27,4.94,5.70,5.91,6.17,5.40,5.95,6.60,
+5.98,6.24,6.57,6.57,7.25,6.80,7.70,7.16,6.98,7.93,
+8.06,7.46,7.93,8.41,9.19,8.27,8.08,8.18,8.43,8.66,
+9.07,9.28,9.59,8.88,9.39,9.29,9.42,10.05,10.06,9.72,
+9.68,10.58,10.13,10.81,10.92,10.01,11.44,10.93,10.82,11.20,
+10.75,10.70,11.46,11.26,11.04,10.54,10.87,11.34,11.45,11.69,
+12.19,11.69,11.60,12.09,11.77,11.88,12.35,12.90,12.75,12.46,
+12.80,13.34,12.87,12.35,12.55,13.36,13.53,13.18,13.41,13.44,
+13.81,13.38,13.51,13.26,12.85,14.35,14.39,13.77,14.16,13.95,
+13.57,15.08,14.63,14.70,14.80,14.73,13.95,14.21,14.26,15.44,
+14.67,15.18,14.84,14.79,14.81,15.00,16.24,15.69,16.00,15.29,
+14.86,15.11,15.66,14.87,15.46,15.17,16.60,15.79,16.28,15.71,
+16.92,16.76,15.52,16.63,16.44,16.70,15.38,17.05,17.15,16.49,
+16.68,16.48,16.25,17.21,17.46,17.34,16.37,16.71,17.78,17.46,
+18.23,17.36,17.19,17.75,17.39,17.40,18.05,16.86,17.31,17.88,
+18.12,17.70,18.10,17.20,17.84,18.01,19.00,19.24,18.98,17.76,
+18.22,18.45,18.42,18.99,18.87,19.23,18.89,19.63,19.49,19.78,
+18.63,19.44,19.53,19.83,18.19,19.88,20.02,19.31,19.37,19.25,
+19.15,19.98,19.09,20.56,19.17,20.56,18.72,19.04,18.59,19.36,
+19.47,19.91,19.63,20.34,20.36,20.09,20.85,21.36,20.83,21.17,
+21.03,20.31,20.93,21.29,20.49,20.42,19.28,20.61,20.83,21.25,
+21.15,22.09,20.30,20.36,20.17,21.22,21.52,21.19,21.27,20.10,
+21.63,21.25,22.09,21.27,21.01,21.04,20.36,20.83,22.80,22.12,
+22.78,21.32,21.49,21.94,21.81,22.42,21.75,22.03,21.97,22.33,
+22.28,23.73,22.35,21.44,22.29,22.13,23.27,23.03,23.09,22.27,
+22.14,23.57,22.56,22.79,22.16,22.33,23.01,23.47,23.49,22.94,
+23.87,24.15,23.08,23.14,23.58,23.67,23.51,23.61,23.73,24.58,
+23.75,23.72,23.11,24.45,24.49,24.17,23.90,23.76,25.05,24.17,
+23.06,24.63,24.65,24.36,25.37,25.40,24.22,23.42,24.55,24.13,
+3.93,4.53,4.29,4.28,4.67,4.96,5.16,4.93,4.55,5.01,
+5.39,6.02,6.04,5.15,5.87,5.33,6.22,6.12,6.42,7.03,
+7.56,6.92,6.90,7.91,8.13,7.29,7.63,7.74,8.29,8.21,
+8.18,7.72,7.78,8.17,8.49,8.78,8.46,8.36,8.60,8.63,
+8.62,9.04,9.08,9.36,9.71,8.95,9.52,9.51,8.72,9.21,
+9.28,10.01,10.43,9.81,10.35,9.71,9.57,10.15,11.15,9.81,
+9.74,10.87,11.35,10.91,10.58,11.31,10.36,10.54,12.06,10.65,
+11.76,11.42,10.94,11.27,10.79,11.67,11.79,11.77,11.23,11.34,
+12.47,11.98,12.41,12.36,12.77,11.66,12.58,11.92,11.88,12.80,
+12.85,12.88,12.51,12.43,12.81,12.99,12.97,13.12,12.62,13.13,
+13.48,13.03,12.63,12.50,13.95,13.52,13.35,13.03,13.60,13.04,
+12.92,13.98,12.71,13.38,13.62,14.30,14.69,13.76,13.82,13.98,
+14.56,14.50,13.54,14.21,14.17,15.11,14.78,14.76,13.77,14.32,
+14.25,15.05,13.96,14.58,15.03,15.00,15.33,14.95,14.78,15.01,
+15.46,15.48,16.09,14.46,15.60,15.96,15.26,15.68,15.40,14.66,
+16.37,15.89,16.01,15.48,15.62,15.80,16.05,15.55,15.39,15.81,
+16.03,17.22,16.39,16.32,16.47,17.11,16.59,16.90,16.47,16.03,
+17.80,16.44,15.78,15.95,16.38,16.44,17.41,16.90,17.75,17.46,
+16.59,16.93,17.21,17.48,17.86,17.10,17.06,17.44,17.81,16.88,
+17.13,16.80,18.04,17.37,17.30,17.51,17.09,17.66,18.67,18.37,
+17.78,18.24,18.74,18.40,18.55,17.91,18.17,18.92,18.48,18.67,
+19.68,18.89,18.32,18.19,18.01,18.15,18.33,18.98,18.66,18.44,
+17.83,18.60,17.96,18.98,19.27,19.16,19.06,19.06,19.34,20.04,
+18.50,19.07,19.26,19.45,19.72,18.68,19.44,19.44,20.86,18.65,
+20.16,19.69,20.17,19.78,19.49,18.95,20.21,19.82,20.67,19.57,
+19.40,20.25,19.89,19.83,19.99,20.09,20.51,20.47,20.29,20.32,
+19.36,19.70,19.91,19.99,20.50,20.94,21.15,19.67,21.09,21.11,
+21.43,20.83,20.67,21.27,22.02,20.90,20.12,21.85,21.47,20.55,
+21.51,21.51,20.86,21.87,22.27,21.97,20.71,21.57,21.96,21.55,
+3.33,4.25,3.45,3.87,4.18,3.70,4.56,4.42,5.05,5.31,
+5.10,4.66,5.64,5.01,5.38,5.27,5.28,6.23,5.98,5.23,
+5.87,6.14,6.14,6.70,5.74,6.61,6.15,6.75,6.66,6.52,
+7.07,7.41,6.94,7.10,7.29,6.97,7.04,7.39,7.37,7.63,
+8.01,7.42,7.99,8.94,9.06,8.07,7.50,8.57,8.96,8.85,
+8.15,9.27,8.32,8.94,9.49,8.36,8.68,8.46,9.03,8.41,
+8.94,8.97,9.07,9.71,9.61,9.75,9.23,8.73,9.42,10.47,
+9.59,9.75,9.56,10.27,9.43,10.45,11.14,10.33,10.23,10.42,
+10.63,10.97,10.62,10.70,10.31,10.46,9.70,10.82,11.32,10.37,
+11.28,11.09,10.73,10.44,10.31,10.97,11.37,10.83,10.94,11.48,
+10.84,11.55,11.47,11.32,11.97,11.61,12.36,11.83,11.74,11.53,
+11.74,11.85,11.92,11.75,12.04,12.67,11.79,12.29,12.15,12.08,
+12.92,13.06,12.52,12.23,12.10,12.91,12.71,12.79,12.94,12.74,
+12.83,12.35,13.02,13.27,12.76,12.90,13.19,12.65,14.06,13.15,
+12.58,14.00,13.13,14.07,13.50,13.98,14.74,14.80,13.75,14.18,
+13.57,13.57,13.80,13.64,13.80,13.61,14.41,14.55,13.19,14.51,
+14.26,13.58,14.56,13.77,14.89,13.84,14.97,14.02,14.30,15.54,
+15.07,14.97,14.56,15.39,15.29,14.79,15.20,14.87,15.60,15.67,
+15.12,15.28,14.45,15.66,14.97,14.93,15.10,15.27,15.09,15.82,
+15.89,15.41,15.00,16.40,15.70,14.69,15.56,16.33,15.82,15.63,
+16.27,15.66,15.40,15.77,15.89,16.37,16.20,16.22,16.94,16.57,
+16.96,16.04,15.73,15.86,16.82,16.47,16.18,16.65,16.82,15.66,
+16.57,17.01,16.89,16.07,16.15,15.87,16.50,17.04,16.57,16.29,
+16.96,17.21,17.22,17.96,16.52,16.19,16.26,17.67,17.10,16.69,
+16.59,16.65,17.38,17.41,16.75,17.91,17.46,17.31,17.61,17.69,
+17.83,17.48,17.19,18.74,17.50,17.67,17.17,17.68,17.86,17.93,
+19.10,18.62,17.29,18.19,18.17,18.35,17.69,17.57,18.45,16.86,
+17.55,17.31,18.99,19.07,17.39,17.43,18.35,17.34,18.38,18.14,
+18.98,18.66,20.02,19.51,18.44,17.94,19.26,18.70,18.78,18.63,
+2.87,3.74,2.86,3.85,3.72,3.98,4.01,4.11,4.45,4.21,
+4.97,4.49,4.23,4.44,5.35,4.52,4.32,4.82,4.99,4.66,
+5.68,5.15,5.22,4.84,5.52,6.02,6.71,5.60,5.04,5.32,
+5.48,5.96,6.10,6.47,6.20,6.57,7.14,6.87,6.72,6.46,
+6.48,6.88,6.81,7.14,7.05,6.98,6.87,7.86,7.24,7.34,
+7.28,7.57,7.81,7.20,7.06,7.72,7.67,7.75,7.95,7.67,
+7.92,8.56,7.95,8.41,8.19,8.13,8.19,8.30,8.02,8.22,
+8.63,8.57,9.29,8.84,8.67,9.04,9.04,8.92,9.20,9.25,
+9.34,8.78,9.37,9.27,9.28,9.48,9.46,9.08,9.76,9.19,
+9.80,9.62,10.07,9.73,9.43,9.31,9.82,9.41,9.41,9.87,
+10.13,10.06,9.90,10.64,10.38,9.99,10.79,10.24,10.58,10.22,
+10.46,10.63,10.56,10.38,10.92,10.88,10.66,10.32,10.90,10.95,
+10.66,11.42,10.97,10.83,10.89,10.65,10.85,10.73,11.91,11.57,
+11.23,11.85,10.71,11.40,10.61,11.02,11.35,10.96,11.67,11.66,
+11.31,11.19,11.33,11.40,11.90,11.75,11.06,12.63,11.72,12.00,
+12.20,12.42,12.14,12.84,12.89,12.91,11.58,12.00,11.75,12.45,
+12.42,12.48,12.97,12.32,12.47,13.08,13.18,13.62,13.45,13.29,
+12.64,12.61,12.86,12.51,12.35,12.38,13.10,13.59,12.33,13.25,
+13.12,13.22,13.67,12.38,12.98,13.23,13.39,12.52,13.38,13.36,
+13.10,13.78,13.24,13.78,14.87,13.31,13.22,12.91,14.16,13.45,
+13.70,13.37,13.65,13.47,13.53,14.27,13.81,13.86,14.31,13.92,
+13.02,14.69,15.24,14.27,13.96,14.26,13.92,14.23,14.72,13.99,
+14.79,15.14,14.46,14.05,14.72,14.81,14.74,14.64,14.11,14.94,
+14.74,14.48,15.28,14.48,13.90,15.00,14.36,14.75,16.35,15.84,
+15.94,14.57,14.28,14.86,15.22,15.56,15.68,15.35,16.17,14.57,
+15.21,14.72,15.53,16.41,16.76,16.45,15.96,15.46,15.38,15.31,
+16.02,16.09,15.90,15.46,16.12,15.71,14.75,16.23,15.79,15.66,
+15.37,16.24,14.86,15.50,16.00,15.89,16.13,15.14,16.04,16.12,
+16.40,17.24,16.60,15.84,16.61,16.11,16.04,16.48,16.34,16.15,
+3.40,2.98,2.72,2.75,3.11,3.59,2.23,3.60,3.60,3.70,
+3.36,3.44,4.42,3.96,3.88,4.90,4.00,4.23,4.68,3.64,
+4.94,5.32,5.33,4.87,4.91,5.32,5.35,6.64,5.23,5.47,
+4.78,6.06,5.58,5.22,5.22,5.69,5.59,5.82,6.36,5.55,
+6.53,6.28,6.89,6.45,6.46,5.15,6.56,6.79,5.83,6.35,
+5.97,7.64,6.53,6.54,6.68,7.06,7.03,7.83,7.06,7.76,
+6.57,6.86,7.41,7.11,6.60,6.68,6.73,6.91,7.48,7.27,
+7.36,7.56,6.85,7.46,6.93,8.19,8.37,7.04,6.59,7.73,
+7.57,7.37,8.57,7.43,8.26,8.57,8.34,7.91,7.76,8.25,
+8.57,7.93,8.63,7.83,9.19,8.69,8.41,8.21,9.13,8.58,
+8.77,8.53,8.65,8.61,9.04,8.50,9.00,8.73,8.71,8.93,
+8.73,8.36,9.23,9.75,8.93,9.33,8.99,8.73,9.33,9.17,
+10.25,9.23,9.88,9.52,10.31,9.39,9.54,9.57,10.22,9.73,
+10.17,9.99,9.26,10.14,10.86,10.24,10.05,9.54,9.35,10.28,
+10.43,10.00,10.25,10.08,10.14,10.58,10.71,9.88,10.82,11.08,
+10.50,10.81,10.47,10.09,10.33,10.37,10.60,10.54,10.68,11.04,
+11.64,10.52,10.70,10.73,11.47,11.78,12.13,11.28,10.97,11.29,
+11.67,11.22,11.54,11.26,11.98,11.24,11.27,11.31,12.05,11.69,
+11.40,11.50,10.69,11.30,11.36,11.83,11.02,12.38,12.40,11.57,
+12.34,11.75,12.00,12.09,12.88,12.48,11.85,11.88,11.59,11.52,
+11.77,12.60,11.69,11.75,12.01,12.57,12.04,12.04,13.01,11.96,
+12.30,13.01,13.07,12.22,12.93,12.75,13.39,12.69,13.10,13.30,
+12.41,12.82,12.16,13.10,13.17,13.61,12.63,13.03,13.55,13.34,
+12.73,13.03,13.68,13.33,13.00,12.63,13.84,13.63,13.47,12.32,
+14.28,13.50,12.44,13.17,12.68,12.49,12.86,12.99,12.92,14.69,
+13.03,14.82,12.94,13.83,13.49,13.20,13.42,13.27,13.62,13.02,
+13.04,13.62,13.94,12.70,14.43,14.36,14.18,14.55,14.39,14.10,
+13.77,14.30,14.68,13.81,14.05,14.61,13.54,14.04,15.14,15.06,
+14.78,14.77,13.75,14.60,13.69,13.77,15.45,14.88,14.05,14.87,
+2.34,2.31,3.20,2.32,2.63,2.85,2.24,2.77,3.10,2.72,
+3.87,3.19,2.48,2.96,3.36,4.14,4.06,4.28,3.77,3.70,
+3.90,4.73,4.55,4.24,4.45,4.28,4.85,4.78,4.15,4.53,
+4.86,4.54,5.24,4.96,4.73,4.03,5.50,4.80,5.88,3.88,
+5.08,5.26,4.90,5.59,4.97,5.40,5.20,5.70,5.42,6.13,
+4.72,5.73,6.79,6.27,6.16,5.74,5.25,5.59,6.50,6.11,
+6.36,5.85,7.11,6.32,6.04,5.67,6.22,6.17,6.54,6.91,
+7.03,5.74,6.82,7.11,7.40,7.13,6.51,7.17,6.87,6.28,
+7.28,8.13,6.51,7.13,6.82,6.68,7.55,6.78,6.79,6.88,
+7.82,7.22,7.88,6.79,7.23,7.57,7.72,7.24,7.28,6.92,
+7.08,7.96,7.36,7.72,8.06,8.69,7.38,8.10,7.61,7.42,
+8.20,7.97,7.70,7.81,8.86,7.94,8.42,8.21,7.78,8.64,
+7.79,8.32,7.70,8.55,8.96,8.20,8.21,8.48,8.43,8.97,
+9.27,8.64,7.92,8.61,8.50,9.29,9.44,8.24,8.59,9.04,
+9.00,8.74,9.24,9.18,8.67,9.35,8.57,8.68,8.31,8.70,
+9.10,9.20,9.69,8.67,9.14,9.15,9.91,10.14,9.01,9.20,
+9.61,9.12,9.35,9.53,9.51,10.11,9.07,9.41,9.78,10.50,
+9.98,9.90,8.75,10.01,10.24,9.49,10.06,10.26,10.80,10.01,
+10.32,10.50,9.71,10.27,9.90,10.32,10.59,10.88,11.21,10.34,
+10.97,10.20,10.61,10.38,10.56,10.20,9.82,10.59,9.58,10.74,
+10.71,10.27,10.53,10.31,10.47,11.24,10.66,10.31,10.88,10.61,
+11.01,9.92,11.60,10.89,10.84,9.95,11.08,10.71,11.44,11.22,
+10.75,11.39,11.21,11.22,11.47,11.62,11.61,10.89,10.93,11.03,
+11.34,12.05,11.38,11.08,10.70,12.32,10.73,10.81,12.03,11.25,
+10.84,11.22,10.90,12.21,12.45,11.78,11.27,12.06,11.78,12.08,
+11.47,11.87,11.36,11.55,12.25,12.27,11.90,11.75,11.22,11.46,
+11.58,11.44,11.40,12.18,12.33,12.36,12.02,11.03,12.81,12.12,
+12.15,12.82,11.34,12.02,11.04,12.79,11.46,13.21,11.85,11.83,
+12.09,12.43,12.42,12.30,12.86,11.88,12.27,13.02,11.91,12.87,
+1.39,2.60,1.96,1.37,2.50,2.63,2.37,2.74,2.66,3.13,
+2.72,2.69,2.55,2.71,3.02,2.48,3.80,3.32,3.44,2.94,
+3.61,3.90,3.31,3.36,2.78,4.79,3.19,3.60,3.76,3.60,
+2.78,4.63,3.89,3.86,4.36,5.10,4.32,4.56,5.44,4.27,
+4.80,4.44,4.45,4.46,4.63,4.26,4.24,5.15,5.12,5.11,
+4.79,4.20,5.09,4.67,4.76,5.07,4.97,5.24,4.86,4.92,
+5.06,5.37,5.17,5.92,6.33,5.53,5.05,5.36,5.64,5.89,
+5.48,5.83,5.76,6.10,5.43,5.42,6.11,5.55,6.03,6.53,
+5.65,4.82,6.24,5.94,5.92,6.07,5.97,6.36,6.05,6.19,
+5.95,6.56,5.96,6.94,6.18,5.87,6.80,6.30,6.08,6.64,
+6.78,6.98,7.00,6.23,6.75,6.60,7.39,7.02,7.17,6.33,
+6.58,6.53,7.94,7.11,6.71,6.65,7.04,7.11,7.07,7.45,
+7.17,7.23,6.78,8.04,7.38,7.06,6.92,8.59,6.97,7.36,
+6.56,8.37,7.52,7.55,7.92,7.65,7.90,7.52,7.94,7.46,
+7.62,7.82,7.66,8.24,7.58,7.39,8.11,7.84,7.42,7.72,
+7.72,8.16,8.19,8.34,7.77,7.91,8.68,8.76,7.38,8.06,
+8.97,8.61,8.06,8.21,9.00,8.38,7.74,8.25,8.97,8.91,
+8.52,8.46,8.31,8.64,8.47,8.76,8.46,9.05,8.12,8.11,
+8.23,9.23,8.75,9.73,9.15,7.79,9.32,9.35,9.03,9.33,
+9.71,8.29,8.68,8.51,9.05,8.41,8.44,8.51,9.78,9.27,
+9.01,8.77,9.70,9.63,9.66,9.23,9.28,9.93,9.11,9.88,
+9.07,9.76,8.45,9.25,9.06,8.79,9.18,9.27,8.83,9.09,
+9.37,9.73,9.38,9.11,9.31,9.38,8.77,9.27,9.83,10.29,
+10.25,9.20,9.37,10.64,9.01,10.35,9.99,10.26,9.83,9.44,
+9.87,9.78,9.19,8.84,9.64,10.67,9.56,10.33,9.81,9.77,
+10.04,10.08,9.47,10.03,10.11,10.07,9.86,10.70,9.86,9.73,
+10.03,10.58,10.95,10.49,10.66,10.71,10.28,10.44,11.18,10.73,
+10.35,11.35,11.17,10.85,10.06,10.31,10.67,10.21,10.68,10.08,
+9.85,11.73,11.02,10.69,11.52,12.02,11.07,10.65,10.99,11.15,
+11.59,11.94,12.79,12.91,14.02,13.88,14.33,14.60,15.58,15.39,
+15.81,16.09,15.80,16.81,17.61,18.07,17.96,17.62,19.20,19.01,
+19.59,19.76,20.73,20.57,21.09,21.70,21.82,21.72,21.39,21.96,
+22.74,22.89,22.44,23.62,24.18,23.63,24.61,25.84,25.55,25.69,
+25.61,24.03,26.28,25.78,25.79,26.84,27.03,26.82,27.36,27.46,
+26.99,27.70,27.67,28.68,28.40,29.09,28.92,28.98,29.27,28.80,
+29.58,29.71,31.60,30.18,30.13,30.01,30.41,33.14,30.82,32.28,
+31.85,31.69,30.90,33.58,31.48,32.87,32.94,34.42,32.69,32.90,
+32.61,32.70,34.71,34.13,34.23,35.51,34.23,33.28,34.70,34.35,
+35.26,34.55,35.44,37.96,35.87,36.69,35.55,36.21,36.44,36.52,
+35.52,37.17,37.83,39.77,37.50,37.39,37.31,40.45,36.76,38.50,
+38.76,37.76,40.92,39.42,40.60,40.38,38.65,38.80,40.60,41.66,
+40.39,40.12,40.76,41.71,39.78,42.97,41.54,40.81,42.84,41.47,
+41.00,42.87,41.76,42.99,43.98,42.08,43.44,41.85,43.54,42.93,
+42.72,43.30,44.23,45.50,44.57,44.94,43.82,44.59,44.10,44.85,
+45.81,45.73,43.96,45.05,45.38,47.02,46.09,47.03,47.35,46.21,
+45.71,48.44,46.30,50.69,47.45,45.79,49.21,46.22,46.00,47.57,
+47.89,47.73,46.70,49.02,48.08,47.15,45.78,48.03,49.45,47.42,
+50.69,50.82,48.91,49.90,50.27,52.25,48.09,49.59,53.87,47.59,
+50.63,49.23,50.20,51.71,51.04,52.23,49.78,50.76,48.25,53.07,
+51.75,51.09,52.10,51.19,51.30,51.82,51.24,51.59,53.32,52.88,
+51.40,51.24,51.79,54.37,53.02,52.41,55.97,54.83,54.29,53.56,
+53.07,53.59,53.16,55.38,54.31,54.41,54.72,56.10,53.46,55.58,
+54.99,54.92,55.17,55.57,53.69,55.94,55.87,55.79,56.46,56.30,
+53.94,54.02,55.44,57.70,57.86,55.02,56.95,56.70,60.57,58.14,
+57.98,57.21,57.58,56.41,58.57,59.38,56.19,57.42,56.74,57.66,
+60.30,57.80,58.66,57.46,60.00,59.16,59.68,56.48,59.70,59.05,
+60.13,60.87,58.96,58.73,60.26,59.09,60.85,58.22,61.76,61.16,
+59.24,61.96,59.79,60.07,59.05,61.02,61.64,62.81,62.21,59.43,
+10.51,11.49,11.52,11.77,12.67,12.77,12.84,13.75,14.44,14.21,
+15.08,14.69,15.47,15.40,15.44,16.33,16.32,16.87,17.78,18.58,
+17.88,18.51,18.15,19.02,19.10,19.75,20.53,20.41,20.51,20.31,
+20.94,21.35,21.23,22.36,21.99,22.81,22.31,22.44,23.11,23.09,
+22.75,24.00,23.40,23.18,24.38,24.42,23.82,25.14,24.90,25.40,
+24.52,23.97,26.63,26.72,25.39,26.21,27.76,27.77,27.29,25.77,
+28.42,27.78,28.29,27.89,27.65,28.49,30.34,28.89,30.09,28.73,
+29.67,29.72,30.00,30.19,30.54,28.71,29.35,30.79,30.03,30.55,
+31.17,31.74,31.54,32.43,32.69,31.70,32.35,32.39,33.47,33.71,
+31.92,32.86,33.63,34.23,34.13,34.16,33.79,34.05,34.75,34.72,
+35.48,34.28,34.57,35.66,35.73,35.83,34.71,36.75,36.83,36.16,
+37.04,36.42,37.34,36.01,38.43,37.00,36.58,37.15,37.52,37.66,
+36.65,38.20,38.94,39.94,38.55,38.44,38.25,39.32,37.46,38.38,
+38.62,38.65,39.13,38.94,40.28,39.14,38.55,41.48,40.37,38.95,
+41.03,40.54,39.79,40.52,41.08,41.87,39.90,41.21,42.16,42.00,
+40.64,42.89,41.53,41.13,42.71,42.76,43.48,44.40,42.90,42.85,
+43.01,43.76,42.91,44.35,44.73,42.78,43.61,43.46,43.98,44.29,
+44.21,43.82,43.95,44.08,44.64,45.66,45.59,43.63,46.11,47.03,
+46.55,45.34,46.36,46.44,45.47,44.94,45.26,46.03,46.68,48.18,
+45.88,46.96,49.56,48.50,47.35,48.94,47.35,48.86,46.46,47.54,
+47.32,46.87,47.77,47.17,47.22,47.59,48.18,50.58,50.59,49.98,
+48.49,49.09,49.42,49.26,51.12,49.34,50.88,48.45,49.92,51.74,
+50.46,50.37,50.81,50.91,49.78,51.65,50.07,51.52,51.83,49.92,
+51.81,50.35,49.49,51.82,51.19,51.79,51.60,52.17,54.62,51.81,
+52.42,55.27,55.31,52.47,52.59,52.05,51.13,54.79,51.83,56.06,
+53.38,53.24,51.56,55.45,53.30,55.02,54.33,52.58,53.52,53.98,
+53.97,54.89,54.40,54.48,55.48,52.44,53.92,56.31,53.62,56.22,
+54.15,55.38,55.55,54.79,54.48,54.94,56.52,55.31,56.92,56.63,
+54.81,57.35,56.90,54.91,57.43,55.96,56.42,57.71,55.02,57.16,
+10.58,10.36,11.02,11.13,11.89,12.03,12.72,12.87,13.33,12.87,
+13.38,14.05,14.25,14.81,14.50,15.17,15.87,16.08,17.47,16.53,
+16.73,17.07,17.72,17.74,17.75,17.35,18.44,18.22,18.46,19.12,
+19.72,19.60,19.73,19.53,20.24,19.85,20.79,20.53,20.47,21.43,
+21.55,21.41,21.69,21.77,23.03,21.40,22.84,23.08,23.47,22.19,
+23.24,22.84,24.24,23.11,23.78,24.89,24.41,24.06,25.23,24.37,
+25.47,26.06,26.49,26.20,26.06,26.47,26.81,26.47,27.17,27.63,
+27.62,26.31,27.36,27.32,27.49,28.34,28.59,28.78,27.45,28.06,
+28.77,30.13,28.77,28.76,29.30,29.93,29.59,29.81,30.61,29.13,
+29.85,30.99,31.55,30.86,31.26,31.39,32.34,31.31,30.97,32.46,
+32.17,31.82,32.05,31.91,32.52,32.09,33.87,32.58,34.14,34.36,
+33.62,32.99,32.22,32.49,34.27,33.32,32.97,34.09,34.22,34.26,
+33.35,35.64,34.29,34.84,34.85,34.86,34.95,34.62,35.92,35.83,
+36.58,36.37,36.07,37.47,36.45,36.16,36.97,36.72,36.65,37.32,
+39.12,36.95,36.58,36.45,37.46,39.35,37.99,37.30,37.68,37.40,
+38.15,40.49,38.88,38.63,38.39,38.89,38.44,40.68,38.91,39.26,
+41.15,38.26,39.01,39.40,41.46,40.73,39.94,41.81,40.76,40.47,
+40.77,41.17,40.23,39.37,40.85,42.46,43.02,42.35,41.01,40.95,
+42.38,43.20,41.44,42.28,41.28,41.72,41.09,42.40,44.96,43.69,
+41.35,43.29,41.16,44.26,42.44,42.80,42.20,44.41,45.35,43.01,
+42.54,45.15,43.93,43.31,43.94,42.79,44.91,45.32,46.75,43.52,
+46.38,44.69,45.59,46.02,46.47,46.52,46.87,46.37,45.65,45.98,
+46.58,45.67,46.77,46.83,45.29,46.45,48.45,46.92,48.28,48.31,
+47.43,46.55,46.52,47.09,46.38,49.53,48.86,48.95,45.30,47.68,
+48.31,47.23,50.96,47.92,48.12,47.12,49.54,47.54,47.84,49.96,
+49.37,50.11,49.33,50.03,49.40,48.90,49.71,49.62,50.22,50.66,
+49.24,49.58,51.55,49.84,49.25,49.78,49.09,49.77,49.95,50.73,
+49.21,51.04,49.99,50.46,49.63,49.55,53.75,52.09,51.45,52.15,
+50.64,53.07,50.55,49.54,51.73,54.11,53.98,54.14,51.86,52.34,
+8.61,9.69,10.03,9.49,10.38,10.99,11.76,11.11,11.29,12.49,
+12.82,12.83,12.22,13.13,13.39,13.81,13.82,13.85,15.05,15.62,
+15.45,15.95,15.87,15.50,16.21,16.55,16.93,16.99,16.70,17.39,
+17.41,17.29,18.29,18.05,18.93,18.73,19.29,18.46,17.77,19.71,
+19.28,20.53,19.58,19.69,20.19,20.85,21.53,20.80,21.56,21.46,
+21.05,20.95,21.16,22.09,23.12,22.34,21.78,23.16,22.82,23.66,
+22.83,23.74,23.30,24.39,22.93,23.37,23.31,23.61,23.61,26.03,
+24.42,25.57,24.57,25.04,26.19,25.54,25.80,25.95,25.86,26.35,
+25.84,26.29,26.13,26.54,26.59,27.55,27.01,25.97,28.10,27.58,
+28.17,26.87,27.85,28.63,27.71,28.64,28.64,30.00,28.07,29.09,
+28.72,29.21,29.27,28.58,29.65,29.77,29.74,30.50,30.57,30.73,
+29.83,30.36,30.13,31.28,30.83,30.09,30.59,31.07,32.93,30.56,
+31.55,32.17,31.62,31.86,31.79,32.20,33.23,32.09,32.62,33.78,
+33.40,32.57,32.65,32.64,33.76,33.09,33.16,34.44,33.97,33.66,
+33.96,34.17,34.67,33.30,33.82,33.80,34.87,34.77,35.34,35.36,
+34.87,33.21,33.83,33.95,35.02,36.02,34.64,36.80,35.56,35.88,
+34.51,36.13,35.63,36.19,37.10,35.68,37.15,36.13,36.33,36.50,
+37.32,37.40,35.04,37.76,37.86,38.28,38.20,39.04,38.05,39.24,
+38.32,39.00,38.13,36.62,41.25,38.92,38.24,38.47,39.19,38.16,
+39.28,38.65,38.17,40.25,39.84,38.89,40.06,41.24,40.17,38.66,
+40.64,39.75,40.36,39.02,42.02,42.40,41.92,39.90,41.85,41.84,
+41.25,42.28,41.51,40.78,41.26,41.08,42.32,41.95,40.64,41.77,
+40.99,41.85,42.72,41.80,41.37,42.31,42.58,41.63,42.20,42.75,
+44.06,41.83,44.12,42.55,43.91,45.14,45.58,43.98,43.78,42.88,
+44.53,43.03,43.68,43.63,43.35,44.03,45.14,44.58,44.02,44.57,
+44.05,43.94,44.43,43.52,45.12,45.04,45.41,44.43,44.34,43.98,
+44.64,44.70,45.07,47.83,47.32,45.56,47.39,47.28,46.55,48.91,
+44.53,47.25,47.94,46.63,43.88,46.21,47.44,47.33,48.35,46.90,
+45.44,46.64,46.75,45.71,47.43,46.60,48.67,46.98,47.26,46.18,
+7.63,8.01,8.71,8.70,9.72,9.18,9.81,10.93,10.25,11.58,
+11.69,11.10,11.89,12.09,12.06,12.41,13.10,13.14,13.05,12.97,
+14.65,14.21,14.45,14.55,15.10,14.44,15.93,15.26,15.70,15.90,
+16.59,15.85,16.25,16.51,16.66,16.66,17.22,16.50,17.14,17.59,
+17.83,17.84,17.97,19.16,18.31,19.21,19.78,18.89,19.25,19.00,
+19.88,20.69,19.19,19.82,20.25,20.26,19.91,19.98,20.64,21.14,
+21.29,21.11,20.65,21.51,21.24,21.57,22.96,22.12,21.31,22.42,
+22.39,23.93,22.34,22.51,22.96,24.46,22.77,24.24,22.76,23.18,
+23.26,24.28,24.56,23.56,23.82,24.91,24.49,25.03,24.91,24.54,
+25.93,26.02,26.07,24.73,26.36,25.74,24.89,26.09,26.44,26.51,
+26.61,25.55,25.74,26.80,27.34,27.62,27.21,26.44,27.58,28.06,
+27.81,28.02,27.71,28.29,27.81,27.42,26.56,27.74,27.51,29.07,
+29.04,30.01,27.74,29.47,29.37,29.52,28.84,29.80,31.07,29.04,
+30.53,30.08,29.76,30.87,30.20,29.39,29.41,30.03,29.74,29.93,
+30.33,31.24,29.97,31.57,31.64,31.87,31.92,31.67,31.94,31.29,
+32.01,32.38,32.82,31.89,32.25,32.33,31.54,31.47,32.98,31.09,
+31.75,31.56,32.60,33.23,32.51,32.88,33.60,32.97,33.57,34.54,
+34.69,33.14,34.45,34.90,34.04,34.34,33.38,35.53,33.01,35.08,
+33.51,35.71,33.96,33.88,33.29,35.78,35.14,34.34,34.59,35.60,
+34.51,36.79,36.17,34.76,36.86,35.29,36.19,36.68,36.31,36.32,
+36.37,35.56,35.62,34.94,36.77,36.00,36.84,36.93,35.74,36.25,
+36.27,39.37,38.91,37.86,40.27,37.02,38.55,39.08,37.37,39.75,
+35.34,38.38,37.50,38.26,39.12,38.46,36.66,39.52,38.72,38.08,
+39.07,39.46,37.97,40.20,39.47,38.88,38.19,39.40,40.45,39.16,
+37.89,39.13,39.14,38.90,38.77,41.80,39.64,39.34,40.11,38.50,
+40.28,39.20,39.91,40.97,39.81,41.19,39.88,40.14,40.91,41.10,
+39.91,41.20,38.65,39.67,41.40,40.08,42.47,40.99,42.13,42.16,
+41.37,41.89,42.64,40.80,42.72,41.79,43.11,41.15,42.39,43.25,
+41.45,43.33,42.43,42.25,41.93,41.77,42.87,44.02,43.84,43.67,
+6.78,7.62,7.72,8.34,8.48,9.00,8.57,9.35,9.48,9.61,
+9.88,9.75,10.22,10.83,11.34,11.49,12.27,11.82,12.27,12.02,
+12.34,13.22,12.71,13.25,13.15,13.23,13.32,13.63,13.94,14.51,
+13.71,14.21,14.92,14.88,15.00,16.53,14.98,16.12,14.70,16.23,
+16.00,16.64,16.17,16.25,16.24,15.99,16.96,17.50,16.99,17.48,
+17.58,17.28,16.79,17.52,18.16,18.02,18.42,19.28,18.18,17.81,
+19.54,19.55,19.45,18.59,19.25,19.58,19.35,19.81,19.10,20.75,
+20.60,20.02,19.98,19.55,20.01,20.42,21.04,20.24,20.75,21.58,
+21.07,21.16,21.28,21.18,22.47,22.21,21.59,22.63,21.85,22.78,
+22.70,21.46,23.22,22.51,22.59,22.56,23.35,23.46,23.11,23.54,
+24.13,23.74,22.73,23.87,24.18,24.34,24.84,24.11,23.91,23.96,
+24.30,25.27,26.02,24.96,24.46,24.76,25.29,25.73,25.39,25.83,
+25.79,26.03,24.67,27.04,26.80,24.73,25.59,27.06,27.19,27.33,
+26.94,25.25,26.53,27.35,28.24,27.71,28.28,27.65,27.31,27.98,
+28.18,26.61,27.93,28.66,27.52,27.97,28.68,28.40,28.88,28.00,
+28.34,29.22,28.63,29.25,29.10,30.09,28.50,28.70,28.63,29.62,
+28.80,28.86,30.51,30.36,29.11,29.21,29.58,29.36,30.21,30.25,
+29.51,30.69,30.61,30.54,31.57,31.07,29.65,30.93,31.17,32.77,
+32.00,30.95,30.71,32.02,33.02,30.89,31.51,31.22,30.10,30.07,
+30.65,33.44,31.77,32.03,33.01,31.85,33.38,32.51,31.72,31.77,
+31.82,34.82,32.33,32.63,32.60,32.68,33.82,33.90,34.66,32.21,
+32.44,33.29,33.42,33.61,33.56,32.08,34.96,33.85,34.10,33.68,
+33.80,34.54,34.92,34.69,34.40,34.72,35.49,34.56,35.13,35.51,
+35.24,34.92,35.45,36.56,34.75,35.79,35.47,35.27,36.80,36.41,
+35.08,36.34,35.15,36.84,35.99,36.66,35.73,35.90,34.59,35.44,
+35.77,36.01,36.66,36.56,37.19,36.89,37.35,36.65,37.11,38.06,
+37.41,36.40,36.88,38.07,37.59,38.32,38.59,38.62,38.43,36.80,
+36.98,38.17,38.04,37.56,37.33,38.78,36.75,38.82,39.55,38.97,
+39.57,36.75,38.93,39.15,36.91,39.91,39.19,38.07,39.49,39.06,
+6.27,6.39,6.68,7.28,7.49,7.74,8.09,8.38,8.63,8.71,
+8.77,9.36,9.58,9.74,10.10,10.39,10.44,10.97,11.05,10.48,
+11.33,11.00,11.74,12.15,11.38,12.72,11.63,12.71,12.46,12.66,
+13.17,13.24,13.76,13.27,13.36,14.01,13.33,14.38,14.01,13.64,
+13.83,14.39,14.05,14.98,14.92,15.15,15.23,14.75,15.82,14.88,
+15.59,16.24,15.18,16.03,15.70,16.67,16.72,16.67,16.54,17.46,
+16.43,17.19,16.54,16.66,16.53,18.31,17.51,18.28,18.22,17.93,
+18.13,18.62,18.76,19.80,18.87,17.90,18.09,19.66,19.16,19.32,
+19.35,18.82,20.40,19.62,20.50,18.86,20.18,19.85,19.94,20.40,
+19.63,19.60,19.45,20.30,19.99,20.07,21.09,20.71,21.50,20.40,
+20.66,20.24,22.22,21.22,22.23,21.29,21.56,22.02,21.52,21.29,
+20.63,22.31,21.86,22.53,22.46,22.26,23.52,23.37,23.63,22.70,
+22.78,23.29,23.93,23.73,24.12,23.57,23.70,23.46,24.09,23.15,
+24.07,23.51,24.56,24.16,24.50,24.21,24.09,24.30,23.38,24.83,
+24.58,24.24,24.04,25.66,24.96,24.86,25.56,24.75,26.43,26.59,
+25.47,25.72,26.00,26.04,26.18,25.50,26.35,26.16,24.35,25.46,
+24.83,26.45,26.38,26.82,26.44,27.70,27.00,27.08,27.19,27.02,
+28.31,26.79,28.41,27.86,26.63,27.12,27.43,28.43,27.89,28.50,
+28.72,27.95,27.54,26.64,29.03,27.45,28.36,28.44,28.59,28.84,
+28.74,28.62,28.22,28.40,28.96,28.46,27.73,28.67,29.22,28.28,
+30.33,30.94,29.75,29.10,29.50,30.63,29.90,30.55,30.17,30.18,
+30.55,30.41,29.98,29.26,29.91,29.30,29.94,30.27,30.72,30.42,
+29.94,32.31,30.26,29.93,28.89,31.42,30.52,31.08,31.35,30.84,
+31.46,32.79,31.88,32.37,31.73,33.03,32.21,30.82,32.47,31.56,
+31.70,31.96,31.98,31.67,32.43,31.05,32.17,31.83,32.71,32.52,
+33.60,31.82,32.79,33.33,33.37,32.88,31.73,33.71,32.95,32.50,
+32.16,34.28,33.10,31.72,34.27,32.30,33.89,34.25,33.71,33.26,
+34.36,35.48,34.90,33.62,33.56,32.45,33.12,34.04,34.22,34.15,
+34.67,35.17,34.74,33.99,34.03,34.73,35.66,34.85,34.10,33.93,
+4.91,5.35,6.24,5.90,7.36,7.47,7.25,7.53,8.01,7.19,
+8.45,8.54,8.76,8.68,8.83,8.85,9.03,9.37,8.94,9.89,
+10.80,9.89,9.85,10.73,10.86,11.45,10.70,10.47,11.13,11.14,
+11.93,11.70,11.50,11.37,11.88,11.08,11.22,12.73,12.81,11.93,
+12.54,12.61,12.81,12.89,13.17,13.47,13.26,13.87,13.75,14.29,
+14.58,13.89,14.08,14.60,13.89,13.98,14.86,15.24,14.40,15.25,
+15.23,14.29,15.68,16.20,15.44,15.65,15.57,14.85,15.93,15.47,
+15.56,16.03,16.18,15.57,16.55,15.99,16.66,16.47,16.85,16.59,
+16.72,17.73,17.50,18.09,17.41,16.51,17.29,18.27,18.31,18.33,
+17.51,17.06,17.43,17.61,17.58,17.96,18.87,18.64,17.90,19.49,
+18.73,19.44,19.00,19.92,19.17,19.18,20.42,18.91,19.53,20.07,
+20.25,19.71,20.17,19.63,20.44,19.58,20.07,20.02,20.06,20.84,
+21.64,20.84,20.96,21.02,22.56,20.48,20.48,20.78,21.09,21.26,
+21.33,20.88,21.52,20.50,21.71,22.12,22.12,22.12,22.22,21.52,
+22.07,21.98,21.62,21.85,22.67,22.71,23.40,22.46,23.23,21.52,
+23.29,22.92,22.77,23.20,23.17,22.71,23.58,23.43,24.08,22.96,
+23.62,24.63,23.98,23.84,23.75,24.18,22.52,23.34,24.26,23.81,
+24.55,23.49,23.70,24.45,23.84,24.12,24.36,23.96,24.47,25.12,
+24.12,24.14,24.83,25.78,25.85,24.89,24.81,24.98,25.59,25.41,
+24.32,25.38,25.57,26.47,25.99,24.91,25.83,26.01,26.14,25.71,
+25.47,25.52,25.49,25.88,26.85,25.62,26.02,27.24,26.90,24.50,
+27.17,26.47,26.46,26.60,27.49,27.04,26.56,27.90,26.81,26.49,
+26.68,27.69,27.79,28.44,27.27,27.29,28.26,27.29,28.12,27.56,
+27.94,28.81,27.32,28.29,28.65,28.71,27.12,28.63,27.89,28.53,
+28.03,29.06,28.83,28.87,28.49,28.01,29.44,29.51,27.24,28.79,
+29.11,28.39,28.77,29.09,28.89,30.26,30.02,28.59,28.74,30.04,
+28.76,30.09,28.36,30.05,29.81,29.33,28.85,30.10,30.05,30.34,
+30.07,30.29,31.13,29.73,31.10,29.53,30.21,29.90,30.25,30.11,
+31.19,31.70,29.86,30.15,30.85,30.04,31.11,30.85,30.91,31.17,
+5.59,5.00,5.80,5.69,6.37,6.62,6.56,6.97,6.35,6.78,
+7.82,6.84,7.21,7.40,7.68,7.90,7.94,8.30,8.29,8.88,
+8.70,9.42,9.56,9.23,9.57,10.06,9.49,9.71,9.38,10.23,
+9.50,10.57,9.71,10.32,11.36,10.79,10.76,10.60,11.02,11.01,
+12.00,11.14,11.08,12.02,11.93,11.54,12.04,13.06,13.05,12.30,
+12.19,12.22,13.05,13.01,13.17,12.53,13.41,13.82,12.62,13.01,
+14.11,13.40,13.19,13.69,14.41,14.63,14.24,14.44,13.94,15.20,
+14.94,14.00,14.97,14.75,14.71,14.84,15.19,14.45,15.40,14.09,
+14.70,15.07,15.15,14.87,15.84,15.99,16.62,16.22,17.31,15.62,
+15.73,16.52,16.18,16.25,15.52,15.97,15.80,16.71,17.05,17.42,
+16.51,16.37,16.15,15.97,16.61,16.84,15.91,18.08,16.74,16.56,
+16.98,17.45,17.51,18.45,17.59,18.25,17.90,17.90,18.09,17.13,
+18.07,18.21,17.47,18.07,18.38,17.98,18.68,19.14,18.76,17.24,
+17.81,19.03,18.59,18.98,19.81,18.94,18.82,20.20,19.36,19.40,
+19.59,19.69,20.56,20.17,19.67,19.43,19.20,18.88,19.75,19.85,
+19.51,20.03,19.31,19.71,20.46,20.41,20.64,20.20,19.90,20.87,
+21.27,21.02,20.09,20.77,20.95,19.90,21.22,21.23,21.62,21.88,
+21.45,22.30,21.05,20.08,20.98,21.33,21.80,22.12,21.71,21.91,
+22.05,22.48,22.93,21.99,21.28,22.10,23.25,21.73,22.32,21.58,
+21.01,22.61,22.32,23.10,22.08,23.21,22.81,23.84,24.00,22.08,
+23.57,24.13,23.36,22.89,24.79,23.82,23.05,22.73,24.08,23.42,
+23.52,24.32,23.76,24.36,24.40,23.08,23.73,24.01,25.08,24.59,
+23.64,23.90,24.55,23.50,24.96,24.48,24.32,25.63,25.70,25.38,
+23.16,24.24,24.67,25.34,24.37,25.38,24.60,25.40,25.34,25.14,
+25.21,25.68,25.05,25.16,24.59,25.17,24.82,25.87,25.00,26.10,
+25.90,25.53,25.28,25.24,26.19,25.12,26.23,26.09,27.03,26.70,
+26.50,27.08,27.40,26.98,26.01,25.90,26.81,26.22,27.33,26.52,
+27.47,27.15,26.70,26.70,26.98,26.91,26.09,27.99,27.02,28.47,
+26.60,27.09,26.46,27.07,27.69,26.89,27.11,27.73,27.94,26.87,
+4.65,3.99,5.09,5.20,6.22,5.62,5.69,6.04,6.71,6.44,
+6.28,6.63,6.22,6.86,6.89,7.71,7.02,7.40,7.55,7.70,
+7.25,8.22,8.42,8.30,7.78,7.20,8.31,8.94,8.42,8.86,
+8.37,9.55,8.95,8.82,9.57,9.69,9.79,9.75,10.18,10.24,
+9.85,10.35,10.37,10.79,10.56,11.15,11.12,11.01,10.60,10.63,
+11.25,11.81,11.19,11.29,11.70,11.39,11.42,12.32,12.31,11.44,
+12.00,11.54,12.21,12.09,12.74,12.54,12.13,13.23,11.84,12.72,
+12.25,12.72,13.39,12.74,13.31,12.52,12.98,13.13,13.66,13.06,
+12.40,12.89,14.14,13.34,14.27,13.73,13.09,13.59,14.60,13.29,
+14.72,14.23,14.89,14.78,13.24,14.71,14.73,13.98,14.66,14.81,
+15.02,15.94,15.06,15.20,15.15,15.11,15.13,15.17,15.17,15.98,
+14.86,15.86,16.21,16.01,15.19,14.82,15.63,15.28,15.74,15.91,
+15.55,15.68,15.64,15.66,15.89,17.04,16.42,17.29,16.41,16.72,
+16.24,16.61,16.89,17.32,16.54,17.38,18.03,17.23,17.23,17.42,
+16.80,17.82,17.63,17.30,16.23,17.25,17.74,17.81,18.38,18.80,
+16.74,17.62,18.27,17.83,18.00,18.14,18.10,18.05,18.36,19.02,
+18.69,18.52,18.64,18.98,18.79,18.44,19.53,18.84,18.55,19.39,
+18.44,19.76,18.23,19.82,19.25,19.23,19.13,19.68,19.48,19.78,
+19.48,19.46,20.14,19.44,19.70,20.02,20.18,20.17,19.82,20.55,
+18.83,19.96,21.06,21.28,20.10,19.87,20.53,20.42,20.38,20.54,
+19.54,20.76,21.33,21.89,20.40,21.11,21.25,22.43,20.53,21.59,
+21.24,21.40,22.32,21.16,22.20,22.59,20.70,21.03,22.00,21.53,
+21.74,22.34,20.62,21.58,20.87,22.34,21.88,20.89,20.75,22.40,
+21.61,21.54,23.74,21.76,21.89,22.90,22.29,22.13,23.61,22.52,
+22.03,22.69,23.25,22.21,23.17,23.30,22.44,22.95,22.66,23.22,
+23.52,23.18,22.79,22.90,23.53,22.68,22.80,22.76,23.30,22.54,
+24.18,24.03,22.24,22.75,22.41,22.92,22.66,22.91,22.88,23.75,
+23.17,23.45,23.12,22.33,22.86,23.48,24.42,24.49,23.39,23.54,
+23.82,25.48,24.57,23.93,23.95,23.50,24.17,24.45,23.99,24.99,
+4.60,4.24,5.08,4.30,5.33,5.11,5.42,4.77,6.05,5.60,
+6.46,6.29,5.55,6.04,6.17,6.17,6.51,6.36,7.01,7.41,
+6.93,7.12,7.39,6.83,7.35,6.97,7.44,8.44,8.42,8.02,
+7.77,8.31,8.02,7.71,8.07,8.53,8.94,8.96,9.18,9.36,
+8.97,9.20,8.22,9.34,10.04,9.63,9.40,10.14,9.76,9.24,
+9.54,10.95,10.34,9.63,10.19,9.96,10.14,10.89,10.14,11.46,
+10.69,10.31,11.48,10.35,10.46,10.61,10.76,11.92,11.17,11.09,
+11.63,11.13,12.07,11.37,11.53,11.28,11.16,11.54,11.06,11.67,
+11.84,12.08,11.73,11.98,11.68,12.32,12.36,12.07,12.33,12.66,
+12.49,12.63,13.60,12.45,11.90,13.17,12.31,12.77,12.96,13.00,
+13.26,13.25,12.81,13.79,14.04,13.57,13.94,13.59,12.98,13.30,
+12.93,14.29,13.25,13.96,14.34,14.18,13.66,14.08,13.83,14.21,
+14.40,14.32,13.95,14.19,14.84,14.19,14.20,16.18,14.95,15.20,
+15.39,15.02,14.39,14.83,16.02,14.71,15.01,15.22,15.35,16.04,
+15.41,15.47,15.22,15.19,15.77,15.64,14.74,15.75,15.34,15.89,
+16.52,16.20,15.37,15.88,14.99,16.49,16.30,15.82,17.00,15.64,
+16.17,16.63,16.41,16.22,15.01,16.56,16.05,16.82,15.86,16.38,
+16.51,17.06,17.07,17.24,17.83,16.56,16.30,16.84,17.61,17.63,
+17.43,17.37,17.14,16.68,17.25,17.65,18.00,18.11,17.33,16.84,
+17.84,17.40,17.26,18.65,17.48,17.66,17.33,17.28,17.92,17.51,
+18.40,19.04,18.34,18.19,18.72,18.36,18.37,19.66,17.90,18.20,
+18.17,18.77,19.01,17.92,19.10,18.84,19.47,18.04,18.42,19.33,
+19.07,18.96,19.13,19.04,18.46,19.33,19.00,19.34,20.32,19.20,
+19.68,20.77,19.19,19.39,18.01,19.72,19.40,18.92,20.30,19.93,
+19.24,19.93,19.10,21.04,19.85,19.74,19.71,19.87,19.54,20.01,
+19.82,20.25,20.33,20.73,20.67,21.63,21.68,20.15,21.01,20.02,
+20.76,20.91,20.27,18.67,20.06,20.29,21.57,20.85,20.52,20.08,
+20.49,21.21,20.53,21.34,20.96,21.99,20.88,22.40,22.47,20.09,
+21.18,20.86,21.19,21.78,20.97,21.14,21.26,21.03,20.39,21.89,
+3.52,3.82,3.93,3.87,4.80,4.42,4.88,4.99,4.78,4.45,
+5.19,5.16,4.90,5.42,5.67,5.65,4.95,5.60,5.54,5.85,
+5.56,5.80,6.03,6.74,5.97,6.50,6.28,6.96,6.72,6.90,
+7.74,7.13,8.01,7.10,7.51,7.11,8.12,7.42,7.66,7.63,
+7.92,7.29,7.78,7.89,8.46,7.96,7.90,8.07,7.47,7.86,
+7.96,9.34,8.81,8.55,8.57,9.26,8.96,8.96,9.40,9.46,
+9.59,9.32,8.54,9.80,8.95,9.43,10.16,9.21,10.30,9.42,
+9.27,9.60,10.23,9.96,10.89,10.29,10.15,9.04,10.13,10.09,
+10.74,10.72,10.87,10.91,10.65,10.90,11.19,11.20,10.91,11.21,
+10.76,10.84,11.37,11.18,11.51,11.22,11.35,11.73,11.05,12.22,
+11.34,12.20,11.56,12.43,11.69,11.85,12.62,12.05,12.43,11.90,
+11.59,12.23,11.94,11.88,11.77,11.87,12.51,12.32,12.56,12.66,
+12.57,12.55,12.83,13.39,12.46,11.90,12.70,12.54,13.71,13.05,
+13.02,12.64,13.90,12.88,13.23,12.88,13.95,14.22,13.38,13.93,
+13.74,12.78,13.17,13.83,13.73,13.47,12.85,14.40,14.32,13.56,
+13.93,14.12,13.86,13.33,13.67,14.66,14.51,14.46,14.72,14.52,
+14.69,14.17,15.44,13.63,14.68,14.50,14.19,14.84,15.59,15.36,
+15.11,15.44,14.47,15.62,15.04,15.42,14.71,15.59,15.98,14.79,
+14.92,15.72,15.62,14.99,15.47,14.83,14.75,14.85,15.28,16.07,
+14.87,15.14,16.27,16.55,15.52,15.98,15.28,15.78,15.66,16.20,
+16.39,16.29,15.74,15.27,15.84,16.06,15.35,15.94,16.11,16.55,
+16.49,16.92,15.15,16.97,17.87,16.41,16.39,16.37,16.61,16.26,
+16.74,17.85,16.71,16.33,16.67,16.79,16.56,17.47,17.52,17.45,
+17.52,17.18,17.62,17.18,16.59,17.04,17.46,17.67,17.57,17.97,
+18.09,17.78,18.30,17.51,17.97,16.86,18.06,17.40,17.39,17.19,
+18.04,17.69,18.64,18.36,17.15,17.68,17.94,17.55,17.35,17.42,
+18.56,18.42,18.36,17.64,18.00,18.09,18.74,17.96,16.53,18.69,
+18.55,18.80,19.00,17.54,18.99,17.57,18.05,19.04,19.24,17.69,
+18.52,19.19,18.19,18.64,18.89,18.31,19.31,19.18,19.57,20.12,
+2.77,4.04,3.84,3.94,3.98,3.69,3.91,3.88,4.33,4.31,
+4.36,4.83,3.97,4.54,4.72,4.56,4.94,5.84,4.90,5.18,
+5.58,5.16,5.91,4.91,5.89,6.15,5.71,5.97,6.01,6.60,
+6.12,5.93,6.83,6.47,7.05,5.34,7.27,6.22,7.28,6.35,
+6.36,7.69,7.18,6.94,7.94,6.92,7.63,6.77,7.06,6.97,
+8.34,7.96,7.35,7.60,8.10,7.75,8.01,8.21,8.02,8.64,
+7.74,7.86,8.94,8.44,8.29,7.94,8.10,8.75,8.40,9.18,
+9.41,8.50,8.36,8.95,8.60,8.96,9.52,8.42,9.12,9.30,
+9.22,9.77,8.62,10.09,9.68,8.90,9.33,10.17,10.70,9.46,
+10.23,9.84,9.30,9.80,10.63,9.53,9.98,9.39,10.31,9.58,
+9.84,10.14,9.61,10.14,10.38,10.55,10.79,9.71,9.78,10.49,
+10.88,10.49,10.74,10.07,10.68,10.75,11.33,10.34,11.06,10.27,
+11.26,11.36,11.00,11.26,11.15,11.44,11.61,11.06,11.26,10.72,
+11.16,11.28,11.45,11.20,11.37,11.56,11.90,10.63,11.56,12.29,
+11.59,12.02,12.02,11.54,12.13,11.20,11.97,12.32,12.40,12.95,
+12.00,12.09,12.54,12.01,12.87,12.20,12.76,12.06,12.54,11.89,
+12.16,13.27,12.36,13.08,13.08,13.50,13.12,13.35,12.96,13.03,
+13.94,12.42,13.00,12.41,12.90,12.92,12.88,13.08,13.14,12.87,
+12.61,14.00,13.67,13.79,13.13,13.16,12.88,14.42,13.33,13.26,
+13.76,14.06,14.03,12.69,13.39,13.25,14.75,14.49,13.33,13.88,
+13.75,14.50,13.47,14.43,13.70,13.26,14.14,13.66,14.12,13.67,
+15.10,14.83,13.96,13.91,15.12,14.87,14.71,14.52,14.35,15.41,
+14.89,14.42,14.50,14.99,14.73,15.43,14.31,16.04,14.72,15.48,
+14.65,15.19,15.36,15.07,15.60,14.83,15.48,15.15,15.93,15.95,
+14.67,15.16,15.56,15.48,15.79,14.77,15.51,15.58,15.33,14.96,
+15.11,14.69,16.92,15.58,15.35,15.90,16.41,14.38,15.13,15.12,
+16.61,15.45,15.85,16.47,15.22,15.84,16.64,16.74,16.55,16.76,
+15.86,16.98,15.31,16.56,15.96,17.12,15.87,16.93,16.60,15.99,
+16.64,16.73,15.96,16.90,16.50,16.54,16.11,16.31,16.23,17.10,
+3.02,2.74,2.97,3.31,2.72,3.80,3.04,3.00,3.12,3.60,
+3.72,4.09,3.94,3.84,3.44,3.83,3.92,4.90,4.72,4.42,
+4.99,4.56,4.46,5.94,4.94,4.54,5.59,4.97,5.04,5.57,
+5.74,5.39,5.71,5.83,5.31,5.50,5.72,5.92,5.21,6.05,
+5.75,6.14,5.77,5.58,6.35,5.81,6.75,6.63,5.45,6.69,
+6.22,7.58,6.77,6.77,6.57,6.46,7.24,7.30,7.08,6.42,
+6.92,7.12,7.38,7.28,7.30,7.86,7.62,7.61,7.40,7.92,
+7.47,7.32,7.99,7.04,7.56,8.17,7.36,8.25,8.19,7.98,
+7.87,8.18,8.03,7.50,8.83,7.86,8.54,8.33,7.81,8.75,
+8.37,8.52,8.09,8.24,9.15,8.90,8.96,8.24,8.67,8.32,
+9.26,8.93,9.01,9.47,8.86,9.28,9.08,8.51,7.87,8.94,
+8.92,9.48,9.27,9.00,9.34,9.68,9.61,9.50,9.54,10.12,
+9.27,9.87,10.45,10.15,10.62,10.18,10.56,9.03,10.08,10.14,
+10.51,10.26,9.39,10.47,9.43,9.96,9.71,10.12,10.79,10.18,
+10.63,10.56,9.99,10.05,10.51,10.18,10.69,10.63,11.01,9.97,
+10.86,10.32,10.28,10.61,10.51,10.90,10.56,10.82,11.39,11.12,
+11.23,11.43,11.24,11.68,11.28,11.39,11.39,12.07,11.37,11.39,
+10.58,11.43,11.17,12.45,12.25,11.01,12.31,11.03,11.99,12.34,
+11.76,11.36,11.20,12.65,11.14,11.68,11.80,12.44,11.97,12.83,
+11.52,11.25,12.36,12.47,11.86,11.96,11.96,12.03,12.11,12.23,
+12.36,11.62,11.96,12.72,12.77,12.41,12.15,13.07,12.33,12.37,
+12.43,13.14,12.41,12.68,13.02,12.95,12.70,13.21,13.49,12.08,
+12.32,12.42,12.79,12.84,13.13,12.13,13.12,11.77,13.14,11.62,
+13.11,12.23,13.43,12.96,13.69,13.72,14.75,13.25,12.99,12.78,
+13.49,12.41,13.33,13.30,12.70,13.57,13.80,13.64,13.47,14.26,
+14.11,12.58,13.39,14.77,14.20,13.81,14.83,12.65,14.92,14.31,
+14.47,14.57,13.33,14.27,13.53,13.13,13.79,15.10,13.28,14.89,
+14.42,14.10,13.38,14.49,14.96,14.95,13.77,14.00,13.63,13.66,
+14.75,14.60,13.79,14.75,14.87,14.57,14.64,14.04,14.62,15.04,
+1.99,2.46,3.04,2.71,2.45,3.10,3.98,3.22,2.83,3.93,
+3.24,3.17,2.80,2.72,3.68,3.38,3.62,4.12,4.39,4.09,
+4.31,3.55,3.28,3.98,5.35,4.80,3.88,4.52,4.49,4.81,
+4.58,3.98,4.24,4.81,4.99,4.85,5.08,5.34,5.48,5.44,
+5.16,4.74,5.51,5.38,5.63,4.83,5.80,5.19,5.85,6.03,
+5.92,5.18,5.61,6.08,6.28,5.54,6.10,5.61,6.42,5.38,
+6.02,5.79,6.01,7.07,6.59,6.81,6.33,6.29,5.90,6.07,
+7.10,6.92,7.01,7.36,7.40,6.71,6.45,6.63,6.80,7.43,
+6.74,6.45,7.52,6.95,7.64,6.96,6.79,7.14,7.62,6.46,
+7.48,7.09,7.50,7.74,7.86,8.14,7.66,7.44,8.03,7.71,
+7.53,8.47,7.91,7.81,7.39,7.98,7.51,8.25,8.20,8.34,
+8.73,7.66,8.75,8.74,8.94,8.97,7.81,7.59,8.00,8.11,
+8.53,7.24,8.84,8.28,8.44,8.19,9.06,9.52,8.25,9.44,
+9.51,8.09,9.47,9.64,9.33,9.84,9.34,9.45,8.67,9.20,
+9.49,9.29,8.55,10.16,9.66,9.22,8.43,10.13,9.54,9.59,
+9.72,9.82,9.16,9.31,8.46,9.63,9.37,9.72,8.71,9.54,
+9.42,9.42,9.46,9.80,9.66,9.89,9.19,9.62,10.40,9.52,
+9.58,10.26,9.64,11.70,10.08,10.32,9.64,10.18,10.78,10.29,
+10.14,10.72,10.87,10.61,9.43,9.86,10.36,10.49,10.35,10.65,
+10.11,10.84,10.63,10.24,10.95,11.13,11.09,11.32,10.26,10.90,
+11.73,10.91,11.04,10.88,10.61,10.59,11.62,11.03,10.70,11.69,
+11.56,11.03,9.96,10.65,11.91,11.32,10.87,11.56,10.73,12.35,
+11.93,10.78,11.98,11.52,11.65,11.74,11.62,11.61,11.53,12.04,
+11.18,11.47,11.77,11.59,11.76,11.18,11.67,11.66,11.34,11.48,
+11.77,11.66,11.60,11.50,11.94,11.97,11.85,11.81,12.50,12.05,
+11.11,11.46,11.87,12.07,11.53,12.06,12.30,11.18,12.72,11.18,
+13.18,11.77,12.26,12.02,13.23,12.38,12.57,13.12,12.42,11.99,
+12.57,12.39,13.13,13.00,12.85,12.64,13.35,12.09,13.10,12.71,
+12.82,12.96,12.69,12.77,12.32,12.43,13.22,13.59,12.73,12.84,
+11.98,12.14,12.46,14.29,14.45,14.29,14.72,15.31,16.07,16.49,
+16.40,17.58,18.04,18.48,18.45,19.10,19.09,18.87,19.53,20.41,
+19.39,21.39,21.44,22.36,21.13,21.80,21.83,23.05,22.95,24.18,
+24.29,24.66,23.80,24.32,24.15,25.74,24.51,25.80,25.53,26.35,
+26.39,27.16,26.82,27.34,27.55,28.52,27.56,28.41,28.67,28.80,
+30.14,28.69,29.46,28.93,30.01,28.64,30.46,30.52,31.43,31.73,
+31.84,30.88,30.64,31.27,32.16,32.99,31.92,33.10,32.76,33.86,
+33.72,34.15,34.39,34.35,34.00,34.48,34.61,34.37,35.54,35.99,
+36.92,34.84,34.29,36.16,36.75,37.73,37.36,37.21,36.98,36.06,
+39.12,39.07,37.87,37.51,37.69,39.43,37.04,39.25,39.06,39.96,
+39.42,38.03,39.64,39.88,39.91,40.65,40.74,42.64,39.88,40.70,
+39.56,41.06,41.00,41.28,43.48,43.87,43.42,42.22,41.47,41.98,
+43.64,43.54,43.94,43.65,42.19,43.65,45.00,44.01,42.98,42.82,
+42.82,44.05,44.95,45.30,45.64,45.36,44.01,45.66,45.18,46.30,
+45.79,45.58,48.93,46.18,46.77,46.45,47.69,48.06,48.37,47.50,
+47.56,46.92,49.40,48.60,48.24,48.46,47.58,48.11,47.82,49.09,
+50.28,49.62,48.01,50.40,49.42,49.20,52.51,50.93,50.07,49.08,
+51.14,49.12,49.14,49.44,50.38,50.18,51.76,52.52,50.57,52.46,
+50.60,50.61,52.27,51.64,53.33,53.57,55.31,52.40,51.32,54.09,
+53.18,52.90,52.86,54.24,51.96,53.27,53.98,53.69,53.51,56.06,
+53.85,53.13,54.89,56.00,54.40,54.13,53.34,55.20,56.25,55.28,
+57.85,54.64,56.35,54.96,56.86,56.13,56.90,55.59,56.42,55.79,
+56.85,56.14,54.69,54.92,56.72,56.51,60.54,56.78,57.12,55.32,
+59.89,54.78,58.06,57.52,58.89,59.85,56.37,58.54,59.27,58.32,
+58.49,59.64,59.22,59.31,61.60,58.58,60.12,59.11,59.19,60.36,
+59.17,60.62,61.11,62.85,59.47,60.61,62.47,62.29,59.48,60.23,
+61.97,60.35,59.80,64.15,61.39,61.28,63.47,59.62,61.16,60.34,
+60.66,63.22,62.96,64.51,66.46,64.59,62.52,60.67,63.84,65.82,
+64.22,62.48,62.65,64.16,64.41,63.04,65.37,64.90,65.17,66.11,
+10.72,12.31,12.51,13.38,13.74,13.38,14.15,14.46,15.37,15.50,
+15.86,16.11,16.14,16.56,16.99,17.76,17.86,19.21,18.49,18.87,
+18.53,20.32,19.86,20.54,20.44,21.21,21.73,21.43,21.31,22.19,
+21.47,22.50,23.43,23.94,23.65,23.84,24.51,24.26,24.08,24.15,
+24.44,24.17,25.52,25.56,25.62,26.74,26.21,27.18,26.90,27.34,
+29.46,27.97,27.59,27.85,28.67,26.73,28.86,29.07,28.03,29.71,
+29.28,28.78,29.81,30.58,31.15,31.99,30.12,30.80,31.05,31.44,
+30.88,31.53,30.62,32.06,33.21,33.55,32.53,31.85,32.84,32.76,
+34.62,34.41,34.29,34.27,34.51,33.60,34.50,34.37,35.91,34.78,
+34.70,36.03,35.57,36.16,36.46,34.65,37.46,36.52,36.15,35.90,
+37.01,35.85,36.13,35.73,36.96,38.12,38.20,36.54,38.52,38.01,
+38.28,38.92,39.02,38.79,37.65,40.89,38.80,42.14,41.00,40.06,
+39.51,40.41,41.13,39.77,40.46,41.23,41.52,40.49,42.35,42.84,
+41.63,41.54,41.10,41.40,43.03,43.66,43.34,44.10,44.01,43.39,
+42.65,41.65,43.26,43.44,42.38,44.31,42.41,44.10,45.86,46.08,
+41.63,45.22,44.25,44.52,43.19,46.87,44.66,45.57,44.39,47.80,
+47.57,46.07,47.82,47.27,48.16,46.95,46.60,47.01,46.64,47.10,
+46.91,45.41,48.93,48.59,47.61,47.86,46.58,47.22,46.08,48.21,
+48.42,47.49,50.02,47.90,48.73,49.32,49.93,50.74,50.27,49.36,
+49.81,49.38,48.61,51.82,49.66,52.30,53.46,52.32,48.57,48.82,
+49.83,50.65,51.33,50.53,53.18,53.22,49.67,52.88,51.21,54.61,
+51.81,52.18,53.03,52.55,52.31,52.52,51.71,52.78,53.76,54.00,
+55.41,53.33,55.59,52.47,56.08,54.00,56.22,53.54,55.65,53.51,
+55.58,54.01,54.10,57.56,54.92,54.13,54.38,52.19,55.36,55.97,
+53.09,54.61,55.70,57.24,55.33,56.22,55.72,57.68,55.82,56.12,
+55.51,57.40,59.82,57.84,56.94,59.40,57.23,58.13,57.06,56.91,
+56.99,59.00,57.50,55.82,61.17,58.84,59.39,57.88,58.62,58.31,
+59.19,57.97,60.65,57.93,57.71,58.57,59.42,61.58,59.30,60.53,
+58.53,59.62,59.91,60.00,60.15,59.54,58.41,60.00,61.04,62.98,
+10.29,11.46,11.37,11.72,12.27,12.83,13.63,13.81,13.93,13.87,
+14.51,15.61,14.89,15.62,15.74,15.48,16.49,16.35,17.51,17.70,
+17.74,18.49,18.56,19.51,18.32,19.78,18.88,19.24,20.39,20.26,
+21.13,21.70,21.63,22.05,20.69,21.76,22.20,22.57,22.46,22.75,
+23.89,23.08,23.54,24.16,24.13,24.72,23.78,23.82,24.94,24.44,
+25.17,25.70,26.82,25.85,27.11,27.49,26.45,26.85,27.43,27.52,
+27.06,28.58,28.03,27.69,27.28,27.59,28.69,29.85,28.82,28.43,
+28.41,30.35,29.29,29.78,29.63,31.36,30.34,30.09,30.11,31.02,
+30.70,30.24,30.93,30.84,31.83,32.63,31.26,32.50,31.81,32.99,
+32.46,33.02,32.51,33.86,32.80,32.82,34.84,34.14,33.35,33.91,
+34.15,35.73,34.43,34.24,35.47,34.60,33.87,35.68,35.52,36.66,
+38.56,36.65,36.94,36.85,36.84,37.27,37.41,36.21,38.22,36.79,
+37.08,37.51,37.02,37.50,38.64,39.38,37.01,38.40,38.48,37.33,
+38.48,37.93,38.45,38.84,39.58,38.76,38.85,38.62,40.13,40.54,
+38.98,40.01,41.36,41.59,40.25,39.20,40.56,41.35,41.60,42.06,
+40.48,42.47,42.36,40.85,40.30,42.66,40.66,41.62,41.65,40.56,
+42.12,41.93,42.89,44.32,41.91,44.03,41.84,44.33,42.00,44.77,
+43.06,43.30,44.99,44.96,45.21,44.33,42.94,44.82,44.21,45.57,
+45.92,44.96,45.03,44.50,44.52,46.29,44.69,46.53,46.84,46.55,
+46.14,47.30,46.19,45.11,45.71,46.14,47.09,46.80,47.11,46.46,
+46.59,47.40,46.84,48.35,46.26,48.21,47.51,47.82,47.73,48.11,
+49.21,46.91,48.85,48.27,48.32,50.71,50.23,48.41,49.75,48.85,
+47.69,48.52,49.71,49.48,50.33,49.93,50.18,50.69,50.24,51.63,
+49.19,52.75,52.63,49.73,47.83,50.11,51.89,52.46,50.51,50.23,
+50.49,52.56,51.83,52.09,51.52,52.96,52.69,52.96,51.84,52.70,
+55.18,51.92,53.01,52.33,53.33,54.24,51.45,55.05,52.06,55.92,
+53.60,54.60,52.95,53.97,55.27,52.69,55.29,54.27,55.62,54.82,
+53.53,55.37,53.63,57.56,55.90,55.02,55.95,55.01,54.07,54.54,
+54.87,53.22,56.26,58.64,57.37,55.82,56.43,58.05,57.03,58.11,
+9.54,10.41,10.43,10.87,11.43,12.59,12.17,12.97,13.03,13.50,
+14.12,13.60,13.52,13.47,14.29,15.07,15.25,16.24,16.33,15.93,
+16.51,16.87,16.45,16.98,18.51,17.91,18.05,17.56,18.57,18.40,
+20.25,18.71,19.20,19.58,19.38,19.52,20.26,20.93,20.74,21.33,
+20.59,22.02,21.28,21.54,21.27,21.93,22.36,23.01,22.76,22.81,
+23.27,24.02,23.86,23.03,23.85,24.04,25.27,24.55,24.70,24.17,
+24.75,26.95,25.79,25.88,26.72,26.09,26.26,27.48,26.31,25.91,
+25.90,26.62,27.74,27.32,27.63,27.23,27.37,27.80,27.87,27.70,
+28.20,27.88,28.97,28.58,29.56,28.99,28.68,28.54,29.98,31.32,
+31.02,30.17,29.39,30.76,31.08,30.40,32.33,31.02,31.38,31.01,
+31.30,31.88,30.98,30.92,31.73,32.67,31.95,33.16,32.64,32.76,
+34.20,32.42,30.59,34.23,33.17,33.44,34.46,34.44,34.66,34.03,
+34.01,35.29,35.20,34.80,36.39,35.59,35.74,35.21,35.28,35.04,
+37.06,35.75,36.14,36.54,36.17,36.20,36.84,36.73,37.13,36.21,
+37.72,35.50,37.88,34.94,37.28,38.26,38.31,37.91,37.18,37.08,
+39.08,39.77,39.43,40.02,39.26,38.60,40.28,39.18,38.65,40.26,
+39.16,38.97,39.50,40.02,40.30,40.48,40.18,39.57,38.65,40.86,
+39.79,40.52,41.13,41.24,41.99,41.48,41.10,40.72,42.50,40.30,
+41.10,41.94,43.61,41.99,42.61,42.37,40.95,43.36,44.02,42.16,
+42.30,42.39,42.05,40.55,42.13,41.93,43.21,44.26,42.30,41.95,
+42.56,44.25,43.56,42.22,44.80,44.11,43.34,42.23,44.21,44.59,
+44.28,44.58,44.18,45.81,46.13,43.73,45.91,45.33,45.38,44.63,
+44.71,45.81,46.32,45.40,44.71,45.71,44.65,45.33,46.20,47.82,
+45.56,45.33,47.00,44.20,47.71,45.89,46.60,46.71,49.30,48.17,
+46.95,47.73,48.09,48.63,47.41,46.81,48.58,46.87,48.12,46.92,
+47.35,48.17,47.41,47.27,48.70,49.48,47.03,49.40,50.23,48.94,
+50.36,49.12,49.51,52.33,50.20,49.78,49.86,50.66,50.20,48.82,
+48.67,51.59,48.56,52.25,50.20,51.17,51.86,51.14,50.62,50.78,
+51.68,51.12,50.50,50.46,51.71,51.83,51.94,52.50,50.20,53.50,
+9.08,9.21,9.04,10.57,10.56,11.13,10.16,11.39,11.39,12.39,
+12.80,12.49,13.09,13.22,13.45,14.29,14.05,14.11,14.77,15.18,
+14.83,15.52,15.89,15.16,16.28,16.16,16.46,16.87,17.24,16.95,
+17.36,17.29,18.35,18.00,18.37,18.73,18.68,18.38,18.88,18.59,
+18.68,19.86,19.38,19.48,20.08,20.27,20.47,20.62,21.52,20.66,
+21.58,21.60,21.45,22.43,22.46,22.06,21.98,22.12,22.42,21.70,
+22.76,22.80,23.25,23.81,23.29,23.40,24.80,23.64,23.34,23.90,
+24.27,25.05,25.17,25.73,25.23,24.69,25.40,24.35,25.88,25.34,
+26.30,27.42,25.54,26.45,26.19,25.54,26.09,26.48,26.81,27.97,
+27.38,27.63,25.91,27.03,28.91,28.05,29.25,28.77,28.74,27.60,
+29.04,27.61,29.12,28.26,28.98,27.57,29.56,29.85,29.39,30.43,
+29.42,29.74,30.00,31.12,28.99,30.38,29.98,30.45,31.82,30.60,
+30.92,30.87,31.71,31.37,30.79,32.41,31.32,32.55,32.57,33.43,
+32.02,31.34,33.05,31.92,32.85,31.08,32.98,34.18,32.73,32.13,
+32.96,34.54,34.29,34.03,32.98,33.89,35.20,32.80,34.69,33.71,
+33.58,35.18,35.88,34.40,36.73,35.07,33.47,35.56,35.15,34.89,
+35.42,33.94,36.47,36.04,34.24,35.68,36.98,35.95,37.18,36.94,
+37.30,36.94,37.03,36.77,38.20,35.60,38.12,36.82,37.01,37.41,
+36.24,36.15,37.44,38.44,39.42,38.83,38.88,37.69,39.60,39.98,
+39.37,38.69,39.51,37.98,39.43,38.81,37.67,39.46,39.15,38.33,
+38.68,39.92,39.52,39.48,39.58,40.04,40.04,42.01,38.34,40.97,
+41.47,39.76,41.05,42.48,42.38,40.40,40.23,41.00,40.98,42.33,
+40.82,40.51,42.30,39.93,44.64,40.73,42.10,41.95,43.76,42.59,
+42.07,42.76,43.22,42.14,42.47,43.53,42.70,42.61,43.88,42.27,
+43.07,42.49,42.30,42.35,43.62,42.65,44.99,43.83,44.06,42.69,
+43.72,44.16,43.70,44.30,44.62,45.44,43.48,43.82,44.26,43.86,
+44.23,43.40,45.77,44.64,45.62,42.79,46.16,43.86,45.18,44.74,
+45.97,46.26,44.57,47.00,46.85,45.83,47.44,45.95,48.07,46.93,
+46.59,47.17,46.58,45.17,45.40,46.95,47.00,48.47,47.48,48.74,
+8.32,7.80,8.16,9.25,9.99,9.93,10.04,10.97,10.37,11.29,
+11.29,11.55,11.65,11.88,12.03,12.47,12.46,12.90,13.25,13.29,
+14.66,14.34,13.66,14.40,14.15,15.58,14.85,15.24,15.13,16.08,
+16.15,16.10,16.33,15.96,16.74,16.91,16.58,17.66,17.34,16.98,
+17.44,18.14,16.95,18.50,18.80,18.17,18.94,18.88,18.85,20.08,
+19.11,19.03,19.11,20.33,19.57,20.54,19.95,20.49,20.55,21.50,
+19.27,20.47,22.14,20.84,22.72,20.85,21.99,22.07,20.91,21.95,
+22.21,22.36,22.09,22.42,22.33,22.32,23.27,23.55,23.75,21.66,
+24.57,25.43,24.88,23.35,23.65,24.78,24.78,24.78,23.93,23.66,
+25.81,25.05,25.36,25.29,24.95,24.21,25.16,25.17,26.20,25.86,
+26.14,26.15,26.80,28.11,26.03,26.29,26.03,28.07,28.20,26.95,
+27.71,27.01,26.15,27.98,29.02,27.54,28.77,27.58,29.25,27.29,
+28.60,28.10,28.77,29.80,28.78,29.22,29.15,28.74,29.73,30.70,
+29.88,30.60,29.29,29.48,30.00,29.77,29.75,29.22,30.07,31.49,
+29.55,30.53,31.08,31.46,31.06,30.63,30.39,31.39,31.81,31.23,
+31.38,31.79,32.24,32.12,31.74,31.86,32.88,32.64,31.19,33.38,
+31.35,32.42,32.78,32.06,32.09,32.98,32.31,32.17,33.03,33.33,
+33.43,33.84,32.31,35.42,33.49,33.70,32.64,32.19,34.73,34.33,
+33.99,33.96,35.08,34.64,34.51,35.35,33.88,34.61,35.70,35.27,
+35.85,34.82,36.74,35.06,36.06,35.73,36.84,35.98,36.40,35.84,
+36.49,37.23,36.40,36.51,35.91,36.43,37.96,35.81,36.59,37.02,
+36.82,36.72,36.94,37.24,36.69,35.71,37.17,37.84,37.23,37.14,
+38.43,37.36,37.95,36.54,38.62,39.38,37.95,37.86,37.69,38.50,
+38.41,38.95,37.74,37.80,37.60,38.28,38.02,40.27,38.93,38.92,
+39.85,40.19,38.87,40.78,40.65,40.97,36.61,39.34,39.29,39.77,
+40.36,40.03,40.31,39.99,39.20,40.53,41.26,40.60,39.82,41.38,
+41.20,39.92,42.59,41.25,40.60,40.39,40.30,41.86,43.18,42.05,
+41.70,40.44,41.99,39.70,42.79,41.01,41.71,42.03,42.48,41.72,
+42.51,43.04,41.79,42.26,42.41,40.21,43.80,43.64,42.92,42.87,
+7.32,7.84,8.11,8.22,8.36,8.77,8.76,9.41,9.62,9.97,
+9.49,10.32,10.49,10.60,10.52,11.10,11.45,11.70,12.01,11.33,
+12.05,12.27,13.07,12.63,13.17,13.57,13.49,13.32,14.23,13.55,
+14.88,14.41,14.76,14.52,13.96,15.45,15.70,15.48,16.53,15.67,
+16.13,16.33,16.80,15.68,16.21,16.16,16.42,16.65,17.63,18.09,
+16.82,17.06,17.55,17.59,17.48,17.82,18.43,18.38,19.89,18.39,
+19.26,18.96,19.26,19.76,19.00,18.92,19.12,19.87,19.52,19.69,
+20.07,20.36,19.89,20.48,21.19,20.37,21.27,21.92,20.89,20.78,
+21.54,21.19,21.41,21.04,22.31,21.78,22.15,22.31,22.22,21.27,
+21.79,21.55,22.93,22.19,21.83,23.76,23.80,23.49,22.81,22.47,
+22.94,23.56,24.16,25.19,23.82,23.79,24.10,24.64,24.15,24.55,
+24.52,24.60,24.69,24.47,25.22,26.39,25.59,24.95,25.67,25.90,
+25.75,27.21,25.82,25.75,25.47,25.85,26.04,25.55,26.16,26.22,
+25.89,27.25,26.46,26.78,26.80,26.21,27.29,27.25,27.51,29.00,
+28.18,27.36,26.74,27.31,28.88,29.61,28.02,27.80,28.08,27.82,
+29.14,28.13,28.83,29.39,28.23,28.42,29.36,29.97,30.09,29.02,
+29.04,30.16,29.47,29.86,28.93,30.97,29.87,29.00,29.56,29.83,
+31.78,30.82,30.32,30.13,31.11,30.23,32.30,31.07,30.06,31.58,
+30.40,31.48,31.65,32.65,31.61,32.19,32.54,32.23,32.75,31.04,
+30.33,33.27,31.37,31.16,32.81,31.86,33.77,31.80,31.94,31.40,
+32.30,32.36,32.70,32.53,32.99,32.36,32.48,32.83,32.62,32.77,
+33.62,33.36,33.75,33.66,34.38,34.17,33.36,34.63,35.52,34.03,
+33.19,35.22,33.78,35.44,36.15,34.01,35.32,34.59,35.59,34.39,
+34.95,35.54,37.03,34.25,36.15,35.50,33.75,34.94,35.66,35.96,
+36.67,33.95,34.26,35.13,34.78,35.95,35.39,37.19,37.05,36.27,
+37.43,35.55,36.12,35.83,35.92,36.02,35.92,37.60,36.07,36.51,
+37.12,37.28,36.33,35.77,37.13,35.86,37.50,37.43,37.49,38.07,
+37.13,38.43,38.35,37.86,35.86,38.14,38.62,38.07,38.82,39.65,
+37.79,37.69,39.09,39.76,37.39,40.68,38.67,37.43,39.04,37.04,
+6.53,6.72,7.35,8.01,7.53,8.28,8.43,8.06,9.44,8.91,
+9.27,9.00,10.16,9.65,9.79,11.10,9.82,9.97,10.55,10.43,
+11.21,10.77,10.98,11.44,11.53,12.49,12.05,12.83,12.66,12.22,
+12.71,13.54,12.94,12.79,13.51,13.67,14.10,13.32,14.13,13.79,
+13.42,14.71,13.99,14.65,14.84,14.20,15.95,15.03,15.35,15.21,
+15.16,16.04,15.50,15.31,16.07,15.63,17.29,16.69,16.47,16.66,
+16.72,16.77,17.14,16.28,16.69,17.21,17.80,17.14,18.62,17.30,
+17.60,17.58,18.68,18.54,18.97,18.41,18.19,18.41,19.68,17.69,
+19.38,18.38,19.10,19.35,19.63,19.76,19.55,19.29,19.89,19.84,
+21.27,20.36,19.84,20.82,20.72,21.06,19.82,20.90,20.77,21.00,
+21.59,21.12,20.97,21.28,21.03,22.13,21.71,21.47,21.31,21.69,
+22.06,21.64,22.45,23.49,22.99,22.64,22.71,22.58,23.12,22.62,
+23.19,22.36,22.81,21.74,22.64,24.21,23.42,23.79,22.82,23.61,
+24.52,22.69,23.94,24.07,23.43,24.40,23.58,24.19,24.56,24.26,
+23.75,24.08,24.27,26.13,23.71,24.24,25.39,24.91,24.56,26.12,
+25.15,26.02,26.51,24.99,25.72,25.56,25.13,26.42,26.38,25.45,
+26.36,26.17,27.51,25.78,25.56,27.27,27.73,26.46,26.51,27.78,
+26.90,25.83,26.71,27.28,27.94,27.23,26.98,27.46,27.64,27.74,
+26.91,27.76,27.12,28.02,28.38,28.71,28.00,29.50,28.83,28.57,
+28.41,29.68,29.06,28.86,29.36,29.18,28.63,29.45,28.18,29.27,
+28.94,26.84,30.02,28.78,30.58,30.34,30.31,30.58,30.41,29.49,
+29.69,29.95,29.89,31.11,29.43,30.40,30.46,30.64,30.75,30.28,
+31.02,32.84,31.75,31.92,29.71,31.92,31.65,29.67,31.16,31.81,
+31.09,30.29,32.04,31.69,31.00,32.00,32.63,31.46,31.81,31.63,
+31.38,32.26,32.63,32.74,32.34,32.35,32.99,31.64,33.23,31.60,
+31.52,34.17,32.55,32.35,34.18,32.30,33.11,32.86,33.62,32.68,
+32.97,34.53,33.26,34.24,34.87,32.64,32.93,33.67,33.98,33.20,
+33.77,33.82,34.76,33.35,33.22,33.47,34.29,35.60,34.89,34.18,
+33.48,35.03,34.95,35.65,34.01,33.49,34.92,33.31,34.43,34.79,
+5.78,5.85,5.93,6.13,7.71,6.21,7.61,6.97,7.51,8.47,
+8.26,8.18,8.22,8.45,9.06,8.71,9.27,9.25,9.67,9.74,
+9.74,10.03,10.44,10.75,10.53,10.34,10.34,11.06,10.94,11.69,
+11.74,11.01,11.34,12.12,11.95,12.44,12.25,11.95,12.07,12.86,
+12.43,12.95,12.37,12.82,12.99,13.93,13.30,13.85,13.22,13.81,
+14.22,14.06,13.41,14.73,14.67,15.07,15.20,15.08,14.46,15.39,
+15.14,15.72,14.68,15.99,14.62,15.09,14.90,15.80,16.60,15.70,
+15.59,16.18,16.03,16.82,17.15,16.02,16.59,17.13,17.23,17.14,
+16.63,17.20,18.02,16.64,16.55,17.62,18.43,17.60,17.34,18.69,
+17.54,18.41,18.75,18.39,18.01,17.80,18.89,18.82,19.45,19.97,
+18.96,19.59,19.02,18.99,19.17,18.98,20.50,19.35,19.05,19.37,
+20.03,17.63,19.24,19.45,20.32,20.63,19.89,20.40,19.78,20.77,
+20.61,20.13,20.81,20.00,20.61,21.14,22.07,20.02,21.04,21.77,
+20.81,21.11,20.84,20.78,22.27,20.25,21.86,21.19,22.45,21.49,
+22.52,21.57,21.73,21.93,21.90,22.46,23.39,22.02,22.18,22.94,
+24.21,23.27,23.22,22.83,22.42,24.73,23.90,21.89,23.48,23.89,
+23.26,22.97,22.08,23.48,23.19,23.80,23.42,23.97,23.73,23.47,
+24.41,23.86,23.35,25.08,24.21,24.39,24.24,25.16,24.12,24.91,
+24.43,24.69,24.65,24.17,25.08,25.74,24.97,25.92,25.68,24.53,
+25.41,25.68,26.31,26.36,25.42,26.65,25.77,25.13,25.16,24.01,
+26.96,26.26,25.67,25.99,25.72,25.39,26.73,27.25,26.60,26.62,
+27.22,26.76,26.61,27.30,27.19,27.76,26.12,26.62,27.66,26.99,
+27.95,26.75,27.08,27.60,26.82,28.97,28.44,27.59,29.63,26.91,
+26.93,29.36,27.61,27.75,27.45,27.83,27.93,29.91,27.64,28.63,
+28.72,28.16,28.68,28.57,29.01,27.92,28.57,30.08,28.78,29.47,
+29.63,29.09,27.80,29.00,29.86,29.80,29.05,28.96,30.50,29.46,
+30.13,31.62,28.84,31.61,29.81,30.01,30.50,30.26,28.86,30.03,
+30.48,30.71,29.81,31.13,29.66,29.19,30.83,30.72,28.24,29.13,
+30.50,32.34,30.33,30.87,30.77,30.89,30.82,32.22,30.46,30.87,
+5.22,5.59,5.80,6.62,5.56,6.46,6.06,6.90,7.19,7.15,
+7.26,7.63,7.73,6.76,8.20,8.69,8.91,8.39,7.79,8.82,
+8.69,9.33,9.37,9.05,9.43,9.70,9.23,9.89,10.01,10.23,
+9.98,9.98,10.22,10.52,10.72,11.18,10.87,11.48,11.09,11.42,
+10.43,11.56,11.65,11.77,11.75,12.34,11.67,11.86,12.33,13.02,
+12.55,11.71,13.72,12.73,13.28,13.02,13.27,13.78,13.50,13.57,
+13.56,14.28,13.12,13.59,13.92,14.13,13.80,14.30,13.70,14.03,
+13.95,14.84,14.83,14.71,14.86,15.59,13.67,14.87,15.24,15.65,
+15.11,16.07,15.25,15.54,16.37,15.17,16.10,15.76,17.09,16.04,
+16.57,16.42,16.10,16.15,17.29,16.92,17.38,15.92,17.44,16.97,
+16.76,17.33,17.08,17.43,18.02,16.60,16.99,16.57,17.39,16.85,
+16.99,17.48,17.82,17.84,17.77,18.52,18.23,18.49,17.74,19.44,
+17.69,17.78,17.93,17.97,18.96,19.25,18.21,18.82,19.87,19.60,
+18.97,19.22,19.48,19.17,19.68,19.41,19.26,19.42,19.52,19.73,
+19.29,20.12,19.08,19.32,19.40,19.36,19.42,19.63,19.46,21.08,
+20.13,20.53,21.06,20.36,20.22,19.98,20.72,19.04,21.34,21.06,
+21.52,21.40,20.92,21.62,21.28,21.86,21.22,21.60,21.83,21.86,
+21.70,21.49,21.76,22.22,21.81,22.25,22.00,21.42,21.18,23.06,
+22.30,22.62,21.66,22.78,23.13,22.89,21.93,23.12,22.06,22.44,
+23.42,21.12,23.37,23.09,22.78,22.63,23.83,23.13,23.40,22.41,
+23.81,24.60,23.58,23.22,23.41,23.14,24.23,23.69,22.89,24.51,
+24.39,23.89,24.28,23.65,22.91,24.51,24.27,23.92,23.39,23.82,
+23.70,25.70,25.18,24.24,24.57,25.23,24.47,25.22,24.21,25.19,
+24.74,24.94,25.77,25.22,25.40,25.08,25.60,25.01,25.06,25.26,
+25.11,24.96,25.81,24.29,26.25,24.34,25.50,25.76,25.41,26.28,
+26.57,26.35,27.47,26.59,28.38,27.28,26.83,25.93,27.26,26.32,
+26.29,25.87,25.78,27.08,25.99,25.81,27.70,25.96,27.75,26.60,
+26.69,28.75,26.32,27.31,27.16,28.11,27.89,27.25,26.96,25.90,
+27.93,28.71,28.32,27.24,27.88,28.37,27.08,28.17,27.64,28.90,
+4.76,4.64,4.99,5.29,5.35,5.82,5.61,5.36,6.50,5.45,
+6.72,6.82,5.91,7.04,7.22,6.70,7.07,7.54,7.29,7.43,
+7.92,7.74,8.33,7.74,8.86,8.47,8.47,8.40,8.90,9.02,
+9.76,9.20,9.13,9.21,10.97,9.59,9.96,9.04,9.83,10.36,
+10.59,10.23,10.46,10.35,10.52,9.63,11.50,9.86,11.14,11.09,
+11.22,10.85,10.61,11.92,11.18,12.07,11.63,11.25,11.61,11.20,
+11.60,11.78,11.70,12.56,11.92,12.73,12.63,12.89,11.96,12.49,
+12.08,12.00,12.93,12.62,12.77,11.96,13.20,12.77,14.25,13.27,
+13.24,13.81,14.28,13.87,14.50,13.85,13.93,13.46,14.47,12.98,
+13.40,13.72,14.31,14.24,14.70,15.00,14.29,15.64,14.82,15.34,
+15.19,14.98,14.74,16.17,14.26,15.65,14.84,15.66,16.23,15.74,
+16.14,15.91,16.35,15.98,16.00,15.58,16.33,17.13,15.79,16.23,
+15.87,16.24,16.21,16.82,17.30,16.18,17.03,16.73,16.80,16.91,
+16.39,17.36,17.32,16.86,17.24,16.87,16.78,17.25,17.49,17.19,
+17.79,16.71,18.28,17.51,17.44,16.76,18.40,18.29,19.65,17.38,
+18.17,18.73,17.79,18.47,17.97,18.49,18.63,17.64,18.62,18.17,
+18.75,17.71,17.83,18.85,18.99,19.69,18.34,19.03,19.67,19.26,
+18.97,19.50,19.28,19.22,19.86,18.71,18.83,18.96,19.34,20.25,
+19.49,19.28,18.96,20.24,20.25,20.25,20.25,20.13,19.83,20.94,
+20.02,20.23,21.61,19.53,21.73,20.58,19.92,20.51,20.87,21.86,
+19.41,20.84,21.69,19.82,21.15,20.88,20.72,21.08,19.80,20.33,
+21.34,21.22,20.89,22.41,21.21,22.57,20.76,21.60,21.54,22.27,
+22.24,21.86,21.66,21.28,21.95,21.43,21.65,21.64,20.61,23.08,
+22.56,21.30,21.61,21.49,22.86,21.37,22.56,22.05,22.19,23.80,
+21.50,22.16,22.00,21.91,22.48,23.17,23.33,23.65,22.63,22.33,
+23.10,22.38,23.89,23.98,23.27,22.39,23.33,24.22,24.68,24.75,
+23.76,23.95,23.60,23.91,23.35,23.01,23.63,24.07,23.32,22.78,
+24.46,23.48,23.48,25.08,24.31,23.35,24.77,24.39,24.09,24.54,
+24.36,23.22,24.51,25.06,24.80,24.99,23.99,23.67,24.64,25.05,
+3.40,2.98,3.87,4.26,5.09,5.85,4.99,5.19,5.32,6.07,
+4.81,5.65,5.75,5.81,6.31,6.53,6.99,6.19,6.18,6.27,
+7.07,7.14,7.16,7.45,7.45,7.30,7.62,7.80,8.11,8.31,
+8.14,7.57,8.34,7.90,8.50,7.61,8.38,8.26,8.45,8.17,
+9.55,9.34,9.68,8.96,9.09,8.89,9.52,8.97,9.58,10.09,
+9.63,9.56,10.13,10.17,9.37,10.13,10.11,10.54,10.48,9.94,
+10.81,10.30,10.61,10.86,11.76,11.05,10.52,10.42,10.88,11.77,
+11.33,10.85,12.00,12.15,11.47,11.90,11.23,12.08,12.19,11.16,
+12.21,12.22,12.50,12.44,12.10,12.54,11.89,12.43,12.13,12.55,
+12.79,12.85,12.53,12.68,12.91,12.77,14.00,14.31,13.06,13.34,
+13.16,12.84,13.42,13.10,14.23,13.22,14.53,14.37,13.89,14.35,
+13.29,14.14,14.36,14.70,14.86,14.12,14.99,14.00,14.86,14.99,
+14.49,13.62,14.99,14.70,14.23,15.46,15.35,15.19,14.34,15.68,
+15.69,14.95,15.06,15.08,14.63,15.45,14.33,15.60,15.55,15.26,
+16.24,14.96,14.77,16.11,15.36,15.30,15.32,15.19,15.33,15.86,
+16.69,15.79,15.35,17.08,16.17,16.41,15.36,16.41,16.54,15.90,
+16.58,16.83,16.49,16.55,16.32,16.39,16.14,16.36,16.33,18.25,
+17.07,18.03,17.34,16.77,17.27,16.65,17.40,16.88,17.44,18.04,
+17.56,17.25,17.61,18.69,17.30,17.85,17.59,18.14,18.03,18.22,
+17.93,18.23,18.87,18.05,18.59,19.04,18.39,19.41,19.23,18.76,
+17.83,18.93,18.51,18.19,18.55,19.45,19.20,19.31,19.38,18.13,
+18.41,19.24,18.70,19.78,18.69,18.42,18.76,17.85,18.88,18.65,
+17.75,19.58,19.79,18.91,18.59,19.71,18.94,19.70,19.52,19.85,
+20.85,20.48,20.92,19.87,19.48,19.81,20.12,19.53,19.09,19.94,
+21.05,20.20,19.98,20.92,21.45,20.92,20.18,20.38,20.01,20.82,
+19.83,20.93,20.90,22.14,20.63,21.04,21.21,20.22,20.25,20.95,
+21.80,20.79,20.17,20.73,21.56,20.98,20.76,21.60,21.51,21.02,
+21.31,21.33,20.29,21.55,20.50,21.52,22.00,21.81,23.27,21.41,
+21.81,21.28,20.85,22.34,21.10,22.47,20.62,21.77,22.46,22.42,
+3.95,3.60,4.48,3.94,4.54,5.03,4.95,4.89,5.34,4.55,
+5.03,5.27,4.49,5.54,4.95,5.56,5.14,6.12,5.49,6.29,
+6.80,5.88,6.72,6.97,6.46,6.77,7.37,7.15,7.63,6.76,
+7.26,7.57,7.12,7.54,7.71,8.15,8.22,8.09,7.56,7.63,
+7.64,8.44,8.71,8.52,7.50,8.64,7.97,8.13,8.40,8.63,
+8.40,9.09,8.22,9.17,8.60,9.75,9.44,10.02,9.74,8.92,
+8.74,9.88,9.47,9.98,9.37,9.88,10.50,9.63,11.18,9.76,
+9.62,9.95,10.20,10.45,9.71,9.75,10.15,10.81,11.25,10.83,
+10.20,10.47,10.19,9.74,10.72,11.25,10.31,10.46,11.21,12.07,
+11.25,11.54,10.79,11.93,11.66,11.38,12.20,11.64,10.02,11.84,
+11.18,11.90,11.51,11.77,12.01,13.01,11.73,11.73,12.24,12.32,
+12.39,12.07,12.57,11.78,12.69,11.94,12.23,12.48,12.98,13.22,
+12.01,11.95,13.29,14.24,13.66,12.36,12.60,13.62,14.06,13.86,
+13.17,13.47,13.89,12.66,13.47,13.87,14.32,13.65,14.43,13.49,
+13.02,14.18,13.69,13.79,14.00,13.84,13.36,13.88,13.69,13.80,
+14.49,13.80,14.34,14.14,14.70,14.61,14.97,14.17,14.33,14.30,
+14.90,14.28,14.92,14.89,15.27,14.99,14.92,14.33,14.88,15.16,
+14.88,15.25,15.27,15.51,15.88,15.58,15.26,15.25,15.36,15.07,
+14.99,15.73,14.86,16.84,15.86,15.92,16.42,14.94,14.72,14.30,
+16.69,15.57,16.18,15.99,16.48,16.30,16.94,15.07,15.98,15.15,
+17.15,16.76,15.91,16.53,17.30,16.45,16.53,17.11,15.69,16.81,
+16.10,17.31,16.45,17.18,17.58,17.21,16.72,17.46,16.78,17.44,
+16.82,17.39,16.67,17.04,17.46,17.73,17.95,17.45,16.70,17.78,
+17.12,17.76,17.70,17.09,17.29,17.28,17.28,18.67,17.00,18.05,
+18.21,17.83,17.71,17.56,17.61,17.71,19.13,18.15,18.67,17.91,
+18.14,17.41,17.96,18.41,17.17,17.51,18.72,17.28,17.48,18.21,
+17.48,19.65,18.94,18.10,18.97,18.63,18.86,18.24,18.11,18.63,
+18.94,18.52,19.16,19.08,19.37,18.69,18.69,19.63,18.25,18.69,
+19.49,19.13,19.06,18.57,18.93,20.23,19.49,19.90,20.96,20.10,
+2.37,3.02,3.22,3.45,3.58,4.48,3.47,3.00,5.32,4.40,
+4.35,5.22,4.23,4.88,4.63,4.87,5.70,5.66,4.69,5.32,
+5.40,5.72,5.60,6.40,6.14,5.22,6.44,5.85,6.45,6.34,
+5.97,6.44,7.04,7.18,6.72,6.52,6.66,7.03,6.73,5.88,
+6.98,7.52,7.19,6.80,7.25,7.03,7.35,7.07,7.06,7.34,
+7.86,8.23,7.49,6.81,7.96,7.72,8.65,7.59,8.53,8.69,
+8.35,8.00,8.62,8.27,8.62,8.68,8.36,9.31,8.25,8.95,
+8.45,9.11,8.94,9.53,9.46,9.33,9.19,9.39,9.85,9.63,
+10.83,9.25,8.63,10.03,9.68,10.18,9.78,9.68,9.57,9.62,
+10.22,9.82,10.60,9.75,9.96,9.84,10.33,10.77,10.70,10.47,
+9.83,10.32,11.40,10.22,10.41,10.24,10.56,11.23,10.80,11.55,
+11.30,11.06,10.84,10.95,11.99,11.42,10.90,10.64,10.97,11.80,
+11.70,11.15,11.81,12.10,11.42,11.64,11.76,11.41,11.58,11.90,
+11.79,12.67,11.82,12.08,12.21,12.72,12.03,12.47,13.19,11.99,
+12.08,11.75,12.41,12.97,12.66,12.86,11.90,13.21,12.21,12.24,
+12.20,12.51,12.48,13.39,12.53,12.02,13.72,13.30,11.72,12.45,
+12.46,13.66,13.35,13.39,13.13,13.28,13.03,13.38,12.92,13.09,
+12.79,14.24,13.01,13.55,13.46,13.69,13.44,13.30,14.27,12.99,
+13.24,13.86,13.44,13.34,14.15,13.73,14.02,14.03,13.53,15.00,
+13.65,12.29,14.30,14.36,13.79,14.58,15.44,13.75,14.36,13.91,
+14.68,14.58,14.11,14.30,14.10,15.13,13.88,15.51,14.99,14.87,
+15.33,14.27,14.72,15.39,15.60,15.65,15.26,15.40,15.16,15.05,
+14.91,15.26,15.65,15.18,14.54,15.45,15.42,15.16,15.87,15.15,
+15.35,14.62,15.64,15.55,15.45,15.75,15.34,16.07,15.94,15.56,
+15.33,16.20,16.12,16.20,15.51,15.61,14.95,15.87,14.85,16.25,
+15.82,16.26,16.04,15.27,16.45,15.41,16.65,16.51,15.45,15.64,
+16.29,15.63,15.87,16.31,16.12,16.80,17.46,16.31,15.41,16.61,
+16.46,16.38,17.35,16.88,16.78,17.10,16.65,16.52,17.53,17.79,
+17.34,16.00,17.34,17.30,17.51,17.08,16.46,15.91,17.15,16.31,
+2.44,3.32,3.05,3.41,2.88,2.41,3.71,3.83,3.64,3.30,
+3.95,3.38,4.38,3.78,4.04,3.82,4.48,4.31,3.97,4.57,
+4.67,5.18,5.40,5.58,5.06,5.30,5.69,4.96,5.11,6.62,
+5.62,5.47,4.95,5.92,6.18,5.41,5.77,5.64,6.04,6.19,
+5.69,7.35,6.25,6.98,6.52,5.92,6.11,6.66,7.15,6.76,
+7.05,7.06,7.40,6.55,7.61,7.33,6.28,7.05,7.97,7.59,
+6.67,7.69,7.06,7.15,8.37,7.98,8.18,8.94,8.11,7.51,
+7.54,7.93,7.73,7.90,8.21,7.71,7.73,8.27,7.80,7.50,
+9.03,8.58,7.55,9.01,8.71,9.18,7.81,8.22,8.83,8.24,
+8.65,8.47,8.44,8.89,8.42,8.01,9.53,8.55,9.07,8.87,
+9.76,9.36,8.60,9.05,9.40,9.32,9.88,9.71,9.51,9.92,
+9.38,9.72,9.52,9.81,10.05,9.46,9.55,9.70,9.33,10.70,
+10.47,9.50,9.88,10.48,10.18,10.53,10.09,9.68,10.45,10.41,
+10.43,10.67,10.52,10.15,10.51,10.64,9.84,11.16,11.11,10.39,
+11.42,11.03,10.96,9.90,11.38,10.79,11.29,11.33,11.01,12.70,
+10.84,11.12,10.74,11.42,12.25,11.14,11.13,11.68,11.19,11.92,
+11.03,10.52,11.57,12.27,11.57,11.23,12.16,11.23,11.55,11.60,
+11.41,12.34,12.12,11.72,11.67,10.87,12.75,12.17,11.90,11.54,
+11.77,12.31,12.07,12.54,12.35,12.43,11.63,12.01,12.56,13.28,
+11.94,11.68,12.21,13.63,12.29,12.32,12.27,12.70,12.75,11.76,
+13.13,12.54,13.23,13.20,13.60,13.00,13.04,13.15,12.49,12.36,
+12.91,13.01,13.22,13.82,12.45,12.75,12.00,13.44,13.26,13.04,
+13.02,12.79,12.96,13.21,12.45,12.42,13.62,14.29,13.74,14.39,
+13.18,13.52,13.88,14.04,13.79,14.83,12.56,12.90,13.61,14.24,
+14.35,13.85,13.48,14.77,14.55,14.95,14.20,13.25,13.74,12.91,
+13.73,13.32,14.28,14.23,14.26,14.47,15.97,14.85,14.42,14.89,
+15.24,14.16,14.76,13.82,14.64,14.52,14.67,14.68,14.75,15.08,
+16.01,14.45,14.18,14.89,15.09,14.26,15.08,14.54,15.30,15.33,
+14.49,15.14,15.42,14.69,15.53,14.91,14.80,14.27,14.85,14.78,
+12.99,13.54,14.53,14.42,15.43,16.24,16.55,16.48,17.10,17.42,
+18.82,19.34,17.80,19.49,19.00,20.27,20.17,20.41,20.12,21.09,
+21.22,21.61,21.84,22.66,22.73,23.46,24.10,24.98,24.28,25.28,
+24.68,25.25,25.34,26.34,26.49,26.97,26.66,28.47,28.93,27.32,
+28.10,27.82,28.86,28.95,29.54,29.32,30.44,30.89,28.91,30.02,
+30.77,30.62,32.06,31.77,33.40,31.26,32.00,33.02,33.53,32.79,
+32.75,33.18,32.42,34.41,34.91,32.97,34.51,34.72,34.99,36.06,
+35.33,35.53,35.32,35.60,35.32,35.78,36.34,35.37,37.50,38.66,
+37.05,38.61,37.02,36.95,37.92,38.59,38.42,38.70,39.63,41.14,
+37.98,38.75,39.94,40.60,40.20,39.45,41.76,39.99,41.97,41.41,
+40.58,41.38,41.19,42.59,41.89,44.20,41.45,43.66,42.39,42.40,
+44.26,42.57,43.17,45.28,45.38,44.83,44.37,44.83,43.50,44.13,
+45.68,45.30,45.19,44.19,46.34,46.19,47.33,47.08,45.29,44.08,
+45.10,49.06,48.15,48.42,48.60,47.65,48.93,49.50,48.46,47.57,
+48.51,48.56,48.17,50.99,49.63,48.86,49.52,51.14,48.81,49.47,
+49.50,49.57,49.55,48.60,51.56,50.13,50.68,53.07,49.32,49.15,
+50.10,52.58,53.34,53.86,49.84,51.47,53.86,53.41,53.26,51.97,
+53.11,52.56,52.65,53.49,52.62,51.30,53.52,53.45,52.34,55.28,
+55.03,55.65,52.61,53.07,53.44,56.25,56.20,55.76,55.92,53.59,
+56.28,56.82,57.10,56.99,56.22,57.65,55.74,58.57,56.42,59.04,
+58.04,58.63,59.98,57.38,56.91,59.22,56.68,58.54,58.87,58.53,
+58.64,59.41,58.75,61.02,60.91,59.57,58.29,60.06,59.32,59.08,
+59.77,57.72,60.97,58.75,59.74,60.10,62.02,60.04,60.58,62.77,
+56.83,63.03,60.29,60.95,61.61,64.43,61.14,63.94,61.90,61.79,
+64.08,64.06,62.22,65.08,64.59,61.69,64.61,62.70,64.76,66.22,
+63.28,63.76,63.89,65.16,65.31,65.80,62.34,63.72,63.38,63.39,
+65.30,63.06,66.83,64.04,67.38,65.55,65.99,67.08,67.47,66.87,
+66.86,63.38,66.34,66.86,64.45,68.61,64.39,67.23,66.03,68.55,
+67.01,67.36,68.55,66.69,68.00,66.31,70.08,69.23,67.69,68.63,
+11.62,12.39,13.49,13.84,13.87,14.44,14.83,15.60,16.14,16.86,
+16.68,17.43,17.96,18.43,18.30,18.70,18.73,19.57,20.56,20.66,
+20.60,20.66,20.57,21.06,21.66,22.07,22.47,22.83,23.19,24.23,
+22.70,23.51,24.39,24.44,25.35,25.65,24.43,26.47,27.49,26.82,
+25.95,25.39,27.51,26.85,27.19,27.85,28.38,27.30,28.43,27.96,
+28.80,29.06,29.61,29.21,30.24,30.54,30.46,29.76,31.22,31.63,
+31.55,32.75,32.02,31.86,32.00,33.25,32.08,32.98,34.73,32.76,
+32.64,34.65,33.00,34.42,34.99,33.44,34.53,35.95,34.80,35.68,
+35.67,34.46,34.37,35.80,35.64,36.14,36.72,37.47,38.63,37.12,
+37.64,36.65,38.64,37.58,38.02,37.90,38.76,37.47,38.87,39.71,
+38.71,40.33,39.07,38.91,39.60,40.59,40.86,40.93,40.35,40.82,
+40.66,40.65,42.41,42.12,40.95,43.80,42.99,41.88,43.64,42.99,
+43.29,40.63,43.55,42.78,45.04,42.60,42.44,43.36,44.14,43.38,
+43.57,44.03,44.07,43.53,46.36,43.83,43.66,45.36,46.93,46.90,
+46.26,43.96,45.99,45.30,46.25,44.85,45.73,46.60,47.08,47.75,
+48.91,48.76,46.61,48.69,47.45,49.18,47.07,46.99,49.41,48.42,
+49.95,50.07,48.09,51.70,51.10,48.93,49.40,50.99,48.25,49.12,
+49.38,50.02,51.40,48.62,52.07,52.14,51.43,51.96,50.44,52.02,
+51.95,50.47,48.86,51.66,51.53,51.88,53.35,53.08,52.56,53.95,
+54.51,51.92,54.95,51.77,54.42,50.91,54.36,53.61,56.57,54.48,
+54.78,53.08,55.53,54.61,56.36,55.15,56.03,54.50,55.43,55.85,
+56.42,54.76,55.32,55.03,56.87,55.40,55.49,55.66,56.67,55.67,
+59.31,55.47,55.26,55.94,56.49,56.88,61.07,56.68,58.36,57.64,
+58.21,57.58,58.29,57.67,60.49,57.96,60.97,57.69,58.56,57.72,
+58.07,59.49,58.95,60.54,58.76,59.43,61.76,59.34,61.34,57.38,
+62.31,60.87,61.86,61.54,62.28,61.57,62.05,61.02,60.54,60.27,
+60.95,60.34,60.98,60.84,62.59,63.75,60.48,63.25,61.89,61.38,
+63.62,63.24,64.04,60.06,62.57,63.59,61.61,64.19,64.17,62.60,
+64.90,62.65,62.39,63.67,64.16,62.92,66.17,63.48,65.72,65.46,
+11.12,12.61,11.76,12.68,13.40,13.47,13.99,13.86,15.30,15.61,
+15.82,15.96,16.15,16.96,17.15,17.90,18.32,18.21,19.18,18.86,
+19.94,19.68,20.13,20.10,20.89,21.44,21.57,20.60,21.49,21.95,
+22.72,22.23,22.48,23.35,23.63,23.85,23.56,24.21,23.66,23.69,
+25.19,24.80,25.23,25.72,26.30,25.20,26.31,26.83,26.90,26.76,
+28.30,26.81,27.93,27.74,28.50,27.35,28.54,28.61,28.48,28.48,
+30.56,29.91,29.77,29.71,30.15,29.73,30.37,29.48,32.14,29.89,
+31.30,32.27,32.32,31.87,32.25,32.30,33.03,32.03,31.62,33.74,
+34.23,32.44,35.13,32.86,33.72,33.00,34.25,33.24,35.46,34.69,
+34.22,34.75,36.05,34.83,36.26,35.56,36.03,36.24,36.67,35.75,
+37.03,36.56,36.59,37.72,37.83,39.16,39.89,39.31,37.79,39.63,
+37.78,37.36,37.56,39.16,38.08,38.67,39.67,39.89,39.08,40.23,
+40.23,40.40,40.56,39.28,40.75,40.90,40.39,41.71,41.36,41.44,
+41.61,40.90,42.47,41.36,42.61,41.73,43.09,39.73,42.33,43.27,
+42.36,42.57,42.04,42.75,44.34,43.41,43.68,43.30,43.31,43.10,
+43.72,44.19,46.46,45.25,45.08,45.35,44.90,45.06,46.07,46.82,
+45.87,45.44,44.29,45.91,47.14,44.51,45.58,46.55,46.59,45.89,
+48.06,46.18,48.20,47.76,49.09,47.00,50.32,48.50,48.09,46.91,
+49.07,48.10,50.18,50.23,49.10,52.37,48.74,50.13,49.18,49.26,
+48.49,50.78,48.38,50.14,51.48,50.71,52.09,50.01,50.50,51.39,
+50.57,52.26,49.65,51.57,51.37,51.40,51.67,54.42,50.93,50.35,
+51.44,52.67,52.38,52.07,53.67,50.94,52.09,51.81,53.35,53.84,
+53.24,52.18,51.78,52.57,52.39,55.22,56.12,56.38,54.70,54.19,
+55.28,54.42,55.74,54.40,52.43,54.76,55.01,55.26,54.85,53.71,
+56.20,54.27,54.38,56.37,55.19,57.18,56.99,55.86,55.59,57.32,
+56.98,55.75,59.59,57.22,55.66,55.94,56.80,56.98,56.38,58.78,
+59.58,56.00,55.45,57.27,58.23,57.36,59.01,59.74,58.98,58.37,
+60.07,57.78,58.70,58.19,58.08,58.32,58.42,59.18,56.30,59.80,
+60.54,60.95,60.15,59.66,61.48,58.54,61.95,56.22,62.52,59.25,
+9.99,11.02,11.51,11.57,12.75,12.65,13.03,13.68,13.60,14.38,
+14.69,15.44,15.47,16.27,15.83,16.18,17.01,17.06,16.97,17.50,
+18.32,17.68,18.83,18.51,18.82,19.13,19.57,20.22,20.19,20.84,
+20.65,20.64,20.65,22.00,20.62,21.46,22.42,22.94,22.41,22.90,
+21.90,23.08,23.60,23.87,22.73,23.85,23.76,23.90,24.65,24.99,
+25.48,24.68,24.59,25.31,26.33,26.11,27.20,26.55,26.33,26.90,
+27.63,27.66,25.99,28.97,27.04,28.65,27.90,29.75,28.74,29.70,
+29.43,29.71,31.01,29.63,30.39,29.08,29.66,31.60,30.98,30.47,
+30.23,31.25,31.94,31.86,31.00,32.91,31.81,32.29,30.32,33.47,
+32.64,32.90,32.02,32.91,32.56,34.25,32.75,32.72,32.91,32.83,
+33.87,34.03,35.22,34.21,33.74,33.96,35.21,35.15,35.48,35.39,
+34.94,35.65,35.28,36.01,36.48,36.98,35.70,36.55,34.83,35.91,
+36.94,37.43,36.85,38.27,38.16,39.29,37.88,37.82,38.12,36.44,
+38.84,38.85,38.40,38.29,40.32,39.54,37.76,41.79,38.22,39.09,
+40.74,41.13,40.12,39.30,40.89,39.70,40.92,39.25,40.95,41.63,
+43.17,42.22,40.14,42.17,41.07,42.58,40.95,42.89,42.67,44.00,
+42.47,41.60,42.32,43.04,44.59,43.52,43.64,42.85,41.51,42.98,
+43.04,43.64,42.98,43.86,43.73,44.07,43.28,43.15,44.52,44.96,
+45.66,45.22,47.27,43.92,44.58,44.42,46.46,46.03,45.41,45.87,
+47.22,46.40,44.45,47.14,49.49,48.34,47.16,47.94,45.66,46.77,
+47.40,46.18,47.24,48.03,48.03,47.81,47.96,45.93,47.16,47.42,
+47.83,47.86,49.68,47.18,48.46,49.92,48.46,48.97,49.50,47.56,
+48.14,49.69,47.07,49.17,49.86,49.85,50.39,51.45,52.08,49.23,
+50.05,49.14,50.52,49.97,48.90,49.58,52.69,51.53,51.68,50.56,
+50.67,52.98,51.49,52.26,53.03,51.64,51.53,53.04,53.03,54.38,
+52.11,52.19,52.74,54.56,55.20,51.81,53.40,52.49,51.14,53.34,
+52.50,52.50,52.26,52.40,56.43,52.06,53.80,55.56,53.43,53.59,
+52.69,55.49,53.68,52.24,53.04,55.71,55.46,54.85,54.55,55.42,
+56.16,54.39,56.54,56.70,56.82,54.01,57.18,54.20,56.64,57.50,
+9.57,10.31,10.58,10.67,11.55,12.59,12.82,12.28,12.91,13.32,
+13.53,13.78,14.09,14.31,14.70,14.54,15.39,15.09,16.27,15.85,
+16.52,16.58,16.20,17.59,17.66,18.06,18.72,18.29,18.34,19.31,
+18.90,18.64,18.93,19.76,19.54,19.66,20.66,19.97,20.62,21.99,
+21.33,21.78,21.32,21.14,22.11,21.47,22.11,22.58,22.83,22.68,
+22.99,23.46,24.41,23.36,24.35,23.32,24.20,24.56,24.67,25.53,
+23.96,26.16,24.13,25.93,25.87,25.72,25.67,26.35,25.97,29.52,
+26.43,26.44,26.72,27.10,27.11,26.49,27.35,27.87,28.18,28.36,
+27.05,28.59,30.43,28.79,30.11,29.22,28.63,28.71,29.80,30.16,
+29.42,31.55,31.21,31.47,30.51,31.04,29.94,31.56,31.98,31.32,
+31.24,30.44,31.60,32.99,32.38,32.24,30.91,32.35,30.36,32.87,
+33.64,33.33,33.27,33.17,34.17,33.02,32.78,33.99,33.62,33.64,
+34.08,35.13,34.23,33.61,35.95,34.92,34.50,35.18,35.35,35.11,
+35.51,35.00,34.45,35.89,36.38,35.93,35.45,36.71,36.08,36.99,
+37.34,34.31,37.03,37.48,36.05,35.97,36.75,38.09,38.43,36.88,
+37.15,38.50,38.11,37.83,37.83,36.70,37.73,37.76,39.63,37.10,
+39.51,39.73,38.79,39.24,37.84,40.47,40.08,40.42,40.69,38.98,
+39.39,40.26,40.89,39.46,39.35,39.94,40.83,40.59,40.34,41.24,
+39.49,41.44,41.17,40.73,40.52,40.13,41.34,44.24,43.45,41.52,
+42.43,43.20,41.78,41.89,40.50,41.64,44.54,43.48,43.92,45.89,
+42.32,43.87,42.81,42.37,42.92,42.52,42.02,43.58,44.20,43.86,
+42.57,45.62,45.65,44.47,46.93,44.10,44.42,45.78,44.20,44.67,
+45.99,45.07,45.62,45.55,45.27,46.27,46.22,48.14,46.26,47.33,
+46.96,47.60,47.68,46.89,45.68,47.84,46.52,48.14,45.85,46.63,
+49.64,47.32,46.00,50.07,46.95,47.00,47.23,49.11,50.06,48.52,
+47.86,48.64,48.22,49.12,49.10,49.02,48.57,49.10,48.38,49.59,
+49.31,49.83,46.82,48.73,48.02,48.60,48.46,50.99,50.93,49.22,
+50.01,49.23,48.45,51.21,50.86,51.05,49.28,51.36,48.00,51.80,
+49.28,50.06,50.50,50.94,51.61,50.63,51.89,51.10,53.10,50.93,
+8.90,9.03,8.81,10.01,10.06,10.88,10.93,11.17,11.55,11.18,
+12.07,12.92,12.76,13.76,13.49,14.27,14.09,14.09,14.49,14.52,
+14.97,15.57,15.59,15.60,16.26,16.27,16.70,16.56,17.34,17.17,
+17.22,17.81,18.34,18.03,17.96,18.62,19.20,18.36,18.89,19.60,
+19.41,19.88,20.42,19.72,20.54,20.94,20.49,20.14,19.96,21.28,
+21.48,21.92,21.29,21.51,21.31,22.66,21.81,22.59,22.34,22.60,
+22.79,22.22,23.86,22.77,24.05,23.91,24.22,23.94,24.05,24.95,
+24.38,23.79,23.68,25.52,24.45,25.30,25.36,25.82,25.54,25.79,
+25.92,26.35,26.21,26.89,27.49,25.93,25.42,27.10,26.17,27.25,
+27.26,28.20,27.40,27.42,28.28,27.30,28.50,28.90,28.41,28.57,
+28.80,28.34,29.44,29.59,28.88,30.20,28.51,31.07,30.35,30.77,
+30.21,30.37,30.69,29.64,29.93,30.10,29.66,30.32,30.57,30.50,
+29.85,31.22,31.04,31.71,31.21,31.56,31.63,31.01,33.80,32.15,
+32.87,31.59,33.51,31.61,33.22,32.85,33.18,31.83,32.23,33.92,
+31.67,33.69,32.65,33.37,32.99,34.06,33.79,33.11,35.48,35.52,
+34.24,35.12,34.33,33.49,35.14,36.16,35.65,33.96,33.67,34.25,
+34.36,34.83,36.56,36.11,34.99,35.87,36.15,35.99,36.94,36.44,
+36.71,35.98,36.10,39.29,36.91,36.76,36.88,37.76,36.48,37.60,
+38.61,37.17,37.45,38.40,36.45,38.04,37.66,38.63,38.57,39.44,
+38.27,38.15,39.95,38.76,38.63,38.65,37.13,38.22,39.69,39.10,
+39.40,41.02,38.76,40.80,38.17,41.46,41.50,40.82,40.27,40.87,
+40.92,41.28,41.56,42.18,40.13,42.46,39.72,41.14,42.33,41.38,
+42.97,42.14,41.69,42.09,42.00,41.82,40.74,41.97,42.44,42.78,
+43.98,43.25,42.55,42.85,41.24,42.09,41.75,41.66,44.21,42.04,
+41.49,43.02,41.80,42.76,44.79,45.30,43.65,43.39,43.54,45.14,
+42.98,46.55,43.67,43.94,44.12,45.41,42.52,45.34,44.45,45.43,
+45.68,44.92,42.83,45.57,45.81,43.61,45.30,44.65,44.26,45.56,
+44.63,45.73,46.23,46.72,45.74,46.71,46.51,44.98,45.94,47.51,
+46.74,44.86,47.70,47.09,46.40,46.12,47.38,47.04,49.14,47.38,
+7.75,8.35,8.83,9.02,9.02,9.87,10.28,9.92,11.13,10.59,
+11.28,11.94,12.08,12.77,12.05,12.76,13.28,13.09,13.43,13.41,
+14.23,14.54,13.71,14.37,14.32,14.43,15.04,14.72,15.27,14.72,
+15.31,15.36,17.08,16.07,16.84,16.85,16.22,16.98,17.59,18.23,
+18.26,17.25,18.52,17.91,18.50,18.08,18.39,18.71,18.61,18.87,
+19.36,20.58,19.85,19.57,19.62,19.95,20.25,20.41,19.81,22.03,
+21.56,21.13,21.38,20.54,21.11,21.56,22.70,21.47,21.96,21.35,
+22.45,21.58,21.69,22.94,22.53,21.68,24.09,23.55,23.49,23.77,
+23.54,23.20,24.12,25.74,23.44,24.64,24.46,24.37,24.16,24.67,
+26.07,25.61,24.87,25.17,26.18,25.45,25.42,25.40,25.53,25.39,
+26.44,25.99,26.31,25.49,26.46,26.92,25.69,27.63,26.31,27.56,
+26.51,28.04,27.99,27.45,27.34,27.53,28.55,27.88,28.85,28.35,
+27.82,28.59,28.78,27.46,28.64,29.53,29.66,29.71,29.79,27.88,
+29.59,29.67,29.29,29.67,31.06,30.61,29.25,30.25,31.19,30.85,
+29.68,30.92,28.49,30.74,31.19,30.09,30.58,30.68,31.78,30.55,
+30.84,32.58,30.38,32.64,31.35,31.28,33.42,32.92,33.36,33.20,
+32.92,32.64,32.42,33.45,32.82,33.39,32.55,34.14,32.08,34.26,
+34.03,34.55,32.83,33.62,33.21,34.00,33.14,33.11,34.23,35.30,
+33.28,34.56,34.64,33.35,33.41,34.13,35.49,33.96,35.00,34.96,
+34.63,35.45,37.06,35.51,37.19,34.01,35.88,36.04,35.88,36.64,
+35.13,36.15,35.78,34.92,35.86,37.77,36.14,34.67,34.92,36.08,
+38.03,37.43,36.29,37.70,36.37,37.34,37.13,36.58,38.84,38.74,
+38.22,36.23,38.71,38.50,38.04,38.93,37.98,37.50,36.63,37.85,
+37.12,38.98,38.29,39.04,38.62,38.87,37.94,37.84,40.49,39.59,
+38.82,39.58,41.23,39.27,39.86,39.05,40.15,40.15,38.89,40.30,
+40.67,41.57,40.52,40.60,39.21,38.60,39.41,40.70,41.07,40.32,
+39.85,41.45,40.85,42.87,42.51,41.57,40.25,40.13,40.80,42.28,
+40.91,41.42,41.19,42.38,41.60,42.32,41.30,42.46,42.82,41.92,
+42.80,43.23,42.20,42.57,42.44,42.34,42.04,42.91,44.83,43.08,
+7.29,7.33,7.88,8.23,8.54,9.17,8.90,9.18,9.17,10.05,
+10.19,10.40,10.03,10.69,11.11,11.49,11.52,11.25,11.13,12.64,
+12.79,12.23,12.67,13.29,12.75,13.41,13.58,14.48,14.19,13.67,
+14.28,14.27,14.96,14.90,14.68,14.67,15.40,15.37,15.08,16.23,
+15.71,15.98,16.13,17.14,17.08,16.34,16.76,18.06,17.27,17.80,
+18.11,17.13,18.76,18.12,18.62,18.22,18.81,17.59,18.55,18.76,
+19.24,18.93,20.06,19.31,19.77,19.51,18.94,19.66,20.74,20.88,
+20.18,20.40,20.20,19.98,21.28,19.67,20.50,20.39,21.64,22.02,
+21.92,21.86,20.89,21.28,23.08,22.32,21.53,21.74,22.97,22.03,
+22.98,22.81,22.75,21.65,22.74,23.65,23.17,23.42,23.49,24.33,
+23.77,23.01,24.85,23.38,23.91,23.79,24.01,25.37,24.40,25.03,
+24.86,25.72,24.84,25.64,25.64,25.79,24.21,25.43,25.13,25.99,
+26.25,25.98,25.95,25.41,25.65,24.89,26.28,25.50,27.52,26.53,
+27.06,25.81,27.00,27.94,27.15,27.55,27.98,26.39,27.37,28.35,
+26.55,29.13,26.27,27.28,28.51,28.09,28.50,27.51,28.59,27.26,
+28.48,28.06,28.66,28.42,28.92,29.24,28.20,29.64,30.41,29.43,
+29.97,29.41,30.43,29.25,29.01,30.58,29.50,30.60,29.34,28.44,
+29.48,30.02,30.69,29.66,31.09,31.57,29.76,30.77,30.42,30.83,
+31.79,31.56,32.28,30.07,32.25,30.06,31.46,31.06,33.08,32.44,
+31.14,31.14,33.92,31.28,33.32,31.51,32.71,33.13,31.11,32.46,
+31.67,33.29,30.80,32.85,31.91,32.07,31.65,31.70,32.83,33.98,
+32.21,32.79,33.92,33.86,33.52,34.57,33.81,32.77,33.65,32.90,
+34.11,34.19,32.75,33.98,35.53,34.88,34.30,35.32,33.72,35.32,
+34.95,34.04,35.55,35.62,35.34,35.91,36.05,36.58,36.12,34.99,
+36.06,33.52,36.02,33.55,36.84,35.87,35.36,37.06,35.08,36.47,
+36.54,35.49,36.26,35.99,35.22,37.04,36.24,35.28,36.00,36.93,
+37.84,36.50,36.28,37.78,35.66,37.91,36.58,35.52,38.29,37.27,
+38.23,38.04,38.08,36.46,37.71,37.83,37.46,39.76,39.13,37.31,
+37.32,37.76,38.91,39.75,38.64,37.86,40.15,38.82,38.35,37.08,
+6.26,6.94,6.76,7.77,7.43,7.82,7.80,8.30,8.10,9.31,
+9.10,9.77,9.21,10.22,10.01,10.62,10.68,10.22,11.20,10.68,
+11.32,11.08,11.91,12.18,11.30,12.23,12.33,11.75,12.73,12.34,
+12.75,12.62,13.74,13.31,13.31,13.52,13.22,14.12,14.21,13.90,
+14.58,14.23,14.68,15.15,14.53,15.15,15.39,15.72,15.73,15.75,
+15.63,15.00,16.47,16.50,15.82,16.90,16.49,16.55,17.04,17.44,
+17.50,17.17,17.74,17.22,17.03,17.82,17.37,18.34,19.08,18.05,
+17.86,18.52,18.19,18.24,18.97,19.20,18.98,18.76,19.18,19.37,
+18.53,19.44,19.24,20.00,19.69,19.56,19.32,20.38,19.43,20.91,
+20.15,20.40,20.36,19.74,19.94,20.80,21.46,21.24,21.90,20.46,
+21.72,21.38,21.53,20.68,21.35,21.81,22.08,23.08,22.09,22.43,
+22.02,21.21,22.86,24.11,22.46,22.15,22.69,23.20,21.63,22.47,
+23.09,23.98,23.20,22.77,24.07,23.49,24.32,23.77,23.71,23.51,
+24.05,23.42,24.02,23.86,25.00,25.02,25.60,24.37,25.21,23.85,
+25.73,24.85,24.73,25.18,24.25,24.27,25.52,25.93,25.05,26.40,
+25.41,25.71,24.72,26.89,26.13,25.65,25.97,27.33,25.66,26.17,
+27.34,26.77,28.22,25.33,26.46,27.56,26.10,27.34,27.91,27.04,
+27.30,26.50,27.64,27.24,28.80,26.99,26.53,29.04,26.98,29.00,
+27.42,27.49,28.31,27.99,27.50,28.06,28.55,30.01,28.50,30.43,
+28.30,29.70,28.68,29.16,28.03,28.86,29.63,28.77,27.91,29.87,
+30.21,29.28,28.19,31.09,30.18,30.03,28.54,30.48,28.81,29.89,
+29.80,29.81,30.02,31.00,30.03,30.80,29.35,30.03,32.40,30.76,
+30.30,30.66,29.98,29.19,30.80,30.28,31.93,30.01,30.49,30.77,
+31.39,30.89,30.63,32.09,32.88,31.14,31.91,31.83,32.12,32.30,
+32.09,32.41,31.48,31.98,32.95,32.18,32.37,32.23,32.38,33.82,
+33.00,32.23,33.09,32.81,32.64,32.04,32.15,31.95,33.82,32.76,
+33.21,34.10,32.57,34.87,33.54,34.52,34.97,33.57,33.27,33.63,
+32.61,33.91,33.95,33.87,35.56,34.12,33.64,33.70,35.41,33.67,
+33.67,34.63,36.80,34.97,34.15,34.03,34.67,35.15,34.23,35.42,
+5.47,6.26,6.39,6.72,6.32,6.97,7.00,7.06,7.95,7.82,
+8.18,8.05,8.35,8.70,9.58,9.63,9.49,9.15,10.35,8.93,
+9.21,9.71,10.30,10.13,10.15,11.30,9.90,11.27,11.73,11.73,
+11.65,11.92,11.83,12.48,12.07,11.84,12.62,12.96,12.55,12.87,
+12.96,12.54,13.15,13.39,13.74,13.34,13.69,12.82,13.88,14.53,
+14.30,13.75,14.47,14.25,14.26,14.67,14.98,14.76,14.32,16.06,
+14.99,15.09,15.79,15.21,15.56,15.01,15.73,15.60,16.21,16.55,
+15.87,16.14,16.40,17.17,17.02,17.26,17.08,16.67,16.25,17.16,
+18.02,17.17,18.00,17.90,16.81,17.96,18.73,16.97,18.46,17.80,
+17.64,17.68,19.33,18.48,17.85,18.30,18.56,19.13,18.10,19.42,
+19.21,18.85,19.57,20.47,19.11,19.45,20.42,20.56,19.95,20.01,
+19.36,19.15,20.09,20.47,20.91,18.78,20.66,20.41,21.30,21.38,
+19.99,21.26,21.22,20.76,21.27,20.34,20.60,20.33,20.26,21.54,
+21.07,20.38,22.37,22.39,21.73,21.50,21.92,21.67,22.19,22.37,
+21.69,22.06,22.71,22.63,22.39,22.56,23.62,23.32,22.38,23.23,
+24.10,23.04,22.88,23.56,23.38,22.95,23.65,23.75,23.63,23.19,
+24.06,24.16,24.61,23.76,23.79,23.36,24.28,25.24,23.29,23.90,
+25.31,23.59,23.74,24.42,26.18,24.61,25.32,25.16,24.75,24.98,
+24.55,24.14,25.85,26.14,25.53,25.30,24.65,25.85,25.54,26.05,
+24.87,26.32,25.58,25.35,26.83,25.54,25.80,27.36,26.52,27.10,
+26.40,25.78,27.80,26.65,26.89,26.99,26.54,27.27,27.16,27.52,
+25.35,27.16,27.62,26.70,28.51,28.07,27.55,27.25,27.47,27.42,
+26.43,27.16,28.12,27.59,28.17,27.27,29.28,28.07,27.48,28.67,
+28.70,28.41,28.40,28.39,29.32,29.03,28.65,28.39,28.48,28.65,
+29.86,29.58,29.44,29.29,29.53,30.49,28.73,27.63,28.53,29.68,
+28.95,29.67,29.05,29.09,28.55,29.03,29.75,29.43,29.99,29.68,
+29.93,31.54,29.48,28.93,30.12,29.33,29.74,28.76,30.25,30.46,
+31.00,30.53,30.76,30.95,31.20,29.94,31.25,30.08,30.44,31.66,
+31.19,30.86,29.98,30.58,31.04,30.23,31.98,31.25,30.43,32.80,
+5.10,5.84,5.42,5.62,6.10,6.39,7.12,7.13,6.14,6.82,
+6.86,7.59,7.00,8.05,8.35,8.46,8.66,8.62,9.11,8.97,
+9.03,9.47,10.13,8.94,9.50,9.51,9.85,9.49,11.06,9.87,
+10.68,10.07,10.91,11.10,10.43,10.70,11.02,11.22,11.50,10.68,
+11.14,12.12,11.22,11.82,11.10,11.88,12.14,12.27,12.95,12.49,
+12.37,13.40,13.51,12.68,12.21,14.01,13.59,13.23,12.92,13.65,
+14.26,13.69,13.12,13.63,13.41,13.67,14.78,14.50,14.89,13.72,
+15.09,14.25,14.33,14.56,14.81,14.50,14.81,15.41,15.57,15.58,
+15.32,16.48,14.75,16.05,16.34,15.45,16.98,15.68,16.11,15.78,
+16.36,17.45,16.29,15.77,16.05,17.05,16.74,17.35,18.04,16.82,
+17.57,17.23,17.81,17.74,17.00,16.81,17.67,17.30,17.72,17.42,
+17.94,18.36,18.44,18.63,18.16,17.83,18.45,17.73,18.94,18.34,
+20.09,18.78,18.96,18.84,19.52,19.18,18.82,19.76,19.91,19.73,
+19.61,19.69,19.98,19.19,19.06,19.79,21.46,19.25,20.80,19.16,
+20.57,20.05,20.08,19.93,19.84,19.81,20.84,19.36,20.84,21.42,
+20.31,20.52,20.50,19.96,20.98,21.38,20.87,20.45,20.48,22.59,
+22.39,20.72,21.44,22.35,21.32,21.99,22.03,20.91,21.05,21.56,
+22.45,22.23,21.85,21.49,21.54,23.09,21.73,21.89,22.44,21.72,
+23.65,22.55,21.18,23.66,22.79,22.55,22.07,23.60,23.32,23.40,
+23.15,23.54,22.89,23.07,23.48,22.66,23.85,23.91,22.17,23.80,
+23.74,23.59,24.23,24.23,24.22,23.65,24.44,23.87,23.64,24.48,
+23.60,24.52,24.30,23.54,24.47,25.62,25.15,24.26,24.32,23.91,
+24.14,24.93,24.19,24.82,25.62,24.12,27.44,24.80,25.15,25.19,
+26.00,23.68,25.87,25.05,25.58,26.21,25.21,26.04,25.37,25.36,
+25.62,26.79,25.53,25.98,26.13,25.89,25.71,26.75,26.20,27.58,
+25.81,25.41,26.65,25.68,26.99,27.12,25.83,27.81,26.88,26.27,
+25.71,26.13,26.32,26.25,26.27,26.17,26.08,27.02,26.33,28.45,
+26.71,26.21,26.77,26.42,28.72,28.54,27.56,28.46,27.19,27.34,
+27.21,27.55,29.06,27.71,28.11,27.88,28.82,27.53,28.33,27.61,
+4.67,4.42,5.92,4.88,5.78,5.64,6.00,5.27,5.17,6.73,
+6.45,7.12,6.73,7.22,6.67,7.99,6.88,8.15,7.75,8.47,
+8.35,8.23,8.38,7.88,8.26,9.24,9.14,8.58,8.93,8.85,
+9.15,9.81,9.12,9.72,8.90,10.02,9.66,9.54,9.52,9.54,
+9.76,10.40,10.37,10.37,10.78,10.91,10.72,11.26,11.79,10.99,
+10.50,11.69,11.27,10.73,11.68,11.96,11.89,11.15,12.18,12.73,
+12.02,12.34,12.66,12.15,12.48,13.00,12.30,12.45,12.71,12.90,
+12.86,12.92,13.65,14.37,13.09,13.23,13.44,14.30,13.82,14.17,
+12.72,13.98,13.56,14.52,13.57,14.38,14.75,13.81,14.01,15.00,
+14.26,14.64,14.77,14.94,16.37,14.94,15.12,15.31,15.52,16.37,
+14.45,15.23,15.34,15.45,15.12,15.58,15.46,15.39,16.30,16.34,
+15.09,16.35,15.26,16.12,15.69,15.93,16.81,15.77,16.41,15.53,
+15.45,16.66,16.95,16.44,17.28,16.67,17.67,18.04,17.50,16.35,
+16.58,17.81,17.04,16.26,16.98,16.94,17.96,17.93,18.45,17.82,
+16.87,18.37,18.33,17.79,17.46,19.06,17.61,18.05,19.11,18.86,
+18.50,18.78,17.58,17.15,19.20,18.65,18.11,18.77,19.35,19.01,
+19.01,18.85,19.19,19.34,19.44,18.03,18.76,19.39,18.81,19.94,
+19.93,19.82,20.13,19.88,19.86,19.09,20.19,20.60,19.39,20.10,
+20.84,19.78,20.14,19.85,20.32,20.50,19.88,20.37,22.23,20.65,
+19.65,20.68,20.29,20.31,20.40,21.16,21.20,20.86,20.98,20.56,
+19.95,20.67,22.02,21.41,21.13,21.80,22.47,21.64,21.50,21.93,
+21.44,23.19,20.71,22.67,22.94,21.11,21.28,21.99,21.47,22.13,
+22.20,21.74,22.46,21.90,22.36,21.93,21.72,21.04,22.89,22.07,
+22.83,22.76,21.17,22.44,23.45,22.93,22.41,21.62,22.72,22.70,
+21.65,22.39,23.10,23.23,23.83,22.30,23.61,23.18,24.15,22.62,
+23.01,23.90,24.54,24.51,22.73,24.34,24.21,22.78,23.21,23.23,
+24.03,24.23,23.70,24.09,24.52,24.28,24.44,23.36,24.21,23.34,
+24.03,24.30,24.69,25.78,25.16,24.45,24.87,24.88,25.82,23.87,
+24.30,25.73,25.84,24.68,24.65,25.34,24.50,25.16,25.11,25.62,
+4.71,3.90,4.59,4.00,4.68,4.52,5.24,4.98,5.49,5.43,
+6.03,5.72,6.41,6.64,5.92,6.74,6.25,6.81,6.40,6.96,
+6.44,6.67,7.52,7.41,7.10,6.94,7.70,8.02,8.60,8.80,
+8.10,8.40,7.98,8.56,8.04,8.25,8.71,9.77,9.15,9.51,
+9.08,9.32,8.15,9.17,8.58,8.74,9.40,10.08,9.98,9.57,
+9.93,9.92,10.28,10.31,10.71,10.10,10.95,10.59,10.46,11.50,
+10.12,11.17,11.38,11.02,11.05,11.25,11.62,11.65,11.56,11.31,
+12.15,11.48,11.79,11.77,11.18,12.26,11.99,12.02,12.82,12.68,
+13.73,11.98,12.38,12.66,12.20,13.02,12.13,12.09,12.91,13.14,
+12.80,13.26,13.14,13.22,12.65,13.64,13.68,12.77,14.74,13.58,
+13.56,13.79,13.81,13.64,14.13,14.75,13.82,13.39,13.59,13.89,
+13.91,13.85,13.72,14.33,14.57,14.47,14.18,14.55,14.24,15.42,
+15.16,14.99,15.00,14.38,14.48,15.14,15.48,15.38,15.29,15.29,
+15.03,16.65,14.71,16.20,15.19,15.23,15.22,16.37,15.45,14.76,
+16.23,16.76,16.49,16.43,15.93,15.74,15.67,16.81,16.35,17.04,
+16.60,16.81,15.80,17.60,16.72,16.23,17.44,16.52,17.35,17.00,
+17.67,17.51,17.88,16.43,17.18,16.38,16.61,17.78,17.56,18.40,
+16.97,17.72,18.02,17.05,16.89,17.22,17.45,17.33,17.18,18.44,
+17.16,18.09,18.67,18.60,17.63,17.72,18.08,18.47,19.17,19.01,
+18.15,18.71,18.61,18.40,19.31,18.23,18.60,17.63,18.95,19.36,
+19.20,18.79,19.55,19.04,19.20,18.30,18.73,18.62,20.37,18.62,
+19.54,20.20,19.13,18.75,19.64,18.55,20.81,20.06,19.50,19.48,
+19.33,18.89,19.80,19.56,18.59,19.99,19.83,19.49,20.65,19.58,
+19.53,21.38,21.06,20.15,20.73,19.40,20.89,20.35,20.74,19.90,
+21.27,20.58,20.61,21.57,20.31,20.87,21.00,20.05,20.17,21.11,
+20.87,20.45,21.48,21.79,20.64,21.43,20.12,20.89,21.05,21.15,
+21.06,21.99,21.78,22.59,21.38,21.14,21.42,21.45,21.80,22.89,
+21.82,22.56,21.30,20.54,21.62,21.62,22.59,22.05,22.15,22.14,
+21.75,22.31,21.24,22.45,23.92,22.45,22.48,21.82,22.49,21.90,
+2.78,3.96,3.96,4.56,4.32,4.14,4.16,5.04,5.36,4.18,
+5.41,5.16,5.60,5.83,6.33,4.66,6.08,5.89,6.34,5.72,
+6.30,6.68,7.00,7.18,6.81,6.78,7.12,7.50,6.18,7.67,
+7.64,7.10,7.46,6.90,7.55,7.40,8.00,7.89,8.31,7.47,
+8.22,8.40,7.99,8.08,8.83,7.65,8.49,8.64,8.70,8.47,
+8.75,8.77,9.25,9.22,9.20,8.52,9.12,9.43,10.29,9.40,
+9.24,9.81,10.76,9.80,9.82,10.04,10.85,10.35,10.22,10.51,
+9.65,9.85,10.22,10.55,11.08,10.14,10.68,10.26,10.39,10.73,
+11.36,10.73,10.93,11.28,10.84,11.31,11.20,10.57,11.16,11.82,
+10.97,11.67,10.98,12.09,11.74,11.49,12.73,12.66,11.99,12.48,
+12.33,12.90,12.32,13.01,13.05,12.26,12.10,12.38,11.96,12.68,
+12.43,11.86,11.72,12.46,12.59,14.02,13.19,12.15,12.99,12.85,
+12.30,12.33,12.55,13.60,13.14,13.43,13.97,14.49,13.18,13.91,
+13.63,13.49,13.94,13.64,14.07,13.66,14.27,14.05,14.22,14.78,
+14.96,13.99,14.64,14.04,13.25,14.08,14.76,14.65,15.18,14.53,
+14.66,14.86,14.17,14.53,15.95,15.22,15.09,15.69,14.89,15.25,
+15.49,15.66,15.24,14.89,14.98,15.06,14.73,14.62,14.89,15.73,
+14.84,14.89,16.00,15.57,15.42,15.46,16.23,14.81,15.83,16.86,
+15.03,15.51,15.15,17.17,16.63,15.77,15.35,16.88,17.19,16.77,
+15.87,17.25,16.01,16.81,17.52,16.78,15.45,16.37,16.09,17.20,
+16.38,16.68,16.52,17.69,17.23,16.02,17.16,17.43,17.71,16.81,
+17.35,18.00,17.05,16.93,17.00,18.42,17.04,18.22,17.13,18.04,
+17.84,16.84,18.10,18.45,17.81,17.06,18.65,17.15,18.29,17.99,
+17.61,16.91,17.60,16.83,17.73,18.09,18.11,16.81,17.02,18.57,
+18.24,18.22,18.23,18.57,19.17,18.17,17.69,18.25,18.75,18.65,
+18.07,18.54,19.15,18.30,19.61,17.79,18.63,18.53,19.42,18.92,
+19.00,18.04,18.99,19.12,18.00,18.79,19.22,19.26,19.10,18.94,
+19.08,19.32,19.55,20.87,19.92,19.74,18.42,20.32,18.91,19.57,
+19.02,20.00,19.38,20.63,19.27,19.84,20.49,19.24,19.69,20.41,
+2.92,3.47,2.77,3.53,4.07,4.34,4.47,4.36,4.35,5.17,
+5.11,5.27,4.85,4.04,4.78,5.49,4.99,5.54,5.67,5.56,
+5.39,5.72,4.96,5.68,5.59,6.01,7.11,6.09,6.33,6.27,
+6.75,6.88,6.85,6.50,6.73,6.61,6.65,6.66,6.86,7.68,
+6.67,6.77,7.71,6.74,7.25,8.10,7.83,7.86,7.50,7.77,
+7.75,8.33,7.91,8.44,7.96,7.60,7.52,8.91,8.02,8.16,
+8.50,8.48,8.88,7.93,9.43,8.66,8.42,8.98,8.18,10.20,
+10.02,8.14,8.64,9.80,9.38,9.56,7.92,8.69,9.59,9.17,
+10.01,10.20,9.62,9.67,10.34,10.42,10.24,9.84,9.99,10.32,
+9.80,11.34,10.30,9.67,10.36,9.80,9.56,9.67,10.63,10.78,
+10.09,10.24,11.67,10.69,10.64,11.14,10.67,11.13,10.89,10.03,
+11.69,10.55,12.09,11.95,11.68,11.17,11.54,11.78,12.47,11.49,
+11.65,12.31,11.31,12.64,11.41,11.86,11.45,12.23,11.31,12.32,
+12.39,12.00,12.42,12.89,12.24,11.97,13.60,12.07,12.64,12.94,
+11.81,12.07,11.87,12.50,12.72,12.94,12.61,13.48,12.78,12.92,
+13.46,13.75,13.58,13.73,12.93,13.31,13.42,13.90,14.43,12.52,
+12.89,13.37,13.83,13.37,13.79,13.17,13.21,13.15,13.98,13.33,
+13.26,12.96,14.16,14.30,13.34,14.82,14.24,14.04,14.30,13.94,
+13.51,13.84,13.66,13.97,14.25,14.51,14.44,14.94,14.61,14.65,
+13.41,14.12,14.95,15.43,15.89,15.28,14.82,14.28,15.14,14.76,
+14.75,14.61,15.76,16.05,14.09,15.25,14.66,15.42,15.57,14.72,
+15.44,15.84,16.58,15.40,14.60,15.70,16.34,15.11,15.85,14.62,
+15.21,15.37,16.12,16.72,15.75,15.67,15.16,15.12,16.04,15.71,
+15.89,16.52,14.85,16.43,16.22,16.01,16.63,16.34,16.18,17.14,
+14.79,16.24,16.22,16.46,16.32,15.58,17.38,16.00,15.27,16.41,
+16.78,16.04,17.14,16.33,15.98,16.46,16.27,16.67,17.89,17.06,
+17.84,17.28,16.70,16.81,16.92,17.06,16.12,17.27,16.98,16.45,
+18.14,17.51,16.04,16.85,17.73,16.53,17.80,18.14,17.05,17.05,
+17.70,17.74,17.12,17.75,17.18,17.79,17.79,17.77,17.69,18.39,
+13.77,14.11,14.38,15.05,16.32,16.79,16.23,17.30,17.41,18.21,
+19.11,18.80,19.88,20.53,21.24,20.79,21.39,22.65,22.23,23.06,
+22.76,23.03,23.07,24.09,25.23,23.87,25.22,26.03,25.99,26.19,
+26.18,26.76,26.79,27.29,27.11,28.09,27.10,29.31,28.75,28.32,
+30.50,29.55,28.97,29.88,30.40,31.95,31.20,31.66,32.56,33.15,
+32.33,33.28,32.59,33.77,33.20,34.08,33.61,33.10,34.69,35.09,
+34.51,33.65,36.05,36.32,35.78,35.57,36.76,36.17,36.71,36.63,
+38.20,35.49,38.19,38.60,37.66,37.96,38.73,38.23,40.21,39.07,
+40.58,39.31,38.76,39.46,40.40,40.55,41.18,42.32,41.58,41.48,
+41.81,40.63,42.69,41.75,43.94,40.67,41.56,43.42,43.13,45.45,
+44.74,43.39,43.77,46.05,43.84,44.60,44.80,46.06,43.59,44.97,
+45.28,45.02,46.53,46.18,46.48,45.14,47.26,47.72,47.10,45.57,
+45.21,46.13,49.29,46.42,48.57,46.99,47.97,47.53,47.08,49.05,
+47.64,50.72,50.36,49.54,49.18,49.23,49.42,50.09,53.02,49.60,
+50.60,49.80,50.50,50.48,51.93,51.88,52.84,51.64,52.58,55.88,
+52.53,52.18,54.48,54.26,53.10,53.63,54.06,52.62,53.89,53.29,
+54.92,53.04,52.67,54.18,53.99,57.19,53.66,57.14,53.88,55.73,
+56.84,55.98,55.17,55.36,57.60,56.81,56.90,58.63,54.75,58.17,
+57.37,57.50,54.48,56.62,57.34,56.62,58.69,58.00,58.87,59.52,
+58.15,56.07,57.48,59.46,57.91,58.28,58.50,61.66,60.06,58.59,
+57.87,61.69,58.81,62.91,59.17,60.11,61.94,63.60,61.69,60.14,
+63.46,62.24,63.49,60.93,62.33,65.05,63.66,62.68,60.68,61.39,
+63.69,62.58,60.82,61.47,61.24,64.35,63.65,62.76,63.80,63.87,
+63.90,64.18,62.47,65.26,63.17,67.08,64.53,64.52,66.92,64.00,
+66.19,64.91,65.58,66.11,65.38,65.84,66.16,66.74,67.44,67.22,
+68.84,67.41,67.43,64.33,66.42,67.69,69.24,67.48,68.18,68.81,
+66.82,68.56,68.62,69.72,69.59,68.63,70.29,67.46,69.03,70.86,
+67.93,73.78,69.56,70.53,68.56,69.98,74.48,70.02,71.02,70.17,
+70.18,70.58,69.76,73.51,73.63,68.26,72.07,72.70,69.34,73.82,
+13.06,12.72,13.37,14.29,15.00,15.62,16.52,17.78,16.34,17.36,
+18.00,17.82,18.79,19.48,20.00,19.96,21.00,21.47,21.79,20.82,
+22.63,22.34,22.41,22.42,23.42,23.77,23.66,25.31,24.54,25.48,
+26.05,25.22,25.11,27.04,25.67,27.36,26.64,27.91,27.03,27.94,
+28.76,28.81,28.18,29.17,29.11,30.72,30.70,30.88,30.59,31.33,
+30.19,31.35,31.73,31.83,31.29,31.91,32.70,32.98,31.65,33.49,
+33.30,33.93,34.93,33.07,34.74,34.05,34.44,34.93,36.44,36.89,
+35.60,34.62,35.67,35.83,37.07,37.83,37.12,38.08,36.45,37.28,
+37.70,38.91,39.13,40.17,38.02,38.32,39.16,38.05,40.55,38.37,
+40.32,41.33,40.34,41.51,41.06,41.13,41.17,40.53,41.86,40.21,
+41.23,42.31,39.52,43.16,42.05,42.35,43.23,41.84,43.11,45.11,
+45.38,44.42,42.45,44.08,45.23,43.30,44.72,43.05,44.90,46.27,
+45.64,45.56,44.88,47.08,44.59,46.37,46.12,47.61,47.78,47.26,
+47.05,48.56,47.84,46.87,47.46,48.38,47.54,47.64,48.21,48.89,
+48.21,48.77,50.87,49.57,48.33,49.04,51.04,46.33,48.41,49.40,
+50.09,49.21,50.73,48.23,51.07,51.89,51.17,51.64,54.48,51.89,
+52.90,51.94,49.37,49.90,51.52,54.65,50.79,52.91,53.02,51.92,
+52.06,54.54,53.66,53.56,51.75,54.49,52.44,55.30,54.37,54.59,
+55.19,53.85,54.72,54.21,53.00,54.12,58.51,55.17,55.46,56.04,
+57.66,55.37,57.35,55.93,58.87,55.32,57.53,56.19,57.47,55.59,
+57.48,56.68,60.37,57.39,58.62,57.82,59.59,57.36,58.70,59.05,
+58.85,58.77,59.40,60.65,58.83,60.73,60.34,61.23,59.20,59.73,
+62.37,61.36,57.97,59.66,59.97,60.00,63.45,60.30,61.38,59.49,
+62.01,61.25,62.00,61.07,61.06,62.77,64.24,61.02,62.94,64.19,
+63.97,65.63,61.34,63.37,62.87,62.54,64.31,63.11,62.89,65.54,
+62.19,64.07,64.05,65.19,64.34,61.04,66.38,63.67,67.85,63.49,
+67.25,67.53,64.13,65.75,65.46,65.19,66.72,65.30,64.17,67.67,
+65.98,66.36,65.34,64.22,64.82,65.78,68.15,68.91,66.38,66.66,
+64.46,66.17,67.99,66.61,68.66,65.49,68.05,67.02,67.56,67.10,
+12.05,12.86,13.11,13.86,14.10,14.41,14.30,15.50,16.77,16.30,
+17.49,16.91,18.12,16.97,18.57,18.98,18.89,19.20,19.63,20.15,
+20.68,20.80,21.38,21.87,21.54,21.97,22.70,22.96,22.54,23.55,
+23.71,23.66,25.98,24.81,24.68,24.40,25.36,25.56,26.02,25.57,
+26.64,27.24,26.65,27.71,27.08,26.28,27.56,28.52,28.82,28.62,
+29.27,29.72,28.92,29.61,29.88,30.25,30.60,30.36,30.67,31.74,
+32.04,31.53,31.27,32.78,32.68,33.00,33.58,33.39,33.47,32.74,
+32.67,33.70,33.65,35.13,33.92,34.44,35.67,33.56,35.44,36.52,
+35.38,35.09,37.42,35.68,36.94,36.74,36.31,36.88,38.92,37.20,
+38.26,35.99,37.19,37.76,36.43,38.41,38.98,37.74,38.42,39.06,
+39.35,39.60,39.89,39.20,39.79,38.54,40.64,42.63,40.81,41.78,
+42.24,41.05,41.20,40.55,41.75,39.80,39.28,41.57,39.97,42.28,
+40.67,42.03,42.87,42.95,43.09,43.76,44.04,44.94,43.68,45.33,
+43.32,44.29,44.80,43.79,44.47,46.28,44.33,45.42,45.19,45.45,
+46.55,46.36,45.76,47.70,47.01,45.45,45.68,47.91,46.34,47.29,
+47.58,47.92,46.29,47.11,50.91,49.93,50.60,48.20,47.93,48.55,
+50.03,48.26,48.87,50.34,51.46,49.49,49.61,50.45,48.84,49.70,
+48.98,50.57,47.85,50.60,52.57,50.75,50.43,50.84,51.44,55.53,
+52.05,51.70,52.89,51.35,51.81,52.22,54.23,51.72,50.84,53.65,
+54.64,53.80,53.90,53.19,53.59,54.93,54.58,53.31,53.38,54.17,
+53.65,54.61,53.71,54.13,54.73,54.49,52.96,53.93,54.04,55.74,
+55.50,56.81,53.52,55.10,54.79,57.14,57.35,57.45,57.93,56.30,
+56.31,58.37,58.77,57.51,55.39,56.76,58.16,55.38,59.23,56.92,
+57.82,57.19,57.10,58.92,59.05,58.86,59.86,59.49,58.68,59.40,
+57.16,59.87,59.46,58.98,61.35,62.00,59.91,59.19,60.55,58.81,
+60.26,59.64,60.94,60.55,60.35,60.65,59.91,61.99,59.97,61.19,
+61.48,60.34,61.63,64.90,60.89,61.18,63.03,61.20,65.55,65.22,
+62.44,63.51,63.76,63.33,60.94,60.45,62.25,63.99,65.15,62.29,
+63.43,64.47,63.79,64.32,64.03,62.87,64.31,63.43,65.27,66.69,
+11.28,11.84,12.25,13.36,13.89,14.29,14.30,14.74,14.92,15.79,
+15.64,15.69,16.89,16.08,16.79,17.49,17.54,18.54,18.57,19.12,
+19.50,19.57,20.25,20.50,20.65,20.81,21.58,21.60,21.49,22.06,
+21.09,23.03,22.35,23.01,23.66,23.65,24.12,23.63,24.48,24.66,
+24.61,24.25,24.98,26.80,26.38,25.19,26.98,27.63,26.35,28.39,
+27.65,27.36,26.95,27.96,27.22,28.42,29.79,29.11,28.65,29.90,
+29.92,29.23,29.10,29.64,29.97,29.67,30.68,30.43,30.65,30.45,
+31.21,31.99,31.55,32.14,31.47,30.94,33.25,32.96,32.47,32.47,
+33.52,33.37,33.39,34.08,35.44,32.88,34.69,33.95,33.56,34.29,
+36.31,34.80,35.06,34.58,35.80,37.01,35.60,38.04,37.03,34.20,
+36.62,37.54,37.20,37.30,37.78,37.43,38.02,39.12,38.37,37.33,
+39.15,39.76,38.61,38.33,39.36,38.32,38.44,40.50,39.12,39.58,
+38.91,41.24,39.01,38.93,40.55,42.55,40.05,41.11,39.83,42.42,
+40.04,41.28,41.27,41.74,41.61,42.96,42.64,43.72,42.20,42.98,
+43.17,44.69,44.91,42.51,43.02,43.59,44.70,43.42,43.90,45.66,
+44.80,43.11,46.23,45.42,44.83,45.63,45.61,44.48,45.20,44.20,
+45.89,45.60,45.76,47.69,45.97,46.22,46.16,47.85,47.05,47.23,
+46.58,49.31,48.18,48.17,45.86,45.83,47.10,48.56,48.05,47.96,
+49.45,49.06,47.07,47.46,51.86,49.51,50.00,49.76,50.42,48.88,
+50.39,51.52,50.76,48.89,47.87,51.06,49.56,48.59,48.58,50.70,
+51.11,51.09,51.38,51.58,53.64,52.64,49.33,51.93,52.66,50.12,
+53.10,50.50,50.66,51.15,51.24,52.82,51.13,52.03,52.08,52.42,
+53.33,52.85,52.28,54.93,53.54,57.27,54.80,52.64,53.93,55.22,
+55.23,53.77,53.59,55.60,57.19,54.97,56.88,56.33,54.93,55.17,
+53.26,54.90,55.58,54.36,55.53,59.05,56.25,57.47,58.85,57.28,
+58.12,56.75,57.80,56.93,57.10,56.82,57.47,57.37,57.22,56.58,
+56.90,56.97,57.41,55.70,55.84,56.58,57.00,59.30,57.83,58.09,
+58.17,57.83,57.89,58.01,58.81,59.37,60.92,59.98,57.35,58.67,
+60.65,59.18,59.53,62.24,57.48,61.14,60.94,63.59,61.45,59.47,
+10.23,10.99,11.62,11.71,12.86,12.50,13.16,13.73,13.58,14.38,
+15.16,15.41,15.15,15.69,16.21,16.46,16.91,17.34,16.85,18.72,
+17.68,17.67,18.04,19.28,19.15,18.90,19.44,20.96,21.22,19.78,
+20.51,21.84,21.02,21.08,20.75,21.46,21.31,23.07,22.08,22.42,
+23.09,24.14,23.70,24.29,24.28,22.69,24.70,24.27,25.05,25.29,
+23.86,24.59,25.08,25.28,26.17,26.75,26.69,25.50,26.79,27.66,
+27.31,27.75,27.77,27.69,28.68,27.08,27.95,28.75,29.44,27.85,
+28.53,29.60,28.57,30.51,29.91,29.63,31.42,31.46,30.80,31.36,
+30.35,31.63,29.62,30.42,31.43,32.56,32.55,31.00,31.61,32.23,
+32.12,31.29,32.27,33.44,33.73,33.08,33.20,32.87,34.12,34.32,
+35.05,34.87,34.40,36.26,35.62,34.50,36.01,35.16,35.33,36.50,
+35.01,35.66,37.30,36.48,38.25,36.89,36.50,36.80,36.44,36.93,
+36.76,37.91,37.44,36.79,37.64,38.99,39.41,38.15,38.54,38.61,
+37.00,38.78,38.40,38.58,38.66,39.64,40.28,39.87,39.97,39.79,
+40.36,39.47,39.30,40.01,39.40,41.17,39.54,41.22,41.60,40.79,
+42.52,42.05,41.60,40.29,43.16,43.06,43.22,42.09,42.36,40.77,
+42.93,43.37,42.98,42.80,41.24,44.07,44.17,42.27,43.76,43.49,
+44.64,42.44,44.40,43.11,43.78,43.56,44.93,42.62,45.30,43.12,
+44.38,47.31,45.50,45.44,45.90,46.61,47.05,45.44,47.43,46.21,
+44.92,44.54,45.33,49.41,47.25,45.52,49.85,46.07,46.66,46.32,
+45.76,46.39,46.89,47.18,46.18,48.63,48.24,48.16,48.93,46.14,
+47.66,51.91,49.05,45.11,49.97,49.33,49.15,48.50,50.43,49.01,
+50.62,50.88,50.59,48.36,51.52,51.64,49.32,50.47,49.10,50.80,
+52.51,50.96,49.43,52.49,51.61,51.71,52.12,51.45,50.73,50.63,
+51.12,51.36,52.06,54.15,50.57,51.50,53.17,50.38,51.25,50.66,
+51.65,51.90,54.19,54.31,53.42,52.25,50.61,54.89,53.04,52.53,
+51.52,52.65,50.00,52.59,54.24,54.72,52.19,54.00,55.01,54.46,
+51.52,56.07,55.93,54.56,54.93,56.37,55.50,54.98,56.75,55.04,
+58.15,56.33,56.46,57.10,55.54,55.33,56.23,55.38,51.93,56.97,
+9.65,9.83,10.41,10.93,11.44,11.92,12.77,12.36,13.02,13.03,
+14.16,13.89,13.38,14.34,14.17,15.15,15.57,15.70,14.97,15.71,
+16.23,17.37,18.12,16.75,17.48,17.42,17.54,18.34,18.13,18.75,
+18.82,18.26,18.43,19.64,20.36,20.35,20.40,20.15,20.83,20.81,
+21.65,21.63,21.92,21.89,21.29,22.04,22.15,21.62,22.49,21.94,
+22.67,22.12,22.66,24.80,24.55,24.56,24.41,23.81,25.27,24.35,
+26.54,25.89,25.69,25.22,25.10,26.56,27.13,26.20,26.23,26.60,
+26.95,27.12,26.87,27.93,28.73,27.33,27.89,29.00,27.69,29.89,
+28.12,28.71,28.49,29.97,29.02,29.73,30.37,29.22,29.54,29.28,
+29.64,29.49,30.11,30.46,30.69,29.07,31.94,30.96,29.99,29.69,
+31.34,30.20,31.44,30.92,32.07,32.79,32.27,30.97,32.63,32.34,
+31.44,32.14,33.46,33.37,33.70,33.36,34.38,34.93,33.75,32.21,
+34.93,34.95,33.62,35.08,34.81,35.73,35.06,33.76,35.50,34.73,
+36.14,36.25,37.07,35.36,35.31,37.16,35.53,36.91,37.64,36.29,
+37.15,35.87,37.84,37.12,37.31,36.70,37.03,36.96,37.78,37.46,
+36.95,37.41,38.26,39.87,39.20,38.54,37.79,37.32,39.96,39.27,
+40.13,38.46,38.95,39.50,38.15,39.44,38.85,39.87,38.23,39.74,
+41.06,39.96,39.97,39.82,39.95,40.03,39.82,40.49,41.20,42.00,
+39.30,40.66,39.89,42.15,40.75,42.99,41.55,40.40,43.83,39.50,
+43.31,44.59,40.67,42.14,43.87,44.80,41.95,41.56,43.64,43.25,
+44.53,44.82,44.02,42.38,43.50,43.88,43.52,45.00,44.33,45.98,
+44.39,44.48,44.83,44.25,44.29,46.28,44.55,45.23,44.32,44.54,
+45.55,44.76,46.34,48.63,46.46,46.99,44.98,47.52,47.95,45.29,
+44.60,46.92,43.28,45.64,46.94,48.21,46.54,47.71,47.40,47.40,
+47.97,46.69,51.23,46.11,46.49,48.49,47.94,47.30,49.33,47.55,
+46.35,48.82,46.84,50.47,50.34,47.97,48.75,49.88,50.08,49.00,
+50.30,49.31,48.06,50.96,49.72,47.31,51.36,49.78,52.08,49.44,
+49.28,48.41,50.88,51.07,49.08,51.95,50.12,48.56,51.24,50.63,
+49.85,51.45,51.12,51.18,50.23,53.25,50.13,50.56,53.55,49.96,
+8.98,9.28,9.66,10.60,9.75,10.81,11.40,11.73,11.98,11.87,
+11.96,12.93,13.07,12.12,13.11,13.39,14.01,14.50,15.66,14.16,
+14.91,14.99,15.21,16.34,16.15,16.29,16.96,16.99,17.04,17.26,
+16.89,17.85,18.38,18.00,17.45,18.42,18.74,19.04,18.93,19.01,
+19.06,19.53,19.93,20.27,20.22,20.52,20.36,21.53,21.91,21.37,
+20.54,21.64,22.27,21.97,21.81,23.06,21.09,22.56,23.51,23.02,
+22.63,23.10,23.72,22.30,24.66,24.41,23.96,24.16,24.76,24.76,
+24.72,25.28,24.14,24.43,25.71,24.62,25.05,25.14,25.42,26.53,
+26.66,25.70,26.97,25.87,27.41,25.38,27.11,27.06,27.09,27.85,
+27.26,27.89,28.16,28.91,27.52,28.52,28.29,28.23,29.21,28.63,
+27.72,29.11,28.18,28.84,30.90,28.58,29.91,29.57,29.71,29.91,
+29.76,29.15,28.95,30.50,30.86,29.92,31.53,30.30,32.38,30.75,
+31.05,32.84,32.19,30.70,31.25,31.47,32.54,31.76,32.50,31.90,
+32.13,32.88,33.00,32.02,32.04,33.16,32.63,32.04,34.65,32.87,
+32.90,32.36,33.61,34.51,32.54,32.66,34.63,35.38,33.49,35.60,
+34.01,36.53,34.15,35.94,35.45,34.73,35.04,34.82,34.91,35.67,
+35.13,36.41,35.85,37.03,36.15,37.11,36.06,35.58,37.14,36.94,
+34.73,36.36,36.28,35.68,38.84,36.56,38.08,38.01,37.99,37.49,
+37.81,37.30,38.40,37.78,37.85,38.96,38.75,38.54,37.72,39.33,
+37.89,40.61,39.89,39.83,41.45,38.90,39.01,40.71,40.45,40.11,
+37.91,39.57,40.60,38.80,39.97,38.37,39.36,39.68,40.71,40.65,
+40.05,41.26,40.84,41.23,41.82,41.41,42.26,42.60,40.15,40.39,
+42.79,43.16,42.50,41.24,41.83,42.85,43.77,42.24,42.73,40.98,
+43.46,42.25,41.25,43.15,41.75,43.97,41.76,42.91,44.32,41.69,
+42.41,44.37,43.95,43.84,43.99,43.64,42.98,44.60,42.86,44.92,
+43.32,44.06,45.16,43.16,44.20,44.84,44.28,45.62,45.64,45.04,
+44.90,46.68,45.49,45.70,45.48,44.70,45.46,45.45,46.49,46.04,
+45.83,46.12,44.32,45.71,44.77,48.25,44.90,45.50,46.94,47.44,
+46.72,47.94,47.40,46.62,47.87,47.28,47.26,45.51,46.78,47.77,
+8.19,8.62,8.93,9.60,8.87,10.15,9.70,10.79,10.82,10.46,
+11.25,11.19,11.90,11.68,11.74,12.27,12.97,13.41,13.51,13.22,
+13.64,14.27,13.58,13.62,14.20,15.13,14.70,15.30,14.95,15.31,
+16.04,16.40,16.41,16.80,16.28,16.37,17.27,17.99,17.85,17.33,
+18.14,18.46,18.48,18.07,18.54,17.59,18.71,19.48,19.10,19.37,
+18.99,19.39,19.71,20.19,21.19,20.40,19.97,21.55,21.29,20.88,
+20.76,21.38,20.90,21.44,21.44,20.82,21.62,21.74,20.35,21.55,
+22.40,22.73,22.91,22.92,22.86,23.44,23.11,22.71,22.89,23.78,
+23.79,22.77,24.17,25.19,24.31,24.18,25.21,24.28,25.91,25.03,
+25.02,24.90,25.31,25.11,25.02,25.76,25.86,25.21,26.42,26.67,
+26.33,25.93,26.03,25.52,26.80,26.09,27.63,28.44,26.26,25.73,
+27.19,26.64,26.72,26.74,27.79,27.47,28.51,28.31,27.52,28.44,
+28.84,27.20,28.06,29.37,28.99,28.40,28.93,28.10,28.33,29.15,
+28.92,29.72,29.38,29.51,29.60,31.42,30.76,30.96,30.81,31.34,
+28.74,30.19,30.24,30.36,29.72,30.52,30.75,31.03,29.93,30.57,
+31.52,30.41,31.65,32.68,31.73,32.31,32.21,31.64,32.91,33.84,
+33.66,32.34,32.13,31.83,32.79,33.52,31.82,33.63,33.84,32.70,
+32.96,33.52,33.81,34.51,32.73,34.11,34.57,33.16,32.89,32.97,
+34.40,34.76,35.26,35.52,34.56,34.69,35.01,33.53,35.18,34.65,
+35.26,33.79,34.61,34.52,35.74,35.98,35.36,36.38,36.58,35.92,
+35.63,36.46,36.49,36.58,37.86,37.32,37.17,36.50,37.87,35.76,
+37.07,36.77,36.96,36.42,37.19,38.64,36.55,37.18,37.28,37.32,
+38.46,38.97,37.62,38.49,38.22,37.77,40.00,39.46,37.18,38.14,
+38.29,40.12,39.73,39.25,39.93,38.59,37.52,39.12,38.81,38.40,
+40.27,40.32,41.13,39.05,39.26,39.39,40.81,39.37,40.56,40.18,
+40.68,40.64,40.50,39.06,38.89,39.95,41.06,40.27,40.73,42.23,
+41.18,39.59,40.71,40.95,40.30,41.64,41.33,41.92,42.08,41.77,
+41.98,41.15,42.59,42.40,39.95,40.35,41.43,43.24,42.57,43.19,
+44.33,42.43,43.05,42.25,41.63,41.43,42.85,42.64,44.05,43.41,
+7.20,7.73,8.01,8.18,8.49,9.15,9.02,9.57,9.96,9.21,
+10.37,10.21,10.94,10.13,10.48,11.54,12.05,12.06,12.07,12.11,
+12.81,13.09,12.86,13.15,13.34,13.84,13.71,14.22,13.65,13.68,
+14.57,14.95,14.77,14.41,14.27,15.47,15.43,15.58,16.01,15.76,
+16.16,15.84,17.27,17.56,16.47,17.37,16.91,17.24,17.41,17.31,
+17.05,17.44,17.01,18.01,18.10,18.29,18.49,18.81,18.97,18.62,
+18.46,19.00,18.45,19.75,19.98,19.05,19.84,20.66,19.56,19.59,
+19.63,19.55,20.70,20.61,20.14,21.18,22.16,20.83,20.91,21.23,
+21.79,21.76,22.69,21.94,22.24,22.03,22.76,21.02,23.59,22.60,
+22.48,22.74,23.83,22.76,23.20,23.84,22.68,23.15,23.72,21.08,
+23.43,24.27,25.09,24.28,23.84,24.21,24.76,25.17,24.98,24.90,
+24.48,25.51,25.59,26.78,26.08,25.83,26.75,25.63,26.53,27.24,
+25.19,25.58,26.06,27.65,25.96,26.32,25.35,24.15,26.14,27.08,
+26.92,27.18,26.72,27.84,28.07,27.61,27.21,25.33,27.73,27.58,
+27.82,28.77,28.14,28.70,27.88,27.53,28.51,27.91,29.29,28.70,
+28.17,27.25,28.44,28.89,29.15,29.31,27.86,29.55,28.03,29.57,
+28.49,29.30,30.49,31.16,30.02,30.44,30.12,30.10,29.71,30.93,
+29.13,29.99,31.29,30.07,30.45,32.84,30.96,31.61,31.72,30.68,
+31.39,31.73,31.75,32.41,33.33,32.79,31.22,32.09,31.37,32.89,
+33.09,32.05,32.50,32.82,32.74,31.85,33.76,33.08,32.63,32.24,
+31.98,34.32,34.19,32.70,33.30,34.29,33.82,32.23,32.06,33.30,
+32.49,33.66,34.65,33.31,33.65,32.29,34.34,34.26,33.18,34.69,
+34.58,35.12,33.86,35.20,35.35,35.99,35.42,35.50,33.84,34.27,
+35.53,34.29,34.82,34.70,34.60,38.13,36.10,35.77,36.05,35.51,
+35.02,36.09,37.10,36.59,34.84,34.33,34.61,37.64,36.18,37.04,
+35.60,36.40,37.96,36.42,36.56,35.60,36.94,36.00,38.66,37.06,
+36.30,38.80,37.72,37.71,38.61,37.03,37.89,36.86,35.77,36.59,
+36.61,37.23,38.54,40.54,38.53,40.51,37.49,38.65,37.85,38.24,
+38.58,37.25,37.10,39.93,38.78,39.33,40.16,38.72,38.61,40.24,
+6.39,7.18,7.53,6.17,7.43,8.16,8.21,8.51,8.38,9.31,
+9.54,8.99,9.54,10.38,9.90,10.67,10.56,11.07,11.16,10.88,
+11.10,11.36,11.62,11.45,11.81,12.43,12.27,12.43,13.11,13.73,
+13.89,13.26,13.35,13.41,13.47,14.26,13.95,14.00,14.68,13.87,
+14.58,14.41,14.96,15.38,16.00,15.60,14.95,15.32,14.95,15.15,
+15.78,16.34,16.03,15.39,16.07,16.30,16.03,16.39,16.49,17.80,
+17.85,17.24,17.23,17.81,17.11,17.60,17.93,18.13,18.20,17.90,
+18.89,18.41,19.89,18.68,18.73,18.16,19.45,19.31,20.05,19.23,
+20.45,18.70,20.26,19.77,19.70,19.04,20.52,19.72,20.86,20.32,
+20.23,20.85,21.63,21.29,21.03,20.93,20.80,21.74,21.23,20.63,
+21.37,22.57,21.60,21.83,22.77,21.96,22.02,22.12,22.78,22.87,
+22.93,23.75,22.79,22.27,23.56,22.84,21.44,23.76,22.91,23.77,
+24.49,23.29,23.63,24.52,24.55,23.98,24.25,25.04,22.64,24.66,
+24.61,23.14,24.57,24.45,24.07,25.29,24.80,23.65,24.15,24.88,
+25.53,25.63,25.27,24.41,25.84,26.55,24.20,25.56,26.66,25.53,
+25.45,26.35,26.81,25.69,25.91,28.20,26.53,27.44,25.43,26.77,
+27.41,25.90,27.46,26.55,26.44,28.12,27.87,26.87,27.04,27.86,
+27.91,27.44,26.27,28.24,28.75,27.71,28.72,28.38,28.51,27.38,
+28.45,27.95,26.24,28.22,29.84,29.60,28.75,27.78,28.84,29.11,
+28.95,29.39,28.84,27.49,29.29,28.67,29.07,29.97,30.29,29.70,
+29.46,30.00,30.51,29.83,30.83,30.69,30.08,29.30,31.32,30.32,
+29.75,30.15,30.42,32.01,29.32,29.94,30.50,30.34,31.74,28.91,
+30.38,32.31,31.99,32.70,31.44,30.51,32.18,30.53,31.21,30.95,
+32.93,31.50,33.14,31.84,32.33,31.37,33.22,32.81,33.06,33.07,
+32.04,31.98,33.54,33.33,32.48,32.78,31.94,32.93,32.97,32.94,
+33.79,33.69,33.19,33.32,33.18,32.83,33.50,33.24,32.78,33.25,
+32.82,33.41,33.75,32.99,34.49,33.61,33.85,33.36,33.20,34.70,
+34.83,34.13,34.94,36.18,32.95,35.48,34.86,34.07,33.84,35.83,
+35.29,34.50,35.29,34.80,35.03,35.83,34.66,35.14,35.75,35.89,
+5.70,5.69,6.82,6.76,7.19,7.06,7.55,7.74,7.61,8.51,
+8.33,8.70,8.59,9.24,9.29,9.81,9.02,9.55,9.85,10.40,
+10.04,10.21,10.18,10.60,10.43,11.58,10.49,11.54,11.33,11.54,
+10.86,11.78,12.09,12.76,11.94,12.51,12.73,12.79,13.14,12.82,
+13.13,13.68,13.08,12.87,14.12,13.18,13.51,13.71,13.73,13.92,
+13.30,15.19,15.43,14.91,14.08,14.93,15.87,15.38,15.79,15.43,
+15.72,15.85,15.85,15.88,16.08,15.85,16.36,16.10,16.39,16.97,
+17.40,16.43,16.82,16.70,17.18,17.41,17.26,16.86,16.72,17.58,
+17.29,17.61,17.80,17.85,17.89,16.77,17.94,18.05,18.63,19.10,
+18.17,18.73,19.31,19.89,19.72,20.67,19.76,18.40,19.11,19.52,
+21.15,19.58,19.58,19.56,19.42,18.95,20.04,19.51,19.82,19.69,
+21.95,20.17,19.51,19.68,19.92,20.93,20.50,20.88,21.45,19.42,
+20.42,21.42,22.66,20.29,20.98,21.92,21.45,23.12,21.12,21.31,
+22.58,21.65,20.50,22.69,21.92,22.95,22.13,22.26,22.62,22.45,
+23.46,22.32,23.29,22.79,23.47,22.65,23.35,23.72,23.19,23.25,
+23.13,23.73,24.25,23.05,24.47,23.66,24.25,25.12,23.69,23.62,
+23.14,24.07,23.96,25.46,23.42,24.58,25.25,24.31,24.59,24.32,
+24.84,25.22,24.65,25.74,26.12,25.50,25.18,24.45,25.22,25.53,
+24.03,25.58,25.90,26.17,26.31,24.58,26.73,25.33,26.10,24.79,
+25.29,27.19,26.75,27.39,28.70,26.19,27.86,27.50,26.33,27.78,
+26.53,25.83,27.64,26.11,26.47,26.76,27.07,26.83,27.83,27.67,
+26.53,26.38,27.77,27.66,28.49,28.56,27.17,27.28,28.47,26.84,
+28.76,29.26,28.38,26.92,28.21,28.58,28.22,27.19,28.34,28.06,
+28.04,28.86,27.25,27.79,28.60,29.30,30.74,30.87,28.98,29.76,
+28.90,28.69,29.71,28.98,29.12,28.37,30.33,30.41,30.75,30.13,
+28.79,29.45,30.94,31.72,29.54,30.21,30.77,31.43,29.78,29.11,
+30.23,31.24,30.31,30.45,31.41,30.61,31.09,30.73,32.19,31.15,
+29.58,30.78,31.59,30.88,30.77,30.96,29.61,31.77,32.59,30.62,
+32.76,31.22,32.22,31.32,32.26,32.36,31.00,32.08,31.81,33.14,
+4.98,6.22,6.49,5.70,6.80,6.33,6.20,6.48,7.36,7.52,
+7.44,7.59,8.09,8.27,8.07,7.99,8.49,9.31,9.32,9.03,
+9.14,9.08,9.58,10.07,9.33,10.39,10.22,9.57,10.57,11.19,
+10.44,11.14,10.79,11.02,10.95,11.77,11.53,11.65,11.81,12.51,
+12.40,11.31,11.56,12.64,11.71,11.97,11.88,11.79,12.88,13.33,
+12.50,13.09,13.65,12.50,12.93,13.71,13.31,13.71,13.26,14.30,
+14.28,14.15,13.60,14.46,14.18,14.18,14.77,14.55,13.92,14.98,
+15.29,14.96,15.64,15.57,15.29,15.02,15.65,15.35,15.97,15.97,
+16.01,16.22,15.40,16.00,16.60,16.61,16.73,15.12,16.65,16.12,
+16.03,15.88,17.24,16.35,18.29,17.11,17.52,17.01,17.26,17.78,
+17.31,16.17,17.71,17.85,18.28,17.42,18.54,18.10,17.67,17.67,
+17.96,17.65,18.46,17.73,19.15,19.34,18.76,19.11,18.14,19.30,
+19.39,19.89,18.47,19.68,18.69,19.82,19.12,19.93,20.01,19.91,
+21.27,19.17,20.09,19.60,18.90,19.12,19.94,20.30,21.38,20.94,
+21.65,19.86,19.89,20.79,20.76,21.59,21.38,19.47,21.52,22.04,
+20.19,21.84,20.08,21.25,21.84,19.77,22.30,22.12,22.20,20.88,
+21.09,21.43,21.05,21.01,21.54,22.81,21.75,21.60,20.88,22.12,
+22.43,23.08,22.13,23.03,22.36,22.99,22.61,23.21,22.89,21.99,
+23.92,22.75,23.06,22.64,23.74,23.19,23.01,24.47,23.22,24.52,
+23.02,23.30,23.51,24.98,23.81,24.32,24.35,23.93,23.88,24.48,
+23.69,23.62,23.98,24.27,23.79,23.40,24.20,24.47,24.46,25.37,
+24.23,24.72,24.47,24.64,24.64,24.70,24.85,24.89,24.15,25.22,
+24.66,25.59,25.57,25.93,25.47,26.13,25.84,25.68,24.95,26.75,
+26.89,25.07,26.37,26.56,25.29,25.95,25.44,26.39,25.96,26.88,
+26.66,27.15,26.41,26.54,26.33,26.55,26.14,26.18,26.61,25.78,
+26.85,26.15,27.76,26.11,27.13,26.48,26.49,28.01,26.89,27.64,
+27.74,27.65,27.52,28.29,27.12,29.29,27.32,26.16,27.81,27.46,
+26.20,28.05,27.55,26.83,27.48,28.27,27.03,27.21,29.74,28.02,
+28.75,27.61,30.38,27.23,28.04,28.28,27.69,29.04,28.94,27.79,
+4.58,5.66,5.34,5.85,5.68,6.22,5.83,6.68,5.76,6.54,
+6.55,7.50,7.60,7.25,6.77,7.07,7.76,8.00,7.92,8.37,
+7.72,8.14,8.48,9.42,8.74,8.69,8.89,8.83,10.28,9.52,
+9.46,9.92,9.15,10.20,9.74,10.07,9.76,10.00,10.08,10.98,
+10.58,11.69,10.89,9.62,10.35,10.97,10.79,11.34,11.08,11.17,
+11.35,11.68,11.83,12.17,12.01,11.87,12.31,12.19,12.99,11.91,
+12.19,12.89,12.73,13.33,13.36,12.55,13.62,13.23,12.99,13.56,
+12.88,13.79,12.38,13.68,14.32,13.40,14.21,13.50,13.33,13.97,
+13.05,14.02,14.06,13.67,14.30,14.18,14.83,15.38,14.57,15.82,
+15.21,15.10,15.63,14.62,14.19,15.36,15.49,16.69,15.63,14.40,
+15.62,16.06,15.53,15.67,16.59,15.95,16.09,16.41,16.99,16.45,
+15.43,16.20,16.18,16.88,17.20,16.83,17.20,17.16,17.68,16.15,
+16.31,17.29,17.24,17.91,18.94,17.14,16.95,17.88,17.75,16.93,
+17.81,18.68,17.88,17.36,18.56,17.14,17.46,19.27,18.28,18.93,
+18.62,18.42,18.26,18.49,18.67,18.29,18.59,19.09,19.33,19.03,
+19.07,18.09,18.08,18.56,19.04,19.52,18.99,18.80,19.93,20.33,
+20.42,20.14,19.62,19.47,20.10,19.48,20.78,19.44,18.77,19.86,
+20.59,19.90,19.93,20.52,20.88,20.41,20.52,20.76,19.83,20.73,
+20.20,20.10,21.28,21.59,20.53,20.94,21.18,19.70,22.13,20.30,
+20.78,20.92,20.35,21.50,21.18,21.27,21.16,21.87,21.11,20.16,
+22.27,22.23,21.87,21.15,23.18,22.15,21.29,22.37,22.34,21.89,
+21.87,22.30,23.57,21.45,21.54,21.56,21.80,22.13,22.06,22.51,
+21.77,21.57,23.08,23.58,23.11,23.41,23.90,23.45,23.16,22.91,
+23.51,24.59,23.28,22.78,24.19,23.45,23.17,25.40,23.51,23.65,
+22.17,23.78,24.18,23.45,23.33,24.16,24.56,23.70,24.30,22.74,
+23.71,24.19,24.48,24.89,24.00,25.71,24.12,23.76,24.17,25.36,
+24.61,24.27,25.74,24.43,24.79,24.16,23.99,23.84,24.91,24.61,
+25.34,24.20,25.33,26.57,24.81,25.13,25.07,25.74,25.63,24.93,
+26.38,26.66,25.33,26.19,25.81,26.35,25.04,25.32,25.43,25.85,
+4.40,4.71,4.71,5.47,5.14,5.24,5.67,5.17,6.41,5.44,
+6.11,5.91,6.66,6.25,7.05,6.20,5.88,6.81,6.82,7.32,
+7.38,7.99,7.51,7.78,7.85,8.29,7.99,8.46,8.61,8.88,
+8.24,8.97,8.77,9.69,8.29,8.86,8.49,8.76,8.73,9.21,
+9.78,9.39,9.56,9.70,9.94,9.11,10.12,10.36,10.27,10.16,
+10.11,10.38,10.23,11.28,10.75,11.64,11.34,11.26,10.92,10.49,
+11.36,11.20,10.96,12.19,11.83,12.16,11.71,11.95,10.90,11.47,
+12.06,11.45,11.73,12.66,11.50,11.99,12.87,12.36,12.51,12.89,
+13.72,13.28,13.06,13.35,13.86,11.84,13.15,12.38,13.91,12.73,
+13.20,13.67,12.36,12.39,13.78,13.44,13.82,13.72,13.64,13.40,
+13.77,13.34,13.58,14.38,14.46,14.56,15.15,14.23,14.50,15.42,
+14.83,15.31,15.32,15.18,14.62,14.31,15.34,14.54,14.51,15.00,
+15.08,14.50,15.24,15.52,15.46,16.05,15.51,15.54,15.63,16.15,
+16.32,16.14,15.91,15.70,15.80,15.05,15.64,15.52,16.13,16.69,
+16.02,16.93,16.42,16.64,16.48,15.89,16.19,17.08,18.06,16.63,
+17.58,17.04,17.35,17.16,17.47,17.18,17.10,17.67,18.09,16.17,
+16.98,18.43,17.97,16.61,19.07,16.84,17.87,19.55,17.97,17.49,
+17.42,18.92,18.49,17.78,18.45,17.83,18.57,18.95,18.31,18.47,
+17.58,18.30,18.26,18.91,17.77,19.31,19.07,18.73,18.02,17.76,
+18.54,19.12,20.02,18.70,18.20,19.09,18.56,19.46,19.93,18.58,
+18.35,19.41,19.14,19.04,19.16,19.41,20.64,18.06,19.61,19.87,
+19.36,19.16,20.81,19.37,20.35,20.63,20.28,19.83,20.66,20.37,
+19.09,20.25,20.48,20.39,20.58,20.43,21.15,21.29,20.07,21.58,
+21.45,20.35,21.77,21.88,20.72,21.61,21.41,20.29,22.36,20.77,
+21.53,21.48,21.80,21.45,20.91,21.28,21.79,20.81,21.36,20.89,
+20.34,22.09,21.51,21.58,20.85,22.14,22.06,22.04,21.68,21.88,
+21.16,21.14,22.11,22.28,22.34,20.69,21.99,22.44,21.18,21.44,
+22.74,22.60,22.82,22.39,21.09,21.55,22.41,22.21,22.38,23.91,
+23.42,22.27,23.05,23.15,24.22,22.96,23.31,22.89,23.03,22.96,
+3.96,3.46,3.87,3.62,4.99,4.79,4.25,5.64,5.11,5.03,
+5.14,5.39,6.00,4.91,5.12,6.45,5.94,6.70,6.56,6.38,
+6.77,6.35,6.90,7.39,6.69,6.11,6.68,7.47,8.25,7.60,
+8.24,7.78,7.56,7.47,6.96,7.96,8.39,7.79,8.99,8.65,
+7.97,7.69,8.20,9.20,9.08,8.62,9.41,8.51,8.93,8.73,
+9.49,9.94,8.65,9.98,8.31,8.86,9.43,10.16,9.78,9.91,
+10.11,9.69,10.64,10.25,10.74,10.10,10.16,9.11,9.56,11.61,
+11.25,11.27,11.35,12.04,10.91,11.06,11.95,11.66,11.10,11.40,
+10.92,11.23,11.14,11.22,11.95,11.43,11.50,11.44,12.04,11.75,
+11.95,11.89,12.21,11.41,11.48,12.97,11.94,11.09,12.24,13.88,
+11.58,12.33,12.22,11.81,13.44,12.62,13.04,11.97,13.57,12.69,
+13.09,13.26,13.85,13.01,13.44,12.94,13.24,13.90,13.14,13.65,
+13.63,13.27,14.44,13.28,14.10,12.88,13.43,13.87,13.88,14.20,
+13.08,13.23,14.80,14.08,14.48,13.95,14.66,14.51,14.46,13.65,
+15.01,15.09,14.76,14.00,14.18,15.77,14.76,15.01,15.53,15.25,
+14.73,15.35,14.20,15.56,15.35,14.73,16.51,15.79,15.45,16.84,
+15.50,15.86,15.57,15.83,14.77,15.53,16.01,16.20,15.65,15.89,
+16.56,15.33,15.92,16.02,16.21,16.21,17.24,16.48,15.33,16.47,
+17.05,16.90,16.42,16.55,16.78,15.83,16.12,16.23,17.22,17.38,
+17.47,16.75,17.02,17.19,17.91,17.23,16.35,16.73,16.82,17.55,
+16.75,17.25,17.31,17.76,17.98,18.20,18.58,18.43,17.86,17.38,
+18.36,17.89,17.27,17.47,17.11,18.48,18.37,18.24,18.42,17.88,
+18.50,18.27,18.36,17.97,18.16,18.91,18.89,17.56,20.40,18.73,
+19.10,17.66,17.78,17.94,18.24,18.29,18.12,18.52,19.60,18.68,
+19.33,18.54,19.76,19.44,18.99,18.42,18.90,19.69,19.32,18.41,
+20.29,19.46,18.93,19.26,18.82,19.49,19.74,20.14,19.10,19.37,
+19.91,18.66,19.26,18.40,20.07,20.93,20.23,19.06,18.72,20.64,
+20.66,20.52,19.31,19.92,19.02,20.03,21.00,20.88,20.73,19.50,
+20.29,19.63,19.52,20.06,20.27,20.76,21.25,20.67,20.59,20.81,
+14.07,14.39,15.23,16.30,16.57,16.87,17.38,18.42,18.87,19.67,
+19.53,20.27,20.72,21.48,21.66,22.11,21.91,22.32,22.76,24.44,
+23.98,23.80,24.36,26.46,25.75,25.17,25.78,26.47,26.31,28.05,
+27.35,28.69,28.53,28.29,28.54,29.36,31.16,27.98,30.35,31.07,
+31.36,30.55,30.13,31.36,32.87,31.68,31.89,33.04,32.76,32.17,
+34.50,34.95,34.49,34.22,35.21,34.78,34.35,36.27,36.61,36.12,
+36.86,35.84,36.95,37.80,39.22,37.46,38.04,38.35,39.52,39.70,
+38.97,38.94,41.20,38.07,41.03,40.44,40.76,39.51,41.04,41.05,
+40.69,41.72,40.96,40.78,41.59,41.36,43.15,44.46,42.98,42.84,
+44.02,44.66,43.24,44.08,45.77,45.18,45.19,44.63,43.67,44.65,
+46.55,45.56,47.23,45.95,46.63,46.59,46.91,47.40,47.47,46.38,
+47.35,46.74,46.69,48.27,49.74,48.90,49.04,49.08,49.91,49.77,
+48.49,50.37,50.45,51.64,51.56,52.18,51.34,49.57,52.84,52.21,
+52.11,49.54,52.89,54.27,52.45,53.13,52.08,53.64,52.42,54.70,
+53.69,55.61,54.54,53.68,55.02,54.54,55.47,53.52,55.24,52.82,
+54.56,54.68,55.41,53.47,56.09,55.26,56.26,56.59,54.37,58.75,
+53.57,56.27,59.25,56.79,57.19,57.73,55.17,57.50,56.82,56.85,
+60.09,59.90,59.02,59.68,59.41,60.30,59.16,60.37,60.92,60.38,
+59.18,58.76,60.49,59.65,60.19,60.73,61.85,59.82,58.96,60.18,
+63.13,60.41,61.22,63.70,63.74,62.14,61.70,66.66,62.47,64.87,
+64.78,65.47,61.76,62.08,63.15,62.22,64.48,66.56,65.31,65.14,
+63.47,62.73,63.25,68.80,64.62,63.98,66.65,69.04,65.71,65.61,
+68.25,67.71,67.62,65.62,66.43,66.81,67.86,66.00,67.07,71.37,
+68.78,64.31,70.46,66.93,66.73,68.00,67.47,67.28,68.61,65.85,
+69.58,67.44,68.19,67.20,69.49,72.72,70.22,72.50,68.48,72.02,
+70.55,69.68,67.62,69.67,73.29,71.25,69.00,70.90,73.90,71.92,
+71.49,73.88,71.77,71.57,72.13,71.50,71.98,70.37,72.20,74.72,
+70.35,71.51,71.11,74.54,75.28,72.30,76.16,75.39,73.06,74.77,
+71.02,76.57,72.90,76.08,76.81,73.25,73.79,74.56,76.82,74.87,
+13.23,14.15,15.53,15.66,16.46,16.25,17.55,17.21,17.72,18.33,
+18.65,19.11,20.47,20.48,20.38,20.54,21.26,22.67,21.89,22.53,
+23.03,23.02,23.22,23.36,24.76,24.60,25.47,24.64,26.14,25.69,
+27.43,27.59,27.93,27.47,28.11,29.93,27.41,28.83,29.49,29.46,
+30.02,28.72,30.81,29.77,31.08,31.60,32.16,31.72,33.11,32.18,
+32.82,33.07,33.13,33.14,33.92,34.88,35.02,31.97,32.99,34.97,
+34.39,35.48,34.27,35.42,34.98,36.88,36.84,38.20,38.45,37.13,
+37.15,37.48,37.16,36.33,37.88,38.79,40.29,40.00,38.15,39.26,
+40.24,41.20,38.93,40.14,41.68,41.28,40.23,41.34,42.45,43.34,
+40.85,43.94,42.80,42.14,43.19,44.04,43.58,44.66,41.93,43.19,
+44.08,41.86,43.47,43.35,45.97,45.13,45.44,47.25,45.93,45.81,
+44.78,47.06,46.98,44.30,46.39,47.20,45.99,46.24,47.44,47.18,
+47.43,49.77,48.97,48.72,49.37,49.37,50.47,47.51,49.62,49.32,
+49.27,50.04,48.23,50.26,50.66,50.55,51.44,49.78,52.96,51.69,
+52.33,51.82,52.77,51.05,51.00,51.55,50.76,52.50,52.80,51.96,
+53.57,52.99,53.23,51.83,52.87,54.84,54.07,52.60,52.87,52.48,
+54.52,54.65,54.00,55.37,53.58,54.54,55.67,54.10,56.39,56.24,
+59.11,56.70,56.41,55.83,58.32,56.55,57.76,59.29,56.77,57.25,
+56.96,57.48,57.41,58.69,57.82,58.20,60.30,59.65,58.49,59.14,
+60.95,56.99,58.54,60.12,62.79,61.41,60.19,61.35,61.44,61.75,
+60.53,59.74,60.85,62.16,61.47,62.87,63.14,61.67,60.52,61.01,
+60.94,61.49,61.08,63.65,63.82,64.29,63.10,62.12,63.27,64.97,
+62.69,64.08,62.54,63.82,62.63,62.37,65.37,67.79,64.20,62.49,
+62.76,66.02,65.67,63.34,64.84,65.46,65.48,66.18,66.36,67.58,
+67.85,65.63,65.13,66.62,68.44,67.07,66.66,66.53,70.43,68.74,
+67.44,65.76,68.59,70.64,67.34,68.79,66.11,69.09,68.27,67.36,
+70.05,69.38,71.77,70.31,69.96,69.25,66.84,70.02,70.70,72.75,
+69.07,72.88,69.93,70.05,69.69,69.88,70.58,73.20,73.32,72.81,
+70.84,71.59,72.68,73.25,70.46,73.67,70.46,71.45,70.57,70.08,
+13.13,13.47,13.98,14.83,14.93,15.18,15.49,16.63,17.85,17.59,
+18.22,18.50,19.30,19.47,19.66,19.92,20.07,21.05,20.86,21.82,
+22.27,22.13,22.97,22.81,23.02,24.09,23.11,24.69,25.66,25.40,
+25.65,25.40,26.24,27.33,26.99,26.31,26.61,27.10,27.14,27.43,
+28.54,28.21,29.33,28.51,29.17,29.13,30.43,29.89,31.54,30.45,
+31.85,31.57,30.65,33.17,31.58,31.74,33.31,32.44,31.99,33.57,
+33.06,34.75,34.11,34.21,33.94,34.94,35.12,35.10,34.78,35.90,
+35.80,35.17,38.82,36.64,34.72,36.97,37.37,35.75,38.22,37.10,
+37.83,36.26,37.42,38.21,37.71,40.01,40.52,40.34,40.11,38.71,
+40.36,41.07,39.84,41.05,40.87,43.57,40.09,43.16,41.62,41.68,
+41.33,40.90,42.19,40.72,42.54,44.62,44.83,43.62,42.96,42.38,
+42.53,42.78,44.13,43.26,45.35,44.61,44.37,45.34,44.60,45.50,
+44.75,45.64,48.25,46.18,46.92,46.48,48.53,47.59,46.17,45.49,
+46.29,45.50,46.96,47.30,49.49,48.41,47.84,47.04,51.17,47.72,
+46.96,48.43,50.28,49.38,49.57,48.94,50.72,51.15,50.21,49.25,
+49.44,50.44,52.97,52.12,50.06,53.06,49.34,50.18,49.96,51.78,
+52.73,49.05,50.46,52.76,50.45,51.09,52.67,52.29,52.79,53.62,
+54.54,55.46,53.17,54.43,54.85,54.91,53.70,56.59,56.44,55.38,
+56.60,54.29,56.81,54.62,55.45,54.28,56.71,56.20,56.16,58.14,
+56.27,54.87,54.60,54.68,56.68,57.38,56.91,57.72,58.31,59.12,
+56.34,56.53,55.76,56.28,58.66,57.59,59.72,59.79,55.48,60.07,
+59.87,59.28,58.86,59.85,59.98,60.49,60.62,58.83,59.90,61.84,
+60.45,59.60,64.97,59.64,60.53,62.02,58.78,59.62,62.43,60.19,
+62.36,61.64,61.43,59.98,62.48,62.15,64.89,64.26,63.88,61.90,
+62.84,62.50,63.27,62.48,64.92,64.61,64.30,63.32,65.86,65.95,
+68.02,63.54,64.54,65.54,65.55,66.49,65.17,64.49,64.36,65.89,
+65.93,68.40,66.98,65.31,67.01,63.45,66.23,64.98,68.69,68.70,
+65.99,66.75,67.58,65.68,67.56,64.87,67.45,65.80,66.60,68.58,
+69.35,71.46,64.70,66.30,67.25,67.25,70.04,69.97,68.56,70.22,
+12.07,12.81,13.46,13.15,13.72,15.15,15.50,15.50,15.69,16.35,
+17.02,17.28,17.85,17.19,18.75,19.94,18.91,19.69,20.05,20.62,
+21.10,21.70,20.96,21.94,22.15,23.06,22.76,23.36,22.91,23.72,
+23.33,24.72,24.58,25.26,24.70,24.86,25.76,26.35,25.74,26.08,
+26.20,27.16,27.15,28.01,27.40,29.32,27.51,29.54,28.47,28.73,
+29.18,29.62,29.65,31.03,30.10,30.62,31.32,31.86,31.07,32.08,
+31.59,31.24,32.54,32.76,33.03,33.40,34.11,33.05,33.79,34.67,
+33.81,33.61,33.79,34.57,34.55,35.44,36.27,35.86,36.35,34.75,
+35.09,36.22,35.89,37.29,36.01,37.12,36.91,37.44,37.43,37.55,
+37.67,38.16,38.18,38.68,38.37,37.65,38.27,37.76,39.84,39.82,
+39.38,38.78,39.97,39.83,40.12,39.81,40.58,40.56,40.84,43.04,
+40.97,43.03,41.89,40.34,41.35,42.40,41.36,42.52,41.92,41.96,
+42.84,43.52,41.97,42.72,42.62,42.89,43.32,43.56,45.79,46.24,
+46.39,45.84,44.99,45.10,44.01,44.39,45.86,45.17,45.55,46.44,
+47.11,46.70,46.66,47.28,44.46,45.52,45.82,45.28,48.46,46.17,
+46.13,46.40,48.28,45.76,48.17,48.89,48.84,46.10,48.29,50.08,
+48.73,51.44,51.09,49.53,48.31,50.38,49.40,49.81,49.87,50.64,
+49.43,50.97,48.24,51.33,52.01,51.52,51.01,51.71,51.16,51.54,
+51.27,53.39,53.90,51.88,50.80,50.32,51.87,53.38,54.01,54.48,
+55.44,52.48,54.44,56.09,51.67,53.35,55.61,55.20,53.39,54.69,
+56.33,57.61,54.12,56.41,54.50,55.56,54.90,56.85,54.89,54.76,
+55.86,54.91,54.36,56.78,54.82,55.37,58.57,55.69,55.99,56.15,
+58.58,58.35,58.48,61.00,57.49,59.64,55.72,60.23,60.07,58.23,
+54.87,56.34,59.65,57.47,56.10,60.72,58.66,58.26,59.12,58.87,
+62.42,61.07,58.69,61.15,60.55,59.35,61.97,61.70,57.47,60.91,
+60.69,62.64,64.53,60.22,57.70,62.86,62.81,62.39,60.35,61.96,
+61.48,60.68,62.56,61.49,60.79,60.40,63.90,63.13,62.10,61.34,
+63.93,62.80,64.15,66.08,63.87,63.50,64.34,63.38,64.35,64.23,
+62.42,62.70,65.95,65.20,65.12,62.67,64.49,62.63,65.13,67.08,
+11.40,11.66,11.81,13.01,13.95,13.83,13.58,14.47,14.86,15.84,
+15.49,16.36,16.79,16.86,17.44,17.70,17.80,18.31,18.57,19.22,
+19.31,19.77,20.73,20.68,19.83,21.30,20.94,21.66,22.28,21.14,
+22.03,22.77,22.64,23.15,23.45,23.95,23.43,24.38,24.64,25.76,
+25.43,25.72,26.16,25.84,26.91,26.28,27.53,26.71,26.61,27.34,
+27.97,27.77,27.51,29.10,28.55,27.27,28.29,29.18,28.88,30.25,
+28.64,28.72,30.67,30.38,30.74,29.74,31.32,29.50,30.44,31.82,
+31.51,31.29,32.88,31.76,33.48,33.11,31.57,33.19,32.46,33.88,
+32.75,33.75,33.23,34.65,32.92,33.73,34.95,35.21,35.60,34.53,
+35.33,35.57,36.37,35.48,37.78,35.29,36.74,36.66,37.49,35.71,
+36.10,37.09,37.83,36.44,37.74,38.86,39.91,37.52,38.37,39.21,
+38.17,37.93,38.10,40.13,38.82,38.93,39.10,40.01,39.77,41.43,
+40.23,41.20,40.25,40.31,40.75,39.48,40.43,41.46,41.97,41.97,
+42.41,42.05,42.24,41.03,38.76,41.78,42.00,43.65,40.16,43.51,
+43.41,43.50,44.10,43.98,43.70,45.01,44.13,44.90,42.80,45.11,
+43.48,43.68,45.30,45.11,42.80,45.00,43.72,43.13,44.61,46.88,
+43.67,44.29,42.94,46.30,47.50,46.82,45.49,46.39,46.79,44.77,
+48.45,44.99,45.67,47.35,48.26,47.35,46.65,49.48,48.22,45.80,
+48.27,48.59,50.21,48.65,47.96,48.72,49.20,48.63,49.42,49.75,
+50.48,48.62,50.07,49.52,50.63,51.83,52.92,51.86,50.50,52.19,
+50.59,51.15,52.93,52.22,50.34,51.92,51.53,50.60,52.45,50.47,
+51.77,50.61,52.12,50.26,52.08,51.41,51.92,52.06,52.65,52.90,
+53.78,53.99,54.36,53.68,55.16,51.45,56.85,55.82,53.20,54.87,
+55.56,52.51,54.87,54.28,56.31,55.39,56.45,54.26,54.24,55.99,
+56.62,53.28,55.67,57.07,55.22,58.06,56.51,55.85,55.28,54.21,
+58.55,56.74,55.10,58.87,57.51,56.65,56.00,58.36,57.11,60.66,
+58.14,55.78,56.59,59.42,58.83,57.20,58.29,60.03,58.94,58.73,
+59.32,57.69,56.94,60.15,58.58,58.56,59.60,59.52,58.57,59.89,
+57.90,59.09,56.44,60.74,59.56,60.71,60.60,61.40,61.37,64.61,
+10.38,11.27,11.61,11.71,12.00,13.11,13.70,13.32,13.55,14.56,
+14.91,15.24,15.37,15.69,15.89,16.21,15.65,17.36,17.14,17.98,
+17.91,18.24,18.60,19.26,19.75,19.37,19.63,19.60,19.40,20.85,
+21.28,21.83,21.16,21.80,21.65,22.44,22.07,21.90,22.39,22.71,
+23.45,23.59,23.08,23.73,23.39,23.65,25.04,25.17,24.22,25.24,
+25.50,25.86,26.40,25.69,26.64,26.87,26.85,25.44,27.43,26.93,
+27.19,27.99,27.43,29.48,29.22,28.14,28.00,29.63,29.41,28.28,
+27.93,27.86,29.17,28.54,30.33,30.89,29.56,31.01,30.36,30.76,
+31.59,30.55,31.18,30.69,31.05,31.04,31.56,31.25,31.05,32.24,
+32.98,31.74,32.25,33.17,32.61,32.98,32.75,34.25,32.68,34.08,
+33.87,34.35,34.01,35.33,35.43,34.99,34.37,35.14,35.09,35.81,
+35.70,35.78,37.07,36.42,35.84,36.19,37.20,36.52,36.91,37.23,
+37.48,37.44,37.84,37.26,38.35,37.95,37.16,36.67,36.62,38.27,
+38.25,39.20,38.96,38.93,38.72,40.00,39.50,39.37,40.66,40.33,
+39.31,41.66,40.89,41.03,41.47,40.24,40.42,39.75,41.75,41.45,
+39.86,41.16,39.68,41.11,42.65,42.12,41.90,40.69,42.39,43.83,
+40.76,41.39,43.87,41.38,43.97,41.83,43.30,42.27,43.90,44.69,
+42.10,44.27,43.85,44.38,44.70,44.90,44.17,45.25,44.60,45.73,
+45.26,44.87,46.75,44.61,46.43,46.65,46.48,45.36,45.15,46.99,
+45.92,46.89,47.57,45.23,45.08,46.48,46.57,48.40,47.20,45.73,
+47.23,47.64,48.28,47.28,49.30,46.00,46.92,47.86,49.45,49.68,
+48.48,48.68,50.12,49.05,48.28,49.45,49.27,50.64,49.62,47.94,
+50.02,50.85,49.38,49.29,50.90,49.96,50.18,51.08,50.28,50.44,
+52.36,51.66,51.42,52.21,48.05,49.83,49.93,53.71,52.18,52.67,
+53.27,51.46,52.53,52.58,52.19,50.20,51.63,52.55,52.87,52.21,
+53.18,51.25,54.61,53.75,52.74,55.16,52.97,52.64,53.47,53.64,
+52.95,53.63,55.79,54.95,54.08,55.52,53.84,53.46,54.77,52.69,
+53.85,52.83,53.40,56.00,54.73,54.29,54.11,57.40,53.62,52.39,
+54.03,57.55,54.58,57.03,55.98,55.39,58.13,55.90,57.86,54.00,
+9.32,9.77,10.99,10.88,12.04,12.13,11.66,13.13,12.70,13.20,
+13.36,13.89,13.56,14.37,15.14,14.61,15.21,15.88,15.87,16.31,
+15.89,17.37,17.24,15.92,18.26,18.14,18.59,18.48,18.82,19.17,
+18.95,19.17,20.21,18.75,19.29,20.04,20.54,21.53,20.82,20.15,
+21.56,22.19,20.70,22.43,21.51,22.11,22.70,23.10,21.77,22.54,
+23.23,22.85,25.22,25.05,24.07,24.49,25.16,24.91,25.87,24.03,
+25.84,24.11,26.21,25.35,26.76,25.94,26.48,26.13,26.41,27.00,
+26.65,28.04,26.82,26.83,27.72,27.34,28.54,29.25,28.20,29.42,
+28.72,27.82,29.40,29.10,29.79,29.26,30.10,30.90,29.22,29.95,
+30.34,29.93,30.85,30.09,30.24,30.32,30.43,30.43,30.95,31.74,
+31.86,31.24,31.42,31.38,32.25,33.49,32.41,34.19,31.79,32.90,
+32.85,34.12,34.74,34.32,33.19,34.41,32.89,34.51,35.56,33.59,
+35.86,34.62,34.89,34.81,35.07,34.39,34.25,34.52,35.27,36.11,
+35.75,36.42,36.83,36.63,36.15,37.57,35.40,37.32,36.63,36.66,
+35.95,37.18,37.70,37.21,37.67,36.81,37.49,37.26,37.25,40.29,
+38.85,40.56,37.59,38.45,40.31,38.65,39.66,39.22,40.20,36.95,
+39.96,41.02,39.52,39.17,39.71,39.86,40.02,40.37,39.83,40.20,
+39.80,39.21,39.91,40.63,41.00,40.82,40.90,43.02,41.84,39.64,
+41.06,40.05,41.23,41.22,42.73,40.39,42.30,43.34,41.17,42.27,
+42.10,40.97,44.33,44.93,42.62,42.50,43.21,42.61,42.27,42.92,
+43.51,43.96,42.61,43.92,45.88,43.47,44.43,45.59,40.96,42.34,
+46.08,43.31,42.94,45.88,44.25,44.99,45.56,45.04,44.59,45.21,
+47.36,44.93,47.21,45.46,45.58,47.15,45.51,46.01,44.85,48.58,
+45.83,47.11,46.68,46.96,46.88,46.47,46.56,47.00,47.58,47.40,
+47.39,50.07,48.63,46.27,48.34,47.43,47.48,48.32,48.92,49.55,
+48.37,48.84,48.50,49.09,48.38,49.57,49.24,47.79,50.20,50.65,
+49.10,49.73,48.91,48.85,49.95,50.06,49.23,48.82,49.74,50.15,
+52.42,50.56,50.93,51.04,50.07,48.63,50.73,50.04,50.05,53.44,
+50.32,53.02,52.34,50.38,52.36,51.33,50.81,52.68,50.79,52.10,
+9.33,9.15,10.17,9.67,10.11,11.02,11.22,11.46,11.77,11.96,
+13.25,13.30,12.42,13.01,13.47,14.25,14.56,15.02,14.92,15.28,
+15.53,15.81,16.04,15.92,15.58,16.79,15.87,16.32,16.92,17.56,
+18.08,17.21,18.56,18.01,17.45,17.82,17.71,19.42,18.37,19.63,
+19.78,20.73,20.86,19.83,19.94,20.20,20.91,21.06,20.92,20.35,
+21.94,21.12,20.94,22.03,21.78,22.67,22.83,22.96,22.72,23.85,
+22.62,22.86,23.08,23.07,23.49,24.86,24.40,23.54,24.07,25.14,
+23.95,24.87,24.56,26.08,24.25,25.89,25.34,25.58,26.03,26.48,
+26.61,26.28,26.23,27.71,25.93,28.33,26.54,27.12,26.81,25.76,
+27.78,27.32,27.86,28.65,27.88,26.93,27.36,28.36,28.41,28.87,
+28.32,28.44,27.89,30.92,30.25,29.38,30.03,29.13,30.38,30.28,
+30.20,30.15,31.50,30.98,31.65,30.65,31.01,31.78,31.42,30.89,
+31.42,31.66,31.13,30.14,30.99,32.28,31.91,32.96,34.09,33.04,
+34.13,33.82,33.51,32.86,32.57,34.85,34.36,33.32,33.11,32.41,
+34.14,35.03,33.55,34.76,33.51,33.43,35.24,33.25,33.83,34.80,
+34.76,35.18,33.90,35.49,36.51,35.90,35.67,36.37,36.77,35.47,
+35.89,35.31,36.07,36.55,37.35,38.35,35.46,35.87,37.06,35.90,
+36.98,38.44,36.92,36.93,37.38,37.97,36.70,38.02,37.87,37.94,
+38.26,38.79,39.35,39.42,39.33,40.37,39.94,41.49,38.57,39.58,
+38.49,38.66,38.75,39.10,39.80,38.75,38.92,39.74,38.98,39.92,
+40.12,41.26,40.28,40.61,39.96,40.77,40.09,38.58,40.77,41.90,
+40.96,39.75,40.36,41.53,41.13,41.92,40.64,42.73,41.53,40.86,
+40.34,42.28,42.07,41.46,43.08,42.81,43.40,41.69,42.95,43.42,
+42.06,44.70,42.55,44.24,44.81,44.08,43.08,42.26,42.18,43.65,
+43.34,43.17,42.89,46.87,43.86,43.18,44.12,44.16,45.98,43.13,
+45.20,44.32,44.76,45.91,44.98,43.48,43.28,44.49,44.04,43.78,
+45.46,45.22,48.23,44.88,46.66,45.24,44.40,44.25,47.06,45.90,
+43.54,44.34,47.70,46.19,46.88,47.62,46.11,47.12,46.70,47.36,
+46.71,46.88,47.49,49.20,46.42,48.11,47.25,48.14,47.64,49.43,
+8.16,8.68,8.84,9.71,9.86,9.99,10.91,10.57,11.46,10.99,
+11.08,11.68,12.16,12.34,12.24,12.89,13.08,13.55,13.49,13.95,
+14.09,15.44,14.61,13.90,14.21,15.61,14.68,14.99,16.01,15.88,
+16.65,16.02,15.92,16.76,17.07,16.46,16.84,16.93,16.18,17.64,
+17.47,18.71,18.17,18.27,20.20,17.05,19.28,18.69,20.06,20.14,
+19.22,19.94,20.90,20.57,19.36,20.28,20.48,19.88,20.44,21.17,
+20.77,21.63,20.98,21.10,21.32,22.43,22.01,22.24,22.09,22.33,
+22.73,22.49,23.42,22.78,22.57,23.36,23.27,22.78,24.12,23.58,
+24.67,24.07,25.37,25.20,24.72,25.15,24.93,25.79,25.08,24.37,
+25.75,25.38,24.66,25.02,25.69,26.66,26.69,25.76,24.69,27.06,
+25.84,26.60,27.25,27.47,27.24,26.24,26.00,27.18,27.30,25.88,
+27.05,27.24,28.27,28.54,29.37,28.81,27.70,28.75,28.56,27.09,
+28.47,28.14,30.36,30.15,28.05,29.47,30.09,30.05,29.65,30.43,
+29.24,30.06,30.21,29.12,30.44,31.33,30.24,30.32,31.59,30.97,
+30.74,31.70,30.81,31.45,30.51,32.14,31.79,32.50,33.04,32.77,
+32.76,31.68,31.67,32.88,32.55,33.06,33.01,31.99,33.96,32.03,
+32.11,32.62,33.34,33.28,33.88,34.31,33.54,32.17,35.46,34.53,
+33.13,34.39,35.29,33.78,34.68,34.17,34.79,34.66,35.62,34.13,
+35.46,35.05,35.45,34.36,36.41,34.36,34.35,33.96,36.11,36.18,
+36.29,34.12,35.25,34.62,37.31,36.56,34.77,39.63,36.62,36.05,
+35.81,37.95,37.25,36.88,39.15,36.41,39.41,36.97,38.39,38.44,
+37.62,38.85,37.15,37.21,37.80,37.58,37.43,38.45,37.07,37.57,
+37.77,39.52,39.04,38.70,39.39,39.30,38.66,38.98,38.48,39.02,
+39.58,39.31,40.69,40.64,41.03,40.65,40.43,39.73,39.36,38.82,
+41.36,38.89,41.00,40.76,39.44,41.60,41.22,39.83,38.56,40.79,
+41.79,40.57,40.93,42.55,41.65,42.79,41.24,41.08,42.97,43.22,
+41.44,41.10,41.90,41.30,42.75,42.25,43.01,42.15,42.21,41.27,
+44.07,42.08,42.27,42.42,41.64,41.96,44.13,42.52,42.93,42.93,
+43.04,42.79,43.18,43.02,42.63,43.87,43.42,41.65,41.15,44.26,
+6.97,7.80,8.38,8.52,8.28,8.77,9.45,9.34,9.98,10.88,
+10.63,10.82,10.21,11.25,11.90,11.91,12.39,11.85,12.45,12.55,
+12.98,12.64,13.46,13.16,13.45,13.11,13.03,14.40,14.32,13.80,
+15.15,15.24,14.82,16.02,15.93,15.56,16.26,15.40,16.14,15.68,
+16.62,16.23,16.01,17.13,16.87,16.34,17.23,17.67,17.27,18.29,
+18.93,18.50,17.18,18.56,17.87,18.86,18.79,19.26,19.24,18.94,
+18.85,19.97,19.13,19.88,19.94,20.56,19.11,19.97,20.58,20.11,
+20.47,21.32,21.19,21.19,21.26,20.83,21.08,21.87,21.92,21.48,
+20.77,22.36,23.05,22.07,22.13,22.57,22.17,22.48,22.81,22.48,
+22.85,23.80,23.21,23.85,23.77,24.05,23.91,24.07,25.00,24.86,
+25.07,24.41,23.73,24.80,25.40,25.96,25.13,24.67,23.63,25.85,
+25.26,25.83,25.56,24.84,25.75,25.34,25.21,26.60,27.14,26.23,
+26.43,25.62,24.96,27.26,25.66,25.49,26.80,26.95,27.05,26.29,
+27.12,27.71,27.35,27.86,27.79,27.08,27.77,27.83,29.07,27.72,
+28.76,28.81,27.52,29.45,29.38,29.58,30.14,29.21,29.09,28.07,
+29.70,30.09,28.29,29.70,28.33,29.86,30.13,30.46,29.92,31.00,
+29.09,30.65,31.37,30.64,31.54,31.39,30.45,30.36,30.09,31.07,
+31.69,31.83,31.24,32.12,30.94,31.43,30.97,32.29,30.83,31.42,
+31.82,31.88,33.10,31.41,33.37,32.97,31.28,31.56,32.93,30.36,
+33.06,31.38,32.10,33.05,32.68,33.06,32.56,33.40,34.42,34.49,
+33.07,32.46,32.64,34.40,34.37,32.76,33.34,34.36,35.93,34.29,
+33.51,33.09,33.94,33.34,33.90,33.86,33.47,34.01,37.25,34.47,
+34.22,35.85,34.92,35.53,36.48,35.26,34.98,35.10,35.16,35.06,
+35.68,36.14,35.39,36.71,36.73,36.46,35.43,36.85,35.22,37.84,
+36.77,36.35,36.35,36.82,36.77,36.00,37.85,37.88,38.18,37.83,
+36.22,36.62,37.45,38.56,37.38,37.69,37.32,38.57,38.38,38.49,
+38.61,40.50,38.96,37.94,38.38,37.30,36.72,37.32,38.18,36.91,
+39.16,38.72,39.09,39.04,38.81,41.15,38.87,37.35,38.26,39.85,
+38.37,39.42,39.21,40.79,39.50,38.85,38.88,39.53,39.51,40.03,
+6.49,6.92,7.18,7.94,7.94,8.24,8.83,8.36,8.68,9.65,
+9.67,9.57,10.15,9.89,9.85,10.63,10.52,11.17,10.43,12.42,
+12.20,11.42,11.80,11.94,11.28,12.60,11.96,13.10,12.75,12.71,
+12.94,12.83,13.51,13.04,13.79,14.70,15.38,13.75,14.65,14.72,
+14.29,14.18,14.97,14.45,15.86,14.17,15.60,16.20,15.86,15.68,
+15.56,16.04,16.88,17.35,17.67,16.22,17.39,16.78,17.09,16.73,
+18.41,17.07,17.00,18.47,17.49,17.79,18.05,18.75,18.62,19.09,
+19.67,19.05,19.53,18.75,19.86,19.62,19.68,19.50,19.88,19.26,
+20.38,19.69,19.59,19.60,20.92,20.14,19.85,21.33,20.90,20.67,
+21.13,21.68,21.64,20.93,20.92,21.54,21.29,21.62,20.86,22.49,
+21.23,21.42,23.28,21.90,22.95,23.72,21.79,23.38,23.28,22.95,
+23.59,23.62,24.74,22.82,24.40,23.76,24.67,24.12,23.96,23.75,
+23.89,23.93,23.70,24.00,23.95,25.07,24.05,24.71,24.27,24.29,
+24.03,25.97,24.80,25.39,25.00,24.72,24.40,26.01,25.90,26.47,
+24.93,26.00,25.32,26.31,26.74,25.38,24.72,26.28,26.15,25.81,
+26.74,26.38,27.05,25.98,26.74,27.55,26.72,25.48,27.31,26.41,
+28.09,28.62,27.19,27.24,28.44,27.54,28.14,29.11,28.77,28.11,
+27.02,28.51,29.18,28.89,27.41,27.50,27.70,27.92,28.14,28.39,
+28.03,28.69,28.30,27.51,28.15,29.10,29.06,28.13,29.25,30.02,
+29.68,29.22,30.38,28.55,30.55,29.93,31.25,31.96,31.31,30.36,
+30.79,30.62,30.63,31.73,31.41,30.33,31.36,30.75,30.99,32.40,
+32.19,30.63,32.00,31.15,31.11,32.34,31.97,31.27,31.80,31.90,
+30.57,32.80,31.46,31.23,32.10,30.76,32.36,31.92,32.43,32.57,
+32.45,32.56,32.93,32.76,33.04,33.17,33.49,33.89,34.02,34.41,
+32.31,32.64,32.81,32.54,33.07,33.22,33.06,33.36,33.99,34.42,
+34.21,33.20,33.39,34.42,33.36,33.53,35.90,32.48,35.13,34.97,
+34.48,34.07,35.27,33.89,35.15,34.70,34.36,34.50,35.42,33.23,
+35.38,34.35,35.18,34.81,35.08,36.46,36.17,35.14,35.04,34.56,
+35.78,33.66,36.39,37.28,34.12,36.96,35.70,36.68,35.43,36.25,
+6.67,5.88,6.42,7.08,7.47,7.04,7.35,8.05,8.10,9.00,
+8.24,8.39,8.80,9.06,8.82,9.71,9.32,9.71,9.79,10.42,
+10.30,10.64,11.39,11.06,10.89,11.09,11.24,10.99,11.18,11.95,
+11.55,12.38,12.33,13.10,13.45,13.13,12.21,13.06,12.56,12.69,
+12.28,13.89,13.32,13.42,14.02,14.94,13.33,14.04,13.74,14.43,
+14.36,14.10,15.02,15.63,15.85,15.61,15.60,16.09,16.04,15.73,
+16.51,15.56,16.25,16.56,16.09,15.37,15.98,16.14,16.62,17.53,
+17.17,18.03,18.18,17.68,17.89,17.73,17.04,17.95,17.28,18.21,
+18.52,17.84,18.08,19.57,18.05,18.27,18.05,18.70,19.18,18.28,
+18.85,18.71,20.10,19.32,19.18,20.25,19.46,19.43,20.59,19.68,
+20.63,19.70,20.37,20.13,20.52,22.21,20.38,21.11,20.86,20.06,
+20.28,21.79,22.09,20.57,21.65,20.77,22.09,20.77,20.89,21.43,
+22.91,21.37,21.89,21.94,22.06,21.32,22.32,22.97,22.95,22.05,
+22.37,21.93,21.68,22.82,21.94,23.17,23.19,23.96,24.02,21.97,
+22.75,23.65,23.80,22.19,23.70,23.48,23.70,22.96,22.71,23.99,
+24.14,23.39,23.44,23.46,25.23,23.41,23.72,22.71,24.90,24.27,
+24.43,25.31,25.91,25.40,25.21,23.86,25.10,24.08,25.27,25.65,
+24.99,26.00,24.42,24.58,26.65,25.59,25.74,25.49,26.01,26.75,
+26.79,26.69,25.66,27.15,26.87,27.23,26.90,27.61,26.59,26.44,
+28.27,27.10,25.97,26.92,27.04,27.80,27.21,27.35,26.96,27.77,
+27.90,27.46,27.74,27.62,27.38,28.21,28.24,28.93,29.30,27.64,
+27.22,30.16,28.55,27.89,28.07,28.51,28.45,29.62,28.04,28.10,
+27.15,28.43,28.53,28.80,29.06,28.95,29.50,29.18,29.83,30.18,
+29.87,30.54,28.65,30.39,27.86,30.73,29.73,29.29,29.78,30.48,
+30.41,29.30,31.41,29.98,29.50,30.57,30.38,30.42,30.64,30.72,
+30.47,30.71,32.93,31.22,30.70,30.35,30.13,30.69,30.62,31.57,
+31.21,29.23,31.67,30.26,31.60,33.18,31.75,32.78,31.72,31.41,
+32.04,30.98,33.01,31.42,31.36,32.20,31.61,32.30,32.79,31.23,
+32.54,32.19,32.75,31.79,32.81,32.30,32.60,32.46,32.79,32.41,
+5.42,5.71,6.55,5.67,6.20,7.19,7.54,6.81,6.05,7.88,
+7.35,8.58,8.19,8.01,9.06,8.39,8.09,9.63,9.30,10.25,
+10.13,9.59,9.93,8.97,9.18,9.97,10.38,11.33,10.01,10.46,
+10.43,10.48,11.65,11.16,11.84,12.50,11.48,10.82,11.59,11.24,
+11.16,11.69,12.45,12.30,12.47,13.32,13.46,12.45,13.87,12.90,
+12.80,13.97,13.28,12.51,13.54,13.38,14.80,13.33,14.26,15.00,
+15.01,13.94,13.83,15.12,15.58,14.88,14.22,15.93,15.97,16.21,
+16.19,14.35,15.21,15.09,15.72,16.20,15.18,16.25,15.89,15.85,
+16.23,15.63,16.40,16.70,17.26,17.35,17.07,16.36,17.43,15.96,
+17.81,17.72,17.05,18.57,16.67,16.79,18.58,17.38,16.80,18.16,
+17.92,17.96,17.72,18.33,18.53,18.95,17.96,17.23,18.05,19.19,
+18.11,19.47,18.85,18.55,18.71,18.71,19.50,18.46,19.67,19.82,
+19.01,20.14,19.74,21.49,20.22,20.05,19.60,18.70,21.04,19.41,
+20.31,20.06,19.75,21.06,20.20,20.50,21.26,19.81,20.23,20.21,
+19.93,20.91,21.44,20.95,21.17,21.59,21.36,21.81,21.42,21.90,
+22.46,21.63,22.39,21.52,21.36,22.56,23.02,22.02,22.46,22.05,
+21.84,21.98,22.18,23.22,22.87,22.94,22.45,23.06,22.63,23.58,
+23.14,22.43,23.15,23.41,22.10,23.65,23.11,23.35,23.27,23.93,
+23.56,23.06,24.36,24.46,24.21,23.65,23.40,24.16,25.08,25.01,
+22.98,23.09,24.13,24.10,22.91,23.47,24.22,25.26,26.29,23.95,
+25.15,24.26,25.99,25.22,25.80,25.35,25.07,25.36,24.98,25.08,
+25.47,25.86,26.02,26.20,25.85,25.80,26.45,26.47,26.39,24.99,
+26.00,26.51,26.95,26.37,26.51,27.48,26.01,27.18,26.33,25.44,
+26.71,27.47,26.41,27.85,26.15,27.93,26.64,26.47,26.16,26.65,
+26.60,27.84,26.01,27.58,25.72,27.80,28.12,27.88,27.34,26.73,
+27.29,28.93,28.35,27.13,28.42,27.52,28.39,27.04,28.05,28.78,
+28.25,28.33,28.17,27.67,28.14,28.50,29.97,29.72,27.99,28.32,
+29.30,27.99,29.61,28.04,28.95,29.20,28.20,29.85,28.23,28.13,
+29.20,30.10,28.67,29.57,28.64,28.83,29.45,29.48,30.30,31.02,
+4.50,4.89,5.44,5.74,6.05,6.03,7.39,6.47,6.27,7.06,
+6.85,7.35,8.02,7.80,6.84,8.05,7.47,8.56,8.02,7.91,
+9.09,9.21,9.64,9.00,8.54,9.02,9.13,9.83,9.14,9.99,
+9.87,9.80,9.79,9.89,10.30,9.75,10.84,11.04,10.54,11.14,
+10.97,10.26,10.14,11.06,12.12,11.77,11.72,12.29,13.28,12.36,
+12.32,12.46,11.96,12.09,12.21,13.13,12.47,13.24,13.62,13.28,
+13.34,12.78,12.73,13.13,12.79,13.38,13.97,13.80,12.89,13.22,
+13.84,13.73,14.22,13.43,14.47,13.28,14.97,14.38,14.21,14.09,
+14.48,14.72,13.68,15.53,14.36,15.93,15.02,15.80,16.14,15.36,
+15.93,14.81,15.49,16.35,15.76,16.28,16.22,15.72,15.78,16.41,
+16.84,15.88,15.95,16.63,16.08,15.74,16.54,16.64,16.40,16.51,
+17.58,16.78,16.83,16.50,17.55,16.38,16.73,16.61,17.01,17.13,
+17.75,17.92,18.53,18.32,17.62,18.69,17.84,17.53,18.77,18.26,
+18.09,19.12,19.07,18.54,18.56,19.22,19.38,18.80,19.35,19.14,
+18.25,18.22,19.10,18.81,18.88,19.42,18.96,19.62,18.77,19.34,
+19.23,19.80,20.30,19.06,19.94,20.25,21.20,19.74,20.58,20.99,
+20.28,20.27,19.30,20.15,20.32,21.36,19.58,20.48,19.58,21.57,
+20.27,20.28,21.61,21.12,20.69,20.53,21.72,21.15,21.50,21.40,
+21.33,20.82,21.17,22.51,21.86,20.76,21.99,21.28,21.91,21.70,
+22.00,22.04,22.58,21.36,21.18,21.65,21.91,22.00,22.39,22.96,
+20.88,21.99,22.63,23.80,23.10,21.68,22.38,22.68,23.03,23.29,
+23.83,23.54,22.54,22.01,23.41,23.69,23.43,21.90,23.56,23.79,
+23.52,23.28,22.95,23.49,24.10,24.23,23.48,24.08,23.76,22.08,
+23.33,24.40,23.55,24.06,23.49,24.50,25.50,24.74,24.27,24.59,
+25.95,24.75,24.93,24.34,25.89,24.92,24.61,24.35,25.15,25.25,
+25.35,24.72,25.71,25.89,25.32,26.04,25.23,25.21,24.20,25.20,
+26.09,25.74,25.22,25.03,24.97,26.34,25.48,25.57,25.56,25.09,
+26.03,26.36,25.10,26.89,26.18,26.76,27.04,26.04,26.19,26.71,
+27.21,27.76,27.17,26.69,27.00,26.75,26.64,26.78,26.97,27.58,
+4.68,4.49,5.06,4.84,5.87,6.40,5.92,6.57,6.07,6.83,
+5.91,5.62,7.03,6.49,7.22,7.04,7.06,7.16,7.18,7.21,
+7.17,7.09,7.56,7.65,8.67,9.11,8.68,8.36,8.13,8.30,
+8.92,9.14,9.71,8.98,9.41,8.75,9.38,9.74,9.77,9.86,
+9.40,10.20,10.47,10.32,10.02,10.66,10.66,10.07,11.54,11.17,
+10.36,10.80,11.45,10.34,11.76,11.29,12.05,11.47,11.55,11.57,
+11.03,11.82,11.63,11.81,11.75,12.27,12.95,12.78,12.17,12.82,
+11.89,13.04,11.98,12.74,12.41,12.56,12.79,12.98,13.91,13.21,
+12.72,14.38,13.11,13.19,13.70,13.12,14.30,14.00,13.15,13.87,
+13.20,13.90,13.55,12.80,14.17,15.28,14.31,14.85,14.52,15.00,
+15.40,14.72,14.16,13.41,14.09,14.43,15.30,15.34,15.15,16.11,
+15.68,15.67,14.44,15.45,15.33,15.95,15.44,15.91,15.12,15.10,
+16.47,16.48,15.99,15.55,16.39,16.60,17.81,15.50,16.27,16.00,
+15.86,16.26,16.72,16.38,16.98,16.33,17.29,16.99,16.71,16.98,
+17.29,16.73,17.57,17.10,17.55,18.07,17.74,17.07,17.65,17.64,
+18.19,17.38,17.35,18.71,17.21,17.99,17.22,17.49,18.12,17.48,
+18.63,19.76,17.93,18.55,18.49,19.33,18.83,17.55,18.35,18.74,
+16.79,19.43,19.34,18.57,19.35,19.23,19.55,18.82,19.63,19.60,
+19.39,19.38,18.65,19.72,19.71,19.63,20.71,19.99,20.42,19.62,
+20.95,20.00,20.33,20.03,20.14,20.64,20.52,20.26,20.15,21.07,
+20.71,19.23,20.37,19.91,21.55,20.43,20.26,21.13,20.20,19.98,
+20.77,20.01,20.28,21.63,22.69,20.42,20.53,20.65,20.58,21.16,
+20.90,22.39,22.64,21.63,21.37,21.78,20.56,21.11,21.50,21.79,
+21.71,21.40,22.35,21.41,21.60,21.85,21.25,21.07,22.29,22.17,
+22.24,21.86,22.02,22.55,20.93,23.18,23.42,21.84,22.18,22.61,
+22.30,21.73,23.35,22.44,21.16,23.46,21.90,22.48,23.68,22.23,
+23.39,23.19,22.01,23.70,23.50,23.86,23.91,24.55,24.43,23.24,
+23.35,22.91,23.59,22.99,23.37,23.24,24.22,23.24,23.19,23.20,
+22.95,24.68,24.50,22.79,24.64,22.84,23.46,23.83,24.86,24.10,
+14.53,15.33,16.66,16.88,17.68,17.93,18.59,18.30,19.21,20.24,
+20.17,20.76,22.35,22.05,22.72,22.13,23.47,24.90,24.38,24.38,
+25.11,25.36,26.02,26.20,27.07,26.62,25.97,27.19,28.19,29.34,
+28.81,29.61,29.45,29.05,30.72,31.18,31.65,31.50,31.48,31.92,
+31.67,32.51,31.68,32.31,34.43,33.08,35.18,34.13,33.84,35.44,
+34.83,35.28,36.96,35.96,36.65,36.14,39.50,34.96,36.92,37.39,
+38.51,38.72,39.33,40.02,39.13,39.40,39.10,39.06,39.61,40.96,
+40.04,39.78,39.99,42.44,39.92,40.72,41.57,42.28,41.62,42.54,
+43.71,43.72,44.55,44.69,43.08,44.04,43.99,45.32,45.36,43.76,
+44.38,46.30,45.14,45.10,46.91,47.43,46.37,46.75,47.05,44.65,
+47.56,46.72,47.14,48.15,50.20,48.05,50.40,48.38,49.27,48.35,
+49.37,50.26,49.61,51.12,51.53,49.40,51.26,52.88,51.59,51.22,
+49.62,49.62,52.56,51.82,53.54,52.02,51.88,51.92,53.06,54.65,
+53.42,52.23,54.58,53.08,54.44,55.41,55.71,56.57,55.05,54.98,
+53.17,55.39,55.63,55.94,57.49,57.86,57.12,56.02,55.83,56.02,
+55.78,57.33,58.16,57.43,57.92,58.49,57.47,58.68,59.94,61.09,
+61.16,60.34,57.41,60.25,60.14,60.88,60.72,57.12,59.15,61.96,
+64.47,62.44,61.51,58.97,63.10,61.50,63.58,62.12,62.44,60.91,
+62.92,62.82,63.14,62.18,62.03,62.72,62.62,61.29,68.98,65.91,
+62.44,66.66,62.66,64.17,63.96,61.98,63.50,64.67,66.08,60.08,
+66.35,65.46,67.09,70.46,65.93,65.84,66.53,65.75,65.19,67.59,
+67.87,68.48,67.08,69.63,66.56,69.00,69.61,69.02,67.48,68.71,
+68.02,66.60,70.21,69.20,68.71,67.53,71.22,69.87,72.94,71.23,
+69.53,71.15,68.87,73.60,71.86,69.85,68.93,74.40,69.87,69.14,
+70.74,72.10,71.54,69.51,74.33,73.96,71.56,69.70,75.32,72.95,
+69.98,72.35,73.16,75.08,74.04,75.59,76.28,75.07,75.53,72.59,
+72.41,75.10,71.98,72.45,77.08,76.22,73.33,71.75,74.45,75.21,
+73.57,75.13,75.26,77.19,76.25,75.26,75.55,78.91,78.02,74.58,
+73.54,77.97,77.42,75.94,77.04,77.53,76.05,78.70,79.28,81.11,
+14.05,14.90,15.54,16.33,16.99,17.54,17.79,18.21,19.46,19.40,
+20.40,21.04,21.23,20.31,21.79,22.60,23.01,23.48,23.44,24.39,
+24.25,24.46,25.73,25.36,26.07,26.42,26.47,26.24,27.59,28.19,
+27.92,28.36,28.52,30.25,29.49,30.27,30.52,30.16,30.85,31.23,
+30.79,29.79,31.48,32.75,31.88,32.46,31.90,32.88,33.84,34.01,
+33.47,34.51,35.46,34.42,34.51,35.67,36.69,35.32,37.87,34.94,
+37.38,37.06,38.50,36.81,37.03,37.58,38.03,39.65,38.35,39.11,
+39.24,40.24,39.54,39.93,40.48,42.55,42.17,41.12,44.11,41.93,
+40.77,43.58,41.15,42.53,41.08,42.98,42.18,43.24,41.10,43.26,
+41.85,44.01,45.12,45.85,43.83,45.56,45.27,46.10,44.04,47.03,
+47.22,46.33,47.23,48.68,46.37,47.64,48.05,50.61,50.41,47.19,
+47.36,47.97,47.28,48.26,49.70,48.49,49.42,50.17,49.90,49.99,
+51.35,52.35,51.66,51.10,51.42,49.69,54.50,51.12,50.49,51.69,
+51.26,52.70,51.67,52.70,52.56,51.92,53.33,53.63,53.50,54.05,
+51.86,55.73,52.74,53.16,53.23,53.99,56.10,54.14,57.21,58.82,
+58.66,55.64,56.65,55.79,56.43,55.71,56.10,57.90,57.27,58.49,
+58.63,57.28,55.36,60.20,56.85,54.99,59.04,60.01,57.43,57.93,
+60.86,59.88,58.12,59.82,61.07,58.42,62.45,62.71,61.56,60.33,
+61.88,59.86,60.92,60.66,62.10,61.38,61.74,62.13,64.58,63.72,
+61.54,62.74,63.32,63.01,62.62,62.90,62.52,61.67,60.07,64.65,
+65.26,65.05,62.53,66.16,63.51,65.96,65.37,68.30,64.36,65.08,
+64.23,65.69,65.30,68.19,64.70,65.42,67.46,67.89,65.67,67.64,
+69.62,69.31,66.48,68.37,67.84,68.83,70.24,67.92,66.82,66.53,
+70.21,68.10,69.93,70.31,69.62,68.14,67.11,70.85,72.17,71.80,
+67.53,70.27,71.12,71.41,71.56,73.77,70.10,68.75,69.61,74.52,
+72.80,68.87,69.53,68.66,72.32,72.20,70.77,70.81,72.50,73.42,
+73.58,75.00,71.76,72.01,72.20,73.17,72.08,73.68,75.20,72.29,
+73.02,71.49,74.41,74.71,76.76,76.13,75.65,72.19,74.81,74.18,
+73.86,76.05,73.80,75.40,77.86,76.82,74.68,77.10,74.38,77.01,
+13.22,14.41,14.15,15.31,16.79,16.76,17.49,16.77,17.44,18.99,
+18.86,19.72,20.96,20.21,20.13,20.52,21.71,21.94,22.29,23.23,
+22.27,24.05,23.85,24.47,25.67,25.37,25.26,25.99,26.31,26.37,
+26.50,27.64,29.23,28.73,28.52,28.37,28.02,28.64,29.30,29.45,
+28.98,30.53,30.02,30.74,31.44,31.17,31.40,31.53,32.36,32.52,
+32.82,32.07,34.50,34.37,33.89,35.33,35.23,34.73,36.52,34.18,
+34.36,36.94,36.94,35.13,36.10,36.18,38.63,37.04,37.36,37.74,
+37.16,39.09,38.42,39.11,38.55,39.00,38.45,40.63,39.87,36.28,
+41.61,41.34,38.56,39.94,41.62,40.91,41.01,39.94,42.26,42.37,
+43.76,41.61,44.13,43.66,42.74,43.11,42.89,44.07,44.90,44.71,
+45.71,44.98,44.37,43.87,45.82,44.86,44.88,45.52,43.67,47.15,
+47.56,44.74,47.43,46.10,45.45,46.30,46.42,48.15,48.18,47.40,
+48.94,48.90,48.98,47.37,49.49,48.81,50.64,50.68,49.47,50.62,
+50.32,49.15,50.75,50.33,51.55,49.65,51.00,52.58,50.33,54.16,
+50.11,52.28,50.39,51.40,52.17,52.77,53.23,50.58,51.76,55.02,
+53.23,52.58,53.07,53.09,56.28,55.66,55.08,56.85,54.84,54.61,
+54.15,55.04,56.73,56.34,56.16,57.54,56.01,55.53,57.43,55.94,
+58.52,55.38,55.59,57.42,57.67,56.10,56.04,58.30,57.40,59.05,
+59.50,59.46,58.93,58.96,60.89,61.23,60.14,61.69,59.02,60.26,
+57.96,61.14,60.95,61.14,59.60,59.87,62.32,61.84,59.49,59.92,
+60.68,63.15,63.05,60.63,63.46,64.33,62.06,62.76,61.51,62.06,
+60.78,66.11,62.55,64.46,62.31,63.83,66.51,65.28,61.83,65.15,
+62.62,62.94,63.31,63.71,66.15,66.44,65.31,64.75,64.20,66.59,
+66.36,67.04,64.44,66.84,64.05,65.67,61.71,63.86,65.55,67.81,
+67.07,66.93,66.83,69.33,68.86,67.89,69.50,65.63,69.85,69.69,
+68.30,69.27,70.98,66.90,69.37,68.12,67.80,67.72,67.41,69.88,
+71.26,69.95,68.74,69.25,72.22,69.44,71.61,69.68,71.63,70.10,
+70.12,70.29,73.18,70.74,73.60,69.19,73.99,72.60,71.37,73.16,
+75.04,72.85,71.89,71.34,70.28,73.33,69.73,72.85,70.93,72.64,
+13.30,13.71,14.07,14.02,15.68,15.50,16.37,16.62,16.82,17.31,
+17.71,19.04,19.20,19.70,19.51,20.34,20.39,21.14,20.81,22.58,
+22.68,23.60,22.66,23.02,23.43,23.91,23.52,25.18,24.64,26.16,
+24.61,25.47,26.66,26.65,25.90,26.42,26.61,26.94,27.54,28.05,
+28.75,28.08,29.79,28.58,29.12,29.23,29.71,30.56,29.79,30.85,
+31.59,31.86,32.53,31.01,32.38,33.23,33.37,33.32,33.87,31.74,
+33.39,33.89,33.65,34.38,35.17,36.79,36.02,35.18,35.91,36.17,
+34.46,35.98,36.64,36.41,36.49,37.40,35.32,37.85,37.55,37.53,
+36.97,38.79,37.97,39.43,39.33,39.94,38.93,39.76,39.48,40.63,
+39.05,41.91,40.77,41.72,40.67,39.46,40.55,41.92,41.76,42.09,
+40.91,42.33,43.09,42.70,41.57,43.47,42.69,43.72,44.45,44.73,
+43.56,43.99,42.94,45.00,43.29,43.63,45.16,44.05,45.71,46.55,
+43.47,46.41,45.90,45.43,49.31,48.56,46.87,47.26,48.41,47.01,
+47.89,47.87,46.83,46.93,48.04,47.21,47.33,47.94,47.20,49.19,
+48.63,48.45,50.22,50.86,48.76,49.84,50.71,48.67,50.38,50.97,
+50.50,51.56,50.74,51.65,50.22,50.77,53.05,50.46,51.04,53.43,
+51.70,52.45,51.45,49.92,52.27,53.20,54.16,52.77,53.51,54.72,
+56.33,54.04,53.38,54.80,55.03,55.75,55.50,53.59,56.00,56.70,
+53.50,53.26,55.25,56.66,56.07,56.60,57.51,57.64,57.18,57.39,
+55.50,56.20,57.57,57.01,58.17,58.27,56.65,57.50,55.78,55.79,
+59.83,55.67,58.43,59.70,59.91,57.61,60.18,58.99,60.00,58.41,
+60.93,58.77,58.85,62.53,58.64,61.28,57.74,60.64,59.50,64.01,
+58.48,60.13,62.97,64.37,62.01,61.75,63.13,61.98,60.56,62.85,
+62.13,62.39,61.56,63.50,61.97,62.49,64.22,64.18,62.56,64.70,
+62.89,64.59,60.42,67.32,62.28,63.24,64.17,64.11,64.86,62.90,
+62.79,65.91,66.27,66.72,66.02,64.33,65.18,63.41,64.08,65.46,
+63.68,64.22,69.05,67.56,65.02,68.36,67.77,67.34,66.93,66.12,
+69.25,68.61,67.48,65.96,67.37,66.52,67.78,67.38,69.22,66.61,
+67.70,69.93,72.07,66.64,68.99,69.38,68.75,70.17,73.36,68.72,
+11.87,12.84,13.35,13.99,14.26,14.93,14.99,15.59,17.27,17.25,
+16.13,18.47,17.90,17.79,18.65,18.75,19.07,19.70,19.70,20.15,
+20.75,21.00,20.79,21.14,23.51,24.15,22.49,23.70,23.38,23.85,
+22.81,24.08,25.57,25.38,25.37,26.05,25.57,26.16,26.02,26.96,
+27.75,27.69,26.67,26.98,27.24,27.52,27.73,29.35,29.44,29.25,
+29.38,29.63,30.24,29.57,30.95,31.80,30.32,31.05,32.27,31.23,
+32.97,32.43,33.31,31.44,34.10,33.71,32.44,34.10,32.69,34.23,
+33.17,33.85,34.69,33.73,35.55,35.85,34.81,35.81,36.53,37.25,
+34.27,33.87,37.39,35.52,37.73,38.97,37.72,38.60,36.57,38.33,
+37.71,38.75,37.95,37.48,39.56,39.11,39.02,38.87,39.11,39.31,
+38.55,39.26,39.83,40.25,40.42,40.36,41.15,39.84,41.29,43.24,
+42.19,41.44,41.13,42.27,40.77,42.02,43.37,43.11,43.16,41.54,
+43.42,43.51,41.34,45.66,44.92,43.44,43.68,44.26,45.47,45.51,
+44.98,43.89,45.44,48.53,46.56,48.25,46.52,46.36,44.44,47.14,
+46.19,45.90,45.87,47.68,45.13,45.84,45.57,47.62,48.05,49.11,
+46.63,46.32,47.11,50.23,48.53,49.34,49.29,48.34,49.17,50.97,
+48.12,50.18,49.99,49.40,48.15,48.08,51.27,49.85,51.30,50.99,
+52.01,49.62,51.64,51.49,53.24,52.69,51.24,51.64,52.76,53.71,
+54.09,53.82,52.88,50.61,52.19,52.85,53.84,52.51,55.18,52.32,
+51.30,52.12,56.50,56.03,52.98,55.35,53.38,54.82,53.95,54.15,
+54.34,54.43,55.74,54.44,55.26,55.74,55.84,56.98,56.02,57.23,
+55.42,54.02,57.55,58.00,55.14,57.31,56.92,58.30,53.76,56.25,
+58.32,57.81,56.82,55.84,58.58,56.99,57.36,58.42,61.36,59.63,
+57.37,60.88,59.28,57.81,59.16,60.73,57.44,61.72,58.62,59.64,
+61.33,59.99,61.60,62.31,61.25,58.75,60.52,58.01,63.49,59.28,
+60.22,60.67,64.14,59.29,63.10,59.87,62.25,61.00,60.99,60.19,
+59.44,61.12,62.97,62.34,61.94,64.62,62.30,63.91,63.03,64.85,
+63.72,65.34,63.91,61.57,63.94,64.35,64.87,63.65,61.72,61.74,
+63.85,64.47,65.78,63.46,66.69,63.06,63.58,63.80,63.74,64.78,
+11.46,11.44,12.63,13.28,14.14,14.32,14.62,14.82,15.50,16.25,
+16.01,16.32,17.11,17.51,17.45,18.85,18.59,19.17,19.96,19.69,
+18.83,20.20,20.56,21.29,20.50,20.56,21.37,20.95,22.00,21.76,
+22.49,23.39,22.12,23.00,23.59,24.11,24.33,23.09,25.05,24.82,
+25.01,25.50,24.93,26.80,25.81,26.91,27.68,27.70,26.93,27.81,
+27.55,27.99,27.40,27.27,27.90,28.51,28.17,28.61,29.33,29.77,
+30.13,30.79,29.94,29.47,30.70,30.52,30.84,30.13,30.31,32.14,
+32.36,32.44,31.51,32.25,32.11,32.94,32.99,32.99,34.15,33.73,
+33.32,33.33,33.13,34.28,35.32,33.48,35.32,34.76,33.75,35.62,
+36.61,35.72,36.05,36.50,35.94,36.24,36.05,35.93,38.44,36.84,
+38.28,38.01,36.37,37.57,37.60,38.35,38.57,40.33,38.10,37.23,
+39.93,38.64,39.72,40.34,38.64,41.29,39.14,42.00,38.65,40.22,
+41.41,41.00,42.08,38.66,40.48,40.19,41.29,42.48,40.49,41.14,
+43.54,40.87,43.84,41.50,42.45,42.81,42.65,43.87,42.12,43.47,
+41.84,44.14,43.26,42.80,43.12,43.88,45.96,44.67,43.92,45.37,
+44.46,45.30,44.71,45.41,45.51,44.99,45.82,46.69,45.49,46.45,
+46.75,46.08,47.45,47.27,45.60,48.37,46.72,46.54,46.91,47.05,
+47.99,47.49,47.43,46.06,49.28,49.07,50.88,47.36,49.27,47.87,
+49.51,49.02,49.44,47.66,51.13,51.21,49.25,50.19,48.90,49.93,
+48.67,51.39,50.70,51.15,51.56,51.25,50.72,53.20,48.42,51.06,
+52.00,52.89,51.67,53.27,51.34,51.07,52.15,51.20,51.42,51.30,
+52.25,51.30,53.23,53.49,54.77,51.59,56.08,54.67,56.74,51.98,
+55.50,53.35,55.31,53.10,54.67,52.75,51.93,54.77,55.15,55.91,
+56.13,53.58,55.12,56.71,54.31,56.29,55.45,56.56,55.21,53.85,
+55.03,55.93,56.76,56.20,57.22,54.94,57.17,57.01,57.20,57.50,
+57.16,58.40,56.10,56.88,58.91,58.63,59.25,57.42,60.09,58.18,
+59.33,59.64,56.19,56.90,59.22,62.49,58.83,61.21,58.72,58.96,
+57.16,59.96,59.45,60.17,59.96,58.63,60.37,60.46,61.84,59.73,
+60.61,58.26,60.58,60.75,62.50,61.13,61.45,64.33,64.49,62.57,
+11.37,11.29,11.49,12.04,11.95,13.27,13.27,13.65,13.94,15.11,
+14.84,14.78,16.19,15.47,16.37,15.88,17.15,17.70,17.66,17.85,
+18.55,17.85,18.86,19.24,19.44,19.00,19.52,20.37,21.22,20.93,
+20.69,20.69,22.07,21.55,21.00,21.38,21.97,21.97,21.35,23.12,
+23.87,23.73,24.45,24.17,24.45,23.69,25.07,25.76,26.22,24.88,
+25.65,25.54,25.18,25.69,26.99,26.80,26.91,27.24,27.73,27.59,
+27.96,28.27,28.73,27.39,27.97,27.54,29.98,29.36,29.56,29.74,
+29.11,30.28,29.05,30.79,29.69,30.18,30.29,30.86,30.49,30.55,
+30.83,30.84,31.15,31.34,32.11,32.50,32.07,31.31,31.56,32.88,
+33.47,34.86,32.99,32.67,32.90,34.19,33.82,34.31,34.39,35.70,
+33.36,35.95,34.68,35.12,35.15,36.94,33.89,37.20,35.22,35.93,
+37.59,36.84,36.84,35.41,35.48,36.80,36.89,36.64,37.23,37.65,
+37.18,36.48,37.47,38.15,35.98,38.84,36.84,38.34,38.30,39.11,
+39.63,39.18,39.76,39.57,37.55,38.72,39.50,39.75,39.09,39.64,
+41.31,40.41,41.22,41.31,41.15,40.81,38.47,41.90,42.63,42.27,
+41.44,41.66,42.24,42.42,43.54,44.19,41.09,44.70,43.05,43.20,
+41.72,42.55,43.73,45.19,43.34,44.59,43.79,43.17,41.74,43.32,
+43.73,43.92,45.15,43.78,46.01,45.18,44.02,44.45,46.90,46.46,
+47.07,45.07,45.09,46.95,44.58,44.65,46.16,43.96,48.36,46.49,
+45.79,46.58,44.23,47.74,45.40,45.99,45.59,45.70,46.52,48.19,
+48.75,48.01,48.84,48.59,49.49,47.73,47.68,49.26,49.18,47.89,
+47.30,47.73,48.34,50.21,49.04,50.42,51.42,50.57,48.62,48.83,
+49.48,49.17,50.23,50.28,49.94,48.61,51.34,52.77,48.57,50.44,
+51.78,51.62,50.82,52.01,53.09,48.48,49.97,51.07,52.77,53.01,
+51.86,52.01,54.73,52.93,54.67,52.33,54.37,52.75,53.30,53.93,
+51.26,54.36,53.12,53.86,54.45,51.32,53.70,57.32,53.77,54.34,
+56.06,52.82,54.05,57.67,53.82,55.95,53.79,54.87,55.53,55.36,
+55.54,54.64,54.00,58.66,54.80,53.40,56.76,55.11,56.18,53.99,
+55.58,59.16,56.42,56.04,54.28,55.15,58.12,55.64,57.50,58.78,
+9.99,10.50,11.15,11.97,11.51,11.70,13.08,12.11,12.63,13.28,
+14.04,13.98,13.93,14.42,14.38,15.35,15.51,15.49,16.30,16.85,
+16.88,17.72,17.07,17.68,18.27,17.07,18.65,18.26,19.96,18.93,
+18.96,20.12,19.56,20.38,19.70,21.63,20.55,20.99,21.03,21.31,
+21.32,22.11,22.10,23.55,22.26,22.32,23.22,23.52,23.39,22.53,
+23.56,24.07,23.58,24.66,23.54,25.08,24.67,25.48,26.93,25.98,
+26.59,25.01,26.81,26.54,25.66,26.85,26.17,25.78,26.46,26.64,
+27.51,29.01,28.20,26.87,28.04,28.07,27.64,27.95,28.25,28.25,
+28.79,29.05,29.48,28.95,27.64,30.29,30.24,30.75,31.29,29.15,
+29.48,30.03,30.46,31.93,30.63,31.94,31.09,29.99,32.42,32.54,
+30.43,31.96,31.83,31.24,32.69,31.67,31.95,33.16,32.56,33.64,
+33.80,33.70,33.47,33.52,33.76,35.79,32.96,34.92,35.27,36.53,
+34.87,34.93,35.43,35.27,36.19,36.54,35.10,35.47,35.07,34.81,
+37.36,35.91,36.31,35.30,36.41,36.85,35.89,35.14,37.60,37.36,
+38.12,36.88,37.52,38.05,37.93,38.33,39.14,38.41,37.74,37.61,
+37.84,37.39,38.69,38.49,37.71,36.51,39.09,39.07,40.39,40.05,
+40.15,39.38,39.13,38.00,39.67,41.57,39.76,39.44,41.18,39.30,
+41.27,40.04,42.19,40.44,41.10,41.54,42.02,42.26,41.97,41.45,
+41.67,43.00,42.17,42.51,43.92,42.06,42.62,43.93,43.34,44.41,
+45.02,42.93,43.64,42.47,44.56,43.24,43.30,43.78,44.31,45.12,
+43.84,43.45,44.79,45.50,43.85,44.67,43.04,47.24,45.12,43.78,
+45.08,45.18,45.14,45.87,46.88,46.44,46.86,47.48,45.83,47.92,
+46.89,45.65,45.39,45.78,46.97,46.06,46.26,46.19,47.07,46.80,
+47.30,49.80,48.26,47.96,46.36,47.90,47.36,47.82,46.54,46.59,
+48.50,48.37,46.96,49.38,47.48,50.11,49.28,50.35,48.56,49.11,
+47.78,50.33,50.33,47.99,48.43,49.76,49.93,50.33,50.23,48.50,
+49.95,48.14,49.80,50.52,50.02,50.75,52.41,48.97,52.34,52.60,
+52.72,50.51,51.13,52.42,51.12,50.32,51.92,51.83,52.51,53.69,
+51.81,52.56,51.85,52.58,53.08,52.19,51.14,54.55,51.98,54.21,
+9.38,9.31,9.39,9.74,10.66,11.07,11.25,11.82,12.44,12.60,
+12.51,13.31,13.61,13.36,14.05,13.88,14.54,14.61,15.09,14.83,
+15.78,15.53,16.17,16.34,17.44,16.76,16.28,17.96,17.27,17.42,
+18.13,18.35,18.33,19.15,19.28,18.89,19.90,20.22,19.46,19.60,
+20.28,20.93,18.44,21.19,21.16,20.54,20.40,21.29,21.45,22.97,
+21.68,23.15,21.39,23.21,23.01,22.88,21.80,23.53,22.82,23.27,
+24.10,24.32,23.87,22.92,23.86,24.88,24.52,24.29,25.74,25.12,
+26.34,25.68,26.20,25.77,25.67,27.19,26.02,25.80,25.28,26.97,
+26.66,25.88,26.11,27.89,27.15,26.54,26.82,28.07,28.28,27.57,
+27.29,27.38,27.97,27.67,28.74,29.07,28.80,29.35,30.37,30.15,
+29.99,30.07,30.16,30.89,30.45,30.12,30.55,29.25,31.82,31.63,
+31.05,31.36,30.98,30.66,32.93,31.01,30.88,31.22,31.75,31.68,
+31.96,32.27,32.30,32.28,32.70,33.24,32.97,33.33,33.27,32.02,
+32.32,33.80,32.45,33.17,33.29,34.61,33.48,34.35,33.56,34.25,
+32.83,33.63,34.44,34.35,36.59,34.68,36.91,35.72,35.91,35.63,
+34.76,34.38,36.87,36.55,36.46,36.70,35.41,35.66,36.12,36.22,
+36.74,36.17,35.74,37.99,36.17,35.97,36.76,36.67,36.61,37.57,
+36.62,37.49,38.01,38.83,38.43,37.27,38.55,39.23,38.74,40.21,
+39.77,38.68,38.32,38.36,38.71,38.51,39.56,40.86,40.06,39.37,
+39.49,40.52,37.24,39.71,39.79,39.52,40.35,40.51,42.08,40.06,
+41.04,40.65,41.55,43.04,40.77,38.56,40.47,39.34,41.96,41.11,
+41.27,43.33,41.70,41.04,42.55,42.58,40.04,43.00,42.27,40.73,
+43.18,41.05,43.15,43.04,43.29,42.71,43.86,42.62,43.56,43.75,
+44.56,44.54,43.60,43.85,45.22,42.59,44.45,43.37,43.52,44.39,
+42.62,46.61,44.62,44.73,45.82,45.33,43.38,44.38,45.06,46.31,
+45.94,46.32,44.64,44.18,44.86,46.20,46.05,48.64,45.12,45.91,
+47.94,46.76,47.38,47.38,44.94,46.87,46.73,47.71,46.15,46.72,
+47.22,47.36,46.59,47.58,48.23,47.68,47.01,47.25,48.39,48.01,
+49.46,45.92,45.21,48.05,48.61,46.78,50.03,46.47,50.15,49.01,
+7.87,8.78,8.76,9.91,9.68,10.41,9.72,10.17,10.95,12.19,
+12.43,11.67,11.82,12.83,12.88,13.62,13.16,14.04,14.29,14.40,
+13.89,15.27,14.73,15.25,14.46,15.64,15.47,16.19,15.67,16.28,
+17.17,16.33,16.36,17.71,17.07,17.37,17.82,17.49,17.57,18.58,
+17.90,19.21,18.46,18.55,18.94,18.82,19.16,20.13,19.77,20.30,
+20.49,20.69,21.12,20.24,19.73,20.05,20.99,21.04,21.93,21.56,
+20.74,22.69,22.21,22.89,21.88,22.66,22.90,22.31,23.00,23.86,
+23.35,23.39,22.67,23.43,24.45,23.44,24.30,24.18,24.76,24.59,
+24.08,25.21,25.10,25.97,26.58,24.94,25.81,25.25,26.31,25.98,
+25.25,25.83,26.35,26.05,27.14,25.54,27.19,26.24,27.34,27.17,
+27.57,26.41,27.46,27.59,28.10,27.37,26.84,27.54,26.74,27.33,
+28.39,28.37,27.47,28.65,27.18,30.39,29.13,29.85,28.65,28.79,
+30.57,30.44,29.61,29.20,29.94,28.12,30.33,29.24,30.13,30.99,
+30.33,30.18,31.12,31.04,29.35,31.84,32.43,29.82,31.63,30.46,
+31.66,32.57,31.52,31.59,32.90,30.78,32.12,33.65,32.26,32.30,
+32.74,33.82,32.03,31.31,33.92,32.18,33.16,33.91,33.00,32.49,
+33.98,32.72,33.95,33.63,33.91,34.06,34.35,33.17,34.17,34.83,
+34.95,33.71,34.40,37.03,35.41,35.18,34.68,36.66,35.11,36.08,
+37.67,36.97,37.75,34.10,35.12,35.54,35.70,36.46,36.32,36.59,
+34.93,35.77,36.14,37.23,36.68,34.66,38.17,37.72,36.41,36.79,
+37.66,38.33,39.40,37.88,39.18,37.23,38.79,36.90,38.11,37.31,
+37.47,38.42,35.93,38.88,38.58,37.57,40.15,39.98,38.85,40.27,
+38.44,39.73,40.22,38.28,38.45,37.64,40.56,40.92,39.40,40.81,
+39.12,38.58,40.59,40.35,40.64,39.98,39.85,40.25,40.94,39.16,
+40.93,41.42,39.88,39.50,41.80,41.53,40.35,41.02,43.24,42.96,
+41.18,40.01,41.07,42.12,42.07,41.96,42.60,40.51,40.95,42.16,
+41.07,43.68,41.28,42.56,40.39,42.43,43.86,41.80,43.26,42.02,
+42.65,42.46,43.71,43.50,44.30,45.31,44.60,41.54,43.38,42.43,
+43.66,43.15,44.46,43.50,45.34,43.53,43.03,45.41,43.80,45.76,
+7.41,8.46,7.87,8.73,8.89,9.37,9.90,10.16,10.46,10.87,
+11.04,11.39,11.36,11.75,11.89,11.29,12.09,12.54,12.90,12.57,
+13.60,14.23,14.21,13.49,14.09,14.62,14.19,13.68,13.97,14.76,
+14.79,14.60,15.46,15.74,15.19,16.65,15.88,16.32,16.63,16.24,
+16.66,16.42,16.66,17.44,17.10,17.95,17.48,17.52,18.11,18.80,
+18.43,19.57,18.87,18.62,18.74,18.61,19.36,19.62,19.08,20.02,
+19.57,19.89,19.14,19.73,20.31,20.55,20.28,20.22,21.12,21.89,
+20.49,21.46,20.95,21.57,20.18,22.66,22.37,20.85,22.52,22.09,
+22.76,22.73,22.55,23.01,23.05,23.02,22.59,23.67,22.64,22.80,
+24.35,23.81,23.50,24.44,23.74,24.79,25.31,24.43,25.00,25.10,
+24.74,24.89,25.26,25.15,26.72,25.72,26.12,25.57,25.77,25.89,
+25.12,25.60,25.80,25.84,26.26,25.06,26.95,26.75,26.24,26.83,
+27.12,26.92,26.58,26.48,28.67,27.69,28.23,27.22,27.91,27.57,
+27.46,28.48,27.93,29.59,28.46,28.78,27.96,27.89,29.14,28.52,
+29.06,29.68,29.99,28.57,29.83,29.33,29.11,28.54,28.92,29.83,
+29.25,30.53,30.55,28.91,29.03,31.48,31.27,31.39,30.64,30.27,
+30.07,30.77,31.24,30.79,31.08,33.12,31.98,30.61,31.12,30.40,
+30.72,30.44,32.32,32.61,31.55,33.24,31.39,33.81,33.23,32.28,
+31.29,33.18,34.19,32.15,34.67,33.64,32.63,33.60,33.43,34.12,
+33.38,34.30,34.89,34.38,33.15,33.47,33.39,34.29,35.30,33.83,
+35.62,34.02,33.39,35.97,35.42,36.02,32.88,34.48,36.66,34.75,
+35.13,34.45,37.16,35.16,35.05,37.22,37.31,33.68,35.54,33.39,
+34.91,35.49,35.06,36.50,35.81,36.85,36.15,36.22,36.72,36.95,
+37.31,36.38,36.43,37.92,36.62,36.42,38.03,37.03,36.57,37.09,
+39.21,36.48,37.03,36.23,37.58,36.85,38.47,37.17,38.19,40.35,
+37.40,39.24,36.49,37.27,38.75,37.94,39.02,39.40,38.72,37.15,
+38.14,38.64,39.15,39.98,38.02,39.15,37.58,38.47,38.83,40.69,
+39.75,38.42,39.03,40.36,40.68,41.23,39.37,39.27,40.40,39.98,
+39.47,40.88,40.17,39.43,42.76,40.77,39.55,41.89,40.09,40.17,
+6.95,7.11,6.95,7.92,8.02,8.20,8.52,9.33,8.86,9.52,
+10.34,9.93,9.74,11.00,9.75,10.51,11.07,11.51,11.37,12.23,
+11.09,12.35,12.63,11.81,12.29,13.02,12.70,13.18,13.39,13.33,
+13.45,13.76,13.20,13.54,13.84,14.71,15.38,15.59,14.63,14.82,
+15.31,15.15,16.28,15.24,14.75,16.22,15.56,15.60,16.28,16.56,
+17.12,17.02,16.82,17.10,17.00,18.38,17.38,17.28,18.18,18.62,
+19.34,18.94,17.62,18.26,19.41,19.07,18.94,18.85,19.40,19.04,
+19.31,19.07,19.64,20.17,21.75,20.93,18.53,20.88,19.56,20.42,
+21.37,20.73,21.15,21.62,21.17,22.86,19.81,21.42,22.04,21.84,
+21.90,22.12,21.42,21.48,20.89,22.59,22.42,23.04,22.72,23.20,
+23.12,22.67,23.01,23.67,23.90,22.14,23.47,23.02,23.02,22.95,
+24.26,22.76,23.10,23.72,24.63,24.05,24.08,24.34,25.17,24.39,
+24.63,25.41,24.97,25.30,25.09,25.55,24.60,25.16,24.64,26.60,
+25.94,25.46,26.03,26.80,26.14,27.43,26.29,26.28,26.56,27.25,
+25.11,26.38,27.77,27.77,27.24,27.34,26.21,27.59,26.51,26.72,
+26.93,27.01,27.24,27.59,28.13,27.45,26.57,28.51,28.13,27.10,
+27.06,28.69,28.66,29.03,29.29,29.21,27.45,29.79,29.03,29.03,
+28.26,29.07,27.76,29.15,29.42,30.37,29.05,28.80,28.26,29.90,
+29.48,29.86,29.13,29.60,31.52,29.07,31.90,30.15,31.86,29.50,
+30.35,30.17,30.83,32.17,31.15,29.73,31.32,31.33,29.97,30.56,
+31.95,31.12,30.92,31.45,31.86,31.55,33.09,31.83,31.72,32.47,
+31.58,31.41,31.79,32.52,32.79,32.34,31.98,32.27,31.96,31.78,
+33.11,32.13,33.45,32.51,33.57,32.87,33.08,35.18,31.86,33.50,
+33.27,35.30,34.70,33.14,33.72,33.44,33.97,33.71,33.57,34.03,
+33.56,35.33,35.28,35.06,34.73,34.39,34.87,35.85,35.10,34.70,
+33.82,34.83,33.68,34.13,33.80,34.53,34.57,35.10,35.50,34.91,
+34.88,34.52,33.44,35.00,35.42,35.68,35.11,36.34,34.40,35.54,
+36.57,36.48,36.56,37.63,36.26,35.30,35.22,36.53,37.76,35.10,
+36.94,37.41,34.87,36.71,36.68,38.44,37.54,36.61,38.75,37.50,
+6.25,7.11,6.37,7.54,7.13,8.03,7.52,8.27,8.58,8.62,
+9.28,8.68,10.00,9.86,9.33,9.50,10.38,9.98,12.19,11.09,
+10.35,11.10,11.01,11.73,11.87,12.34,11.94,13.11,11.85,12.14,
+12.22,13.43,13.02,12.78,13.52,12.86,13.17,13.02,13.79,13.95,
+14.44,14.34,14.49,14.87,14.75,14.47,14.55,14.83,15.02,14.67,
+14.91,15.46,15.50,16.05,14.92,16.74,15.71,16.07,16.21,16.16,
+16.39,16.82,16.82,15.91,16.00,17.40,17.16,16.87,16.77,17.58,
+17.02,17.13,17.17,17.35,17.36,17.18,18.59,18.41,18.77,19.18,
+18.90,18.22,19.14,18.63,18.80,18.99,19.40,18.57,19.62,19.74,
+19.92,19.39,19.40,20.53,19.38,19.93,20.93,21.78,20.95,20.21,
+20.40,21.88,20.35,20.74,21.03,21.97,21.77,22.13,20.27,21.13,
+21.62,21.96,21.72,22.04,22.46,22.08,22.87,21.55,22.42,22.39,
+22.06,22.71,22.68,22.23,22.22,23.82,22.72,22.41,23.05,23.78,
+24.47,23.77,23.20,24.02,23.25,24.06,22.87,23.23,23.59,24.83,
+23.56,24.45,24.25,26.30,24.18,23.76,23.56,24.38,24.05,24.48,
+24.26,25.43,24.60,25.42,25.37,25.31,25.66,24.24,27.13,24.54,
+26.33,26.00,26.41,25.73,26.35,26.60,25.52,25.91,27.33,26.80,
+25.64,26.64,25.32,26.01,26.17,26.30,26.39,25.72,27.41,27.29,
+26.25,26.21,27.32,26.73,27.28,27.86,26.63,28.55,26.45,27.65,
+28.84,28.18,28.41,28.15,27.34,27.64,28.89,27.17,28.54,28.24,
+27.26,27.00,28.74,28.41,30.74,28.58,28.63,28.84,27.92,27.81,
+28.84,29.80,29.48,29.99,29.52,28.99,29.28,30.39,29.06,29.86,
+28.84,28.89,30.00,29.94,30.63,30.15,29.61,30.70,29.76,29.35,
+30.78,31.10,30.88,30.33,30.13,31.18,31.08,31.01,31.47,32.01,
+30.44,31.02,32.17,30.55,31.90,30.37,31.87,30.66,31.87,31.10,
+30.91,32.71,32.65,31.94,30.80,30.94,32.31,33.18,32.04,33.09,
+33.04,31.68,33.39,31.92,33.83,32.36,31.30,31.29,33.36,33.30,
+32.43,31.56,32.95,32.97,33.82,33.48,31.99,33.95,33.55,32.67,
+33.78,32.43,34.16,33.18,32.98,34.52,33.68,33.66,34.89,34.54,
+5.91,5.87,6.26,6.73,6.49,7.10,6.63,7.49,7.19,8.15,
+8.66,8.61,8.41,8.41,7.75,9.09,8.84,9.67,9.17,9.16,
+9.17,9.65,10.16,9.35,10.35,9.87,10.84,11.03,10.28,10.67,
+11.44,11.56,11.41,12.35,11.95,11.73,12.06,11.74,12.57,12.86,
+12.67,11.78,13.01,12.93,12.81,13.55,13.05,13.01,13.99,14.18,
+14.61,14.42,13.46,14.59,14.67,15.14,14.35,14.84,15.40,14.37,
+14.45,15.39,15.42,14.99,15.25,15.24,14.69,15.22,15.27,16.53,
+15.54,16.73,15.75,15.84,16.34,17.70,16.29,16.74,16.99,17.10,
+17.59,17.65,17.24,16.74,17.65,17.71,18.74,18.05,17.57,18.74,
+17.17,17.61,17.90,17.74,19.15,18.39,18.73,17.41,19.33,18.06,
+17.74,18.64,20.29,19.00,17.88,19.35,18.45,19.47,19.57,19.51,
+19.25,19.14,20.13,20.68,19.32,20.90,19.84,19.50,21.23,20.11,
+20.26,19.76,19.42,20.62,19.87,20.39,21.57,21.59,22.18,21.79,
+21.22,21.03,20.56,21.83,21.55,21.09,21.65,22.34,21.57,20.97,
+22.06,21.82,22.95,22.29,23.02,22.43,22.47,22.03,23.34,22.80,
+22.72,22.34,22.50,24.48,23.29,22.94,23.71,23.05,23.86,23.43,
+24.67,23.08,22.64,23.72,24.55,23.89,23.41,24.22,22.97,24.76,
+23.22,25.25,23.72,23.74,23.76,23.83,24.07,24.90,23.58,24.80,
+25.05,25.41,25.34,25.85,24.84,25.33,24.86,25.11,25.02,24.23,
+24.95,24.70,24.61,25.79,25.08,25.32,26.75,26.08,25.22,24.69,
+25.90,26.82,24.83,26.66,25.97,24.93,26.51,26.95,25.67,25.36,
+26.02,25.85,25.53,27.59,27.09,26.91,26.65,25.88,27.28,27.16,
+26.88,26.25,28.65,26.68,26.43,26.79,26.81,26.89,27.58,26.56,
+27.57,27.85,27.27,28.86,27.60,27.06,28.40,28.22,28.19,28.76,
+29.46,28.26,28.07,27.39,29.37,28.14,28.74,28.09,29.01,28.86,
+29.49,28.54,29.02,28.77,27.75,29.09,29.12,29.78,27.47,28.72,
+29.34,29.09,29.46,29.15,28.84,30.71,29.01,28.77,28.98,30.17,
+30.99,29.88,31.07,29.22,30.00,30.03,30.86,29.80,29.08,29.95,
+30.09,31.60,30.15,29.93,30.79,30.65,30.25,31.38,29.98,31.93,
+5.12,5.46,6.01,5.13,6.12,5.91,6.47,6.81,6.87,7.27,
+7.27,7.21,7.80,7.43,7.80,7.79,7.75,9.40,8.11,9.03,
+8.93,9.23,9.05,9.39,9.24,9.54,10.30,10.74,9.85,9.52,
+10.51,9.14,10.08,10.75,10.53,10.98,10.66,11.68,11.78,11.76,
+10.61,11.76,11.93,11.35,12.40,12.01,11.02,12.47,12.30,12.58,
+12.10,11.94,12.63,12.80,12.46,13.09,13.43,13.22,14.13,12.45,
+12.03,14.50,13.40,12.97,14.04,13.82,14.89,14.85,13.92,14.30,
+14.30,14.65,14.93,14.41,14.03,14.90,15.00,14.15,14.79,16.05,
+15.76,15.00,14.82,15.42,14.82,16.27,15.93,16.13,15.38,16.16,
+15.50,15.55,15.16,16.93,16.00,15.79,16.37,16.41,17.82,16.59,
+16.56,17.64,16.98,17.42,17.79,16.96,18.19,17.13,16.13,17.18,
+17.97,18.52,17.40,17.34,18.28,17.85,18.40,18.64,18.63,17.47,
+17.33,20.45,18.49,18.14,17.21,18.08,18.74,18.79,18.95,17.55,
+19.35,19.98,18.27,19.68,19.55,18.39,19.60,19.82,19.54,19.42,
+18.88,19.76,21.17,19.85,20.11,19.50,20.71,19.42,20.61,19.48,
+21.39,19.79,20.46,21.13,21.51,20.82,21.36,20.91,21.01,21.10,
+21.86,20.83,20.71,21.31,20.77,21.26,21.86,22.65,21.29,21.52,
+22.12,22.19,21.51,22.99,21.58,22.33,21.62,22.82,23.08,22.65,
+21.71,23.15,22.23,22.05,21.87,23.46,23.32,24.20,22.67,22.94,
+22.40,22.16,23.12,23.75,22.56,23.04,23.73,25.11,22.96,24.79,
+21.74,22.24,23.55,23.17,22.92,23.14,25.67,24.20,23.91,24.75,
+24.80,23.56,25.25,23.50,23.85,22.72,24.72,24.18,23.84,25.62,
+24.50,25.70,24.73,24.55,25.15,24.74,24.81,24.32,25.87,25.82,
+24.14,25.94,24.31,25.89,25.01,25.13,25.26,24.53,26.18,25.72,
+26.31,26.57,25.21,25.22,25.43,26.44,27.34,25.86,26.19,25.83,
+27.74,26.54,27.42,25.85,26.83,26.20,25.41,25.61,26.13,26.19,
+26.89,25.76,26.60,27.01,26.64,26.59,26.97,27.10,27.28,27.94,
+27.41,28.12,25.94,27.18,26.68,26.07,27.55,26.82,27.54,26.10,
+27.13,26.74,27.28,27.17,27.67,28.56,26.84,27.89,28.37,27.85,
+15.05,15.98,16.71,17.57,17.89,18.79,19.32,19.80,19.22,20.50,
+21.36,21.40,22.23,22.60,22.95,24.06,24.96,24.22,25.91,26.07,
+25.67,27.46,27.88,26.93,26.86,27.35,27.76,28.60,29.77,29.97,
+30.44,30.83,30.15,30.34,32.39,31.85,31.93,32.88,32.33,33.32,
+33.91,33.26,33.73,34.49,35.34,34.25,35.05,35.28,35.34,36.04,
+35.22,36.63,37.43,38.20,37.27,38.16,38.53,38.12,39.05,38.04,
+39.22,39.54,40.25,39.26,40.62,41.29,40.87,40.65,39.16,42.28,
+42.40,43.27,42.75,44.31,41.72,42.69,43.10,44.39,44.62,43.54,
+43.40,44.01,47.60,44.78,45.15,46.10,46.63,47.65,46.32,46.55,
+47.79,47.49,48.27,50.13,47.34,48.25,50.47,47.67,49.36,49.67,
+49.95,48.98,50.12,48.27,51.11,50.52,49.59,50.60,50.95,51.68,
+50.12,51.21,52.87,51.92,51.68,54.40,53.42,53.28,52.71,54.34,
+53.06,55.12,55.50,54.64,55.95,53.50,53.46,55.63,54.20,54.47,
+57.41,53.84,56.07,56.82,55.41,56.90,56.64,57.25,56.49,58.29,
+57.51,56.23,56.96,60.38,57.65,56.09,58.60,61.03,57.44,59.88,
+59.26,60.20,61.95,59.84,60.99,59.34,62.81,62.33,60.73,60.37,
+61.38,60.44,59.87,60.92,60.77,62.04,60.76,61.23,61.92,62.62,
+64.60,64.27,64.91,63.14,63.30,65.53,62.51,62.60,65.14,64.86,
+65.52,65.63,64.40,65.69,65.08,67.54,67.59,67.81,66.50,66.38,
+66.56,67.18,65.24,68.10,68.21,65.32,68.87,66.50,68.00,70.79,
+71.26,69.53,68.03,68.50,68.44,69.74,67.89,70.99,67.50,68.68,
+69.23,70.64,68.18,70.04,71.21,70.22,69.21,69.95,71.31,72.64,
+68.25,69.07,75.22,73.57,70.31,73.43,71.89,72.16,73.94,72.97,
+74.03,72.85,71.61,73.93,74.52,72.59,76.51,74.42,72.76,74.20,
+75.25,76.28,77.76,73.50,75.86,75.70,76.26,72.32,78.20,76.53,
+76.68,75.88,75.45,75.67,78.29,76.97,74.84,76.29,77.54,76.86,
+74.77,76.52,75.18,78.98,75.21,76.92,81.31,76.63,78.52,81.30,
+76.31,78.07,80.17,79.49,80.88,78.39,80.00,76.27,80.22,78.70,
+82.71,81.88,79.42,80.32,79.06,78.99,81.98,83.66,82.24,83.05,
+14.39,15.87,15.83,17.43,17.05,18.47,18.99,19.16,19.73,20.64,
+21.64,21.84,21.44,21.50,22.47,23.16,23.65,23.71,24.61,25.15,
+25.49,26.07,26.37,26.86,27.78,27.21,27.98,27.81,28.29,28.43,
+29.20,30.59,30.33,30.56,30.06,29.70,31.98,30.86,31.23,32.41,
+31.75,33.07,33.98,32.86,33.75,34.47,34.86,35.92,34.79,35.47,
+37.23,37.09,37.84,35.11,38.09,35.74,36.61,37.58,37.34,37.94,
+37.12,39.53,39.37,39.80,40.88,42.56,41.08,40.79,41.16,41.51,
+40.63,42.38,42.59,43.53,41.26,41.55,40.95,43.56,44.52,42.06,
+43.73,43.26,43.74,44.54,46.14,44.25,46.32,46.95,46.53,49.24,
+45.19,46.13,47.39,45.61,46.58,47.55,48.02,48.50,48.10,48.08,
+48.24,48.37,47.06,48.60,48.66,50.23,49.46,50.58,49.28,51.02,
+50.05,53.06,50.71,51.14,53.25,50.68,52.35,52.71,53.05,51.19,
+50.81,53.66,52.38,53.31,53.14,53.96,53.91,53.87,52.03,55.06,
+55.52,52.89,56.55,55.94,54.24,53.45,55.87,56.95,54.42,54.12,
+57.81,57.43,59.64,55.91,58.14,58.56,56.46,57.44,59.86,55.95,
+57.29,61.32,57.12,57.51,58.82,62.18,58.67,59.37,59.92,57.42,
+61.39,59.90,59.98,59.47,62.99,62.39,60.79,61.74,59.10,64.98,
+61.07,63.80,62.51,59.18,62.59,62.64,62.01,62.67,59.63,63.06,
+63.48,64.32,66.71,66.31,63.30,63.06,63.57,64.08,65.71,64.34,
+66.04,66.05,67.17,65.87,63.31,66.12,65.36,68.53,67.39,66.85,
+65.83,65.42,68.48,67.51,68.60,70.61,68.76,68.86,67.61,67.80,
+70.04,70.24,68.60,72.14,67.32,68.61,68.98,67.44,69.51,68.96,
+69.86,69.44,69.37,69.32,72.06,68.87,70.30,70.41,69.82,73.25,
+71.42,70.33,71.48,72.53,74.34,70.03,71.47,73.79,72.52,70.06,
+73.58,72.26,73.86,72.81,74.29,73.60,74.47,73.30,74.79,72.67,
+74.23,77.33,76.22,75.13,75.74,77.89,76.30,75.55,76.85,77.14,
+76.37,76.25,74.85,75.16,75.69,77.87,76.52,76.38,76.79,76.70,
+79.95,81.29,74.87,78.10,77.90,76.07,78.65,76.02,77.96,79.71,
+79.55,76.59,78.38,81.56,77.90,80.89,78.61,81.11,81.43,78.03,
+15.00,14.76,15.35,16.59,16.75,17.77,18.52,18.25,19.51,19.20,
+20.79,20.75,21.12,21.76,22.77,23.32,22.63,23.64,24.21,25.03,
+24.56,24.62,25.76,25.91,27.13,25.84,27.32,26.81,28.19,27.85,
+29.04,28.93,29.25,29.09,29.54,30.02,29.46,30.29,30.53,30.99,
+32.27,32.38,33.06,31.71,33.48,33.38,33.88,34.22,35.23,33.82,
+35.21,35.31,34.74,36.32,36.18,37.26,36.12,35.24,35.03,38.41,
+35.74,38.41,37.34,38.45,37.79,38.84,38.71,37.53,41.06,39.06,
+41.08,40.77,39.84,41.56,40.22,42.54,42.13,41.73,41.57,42.03,
+42.60,42.13,42.69,43.37,44.96,43.91,41.98,43.59,43.89,43.13,
+43.91,44.83,46.03,45.22,44.30,45.33,45.23,45.90,46.23,46.76,
+46.71,49.32,48.53,48.70,47.63,45.64,48.24,47.40,47.56,48.49,
+48.19,48.47,49.95,48.98,50.89,47.65,51.95,48.93,48.64,50.34,
+51.40,50.79,52.50,50.46,51.81,51.10,51.78,53.11,51.57,51.88,
+53.11,52.82,54.30,53.68,52.32,52.80,53.70,51.33,54.95,53.23,
+54.72,55.03,56.40,53.44,55.57,55.25,56.90,55.47,55.05,56.99,
+55.77,55.85,57.77,56.56,57.79,56.95,55.34,58.15,56.75,58.78,
+57.40,59.95,58.94,57.11,57.90,58.67,60.92,59.57,61.12,58.30,
+59.40,61.76,61.11,58.52,60.29,62.38,60.78,61.43,60.09,61.11,
+60.30,61.18,62.58,61.42,64.17,62.13,62.94,62.02,62.22,60.27,
+64.76,64.62,64.19,63.95,63.63,62.41,64.51,64.79,66.40,64.74,
+64.54,64.46,68.64,61.98,66.22,64.07,67.61,66.44,67.79,68.40,
+68.11,68.56,67.50,64.90,66.85,66.69,66.93,68.21,66.24,70.81,
+68.61,67.19,71.17,69.18,65.94,67.67,71.59,68.70,73.50,67.56,
+68.29,67.98,72.29,70.77,69.88,71.12,69.01,70.94,70.06,69.12,
+69.69,70.31,68.39,71.62,71.65,72.92,72.60,72.45,72.03,73.21,
+74.05,74.55,71.49,71.28,75.30,72.23,74.45,74.52,74.60,71.96,
+72.14,73.43,72.88,75.87,70.55,73.93,70.83,72.67,72.88,73.75,
+74.30,75.96,74.47,75.00,77.12,77.50,76.90,78.66,74.17,76.42,
+74.40,76.90,76.19,77.67,75.32,77.83,77.66,76.31,78.02,76.44,
+14.20,14.99,15.17,15.05,15.95,16.47,17.02,18.15,18.09,18.08,
+19.28,20.13,20.08,19.83,20.89,21.71,21.73,21.84,22.54,22.66,
+23.99,23.37,24.12,24.87,25.12,25.59,25.98,27.50,26.68,26.21,
+27.25,27.17,28.32,28.67,28.81,29.53,28.43,29.73,30.63,29.72,
+30.24,29.72,31.15,30.11,30.50,32.85,30.77,33.12,32.36,33.62,
+34.13,31.84,34.72,34.83,34.74,35.74,33.45,33.84,33.82,34.57,
+35.69,36.52,36.92,35.48,36.84,37.81,38.81,39.17,38.00,38.90,
+38.57,38.74,38.29,39.29,40.85,38.83,40.23,40.15,41.46,39.46,
+40.75,40.16,40.98,40.16,41.10,42.66,41.01,43.00,41.31,42.58,
+42.51,43.76,43.04,41.74,45.64,43.58,44.17,45.26,44.87,42.70,
+44.82,44.60,44.71,45.18,45.82,46.20,44.74,45.30,46.10,47.02,
+47.11,47.13,47.91,48.22,48.74,49.39,48.60,47.52,48.78,47.60,
+48.46,47.94,49.72,49.35,49.22,49.71,48.69,49.46,49.36,48.85,
+51.44,50.43,51.95,51.89,49.45,52.89,51.42,53.74,52.13,53.04,
+51.55,53.81,54.13,53.21,52.40,54.36,51.90,52.19,55.29,52.85,
+55.99,54.00,53.50,57.09,54.84,55.81,53.87,54.51,55.39,57.76,
+53.43,56.92,56.81,53.27,55.52,56.68,55.92,57.00,56.07,58.27,
+57.29,59.26,60.05,56.10,58.99,57.81,58.37,59.09,58.13,57.33,
+59.31,56.57,58.27,60.48,58.97,59.84,62.66,60.26,60.95,60.99,
+59.74,60.69,58.85,60.44,61.11,62.06,60.02,60.42,61.86,59.78,
+61.13,63.89,61.96,62.07,64.53,61.73,61.05,62.98,61.40,63.54,
+63.41,65.52,64.64,60.88,65.92,64.47,65.84,65.36,63.22,64.24,
+68.37,64.12,66.84,63.05,66.54,65.72,63.19,66.82,66.30,63.73,
+65.28,66.07,66.82,66.96,65.91,68.54,67.56,68.74,69.33,69.32,
+68.54,66.51,70.22,69.94,67.38,70.20,68.78,71.43,67.51,72.35,
+68.22,72.36,70.69,67.99,70.27,69.54,69.05,71.54,69.15,72.33,
+68.65,70.73,71.40,70.52,71.63,70.74,73.23,72.40,70.22,68.67,
+71.54,72.58,69.20,72.75,70.38,72.46,69.94,72.56,70.27,73.80,
+73.09,71.87,76.10,74.93,73.42,71.50,74.03,73.33,73.90,75.29,
+13.50,13.87,14.92,14.79,15.64,16.05,16.14,17.22,17.45,18.07,
+19.15,18.81,19.00,19.64,19.87,20.30,21.14,21.96,21.51,22.46,
+23.00,22.87,22.56,24.63,24.47,25.03,24.07,24.95,25.96,26.34,
+25.51,26.23,25.44,26.38,28.47,28.18,27.69,27.90,29.07,28.91,
+28.02,27.97,29.10,30.81,29.36,30.48,31.18,29.37,31.94,30.38,
+32.26,33.03,33.22,31.82,30.93,32.07,33.16,33.31,33.20,34.55,
+33.58,34.89,34.85,35.07,33.75,36.55,36.04,35.72,36.14,36.38,
+37.16,37.35,36.69,36.63,38.06,37.88,38.22,37.70,38.17,38.25,
+38.86,40.33,38.94,38.50,39.74,39.75,39.54,38.77,38.31,41.01,
+41.32,41.39,40.46,42.00,41.12,42.21,42.58,43.01,40.32,41.05,
+43.77,42.56,42.72,42.68,45.69,44.74,44.19,44.02,45.56,45.07,
+43.69,45.03,44.07,46.00,45.45,45.45,45.47,45.21,46.33,47.71,
+45.86,46.55,46.21,44.54,47.05,47.50,46.21,47.17,45.35,48.37,
+49.25,48.98,48.57,46.84,48.98,48.96,48.66,47.41,50.35,52.18,
+49.06,49.63,51.52,51.03,50.32,50.76,49.77,50.13,51.34,53.59,
+50.43,51.95,51.21,51.92,53.10,50.94,52.21,53.22,54.79,51.24,
+53.88,54.75,52.28,55.19,55.17,55.23,54.12,53.35,54.09,54.69,
+54.21,54.37,54.89,54.30,56.18,55.11,57.85,57.14,55.21,56.86,
+54.78,57.13,57.29,57.20,56.85,56.69,55.17,57.92,56.06,57.77,
+58.60,59.08,57.43,57.01,59.79,54.38,55.87,58.12,58.86,59.37,
+60.14,60.87,59.84,58.39,58.55,60.16,57.69,61.30,59.97,58.09,
+59.96,59.24,58.88,59.81,61.06,57.56,60.43,60.82,60.69,61.31,
+60.38,62.41,61.39,60.34,61.00,61.02,62.04,62.61,63.95,58.98,
+63.06,64.80,62.20,63.90,66.41,66.22,63.53,63.53,64.21,65.92,
+65.35,66.14,63.01,64.36,64.07,65.87,66.07,65.76,63.80,66.23,
+65.54,66.80,65.62,63.17,66.97,65.12,67.10,65.41,67.01,65.00,
+69.01,69.54,67.09,69.14,67.61,63.80,67.23,68.97,67.09,68.06,
+70.94,67.07,69.81,69.98,67.57,67.23,65.55,66.72,70.39,68.65,
+67.37,68.68,68.28,75.61,69.01,70.81,70.02,69.26,69.83,67.85,
+13.18,12.89,13.28,14.74,13.84,15.26,15.50,16.32,15.78,17.08,
+16.51,18.64,18.58,19.08,18.65,19.30,19.22,19.59,20.32,21.07,
+22.48,20.85,21.66,23.02,22.78,22.32,23.83,23.51,23.67,23.98,
+24.29,24.77,24.81,25.28,25.66,26.49,25.72,26.35,26.56,27.07,
+26.49,26.56,27.88,28.89,29.35,29.43,30.27,29.01,28.36,29.64,
+29.97,30.12,30.33,30.72,30.21,30.09,32.45,30.51,31.92,31.39,
+31.71,31.85,33.36,32.95,32.20,32.89,32.87,33.26,33.76,32.96,
+34.40,34.71,35.23,36.62,35.49,35.37,35.26,36.83,36.45,35.94,
+35.66,36.93,37.32,37.82,37.53,37.98,36.93,37.59,39.07,37.73,
+38.51,38.46,38.88,40.42,40.24,39.97,36.82,37.89,39.28,41.07,
+40.11,40.02,41.54,40.16,40.74,39.85,41.69,41.98,40.22,42.06,
+41.83,42.55,41.57,40.11,41.23,42.13,42.42,44.07,43.85,43.78,
+43.99,42.82,45.17,43.81,44.06,45.12,45.43,45.37,46.93,46.49,
+45.86,44.72,45.00,44.63,45.94,47.50,46.13,47.67,46.83,46.16,
+48.31,47.10,46.54,48.83,46.48,49.13,47.27,49.87,49.86,49.50,
+48.12,49.59,50.54,49.04,48.27,48.68,48.06,49.52,49.79,48.96,
+49.36,49.32,49.90,48.83,49.46,51.62,50.28,51.33,52.78,51.07,
+51.57,51.29,53.08,53.27,50.55,52.09,50.35,51.48,52.47,53.43,
+54.07,51.70,51.58,54.74,53.50,52.98,54.91,53.25,54.01,52.83,
+54.32,54.94,56.11,54.00,54.55,55.04,53.39,56.19,54.83,56.65,
+55.32,55.36,57.00,55.34,57.65,55.56,56.00,57.53,58.46,55.98,
+58.02,57.27,57.00,57.45,55.45,57.58,58.02,58.14,58.51,56.16,
+56.83,59.45,60.12,57.44,58.80,56.42,59.29,58.40,61.22,58.32,
+61.03,59.45,58.74,58.17,60.20,58.63,60.44,61.58,59.57,60.24,
+61.25,60.33,62.42,63.11,63.10,59.98,62.27,63.01,60.52,60.77,
+61.67,62.14,60.98,62.03,61.56,63.77,62.20,63.21,62.51,64.44,
+61.80,61.94,64.40,63.16,62.45,65.01,63.35,61.82,63.60,65.68,
+62.24,65.87,64.79,64.19,61.77,63.48,61.47,63.35,66.55,66.17,
+63.88,65.68,65.57,65.96,66.75,64.81,67.24,66.62,65.87,65.86,
+11.22,11.79,12.96,12.57,13.47,14.32,14.67,14.92,15.31,16.02,
+16.44,16.25,16.70,18.23,17.64,18.75,18.17,18.61,19.49,19.35,
+20.69,19.52,19.63,21.26,21.73,21.71,21.80,21.17,21.78,22.87,
+22.96,23.26,24.79,24.50,25.13,22.59,23.79,24.57,24.98,25.77,
+25.32,25.41,27.28,27.51,27.31,26.69,26.96,26.43,28.26,26.93,
+27.92,27.52,28.74,26.79,29.14,29.19,29.44,28.06,28.98,29.52,
+27.97,31.00,28.53,31.44,31.44,31.16,32.51,32.03,31.80,31.88,
+32.79,31.00,32.40,33.38,31.75,32.70,33.71,34.92,32.67,35.49,
+34.50,35.40,33.76,33.25,34.53,34.77,33.34,35.42,36.44,34.97,
+35.25,36.35,35.86,36.36,36.68,38.79,36.53,36.15,38.10,37.10,
+36.51,38.24,36.67,37.65,37.36,38.57,39.25,40.30,39.55,38.65,
+38.91,38.69,38.73,39.48,40.20,40.34,40.13,41.39,41.28,40.81,
+41.46,42.18,41.45,40.58,42.84,43.22,40.94,41.84,42.11,41.93,
+42.29,43.74,42.55,42.89,43.39,45.70,42.45,43.49,44.76,43.29,
+41.82,43.43,44.45,44.39,43.44,44.08,43.13,46.59,46.99,46.70,
+45.80,46.99,47.37,45.57,46.71,46.86,48.60,45.78,47.36,48.91,
+46.87,46.92,47.70,48.91,46.57,47.87,46.32,46.71,48.87,49.46,
+47.08,48.95,47.51,48.06,49.97,50.10,49.73,48.99,49.47,49.00,
+51.12,49.00,50.12,48.28,50.21,47.92,48.72,50.30,52.17,50.55,
+51.58,50.07,51.39,52.85,53.15,51.49,50.04,52.41,51.36,50.49,
+51.68,52.92,51.58,52.22,54.17,52.58,51.61,54.90,53.80,56.70,
+55.48,55.04,53.53,55.73,53.87,53.19,55.70,54.02,55.34,53.59,
+54.82,52.83,55.06,55.34,56.52,56.21,56.14,56.14,57.84,53.70,
+53.76,56.44,54.69,55.68,56.35,57.46,56.78,56.11,55.88,54.85,
+57.96,55.67,56.56,53.80,57.24,59.60,55.46,57.82,58.79,57.82,
+53.60,59.95,58.23,57.83,59.06,61.19,61.83,58.76,55.07,59.38,
+57.54,57.71,60.54,60.98,59.62,58.13,58.02,59.52,63.58,62.53,
+58.73,60.89,59.04,61.36,58.33,60.63,60.71,61.80,58.31,61.46,
+62.09,62.81,61.55,59.04,61.55,62.95,62.61,61.25,63.83,63.36,
+10.90,11.32,12.03,12.51,13.43,13.70,13.84,13.69,14.36,15.45,
+16.15,16.06,15.87,16.35,16.78,17.35,16.82,17.74,17.58,17.52,
+17.87,18.00,19.46,19.62,19.85,21.69,19.48,20.51,21.06,21.39,
+20.54,20.89,22.30,21.88,21.66,22.29,22.96,23.47,24.08,24.61,
+24.23,24.57,23.81,25.35,24.87,25.61,24.96,25.62,26.47,25.35,
+26.50,26.13,25.26,27.68,27.89,26.80,27.12,28.42,27.94,27.99,
+28.45,27.91,29.73,28.02,28.69,29.62,31.21,30.25,30.57,30.94,
+30.34,29.28,29.82,30.48,31.54,30.28,31.22,30.70,31.09,30.46,
+31.30,30.85,32.33,34.60,34.21,32.96,32.35,33.33,33.12,32.79,
+34.77,34.20,33.64,33.42,35.58,34.55,36.28,35.99,35.22,35.15,
+35.30,35.57,35.37,36.22,37.13,34.72,36.92,37.27,36.43,37.72,
+37.40,37.27,36.50,37.21,36.36,36.74,37.99,36.87,38.17,39.54,
+37.59,39.58,37.88,37.01,39.06,38.84,39.35,39.62,39.59,38.07,
+40.38,39.12,39.92,41.37,41.27,41.24,40.53,40.00,40.46,40.31,
+39.85,41.50,40.76,40.95,43.45,41.83,40.93,41.74,41.72,43.21,
+42.97,43.61,43.24,42.69,43.11,44.65,42.30,43.69,43.72,43.14,
+44.76,42.00,42.86,43.22,44.69,44.66,45.62,44.12,45.54,44.45,
+44.09,46.22,45.16,45.20,45.20,45.08,44.00,46.92,45.72,45.44,
+46.04,46.84,46.15,46.63,44.96,46.01,47.44,48.49,46.38,46.29,
+47.48,49.42,49.70,48.90,45.82,46.68,48.20,49.02,46.65,45.19,
+50.10,48.68,47.52,48.87,51.42,47.78,49.63,48.82,49.39,50.87,
+48.45,51.06,49.22,49.37,49.96,50.02,51.63,49.54,50.74,50.19,
+51.10,52.41,49.42,51.63,52.53,53.69,49.91,51.34,54.20,52.83,
+51.60,51.99,51.61,49.73,52.24,51.65,52.42,51.33,54.81,54.62,
+52.81,52.88,54.76,51.51,55.63,53.58,52.47,55.96,52.98,54.32,
+54.16,54.24,55.89,53.70,55.56,55.76,54.71,54.92,53.08,56.11,
+55.22,53.82,55.25,56.38,57.59,55.21,55.85,55.95,56.30,55.32,
+53.15,57.07,55.65,56.60,55.39,57.64,59.12,57.04,55.62,55.07,
+58.46,60.17,57.46,57.46,57.62,58.70,59.01,57.80,58.76,57.36,
+9.63,9.82,10.52,11.37,11.57,12.24,12.58,13.39,12.87,14.10,
+14.08,15.11,14.62,15.45,15.32,15.55,15.85,16.59,16.60,16.37,
+17.73,17.57,17.55,17.62,18.41,18.65,19.98,18.81,19.49,18.60,
+20.44,19.26,20.29,21.24,20.49,20.79,21.50,22.22,22.47,22.79,
+21.79,22.21,22.57,23.12,23.23,23.15,23.22,24.78,23.19,24.65,
+23.52,24.83,25.11,25.12,24.48,25.05,25.08,24.31,25.75,24.69,
+26.08,26.49,26.20,27.23,27.10,26.47,27.00,27.21,27.57,27.71,
+29.02,27.33,28.82,29.43,29.38,28.22,29.06,28.16,29.28,29.21,
+29.82,29.56,30.43,30.23,30.62,31.72,29.80,30.81,31.29,30.94,
+31.83,30.58,30.95,33.11,32.64,33.47,32.03,31.61,33.26,33.22,
+32.76,34.63,33.96,33.02,33.48,33.37,34.19,35.11,32.05,33.75,
+33.28,33.49,36.89,34.60,34.43,35.32,33.80,34.28,35.74,34.86,
+34.96,36.43,36.47,35.10,37.01,35.95,36.57,35.65,36.74,35.43,
+36.47,37.70,35.71,37.57,37.99,37.02,37.16,38.50,38.35,37.14,
+38.00,37.11,37.87,39.28,39.27,38.34,39.24,40.17,38.66,39.62,
+40.03,40.07,39.94,38.22,40.08,40.93,41.74,42.21,40.49,42.72,
+41.69,40.95,42.55,42.06,40.31,40.40,40.24,41.35,40.39,40.80,
+40.80,41.33,42.09,44.11,40.67,42.25,42.06,42.45,42.33,43.35,
+43.52,42.93,42.98,44.46,42.15,43.62,42.71,43.74,43.67,42.86,
+43.83,44.60,44.00,45.47,45.36,45.26,45.59,45.31,45.46,45.57,
+46.98,43.67,44.91,46.93,46.22,43.33,46.02,45.37,45.47,47.38,
+45.77,47.03,46.07,47.07,45.30,48.15,47.15,46.26,46.89,46.97,
+48.09,47.70,49.48,48.16,48.94,46.58,47.71,49.35,48.37,49.63,
+48.26,49.12,48.32,47.47,47.46,47.77,49.04,48.32,49.51,47.12,
+50.78,48.30,50.17,47.83,47.73,49.89,51.24,48.09,50.79,48.64,
+51.65,50.70,50.20,50.12,51.25,48.72,51.92,50.56,51.36,51.74,
+53.82,54.80,49.47,51.29,53.10,51.53,51.02,52.83,52.89,51.65,
+52.67,53.14,52.54,51.61,53.20,53.29,50.51,52.72,52.86,54.82,
+53.59,51.74,53.44,51.79,53.54,52.19,53.25,56.70,53.67,54.33,
+8.86,10.07,9.96,11.08,10.64,11.15,11.29,11.40,12.20,12.56,
+12.57,13.48,13.54,13.90,14.69,14.95,15.21,14.78,15.32,15.70,
+16.70,15.84,16.27,16.86,16.52,16.09,16.58,18.05,17.72,17.51,
+17.61,18.28,18.89,18.15,19.20,19.07,20.03,20.09,20.40,20.04,
+20.62,21.20,21.26,21.20,22.34,21.95,20.99,21.08,22.18,21.10,
+23.24,22.29,23.46,22.86,23.34,23.26,22.47,23.96,23.35,23.85,
+22.58,23.99,24.50,24.87,24.86,25.71,26.12,26.35,24.94,26.86,
+25.47,25.75,26.16,25.85,25.90,26.43,25.91,26.28,26.92,26.35,
+27.10,28.13,27.50,28.32,28.16,27.88,27.59,27.94,28.75,29.62,
+28.79,28.63,26.43,29.58,29.34,29.66,29.35,30.94,29.08,29.29,
+30.76,30.11,31.10,30.81,30.93,29.83,30.90,32.86,31.58,31.40,
+30.89,31.91,31.05,32.15,32.46,31.43,32.78,31.17,34.05,34.93,
+31.70,34.01,33.66,32.31,33.49,33.17,32.95,34.74,34.39,33.09,
+33.04,33.88,34.38,34.12,35.41,35.01,35.15,34.90,36.03,34.67,
+36.68,35.74,35.58,35.39,36.56,36.79,35.50,35.15,37.90,36.50,
+35.22,36.68,37.22,35.87,36.00,36.14,36.94,37.09,37.26,38.03,
+38.12,37.70,37.54,38.58,40.57,37.49,38.08,39.11,38.14,39.31,
+37.50,38.38,39.02,37.78,39.51,40.09,39.11,39.05,40.33,39.97,
+38.64,38.89,38.73,40.91,40.97,39.09,40.35,40.21,40.79,39.86,
+40.32,42.22,40.48,39.60,39.93,39.99,40.81,40.43,40.87,40.60,
+42.06,43.27,43.89,40.86,41.33,41.79,42.50,45.21,42.90,41.98,
+42.24,44.78,43.01,41.64,40.68,41.40,43.74,43.02,43.41,42.06,
+43.90,43.82,44.56,42.97,44.11,44.03,43.77,45.82,45.39,43.75,
+44.42,44.23,45.45,44.29,44.22,44.11,45.57,43.97,46.47,46.36,
+45.61,46.43,44.95,45.17,45.59,45.63,46.68,43.57,44.59,47.29,
+46.71,46.58,47.89,45.84,46.35,46.14,49.11,47.84,46.49,47.12,
+48.42,46.66,47.52,49.49,48.96,46.99,50.02,47.17,46.17,47.24,
+46.83,46.98,47.46,48.73,47.66,48.85,49.90,49.76,50.32,47.08,
+48.44,48.41,48.76,48.48,48.84,48.63,50.59,50.64,49.52,50.07,
+8.48,9.15,9.40,10.24,10.34,10.36,10.65,11.68,11.41,12.05,
+12.32,11.61,12.95,13.46,13.55,12.59,14.43,15.07,14.70,14.44,
+14.71,14.77,14.96,15.82,15.92,16.12,15.55,17.25,16.39,16.01,
+16.20,15.91,17.62,17.23,17.19,19.02,17.00,18.53,18.61,18.11,
+18.65,19.90,19.32,19.68,20.04,20.93,19.98,19.56,19.13,20.32,
+19.75,21.29,20.68,21.19,20.76,22.25,21.12,21.68,21.06,21.29,
+21.92,23.17,22.02,22.67,22.32,23.08,23.22,24.23,23.89,24.10,
+23.88,24.24,25.76,23.91,23.22,23.35,24.72,24.66,24.15,25.98,
+25.52,26.36,25.25,25.65,25.85,26.42,25.93,25.66,26.92,27.21,
+25.53,26.52,27.58,26.98,27.24,28.22,27.68,27.80,28.48,28.75,
+28.01,29.43,28.99,28.89,30.00,27.79,28.58,29.59,28.76,29.15,
+27.74,28.17,29.26,29.34,28.02,29.87,29.11,31.36,30.79,30.99,
+30.24,30.84,30.76,30.31,29.53,31.67,31.38,28.97,30.97,31.24,
+30.63,30.27,32.88,32.08,31.49,32.72,31.45,32.79,32.33,31.88,
+32.81,33.46,33.36,34.58,34.65,32.53,34.07,33.55,33.17,33.71,
+33.33,33.18,33.49,32.98,34.17,33.99,33.91,33.93,34.78,33.93,
+34.40,34.87,35.05,33.97,35.06,35.86,34.32,36.02,36.12,35.68,
+35.07,35.41,35.54,36.26,35.13,36.36,35.03,36.40,35.39,37.25,
+36.33,37.13,36.47,37.73,36.77,37.56,37.02,38.21,37.86,36.64,
+38.48,37.52,38.78,38.21,36.81,38.69,37.88,38.67,37.22,36.80,
+38.59,40.29,38.50,38.02,38.27,39.44,37.81,39.08,39.34,39.25,
+39.58,41.31,39.16,40.07,40.12,38.28,40.03,38.78,38.71,40.44,
+38.70,41.61,40.94,40.96,40.58,40.98,39.97,40.68,40.46,40.76,
+40.83,40.63,41.93,43.14,41.11,40.91,43.07,43.66,42.85,41.54,
+42.10,42.02,42.60,43.60,43.47,43.24,44.10,41.91,41.63,45.50,
+42.62,42.48,43.58,42.14,43.77,44.01,44.20,43.15,45.46,42.76,
+46.64,41.08,43.23,43.24,45.62,45.60,42.62,45.03,43.80,43.17,
+44.05,45.35,44.80,44.83,46.74,44.65,44.45,44.33,42.50,46.36,
+45.88,44.59,47.07,44.62,45.54,46.38,46.81,46.66,45.62,46.48,
+8.57,7.86,8.67,8.59,9.78,10.15,10.08,9.76,9.97,11.17,
+11.19,11.17,11.68,12.26,12.33,12.12,12.17,13.44,13.07,13.96,
+12.24,13.21,14.12,13.82,15.42,14.67,13.84,15.00,15.20,15.50,
+15.51,15.82,16.09,16.14,15.99,16.37,16.89,16.31,15.94,17.44,
+17.20,16.83,17.95,17.12,17.74,17.45,18.54,18.96,19.39,18.88,
+19.31,19.11,18.38,20.21,19.20,20.14,19.40,20.49,20.35,20.12,
+20.91,20.55,20.90,20.45,21.78,20.92,20.49,21.73,20.85,21.99,
+20.94,22.83,22.73,22.29,22.62,22.55,22.45,23.38,21.31,23.22,
+23.32,23.00,24.53,23.82,23.29,24.02,22.87,23.75,24.22,24.43,
+23.70,25.08,24.07,24.61,25.12,27.21,24.74,25.16,25.64,24.91,
+25.49,26.36,25.33,25.59,25.23,26.08,26.76,26.15,26.02,27.83,
+26.56,26.08,26.38,27.24,27.59,27.19,27.77,26.66,26.89,27.34,
+28.54,28.57,28.33,28.30,28.58,28.55,27.67,29.39,29.11,29.82,
+27.89,29.29,28.19,29.17,29.50,30.08,28.88,28.56,29.22,30.56,
+31.16,30.27,29.65,29.41,29.27,31.43,30.65,31.67,30.79,28.52,
+31.10,33.16,31.20,30.12,31.90,30.48,31.75,30.68,33.10,32.32,
+30.95,33.17,31.53,30.51,32.47,30.50,32.34,32.31,34.33,31.59,
+32.91,33.74,32.17,31.67,32.65,34.25,33.57,33.98,34.39,32.86,
+34.23,33.85,33.18,34.12,33.64,35.75,34.23,34.23,34.68,34.07,
+35.34,35.60,34.13,37.20,34.01,34.73,33.92,35.61,34.84,35.29,
+35.95,37.06,35.56,36.14,36.23,35.10,36.38,35.95,36.80,36.47,
+36.04,38.18,35.37,36.89,36.09,38.21,36.82,37.79,36.20,35.02,
+37.45,37.64,35.67,37.53,39.12,37.32,37.90,37.29,36.50,37.93,
+37.56,37.22,38.56,36.94,38.35,37.54,38.36,38.02,38.92,38.17,
+38.45,38.91,40.24,39.69,36.90,38.80,38.91,37.34,39.20,39.47,
+40.53,40.43,40.29,40.33,41.85,40.21,38.86,39.63,39.34,39.00,
+40.34,40.09,40.55,39.12,40.33,40.25,39.54,40.91,40.60,40.05,
+40.62,40.70,41.36,40.32,41.58,39.42,41.73,41.34,41.73,42.50,
+42.28,42.94,42.71,39.82,40.05,43.52,40.61,42.17,42.92,42.29,
+7.10,7.23,7.21,7.99,7.62,8.37,9.73,9.24,9.83,9.65,
+10.36,10.28,10.96,10.70,11.64,11.14,12.46,12.45,11.98,11.70,
+12.53,11.97,12.58,13.85,13.41,13.33,14.10,13.67,13.33,13.38,
+14.85,14.37,13.90,15.44,15.34,14.69,14.55,15.02,15.49,15.49,
+16.36,16.27,16.09,15.33,15.86,16.20,18.04,16.80,16.97,17.56,
+16.52,17.54,17.75,18.58,17.30,17.09,18.75,18.19,19.13,19.22,
+18.43,19.11,18.68,19.19,18.42,19.73,18.74,18.54,18.97,18.77,
+19.62,20.66,21.27,20.17,21.03,20.91,20.84,21.98,21.16,20.89,
+21.43,21.46,21.40,21.95,21.72,20.65,21.38,22.25,21.98,21.60,
+22.06,22.13,22.76,23.07,22.84,23.01,23.85,22.71,23.04,22.76,
+23.27,23.56,22.79,24.18,23.90,24.07,23.44,23.75,25.11,24.70,
+24.43,24.86,24.99,26.43,24.63,25.19,24.75,25.79,25.76,25.95,
+25.93,26.55,24.84,26.76,26.26,26.60,27.34,27.36,26.46,26.95,
+25.90,28.23,27.78,27.19,27.67,26.79,26.16,26.97,27.56,27.23,
+28.63,26.91,27.47,28.61,29.34,28.06,28.86,28.63,27.49,26.65,
+27.37,29.43,27.60,29.75,28.98,29.07,28.50,27.66,30.05,28.64,
+29.77,30.02,31.21,29.56,29.62,30.48,29.25,29.75,32.34,31.14,
+30.05,29.95,30.78,30.69,30.39,29.84,29.87,29.87,30.43,31.32,
+31.94,28.95,30.36,31.37,31.40,30.37,31.45,31.80,31.89,30.92,
+33.63,32.12,32.81,32.17,31.73,31.82,32.01,32.13,33.96,33.44,
+33.08,33.00,31.74,33.52,32.25,32.97,33.53,33.59,34.11,34.37,
+33.18,33.80,33.37,33.05,33.37,33.02,33.58,35.20,33.97,33.04,
+33.71,34.40,34.34,35.26,34.34,35.33,33.40,34.31,35.35,33.07,
+33.94,33.38,34.64,34.31,36.10,34.65,35.17,35.19,34.38,34.21,
+35.75,35.55,35.06,34.66,35.12,35.32,36.59,36.37,36.48,35.89,
+35.70,35.67,36.85,36.73,37.42,36.81,35.83,36.68,37.21,36.82,
+36.89,36.63,36.76,37.92,36.78,36.36,38.29,35.88,38.97,37.27,
+37.63,38.28,37.94,38.83,36.89,38.23,37.85,38.09,38.63,37.57,
+37.49,40.16,37.71,38.43,39.16,39.11,39.13,39.64,36.70,40.13,
+6.63,7.19,7.56,7.33,7.35,7.98,7.63,7.82,8.29,9.29,
+8.75,9.92,9.07,9.83,10.71,10.91,9.44,10.74,11.17,10.55,
+11.74,12.14,11.62,12.10,11.91,13.07,11.77,12.17,12.78,12.18,
+11.96,13.41,13.77,13.78,13.59,13.17,14.00,14.48,14.23,14.46,
+14.68,15.07,14.52,14.72,15.28,16.06,15.21,15.00,15.86,15.99,
+15.85,15.61,16.08,17.01,16.34,16.89,16.67,17.07,17.05,17.21,
+17.79,17.52,17.84,16.82,17.72,17.53,17.19,18.46,17.48,18.86,
+17.34,18.85,18.95,18.65,18.40,19.49,19.89,19.75,19.16,19.49,
+19.89,19.34,19.24,19.82,20.16,20.07,19.27,19.41,20.40,21.42,
+21.25,20.94,21.00,21.90,20.42,20.53,21.83,20.93,21.43,22.74,
+21.66,21.54,21.66,22.06,21.90,22.38,21.69,22.54,22.11,22.33,
+22.21,22.49,22.95,21.42,21.63,23.25,23.99,24.91,22.89,23.54,
+23.34,22.36,23.03,23.21,23.30,23.23,24.68,24.80,23.65,24.13,
+23.95,24.65,22.98,25.21,24.73,24.68,24.65,24.62,26.06,26.10,
+24.20,24.84,23.91,25.98,25.82,24.56,25.47,26.10,26.03,25.90,
+26.80,27.23,26.30,26.36,26.57,26.35,25.21,26.43,26.19,26.03,
+27.31,27.17,27.03,26.67,27.01,27.66,28.22,27.89,26.82,28.43,
+26.68,26.81,27.94,27.35,27.73,28.40,27.92,27.22,27.91,27.99,
+28.99,27.18,29.29,27.94,28.57,28.45,28.64,28.88,28.83,29.03,
+28.43,30.15,29.63,28.14,29.24,27.73,28.28,30.64,29.93,29.63,
+29.81,30.55,29.54,30.40,29.75,29.93,30.19,30.85,30.65,29.89,
+29.41,28.88,31.80,31.40,29.67,31.62,31.09,31.61,31.28,30.46,
+30.50,31.43,30.62,30.69,31.98,30.95,30.93,30.31,31.33,33.48,
+31.48,31.32,32.78,33.18,33.26,32.96,31.33,32.86,31.62,32.16,
+31.26,31.65,31.33,32.10,31.73,32.82,30.65,33.59,33.55,32.68,
+32.38,32.58,33.66,32.70,33.23,34.16,32.69,34.04,30.99,33.24,
+31.58,33.75,33.52,35.43,33.22,34.43,33.59,33.33,33.53,34.86,
+34.11,32.65,34.81,34.63,33.06,34.12,32.10,32.82,32.77,33.61,
+33.52,32.95,34.99,35.43,33.25,35.20,35.26,35.29,36.63,35.68,
+5.95,6.87,6.73,6.88,7.30,6.67,7.50,7.55,7.92,8.29,
+8.10,8.45,8.81,8.70,9.27,9.52,8.84,10.31,10.07,9.63,
+9.44,10.20,11.55,11.26,10.78,10.52,10.92,11.87,12.10,11.00,
+10.99,11.13,12.68,12.17,12.39,12.79,13.35,12.18,12.54,12.48,
+13.50,14.51,13.67,13.81,13.68,13.95,13.99,14.38,14.85,14.07,
+14.39,14.67,14.86,14.13,14.27,15.37,14.93,14.36,15.74,16.26,
+15.71,16.34,15.98,15.49,16.70,16.09,16.87,16.00,17.18,17.07,
+17.49,15.27,16.84,16.98,17.51,17.14,17.23,17.80,16.76,18.18,
+17.48,17.57,17.85,17.06,18.57,17.85,18.24,18.79,19.08,19.05,
+18.14,18.87,19.87,19.61,18.38,19.13,19.03,18.83,19.60,19.00,
+19.82,18.94,20.61,20.65,20.98,20.32,20.34,20.36,20.43,18.94,
+19.60,19.91,21.11,20.75,20.90,20.67,21.50,22.25,21.82,21.63,
+21.48,20.39,22.04,21.11,20.59,22.93,20.83,22.09,21.92,22.28,
+21.89,22.39,22.01,22.52,22.41,22.47,23.26,22.39,22.64,23.01,
+23.12,22.72,22.90,22.36,24.03,23.28,23.68,22.77,23.23,23.01,
+23.89,23.96,23.89,24.52,23.93,23.67,23.16,24.71,24.55,23.50,
+23.54,24.44,24.41,24.59,25.09,23.87,24.54,24.47,24.32,26.18,
+24.59,24.48,25.32,24.30,25.36,25.28,25.75,24.53,25.37,24.82,
+25.23,25.50,26.95,25.93,26.77,26.44,27.79,24.90,25.66,26.19,
+25.58,26.02,26.27,26.91,26.47,27.77,26.54,26.08,25.84,28.47,
+27.78,27.00,26.81,26.03,28.55,27.13,26.56,26.64,27.99,27.92,
+28.50,28.24,28.88,28.35,27.98,29.95,26.42,28.84,28.00,27.77,
+27.30,27.70,28.44,27.64,28.96,28.75,27.79,29.31,29.96,30.10,
+27.39,29.37,29.43,29.15,28.98,28.94,29.55,29.21,30.82,27.40,
+29.62,28.81,30.69,30.54,29.72,29.89,30.68,29.53,30.66,30.56,
+29.85,29.46,29.25,30.40,29.94,29.52,29.36,29.93,30.64,29.88,
+30.10,29.39,30.88,31.01,31.74,30.27,30.70,32.02,30.18,31.38,
+30.65,29.78,31.29,30.76,30.78,30.97,32.28,31.38,31.95,32.74,
+31.47,33.10,31.81,32.26,32.00,32.93,32.52,30.77,32.33,33.63,
+16.48,16.48,17.86,18.04,18.79,19.50,19.74,21.08,20.65,21.36,
+22.00,22.77,23.65,23.73,24.51,24.96,25.37,26.04,26.34,26.63,
+25.91,28.00,28.13,28.14,29.60,29.41,29.26,29.89,30.48,30.33,
+31.70,30.98,30.73,33.08,33.96,33.69,32.78,32.59,32.82,34.10,
+34.52,35.76,35.73,36.18,36.47,36.43,38.18,35.91,37.24,36.63,
+37.88,37.44,39.11,39.29,39.22,39.62,40.77,39.64,39.68,41.19,
+40.15,43.57,41.35,41.45,41.70,42.31,42.91,43.35,41.57,44.23,
+45.26,45.56,45.82,44.41,43.42,45.77,45.82,43.49,46.16,47.64,
+45.26,47.20,45.90,46.25,46.40,46.42,46.58,47.55,45.88,50.18,
+49.74,47.87,49.42,50.11,49.90,50.69,51.45,51.18,48.11,50.47,
+50.38,49.95,49.87,52.29,51.34,52.93,51.05,51.28,54.43,53.54,
+52.36,54.51,54.51,55.80,55.46,56.75,54.36,54.35,55.20,53.34,
+53.90,54.75,53.03,55.75,55.34,56.33,56.03,57.31,57.62,57.95,
+57.03,56.61,55.82,58.93,58.45,58.20,60.50,58.29,60.95,59.91,
+57.80,58.33,59.77,60.02,59.82,62.09,60.59,63.05,59.15,60.69,
+60.50,62.42,62.58,60.46,63.25,62.08,62.04,62.99,64.64,64.44,
+63.08,63.54,64.17,62.18,63.32,62.92,66.93,63.71,63.54,63.45,
+66.77,66.56,64.30,65.45,65.04,66.32,65.85,66.84,66.89,69.66,
+67.22,68.64,68.70,66.18,68.32,68.60,67.96,68.61,66.47,68.39,
+69.74,69.78,67.76,70.11,70.38,72.37,65.73,66.19,70.40,68.66,
+70.16,72.22,71.71,70.63,72.08,69.25,72.89,72.07,73.32,70.05,
+72.80,72.86,69.80,73.79,70.97,75.68,73.04,72.36,74.33,73.44,
+74.94,73.70,72.43,72.44,75.33,75.61,77.05,74.60,72.92,74.52,
+76.60,76.01,76.41,74.35,76.83,75.31,75.37,74.52,76.77,74.84,
+77.01,80.26,75.49,76.93,78.50,76.46,79.10,77.28,77.19,75.81,
+79.55,79.24,76.18,76.63,78.17,75.32,78.05,79.65,79.39,80.11,
+78.45,79.14,81.73,81.27,80.21,82.81,79.79,75.55,81.81,83.48,
+79.89,80.84,84.86,82.06,83.55,80.21,81.43,80.57,81.97,85.07,
+83.66,84.56,83.90,83.92,86.10,83.77,84.31,81.66,81.88,80.81,
+15.42,16.44,15.87,16.88,18.18,18.92,19.41,20.66,20.36,21.59,
+21.52,22.62,22.17,24.19,23.62,24.86,24.92,25.50,26.63,26.17,
+26.23,27.54,27.83,27.70,28.53,27.71,29.43,30.10,29.97,32.02,
+30.05,30.59,33.44,31.90,32.05,32.78,31.79,32.72,32.30,34.94,
+34.04,33.19,36.34,35.74,34.77,36.42,36.25,37.27,38.00,37.67,
+37.80,37.31,38.28,38.41,38.57,37.74,39.14,40.18,40.09,38.62,
+40.51,40.70,40.56,39.91,41.59,42.36,41.29,42.90,42.09,42.45,
+43.15,43.31,41.23,43.53,45.41,43.06,44.95,46.01,44.08,46.71,
+47.34,44.22,46.30,45.70,45.56,47.14,47.34,46.95,49.31,48.11,
+46.93,49.46,49.29,49.05,47.17,49.33,48.84,49.19,52.34,49.43,
+50.53,50.60,53.19,51.94,51.62,52.51,51.50,49.55,51.86,52.96,
+53.89,51.85,53.01,53.65,52.91,53.89,54.45,53.87,54.48,55.76,
+56.38,54.40,55.17,54.62,56.32,53.80,54.64,55.83,58.43,56.59,
+56.76,59.04,55.96,58.91,58.27,58.52,56.43,58.14,57.90,59.80,
+59.17,60.99,58.87,57.01,58.89,59.45,60.15,62.16,57.66,59.96,
+61.88,62.54,58.92,62.73,61.70,61.98,62.15,63.44,63.21,62.44,
+61.89,62.85,63.51,65.30,62.62,66.58,61.78,63.12,62.94,64.35,
+64.41,64.19,64.80,64.32,62.97,64.79,68.39,65.07,64.29,65.25,
+64.22,68.30,68.57,67.96,68.17,66.43,70.90,65.64,64.91,68.79,
+67.06,70.78,70.22,64.93,68.89,70.63,71.62,70.41,68.62,70.58,
+68.98,68.14,69.75,70.99,70.77,71.09,70.51,70.63,72.33,71.30,
+71.24,69.73,71.76,73.22,72.16,69.61,71.71,71.39,71.78,71.28,
+73.33,72.03,70.38,71.84,74.66,74.30,75.18,78.16,71.09,73.89,
+73.37,73.96,77.09,73.11,76.35,76.82,74.84,75.83,78.71,76.71,
+77.08,77.30,77.53,73.87,73.74,75.10,76.97,72.55,79.60,75.84,
+81.14,76.62,74.86,77.42,76.73,76.08,78.85,77.90,79.02,77.75,
+80.21,79.60,82.32,78.51,81.62,80.19,80.95,83.64,80.15,80.05,
+80.48,79.04,79.47,83.67,83.46,82.41,80.84,78.47,83.62,80.89,
+82.11,83.54,82.54,82.92,82.19,81.80,81.34,82.70,84.61,85.16,
+15.50,15.56,16.43,17.66,17.58,18.52,19.51,19.65,19.98,20.67,
+22.08,22.92,22.69,23.44,23.14,24.78,24.29,24.10,24.88,25.95,
+26.66,26.17,27.42,27.42,28.58,28.91,28.53,28.46,27.88,29.44,
+29.36,29.31,30.28,32.55,31.82,31.33,32.99,33.16,33.14,32.16,
+33.06,33.79,33.06,33.52,34.33,34.42,35.41,35.40,36.10,36.17,
+36.80,37.93,37.51,37.71,38.04,37.62,39.19,39.47,38.69,38.99,
+39.07,40.06,39.56,41.24,38.62,40.19,40.78,42.91,42.03,40.87,
+43.25,43.63,42.22,44.15,42.38,43.28,43.63,43.75,44.10,44.14,
+43.12,43.64,43.42,44.17,46.54,46.72,45.46,47.79,47.04,47.47,
+49.04,47.15,47.68,48.18,47.95,46.32,47.24,49.06,49.06,48.43,
+50.09,51.83,49.72,47.52,49.63,50.64,51.63,51.75,52.72,50.40,
+50.87,51.28,50.27,52.94,53.56,51.46,50.27,51.45,52.94,52.86,
+53.18,53.28,57.39,52.40,57.35,55.30,55.39,53.95,55.96,57.09,
+56.26,55.89,56.17,56.52,55.46,56.17,57.46,57.59,54.62,55.55,
+57.79,57.72,56.61,59.04,58.27,58.54,57.93,58.02,60.24,57.90,
+61.58,60.41,60.52,59.99,59.07,60.00,60.90,61.43,60.86,59.80,
+61.59,59.77,59.58,64.37,60.98,59.96,63.02,62.57,62.21,60.68,
+61.98,60.57,62.88,64.71,65.35,66.19,63.81,63.12,64.32,64.17,
+64.87,67.69,64.59,66.59,68.35,65.02,65.89,67.13,66.98,66.14,
+67.97,64.45,65.56,67.20,68.22,71.38,70.11,67.87,67.60,66.45,
+69.27,65.93,68.50,65.91,67.98,67.46,69.91,68.52,69.40,68.39,
+71.08,68.99,69.35,72.15,71.04,69.83,74.63,73.03,71.28,69.71,
+73.54,72.43,71.32,73.57,74.73,70.45,74.25,71.87,73.29,74.28,
+70.74,72.51,75.22,71.41,73.76,72.33,75.51,74.03,72.45,74.72,
+74.25,74.00,78.66,75.93,76.04,74.57,74.57,74.36,73.36,78.29,
+76.55,76.10,74.30,74.33,76.67,76.53,77.33,78.27,73.86,79.62,
+79.42,74.58,77.03,75.35,77.24,77.38,76.97,75.63,77.55,78.49,
+76.15,81.26,79.53,80.44,80.17,79.77,80.97,77.65,80.01,78.22,
+79.93,78.71,81.16,78.59,80.93,79.98,84.33,81.24,82.78,83.71,
+14.84,15.33,16.14,16.93,18.41,17.74,18.41,19.27,19.49,20.29,
+20.56,20.80,21.41,21.77,22.70,23.55,22.86,23.99,25.19,24.67,
+24.99,25.92,26.08,26.16,26.97,26.35,27.84,26.87,27.18,29.92,
+28.61,28.73,28.36,30.11,30.29,30.20,30.12,31.72,31.71,31.42,
+32.78,32.43,32.91,33.07,33.49,33.61,33.77,33.74,35.24,33.28,
+36.04,35.43,34.60,34.57,37.68,38.29,37.07,36.39,36.61,37.54,
+36.55,38.51,39.96,38.85,38.72,39.44,39.74,40.02,40.55,40.95,
+41.07,41.87,39.97,40.84,40.81,40.93,42.81,41.69,42.35,42.19,
+43.12,43.03,43.09,43.69,47.41,44.22,45.18,45.85,44.53,44.90,
+45.78,45.47,46.30,44.03,46.51,45.17,47.57,47.50,47.55,46.91,
+48.78,48.32,48.53,48.44,49.81,49.51,50.16,49.82,46.95,48.33,
+50.24,49.49,49.04,49.38,49.18,50.38,49.40,52.71,52.73,53.49,
+50.73,50.93,51.53,52.55,52.90,53.63,55.22,55.08,53.15,52.62,
+54.53,53.38,54.95,54.54,55.18,54.65,53.67,56.67,55.14,56.55,
+56.19,53.74,54.22,56.22,58.48,55.34,57.65,57.25,58.80,57.50,
+58.08,56.34,56.17,55.89,56.38,60.28,57.40,58.19,58.14,59.72,
+59.91,59.72,57.58,60.15,58.66,62.65,59.56,60.47,60.61,63.65,
+61.62,59.67,61.11,62.09,63.29,62.15,60.03,60.76,63.52,63.42,
+63.67,63.46,63.62,64.62,63.84,63.09,61.53,61.60,66.65,65.88,
+65.01,65.19,65.73,64.46,63.63,64.58,64.46,67.22,66.20,65.75,
+63.84,65.29,68.75,64.88,64.76,67.12,64.47,66.03,67.85,69.39,
+66.46,67.71,68.25,69.95,69.41,68.47,70.47,67.91,68.39,68.12,
+68.49,68.67,71.25,68.28,68.14,71.19,68.59,71.33,67.07,69.52,
+72.10,71.22,73.04,68.56,68.63,70.62,69.65,68.81,71.71,71.54,
+69.17,71.71,70.58,73.31,71.62,74.20,73.03,72.10,71.88,74.73,
+72.33,76.06,72.62,73.87,71.41,69.98,73.27,74.79,73.98,74.12,
+75.77,75.43,73.79,76.51,75.20,74.72,76.00,77.00,77.14,77.11,
+76.44,78.74,77.77,78.81,79.47,74.18,76.34,76.80,76.65,77.19,
+77.41,82.39,78.87,79.33,73.31,78.50,77.22,79.64,83.14,80.64,
+13.78,14.61,15.44,16.50,16.43,17.66,17.38,18.98,18.73,18.47,
+18.90,19.89,20.81,21.52,21.15,21.55,23.27,22.99,22.92,23.96,
+24.02,24.61,24.99,25.41,24.55,27.33,25.33,26.03,27.17,26.20,
+28.39,28.53,27.90,29.27,29.65,28.76,29.03,30.82,29.82,30.50,
+30.30,30.16,31.09,31.33,32.65,33.13,33.00,33.10,33.38,33.17,
+33.55,33.67,34.80,36.37,35.36,34.20,35.48,36.07,35.03,35.29,
+35.30,36.30,37.90,36.72,37.74,37.78,36.96,39.39,38.08,38.76,
+39.07,38.34,40.05,39.01,42.61,40.33,40.64,40.22,40.90,41.50,
+41.12,40.68,41.18,41.91,41.61,44.89,42.35,42.73,42.02,43.97,
+45.63,43.17,44.77,44.37,44.10,42.71,44.03,45.66,46.46,43.44,
+45.02,47.44,47.15,45.70,46.01,47.11,45.91,45.16,48.83,47.81,
+47.15,48.33,48.21,48.40,49.41,48.31,51.36,52.05,49.99,47.04,
+52.93,49.26,51.23,50.75,50.96,49.87,52.13,50.97,50.72,51.87,
+51.14,54.34,51.99,51.81,52.73,53.76,53.09,52.14,53.77,51.33,
+54.64,52.16,54.58,53.89,51.55,54.03,53.33,51.46,54.22,55.81,
+53.60,56.48,56.19,56.09,54.18,57.99,56.15,57.49,57.58,54.88,
+58.79,58.27,57.05,55.98,58.71,58.08,54.67,56.24,58.69,60.32,
+59.09,59.97,59.37,59.45,59.62,55.64,60.44,59.99,59.30,60.67,
+59.13,59.00,58.38,59.60,61.63,60.41,61.05,63.26,59.15,63.14,
+61.91,61.98,61.73,61.42,61.98,63.04,61.51,63.96,63.99,61.25,
+62.83,63.84,61.57,62.13,64.21,65.62,64.98,63.84,64.24,66.78,
+65.34,67.64,66.24,63.23,63.67,68.08,66.34,64.72,66.60,67.02,
+66.47,66.30,66.01,66.42,65.80,66.91,66.76,69.24,67.94,66.44,
+70.64,66.26,64.58,66.63,66.81,68.61,67.34,69.40,69.41,69.69,
+67.63,68.03,68.12,68.54,70.24,68.46,67.77,71.78,71.36,69.75,
+75.65,72.89,73.07,68.54,74.49,69.59,72.92,69.87,72.09,72.39,
+71.60,72.90,70.72,70.43,70.99,71.77,74.84,73.83,72.36,75.32,
+72.09,71.77,73.46,73.07,71.96,72.35,74.73,72.16,74.33,75.11,
+74.85,74.78,75.29,75.42,74.21,74.77,73.76,74.79,75.30,80.79,
+13.90,13.85,14.17,15.19,16.14,15.73,16.71,17.33,17.90,18.82,
+19.98,18.95,19.51,20.63,20.52,20.66,21.08,21.71,22.38,22.07,
+23.67,22.81,23.68,23.86,24.68,24.61,25.21,25.76,26.17,25.13,
+25.12,26.83,27.09,28.16,27.69,27.10,28.17,27.87,28.25,28.76,
+29.46,29.43,28.66,30.99,30.89,30.93,30.88,33.04,32.41,30.60,
+32.54,32.45,32.84,32.98,33.21,33.11,34.07,33.43,34.43,33.83,
+33.68,35.33,35.21,34.81,34.37,35.46,37.41,35.64,38.26,36.73,
+36.86,36.34,37.73,38.63,36.44,38.54,40.08,39.44,39.38,39.75,
+39.21,39.10,39.76,38.38,41.24,40.53,40.39,40.82,41.45,41.13,
+40.28,42.15,42.06,43.87,42.71,42.01,41.45,43.06,43.71,44.88,
+44.59,44.51,43.61,42.70,44.57,44.22,45.84,44.03,43.91,45.81,
+45.55,46.64,47.94,44.49,46.20,46.94,44.62,46.41,47.87,45.84,
+47.34,49.19,45.29,47.28,48.34,49.89,48.79,48.44,47.20,50.38,
+48.97,51.31,49.01,50.90,48.07,48.36,50.65,51.19,50.68,48.62,
+52.55,51.40,52.96,52.81,51.64,53.23,51.72,51.54,50.71,53.11,
+52.70,52.58,53.42,52.86,51.99,53.62,52.96,50.87,54.67,54.38,
+52.89,53.12,56.67,53.42,54.19,54.45,56.02,55.02,57.06,54.76,
+53.13,55.42,56.53,56.63,57.87,57.75,56.67,56.98,58.40,56.22,
+56.92,59.08,57.08,57.30,58.61,59.33,58.04,58.64,60.06,58.30,
+59.54,56.94,60.93,61.35,61.09,58.88,61.87,59.37,61.07,62.58,
+60.06,60.49,59.99,59.18,60.57,59.59,61.43,60.74,62.47,61.52,
+62.50,61.81,61.39,61.57,62.10,62.21,63.20,61.13,61.83,65.30,
+62.69,61.20,63.33,63.72,61.70,62.67,66.71,66.58,65.93,63.40,
+63.59,64.73,66.12,64.88,66.77,66.44,62.68,66.40,65.87,68.08,
+62.29,65.53,63.30,66.11,64.40,67.80,67.46,67.02,65.83,67.92,
+68.89,67.84,65.75,64.92,66.07,64.10,67.80,68.85,64.92,66.61,
+66.77,68.54,67.67,69.18,66.45,68.73,69.58,67.66,67.99,72.53,
+71.96,68.99,70.06,69.90,72.10,71.07,68.34,70.19,68.78,69.80,
+70.78,69.87,72.91,74.63,69.62,70.77,70.81,70.14,72.75,71.40,
+12.87,13.26,14.01,14.79,14.85,14.75,15.47,15.21,16.57,17.24,
+18.10,18.28,18.38,18.72,19.54,19.87,20.60,20.58,20.67,21.35,
+21.81,21.96,22.35,23.37,23.97,22.86,23.38,23.79,24.68,23.20,
+24.62,25.19,25.31,26.35,26.56,26.08,25.98,26.11,28.46,27.44,
+28.85,28.26,27.58,28.94,29.70,29.60,28.68,29.60,29.18,29.49,
+30.87,30.79,31.33,30.39,30.92,31.77,32.32,32.66,33.43,34.17,
+34.18,32.57,32.68,34.14,33.06,33.12,34.16,35.20,35.55,34.93,
+34.51,34.56,37.00,34.58,36.13,35.31,35.96,35.73,37.87,36.24,
+37.55,37.10,37.70,39.08,38.34,38.35,36.71,38.33,37.92,39.93,
+39.58,38.10,38.75,39.98,39.44,39.50,40.00,41.40,39.39,40.17,
+40.16,41.14,40.82,41.42,41.56,41.35,42.15,42.08,42.26,42.04,
+42.91,43.25,43.13,44.85,45.45,43.30,43.77,43.08,42.74,45.35,
+44.51,45.27,45.16,44.75,46.80,45.34,45.11,44.69,44.67,48.03,
+47.25,45.29,46.38,46.32,44.99,47.75,45.65,45.98,45.60,46.79,
+47.01,50.29,47.83,48.13,49.20,48.12,48.61,48.74,50.68,48.80,
+50.88,50.36,48.07,48.91,51.44,49.24,50.09,49.87,49.58,49.37,
+53.57,50.92,51.79,51.40,52.96,52.35,51.72,52.93,50.93,51.48,
+53.83,52.97,52.82,53.37,53.25,53.49,52.35,53.74,54.84,54.08,
+52.04,56.66,51.79,54.94,53.68,57.00,55.70,56.91,55.07,54.85,
+53.99,54.71,53.92,58.29,57.15,57.30,53.60,57.44,55.10,56.87,
+55.98,56.83,55.44,56.51,58.08,58.83,58.17,56.23,56.76,57.89,
+56.92,57.61,58.84,58.84,58.51,60.66,60.35,60.38,59.62,58.28,
+60.10,59.30,59.56,62.46,58.40,60.10,58.93,60.84,60.24,60.30,
+61.54,60.03,61.90,59.96,60.22,59.96,61.92,62.26,63.20,62.76,
+63.86,60.80,62.83,62.99,61.60,61.33,63.19,62.25,61.79,62.64,
+63.09,62.81,63.52,65.28,63.53,64.52,65.47,62.35,64.14,66.50,
+66.10,65.59,65.28,63.61,66.33,62.90,65.61,66.84,64.74,64.12,
+65.88,66.07,68.35,66.64,62.19,65.06,66.80,67.10,66.31,66.09,
+63.73,66.20,65.22,68.57,65.88,68.50,65.67,65.92,68.74,68.10,
+11.05,11.99,12.65,13.88,14.47,14.79,15.01,15.24,15.86,17.07,
+16.95,17.06,16.89,17.80,17.83,18.95,19.78,18.99,20.02,19.10,
+21.10,19.88,20.89,22.03,21.08,21.47,22.37,23.46,22.80,22.91,
+24.01,23.52,24.00,23.60,24.22,24.45,25.64,26.15,24.20,25.09,
+27.49,26.35,26.00,27.17,28.04,28.27,27.15,29.00,30.17,28.46,
+29.04,27.18,28.94,27.61,29.73,29.59,30.66,30.24,30.22,31.10,
+32.08,30.84,31.01,31.81,30.60,31.88,31.77,32.35,31.73,32.42,
+33.52,33.81,34.91,33.55,34.35,34.49,34.84,32.68,34.95,35.84,
+34.68,36.43,33.86,35.34,34.95,35.54,37.40,37.33,36.33,36.26,
+37.68,36.02,37.10,37.81,37.41,37.94,37.43,38.75,38.36,37.41,
+36.73,39.13,40.32,39.05,39.49,39.76,40.01,39.35,41.17,39.87,
+39.63,40.91,41.24,40.46,42.25,42.14,42.04,42.26,41.73,42.30,
+40.99,40.15,41.87,41.73,44.04,45.53,42.68,43.70,43.91,45.63,
+44.56,44.29,45.46,43.12,43.31,45.91,44.74,45.41,45.15,44.79,
+44.64,44.84,44.75,46.27,45.15,43.95,45.35,47.11,47.47,46.63,
+45.58,45.89,46.68,44.82,46.46,47.70,45.36,47.01,48.90,46.53,
+48.38,48.69,50.27,48.81,47.53,47.80,48.45,49.39,49.75,48.60,
+50.00,49.74,49.54,49.43,51.96,50.20,51.18,48.85,51.14,49.93,
+49.74,48.22,51.54,49.17,50.32,53.02,50.87,53.63,48.84,52.10,
+53.84,51.73,51.66,52.86,51.07,53.62,51.09,53.06,52.03,51.33,
+55.99,53.15,54.69,53.93,51.92,54.47,53.35,55.11,54.85,55.18,
+54.85,55.91,55.21,53.27,55.20,54.45,55.27,55.09,55.84,54.91,
+55.56,59.29,54.73,56.22,55.85,54.82,57.09,54.54,56.20,55.83,
+58.50,55.60,56.29,60.18,58.71,54.92,58.20,55.99,59.18,56.03,
+57.25,61.55,57.49,58.42,56.17,59.27,60.11,58.57,59.18,59.98,
+61.80,59.51,58.92,59.29,58.90,59.90,61.20,59.31,59.73,58.61,
+58.43,59.67,59.95,61.47,62.41,63.65,64.10,60.52,61.41,62.46,
+62.30,62.06,61.11,60.69,62.81,62.38,60.99,61.58,62.51,63.66,
+63.33,61.63,62.03,61.67,63.15,62.97,63.20,64.33,62.59,66.85,
+10.80,11.48,11.57,12.73,13.71,13.53,13.57,14.20,14.87,15.19,
+15.51,15.66,15.63,16.57,16.64,17.59,17.17,18.97,17.44,18.75,
+18.63,18.61,19.37,19.73,19.09,21.11,20.79,20.99,21.39,21.86,
+22.26,22.56,23.03,23.47,22.39,23.27,22.98,23.67,24.40,23.90,
+22.98,24.91,24.63,24.26,24.67,26.03,25.39,25.22,26.32,26.14,
+25.98,27.78,27.66,28.02,28.21,27.15,27.26,27.38,27.95,29.31,
+29.67,28.52,28.71,28.68,29.67,28.72,29.94,29.69,29.83,29.91,
+30.45,31.30,29.49,32.19,31.33,32.74,31.10,32.95,31.63,32.84,
+32.28,31.07,34.05,34.85,33.42,32.52,33.64,36.89,34.15,33.23,
+35.17,33.64,35.49,33.60,35.79,36.25,35.98,34.91,34.60,36.22,
+33.51,35.84,37.88,36.99,36.81,36.91,38.23,37.24,36.36,35.78,
+37.38,38.48,38.44,38.33,38.18,39.16,38.00,38.60,38.12,39.67,
+38.35,38.95,39.65,38.50,40.64,41.92,41.07,41.52,41.68,41.53,
+42.42,40.99,40.71,41.76,42.46,41.73,41.95,40.68,40.82,40.61,
+40.96,42.01,43.26,43.85,42.13,42.21,40.70,43.71,42.08,42.90,
+42.31,43.96,42.23,42.99,44.14,44.34,44.60,42.78,44.34,44.88,
+45.02,43.44,44.27,45.27,45.50,44.35,44.89,46.67,44.71,46.24,
+45.72,46.86,43.95,46.09,45.77,46.09,45.81,46.38,49.86,48.04,
+46.46,49.88,45.86,47.16,47.44,49.22,48.46,48.99,49.99,49.27,
+49.51,47.58,47.66,49.00,47.63,49.99,49.81,50.68,50.40,49.13,
+50.64,48.51,50.61,48.70,50.84,51.51,49.94,50.04,52.21,49.98,
+50.58,51.78,51.98,53.15,52.00,50.73,50.96,52.29,51.65,50.04,
+49.52,51.98,51.47,52.47,54.09,51.46,50.03,53.33,52.77,54.41,
+55.47,52.01,53.86,52.45,52.92,53.21,51.79,51.13,53.79,52.43,
+52.78,55.47,54.66,53.62,55.27,55.03,54.09,55.46,54.77,57.93,
+55.48,55.26,56.05,58.06,56.55,55.37,57.19,55.49,56.74,57.46,
+56.85,57.01,56.60,56.93,53.50,57.44,57.31,55.96,56.48,58.65,
+56.58,54.03,59.96,59.04,56.90,59.05,57.33,57.20,59.63,57.76,
+57.59,59.64,60.29,61.40,59.91,60.18,60.22,56.44,59.17,60.28,
+10.50,10.47,11.05,12.01,11.95,13.04,12.57,13.17,14.32,13.43,
+14.05,14.52,15.21,16.16,15.92,15.82,16.59,16.80,17.01,16.58,
+17.67,16.96,17.92,18.31,19.28,19.02,19.50,19.62,20.55,19.02,
+20.62,20.31,19.62,21.23,22.11,22.38,21.28,22.68,22.42,21.60,
+22.89,23.35,23.39,22.07,23.23,23.20,23.73,24.56,24.61,24.06,
+24.30,25.64,27.04,24.99,25.33,25.61,26.01,26.35,26.05,26.87,
+27.05,28.08,26.62,28.10,30.34,28.18,28.08,27.06,28.66,28.14,
+28.30,28.47,29.01,28.73,29.08,29.75,29.16,30.81,30.12,30.44,
+31.48,30.67,32.18,30.26,32.29,31.48,31.73,32.24,32.16,31.56,
+31.11,31.62,32.16,33.19,32.80,32.17,32.48,33.64,34.77,33.15,
+31.59,33.11,34.19,32.72,33.45,34.00,33.30,33.61,35.00,32.65,
+35.78,36.34,34.37,35.20,35.72,34.85,35.35,35.81,35.50,35.11,
+37.49,37.27,36.47,35.98,37.56,38.63,38.39,38.56,37.93,35.95,
+38.08,36.79,38.07,40.02,36.83,38.99,37.61,35.95,38.73,38.32,
+38.29,39.96,39.24,38.53,40.48,40.33,37.84,40.19,39.47,40.50,
+40.95,41.25,40.71,39.49,41.77,40.12,42.46,40.10,40.74,42.35,
+40.79,43.84,42.59,43.51,41.89,42.39,42.37,42.29,43.82,43.18,
+43.85,41.55,43.14,43.45,44.13,44.72,43.47,44.06,45.02,45.11,
+44.21,44.36,43.97,46.43,44.71,45.60,44.39,44.23,46.81,44.38,
+44.23,44.03,46.61,45.49,45.00,45.95,46.23,45.53,48.23,45.76,
+48.28,47.02,45.98,47.34,44.59,47.89,46.82,46.27,47.51,48.12,
+46.67,47.25,46.81,45.60,48.35,47.35,46.64,48.14,47.87,47.29,
+48.22,48.95,48.74,48.77,49.41,47.55,49.82,48.28,49.92,47.43,
+48.47,48.92,50.71,48.37,50.38,50.00,50.70,49.90,52.58,49.43,
+49.00,50.74,51.84,51.12,51.82,49.66,50.71,51.98,51.87,51.29,
+49.90,51.57,50.83,52.23,50.45,52.65,52.57,52.44,50.97,53.21,
+52.56,55.29,54.23,52.11,51.34,52.42,53.62,52.50,51.82,53.65,
+51.72,52.59,52.43,52.09,53.68,55.00,54.87,54.65,56.53,55.93,
+53.25,53.02,54.60,55.99,56.68,55.31,53.88,52.56,54.42,54.73,
+8.97,10.75,10.49,11.26,10.75,12.07,11.47,12.38,11.97,12.96,
+14.20,14.99,14.36,14.55,13.84,14.82,15.75,15.25,16.37,16.49,
+17.01,16.46,16.49,17.27,16.93,17.10,18.30,18.46,19.42,17.61,
+19.53,19.38,18.81,20.33,18.95,20.62,20.60,20.78,21.83,20.58,
+19.80,21.43,20.75,21.43,21.56,22.41,23.03,23.76,22.28,23.07,
+23.26,21.90,23.85,23.77,24.13,24.63,25.18,24.62,24.26,24.99,
+25.72,25.80,25.53,25.42,26.05,26.62,27.44,25.08,26.00,26.14,
+26.74,26.66,27.35,28.19,27.95,28.29,27.09,28.39,27.48,28.12,
+29.24,29.03,28.58,29.49,29.01,29.89,27.51,29.09,28.61,29.86,
+30.39,29.06,30.43,29.52,29.98,29.76,29.97,32.20,32.00,31.58,
+31.11,30.11,31.76,31.86,31.21,32.07,31.07,32.20,31.75,31.50,
+32.79,31.38,33.28,33.09,32.30,35.31,34.01,33.78,33.08,32.96,
+33.67,34.56,32.81,33.95,34.06,34.80,34.93,35.97,35.40,35.54,
+36.43,35.85,34.52,33.03,35.02,35.79,36.53,35.99,36.06,36.21,
+37.40,34.94,35.44,38.36,37.32,38.05,38.08,38.24,38.35,36.35,
+36.85,37.85,39.06,37.14,39.40,36.26,37.69,39.27,38.15,39.28,
+37.91,39.32,38.63,39.03,41.04,37.78,40.11,40.08,37.66,40.15,
+39.00,40.38,39.37,40.55,41.34,39.31,39.42,40.34,39.51,39.81,
+40.55,39.19,40.58,41.64,42.30,41.24,42.76,41.59,40.12,42.00,
+41.49,43.06,43.88,41.43,42.11,43.56,43.46,40.48,41.92,43.08,
+42.71,42.87,42.65,41.43,42.96,43.44,43.13,45.74,44.67,45.10,
+44.36,45.80,43.04,45.35,46.33,45.11,44.54,44.26,45.76,42.26,
+45.06,45.06,44.37,46.92,43.67,46.08,44.51,44.48,46.31,45.56,
+47.16,44.77,45.76,45.76,46.62,46.57,45.26,46.02,46.64,46.88,
+45.35,47.15,47.63,47.60,45.91,47.07,47.11,49.11,48.38,48.84,
+47.56,47.79,46.98,48.75,48.60,47.22,48.78,47.70,48.86,48.87,
+49.05,51.62,46.57,49.13,50.29,50.79,50.34,48.44,49.63,49.77,
+49.89,50.80,49.15,51.10,49.00,49.51,48.31,52.51,47.70,49.87,
+50.70,51.59,51.18,50.79,50.14,49.60,49.48,50.47,51.96,52.22,
+8.01,9.73,9.64,10.32,10.62,10.68,10.76,10.37,12.12,11.73,
+12.31,12.42,13.53,13.31,12.91,13.98,13.61,14.98,14.77,14.95,
+15.08,14.78,14.85,16.09,17.03,16.41,16.52,16.67,16.43,16.88,
+16.62,17.82,17.77,18.43,18.85,17.51,18.86,18.47,19.31,19.75,
+18.94,20.05,19.74,18.74,19.50,20.99,21.58,21.26,20.54,21.32,
+20.62,20.95,21.93,21.76,22.08,21.21,22.60,22.93,22.49,23.81,
+23.76,22.90,24.46,23.28,23.25,24.66,24.21,25.09,24.70,24.74,
+24.30,24.80,24.84,24.37,24.66,25.57,24.97,24.91,27.02,27.47,
+26.82,27.01,26.73,26.30,26.14,26.88,26.85,27.57,26.30,25.86,
+27.25,27.14,29.60,28.83,26.74,26.41,27.50,28.99,27.85,29.14,
+29.06,28.51,28.22,29.41,29.50,29.20,29.43,28.08,29.36,30.43,
+30.99,30.96,30.62,31.26,31.38,29.78,31.38,30.73,30.79,31.94,
+30.69,30.96,31.32,32.76,31.07,31.38,31.23,33.24,31.51,32.29,
+31.21,32.70,33.06,33.43,34.14,32.05,33.74,33.87,32.54,32.69,
+33.85,34.74,35.07,32.79,33.83,33.81,34.29,35.98,35.56,33.71,
+35.54,33.67,36.11,33.63,35.57,35.72,36.40,36.28,35.45,36.81,
+35.16,36.94,37.19,37.58,37.67,36.84,35.47,34.96,36.92,37.06,
+37.17,36.03,35.61,37.92,38.09,36.35,37.58,37.20,38.05,38.92,
+37.03,37.92,38.68,39.42,38.56,37.56,39.86,38.74,38.02,37.72,
+38.90,38.90,40.04,39.37,38.86,39.18,39.88,40.14,39.46,41.23,
+41.34,38.85,40.70,41.31,40.71,42.43,39.92,40.65,39.30,40.05,
+40.32,40.76,42.27,39.11,40.66,41.42,41.20,41.79,41.56,41.03,
+40.53,41.93,43.07,41.60,41.16,41.04,41.85,42.99,40.50,41.13,
+42.70,42.58,43.21,43.28,43.71,44.58,41.90,42.08,42.60,42.94,
+45.11,42.30,44.02,44.48,42.73,45.19,43.78,44.07,43.23,43.05,
+44.17,43.93,44.57,43.36,46.42,44.45,45.24,44.12,43.47,44.78,
+45.43,43.95,43.18,47.05,45.31,44.30,45.43,46.95,44.32,46.02,
+45.65,44.41,46.87,47.01,44.43,46.60,48.23,45.62,47.08,44.84,
+47.07,46.32,47.19,47.08,48.98,47.43,48.12,48.31,49.45,44.97,
+8.02,7.90,9.41,9.39,9.50,9.79,10.09,10.93,10.93,11.37,
+11.84,12.48,12.08,12.72,12.57,12.32,13.46,12.86,13.68,13.65,
+14.38,14.58,15.51,14.72,14.87,15.00,15.90,15.06,15.17,16.16,
+16.18,15.88,14.95,16.81,16.40,16.89,17.58,16.36,18.10,17.93,
+17.72,18.12,18.21,18.74,19.83,19.37,19.41,19.44,19.04,20.22,
+19.58,20.60,19.82,19.73,21.09,20.61,20.88,21.27,20.48,19.84,
+21.10,21.37,23.00,21.95,21.34,21.27,21.28,22.81,23.20,22.30,
+23.35,21.94,22.40,23.75,23.10,23.52,23.80,23.25,24.14,25.67,
+23.40,24.90,24.53,25.50,25.39,24.65,24.23,24.95,24.40,24.82,
+26.02,25.24,25.62,25.22,26.21,25.52,26.38,26.08,25.62,26.63,
+25.64,25.95,28.24,26.74,27.42,27.95,26.51,28.21,27.60,28.94,
+27.93,27.78,28.03,29.22,27.26,27.81,28.01,28.46,29.27,28.87,
+28.15,28.68,29.72,30.84,28.76,29.96,30.24,29.10,30.50,27.97,
+30.46,31.44,29.50,29.94,29.89,30.26,32.00,30.19,32.05,31.65,
+32.06,31.22,30.85,31.49,31.53,31.74,31.78,31.67,32.38,31.43,
+31.59,32.28,31.42,32.82,32.69,31.37,32.83,32.00,31.65,32.70,
+32.35,32.14,33.22,34.54,33.20,32.87,34.34,33.19,34.04,33.82,
+33.53,33.07,34.63,33.60,34.80,36.08,34.85,34.40,34.37,35.56,
+36.18,37.09,34.92,35.06,36.31,35.67,35.20,35.14,34.88,34.99,
+35.36,35.78,34.90,35.88,35.76,35.88,36.85,36.19,36.20,36.32,
+36.25,35.67,36.41,37.25,36.00,37.11,38.21,37.52,37.38,37.33,
+37.30,36.96,37.68,37.22,38.39,39.29,37.45,38.72,38.29,37.74,
+37.93,37.73,37.14,38.79,41.36,36.59,38.99,38.25,38.32,39.41,
+41.29,38.78,39.38,38.58,39.95,40.01,41.20,40.71,39.31,40.78,
+39.77,40.24,40.92,40.80,39.92,40.63,39.13,40.95,39.94,40.40,
+41.82,41.22,39.43,41.99,41.95,39.66,42.26,40.32,40.03,41.09,
+42.62,41.76,40.46,42.41,41.46,41.84,42.19,42.09,41.89,42.67,
+42.93,43.34,43.65,42.79,43.45,43.79,42.97,43.43,44.64,42.10,
+42.44,42.96,41.75,44.62,43.39,42.25,44.07,45.10,44.35,44.24,
+7.50,8.59,8.51,8.44,8.40,9.10,9.22,9.93,10.63,9.79,
+10.79,10.83,11.00,11.06,11.67,11.27,11.80,12.50,13.12,12.14,
+13.17,11.35,13.09,13.53,13.37,13.97,13.19,14.82,14.21,15.11,
+15.76,15.80,14.67,15.89,15.74,16.37,15.69,16.01,15.82,16.51,
+16.84,16.82,16.37,17.04,17.06,16.89,17.90,17.93,18.31,17.78,
+17.37,18.29,18.18,17.82,18.29,17.10,18.89,20.01,19.61,17.96,
+19.52,19.88,20.46,20.27,19.61,19.95,20.46,20.18,20.93,21.95,
+20.57,20.62,21.96,21.11,21.06,20.40,21.48,21.56,21.98,21.89,
+21.49,22.30,22.79,22.24,20.86,22.59,23.29,22.79,23.18,24.05,
+24.40,24.53,23.48,23.88,24.49,23.16,24.70,22.93,24.03,24.00,
+24.36,24.27,24.19,25.63,25.57,24.15,26.11,24.99,25.56,26.22,
+25.29,25.95,24.09,26.61,26.27,26.72,28.21,25.99,24.62,27.16,
+27.51,26.75,26.85,26.90,26.06,27.44,27.56,26.57,28.48,28.19,
+27.94,27.11,28.76,27.75,27.85,27.55,27.33,28.93,28.41,29.08,
+29.09,29.32,29.19,28.93,28.02,28.00,28.47,28.99,30.99,28.66,
+29.12,31.21,30.58,29.46,30.24,30.13,30.32,29.92,28.72,30.49,
+30.09,31.58,30.49,30.14,30.74,30.72,30.36,32.62,32.29,31.51,
+31.34,31.27,31.36,33.41,30.54,31.37,31.64,31.31,32.28,31.89,
+32.64,32.54,33.01,32.61,33.41,31.89,32.95,31.67,34.52,32.32,
+32.29,35.00,32.81,33.07,34.88,32.41,34.47,33.94,33.24,33.07,
+35.30,33.80,34.48,33.78,34.80,33.11,34.80,34.41,34.49,35.25,
+34.04,34.17,35.36,34.28,35.72,34.01,34.84,35.84,34.66,34.13,
+36.07,36.40,35.09,35.95,35.32,37.72,36.21,34.56,38.35,35.85,
+36.72,36.50,35.18,35.14,36.76,36.85,37.21,37.59,38.63,38.61,
+36.33,36.92,35.26,38.63,36.85,37.56,37.99,38.24,38.44,35.85,
+37.47,37.76,36.95,37.58,39.18,39.11,40.71,39.88,38.03,39.09,
+38.60,37.79,37.94,39.00,38.80,37.17,37.91,38.42,38.94,38.91,
+36.00,40.74,40.92,39.50,39.49,40.01,40.35,40.60,38.63,40.26,
+39.30,40.90,39.71,40.77,41.59,38.43,41.17,40.07,39.67,40.99,
+6.45,7.31,7.37,7.81,8.46,8.58,8.35,8.01,9.19,9.00,
+9.40,9.79,11.06,11.34,11.20,11.05,11.09,11.30,11.41,10.73,
+12.68,11.21,13.01,11.82,12.96,13.19,13.66,12.16,12.90,13.04,
+13.90,13.26,13.33,13.28,13.74,14.70,14.57,15.09,14.06,14.94,
+15.53,14.63,14.82,16.64,16.29,16.90,16.80,16.11,15.90,16.22,
+17.35,17.54,16.32,17.45,18.07,17.58,17.85,17.41,17.37,17.89,
+17.08,18.42,17.00,18.55,18.75,18.50,18.95,19.18,19.71,17.69,
+19.25,19.10,19.86,19.51,20.70,19.73,20.52,19.26,20.59,20.50,
+20.09,20.39,19.69,20.40,19.98,22.43,20.98,21.64,21.46,20.91,
+21.28,22.85,22.54,21.60,21.58,21.98,22.17,22.10,22.51,22.79,
+22.55,23.48,21.78,23.00,22.79,23.80,23.00,23.78,22.62,22.91,
+25.01,23.97,24.07,23.56,23.68,24.96,24.92,23.51,23.18,23.18,
+25.05,24.58,24.61,24.26,24.39,24.22,24.51,25.43,24.47,25.98,
+26.07,26.84,25.60,25.75,26.25,26.46,25.61,26.35,26.93,26.53,
+26.75,26.18,27.12,27.05,27.12,26.51,27.15,27.59,25.43,27.40,
+28.17,26.66,27.71,27.50,28.61,27.33,28.82,27.40,29.02,27.07,
+27.73,28.48,27.69,28.66,29.88,29.35,28.26,28.70,28.80,28.45,
+29.02,29.76,29.52,28.54,28.36,30.16,31.06,29.33,29.29,28.76,
+29.98,29.02,29.18,30.19,31.46,30.75,30.63,31.18,29.78,30.55,
+29.07,29.65,30.75,30.45,31.82,31.69,30.02,30.12,30.53,30.10,
+30.59,31.05,30.69,30.64,31.73,32.17,31.74,32.28,31.74,31.34,
+31.41,32.26,31.62,31.71,32.13,33.33,32.22,32.13,31.65,33.97,
+32.35,34.92,31.64,32.51,33.32,32.62,33.30,33.27,32.06,31.96,
+32.33,33.75,32.79,32.84,35.13,33.69,34.18,33.92,32.84,34.31,
+34.48,34.60,34.09,33.06,34.58,34.72,35.24,33.99,34.02,35.81,
+35.69,34.85,33.59,35.34,35.80,34.86,33.81,33.65,37.26,34.80,
+35.08,35.99,35.97,37.39,35.37,36.19,35.71,35.46,35.51,35.01,
+35.29,34.34,36.75,34.73,36.36,36.51,36.88,37.11,36.06,35.93,
+36.37,36.17,37.70,37.50,37.52,37.27,36.58,37.80,36.49,37.25,
+16.46,17.16,17.76,19.41,18.78,20.20,20.57,21.10,21.11,22.74,
+22.50,22.54,23.86,24.49,24.37,24.40,25.97,27.10,26.76,26.82,
+27.90,27.79,28.03,28.55,29.95,30.13,29.72,30.14,31.04,31.42,
+32.92,32.10,32.75,33.71,33.35,33.50,33.62,34.86,32.93,35.10,
+36.26,36.03,36.16,36.57,37.29,36.16,38.60,38.25,37.52,38.53,
+37.61,38.32,39.69,40.38,38.67,41.45,40.15,42.21,40.49,41.80,
+42.53,42.97,42.70,44.21,45.22,43.07,42.34,43.81,45.03,45.22,
+44.86,44.37,44.56,44.04,45.04,46.58,46.62,46.99,49.06,48.11,
+48.56,48.73,46.37,49.67,48.08,50.17,49.06,51.38,50.43,50.22,
+49.51,50.68,49.16,50.79,51.89,52.42,54.15,52.24,52.46,48.78,
+49.85,54.91,51.51,51.38,53.04,53.26,53.51,55.19,54.95,57.14,
+54.80,56.49,59.75,56.20,54.15,58.00,54.41,58.51,56.60,57.09,
+56.85,58.80,56.98,57.94,58.78,57.87,59.46,58.76,59.96,60.24,
+57.91,60.77,57.63,61.61,59.35,60.47,59.22,60.84,62.82,62.35,
+59.76,58.96,62.23,60.56,62.79,62.04,61.41,62.98,64.35,60.90,
+63.53,60.52,60.69,63.09,64.08,65.32,64.80,65.97,66.44,65.45,
+63.34,66.26,67.97,66.53,67.85,66.98,65.04,65.24,65.20,70.01,
+66.37,67.31,68.26,64.97,68.13,68.14,67.86,66.68,65.60,69.44,
+67.88,67.87,68.47,67.49,68.97,72.81,67.90,67.70,71.29,69.92,
+73.68,71.70,71.35,73.38,71.10,73.43,68.42,75.46,73.79,71.88,
+73.89,70.25,71.52,73.94,75.95,74.78,72.55,72.36,74.19,77.05,
+74.56,74.16,75.42,74.41,74.64,74.94,72.35,74.39,74.88,77.82,
+75.69,75.21,75.57,76.72,77.01,78.36,75.24,79.49,77.76,75.78,
+76.52,77.31,78.29,76.68,80.13,79.90,79.09,80.36,78.60,79.31,
+84.20,80.24,79.37,81.28,81.71,79.75,81.03,79.30,80.19,80.04,
+82.29,84.02,79.39,80.16,83.64,80.05,81.37,82.92,79.24,82.32,
+79.85,85.93,80.19,84.95,82.72,79.93,83.05,84.33,81.10,82.24,
+83.46,84.02,83.37,85.35,81.04,81.99,83.68,83.32,88.08,87.30,
+86.95,91.38,88.14,83.43,88.05,85.43,86.83,87.97,90.06,88.66,
+16.28,16.66,17.62,18.54,19.71,19.65,21.52,21.15,22.30,22.55,
+21.78,24.16,23.49,24.37,24.95,24.80,25.70,25.01,26.26,26.00,
+26.83,27.14,28.76,29.78,28.89,30.37,30.75,31.17,31.74,31.05,
+32.91,32.36,31.58,32.43,34.44,34.30,34.03,33.77,34.82,35.92,
+36.91,36.76,35.77,36.20,37.50,38.67,36.43,40.44,38.32,39.04,
+38.24,39.42,38.98,39.01,39.57,41.09,39.66,40.90,40.93,42.45,
+41.45,42.53,42.63,42.72,43.89,42.83,43.39,44.23,44.39,45.05,
+45.41,45.60,45.68,46.13,44.85,46.37,46.94,47.07,47.01,48.89,
+47.32,47.93,47.37,46.68,49.58,49.60,48.22,48.54,48.25,48.82,
+49.31,52.06,49.61,53.14,51.47,50.39,51.48,52.07,51.24,52.67,
+52.11,52.33,54.24,53.77,54.37,54.34,54.70,53.40,54.88,53.55,
+53.67,56.28,54.75,55.74,52.70,55.20,57.50,55.22,59.48,57.00,
+54.56,57.24,58.49,56.54,58.64,56.00,58.44,56.98,59.71,60.81,
+58.07,59.23,57.53,58.31,60.26,59.60,60.26,62.16,62.88,62.38,
+60.17,61.05,63.23,62.14,66.25,62.88,61.51,62.83,62.26,63.96,
+61.41,63.34,62.41,64.90,62.21,67.32,66.46,62.20,64.97,67.15,
+64.74,63.42,66.43,62.55,63.83,69.00,65.75,66.62,68.42,65.23,
+65.68,64.42,65.23,65.12,69.07,70.76,70.14,68.10,71.09,70.27,
+70.92,67.66,69.73,69.81,71.48,71.17,69.88,69.07,70.14,71.21,
+73.80,69.19,72.05,69.47,71.71,70.81,70.68,71.22,70.39,70.34,
+73.39,70.96,75.78,70.61,74.75,70.82,72.45,76.53,72.39,76.50,
+71.69,72.62,72.83,76.58,76.29,72.62,74.33,73.39,72.86,74.75,
+74.52,75.61,76.32,79.55,79.75,76.95,76.77,76.63,76.31,77.38,
+76.73,78.51,75.91,76.78,77.57,81.88,78.66,80.21,80.82,78.10,
+79.41,80.37,79.91,79.43,79.11,80.87,80.59,80.17,78.95,81.20,
+78.83,81.66,76.40,80.80,76.72,78.52,82.74,79.81,82.27,82.87,
+82.40,79.09,81.38,85.36,81.75,84.09,81.91,82.72,82.19,83.38,
+86.39,84.55,84.69,84.24,83.82,86.81,85.12,83.71,84.54,82.01,
+84.03,87.88,86.38,85.34,84.97,86.58,84.16,85.81,85.64,86.49,
+16.91,16.80,16.77,18.14,18.95,18.93,20.90,21.27,21.67,21.85,
+22.83,23.63,23.10,23.41,24.87,25.12,25.09,26.29,26.25,27.94,
+27.35,27.26,28.39,28.57,29.55,29.94,30.42,30.96,30.07,31.17,
+32.16,31.51,32.42,32.31,33.12,32.94,33.73,33.98,35.28,34.70,
+35.64,35.32,35.58,35.89,36.52,37.10,36.43,37.39,39.87,37.96,
+39.34,38.68,38.79,38.84,40.42,39.70,39.10,41.43,39.56,40.78,
+41.27,43.33,42.54,40.76,41.31,42.44,43.71,42.16,42.65,42.56,
+45.93,44.18,45.73,44.49,47.04,45.91,46.89,45.71,43.94,47.29,
+46.89,45.10,48.54,47.49,48.30,47.04,47.20,48.04,50.03,49.54,
+50.11,49.73,50.31,51.19,48.71,50.35,51.26,50.95,51.23,52.66,
+51.98,52.68,52.62,55.24,52.38,53.23,56.29,53.95,54.02,57.24,
+54.79,53.49,56.50,54.56,54.74,55.04,55.58,57.36,56.74,56.31,
+56.24,55.62,54.92,57.24,58.44,55.29,59.62,57.74,56.61,60.44,
+60.68,59.10,59.52,57.40,58.50,58.44,62.48,59.41,58.57,59.94,
+59.95,62.42,63.63,60.26,62.19,59.46,60.96,62.70,63.56,61.75,
+62.13,63.27,63.16,62.74,62.99,60.38,66.33,63.53,62.10,65.40,
+62.12,66.28,64.50,64.22,63.05,65.59,66.17,64.95,67.16,63.81,
+68.73,65.62,63.24,67.11,66.34,67.53,64.45,69.34,68.40,67.45,
+68.71,66.93,68.02,70.24,68.00,67.21,70.31,67.93,70.20,69.87,
+69.09,69.13,72.10,73.35,68.34,68.89,69.46,70.80,70.52,70.88,
+74.63,73.03,72.23,70.77,72.84,74.70,72.40,72.05,71.90,72.04,
+74.12,74.14,70.47,71.22,71.46,74.09,73.65,72.12,72.90,71.91,
+76.95,75.48,75.69,75.65,73.68,75.54,74.49,76.29,79.03,74.19,
+74.45,74.89,76.01,75.25,78.56,76.12,76.72,74.01,76.34,77.75,
+79.55,79.76,79.04,77.97,81.07,78.16,77.71,81.05,79.48,81.18,
+82.02,79.72,81.08,80.66,77.26,80.43,79.33,81.22,78.67,78.13,
+83.69,81.62,79.98,79.52,80.48,85.38,83.28,80.45,82.09,83.00,
+83.42,78.68,81.67,84.72,83.74,85.50,82.48,81.52,85.02,79.12,
+83.98,86.23,82.04,81.54,85.11,86.32,84.74,84.18,82.40,82.44,
+15.69,16.36,17.15,17.68,17.70,18.68,19.05,20.01,21.46,20.91,
+21.89,22.45,22.77,22.99,23.92,24.24,24.13,24.90,26.46,25.94,
+27.18,26.60,27.40,28.03,28.26,29.26,28.68,29.13,29.45,30.67,
+30.69,31.26,30.96,32.29,31.93,32.26,33.10,33.64,32.29,33.54,
+34.31,35.35,33.56,33.39,35.68,36.08,36.12,35.80,36.84,37.04,
+37.75,36.57,37.93,38.76,37.89,37.77,37.70,39.58,40.78,40.13,
+40.05,40.25,41.17,41.49,42.70,40.91,42.61,43.36,41.82,43.67,
+44.67,44.10,43.71,44.53,43.25,45.14,45.83,44.66,44.18,43.91,
+45.99,44.41,45.33,45.77,46.91,46.98,47.82,48.30,48.50,47.47,
+48.71,48.61,49.11,50.15,46.92,47.30,49.33,51.06,47.14,51.40,
+51.30,49.95,50.13,50.48,49.89,49.60,51.40,52.04,53.72,52.43,
+51.52,53.16,51.95,49.83,54.72,55.89,54.02,55.30,54.74,54.21,
+55.44,54.64,54.86,54.33,56.79,58.17,59.06,54.71,57.54,55.32,
+57.32,56.63,59.53,58.16,56.58,58.34,58.31,60.32,58.68,58.16,
+58.32,58.44,61.12,61.57,59.74,60.43,58.02,59.51,63.46,59.20,
+60.05,61.33,61.78,60.33,60.23,62.23,61.38,60.02,61.77,59.97,
+62.05,63.98,63.86,63.84,61.73,65.34,62.06,64.55,67.21,64.05,
+64.71,63.94,63.98,65.68,63.06,65.73,65.41,65.67,68.83,67.04,
+66.29,67.80,65.34,68.78,65.68,68.64,67.50,67.35,69.81,69.81,
+69.01,67.58,70.15,67.97,68.86,69.56,69.91,68.11,71.13,69.00,
+69.82,70.17,68.21,69.97,71.51,68.92,69.18,69.76,70.79,73.02,
+71.35,69.17,72.15,72.90,72.42,69.93,74.02,73.08,71.84,73.40,
+74.17,74.64,72.98,72.35,72.89,71.88,73.39,69.88,71.99,75.15,
+71.91,75.93,74.55,75.23,76.40,72.94,75.26,73.61,77.82,72.90,
+76.30,77.76,78.42,78.50,74.17,76.94,76.03,76.24,75.21,76.76,
+78.03,77.68,79.43,76.87,78.96,78.45,77.42,79.97,75.85,80.98,
+80.31,79.45,79.36,82.79,80.45,81.64,80.86,80.35,78.04,77.93,
+79.43,81.11,80.89,78.75,83.27,79.77,79.99,80.08,81.64,81.79,
+82.51,81.05,81.31,82.89,80.85,80.28,81.85,81.67,82.76,84.36,
+15.48,15.59,15.28,17.19,17.34,17.46,18.87,19.06,20.10,20.54,
+20.19,22.05,22.56,22.16,23.17,24.47,23.49,23.93,24.04,25.23,
+25.49,25.82,26.17,26.75,28.64,27.85,28.47,27.97,30.11,29.03,
+29.93,29.71,30.43,30.96,32.10,31.77,31.94,31.74,32.45,31.93,
+32.23,32.69,33.05,35.04,33.70,33.19,35.84,36.10,35.92,35.57,
+36.93,37.54,36.56,37.10,37.02,37.91,38.33,37.85,38.31,37.95,
+38.69,40.23,37.93,39.50,40.03,39.74,40.07,42.00,41.51,40.03,
+40.20,40.89,43.18,42.21,42.11,43.16,42.61,41.85,42.64,44.80,
+45.26,45.39,44.66,43.87,45.70,45.31,46.20,46.43,44.94,47.26,
+46.65,47.26,48.88,48.15,48.44,47.11,49.21,46.38,47.50,45.93,
+47.63,49.57,50.76,49.94,50.49,51.09,49.64,50.66,49.04,50.83,
+49.97,51.60,50.91,51.12,50.33,53.64,52.38,52.59,52.46,54.51,
+52.00,52.19,51.97,55.31,53.35,52.61,55.95,55.94,52.68,55.33,
+53.60,56.03,55.57,55.61,55.45,54.54,56.57,56.37,56.77,55.84,
+56.28,58.19,56.30,55.83,58.72,59.00,58.73,60.17,60.25,56.81,
+58.92,57.42,58.39,59.77,59.06,61.87,57.34,58.04,60.12,60.39,
+59.51,61.70,60.56,61.33,60.81,61.92,59.64,61.96,60.96,61.72,
+64.75,63.98,62.91,62.88,63.42,63.80,61.04,64.22,61.34,63.62,
+64.61,64.19,67.73,63.55,68.19,64.90,64.27,64.46,64.50,64.71,
+65.46,63.38,66.23,65.19,69.80,63.50,67.57,66.31,64.93,68.64,
+67.72,66.76,67.36,64.72,68.48,68.93,69.89,68.45,67.08,66.54,
+67.34,68.27,71.44,69.90,67.99,72.93,68.80,72.23,69.26,68.58,
+70.68,74.75,72.49,71.29,71.32,72.35,72.20,70.92,70.38,73.28,
+71.13,71.48,69.88,70.49,70.10,72.53,72.44,72.65,74.40,73.78,
+71.08,71.18,73.28,73.94,74.91,75.06,73.05,76.60,76.12,73.22,
+72.03,73.12,73.20,75.94,75.36,74.18,77.68,77.67,75.49,76.64,
+74.75,76.00,75.04,77.77,77.03,77.60,76.40,75.09,79.48,76.99,
+76.65,77.09,78.61,74.94,79.21,79.70,78.23,81.44,79.76,77.52,
+81.39,80.05,76.99,80.08,80.07,76.95,80.05,82.54,77.56,79.47,
+14.29,15.18,15.66,16.40,16.37,17.25,17.72,18.86,19.28,19.57,
+20.35,20.70,20.89,22.10,22.21,22.32,23.75,23.27,23.22,23.68,
+24.81,25.74,24.58,26.60,26.48,25.85,26.34,27.09,26.14,28.06,
+28.08,28.49,29.34,29.53,30.45,29.88,31.10,30.36,32.18,30.89,
+31.26,32.00,31.81,31.78,33.19,33.04,32.91,32.86,32.90,33.03,
+33.95,34.17,34.74,36.38,36.64,37.00,35.73,37.59,37.61,37.43,
+37.79,38.33,38.27,38.89,38.56,40.22,38.62,39.04,38.34,39.44,
+39.12,40.79,38.76,41.76,41.15,39.00,41.92,40.48,43.51,42.84,
+42.11,42.17,42.86,42.99,42.33,41.12,44.39,43.22,43.11,41.86,
+44.68,45.01,43.70,45.56,42.93,46.29,44.91,46.24,45.95,48.79,
+46.70,47.50,48.41,47.73,46.94,47.57,47.68,49.12,47.03,49.90,
+48.15,50.44,49.11,48.97,50.57,50.50,49.58,51.08,50.25,50.24,
+50.77,50.98,49.88,51.02,51.85,51.80,54.10,52.13,54.30,51.75,
+54.05,54.16,53.91,52.63,53.73,53.80,52.32,52.40,54.58,56.47,
+54.96,54.89,54.11,53.82,53.81,55.34,56.89,56.66,55.64,57.75,
+56.83,59.11,57.52,58.61,56.86,57.97,57.37,58.57,57.98,58.39,
+56.40,57.00,56.75,60.45,57.95,59.11,58.17,58.45,59.74,60.11,
+59.12,58.80,60.78,59.75,62.06,59.48,59.66,61.04,61.46,59.90,
+62.05,62.00,62.72,62.23,57.92,61.35,60.32,63.31,59.95,60.98,
+61.22,60.44,63.00,64.13,62.74,64.21,65.87,63.85,63.27,64.29,
+64.62,64.60,66.28,65.11,65.57,65.66,62.85,65.34,63.95,66.36,
+66.96,67.21,65.51,66.26,64.28,68.38,67.20,65.77,67.67,66.58,
+69.49,66.07,66.49,69.03,68.00,66.74,65.75,69.62,68.29,70.84,
+69.95,69.11,70.07,70.27,70.01,70.26,68.17,69.54,70.11,68.05,
+67.50,70.59,72.34,70.91,69.01,70.93,68.00,69.78,70.70,71.73,
+71.06,71.43,74.64,72.27,74.45,72.67,70.62,72.22,71.53,73.99,
+73.89,73.15,73.59,71.98,70.74,71.93,74.58,71.73,77.13,73.11,
+73.72,77.21,74.35,72.28,77.94,77.09,75.61,76.39,74.80,76.94,
+75.81,78.51,74.96,76.15,74.94,79.96,77.07,73.81,77.16,76.80,
+14.18,14.05,14.70,15.19,16.16,17.06,17.18,17.22,17.72,18.64,
+18.92,19.85,20.17,20.59,21.32,21.08,21.47,21.91,22.35,22.57,
+24.66,23.35,25.65,24.18,25.07,24.42,26.56,26.10,25.65,25.83,
+26.41,27.12,27.97,29.62,27.00,28.91,29.03,29.27,29.76,30.39,
+29.89,29.44,30.16,30.21,30.60,30.79,31.98,31.48,32.02,32.88,
+33.99,33.01,33.04,33.68,34.41,34.28,32.94,34.54,35.50,33.95,
+34.15,35.55,35.58,36.88,37.53,35.93,36.08,38.44,38.22,38.17,
+38.70,38.43,39.24,37.96,38.97,39.32,40.35,40.25,40.20,38.49,
+40.69,39.74,40.67,40.49,38.16,41.63,42.03,41.24,42.12,41.49,
+42.22,42.50,41.62,43.88,44.15,44.22,43.49,41.87,44.94,44.34,
+42.04,45.86,44.03,45.25,44.55,43.45,45.53,45.29,44.62,44.30,
+45.81,47.23,47.35,46.19,47.00,47.68,46.59,47.04,46.16,47.08,
+48.27,47.83,49.74,49.22,50.67,49.00,50.34,48.28,49.72,51.19,
+49.78,50.36,50.52,50.63,50.83,52.25,50.56,51.45,51.60,53.41,
+50.80,50.41,51.32,52.44,51.97,52.64,52.25,52.50,52.42,54.27,
+54.35,53.01,53.56,54.78,56.01,54.84,54.30,55.86,53.58,53.98,
+56.54,54.07,54.95,55.18,55.99,53.17,56.99,56.18,57.27,57.53,
+57.48,60.20,57.19,56.66,58.08,58.31,57.88,55.20,57.71,58.29,
+59.17,57.18,57.12,58.71,57.99,59.83,58.58,61.47,60.34,60.47,
+61.81,60.20,60.90,59.51,58.99,59.29,60.19,61.79,61.03,63.55,
+60.43,63.39,65.85,61.37,60.99,61.94,62.19,60.67,63.63,61.52,
+62.34,63.48,65.00,62.96,61.57,63.70,65.41,63.63,62.73,63.54,
+63.17,65.76,62.52,66.02,64.00,64.46,64.27,65.55,64.66,65.26,
+66.20,66.39,66.16,65.24,65.72,67.53,66.44,67.37,66.36,67.57,
+66.36,67.68,67.77,67.70,68.51,69.49,66.11,70.61,66.44,69.81,
+69.54,65.74,66.49,71.30,66.66,70.16,64.88,66.82,71.91,68.39,
+72.11,69.12,69.80,71.24,71.32,71.97,72.65,73.06,69.20,69.27,
+68.32,68.09,69.96,70.36,69.40,70.22,69.07,73.00,70.84,72.25,
+70.26,70.10,72.97,73.61,71.59,73.84,71.87,72.85,69.93,72.41,
+13.12,13.52,14.67,15.53,16.00,15.18,15.71,16.78,17.38,18.24,
+17.71,18.48,18.74,19.75,20.52,18.96,21.29,21.03,21.66,22.65,
+22.16,22.75,22.21,23.04,23.10,24.96,24.60,24.12,24.84,25.18,
+25.74,25.55,26.81,25.68,26.65,28.23,27.00,27.61,28.04,27.14,
+29.29,28.53,28.45,28.63,29.89,29.51,30.44,30.14,32.07,29.79,
+31.33,31.05,32.17,31.39,31.78,31.31,32.02,33.74,32.71,33.64,
+33.40,34.73,34.07,34.97,34.98,34.79,35.38,35.56,35.19,35.39,
+36.05,35.39,37.71,35.72,35.50,36.66,37.06,38.13,35.97,37.46,
+38.99,39.28,37.19,37.98,38.87,40.02,39.96,38.10,38.58,40.56,
+39.80,39.87,41.66,41.56,38.72,39.97,42.34,40.75,40.27,41.92,
+43.54,43.77,41.57,42.49,43.55,42.31,42.34,42.00,44.74,45.40,
+44.15,44.49,44.73,43.50,45.14,46.70,45.67,45.49,45.16,44.78,
+43.79,45.55,45.45,46.48,45.52,46.03,46.00,45.13,47.88,46.78,
+49.40,47.03,47.09,46.51,47.95,49.29,45.95,48.85,47.99,49.80,
+47.85,50.82,50.35,49.89,50.19,49.74,48.35,50.79,49.13,52.24,
+48.85,50.26,51.28,52.73,50.98,51.83,51.62,51.91,53.23,52.58,
+54.93,52.96,53.13,52.83,52.04,52.97,50.79,53.24,51.22,52.14,
+53.00,53.22,55.38,54.27,53.02,54.43,53.81,55.13,55.30,54.92,
+56.80,53.72,53.83,54.81,56.50,55.78,56.29,57.73,56.85,57.35,
+56.64,55.72,56.57,58.95,59.31,59.39,57.58,57.55,57.85,58.12,
+59.03,56.47,57.16,57.29,58.83,57.96,60.59,61.34,59.42,60.36,
+59.25,58.41,60.10,59.77,61.65,60.17,60.95,58.72,61.16,60.81,
+59.99,61.47,59.99,61.12,59.11,61.62,62.18,62.33,62.40,62.76,
+60.40,61.72,61.56,63.80,60.58,58.60,65.72,62.93,62.67,62.89,
+61.27,62.79,63.57,64.68,63.49,61.97,67.23,62.12,64.29,64.29,
+67.21,63.76,63.31,64.60,66.06,64.63,66.23,62.57,66.68,63.91,
+65.22,66.13,63.77,64.93,69.32,68.48,67.92,65.20,67.46,69.46,
+65.87,65.84,68.48,65.59,64.66,65.07,67.17,69.56,67.20,68.39,
+69.52,68.92,68.45,68.04,68.29,67.68,67.71,66.36,69.64,65.68,
+12.37,13.13,13.84,13.79,14.69,14.83,14.66,15.61,16.48,17.05,
+16.76,18.13,17.98,18.77,18.29,18.36,19.35,20.29,20.00,21.00,
+21.28,20.34,21.20,21.87,21.07,21.98,23.68,22.94,24.37,23.38,
+25.11,24.70,24.17,24.81,25.38,25.34,25.59,26.26,25.98,27.24,
+27.12,26.58,26.86,26.99,27.44,28.30,29.33,29.52,28.09,28.85,
+30.26,29.29,29.77,30.41,29.52,31.65,29.88,31.12,31.90,30.56,
+30.68,33.14,33.58,31.80,31.68,32.35,33.44,34.11,33.64,33.58,
+33.90,33.39,34.89,33.77,32.60,33.84,36.74,35.67,33.70,34.77,
+34.78,37.53,37.26,37.20,36.43,38.64,37.43,37.18,38.06,37.90,
+36.66,37.71,38.55,38.83,37.80,38.46,40.12,37.07,39.65,39.90,
+39.25,40.27,39.52,41.07,41.31,39.85,39.96,40.27,41.65,40.95,
+41.44,40.14,43.63,41.61,42.74,41.74,43.23,43.35,43.33,43.08,
+42.87,43.31,41.59,42.56,43.51,43.99,43.76,45.74,44.89,45.62,
+44.85,45.24,44.41,47.43,46.58,47.21,44.04,46.88,44.99,45.44,
+47.32,47.75,45.44,44.75,47.59,45.54,49.10,46.12,46.50,47.74,
+48.66,48.29,46.95,49.89,50.56,49.03,46.98,49.22,52.03,48.05,
+49.47,50.33,49.82,48.59,50.81,48.27,51.45,49.09,50.72,50.97,
+53.17,49.28,51.52,51.89,49.34,49.16,50.67,51.63,52.09,52.50,
+54.47,50.60,51.67,53.89,52.80,52.31,53.16,54.96,52.65,51.28,
+56.35,55.81,54.29,53.35,55.10,53.69,55.06,52.02,54.16,54.82,
+56.49,56.22,55.28,55.77,54.39,55.40,54.46,56.30,56.90,57.17,
+56.72,54.68,55.17,56.82,56.20,58.79,57.50,56.92,56.02,57.60,
+54.95,57.13,57.45,59.32,57.72,58.25,58.52,56.78,62.17,57.44,
+57.09,57.98,56.87,59.09,59.90,58.48,59.79,60.62,58.98,60.36,
+60.35,58.67,58.85,59.45,61.02,60.69,63.11,62.65,63.85,60.38,
+60.68,62.64,60.87,59.42,60.27,61.49,62.25,60.99,62.46,62.81,
+60.94,63.30,62.08,61.42,61.99,62.05,65.71,60.80,62.21,64.37,
+63.09,60.78,64.60,63.54,60.90,64.07,62.60,63.92,65.51,63.40,
+62.61,65.13,63.56,66.16,64.86,65.72,66.01,66.09,62.69,68.32,
+12.02,12.32,12.68,13.45,13.70,14.21,14.23,14.09,15.20,15.68,
+16.98,16.89,16.64,18.70,17.18,18.13,17.63,18.78,18.86,18.82,
+19.18,19.50,19.82,20.92,21.67,20.42,20.94,21.53,22.86,22.85,
+22.34,23.62,23.01,23.25,22.27,23.45,24.51,23.63,24.57,24.62,
+24.99,24.41,25.59,26.00,26.18,25.83,27.03,27.60,26.84,28.26,
+26.63,28.04,28.66,27.98,28.28,29.75,29.19,27.83,29.78,30.00,
+29.94,30.15,30.35,28.94,30.29,30.83,30.96,31.61,30.66,32.14,
+32.31,32.17,31.56,33.57,32.50,33.38,32.61,34.48,33.99,33.24,
+33.81,35.17,34.45,34.22,36.01,34.88,34.00,34.97,34.99,35.27,
+35.60,35.89,35.83,37.34,36.67,34.87,37.03,35.28,35.88,36.76,
+38.46,37.35,36.88,38.41,38.30,38.47,38.83,39.57,38.89,38.05,
+38.26,39.85,40.25,38.80,39.18,39.10,40.14,41.24,41.07,39.63,
+40.12,40.24,40.34,40.77,40.27,40.37,41.63,40.16,42.58,43.09,
+41.33,42.01,41.80,42.53,42.45,44.63,44.31,44.84,43.27,43.57,
+43.42,44.66,42.82,43.00,44.31,43.39,43.88,45.13,43.41,45.27,
+45.23,46.08,46.98,46.46,44.59,44.82,46.82,45.21,44.48,46.29,
+46.07,47.73,47.08,45.79,46.09,46.29,44.70,47.72,46.82,49.01,
+47.23,47.83,45.20,48.84,49.86,50.70,48.02,47.48,50.02,48.41,
+50.63,48.46,47.20,46.30,51.50,48.33,50.23,51.82,51.18,49.95,
+49.71,50.33,51.40,50.32,50.63,50.68,48.61,51.33,51.20,50.25,
+52.37,51.12,49.89,52.99,50.58,51.62,53.44,52.63,49.50,52.92,
+55.36,53.44,50.84,53.15,53.85,53.65,53.87,53.07,53.09,55.48,
+52.89,52.76,55.64,51.64,54.16,53.75,55.34,53.47,54.24,55.62,
+56.28,53.86,54.40,53.73,56.60,54.81,55.48,55.84,55.87,56.33,
+56.14,54.30,55.82,56.51,55.92,58.17,54.75,57.57,57.02,56.74,
+58.26,55.84,59.39,56.31,57.37,57.56,56.42,56.79,57.98,58.86,
+60.22,59.82,59.42,58.75,59.19,58.99,57.74,59.86,57.83,58.53,
+59.62,59.93,60.92,59.43,63.31,60.21,60.28,62.05,59.86,59.01,
+60.53,62.84,60.49,59.12,60.85,62.03,60.21,59.80,62.85,59.76,
+10.91,11.72,11.62,12.02,12.38,12.32,13.06,13.89,14.56,14.38,
+15.59,15.42,15.57,15.62,15.56,17.41,17.66,16.64,17.53,17.12,
+18.66,19.29,18.48,19.84,19.21,20.26,19.05,20.41,20.81,21.49,
+20.78,22.65,21.01,21.72,21.89,22.45,21.87,23.08,22.84,23.18,
+23.60,24.85,23.71,25.27,24.34,24.24,25.43,24.57,24.65,25.41,
+25.42,25.46,25.63,24.89,26.36,25.64,28.29,26.73,28.90,28.09,
+26.90,27.32,28.45,27.20,28.34,29.49,30.05,28.84,30.28,30.06,
+30.02,29.76,30.08,30.25,29.28,30.63,30.75,29.71,30.96,30.54,
+31.24,31.11,31.87,31.49,32.20,31.67,33.28,34.05,32.82,31.95,
+32.18,32.68,33.08,32.28,33.32,34.60,34.94,33.13,34.16,34.92,
+33.13,35.49,33.58,35.19,36.64,35.17,35.89,35.71,35.80,36.66,
+37.61,37.75,37.12,37.67,38.93,36.69,36.79,36.26,39.82,38.59,
+38.18,35.71,38.06,38.04,39.76,40.02,38.94,37.79,39.59,39.36,
+39.09,41.68,39.26,40.64,39.50,40.51,40.41,42.17,41.37,39.43,
+40.20,40.62,41.00,42.14,39.59,39.92,40.13,42.68,41.06,41.47,
+41.99,42.95,40.30,43.85,43.59,43.76,42.57,43.65,43.16,43.79,
+41.17,43.51,43.66,44.13,43.73,43.70,42.64,42.93,44.35,43.99,
+44.98,42.85,43.97,44.16,45.22,46.07,46.37,44.80,45.80,45.68,
+45.52,44.98,47.04,46.02,46.78,46.03,46.22,46.00,49.36,45.26,
+47.11,45.79,47.33,46.42,46.81,48.92,47.55,49.86,48.05,48.14,
+47.08,47.28,46.92,49.01,50.29,50.31,49.04,47.72,48.01,49.49,
+48.82,48.25,51.61,50.31,49.49,50.06,49.43,49.40,48.56,49.88,
+49.20,49.41,50.56,50.61,52.38,48.54,50.93,49.45,53.34,52.03,
+52.46,51.50,48.87,52.38,52.66,52.28,52.92,50.79,51.37,52.19,
+50.59,52.93,51.38,52.13,54.04,52.16,52.90,51.65,52.42,54.53,
+52.02,54.25,55.21,53.39,54.93,53.19,54.62,54.84,56.21,54.66,
+54.01,53.97,54.21,55.28,54.29,54.10,55.41,55.60,56.71,56.34,
+55.46,56.59,53.87,56.19,54.44,57.44,56.13,56.84,57.07,56.37,
+56.61,54.68,56.56,55.68,57.90,59.23,57.56,57.91,55.79,56.47,
+10.26,11.11,11.30,11.53,11.41,12.47,12.71,12.91,13.55,13.28,
+15.15,14.79,14.21,15.26,15.39,15.07,14.96,16.98,16.67,17.00,
+16.47,17.57,18.17,17.44,17.98,18.95,18.47,19.55,19.42,20.31,
+19.56,19.82,20.37,20.21,20.48,20.68,20.85,21.75,21.53,22.29,
+22.82,22.30,22.39,22.77,23.83,23.33,22.89,23.69,23.66,23.45,
+23.19,23.60,24.22,23.93,24.38,24.89,25.04,24.99,26.46,24.90,
+26.22,26.38,25.78,26.19,26.10,26.71,27.32,27.91,27.11,28.20,
+27.66,28.47,28.82,28.46,27.25,29.87,29.82,29.08,29.98,29.44,
+30.28,28.63,30.19,28.52,29.30,30.69,30.80,29.39,29.99,30.87,
+31.19,31.13,31.63,32.23,32.30,31.06,30.71,32.78,30.79,31.91,
+31.97,34.30,33.21,33.12,33.38,32.67,33.00,33.13,32.73,34.05,
+33.42,33.59,35.27,33.27,34.91,33.44,34.59,32.62,35.32,35.42,
+34.99,35.59,35.03,35.46,36.22,36.31,37.22,35.89,35.74,36.84,
+36.33,37.76,36.41,36.35,36.40,37.21,36.80,37.65,36.93,38.57,
+38.98,37.53,39.71,36.19,38.52,38.66,38.19,39.10,39.40,39.01,
+38.90,39.00,39.82,40.43,39.45,40.30,39.80,40.63,39.07,40.81,
+39.29,40.79,40.68,40.52,40.21,39.71,42.04,40.93,42.12,41.61,
+42.24,38.41,42.24,42.22,41.15,39.81,41.09,40.57,42.54,42.48,
+43.07,41.99,42.82,43.46,43.13,42.36,43.93,43.87,42.89,44.52,
+43.05,44.64,43.46,42.41,45.21,43.21,43.77,42.41,46.50,46.14,
+45.45,45.32,44.17,45.66,43.78,44.22,45.30,45.54,45.94,45.55,
+48.17,46.59,45.80,44.38,45.38,45.91,45.82,46.25,45.52,47.20,
+45.83,46.79,47.07,45.58,47.30,46.77,46.43,47.94,47.62,47.22,
+47.86,47.14,49.05,48.34,49.90,48.87,47.93,46.50,47.90,49.60,
+49.84,49.32,49.78,48.32,47.84,49.26,49.27,48.54,49.15,48.21,
+51.80,50.74,49.17,50.40,52.92,50.72,47.48,50.44,49.41,51.68,
+48.99,51.54,51.37,49.59,52.86,52.41,50.19,52.38,49.75,50.46,
+50.82,51.35,51.61,50.66,53.44,53.00,54.17,54.26,53.61,52.08,
+52.57,50.72,53.63,53.56,51.47,52.87,55.35,50.28,51.51,53.92,
+8.47,10.21,10.68,11.55,10.34,10.88,11.13,11.69,12.36,13.26,
+12.18,13.13,14.19,13.79,14.07,14.97,14.46,14.70,15.71,16.36,
+15.75,15.54,16.33,16.85,16.54,17.16,16.91,17.95,18.62,17.91,
+18.67,19.47,18.48,19.25,19.89,19.15,19.67,20.11,20.11,20.38,
+20.35,19.90,20.42,21.29,22.66,21.35,20.55,21.64,23.62,20.70,
+21.68,22.53,22.46,22.10,24.41,23.08,22.58,23.76,22.94,22.95,
+23.15,25.85,25.06,24.54,24.59,24.98,24.80,24.56,25.90,25.25,
+26.11,26.13,26.85,27.89,26.99,26.44,28.08,26.71,26.55,27.71,
+25.94,26.73,27.86,27.50,28.21,29.09,27.06,28.22,28.46,29.17,
+29.06,28.28,27.93,27.61,28.96,28.71,29.36,30.41,30.15,31.06,
+30.51,30.00,30.28,30.48,30.96,29.40,31.94,29.04,30.95,30.78,
+32.81,32.84,31.30,30.48,30.73,32.50,33.08,32.63,31.80,32.91,
+32.70,31.87,33.86,34.47,34.59,33.51,34.39,33.11,33.10,34.43,
+32.40,35.34,34.23,33.78,33.93,33.91,34.72,33.24,35.38,34.64,
+35.56,35.22,35.38,34.67,36.62,33.52,37.10,35.98,36.39,36.01,
+37.42,37.78,36.75,37.14,36.12,37.70,37.18,37.68,37.48,37.58,
+38.42,39.01,38.82,37.43,36.74,36.50,38.58,37.33,39.40,37.63,
+37.31,38.09,39.39,38.07,39.75,39.26,39.61,40.06,39.69,38.01,
+39.58,41.60,39.43,39.26,39.96,40.86,39.79,40.32,39.66,41.33,
+41.24,40.84,41.62,40.96,41.08,42.52,41.74,41.24,40.80,41.18,
+41.66,41.11,40.97,41.01,41.79,42.13,40.91,41.79,43.38,41.46,
+42.80,43.17,44.08,42.29,43.96,42.97,42.25,44.40,44.61,44.12,
+43.49,43.84,42.14,42.88,44.10,45.16,44.79,43.77,43.85,45.51,
+44.10,45.33,44.46,44.06,45.29,47.08,45.12,46.34,44.13,45.51,
+46.22,45.79,45.21,46.67,46.12,46.93,44.33,44.35,44.57,45.94,
+47.15,44.40,46.41,46.59,48.19,45.66,47.71,46.10,46.52,46.14,
+45.73,46.55,46.83,46.27,47.59,46.13,48.96,46.55,48.28,46.86,
+48.81,49.60,48.05,48.44,47.38,50.14,47.51,46.22,49.17,49.67,
+50.61,48.47,48.51,47.99,50.56,50.54,49.58,51.24,50.58,50.80,
+8.31,8.45,9.70,10.13,10.20,10.23,10.79,10.17,10.90,11.71,
+11.97,12.45,12.95,13.78,13.74,13.16,14.93,13.62,13.65,14.76,
+15.22,14.76,15.15,15.09,15.35,16.85,15.96,16.35,15.26,16.70,
+16.76,18.17,18.06,16.22,18.08,18.19,18.63,18.27,17.91,18.06,
+19.03,20.00,19.27,20.06,20.41,18.93,19.48,20.45,19.53,20.32,
+21.16,21.50,21.60,20.21,21.99,22.37,22.10,22.86,22.94,22.55,
+22.03,22.02,22.34,23.10,23.14,22.18,24.12,23.42,23.28,23.58,
+23.31,23.13,24.41,24.40,25.03,24.02,24.32,24.71,25.34,25.25,
+24.85,26.39,26.04,26.25,25.45,25.26,26.91,25.19,26.55,25.94,
+27.68,27.32,26.36,27.59,27.21,28.68,27.17,27.66,27.57,28.01,
+27.02,28.07,28.21,28.48,28.19,26.51,28.70,29.30,29.32,28.97,
+28.55,28.54,28.49,30.61,30.39,29.64,28.00,30.60,31.89,31.88,
+29.11,31.41,30.54,30.87,31.80,31.46,31.28,30.29,32.19,32.54,
+33.07,31.52,32.84,31.39,32.53,31.32,32.35,31.81,32.31,32.64,
+32.34,32.09,31.25,31.78,33.02,32.15,33.81,35.05,32.45,33.47,
+34.57,31.99,33.89,34.69,32.41,36.31,34.68,34.54,33.58,34.19,
+34.86,34.77,34.59,34.30,35.56,35.19,35.19,37.06,35.14,36.53,
+35.84,35.74,36.44,37.18,36.50,36.13,36.10,35.16,36.51,37.24,
+37.95,37.68,37.23,37.62,35.77,36.12,36.73,37.99,37.32,38.49,
+35.09,39.65,38.43,36.44,38.99,36.55,39.07,38.93,36.98,38.56,
+39.11,38.67,38.82,39.49,38.37,40.98,39.45,39.86,39.32,40.97,
+38.23,39.45,38.64,39.35,38.41,39.29,40.42,39.40,41.06,41.69,
+39.22,42.03,41.04,41.58,40.11,41.72,40.25,39.96,40.54,40.65,
+40.86,40.73,40.37,41.51,41.84,41.38,42.19,41.59,42.68,40.92,
+41.53,43.52,40.42,41.65,44.01,42.41,40.45,41.05,43.42,43.85,
+43.40,42.32,42.54,43.12,43.27,44.22,45.27,43.26,42.47,43.78,
+45.82,43.17,43.03,43.93,42.62,44.97,44.09,43.22,44.57,42.95,
+42.75,43.39,45.98,43.62,46.04,43.14,44.24,45.24,45.76,43.47,
+45.96,46.06,46.18,46.63,48.33,46.23,42.82,44.24,47.12,46.03,
+7.90,8.36,8.26,9.75,9.15,10.35,9.75,10.44,10.84,10.56,
+11.64,11.95,11.75,11.26,12.69,12.11,12.22,13.02,12.83,13.17,
+12.99,13.27,14.17,13.92,13.70,14.63,14.95,14.54,14.99,15.20,
+15.05,16.43,15.91,15.69,16.72,16.94,17.92,16.57,17.61,17.41,
+16.49,17.32,18.95,18.64,18.39,18.42,19.36,18.71,18.68,18.47,
+19.47,19.63,19.41,19.90,20.54,19.93,20.96,20.55,20.42,20.87,
+21.09,22.03,21.74,21.22,21.32,22.05,21.20,22.09,21.84,22.72,
+22.40,21.92,22.10,21.84,23.26,23.29,22.41,22.47,22.47,24.92,
+23.16,24.36,24.19,23.68,22.20,24.06,24.45,23.77,24.86,24.43,
+24.36,24.43,23.66,25.53,24.43,25.64,25.52,26.07,24.40,24.54,
+25.44,26.38,27.15,25.85,26.63,25.65,26.79,27.22,27.14,25.74,
+25.86,25.97,27.67,27.75,27.44,26.36,26.39,27.62,29.91,27.51,
+28.27,28.77,27.47,29.31,28.71,29.69,28.94,29.23,29.01,28.40,
+29.58,29.77,29.77,30.62,29.40,30.43,30.78,29.77,30.02,31.21,
+30.81,30.60,30.79,31.02,29.05,29.50,29.46,31.57,31.03,29.88,
+31.36,31.21,31.20,30.63,31.22,31.00,32.26,34.17,32.17,31.36,
+32.28,31.49,32.36,32.01,32.59,32.62,32.17,32.40,32.21,33.82,
+32.79,32.86,33.21,32.56,34.11,33.55,35.18,34.24,34.39,32.23,
+34.09,33.72,34.41,35.02,33.44,34.64,34.19,33.64,34.22,35.62,
+34.02,33.50,33.80,36.13,34.87,36.33,35.06,34.35,36.22,35.88,
+34.96,35.58,35.45,35.24,36.12,35.55,34.97,35.91,36.81,36.43,
+38.67,38.03,36.26,36.01,39.36,37.80,35.78,36.88,36.70,37.14,
+36.91,38.08,37.55,37.29,38.89,38.43,37.13,37.89,37.30,38.04,
+39.71,38.90,39.88,37.72,38.04,38.52,38.35,39.41,39.18,39.90,
+36.99,38.72,37.27,42.00,39.06,38.57,40.03,39.60,39.59,39.90,
+38.55,37.70,38.93,39.45,40.18,38.80,40.76,41.23,41.24,40.27,
+40.99,39.76,41.90,42.29,40.92,41.10,40.98,41.68,42.22,42.37,
+41.22,42.35,41.40,41.83,42.32,40.57,42.57,39.38,40.49,41.89,
+41.75,44.18,42.40,41.82,42.19,42.02,43.13,43.48,42.22,43.27,
+16.95,18.05,18.66,19.34,19.89,20.62,20.79,21.14,22.21,21.80,
+23.83,23.93,24.18,24.18,26.32,26.26,25.70,27.11,28.44,28.33,
+27.51,27.93,29.29,29.62,29.77,30.70,31.44,31.92,30.71,32.43,
+31.85,33.27,35.43,34.33,34.27,35.45,35.49,35.70,35.20,36.58,
+37.54,36.35,37.03,38.00,37.79,37.43,38.70,39.01,39.21,40.04,
+40.08,39.62,41.34,41.43,40.99,40.67,41.94,42.59,42.57,44.38,
+42.26,44.31,43.89,45.45,44.16,44.34,44.42,45.66,46.57,44.92,
+47.73,45.05,47.88,47.12,48.18,46.87,48.76,47.89,48.22,48.45,
+48.71,49.61,51.48,49.82,48.98,50.18,52.05,51.62,50.96,49.98,
+52.48,50.50,51.07,53.63,50.59,53.30,51.61,51.92,54.50,52.65,
+55.71,51.24,51.92,54.05,54.88,55.54,53.77,55.05,55.61,54.90,
+54.43,55.56,56.10,56.95,57.63,58.14,60.34,57.03,57.24,59.53,
+59.13,59.51,59.12,58.11,57.02,59.66,62.68,58.29,61.25,58.96,
+60.63,59.26,61.01,60.40,60.60,60.45,63.40,62.14,62.29,62.64,
+64.80,64.04,62.70,63.68,64.18,61.54,63.63,65.16,62.97,63.86,
+63.61,64.66,65.84,64.64,64.64,67.54,65.24,66.43,67.16,65.58,
+62.76,66.32,68.04,68.17,70.73,70.06,68.47,69.87,68.19,68.67,
+71.27,69.75,69.38,71.02,71.20,70.72,67.49,70.73,70.96,72.45,
+72.32,72.13,72.64,70.48,72.90,70.72,71.73,70.57,71.55,69.36,
+70.46,72.66,74.88,72.88,73.93,68.82,74.42,74.35,74.39,73.42,
+76.36,77.61,73.82,76.87,74.14,75.16,74.96,73.10,75.51,75.55,
+74.28,76.12,78.79,79.52,75.76,76.07,77.06,76.38,78.17,79.88,
+78.61,78.96,76.59,83.28,75.44,80.44,78.77,80.94,79.14,77.69,
+77.61,78.72,81.89,79.55,78.41,82.15,81.72,80.40,82.64,83.01,
+80.93,80.85,80.05,79.50,83.24,84.38,85.58,85.33,82.16,85.13,
+82.33,83.08,85.44,85.19,82.26,83.86,82.01,82.37,89.17,79.32,
+81.88,83.86,83.82,85.13,81.68,84.32,87.38,87.13,87.79,85.32,
+85.11,85.68,84.86,88.17,88.64,89.46,86.75,86.83,85.93,89.47,
+84.75,88.06,86.50,86.42,89.03,92.80,88.89,88.46,89.51,89.67,
+16.85,17.53,18.65,19.28,19.67,20.30,20.70,21.92,22.67,22.66,
+22.63,23.71,23.60,24.99,26.10,26.94,25.85,27.80,28.66,28.02,
+27.72,29.53,30.55,29.86,29.34,31.31,31.46,32.18,30.57,33.88,
+32.79,33.07,32.94,33.27,34.87,33.14,35.88,34.32,34.84,36.62,
+36.67,36.27,35.93,38.18,37.05,38.95,39.38,40.45,40.49,40.42,
+41.21,40.72,41.67,42.68,42.67,41.51,42.26,42.99,43.77,44.12,
+42.88,43.89,42.80,44.13,44.66,45.83,43.43,45.80,45.67,46.43,
+48.51,46.21,47.35,46.54,45.94,47.21,48.59,47.25,48.91,49.51,
+50.66,49.67,50.42,48.77,49.69,52.05,51.16,50.53,51.13,51.56,
+54.02,50.83,52.34,53.43,52.04,53.73,52.09,53.47,54.51,51.60,
+55.95,53.48,56.56,55.67,55.42,54.95,56.52,55.32,56.51,52.70,
+56.52,57.53,56.01,59.01,57.57,57.34,57.71,56.96,60.33,60.66,
+56.24,59.84,58.00,58.53,61.82,59.59,61.23,61.81,60.40,60.99,
+59.69,61.86,61.57,62.33,63.51,61.23,63.95,63.33,60.99,61.42,
+63.81,63.65,63.90,64.93,65.65,62.22,64.52,61.85,64.08,63.84,
+63.45,64.71,64.82,65.59,62.31,67.18,65.70,64.44,67.91,66.78,
+64.65,66.72,67.91,67.83,69.18,68.42,71.88,68.63,67.28,68.78,
+69.72,68.86,70.54,70.38,69.89,71.20,69.53,70.26,69.45,70.58,
+72.08,71.11,71.05,69.54,74.24,70.94,74.88,73.68,72.51,74.83,
+74.58,74.01,76.47,70.50,76.51,74.82,75.07,72.59,74.10,77.32,
+73.72,72.24,73.53,74.81,77.66,74.30,77.82,75.15,74.08,79.63,
+76.65,73.67,74.93,76.57,76.31,78.61,77.75,77.99,79.17,77.38,
+80.79,79.76,78.61,78.56,78.99,78.68,80.73,81.10,81.53,81.58,
+77.90,81.82,79.02,80.55,79.34,83.64,81.10,83.75,80.51,81.40,
+81.79,80.16,84.37,78.88,82.17,81.15,81.82,80.49,83.10,80.73,
+81.71,83.12,82.23,83.66,82.62,82.06,83.24,85.87,84.02,83.78,
+85.90,81.73,82.83,85.98,85.91,84.85,86.11,86.27,85.62,85.12,
+87.17,90.24,88.03,88.50,88.80,89.04,86.45,84.20,85.78,89.89,
+88.42,89.68,86.59,91.55,88.26,90.52,88.77,92.57,91.27,90.97,
+16.90,17.42,17.81,18.25,20.58,20.87,20.78,21.59,21.17,23.14,
+23.16,23.80,24.68,24.88,26.64,26.53,27.06,27.17,28.05,28.44,
+29.38,28.05,28.89,28.91,30.56,31.46,30.27,30.69,32.99,32.96,
+33.30,33.65,33.46,33.99,34.23,34.30,35.85,34.95,35.53,37.34,
+35.95,36.96,37.87,39.03,37.31,38.78,37.59,39.65,40.37,39.15,
+39.33,40.20,42.49,41.37,40.97,41.49,42.01,42.32,42.10,43.13,
+43.33,44.06,43.07,43.59,44.26,46.36,45.50,47.23,43.58,46.78,
+44.81,47.90,46.21,47.42,47.89,48.65,49.32,48.70,47.77,46.17,
+48.24,49.88,47.82,49.42,49.12,50.24,49.97,50.76,50.46,51.47,
+53.03,53.24,52.05,50.98,53.55,52.70,53.20,51.72,53.03,53.22,
+51.98,53.39,52.62,54.70,55.17,53.49,54.56,56.55,55.06,56.64,
+54.66,56.88,55.31,57.17,58.12,57.88,57.41,57.72,57.46,57.11,
+59.58,61.21,59.61,58.84,58.29,59.40,60.31,62.98,59.93,60.37,
+60.23,58.09,59.04,63.17,62.46,63.52,62.57,59.75,62.12,62.20,
+61.84,65.11,63.32,63.84,62.49,63.63,66.43,63.68,64.75,66.69,
+63.34,65.55,66.77,66.60,65.41,64.41,66.49,65.50,66.66,65.06,
+65.61,67.45,66.28,66.49,68.61,70.33,66.25,66.08,65.25,67.88,
+68.51,66.78,74.17,69.21,70.93,70.28,70.17,69.88,68.43,71.63,
+70.74,70.70,68.50,70.23,74.58,69.90,71.38,69.67,73.33,71.57,
+75.19,73.06,74.66,75.74,72.07,72.21,73.77,74.04,74.12,70.27,
+74.74,75.57,74.48,77.30,77.56,73.61,74.34,79.06,76.27,73.34,
+76.50,76.88,79.11,74.11,75.40,77.29,77.95,77.17,78.18,75.30,
+79.45,77.54,77.61,80.98,80.73,79.27,78.99,80.69,80.75,79.89,
+77.59,76.81,82.96,80.53,79.20,79.50,81.76,78.29,82.81,86.26,
+80.53,81.43,80.10,82.83,82.23,83.34,84.33,81.30,82.78,78.96,
+86.05,83.51,82.50,80.50,83.34,80.97,85.08,81.90,83.48,85.54,
+82.02,84.12,81.48,83.09,82.40,82.28,84.68,81.68,87.82,86.34,
+85.89,87.82,88.28,88.20,90.25,87.90,90.00,87.99,85.97,89.84,
+86.05,88.47,84.99,86.58,88.05,86.35,86.60,87.01,87.51,86.22,
+16.16,17.33,18.13,18.12,19.65,19.88,20.80,20.71,21.32,21.86,
+21.99,23.97,24.34,24.95,25.34,23.65,26.01,25.79,27.18,26.96,
+27.13,28.06,29.94,29.86,30.09,29.66,31.24,30.87,30.26,32.02,
+31.18,32.31,32.01,33.84,33.97,34.37,34.49,35.79,35.90,34.34,
+37.35,35.70,34.95,36.92,36.97,38.28,39.05,37.37,37.22,39.25,
+39.37,39.84,41.68,41.24,40.53,38.34,39.43,40.53,42.29,42.12,
+39.95,40.58,43.66,43.06,43.24,44.26,41.88,43.57,46.42,43.75,
+43.34,45.80,43.88,46.65,46.88,47.10,46.87,48.01,49.27,46.77,
+47.03,48.33,47.45,50.40,47.87,49.68,50.32,49.46,51.75,50.48,
+50.03,52.12,50.54,48.73,53.01,50.70,52.45,52.69,52.60,53.99,
+53.46,54.35,52.37,52.58,55.11,53.73,56.66,53.21,54.83,56.66,
+53.92,55.74,53.69,53.11,55.36,53.94,58.57,56.78,56.78,58.58,
+56.54,59.96,57.32,59.16,55.63,57.62,57.89,61.38,61.71,60.51,
+61.77,57.28,60.40,59.94,62.18,59.79,62.28,62.18,59.83,61.65,
+60.01,59.82,59.79,64.44,62.91,63.49,65.33,64.19,62.75,61.53,
+65.23,60.71,63.33,63.05,63.75,65.33,64.78,64.15,66.38,66.78,
+66.54,66.80,67.09,67.86,67.32,68.10,65.15,69.45,65.80,67.04,
+67.28,69.99,67.83,68.78,67.07,69.38,70.51,67.65,73.54,69.49,
+68.74,70.59,68.25,68.00,68.40,72.56,71.33,70.14,70.91,71.11,
+69.77,73.10,71.34,71.46,73.02,75.41,72.83,70.66,72.40,70.20,
+71.89,72.40,72.75,73.67,77.05,72.16,74.59,73.42,78.15,77.70,
+72.87,75.18,70.67,74.25,73.00,75.67,76.93,76.10,74.71,80.57,
+78.19,81.91,73.81,77.66,75.04,79.37,76.35,75.90,77.44,77.45,
+80.09,79.47,79.28,77.10,80.43,80.10,78.02,77.94,78.51,77.46,
+81.74,77.61,76.61,79.09,77.60,77.76,82.65,81.71,81.07,83.22,
+82.47,81.74,83.24,83.28,81.33,79.71,82.47,81.10,84.28,83.61,
+80.97,81.47,83.65,85.25,81.70,82.13,83.09,85.65,81.98,87.27,
+85.24,85.84,87.63,84.82,85.85,88.67,86.04,84.58,86.07,88.15,
+88.78,91.44,88.09,86.44,86.33,85.80,86.67,87.65,86.43,85.31,
+17.08,17.29,17.44,18.48,18.74,19.43,20.42,21.28,20.48,21.87,
+21.49,22.86,24.18,23.63,24.20,25.18,25.21,26.73,25.91,26.40,
+27.30,27.31,28.02,28.60,28.65,29.35,28.98,29.91,30.50,30.36,
+30.25,32.67,31.60,32.12,31.64,34.25,34.06,33.13,32.85,34.59,
+36.00,36.19,35.88,36.09,36.30,36.32,37.68,36.44,37.61,37.03,
+37.74,38.56,39.16,37.81,38.94,40.35,42.22,39.95,40.83,41.30,
+40.48,41.56,41.66,41.20,43.94,43.56,42.82,43.52,43.10,44.28,
+42.87,45.35,44.61,47.14,46.32,45.06,45.92,44.90,45.96,44.63,
+47.66,45.50,47.30,47.31,47.97,51.07,48.55,48.60,49.83,50.35,
+47.65,51.26,50.82,49.96,48.91,52.16,50.76,48.51,50.97,49.79,
+51.72,50.81,52.33,51.86,52.32,52.54,52.65,52.85,52.07,55.03,
+55.02,53.10,56.44,55.17,57.85,58.04,54.10,57.00,54.07,55.49,
+55.50,56.22,54.50,55.69,57.93,58.57,57.19,58.40,58.24,57.15,
+56.96,58.10,58.68,57.58,58.20,60.47,58.67,59.48,58.34,60.28,
+60.01,61.88,61.24,62.23,59.77,61.55,61.31,61.76,63.52,60.83,
+64.09,62.28,61.42,63.10,60.83,61.15,63.28,62.73,62.76,64.32,
+63.18,60.11,64.75,65.66,66.23,64.72,63.10,66.87,65.77,65.18,
+64.95,68.89,66.60,68.21,67.78,65.44,65.08,66.38,66.58,66.53,
+67.35,68.70,67.50,67.98,68.24,70.65,68.81,69.64,68.07,70.04,
+69.05,69.22,70.41,70.59,68.65,67.99,71.77,71.55,72.15,71.04,
+71.07,72.39,73.81,72.24,70.29,71.51,72.94,72.58,72.84,73.73,
+72.18,72.43,73.20,70.72,69.65,74.02,75.66,72.74,74.73,76.64,
+75.20,76.73,76.32,75.07,74.75,74.95,73.97,71.94,76.89,77.50,
+76.77,78.18,74.73,76.49,72.96,79.87,79.74,76.70,75.05,76.14,
+79.14,79.93,78.39,76.34,80.85,79.02,75.84,75.90,79.77,79.75,
+79.45,77.06,80.62,80.80,81.36,84.41,80.20,81.68,77.59,80.62,
+82.52,81.23,82.25,78.03,81.91,79.94,80.11,81.26,81.35,81.15,
+83.38,86.53,83.26,84.98,84.91,81.24,83.26,82.40,83.32,87.10,
+85.38,84.07,80.85,83.88,86.15,83.81,86.59,81.63,84.84,83.92,
+14.98,15.93,17.31,17.39,18.21,17.99,19.20,19.63,20.85,20.58,
+21.18,22.31,22.57,23.11,22.73,23.60,25.47,25.83,25.73,25.61,
+27.27,27.22,27.19,28.40,27.13,28.56,28.35,30.58,28.88,30.83,
+29.87,29.35,29.72,32.44,30.89,31.82,33.92,33.19,34.04,33.93,
+33.11,33.84,34.80,36.05,35.92,35.65,35.48,35.77,35.73,36.67,
+35.95,37.02,37.64,36.38,36.74,37.48,40.84,38.34,39.80,39.15,
+40.78,40.07,40.65,39.59,40.62,41.20,40.61,41.67,41.34,41.82,
+40.96,42.50,42.91,42.24,43.14,44.25,45.22,43.98,45.16,44.46,
+44.18,45.24,46.22,46.56,46.67,46.83,48.30,46.24,45.03,46.55,
+47.42,47.60,47.95,48.86,47.87,50.42,49.30,46.98,49.30,51.08,
+49.65,50.51,49.74,51.64,50.30,47.37,52.14,53.24,50.62,50.02,
+51.61,51.17,52.47,51.57,54.23,51.88,53.83,55.27,53.23,55.50,
+54.38,54.99,54.75,53.98,53.61,55.46,57.96,55.89,56.42,55.56,
+55.48,58.13,56.54,56.75,55.16,53.86,56.27,58.94,57.57,58.18,
+57.59,56.60,58.59,57.23,59.48,56.83,61.56,58.24,61.14,59.79,
+59.95,62.45,59.97,57.94,59.86,59.90,61.04,60.38,62.28,63.01,
+61.90,61.92,64.49,62.21,63.67,62.90,61.66,62.56,62.36,65.13,
+62.99,63.28,62.63,63.76,62.92,66.26,63.59,65.76,65.55,65.11,
+64.63,66.20,65.14,63.28,64.39,67.39,69.85,64.91,71.23,65.13,
+67.19,67.07,66.19,66.43,71.81,67.81,69.81,67.23,69.89,68.73,
+67.04,70.21,67.61,66.89,68.78,69.88,70.14,69.35,68.94,71.41,
+67.62,71.29,69.48,70.45,69.00,70.30,70.91,71.65,72.30,72.71,
+69.69,69.26,69.80,72.49,71.11,73.29,73.20,74.80,73.02,73.19,
+73.61,75.12,73.44,72.19,75.88,76.36,74.96,75.52,75.11,72.61,
+75.84,77.33,74.11,76.94,76.02,70.96,74.91,76.10,78.74,79.15,
+80.50,75.30,77.15,76.54,77.63,77.63,78.92,77.40,80.49,77.88,
+78.54,78.65,77.28,79.13,78.19,79.94,78.81,74.38,75.49,77.24,
+78.82,79.67,78.61,78.00,78.34,76.39,79.55,79.43,83.07,81.29,
+79.87,81.46,84.73,79.14,80.88,83.56,78.94,81.17,79.19,84.15,
+15.29,15.20,15.53,17.21,16.81,17.78,18.46,18.83,20.24,19.91,
+20.87,21.19,21.71,22.85,22.80,23.39,23.03,23.19,23.92,23.81,
+24.44,25.14,26.23,25.85,28.74,26.91,26.88,28.41,28.58,29.13,
+29.93,29.72,30.18,29.61,29.32,32.57,28.81,31.60,31.33,32.57,
+32.72,32.75,32.21,33.33,32.27,34.36,34.98,35.53,35.10,36.15,
+34.67,35.97,35.93,36.62,36.38,36.24,38.28,37.84,37.67,37.87,
+39.09,38.23,38.22,39.62,39.81,40.01,38.66,40.31,40.00,41.08,
+41.32,40.88,39.97,41.07,41.98,41.68,44.25,43.87,42.10,42.52,
+44.18,42.71,44.01,46.11,43.45,44.78,44.37,44.83,45.96,47.93,
+45.62,46.56,46.37,42.73,47.46,47.64,47.73,46.72,50.14,46.85,
+48.94,47.43,49.02,50.01,47.95,48.91,48.30,47.54,48.64,49.50,
+48.88,49.67,51.39,52.25,50.57,50.31,51.73,51.21,48.81,52.12,
+55.04,52.48,52.54,53.47,52.82,51.75,52.17,53.97,51.78,52.53,
+54.44,53.52,54.03,53.77,54.77,53.85,56.39,53.31,55.22,56.14,
+58.39,56.21,55.66,56.86,57.31,55.56,56.52,59.91,56.96,56.67,
+56.96,57.98,56.61,57.14,60.20,59.89,59.67,56.77,58.36,57.75,
+57.88,56.81,59.75,61.72,61.23,59.64,61.51,60.90,63.21,60.71,
+61.00,62.60,63.64,60.37,63.47,62.92,62.94,62.88,60.82,65.79,
+61.94,64.53,63.15,61.19,62.33,62.07,64.50,62.34,64.20,65.95,
+63.95,64.75,64.71,65.70,62.06,67.56,66.00,66.45,67.66,65.69,
+67.98,65.91,66.23,67.46,66.60,68.56,67.59,66.90,65.97,67.51,
+70.87,67.48,65.14,67.31,71.10,69.57,69.07,66.90,70.71,68.02,
+67.58,69.74,67.48,71.23,70.37,69.34,70.15,68.35,69.48,70.26,
+72.28,71.38,71.96,72.63,73.37,72.34,69.87,72.06,72.09,70.80,
+69.48,71.02,73.19,73.06,74.58,73.60,72.58,74.92,73.42,73.78,
+73.07,72.44,74.85,74.37,73.05,72.16,77.80,74.06,76.95,76.54,
+74.07,74.71,75.89,75.76,73.31,76.36,75.51,75.01,76.32,74.87,
+77.04,75.46,76.01,76.35,77.48,75.71,76.80,76.70,76.83,77.48,
+81.38,80.17,78.84,76.93,75.83,79.50,77.57,78.99,78.06,76.58,
+14.33,15.02,15.15,15.55,17.04,17.69,17.77,18.08,18.43,19.44,
+18.91,20.06,20.96,20.28,21.13,21.37,22.64,23.57,22.22,22.43,
+23.22,25.02,24.74,25.18,25.09,26.29,26.01,26.23,27.13,27.72,
+27.29,27.63,27.72,28.10,28.66,29.09,30.40,30.48,30.11,30.76,
+30.45,30.57,31.79,31.36,31.96,31.78,31.95,33.27,33.42,33.33,
+34.44,32.41,33.82,34.86,34.46,35.74,35.33,35.66,36.65,36.39,
+35.88,35.40,38.19,38.65,39.03,37.01,38.42,39.51,38.67,38.35,
+38.48,39.75,39.77,39.72,39.10,40.25,41.14,40.83,40.42,41.56,
+41.05,43.95,42.06,40.73,42.32,42.24,43.18,43.81,42.79,41.84,
+43.76,43.58,42.51,45.54,46.33,43.82,44.74,44.92,44.80,47.32,
+46.12,44.40,45.47,44.69,47.82,47.70,47.75,45.96,46.21,47.99,
+47.30,47.97,49.25,46.92,48.00,50.18,50.72,48.84,48.67,50.51,
+49.98,50.85,50.30,48.57,49.71,50.63,51.24,50.80,49.53,50.93,
+51.40,51.72,51.27,52.63,53.97,51.26,49.31,53.66,54.98,53.12,
+54.54,53.80,51.25,52.45,52.45,54.84,52.58,55.17,52.87,51.74,
+54.84,54.26,55.28,56.51,55.38,57.16,56.88,55.90,56.08,58.67,
+56.08,53.66,57.63,54.89,58.17,57.97,56.47,59.26,57.90,60.55,
+58.16,58.22,59.30,61.89,61.03,60.86,59.14,61.03,58.60,62.81,
+59.33,60.83,62.34,57.74,61.55,60.66,62.53,59.86,62.46,62.08,
+64.89,62.25,62.78,59.71,62.77,61.78,61.34,63.45,62.26,64.17,
+60.97,63.44,62.30,64.86,64.35,64.04,58.96,63.92,62.33,64.90,
+65.29,65.99,63.27,67.06,62.84,65.27,65.43,63.26,66.40,66.44,
+64.89,64.51,65.01,67.77,68.53,67.12,67.03,69.17,69.26,66.60,
+68.71,69.23,68.12,65.16,68.43,66.70,69.76,69.94,68.69,67.89,
+68.96,68.58,68.25,68.65,67.71,69.90,69.16,68.51,70.82,71.52,
+70.67,70.93,69.70,71.36,70.86,69.71,69.98,68.39,72.77,70.95,
+71.12,71.76,70.96,72.32,74.23,69.59,72.81,69.12,72.91,70.53,
+74.72,72.38,71.76,74.69,70.20,73.94,74.42,72.41,75.04,74.05,
+71.85,73.46,76.82,74.41,74.20,76.17,75.32,79.57,73.16,74.46,
+12.58,13.56,15.05,15.38,15.49,15.96,17.51,18.31,17.55,18.12,
+19.25,18.68,20.33,19.51,19.92,20.75,21.35,22.05,22.38,22.69,
+23.47,22.51,23.25,23.42,23.99,23.51,24.94,24.75,26.30,26.19,
+27.38,27.01,26.50,27.58,27.84,26.72,28.84,28.80,28.58,28.53,
+29.49,29.65,29.74,30.07,30.40,30.07,30.56,30.37,32.65,32.67,
+31.81,33.23,32.10,32.13,33.02,33.50,33.16,34.39,34.24,33.69,
+34.67,36.18,35.02,33.55,35.43,37.61,34.69,37.57,37.07,37.24,
+37.86,37.81,37.11,37.79,38.37,37.53,36.53,39.32,39.11,38.77,
+39.38,40.48,38.74,39.80,42.14,40.36,41.89,41.88,41.27,41.72,
+40.16,41.25,42.18,41.57,42.45,42.17,43.18,41.83,43.07,40.76,
+44.95,43.85,42.63,43.79,43.11,44.45,45.93,43.87,44.35,46.25,
+43.79,46.10,48.76,44.96,45.61,45.06,45.48,46.49,46.87,49.18,
+46.41,46.44,47.55,46.58,47.13,47.77,48.34,47.53,46.35,51.43,
+46.99,49.13,49.03,48.31,48.82,50.74,47.73,50.07,50.65,52.14,
+50.74,50.87,53.04,49.19,53.61,51.77,52.59,50.68,51.95,52.40,
+51.80,51.07,50.22,52.42,50.93,53.92,56.48,54.96,53.27,54.08,
+54.26,55.45,54.97,54.79,54.17,55.73,53.26,55.26,55.14,57.77,
+56.47,56.65,56.83,56.02,54.93,57.31,55.51,54.02,55.19,57.27,
+57.39,55.27,56.45,55.84,59.34,59.56,58.25,58.26,56.20,61.11,
+58.98,56.89,59.29,59.21,57.72,60.93,61.15,61.67,59.08,59.01,
+59.50,58.89,59.41,59.72,60.54,59.98,62.00,59.62,59.59,61.70,
+61.86,63.18,59.96,62.84,61.16,60.47,62.81,61.12,62.46,63.06,
+63.02,64.51,61.73,64.14,64.99,63.43,64.06,63.26,64.41,61.81,
+64.18,62.42,66.09,68.19,64.37,65.84,66.20,68.28,63.64,62.96,
+65.06,64.64,66.57,66.04,67.27,65.65,63.29,65.58,67.53,66.21,
+67.21,65.44,66.47,63.12,70.30,66.29,67.09,67.77,66.75,66.68,
+67.45,70.08,69.15,66.27,69.46,68.77,68.24,69.47,67.66,70.67,
+67.91,69.49,70.07,72.26,67.91,70.86,70.94,70.52,70.55,70.06,
+69.94,67.49,72.26,72.17,70.82,70.48,70.94,71.35,69.52,70.06,
+12.53,12.73,13.34,14.16,14.92,15.60,15.32,16.15,17.63,16.91,
+17.40,17.80,18.41,18.57,19.90,20.07,19.46,20.33,21.94,21.05,
+21.77,22.39,21.68,22.27,22.50,24.25,22.97,24.76,24.22,25.00,
+23.98,24.42,24.31,26.67,25.95,27.47,25.82,26.73,26.72,27.91,
+27.82,27.18,27.63,29.26,28.97,28.55,29.54,28.08,30.03,30.09,
+29.97,29.84,31.82,30.31,31.68,32.45,30.93,32.54,33.00,32.46,
+31.38,33.42,33.13,32.64,34.46,33.74,34.43,35.11,35.46,34.12,
+33.26,34.75,35.44,35.68,36.18,37.98,37.32,37.44,37.09,36.21,
+36.78,37.29,37.00,37.66,36.31,38.41,39.27,38.42,38.61,38.21,
+39.52,39.16,40.73,38.61,39.67,40.37,39.36,39.84,39.98,41.02,
+41.17,39.50,40.34,42.46,43.12,41.73,41.61,41.92,41.70,42.16,
+41.59,43.45,42.78,42.26,43.95,44.11,43.02,45.09,44.38,43.43,
+43.83,45.27,45.92,44.25,47.04,45.87,44.70,45.42,46.22,46.89,
+47.30,48.07,46.62,47.04,47.09,48.11,50.14,47.24,49.24,50.53,
+48.56,48.41,49.99,47.51,46.60,47.83,48.38,48.93,48.92,48.73,
+48.17,48.89,50.24,50.97,48.82,48.23,51.50,48.69,50.05,50.23,
+50.56,51.13,51.80,50.30,50.76,54.00,50.85,51.52,52.49,52.55,
+53.35,54.62,51.73,53.99,50.78,53.76,53.67,52.81,54.29,52.93,
+52.47,54.07,55.93,52.21,54.20,54.18,54.74,56.20,54.92,56.23,
+55.02,54.65,55.24,54.33,54.75,56.66,54.86,55.51,56.43,55.70,
+55.90,54.86,57.21,56.02,58.68,57.46,59.92,58.37,57.71,59.15,
+58.27,58.00,59.11,57.65,55.76,58.89,58.54,60.48,59.50,60.07,
+58.33,61.84,60.03,62.04,60.22,60.51,60.18,62.04,58.74,59.30,
+57.85,61.62,60.56,58.50,63.45,61.04,61.58,61.93,63.51,62.16,
+61.98,61.09,62.13,61.90,62.89,64.24,62.15,62.32,64.43,64.75,
+63.00,59.94,64.84,64.27,61.55,64.12,61.66,61.50,65.38,63.30,
+64.31,62.77,64.90,65.16,65.84,62.77,67.70,64.96,63.37,64.89,
+67.84,65.00,64.31,66.26,67.02,65.24,66.79,65.40,66.21,64.41,
+66.05,66.06,66.08,63.86,66.75,70.40,67.17,68.31,68.59,64.69,
+11.85,12.48,13.00,13.89,14.53,14.37,14.98,15.56,15.07,15.22,
+16.63,16.94,17.70,17.84,18.10,18.79,19.04,19.50,18.99,19.79,
+20.46,20.58,21.34,21.51,21.74,23.25,21.86,22.04,22.66,22.54,
+23.26,23.11,24.76,23.50,24.37,25.31,25.16,24.87,26.95,26.56,
+26.07,25.70,27.20,27.06,27.42,27.08,27.81,26.94,28.70,29.58,
+29.63,29.17,29.71,30.06,29.81,28.93,30.83,29.57,29.72,31.64,
+32.00,32.81,31.38,32.44,31.61,31.58,30.23,32.43,32.50,32.91,
+31.91,33.15,32.56,32.04,34.85,34.15,34.50,35.15,34.75,33.47,
+34.86,34.96,35.94,36.23,34.58,33.82,36.29,35.67,36.40,37.59,
+37.42,36.93,38.40,37.65,37.73,40.52,38.80,37.31,38.89,39.33,
+39.66,38.29,37.65,41.03,38.76,38.28,39.00,40.92,39.70,40.64,
+41.00,38.94,41.00,38.94,40.66,41.41,42.23,43.19,42.44,40.13,
+41.08,41.54,42.92,43.73,43.18,42.93,42.40,43.41,42.54,42.54,
+44.71,41.96,43.74,44.74,43.26,45.41,45.84,44.85,44.27,44.98,
+43.03,43.73,45.55,45.39,46.06,45.44,44.06,45.26,47.77,46.49,
+44.73,47.41,48.40,46.12,46.09,46.15,47.25,48.40,47.30,47.57,
+48.74,46.30,47.37,47.62,47.18,48.36,49.15,47.51,50.38,50.39,
+47.41,50.75,49.20,48.54,50.59,51.64,51.22,49.61,51.17,50.79,
+51.06,49.61,52.16,54.81,49.58,51.85,52.70,50.83,52.42,49.75,
+51.16,53.42,53.03,51.57,54.05,53.38,52.70,52.90,51.02,56.25,
+50.79,53.70,54.58,52.58,53.16,52.39,51.24,54.70,54.22,56.17,
+55.72,55.28,54.51,53.93,55.06,54.89,57.12,52.85,54.70,56.43,
+55.16,53.97,56.49,57.91,55.81,55.06,56.02,53.60,56.84,57.53,
+57.00,58.75,56.57,56.19,55.62,56.45,58.56,56.74,56.75,60.51,
+59.21,59.25,55.89,59.89,59.20,61.48,58.30,58.48,60.20,57.37,
+58.83,58.82,58.70,60.47,61.21,61.23,61.53,61.30,59.24,61.53,
+62.54,61.90,59.55,60.85,60.83,59.56,61.11,62.85,63.52,61.37,
+60.86,60.25,62.84,61.83,62.25,61.75,63.23,61.42,63.15,63.67,
+62.67,64.62,61.49,63.83,66.70,62.96,63.67,62.22,64.59,65.03,
+10.36,12.43,11.71,12.30,12.91,12.83,14.10,14.88,15.60,15.04,
+15.78,16.10,16.75,17.14,17.81,17.59,17.86,18.67,18.63,19.16,
+19.12,18.55,19.51,19.35,20.25,20.53,20.59,20.43,21.11,20.99,
+21.92,23.04,22.74,22.47,23.41,23.30,24.30,23.81,23.21,24.61,
+25.25,24.85,24.01,24.76,25.66,25.91,26.30,26.44,25.26,26.62,
+26.82,27.73,27.67,26.99,27.90,28.01,28.70,26.98,29.17,29.18,
+28.61,29.79,29.84,28.82,30.70,29.22,29.93,30.23,30.54,30.77,
+31.27,31.47,32.08,31.46,33.06,31.04,31.24,32.52,32.16,32.42,
+33.50,33.39,36.23,32.76,33.98,34.63,34.21,34.59,34.96,34.28,
+33.84,34.90,33.43,34.50,35.37,37.50,35.07,34.81,38.45,36.88,
+35.93,36.90,37.51,36.56,33.98,36.19,38.11,38.03,37.92,38.44,
+36.04,37.78,38.10,39.53,36.93,39.12,38.72,39.34,38.44,39.41,
+39.98,40.60,39.63,40.36,38.12,38.72,39.69,42.76,39.89,42.06,
+41.07,41.14,39.90,40.29,41.35,41.42,43.32,42.84,42.46,42.62,
+44.01,41.64,42.12,42.11,44.57,42.76,42.59,41.79,44.02,42.31,
+42.69,43.41,41.97,43.77,42.99,44.16,44.76,44.72,46.85,46.77,
+43.58,45.20,46.19,45.93,48.01,46.44,44.75,44.76,45.09,47.68,
+47.27,45.55,47.42,46.27,46.53,48.34,46.85,46.33,46.77,45.42,
+46.98,48.63,48.59,51.25,49.15,48.66,49.62,48.39,49.02,48.47,
+49.79,48.85,50.41,48.96,50.08,50.52,48.44,49.46,50.40,50.01,
+50.47,50.39,52.55,50.59,50.23,51.67,50.92,50.42,50.32,49.71,
+51.82,51.29,50.80,50.94,50.79,52.83,51.83,51.22,52.02,53.22,
+54.61,52.58,53.52,53.75,53.40,54.90,52.90,52.99,53.98,55.30,
+54.72,51.67,52.84,55.23,54.77,55.34,54.97,54.76,54.29,54.70,
+57.13,54.79,54.87,55.31,54.31,57.83,55.88,56.25,57.21,55.89,
+57.25,55.39,54.99,56.47,57.64,55.10,57.76,57.74,55.21,55.66,
+57.19,59.06,61.65,57.88,58.40,58.22,56.85,56.71,56.00,57.91,
+58.64,57.52,57.39,57.71,57.46,59.83,58.71,56.69,58.77,59.59,
+56.78,60.60,58.32,57.92,58.34,57.85,58.19,60.16,60.09,61.26,
+10.63,10.32,11.02,12.23,12.24,13.64,13.35,13.44,14.22,14.71,
+15.02,15.00,16.34,15.95,15.33,15.55,16.56,17.09,18.14,18.63,
+17.81,17.51,18.59,18.88,18.71,18.85,19.79,19.32,20.00,20.90,
+20.63,21.46,20.89,20.95,22.55,22.74,21.73,21.96,23.20,23.74,
+23.40,24.18,23.14,22.80,22.63,23.49,25.01,23.93,24.76,25.90,
+24.33,24.72,25.42,25.41,27.73,26.33,27.09,28.28,26.85,26.28,
+27.46,28.11,28.45,27.53,28.55,27.39,27.91,28.33,28.24,28.05,
+29.17,29.53,28.28,28.69,30.27,30.34,30.26,30.92,31.34,31.87,
+31.24,30.36,31.25,30.95,31.26,32.02,31.66,33.01,32.65,31.76,
+32.41,31.42,32.28,32.73,34.06,33.34,33.04,33.21,33.98,33.33,
+35.66,34.29,34.51,33.96,34.47,34.04,34.00,34.61,34.37,34.92,
+35.47,34.03,36.02,36.06,36.65,36.29,38.27,36.89,36.95,37.91,
+36.38,37.03,36.84,37.99,36.83,37.26,39.40,38.60,39.10,38.54,
+38.42,39.01,37.70,39.12,39.21,39.75,39.08,40.12,38.60,39.75,
+40.02,39.53,40.14,38.11,39.16,40.07,40.74,38.79,39.28,39.96,
+40.67,40.43,39.58,42.96,42.86,42.00,42.27,42.43,41.60,42.42,
+41.97,43.02,43.27,42.51,41.40,42.73,44.29,43.88,42.55,42.99,
+45.60,43.66,45.05,42.82,44.27,46.19,45.53,42.75,45.49,45.42,
+45.05,45.07,44.50,46.20,46.02,45.17,45.10,46.33,45.15,45.74,
+45.69,43.51,45.42,45.78,46.12,47.48,45.58,47.19,45.49,46.92,
+47.24,48.67,48.89,45.31,47.44,49.04,49.07,47.88,46.05,46.97,
+46.57,47.76,49.20,46.84,48.76,49.31,49.27,50.42,47.35,45.64,
+48.51,49.06,49.38,49.61,48.27,50.17,52.13,51.32,49.48,50.01,
+49.14,50.63,51.05,50.61,48.99,50.17,49.97,51.07,53.39,51.98,
+51.23,51.79,51.53,50.53,51.84,49.74,51.48,52.81,51.99,51.03,
+51.28,53.64,52.87,53.00,51.69,51.14,52.37,51.51,53.21,53.17,
+53.54,55.26,52.64,52.61,51.22,53.54,53.34,54.69,50.55,53.68,
+53.92,53.14,51.98,53.26,52.42,54.32,53.83,54.23,53.35,55.38,
+56.45,54.04,54.70,54.92,54.35,57.82,56.24,56.54,56.31,55.48,
+9.60,10.05,11.73,10.63,10.87,12.52,12.71,12.64,13.47,13.37,
+13.63,13.22,14.49,14.95,15.08,15.02,16.06,15.75,15.91,16.62,
+17.45,17.09,16.59,18.91,18.13,17.65,19.99,17.64,19.09,19.18,
+18.80,20.07,19.80,20.97,20.07,20.37,19.87,20.98,21.68,22.34,
+20.59,21.48,22.12,21.43,21.76,21.58,23.31,21.39,24.01,23.57,
+24.06,24.76,23.24,23.54,24.12,24.42,23.93,24.66,25.87,25.17,
+24.81,26.02,25.14,25.58,26.80,27.26,24.97,26.13,27.95,26.85,
+27.28,27.11,28.08,27.92,27.59,28.21,28.91,27.53,28.21,26.66,
+29.47,28.34,27.99,28.90,28.14,29.56,29.04,28.94,30.13,31.27,
+31.10,29.81,30.92,29.43,30.54,30.87,30.52,33.21,31.32,32.24,
+30.89,31.32,31.94,32.79,32.48,33.33,32.80,33.18,33.20,31.95,
+33.21,32.62,32.85,34.12,32.99,35.23,34.57,34.49,34.03,34.72,
+33.57,34.00,35.49,34.35,34.50,35.21,36.43,33.71,35.36,36.31,
+36.31,36.66,35.91,36.16,35.64,36.51,36.48,37.49,37.97,38.18,
+36.49,37.37,36.81,37.51,36.66,36.62,37.89,36.58,37.55,39.95,
+38.69,38.71,36.95,37.77,37.31,39.35,39.49,40.39,38.53,39.64,
+39.11,40.86,39.65,39.02,39.99,40.03,40.39,40.02,40.87,39.27,
+41.10,42.18,41.17,40.90,41.26,40.62,41.85,41.08,39.84,40.71,
+42.75,42.91,40.52,41.74,42.05,40.28,41.63,43.03,42.96,41.89,
+43.46,43.77,42.71,43.06,42.05,43.78,42.78,43.26,44.88,42.43,
+43.90,42.20,41.99,42.70,44.80,44.55,44.45,42.70,45.97,45.24,
+43.86,44.35,43.69,44.91,46.78,46.35,46.53,47.37,45.29,45.61,
+45.11,46.54,45.18,47.06,47.99,48.21,46.15,47.46,48.03,46.71,
+46.51,46.30,47.78,48.32,46.23,45.23,46.43,47.00,48.71,47.67,
+47.43,46.68,48.13,48.13,48.64,47.91,48.86,48.79,50.72,49.32,
+46.53,47.98,49.20,49.11,48.18,48.53,49.36,50.98,49.91,51.66,
+49.79,49.18,50.93,51.62,52.21,50.42,49.20,48.46,50.06,49.54,
+49.61,49.67,52.30,49.82,49.51,50.65,54.83,51.56,53.09,50.27,
+51.78,50.98,51.59,53.28,52.14,52.84,51.70,53.80,51.18,52.05,
+8.37,10.00,10.46,11.08,10.56,10.91,11.87,12.15,11.28,13.09,
+12.36,12.47,12.92,13.65,13.48,14.22,14.58,13.51,15.21,15.46,
+16.25,15.35,15.12,16.07,16.66,16.74,17.23,16.53,17.14,17.75,
+17.12,18.00,18.08,19.38,17.73,19.26,19.69,19.37,20.28,19.10,
+19.11,20.03,20.94,21.57,21.32,20.95,22.81,21.97,21.43,21.90,
+22.34,22.31,22.26,21.72,21.45,22.38,23.51,22.87,24.24,23.46,
+24.23,23.10,23.25,24.30,24.33,23.33,24.18,25.82,24.74,24.84,
+24.91,25.36,24.83,25.13,27.03,26.71,26.30,26.57,25.52,26.91,
+25.99,26.57,28.44,26.44,26.22,27.74,27.04,28.43,28.97,28.50,
+28.01,27.50,28.42,27.77,29.28,28.73,28.17,30.20,30.41,30.21,
+29.95,29.82,29.73,29.40,29.38,30.84,30.56,30.54,29.70,30.18,
+31.11,31.19,31.55,31.49,32.42,33.47,32.38,31.68,32.14,32.14,
+31.14,31.50,32.97,32.11,31.75,33.02,33.98,33.27,32.10,33.59,
+34.18,32.38,34.45,33.80,34.96,34.50,33.22,33.68,34.17,35.04,
+35.28,35.86,35.88,34.70,35.53,33.48,33.61,35.14,34.54,34.84,
+35.69,35.99,37.28,36.05,37.08,36.64,34.31,36.72,36.13,36.78,
+36.84,38.73,36.79,36.52,37.88,35.25,37.23,37.54,36.05,37.95,
+38.05,36.05,37.26,37.96,37.73,38.31,39.25,37.84,37.72,37.35,
+38.18,38.40,39.10,38.18,39.38,38.56,38.93,40.70,39.05,39.59,
+38.00,40.46,39.94,41.86,38.72,39.17,41.64,37.81,40.92,41.99,
+39.76,40.59,42.17,40.73,39.29,41.03,42.66,42.21,42.34,42.11,
+41.37,43.00,41.46,42.04,41.09,42.09,42.03,42.35,43.50,42.46,
+42.71,43.75,44.26,42.52,45.01,42.04,43.67,42.42,44.24,42.11,
+43.51,43.75,43.95,43.78,42.66,43.81,44.09,44.51,43.73,43.65,
+41.82,43.86,44.67,46.74,44.83,46.58,45.19,47.08,44.06,45.49,
+44.67,46.01,45.74,46.38,44.98,46.97,45.34,46.89,46.74,45.96,
+45.87,45.06,46.63,46.86,47.88,47.72,46.91,49.33,46.95,44.90,
+49.68,47.63,46.66,47.69,48.66,48.11,47.06,47.79,49.29,47.24,
+48.06,48.05,47.82,46.24,49.75,47.84,49.47,49.70,49.61,49.36,
+17.30,18.29,18.73,19.31,19.92,21.52,22.26,22.53,22.46,24.71,
+23.97,24.67,25.18,25.02,26.20,27.20,27.26,27.47,28.66,28.76,
+28.34,29.42,29.21,31.43,31.10,31.36,31.95,31.27,32.18,33.55,
+34.07,34.43,34.39,34.94,34.40,34.48,36.16,37.01,36.65,36.53,
+36.33,37.94,37.32,39.35,39.36,39.95,37.95,39.12,39.84,41.50,
+40.14,41.78,40.94,42.58,43.09,42.93,43.72,43.27,43.16,42.27,
+42.72,44.54,44.04,44.91,44.99,45.59,46.25,45.22,46.71,48.50,
+46.18,46.39,47.91,47.60,46.94,48.14,48.09,48.11,49.88,48.99,
+51.16,51.17,45.92,50.79,51.87,50.81,51.94,51.98,51.88,53.77,
+53.49,51.65,53.24,54.03,53.86,53.49,54.21,54.72,56.99,53.96,
+55.45,57.08,54.08,52.95,57.20,56.98,54.65,58.11,56.93,57.25,
+56.96,57.97,59.12,57.59,58.96,60.13,58.08,58.10,61.04,59.42,
+60.33,60.95,61.56,60.61,62.22,59.42,63.46,59.60,62.58,60.30,
+60.01,61.47,62.77,63.18,61.68,62.93,62.89,61.05,62.31,65.64,
+62.33,64.25,65.03,64.61,66.30,67.81,64.36,64.88,67.56,64.98,
+68.69,66.25,66.61,68.03,69.09,65.27,69.42,68.50,67.30,67.59,
+69.70,69.98,69.80,69.08,68.11,67.71,72.32,68.88,68.87,70.66,
+72.11,71.75,68.92,70.04,71.49,72.10,69.03,68.78,70.20,72.48,
+72.76,74.81,72.96,70.72,72.11,72.40,72.00,74.08,74.16,74.81,
+73.28,75.73,74.48,75.30,75.97,75.79,77.17,74.99,77.57,77.78,
+76.38,73.89,76.19,75.48,74.95,78.75,78.16,78.05,78.69,76.10,
+76.89,77.89,78.91,78.88,74.86,77.69,79.39,78.39,78.75,81.34,
+82.68,79.67,78.71,80.44,81.54,80.12,79.39,78.95,78.41,82.67,
+84.31,80.22,80.75,80.92,80.91,81.29,81.83,82.01,85.42,84.64,
+81.03,83.84,84.41,83.89,83.17,82.19,84.71,84.57,86.46,85.83,
+87.49,86.36,83.66,85.25,86.61,85.95,84.97,85.34,86.07,85.59,
+83.56,84.61,82.33,82.26,88.40,85.24,85.94,85.54,88.73,88.75,
+88.31,87.17,84.88,86.46,91.52,88.71,86.30,88.82,87.21,92.61,
+87.18,86.89,88.62,90.89,86.69,90.39,90.17,89.38,91.61,94.18,
+17.78,17.70,19.05,19.51,20.68,21.47,21.01,22.22,23.08,23.58,
+24.25,24.57,25.26,24.69,26.58,27.20,27.07,29.00,28.58,29.45,
+28.96,29.37,30.38,30.25,30.95,32.20,31.49,31.93,34.05,33.77,
+33.09,35.01,34.10,35.40,35.69,36.09,36.00,36.52,35.25,37.94,
+37.76,37.00,38.16,39.30,38.55,40.27,40.91,39.91,41.17,40.70,
+42.36,41.13,41.41,42.47,44.33,41.74,42.97,42.50,43.05,45.92,
+44.94,46.34,46.58,43.66,46.42,47.56,45.94,44.61,46.83,47.69,
+47.68,47.98,46.96,47.44,51.37,48.32,48.92,48.85,50.27,50.56,
+51.09,49.99,50.26,52.83,49.33,51.17,54.78,52.56,51.41,55.10,
+56.11,53.56,52.12,54.19,55.88,54.11,55.02,57.58,57.59,54.34,
+55.60,57.13,56.60,54.34,58.24,55.91,58.30,60.29,58.11,57.10,
+58.08,56.26,58.62,58.63,60.41,59.31,57.39,59.31,58.09,60.23,
+61.37,59.66,59.67,61.51,60.05,62.19,63.29,63.16,62.44,64.42,
+65.27,62.54,64.13,66.16,63.03,65.64,64.34,64.71,63.78,65.05,
+67.50,65.26,64.78,66.07,64.25,68.67,64.44,67.36,65.71,66.16,
+65.96,69.72,66.61,68.71,68.94,72.06,66.95,69.98,68.85,68.52,
+69.16,67.66,73.04,69.88,72.29,71.89,72.49,69.26,73.02,70.03,
+69.97,72.06,68.97,71.25,68.92,73.63,72.66,71.30,71.58,74.11,
+73.59,76.83,74.02,75.75,74.06,73.76,73.85,72.68,75.63,73.42,
+73.27,74.65,77.50,74.31,75.25,74.60,72.72,75.04,76.52,75.75,
+75.77,78.61,80.70,77.92,76.48,78.08,82.14,76.73,75.43,81.25,
+78.59,80.34,80.98,78.61,80.56,76.45,79.84,82.99,81.31,79.77,
+81.70,81.73,80.82,81.06,80.90,86.38,80.07,81.55,82.39,84.66,
+85.78,79.76,81.23,84.93,84.67,84.48,88.67,85.96,85.32,83.67,
+82.72,85.20,86.57,84.82,85.54,83.09,85.81,86.18,86.99,86.99,
+85.63,88.17,84.76,86.34,85.84,86.23,84.07,84.60,82.44,87.26,
+89.49,87.12,90.73,86.74,87.77,90.29,86.74,88.04,85.62,86.43,
+88.48,89.41,92.70,89.83,88.89,87.99,91.04,88.39,91.29,90.35,
+91.50,89.07,91.95,93.59,90.50,89.35,93.37,90.98,91.55,89.86,
+17.51,17.58,18.64,20.11,20.31,20.79,21.65,22.10,22.68,24.31,
+24.17,24.76,24.83,25.77,26.80,26.36,27.06,28.22,28.35,27.75,
+28.15,30.99,31.46,30.48,32.68,31.92,32.69,34.00,33.29,34.82,
+34.87,35.12,35.37,34.32,35.36,33.84,36.31,36.09,38.27,37.69,
+38.18,38.59,37.83,39.03,38.94,40.64,41.00,41.00,41.04,39.36,
+41.51,41.74,42.35,44.12,42.47,43.69,44.98,43.90,46.02,43.79,
+46.16,45.95,46.32,47.38,45.77,49.00,47.83,47.50,47.71,49.86,
+46.86,49.26,48.76,50.16,49.75,50.54,50.84,50.18,52.01,52.00,
+49.58,52.68,52.47,49.41,51.70,53.27,51.83,52.37,53.95,53.80,
+54.03,52.07,56.25,52.65,56.06,53.68,54.92,54.00,55.28,54.98,
+54.14,54.66,55.99,56.85,58.70,58.24,59.83,59.22,55.96,57.45,
+58.41,58.45,60.14,59.42,59.95,60.05,58.53,60.27,57.69,60.55,
+61.19,61.11,62.52,60.63,61.46,62.63,61.05,60.10,60.45,63.77,
+62.26,63.80,62.72,63.63,64.30,64.66,63.91,64.75,66.94,67.70,
+65.41,66.67,66.66,64.34,66.04,65.62,65.11,65.98,65.51,68.25,
+68.50,69.27,70.14,67.92,66.30,66.10,68.30,66.53,70.00,68.27,
+69.28,71.99,69.42,68.54,70.79,71.33,73.44,69.22,73.09,68.59,
+72.61,72.16,73.83,74.84,72.03,71.64,72.99,72.90,73.55,71.13,
+74.28,75.02,74.54,75.66,72.88,74.37,73.75,75.88,75.69,75.09,
+76.63,75.02,78.60,76.16,77.11,75.65,74.47,73.64,76.96,75.24,
+75.52,73.74,78.97,81.37,78.84,78.18,77.48,79.44,82.50,79.41,
+80.15,78.56,76.61,82.81,78.29,81.49,81.57,81.85,83.27,79.60,
+78.31,80.74,83.79,80.08,81.35,83.53,81.16,81.02,82.29,81.45,
+82.81,83.38,83.59,81.03,81.41,84.97,81.42,86.84,82.29,84.32,
+83.02,87.56,83.65,82.75,83.24,82.94,90.15,88.69,84.65,87.47,
+83.84,86.42,88.31,86.25,83.11,89.88,86.22,88.84,84.55,87.14,
+88.04,90.50,86.72,87.19,85.62,87.38,88.44,88.09,91.33,88.85,
+90.05,90.33,90.92,88.38,88.98,88.22,93.38,87.95,90.64,90.26,
+89.16,91.40,92.02,89.55,89.26,95.08,94.20,94.88,90.56,91.49,
+17.42,17.60,19.05,20.57,20.14,21.38,22.40,22.00,23.01,23.10,
+24.69,24.93,24.81,25.47,26.28,27.30,26.90,27.27,28.19,28.93,
+28.75,30.48,30.64,30.35,31.93,30.63,32.12,32.36,31.72,33.02,
+34.57,33.88,33.53,35.68,34.01,35.93,35.08,36.36,36.57,38.59,
+38.52,38.69,40.08,37.17,39.33,40.15,40.01,39.75,40.42,41.09,
+40.55,42.02,42.07,43.31,43.38,43.97,41.83,42.22,46.34,43.98,
+44.55,44.05,47.02,46.67,45.10,46.35,45.98,45.31,46.20,47.16,
+46.99,47.91,47.33,47.37,49.47,49.21,49.16,50.22,51.48,50.85,
+50.09,49.65,47.82,50.65,50.68,51.74,51.89,50.70,52.43,53.69,
+53.94,53.38,54.75,52.43,55.34,55.79,53.34,52.92,54.31,54.37,
+57.20,54.91,56.71,57.52,58.12,56.76,56.88,55.19,57.66,56.51,
+60.01,58.94,58.64,58.03,57.64,57.67,59.59,58.08,60.19,60.00,
+58.83,60.13,63.40,59.74,61.93,60.63,60.38,59.11,59.26,59.88,
+63.39,62.08,63.50,63.26,65.04,64.46,63.93,64.09,65.89,61.73,
+64.60,61.51,64.97,68.60,68.29,64.65,69.34,65.83,64.97,64.33,
+68.87,66.62,67.12,69.43,68.01,69.67,67.79,67.78,70.39,66.89,
+69.71,71.72,68.26,72.22,68.56,68.96,68.57,67.63,72.39,71.69,
+71.82,71.64,72.67,71.72,72.87,72.90,71.36,70.87,74.63,73.54,
+72.18,75.14,73.16,70.94,72.90,75.44,75.87,75.61,76.92,73.10,
+73.15,72.98,76.32,73.85,76.47,75.90,76.04,73.41,75.88,77.78,
+73.91,76.10,75.60,75.20,76.02,75.30,80.38,78.20,78.42,78.75,
+78.85,75.76,82.50,77.74,79.11,76.48,79.47,80.76,80.19,77.66,
+78.95,80.40,80.15,78.78,79.11,81.38,82.82,79.22,82.77,85.35,
+80.98,82.84,81.81,79.97,82.29,81.72,84.27,80.24,80.87,80.34,
+81.11,82.37,83.73,84.21,88.90,84.31,81.25,86.13,86.01,86.82,
+82.27,86.85,82.06,84.20,84.87,86.52,88.69,88.87,86.04,87.22,
+84.34,84.86,84.10,85.95,86.72,88.59,88.32,87.57,89.00,85.10,
+87.21,90.12,85.54,87.35,89.90,87.35,87.07,89.37,88.34,92.03,
+90.42,91.01,90.11,90.20,90.74,92.29,92.66,89.09,92.52,89.89,
+16.24,17.74,18.75,18.79,19.08,20.70,21.07,21.29,22.57,23.24,
+23.05,23.65,25.00,26.09,25.26,25.58,27.16,28.15,28.05,28.69,
+28.39,28.45,28.60,30.80,31.09,31.50,30.83,31.49,31.91,32.61,
+31.95,33.93,32.22,35.29,34.38,36.15,35.36,35.30,35.15,36.57,
+35.80,37.15,38.83,37.89,38.27,37.84,38.81,38.55,39.07,39.35,
+40.08,41.21,40.76,41.09,40.89,42.94,43.90,40.54,41.57,43.72,
+43.42,44.19,44.34,44.50,45.14,45.85,44.98,44.78,48.16,47.03,
+44.87,47.18,47.36,48.31,49.05,48.28,47.85,49.45,47.61,49.39,
+51.69,50.21,52.69,50.33,49.98,53.24,51.36,51.19,51.12,52.71,
+50.25,54.20,52.69,52.39,53.54,52.54,52.92,54.81,54.43,53.28,
+55.52,57.27,57.54,54.73,54.97,54.99,56.55,56.78,56.06,57.74,
+56.18,59.45,57.73,59.49,60.08,58.78,61.26,59.70,60.64,60.68,
+58.49,58.66,58.47,60.78,59.45,60.82,59.93,60.77,61.26,62.26,
+63.37,62.48,63.95,62.08,60.94,60.57,62.86,61.09,67.10,65.76,
+64.24,65.07,64.63,62.56,65.50,63.57,62.93,62.21,62.57,65.87,
+64.76,66.25,64.97,67.35,67.92,67.23,65.23,65.34,67.08,67.76,
+69.79,66.62,70.09,67.63,68.39,67.04,70.83,68.08,67.01,67.18,
+68.30,65.39,72.02,71.78,71.12,70.13,68.84,70.63,73.27,69.33,
+72.18,74.03,72.42,70.08,70.99,72.07,72.12,72.77,74.15,72.43,
+70.68,74.06,71.39,73.98,73.08,75.99,73.82,75.95,76.66,74.65,
+77.12,76.29,77.16,75.27,74.59,75.05,79.04,77.22,76.95,80.00,
+80.64,80.54,76.47,75.27,77.34,78.36,75.06,78.95,78.25,78.27,
+77.37,77.00,79.53,80.31,82.08,82.14,79.70,82.22,79.88,82.26,
+79.14,78.13,81.45,82.46,82.96,79.36,79.80,83.80,82.29,80.48,
+82.90,79.30,84.75,82.83,82.85,84.58,84.78,83.20,83.98,85.24,
+86.64,84.50,81.98,84.53,87.18,85.01,86.05,83.20,88.54,85.48,
+84.04,87.94,86.61,85.75,84.44,85.95,85.57,85.25,88.12,87.27,
+86.26,87.85,88.08,90.00,89.58,89.72,85.74,87.02,91.67,86.27,
+91.22,90.34,89.62,87.90,87.55,88.60,92.02,89.55,87.73,91.55,
+16.70,16.88,17.90,18.20,19.29,20.18,20.91,20.66,22.38,21.37,
+22.68,24.89,22.77,24.61,24.60,25.57,25.71,26.07,26.27,28.38,
+27.44,28.51,29.59,29.00,30.80,30.26,30.51,30.63,29.95,31.25,
+31.39,32.97,33.58,32.76,34.63,34.20,34.27,34.99,35.22,34.76,
+35.08,36.34,37.92,36.79,36.48,38.27,37.65,37.18,39.42,37.81,
+39.18,40.96,39.64,38.72,42.23,41.11,42.64,40.63,41.36,41.83,
+42.98,41.67,42.56,43.04,41.14,44.19,43.41,44.12,44.00,46.20,
+44.61,45.63,45.23,45.78,47.99,46.85,45.60,47.21,47.66,45.92,
+48.92,48.90,49.02,50.56,47.74,50.27,49.58,50.15,51.52,48.85,
+51.60,54.15,52.56,52.64,51.29,53.25,51.00,51.47,52.13,52.10,
+54.16,53.82,55.66,52.77,53.82,53.45,54.22,57.05,55.25,53.95,
+54.70,55.51,54.78,55.73,55.31,57.38,58.07,57.68,56.95,56.71,
+58.52,55.94,57.02,57.71,58.56,57.11,58.24,58.53,59.50,64.24,
+60.82,62.55,58.08,60.86,59.40,61.53,63.64,62.24,62.34,62.25,
+61.98,60.60,62.47,63.31,62.15,60.05,66.18,62.90,62.15,63.44,
+62.52,64.63,64.64,63.22,65.24,66.35,61.34,63.78,68.74,65.25,
+66.17,70.40,64.03,67.38,68.27,68.86,66.19,68.56,64.49,66.63,
+68.58,67.89,65.89,68.16,70.70,65.31,70.41,67.72,68.06,67.57,
+69.05,66.77,71.72,69.45,69.02,69.69,71.29,71.98,69.24,70.59,
+71.04,72.16,71.28,72.86,68.55,73.40,72.01,71.76,72.33,72.93,
+75.33,74.27,70.73,73.37,72.66,72.49,73.37,74.39,75.06,74.62,
+75.82,72.09,73.69,75.72,75.07,77.00,74.84,75.98,75.56,73.87,
+75.59,77.45,78.13,77.30,78.12,75.46,77.14,79.05,75.96,76.87,
+77.47,78.90,79.55,74.83,78.22,77.16,78.74,78.80,79.21,76.04,
+80.04,78.64,78.85,82.81,81.62,79.74,82.31,81.66,83.08,84.20,
+82.77,81.60,82.28,80.83,82.78,82.25,81.28,78.77,83.30,82.46,
+82.17,80.11,82.88,82.24,80.31,83.82,84.27,82.43,82.86,84.76,
+84.69,85.52,84.11,86.35,82.06,85.48,86.19,86.61,83.32,88.15,
+87.13,83.16,82.13,89.30,87.60,90.46,85.61,88.20,88.75,86.24,
+16.14,16.61,18.04,18.55,18.76,18.89,20.25,19.87,21.02,21.56,
+22.35,21.76,22.82,24.13,24.21,24.39,25.94,26.12,25.69,26.26,
+27.06,28.12,27.39,27.78,29.10,30.37,28.40,30.53,31.31,32.46,
+30.81,31.76,32.41,32.46,33.20,30.93,33.22,34.05,34.02,33.80,
+35.51,35.84,36.54,36.79,37.35,36.45,36.06,35.92,36.69,37.65,
+39.07,37.83,37.77,40.72,39.08,38.03,41.13,41.11,40.36,40.64,
+42.64,41.52,42.50,41.71,40.34,41.89,42.34,44.13,43.70,41.81,
+44.77,44.40,44.45,42.01,45.33,45.34,45.78,43.67,46.31,45.95,
+46.18,47.33,47.88,47.04,46.94,48.43,47.23,49.45,48.53,49.16,
+50.71,47.99,49.84,51.05,48.75,49.69,50.38,51.37,50.77,50.76,
+48.81,51.13,50.49,52.11,50.78,54.20,51.05,53.05,52.73,54.76,
+54.67,54.06,54.08,54.66,55.42,53.46,56.10,56.91,56.30,55.08,
+54.09,57.84,58.13,54.73,56.73,56.34,57.06,57.28,58.70,56.80,
+58.26,58.16,59.78,57.96,56.93,58.74,58.36,62.44,60.12,60.17,
+61.11,61.59,59.82,61.95,59.35,62.72,61.19,63.07,61.18,63.78,
+62.13,63.04,62.69,62.86,62.72,63.19,64.67,63.06,62.42,59.38,
+63.97,64.04,64.51,64.25,63.41,65.87,67.03,66.59,64.13,65.04,
+67.12,65.74,68.24,66.00,63.19,64.38,64.74,66.85,67.48,64.33,
+66.79,71.51,67.08,67.08,68.77,66.33,68.22,68.81,68.84,70.06,
+66.57,68.24,68.70,69.96,70.35,68.67,70.57,73.08,73.42,71.38,
+70.54,72.91,71.02,71.88,70.12,70.37,74.97,74.71,72.79,75.19,
+75.01,71.47,74.31,72.56,76.63,72.04,74.82,74.45,78.07,72.79,
+77.02,75.37,75.27,72.97,76.17,74.45,77.26,77.03,72.95,73.40,
+73.91,73.92,77.25,74.74,71.81,75.89,74.40,75.18,76.84,76.00,
+78.04,78.37,77.57,76.85,74.79,77.43,77.61,77.75,78.39,77.59,
+78.98,79.17,79.58,77.62,77.18,79.35,77.18,79.52,80.72,79.15,
+80.67,78.69,82.39,79.20,78.16,83.31,85.00,78.69,84.00,80.86,
+82.18,81.42,81.91,81.11,81.20,85.92,82.19,78.16,77.77,81.27,
+82.77,82.91,83.95,85.18,82.37,84.80,85.26,84.53,85.02,81.88,
+15.15,15.67,17.00,17.62,17.34,17.97,18.98,19.20,20.16,21.77,
+21.42,22.06,22.75,23.00,23.43,23.04,25.14,25.42,24.52,26.53,
+26.92,26.47,26.44,27.36,28.39,28.39,27.93,28.59,29.70,30.31,
+30.63,31.08,31.81,30.30,31.84,32.09,30.59,32.08,32.99,32.59,
+33.66,33.99,34.19,33.64,34.83,34.94,35.32,38.09,36.09,37.39,
+36.24,37.80,37.72,37.06,37.08,37.42,37.63,39.44,37.60,39.48,
+40.03,39.53,39.56,39.57,41.12,42.61,41.36,40.16,41.74,42.48,
+41.19,42.12,41.27,42.11,43.70,44.95,45.07,43.77,44.38,45.69,
+44.28,45.80,45.31,44.80,45.50,44.22,45.44,46.63,45.19,45.47,
+47.09,46.13,46.05,47.14,48.08,47.86,48.04,48.95,50.64,51.89,
+48.09,51.22,49.58,50.40,50.46,52.65,50.25,50.51,49.76,52.08,
+51.52,52.04,52.25,52.18,51.75,52.09,54.36,53.77,54.76,55.00,
+54.73,53.99,53.10,56.23,53.95,56.45,57.47,53.95,55.98,57.00,
+56.26,56.43,54.92,57.58,55.63,58.51,57.08,54.83,58.88,57.76,
+55.06,60.39,58.03,58.38,59.41,58.95,58.36,57.76,58.41,57.90,
+58.85,59.58,58.44,59.10,58.37,60.81,63.84,61.36,60.23,62.20,
+61.10,58.83,59.80,64.12,63.32,63.91,62.12,63.44,61.67,62.52,
+63.69,63.21,64.78,64.12,64.59,64.32,63.44,67.06,64.63,64.52,
+66.21,63.07,64.36,67.21,68.50,64.13,69.81,66.02,66.22,66.45,
+67.06,67.83,66.57,68.16,68.06,67.40,64.73,68.63,68.27,69.84,
+66.68,68.87,70.48,70.07,67.84,72.24,67.28,67.55,69.38,70.53,
+71.13,70.82,68.21,71.60,71.16,68.64,71.13,71.33,71.93,72.74,
+69.27,69.00,72.04,71.73,69.93,72.68,70.13,73.19,74.27,71.70,
+72.60,71.55,73.37,75.45,75.08,71.02,73.98,74.69,71.40,72.97,
+71.82,73.15,75.68,74.39,76.34,77.44,74.15,76.06,75.97,75.87,
+76.55,78.11,76.65,77.57,75.88,76.56,75.20,75.98,72.85,77.05,
+77.76,74.99,77.89,76.33,78.09,80.48,74.95,79.82,78.93,77.83,
+79.25,79.89,81.25,80.19,79.38,79.36,78.71,82.62,79.11,81.52,
+80.39,83.80,78.34,82.28,81.79,84.60,84.01,80.75,82.93,81.02,
+14.73,15.07,16.35,16.38,16.84,17.33,18.72,18.65,18.98,18.75,
+20.07,20.61,21.37,22.71,22.75,22.25,23.38,23.31,23.34,24.43,
+26.25,25.27,26.53,25.84,25.22,28.46,28.50,27.96,28.44,29.30,
+28.88,28.63,29.46,30.10,29.46,31.87,30.49,32.14,32.13,31.81,
+31.47,33.93,32.70,33.27,33.99,33.74,35.64,34.57,34.12,33.62,
+33.70,34.46,34.81,37.87,35.86,35.66,37.78,35.72,37.80,36.96,
+37.86,36.99,40.18,38.98,38.40,39.21,38.73,39.74,39.83,40.07,
+41.15,40.22,40.71,42.28,43.07,40.57,43.03,42.79,43.34,41.70,
+43.46,41.62,44.66,42.53,42.28,44.08,44.02,43.62,46.45,42.47,
+46.46,47.09,44.09,44.81,46.62,44.75,46.27,46.55,47.84,46.45,
+46.74,44.83,46.49,49.25,46.49,48.09,48.36,48.48,48.70,46.17,
+48.79,49.81,50.14,50.39,50.97,49.87,51.42,52.11,51.12,49.35,
+49.92,49.87,50.16,51.50,48.96,53.82,53.13,52.52,53.26,53.71,
+51.96,54.60,51.89,52.72,52.63,54.53,57.67,55.46,53.28,58.53,
+59.45,55.29,54.81,53.87,56.52,55.45,58.06,57.15,55.34,56.22,
+57.62,58.49,55.48,57.39,56.24,59.98,59.02,57.84,57.10,56.89,
+60.85,59.18,59.46,59.94,58.57,59.80,59.46,59.90,60.16,58.06,
+61.16,61.48,61.81,62.32,63.07,63.33,61.23,61.27,61.07,58.82,
+60.59,64.79,61.29,63.42,62.68,63.05,60.95,61.76,64.85,64.20,
+63.09,63.65,62.61,64.07,64.59,64.86,65.48,64.70,68.17,66.51,
+64.51,67.91,65.01,67.18,66.82,64.26,67.01,63.37,64.01,66.54,
+66.92,66.32,67.00,65.08,65.93,67.38,67.66,65.98,63.46,65.38,
+64.63,65.92,70.37,70.13,68.01,66.84,67.97,69.76,68.05,66.84,
+72.15,69.98,71.25,70.64,71.72,73.19,71.08,70.24,69.85,70.38,
+71.56,71.73,71.72,72.34,68.75,73.22,70.71,73.58,71.36,71.30,
+75.62,75.58,72.34,72.59,72.71,70.29,73.34,74.98,73.05,73.37,
+72.61,73.94,71.00,73.74,75.28,74.26,74.33,77.13,75.61,76.20,
+75.78,73.71,74.06,77.59,78.14,73.48,76.28,76.58,76.74,76.45,
+77.34,77.59,77.92,78.67,77.54,80.94,77.19,74.53,78.02,78.21,
+14.48,14.63,15.10,15.53,16.12,17.21,17.26,18.28,19.08,18.88,
+19.22,19.01,20.32,20.93,21.31,21.61,22.07,22.49,22.80,23.65,
+24.07,24.18,24.89,25.11,26.13,25.38,25.25,26.63,27.19,27.15,
+27.12,27.70,27.50,27.42,28.08,29.16,29.26,30.65,29.58,29.42,
+29.61,31.39,29.57,31.84,30.74,31.37,31.81,32.51,33.18,32.88,
+33.08,32.68,33.75,33.59,34.29,34.07,34.14,35.03,36.82,36.82,
+35.80,34.95,36.48,37.58,37.85,36.90,37.95,38.54,38.03,36.61,
+39.07,38.30,39.21,38.19,38.53,40.90,38.48,40.36,41.59,41.82,
+42.55,40.26,40.57,42.72,38.30,42.29,41.21,41.98,41.72,43.41,
+44.07,44.25,43.55,45.03,44.79,47.44,42.94,44.58,43.52,44.20,
+43.13,43.76,44.60,45.70,45.46,46.95,47.70,45.87,47.33,48.78,
+47.40,49.03,46.23,47.35,46.92,48.73,48.43,48.07,48.06,49.39,
+49.23,50.68,50.61,50.04,50.00,51.34,49.94,50.23,49.28,50.78,
+52.31,50.52,51.00,50.94,51.22,50.64,53.03,53.23,52.10,53.22,
+52.40,52.99,51.18,54.16,52.04,54.30,53.80,52.30,53.75,54.19,
+54.95,54.28,55.32,55.57,56.24,55.61,54.48,54.22,55.74,54.03,
+53.40,58.01,54.80,54.96,56.29,56.39,57.15,56.65,54.91,57.39,
+58.44,57.10,60.12,57.29,58.97,58.28,58.40,56.99,60.09,58.38,
+58.29,57.65,58.76,58.98,59.11,59.64,59.80,61.39,58.61,60.82,
+60.32,60.80,59.34,61.70,60.17,60.53,63.75,62.37,61.62,61.62,
+62.50,62.42,61.55,61.89,62.84,65.93,63.44,63.65,63.32,64.91,
+63.74,63.36,64.82,63.60,61.99,64.41,63.64,66.69,64.43,63.33,
+65.12,64.08,64.60,66.43,64.71,64.11,66.46,63.43,67.45,65.15,
+67.98,68.63,65.61,66.63,65.11,66.61,65.74,67.81,64.67,66.22,
+66.73,66.75,69.21,69.80,69.37,68.81,69.32,68.65,66.85,69.48,
+66.97,71.93,70.62,72.53,70.99,70.94,71.91,71.50,69.67,70.80,
+72.43,69.13,70.58,68.14,71.80,72.26,69.33,70.86,73.69,71.25,
+71.30,72.29,68.33,70.24,70.40,72.69,73.42,73.26,74.66,72.71,
+72.02,72.43,72.50,75.15,75.07,75.17,72.91,72.18,72.43,75.39,
+12.93,14.17,14.43,14.65,15.85,16.76,16.69,17.04,17.43,17.85,
+19.05,18.99,19.29,19.64,20.84,20.74,21.13,21.88,21.67,22.24,
+22.68,22.35,24.10,23.65,23.69,23.59,25.19,25.98,25.96,25.24,
+26.05,26.22,26.49,27.11,27.08,27.93,27.81,28.00,27.90,28.98,
+28.72,28.56,28.80,28.55,28.68,28.93,31.43,29.82,30.97,30.02,
+32.28,32.62,31.77,32.00,32.21,32.23,32.27,32.93,32.19,34.23,
+33.23,33.26,33.33,34.91,34.52,34.60,34.96,36.35,35.08,35.46,
+35.97,38.21,37.52,37.47,37.82,39.14,37.19,37.57,37.85,38.78,
+37.62,39.16,40.92,38.10,40.17,39.58,39.06,41.26,38.55,40.31,
+40.36,43.32,41.12,39.88,40.01,41.49,42.58,41.41,44.11,40.91,
+41.47,41.94,42.03,44.09,43.96,44.30,44.92,43.50,45.10,44.34,
+45.08,44.01,44.55,46.27,46.90,44.76,44.25,45.33,45.33,46.68,
+47.60,46.72,49.07,47.43,47.19,46.45,48.52,48.33,46.39,46.94,
+46.21,48.09,49.74,47.74,48.71,48.91,48.64,49.04,50.12,51.70,
+49.53,51.86,51.16,49.25,50.78,48.15,49.57,50.77,51.07,52.84,
+50.87,51.35,49.91,52.02,52.67,51.54,50.40,51.97,54.16,53.50,
+51.89,51.35,53.23,55.19,52.44,54.09,51.74,54.14,54.67,52.80,
+53.72,56.26,53.69,56.01,54.50,55.55,54.45,55.39,54.02,56.11,
+56.01,55.75,57.97,54.34,56.01,56.66,57.55,58.21,54.78,56.29,
+58.50,58.72,59.46,57.21,57.57,56.66,57.92,58.80,59.36,57.72,
+60.36,59.15,58.72,59.47,59.79,60.29,61.08,60.56,60.20,60.08,
+61.11,58.50,62.45,57.03,60.15,60.06,60.92,60.07,62.93,60.52,
+63.31,61.55,64.31,62.77,62.55,62.45,63.85,65.45,63.47,60.44,
+62.80,63.88,63.38,66.88,63.24,63.44,63.28,64.77,64.33,63.07,
+64.74,64.76,66.53,66.01,65.55,62.76,65.54,63.70,66.04,66.12,
+64.71,66.40,64.94,67.54,66.42,68.19,66.15,67.76,65.46,66.56,
+67.27,66.38,65.84,68.37,66.13,69.19,66.04,66.47,69.01,68.29,
+69.41,63.87,70.29,68.97,66.95,66.39,68.05,67.46,69.38,70.81,
+68.45,71.46,72.05,70.70,68.54,70.68,69.26,71.18,71.48,69.75,
+12.39,13.38,13.81,14.15,13.90,15.05,15.80,16.94,16.95,17.38,
+17.50,17.60,18.09,18.84,18.17,18.90,19.72,19.72,20.03,19.64,
+21.00,20.67,22.37,23.17,23.32,22.55,23.91,23.08,22.39,23.53,
+24.00,25.38,26.06,25.92,25.77,25.31,25.38,27.36,26.54,28.39,
+26.87,26.69,27.87,27.77,28.72,28.92,29.06,28.52,30.01,30.58,
+30.26,30.82,30.26,30.20,31.00,32.29,31.92,31.15,33.54,32.18,
+31.69,33.49,32.59,32.13,33.45,32.99,35.17,35.19,34.61,34.55,
+32.84,34.86,34.33,36.43,36.94,35.46,35.19,36.33,37.22,35.70,
+36.54,37.45,37.23,37.61,38.89,38.45,37.11,36.99,38.02,37.48,
+38.04,39.05,39.70,39.25,38.27,37.95,39.53,39.13,39.14,39.69,
+42.40,39.12,41.05,40.79,39.61,41.87,41.52,40.41,41.94,41.90,
+42.27,43.08,43.11,42.09,43.62,43.98,42.53,42.39,42.10,43.85,
+44.99,44.27,44.63,44.72,43.47,45.34,44.19,44.42,44.23,45.49,
+45.73,43.40,45.71,44.56,47.47,47.10,46.06,44.81,48.43,47.76,
+47.13,46.86,46.20,46.99,49.23,47.20,49.03,48.46,50.41,47.79,
+49.79,47.48,47.96,50.29,50.92,49.27,51.45,47.62,52.74,48.95,
+51.46,50.18,51.33,50.91,50.87,51.63,50.36,49.68,51.44,53.45,
+51.37,52.74,51.90,51.26,52.98,51.39,53.71,52.04,54.15,52.24,
+52.46,54.88,51.88,51.97,53.78,53.88,56.09,53.20,53.97,54.33,
+54.94,54.60,54.35,52.65,57.52,55.18,54.95,55.34,54.44,57.93,
+57.32,54.54,56.14,56.15,55.37,58.05,55.14,58.08,57.17,56.25,
+55.60,56.23,55.40,58.39,55.82,56.70,56.28,57.59,58.24,58.84,
+60.59,57.26,56.41,60.83,57.15,57.95,59.00,58.70,60.77,60.91,
+60.23,57.33,59.87,61.20,58.70,57.52,61.31,59.33,62.37,61.41,
+61.83,59.88,58.62,60.53,62.92,61.50,60.41,62.75,64.44,59.87,
+64.55,57.75,59.04,61.80,62.13,63.05,63.81,64.47,61.84,66.46,
+62.19,64.33,65.54,60.95,64.63,63.33,63.45,63.02,65.66,65.48,
+66.46,62.40,64.42,64.29,66.57,65.98,65.50,66.08,65.05,66.44,
+66.16,65.85,65.52,65.27,64.88,63.10,66.69,68.42,67.09,65.84,
+11.54,12.06,13.34,13.77,14.18,13.81,15.20,14.19,16.23,16.43,
+16.13,16.90,17.56,17.65,17.07,18.13,18.48,19.23,20.03,19.57,
+19.08,20.78,20.58,20.32,20.77,21.41,21.36,22.71,22.23,21.97,
+23.07,24.00,24.19,23.71,24.33,23.79,24.88,24.23,24.46,25.40,
+25.45,26.16,26.47,25.97,26.31,27.24,27.97,28.54,28.10,27.59,
+29.23,27.69,28.22,29.75,28.33,29.02,30.58,29.60,29.58,30.80,
+29.22,30.41,32.46,30.50,31.57,31.81,29.66,31.67,34.14,32.30,
+33.21,31.83,33.43,32.95,33.52,33.46,34.69,33.95,35.30,33.98,
+35.49,35.28,33.89,34.88,36.40,33.68,34.95,35.36,34.89,36.34,
+34.51,36.47,38.26,36.69,38.95,37.27,39.21,38.60,37.94,38.67,
+37.68,37.04,38.51,37.47,38.64,38.06,39.56,39.68,39.83,38.50,
+40.43,40.25,40.70,39.83,40.14,41.74,40.51,39.47,40.40,42.35,
+41.81,41.95,41.49,42.01,43.21,41.70,43.44,43.63,44.75,42.75,
+43.05,42.52,42.65,43.20,45.34,44.83,43.15,43.70,43.92,42.06,
+44.15,42.92,46.06,44.79,42.82,45.73,45.89,44.90,43.90,46.59,
+46.81,45.59,44.98,43.84,46.89,46.65,46.58,46.13,48.74,46.44,
+46.87,48.42,45.90,47.79,48.45,48.65,48.94,48.84,48.90,48.55,
+47.21,49.02,48.10,48.48,49.87,50.28,47.49,49.45,49.49,51.53,
+51.33,49.62,47.80,49.17,52.70,52.48,49.53,51.75,48.58,48.73,
+51.15,53.22,52.18,52.37,50.43,51.25,53.40,52.24,50.22,53.52,
+52.64,51.08,54.64,52.14,53.22,53.65,53.28,56.07,53.93,50.77,
+53.39,54.13,52.66,53.62,52.73,55.01,52.85,54.17,52.71,56.61,
+54.77,54.68,54.91,56.11,56.01,55.30,53.79,54.94,56.44,56.96,
+57.47,56.07,56.08,53.47,55.73,55.54,57.13,55.03,54.97,58.73,
+55.24,54.70,57.33,56.29,56.54,56.16,57.22,56.82,59.21,57.47,
+58.18,59.69,59.75,59.96,57.09,54.31,61.48,60.65,61.03,57.64,
+60.46,59.26,59.98,58.53,61.98,61.65,61.58,61.08,57.71,61.08,
+61.04,59.90,60.21,62.60,62.42,61.27,60.50,61.88,60.53,61.51,
+61.13,63.63,59.84,63.81,61.53,59.10,62.51,59.89,62.61,60.23,
+11.08,11.15,12.35,12.84,12.88,12.95,12.88,14.03,13.90,15.28,
+15.48,15.85,16.19,16.20,16.37,17.84,17.58,17.82,18.13,17.81,
+18.42,19.34,19.49,21.15,19.45,20.35,20.41,22.24,21.63,21.50,
+21.08,21.79,21.49,21.91,23.31,23.64,22.65,23.48,22.40,23.78,
+25.46,25.91,24.20,25.36,25.49,25.76,25.27,25.64,26.55,25.23,
+26.40,28.98,28.05,27.57,26.56,27.65,27.96,27.81,28.31,28.43,
+28.69,30.09,30.08,29.87,29.84,30.16,28.40,31.15,29.70,30.72,
+29.94,30.98,30.28,29.90,32.77,31.71,30.47,32.21,32.13,32.72,
+31.64,31.37,32.75,32.73,33.57,33.60,33.48,34.77,34.52,33.62,
+33.18,33.30,34.90,36.09,33.94,34.70,34.25,35.16,37.22,35.44,
+33.95,35.24,36.86,35.59,35.37,37.19,36.52,37.43,38.01,37.83,
+37.84,37.56,38.19,37.72,38.40,37.31,38.58,37.67,39.59,38.84,
+39.67,38.90,38.69,39.49,38.44,40.22,40.87,39.61,39.08,40.55,
+41.51,40.74,40.61,42.00,41.22,42.04,41.73,40.23,40.91,40.35,
+42.89,41.22,42.35,43.30,43.26,43.95,40.78,43.11,42.54,42.92,
+41.74,43.72,42.34,41.38,43.09,41.35,42.52,46.45,43.35,44.19,
+44.29,44.13,44.36,43.99,44.38,46.05,45.62,46.52,45.71,45.69,
+46.82,45.58,45.69,46.26,45.87,45.96,46.90,47.43,48.24,47.06,
+46.11,46.56,46.42,47.32,47.51,45.71,48.66,47.10,45.45,48.40,
+48.76,48.07,49.05,48.82,48.59,49.09,49.59,50.42,48.48,50.49,
+48.13,49.81,49.90,50.03,49.11,51.27,51.33,51.48,51.17,49.39,
+51.13,51.18,50.82,51.26,49.51,51.47,53.62,52.40,51.08,49.02,
+53.65,51.12,51.93,52.01,52.38,50.29,52.61,51.04,53.72,53.40,
+53.39,53.81,53.00,53.20,53.25,51.44,52.24,56.09,53.55,55.25,
+56.85,56.56,53.21,54.43,55.33,51.49,53.80,54.34,54.74,53.90,
+55.11,58.13,52.87,54.45,54.37,57.01,57.62,55.90,55.18,57.13,
+57.14,57.62,54.96,57.04,56.98,56.07,57.90,57.47,58.40,57.81,
+57.18,57.08,55.04,56.13,57.66,55.75,57.07,56.88,57.99,57.67,
+58.85,57.13,57.55,56.36,56.77,58.32,59.43,59.44,58.90,60.71,
+11.00,10.85,10.57,11.65,12.42,12.91,13.07,14.29,13.90,13.53,
+14.31,14.71,15.14,15.60,15.86,16.77,16.77,16.86,17.18,17.13,
+18.71,18.08,17.77,17.92,19.04,20.00,18.57,19.33,19.69,20.47,
+20.51,21.80,19.90,20.59,22.25,20.10,22.08,23.59,23.76,21.78,
+21.80,23.61,23.50,23.49,24.01,22.89,24.01,25.42,24.74,25.63,
+24.22,25.95,24.05,24.57,26.42,24.38,26.30,27.26,26.23,26.05,
+28.18,25.83,26.19,27.16,27.62,28.95,27.98,28.29,27.23,28.50,
+27.53,27.97,28.77,27.46,29.75,28.14,29.28,29.35,30.56,30.31,
+30.68,30.99,28.95,30.21,30.20,30.92,31.10,30.90,31.94,31.61,
+31.96,32.34,32.17,31.96,32.79,33.30,33.55,33.24,34.54,34.72,
+32.46,33.84,34.20,34.00,34.96,36.45,34.64,33.84,33.62,33.32,
+36.40,35.74,34.60,36.51,36.10,36.74,36.04,35.82,35.59,35.29,
+36.93,37.88,37.58,37.13,37.15,36.80,37.42,37.55,37.73,38.83,
+38.67,38.06,38.22,39.05,37.75,39.61,38.26,39.52,38.24,38.47,
+39.60,39.86,38.95,38.51,41.77,40.21,41.72,40.40,39.82,38.65,
+40.40,40.25,42.02,41.04,42.20,41.77,39.35,41.55,41.65,41.96,
+41.73,39.88,43.86,40.94,42.73,42.71,41.98,42.85,42.71,42.24,
+41.53,42.12,43.39,43.52,42.45,43.08,43.25,43.67,45.61,42.79,
+43.25,43.20,44.58,44.27,45.18,44.09,45.16,44.96,44.55,45.30,
+44.06,45.83,45.14,46.22,46.31,46.76,45.18,46.10,47.44,45.67,
+45.70,46.12,44.77,47.94,46.89,45.79,47.47,46.18,47.77,49.15,
+45.93,45.70,46.76,48.05,47.93,47.83,48.26,50.06,45.99,47.81,
+49.04,49.53,48.44,48.38,46.51,49.92,51.79,50.40,49.81,49.76,
+50.43,49.06,49.26,48.88,49.91,49.82,48.60,49.62,52.23,52.78,
+48.56,51.57,52.09,51.02,52.22,51.92,52.32,50.48,51.61,52.61,
+51.93,53.21,52.11,51.36,52.31,54.63,53.92,51.43,51.50,52.07,
+54.47,52.99,53.02,53.34,52.02,53.28,54.48,53.70,52.57,54.18,
+52.22,52.08,54.20,52.24,52.82,54.63,52.34,56.23,56.41,53.89,
+53.83,56.93,56.96,53.84,56.01,55.83,56.45,56.69,54.48,54.80,
+17.51,18.70,19.25,20.45,21.21,21.10,21.98,21.95,22.93,24.09,
+24.41,24.17,25.44,26.48,25.17,27.32,26.77,28.25,27.20,29.22,
+29.36,30.17,29.68,31.38,31.43,31.35,33.27,32.79,32.24,32.95,
+33.80,35.10,34.94,35.06,36.00,37.25,36.11,36.35,37.27,37.30,
+37.33,38.49,38.70,38.73,40.04,40.99,37.91,40.23,39.55,41.08,
+40.87,42.27,43.14,41.41,42.59,43.31,44.62,43.60,42.70,46.06,
+45.25,45.71,45.85,45.54,46.28,45.72,47.69,47.08,45.74,49.17,
+47.99,46.62,49.19,49.66,48.17,48.99,50.76,49.21,49.74,48.49,
+50.27,50.72,52.49,52.41,53.25,50.21,54.80,53.43,54.64,53.79,
+53.79,54.79,55.20,52.83,53.50,54.30,56.04,53.75,56.30,54.98,
+56.51,56.04,55.32,59.58,58.91,56.91,56.05,57.72,58.31,58.74,
+59.20,58.64,61.13,58.54,58.67,58.59,57.79,60.64,60.70,59.75,
+61.13,59.89,63.74,61.72,61.29,62.17,61.08,61.07,61.79,64.28,
+62.07,62.18,62.87,61.84,63.95,62.33,66.42,65.23,63.11,65.38,
+64.89,67.20,65.71,65.07,65.94,66.88,67.36,66.23,65.73,69.23,
+65.74,67.56,68.50,67.32,67.34,69.35,68.34,68.63,66.58,66.53,
+69.26,71.69,68.92,73.35,69.32,69.01,69.63,68.52,71.90,68.42,
+71.92,73.07,71.64,70.85,72.20,74.33,70.93,72.11,70.14,72.75,
+70.96,73.12,77.32,74.75,74.90,75.32,75.95,71.48,72.49,73.85,
+74.57,75.37,74.85,74.96,74.09,78.42,76.84,76.99,74.48,74.88,
+78.51,76.61,79.31,79.87,77.25,77.93,79.83,77.58,76.29,79.58,
+79.52,79.23,80.23,85.28,76.52,75.47,79.77,78.54,78.95,78.93,
+82.72,79.34,81.81,81.16,83.24,80.09,83.36,84.44,83.49,84.00,
+82.89,81.28,84.45,86.19,83.18,83.96,82.18,84.47,80.60,84.67,
+85.62,82.84,83.15,84.40,84.52,86.43,88.16,84.19,83.86,84.17,
+85.57,88.43,86.52,86.41,86.87,84.49,85.77,86.67,88.23,87.67,
+89.47,85.97,87.64,87.54,85.66,85.77,89.82,86.79,88.91,90.69,
+88.69,92.93,91.22,89.96,91.79,90.62,91.47,92.80,92.25,91.59,
+92.65,90.43,88.52,96.28,90.65,91.94,92.43,94.53,93.54,90.32,
+18.27,19.72,19.90,20.40,21.05,22.87,21.79,23.38,24.17,24.87,
+24.78,24.86,26.39,26.68,26.82,28.35,28.60,28.98,29.73,30.63,
+30.01,31.10,32.16,30.74,31.97,31.68,32.95,33.01,34.53,34.01,
+36.18,34.20,35.91,36.85,37.00,37.26,37.39,38.16,38.80,38.50,
+38.91,38.98,37.32,38.09,39.23,42.05,40.38,40.64,41.75,40.56,
+42.26,43.26,44.21,44.17,43.60,43.89,43.55,45.47,45.49,44.11,
+45.66,46.36,45.87,46.40,47.23,46.69,49.23,47.27,48.50,47.90,
+48.83,48.81,47.71,49.65,50.41,48.99,49.44,52.82,50.82,51.36,
+49.87,52.59,51.85,54.45,53.01,53.05,53.92,53.61,55.08,54.20,
+53.36,55.69,55.04,55.46,56.55,55.84,57.80,55.96,55.73,59.61,
+58.60,58.13,59.05,61.37,58.55,56.60,61.32,57.73,57.56,58.41,
+60.48,61.82,58.82,60.93,60.77,60.36,60.35,62.18,61.95,61.95,
+62.32,63.90,62.18,63.31,64.18,63.14,63.04,63.12,66.70,65.74,
+65.24,65.34,63.37,64.13,65.51,67.64,63.78,65.76,66.22,67.04,
+67.89,66.74,66.42,68.88,65.47,67.89,65.16,69.42,67.74,69.40,
+69.81,69.61,71.01,72.06,70.49,70.41,71.60,72.47,72.01,73.46,
+69.88,71.67,69.96,71.08,73.63,70.17,72.43,72.58,74.04,74.19,
+73.06,74.89,70.91,73.02,76.36,74.79,72.86,73.41,77.13,76.95,
+74.26,75.67,72.59,75.29,70.88,76.43,76.61,77.46,79.39,75.49,
+74.89,76.43,74.87,78.82,77.14,77.83,79.05,78.63,79.31,77.01,
+80.10,79.62,81.78,81.83,80.15,79.47,78.92,79.79,78.49,80.66,
+81.89,82.55,82.52,81.78,79.64,80.87,81.69,81.45,79.19,82.50,
+81.84,84.60,79.82,83.37,83.03,84.78,83.11,87.10,83.36,85.02,
+84.67,86.08,82.68,86.03,82.95,85.39,86.17,86.06,86.31,85.96,
+86.29,84.26,85.93,91.02,87.40,91.01,90.90,86.63,91.63,90.59,
+87.94,86.19,87.92,86.74,88.29,91.03,88.98,88.45,91.85,87.08,
+89.17,89.75,92.21,92.98,88.01,88.33,91.73,90.53,89.46,88.79,
+92.26,91.60,87.61,92.15,91.28,90.56,93.05,93.64,94.25,91.37,
+94.12,90.43,97.48,90.04,93.52,95.93,94.45,93.71,92.19,95.67,
+18.27,18.65,19.91,20.61,20.76,21.90,23.18,23.45,24.00,24.61,
+25.62,25.92,26.84,26.87,27.34,28.48,28.31,27.54,30.39,29.75,
+29.64,32.11,31.91,33.73,31.56,33.15,33.59,33.82,33.40,34.65,
+35.41,35.05,36.38,36.21,36.47,36.41,38.12,37.20,38.38,39.60,
+40.42,40.55,41.34,39.89,42.07,41.33,41.69,42.53,42.17,41.42,
+43.20,43.37,42.97,43.38,45.55,45.18,44.79,46.30,44.24,46.19,
+45.98,45.50,47.27,47.02,48.27,45.97,47.79,48.91,46.88,48.71,
+47.68,49.69,48.78,50.07,50.45,51.45,50.59,49.64,52.06,50.41,
+49.99,51.37,52.90,55.13,53.87,54.27,52.53,55.51,54.49,55.92,
+55.59,55.03,55.58,56.75,55.68,57.05,56.69,55.33,58.16,58.09,
+59.28,54.46,59.08,57.43,59.32,59.17,60.15,59.41,61.45,59.55,
+62.31,60.56,56.83,61.04,61.36,59.81,60.58,62.91,63.60,63.86,
+62.77,63.51,62.71,63.15,65.58,65.12,63.73,65.42,64.00,64.28,
+66.71,66.26,66.21,65.81,65.00,65.94,66.74,67.52,64.51,67.53,
+67.53,71.19,68.99,66.02,69.03,67.54,66.96,71.66,68.46,71.61,
+71.04,72.54,69.01,72.85,69.47,69.85,69.91,70.57,71.20,70.32,
+71.76,70.52,70.57,72.67,74.69,73.18,75.86,72.14,71.76,70.64,
+75.24,74.14,74.45,75.04,74.90,75.35,75.27,76.56,77.37,76.80,
+74.89,77.53,74.55,77.76,75.11,78.82,77.86,77.28,74.63,76.05,
+80.52,76.46,81.04,76.49,80.25,76.75,79.13,78.74,78.82,81.40,
+79.98,80.85,77.98,78.39,81.40,80.60,81.10,82.53,79.00,82.18,
+78.54,78.35,81.09,78.57,82.96,83.65,83.03,84.10,83.56,79.89,
+85.02,82.19,82.12,82.94,84.82,85.79,88.48,83.04,83.97,83.34,
+88.41,87.76,87.60,85.80,88.94,87.48,83.04,85.26,86.70,87.88,
+81.05,88.83,87.15,85.07,85.21,87.36,87.32,88.49,87.55,89.83,
+88.36,90.43,87.89,88.68,87.41,88.19,88.53,88.46,89.72,92.06,
+90.51,87.79,88.23,95.35,89.30,89.38,93.37,89.94,93.23,93.99,
+94.79,93.49,94.46,91.54,96.24,90.21,92.30,93.30,93.04,93.12,
+91.43,91.54,96.67,94.29,92.19,93.42,95.07,97.97,93.49,95.49,
+18.37,19.14,19.39,20.54,21.32,21.53,21.42,22.56,23.99,24.44,
+25.46,25.52,25.79,25.96,26.78,28.27,28.42,28.35,29.18,29.40,
+30.28,30.07,32.13,32.66,33.06,31.95,33.65,34.28,33.35,35.52,
+36.06,36.45,35.14,36.97,37.97,37.06,37.39,37.42,38.21,39.20,
+40.08,39.35,40.51,41.51,40.83,41.56,39.67,40.85,43.64,41.63,
+43.97,43.68,41.72,45.44,43.85,45.35,45.02,42.26,45.86,45.94,
+49.01,47.70,47.33,47.98,45.85,47.37,47.49,48.27,50.48,49.36,
+48.98,50.99,51.60,50.47,51.93,52.65,51.33,50.52,49.84,52.80,
+53.43,51.98,51.74,51.49,53.46,54.95,53.08,57.54,55.78,55.45,
+55.90,56.11,55.08,55.12,56.36,57.08,55.09,55.84,56.15,59.78,
+56.13,58.62,59.34,57.29,58.36,59.95,58.65,60.13,59.20,60.76,
+58.31,58.17,61.75,60.10,62.98,60.42,59.92,63.08,61.36,61.07,
+62.72,61.11,63.76,63.63,63.85,61.24,64.89,64.57,65.74,64.79,
+62.54,65.64,64.67,63.72,65.71,66.71,69.39,67.00,66.59,67.38,
+68.58,69.19,65.76,66.58,69.44,69.28,67.50,71.43,70.52,69.56,
+68.34,70.91,66.72,72.20,69.51,72.76,73.35,68.87,70.83,72.69,
+69.23,73.09,75.59,72.21,73.03,73.05,73.67,73.35,70.92,73.90,
+73.78,77.74,74.99,74.54,76.01,75.70,75.35,74.54,75.56,77.02,
+76.75,74.27,75.11,75.02,78.71,78.98,78.24,75.88,78.67,77.09,
+76.70,76.52,77.62,79.05,76.19,79.88,77.24,81.45,81.81,77.01,
+78.93,80.67,77.75,80.63,80.60,79.84,81.47,82.76,80.51,80.04,
+80.21,82.92,80.97,82.96,82.30,83.00,81.85,82.74,79.42,85.73,
+83.84,84.72,86.34,82.20,85.80,83.69,85.83,82.63,83.60,86.28,
+85.39,84.45,85.07,88.70,85.73,86.48,85.03,86.73,87.40,87.81,
+85.78,85.59,89.05,85.67,85.05,86.37,86.96,88.64,89.74,88.69,
+90.01,91.87,88.64,86.97,89.04,93.45,92.70,86.51,93.23,92.07,
+91.09,92.76,89.07,88.10,90.75,92.72,93.50,90.32,90.04,91.28,
+93.02,94.86,91.08,91.37,87.70,95.14,93.41,87.20,91.04,91.40,
+96.81,90.62,98.04,91.00,93.09,94.26,94.60,91.91,95.37,91.87,
+17.95,19.25,18.95,20.53,21.21,21.80,21.95,23.63,22.83,24.08,
+25.79,25.82,25.91,26.79,26.30,26.87,27.74,27.67,29.23,30.07,
+30.93,30.87,31.18,31.17,33.13,32.55,32.88,33.42,32.63,35.60,
+35.39,34.64,34.96,37.37,37.26,38.31,37.14,37.24,38.17,37.35,
+38.31,39.11,38.47,39.65,38.87,41.26,40.70,41.25,41.71,44.51,
+43.65,41.40,42.46,44.68,42.98,43.33,44.94,46.03,46.89,45.45,
+46.02,46.94,47.05,46.82,47.51,48.79,47.88,47.03,49.99,48.98,
+47.81,47.18,50.10,49.37,48.97,49.64,52.01,51.42,53.96,52.59,
+53.24,52.31,51.39,52.74,52.02,50.52,53.83,55.96,51.75,54.35,
+53.43,56.54,53.27,53.79,56.14,58.18,55.63,57.74,55.37,56.66,
+56.48,58.34,59.61,58.92,59.07,58.99,57.10,57.63,58.27,60.21,
+60.39,59.15,61.38,60.00,60.90,60.44,62.72,59.44,62.64,62.23,
+63.60,64.00,61.38,62.74,64.65,62.46,65.47,62.33,61.79,61.03,
+64.91,62.78,64.52,64.73,66.60,65.44,68.15,66.17,66.74,66.11,
+66.76,71.36,67.97,68.23,64.59,66.97,66.70,68.25,69.13,69.28,
+70.49,71.25,68.87,65.79,68.97,70.35,71.22,70.55,70.87,70.68,
+70.84,73.45,70.08,72.46,70.45,74.31,73.87,72.63,71.34,73.59,
+72.94,71.99,75.36,71.43,74.04,75.31,76.19,71.53,76.14,74.96,
+74.90,73.78,76.58,75.09,73.89,74.92,76.73,75.00,75.19,76.61,
+79.09,77.20,78.64,79.08,80.39,81.01,79.74,76.35,79.33,82.22,
+79.17,78.84,78.78,77.09,77.68,81.91,81.81,83.04,85.67,80.12,
+79.55,86.27,79.86,80.64,80.93,79.61,83.30,83.10,81.90,80.70,
+82.99,85.44,82.71,82.26,83.72,83.75,81.06,84.58,86.59,86.04,
+84.53,82.49,82.96,86.61,82.74,84.50,83.78,84.07,82.39,85.83,
+85.54,85.26,86.56,86.45,84.90,88.48,85.61,88.36,87.30,86.66,
+84.96,85.39,88.23,89.51,90.37,90.59,86.77,86.98,86.32,88.45,
+91.10,90.65,92.95,88.89,91.56,91.28,89.68,87.21,90.88,92.08,
+86.48,92.28,92.87,91.67,95.50,94.20,92.23,91.73,93.57,91.31,
+91.74,96.71,94.11,91.01,93.27,92.13,92.91,90.82,94.96,95.84,
+17.06,17.89,18.82,20.21,19.88,20.17,22.13,22.91,22.98,23.63,
+24.82,24.64,24.75,25.56,26.10,26.66,26.85,27.29,29.31,28.90,
+31.63,28.79,30.39,30.38,31.94,33.13,33.58,33.93,33.75,33.33,
+33.85,33.20,35.28,34.73,35.99,36.94,37.44,37.72,37.11,37.77,
+37.78,39.26,37.70,39.31,39.71,41.17,38.71,41.02,41.01,41.22,
+41.49,41.31,42.93,42.47,43.37,44.89,44.23,43.44,43.44,44.83,
+44.83,44.66,43.37,45.62,47.92,47.05,45.98,46.74,46.68,47.85,
+48.70,48.45,49.01,48.47,47.16,49.51,51.53,49.12,49.38,49.23,
+51.30,50.44,53.61,53.51,51.91,49.31,51.81,51.95,52.97,50.78,
+53.58,53.90,53.94,56.30,56.09,53.79,55.55,55.90,55.76,57.28,
+55.46,55.93,57.50,57.84,56.65,56.61,56.88,58.03,58.78,59.23,
+59.60,58.82,59.38,59.66,57.31,61.62,60.51,62.68,58.14,62.47,
+62.99,58.93,60.74,59.22,63.09,61.97,62.20,59.19,64.14,64.77,
+63.64,61.67,62.87,64.24,65.45,63.38,62.83,61.68,65.65,67.94,
+66.90,64.51,63.98,68.18,66.03,67.55,67.28,65.99,70.15,66.61,
+68.12,67.90,67.55,66.99,68.24,69.82,70.99,70.11,68.45,68.74,
+68.90,69.18,68.22,70.65,73.35,72.00,67.83,72.50,69.68,70.31,
+72.95,70.19,71.99,72.12,73.86,71.91,71.30,72.80,75.07,74.56,
+72.95,71.85,74.90,70.37,76.00,73.93,74.10,75.36,74.07,74.27,
+73.79,75.51,76.48,78.13,74.09,76.30,78.07,77.21,79.56,75.76,
+76.44,78.25,77.23,77.58,78.88,80.78,77.84,74.76,76.48,81.17,
+78.99,79.59,79.38,80.89,76.56,75.51,78.67,82.39,76.52,79.45,
+80.17,82.02,83.11,83.73,82.56,85.19,84.82,82.09,80.92,84.18,
+84.23,84.65,85.79,83.74,84.23,82.66,84.24,84.85,86.17,84.96,
+86.43,83.39,84.66,82.24,82.57,82.34,86.58,83.06,87.08,89.54,
+87.36,87.83,87.08,87.06,85.69,84.29,87.60,87.89,86.57,84.18,
+90.00,86.02,89.63,88.24,88.22,87.60,88.86,87.76,88.64,89.65,
+93.27,91.38,89.31,92.44,94.48,91.37,91.14,89.21,89.67,90.04,
+91.44,92.05,92.54,92.31,95.03,94.61,91.64,91.62,90.61,90.84,
+17.49,18.03,18.92,19.83,19.53,20.48,21.25,21.92,23.21,22.49,
+24.29,24.65,25.45,25.44,25.09,26.50,25.79,27.93,28.33,28.78,
+29.35,30.40,30.13,30.89,30.55,30.93,32.17,33.18,33.08,33.31,
+33.46,35.49,34.72,32.59,33.99,35.16,35.70,37.21,35.81,37.39,
+37.21,37.66,38.31,39.08,38.05,37.98,39.21,38.88,40.26,39.12,
+39.89,41.80,40.06,42.93,42.34,41.51,43.38,42.90,44.16,44.52,
+45.46,44.27,43.54,46.21,44.27,45.01,44.19,46.71,46.54,47.33,
+47.64,44.71,46.92,48.08,45.92,46.75,45.84,49.06,49.25,48.21,
+50.35,49.79,47.84,50.13,50.77,52.12,51.79,49.03,51.42,51.61,
+53.46,51.07,52.12,52.29,54.46,51.74,52.32,54.76,52.45,54.29,
+55.59,55.22,56.84,56.25,55.01,55.97,58.57,56.48,56.40,57.30,
+56.02,56.50,59.54,55.76,60.42,59.06,61.16,58.54,59.52,59.18,
+57.25,61.80,59.36,61.52,57.20,60.41,62.52,62.80,63.45,59.11,
+61.10,62.64,59.54,67.28,62.41,61.30,65.20,64.25,64.07,65.25,
+63.63,64.94,63.87,62.77,65.92,63.89,64.87,66.87,65.99,66.17,
+69.34,67.86,68.49,67.65,67.92,68.93,64.68,64.32,67.07,67.37,
+69.04,65.66,66.76,68.18,65.38,68.41,67.26,68.98,68.94,69.65,
+68.46,69.61,69.83,70.29,73.24,68.02,72.17,68.64,73.06,72.76,
+76.92,75.78,71.38,69.49,73.98,75.24,74.68,74.91,71.42,74.69,
+75.20,76.09,74.01,76.67,75.82,77.04,75.16,75.20,73.90,74.61,
+74.53,73.76,77.87,79.68,73.34,78.45,79.10,74.28,75.90,77.36,
+78.86,78.56,77.94,78.97,77.34,78.31,79.17,78.60,79.48,77.57,
+79.14,81.15,78.13,80.28,81.85,78.10,81.85,79.14,80.60,79.35,
+82.76,82.23,79.80,81.16,79.09,77.08,82.69,80.24,80.20,80.03,
+79.75,83.43,83.51,80.93,85.52,79.95,83.89,83.07,83.15,85.12,
+83.30,88.52,83.77,83.50,81.59,84.86,81.47,82.59,89.18,85.72,
+85.90,83.30,88.07,90.30,85.08,87.19,89.31,84.89,84.38,86.37,
+88.63,87.25,85.60,84.76,87.62,88.93,88.19,86.42,87.65,94.12,
+90.63,87.64,86.65,87.24,89.57,91.76,85.77,88.26,89.90,91.76,
+16.34,17.42,18.40,18.77,18.61,20.49,19.95,21.27,21.24,22.50,
+23.11,24.06,23.45,24.88,24.74,25.84,26.80,26.50,26.93,28.31,
+29.00,27.98,28.82,28.24,28.57,30.14,30.48,31.04,31.23,31.82,
+32.39,31.62,32.54,32.30,33.41,34.42,34.62,34.32,34.13,35.93,
+35.11,36.56,36.62,37.22,37.86,37.69,39.36,38.14,38.81,39.91,
+39.98,40.90,40.19,40.00,39.45,41.13,42.51,41.45,41.28,42.41,
+42.31,41.68,44.36,43.96,43.31,44.68,44.53,44.82,44.86,45.45,
+43.99,45.67,44.31,47.21,46.47,47.34,46.76,47.15,46.49,45.27,
+49.27,48.49,50.08,47.65,48.99,48.36,49.54,49.80,50.72,50.58,
+50.87,50.07,49.60,52.06,52.70,51.38,52.09,56.03,52.51,53.05,
+53.14,52.23,52.05,53.39,55.06,56.90,57.07,55.04,55.46,55.45,
+54.16,53.10,57.17,56.39,55.56,56.53,56.86,60.39,55.42,55.93,
+57.89,56.52,56.29,58.41,55.43,61.46,59.12,60.56,59.45,59.12,
+59.75,61.00,60.83,59.11,62.09,62.61,60.73,62.48,59.68,61.08,
+60.92,61.66,62.52,64.99,60.28,62.63,60.81,63.51,65.98,63.88,
+65.37,65.53,65.11,64.20,64.04,62.42,62.97,64.84,66.61,65.87,
+69.27,69.62,66.57,62.92,61.99,65.66,65.72,65.59,67.68,68.84,
+67.67,68.54,71.61,65.97,68.08,70.99,71.71,68.04,69.41,69.01,
+70.06,72.82,71.99,70.80,70.72,69.78,71.00,70.42,72.87,67.86,
+72.36,71.98,70.41,73.12,73.04,72.53,73.68,70.44,70.88,74.45,
+72.14,74.02,74.09,76.38,74.61,71.37,76.64,72.94,73.58,75.99,
+73.01,72.77,73.31,75.91,75.65,75.99,79.07,77.85,76.93,76.33,
+77.36,76.33,77.74,78.10,78.11,77.25,79.10,77.86,77.70,77.28,
+78.03,78.86,77.37,79.12,77.45,81.08,81.16,80.82,79.14,80.60,
+82.26,82.15,85.07,81.43,79.82,82.92,79.19,81.38,79.85,80.90,
+80.63,85.58,80.59,79.46,79.98,86.79,81.12,81.99,85.97,79.44,
+83.43,88.82,84.07,80.76,82.91,85.15,85.97,83.84,84.88,81.69,
+83.14,86.18,85.00,84.59,84.36,83.99,86.92,81.94,88.90,82.57,
+89.45,85.35,83.28,88.04,83.88,88.82,88.27,85.13,82.74,85.57,
+16.03,16.51,17.21,18.35,18.55,18.79,19.99,20.81,20.98,20.96,
+22.31,23.67,23.85,23.68,24.52,25.03,25.02,24.81,26.57,26.41,
+26.08,26.74,28.26,27.70,27.97,29.37,28.20,29.75,29.99,30.27,
+31.34,30.83,32.31,31.96,33.00,33.39,33.47,34.27,32.74,33.97,
+35.31,35.38,34.68,34.53,36.01,36.03,35.43,37.35,36.49,36.89,
+38.72,39.09,39.73,36.68,38.94,39.30,40.39,40.84,39.38,41.88,
+42.14,41.06,40.02,41.35,43.61,42.68,42.94,43.60,44.39,44.35,
+41.84,42.42,45.43,43.87,45.23,44.88,44.93,44.99,45.02,45.34,
+45.81,46.81,45.57,47.57,46.65,47.22,48.02,48.35,49.35,46.32,
+47.62,49.36,49.41,49.28,50.94,49.95,50.54,49.87,50.48,52.48,
+50.49,49.72,52.30,53.84,54.09,54.08,51.49,53.86,53.72,52.33,
+52.84,54.33,53.80,54.71,52.67,53.11,55.51,55.15,55.53,55.96,
+55.81,59.83,53.64,58.97,57.73,56.05,55.79,58.93,56.63,55.96,
+57.36,55.63,57.59,57.79,57.63,58.35,59.09,57.84,59.89,61.49,
+60.10,59.36,61.21,61.69,58.96,60.94,61.42,63.14,62.35,62.25,
+61.14,60.86,62.22,64.10,61.69,64.91,63.74,64.04,65.04,63.60,
+62.22,62.76,64.14,66.59,65.19,63.11,65.08,65.34,66.17,64.52,
+66.50,66.66,68.43,67.77,67.52,68.57,66.93,70.64,67.98,67.01,
+70.86,71.46,67.22,69.07,66.98,67.27,68.44,66.62,70.22,67.99,
+69.34,68.95,70.42,73.43,68.49,71.58,66.54,71.09,72.34,70.27,
+70.26,68.77,72.89,71.78,73.50,72.16,70.27,70.95,69.92,72.59,
+72.85,74.61,71.08,72.07,75.73,73.73,70.91,74.51,72.86,74.61,
+77.53,75.13,72.93,75.10,75.20,72.77,75.97,74.83,74.96,75.37,
+75.08,77.04,78.00,74.31,78.25,75.11,76.34,78.76,72.06,75.88,
+76.77,77.09,80.74,77.43,75.42,79.35,77.70,78.49,77.75,80.86,
+76.69,79.81,73.17,77.91,77.05,81.83,78.43,80.51,77.71,79.01,
+81.55,79.79,82.95,81.24,79.64,81.17,82.97,79.65,81.06,81.00,
+77.21,83.83,80.59,82.68,81.90,81.26,80.65,82.16,83.83,83.72,
+81.76,86.36,83.05,86.46,83.69,86.84,81.42,84.08,84.77,84.32,
+14.89,15.68,16.55,17.89,18.15,18.88,19.07,20.80,21.38,20.25,
+20.73,21.42,22.15,22.57,23.41,24.04,23.73,23.97,25.24,25.61,
+25.65,26.09,26.10,27.29,26.26,28.16,29.01,29.63,28.95,28.97,
+30.25,28.82,30.19,32.62,31.46,32.82,32.18,32.72,33.04,34.01,
+34.16,32.60,33.82,34.24,35.40,34.60,34.47,34.75,35.72,35.51,
+36.18,36.90,35.38,37.84,37.81,39.36,40.07,36.26,39.57,39.42,
+38.48,38.88,38.73,40.56,41.93,41.74,41.87,42.41,41.25,42.88,
+41.53,41.56,41.88,42.78,41.04,43.89,43.36,43.69,43.22,46.19,
+45.22,45.63,45.25,44.17,44.23,46.22,45.71,45.02,45.87,47.66,
+48.36,47.10,47.14,47.84,47.33,46.66,48.16,47.72,49.14,47.92,
+48.28,50.59,51.04,49.38,49.21,49.92,49.89,51.96,48.56,50.66,
+51.17,52.89,50.12,51.72,52.76,49.39,51.78,51.87,52.66,52.97,
+55.22,53.20,53.67,53.25,53.67,54.47,56.36,51.61,55.24,56.75,
+54.06,55.12,57.18,55.02,55.77,55.55,57.56,59.65,57.05,57.35,
+55.64,58.98,58.64,57.15,55.00,58.41,58.38,57.38,58.57,59.77,
+60.47,60.25,58.46,56.16,60.67,60.77,59.72,61.78,59.65,60.84,
+59.93,62.18,62.77,61.57,62.90,64.43,62.30,61.43,64.50,63.97,
+62.89,62.58,62.36,62.47,64.18,64.04,63.13,62.58,65.56,61.08,
+64.55,64.80,65.75,63.46,65.41,65.92,66.86,65.77,66.60,65.78,
+64.35,63.96,64.72,64.14,65.44,68.14,68.00,64.22,67.92,66.22,
+66.75,68.88,68.65,66.69,68.39,69.65,67.07,68.33,70.01,69.53,
+72.73,70.54,70.75,74.45,69.85,71.82,70.00,70.14,67.86,69.64,
+70.71,68.83,73.12,74.89,73.66,71.08,73.70,73.45,71.86,71.74,
+74.79,72.10,72.69,72.99,70.83,77.11,69.97,74.12,70.90,72.13,
+72.56,74.86,77.05,78.48,76.58,73.54,72.34,73.58,77.33,74.52,
+75.15,76.99,74.68,73.59,74.61,76.84,72.96,75.48,77.43,75.11,
+77.74,77.36,75.05,75.46,78.01,76.94,78.24,79.56,76.22,79.68,
+82.10,77.40,78.92,77.10,79.26,78.98,79.80,79.52,80.91,78.70,
+78.44,79.37,81.18,80.20,82.56,79.28,78.16,79.57,79.28,78.81,
+14.10,15.04,15.54,17.41,16.71,18.30,18.37,18.59,19.07,20.89,
+20.08,21.35,21.02,21.39,22.27,21.86,22.27,22.72,23.30,24.65,
+25.59,24.79,25.26,26.03,26.98,26.05,27.28,27.70,27.44,28.67,
+28.64,30.27,30.08,30.15,29.63,31.21,29.99,30.39,32.79,30.54,
+32.04,31.99,32.47,33.30,33.17,33.61,33.69,33.62,33.77,34.38,
+33.83,36.87,35.13,34.64,34.99,36.42,36.57,37.08,38.03,37.09,
+37.86,40.44,38.25,39.46,38.24,39.18,37.81,39.41,39.74,39.97,
+40.52,38.73,41.29,42.19,39.34,41.09,40.55,42.31,41.52,42.81,
+42.31,41.69,42.68,43.35,43.86,43.39,42.83,45.29,45.19,42.31,
+47.28,45.67,43.93,47.13,46.39,45.64,45.45,47.03,47.00,45.19,
+47.77,45.85,46.14,46.62,47.85,48.00,48.04,47.25,48.96,50.60,
+47.82,49.34,50.19,47.75,50.20,49.92,51.04,51.04,51.89,52.24,
+51.20,51.83,51.82,51.08,52.27,53.01,52.37,51.88,53.06,52.65,
+53.15,54.31,53.87,52.91,52.45,54.04,52.99,52.79,54.65,55.75,
+53.17,56.58,57.59,55.94,55.01,54.08,53.55,54.66,54.40,58.12,
+55.03,57.22,55.99,58.48,55.56,55.94,57.64,56.35,56.54,57.52,
+58.65,56.79,56.98,60.67,59.22,62.16,59.56,55.97,59.12,62.01,
+61.88,59.95,58.71,58.12,58.65,61.20,63.42,60.76,59.84,60.98,
+61.36,62.77,62.22,61.47,63.79,61.02,61.85,60.35,62.20,65.12,
+61.26,64.28,63.66,64.26,62.54,61.43,64.53,64.68,65.50,63.87,
+64.90,62.25,66.32,65.52,67.02,66.74,65.65,65.17,67.89,66.52,
+66.30,64.58,68.54,65.09,67.38,68.98,67.33,69.61,68.59,66.75,
+66.45,66.21,69.39,66.37,68.52,68.70,69.40,68.11,67.83,71.40,
+71.15,69.99,69.54,68.28,71.82,68.68,71.64,68.02,72.63,70.92,
+75.06,71.69,72.54,75.59,69.16,74.22,70.09,74.15,74.19,74.35,
+71.01,72.47,74.81,71.36,72.66,73.06,73.93,73.32,72.85,71.29,
+70.72,73.56,71.29,71.70,74.67,75.24,75.41,73.54,75.03,73.06,
+76.03,76.47,74.87,75.39,77.07,71.85,76.33,73.23,73.73,77.43,
+79.64,76.87,75.36,77.14,76.87,79.58,79.02,75.84,79.65,78.46,
+13.85,14.82,15.38,16.24,15.99,16.71,17.97,17.83,19.28,18.10,
+19.17,20.05,21.27,21.36,21.93,21.27,22.45,22.95,22.81,23.44,
+23.62,24.15,24.69,24.40,25.15,24.96,25.73,26.65,27.75,27.08,
+28.16,27.54,27.93,28.45,29.14,29.54,29.79,29.65,30.49,30.19,
+30.45,31.90,31.29,31.26,32.02,31.13,32.08,33.29,32.83,31.24,
+35.07,33.34,34.50,33.40,34.17,34.71,33.65,34.63,36.41,36.12,
+33.39,36.84,38.43,35.55,38.00,37.93,36.99,39.01,36.43,37.61,
+37.83,38.70,38.90,39.77,39.46,39.22,40.69,40.69,38.04,38.94,
+40.37,41.38,41.80,42.31,40.80,40.02,42.17,41.00,42.13,43.29,
+42.54,41.91,43.94,45.54,44.02,43.34,43.67,44.23,43.06,44.86,
+45.93,46.31,44.51,46.21,45.29,44.15,43.79,45.67,47.65,46.43,
+46.80,47.70,48.47,47.52,46.98,46.78,46.20,48.77,48.88,48.15,
+48.74,47.60,48.67,49.22,49.88,49.93,49.57,53.15,50.18,50.64,
+51.75,52.75,49.53,51.60,50.31,49.69,51.34,52.69,52.57,50.28,
+51.28,52.78,54.40,50.92,53.02,53.47,52.00,54.31,53.91,54.29,
+52.85,55.74,53.87,56.21,54.90,53.59,54.37,53.44,52.78,55.06,
+55.22,55.32,54.30,57.02,54.96,55.65,55.35,57.25,57.21,56.58,
+55.58,56.71,61.25,58.15,58.17,60.18,56.89,59.61,57.31,57.86,
+60.48,57.74,59.40,59.46,59.42,59.67,58.10,57.80,62.03,59.20,
+62.20,58.38,62.28,60.34,60.73,60.48,61.43,62.10,58.70,62.83,
+59.85,64.18,63.97,59.86,63.63,60.11,62.02,64.13,62.99,61.51,
+63.74,64.09,63.42,64.08,64.62,62.27,64.87,65.73,64.41,63.38,
+66.11,65.73,62.53,65.09,65.63,65.01,66.16,65.97,65.99,68.42,
+62.70,66.66,67.33,65.28,69.64,66.79,67.85,67.41,68.97,66.97,
+68.48,69.16,68.02,69.68,69.53,68.48,68.82,67.51,70.14,67.79,
+68.01,71.32,68.24,67.70,70.34,67.59,68.59,69.18,68.12,69.42,
+69.21,71.34,70.72,72.84,70.94,73.73,69.58,69.99,71.67,72.15,
+71.52,74.88,74.67,72.07,71.06,72.18,69.42,72.95,73.33,74.06,
+71.10,77.31,71.46,73.02,74.52,73.72,73.89,75.65,72.87,72.82,
+11.96,13.97,14.69,15.96,14.85,15.99,16.21,17.50,16.67,17.92,
+18.48,19.02,19.49,19.21,20.69,21.21,20.19,20.60,22.86,21.92,
+21.44,22.97,22.95,23.14,24.05,24.14,25.32,25.17,25.21,25.73,
+26.16,25.93,26.60,27.24,25.57,27.60,26.99,27.56,26.98,27.41,
+29.20,28.32,29.80,29.00,29.35,30.14,30.48,31.25,30.43,30.62,
+31.91,32.09,30.91,32.86,33.37,33.27,34.09,32.09,33.91,33.87,
+33.43,33.40,34.79,34.83,34.16,35.30,33.97,35.58,34.39,36.21,
+36.10,36.81,36.51,37.45,36.89,38.13,37.37,38.16,37.26,38.53,
+38.29,38.84,41.55,40.36,39.82,38.66,42.24,39.77,41.17,39.06,
+38.56,41.79,42.93,41.12,41.85,40.09,41.82,43.00,41.86,42.30,
+43.78,42.64,42.09,43.05,43.89,45.95,42.60,41.98,42.94,43.97,
+44.66,45.81,44.30,45.10,45.95,46.35,45.34,46.72,43.87,45.64,
+47.43,45.03,45.60,46.46,48.60,48.03,49.01,46.50,48.79,47.91,
+47.51,47.86,50.70,46.21,49.28,48.06,49.58,49.11,49.90,49.27,
+48.99,51.08,49.88,51.60,49.77,50.48,50.67,51.54,50.46,50.18,
+51.42,49.41,51.31,52.17,53.05,52.25,51.93,52.44,52.87,54.17,
+54.73,52.62,53.56,52.92,51.96,53.31,53.39,53.34,54.62,54.70,
+54.36,53.19,56.11,56.50,55.95,54.35,54.26,56.57,55.76,55.08,
+55.23,55.61,54.17,56.42,55.93,55.87,54.34,57.21,55.62,57.16,
+55.59,57.98,57.60,57.70,59.18,56.63,58.43,58.86,57.34,59.60,
+57.26,61.44,58.93,58.99,59.33,58.87,60.87,60.94,58.10,60.42,
+60.90,62.57,60.61,57.36,60.22,61.54,59.43,60.23,61.65,62.28,
+62.85,57.93,63.56,61.19,61.32,62.65,64.78,62.30,63.98,63.04,
+61.89,63.36,63.18,65.60,60.93,64.13,61.37,66.07,63.33,65.60,
+60.77,65.92,65.02,66.23,67.40,63.84,64.25,65.18,62.06,63.45,
+67.43,65.80,66.01,65.68,65.07,68.35,62.98,65.73,65.92,66.10,
+66.01,61.72,66.30,65.04,69.78,68.05,68.04,67.22,66.25,65.26,
+68.14,70.03,68.95,67.76,67.29,69.30,67.68,68.79,66.26,70.92,
+68.94,69.45,67.61,69.17,68.51,68.85,69.25,72.37,72.23,71.40,
+12.20,13.09,13.17,14.04,14.18,15.35,15.29,15.81,16.55,16.56,
+17.14,18.61,19.04,18.97,18.32,19.43,20.09,20.03,20.52,20.82,
+21.22,20.79,21.45,21.63,23.09,22.19,22.23,23.90,23.91,23.50,
+23.22,25.61,24.08,25.32,25.00,26.53,27.65,26.29,25.59,27.93,
+26.33,27.41,27.59,29.03,28.37,27.42,29.52,30.31,28.60,30.26,
+30.51,29.93,29.58,31.57,30.72,31.94,30.97,31.84,32.77,31.46,
+32.18,32.36,30.90,32.39,33.98,33.99,33.28,33.40,33.90,34.97,
+33.78,33.88,35.28,34.76,34.82,34.74,36.10,34.86,37.74,37.23,
+36.40,37.16,38.01,36.65,37.38,36.02,36.60,36.99,38.83,37.39,
+38.97,37.18,37.06,39.30,39.21,39.31,40.16,38.35,40.18,38.57,
+39.76,39.68,40.78,38.62,39.62,42.25,42.05,41.34,39.95,42.24,
+40.58,43.11,41.65,44.00,41.79,41.61,43.83,42.98,45.20,43.60,
+42.38,42.84,44.66,43.00,45.73,45.12,45.55,44.93,46.27,44.11,
+45.77,45.71,45.15,46.81,45.40,47.08,45.77,48.18,46.28,44.32,
+47.99,44.97,45.89,47.53,45.73,46.61,47.05,47.27,46.26,49.93,
+48.02,46.31,49.83,50.33,49.49,49.12,49.22,49.79,49.17,49.25,
+49.08,50.53,48.63,50.97,50.29,48.89,53.38,49.07,50.17,53.50,
+51.50,50.81,53.55,52.90,52.30,50.80,51.67,52.74,53.30,51.97,
+51.71,54.23,54.40,56.02,55.61,56.51,54.64,56.28,51.55,53.04,
+54.45,53.57,53.99,53.34,55.33,56.13,56.38,56.88,56.76,57.52,
+56.08,53.89,56.21,55.76,56.68,55.12,57.36,55.43,56.70,57.23,
+56.19,58.21,56.77,58.72,57.63,57.06,58.84,57.75,56.57,53.84,
+55.98,55.08,58.59,58.47,56.66,57.33,57.59,59.10,60.28,58.81,
+59.92,58.92,60.14,60.40,60.11,60.33,62.04,61.43,60.14,60.39,
+59.21,61.41,63.17,62.09,59.72,62.48,61.92,60.54,61.67,60.63,
+61.13,60.12,63.21,66.01,62.77,64.66,61.61,62.44,64.95,61.29,
+64.76,63.63,61.58,62.95,63.87,67.22,64.46,62.26,63.88,62.00,
+66.31,65.28,66.16,65.95,65.94,65.70,65.72,64.62,67.01,63.89,
+66.01,64.01,65.21,67.68,64.08,65.41,64.50,65.65,67.37,65.60,
+12.36,12.11,12.83,13.30,14.36,14.66,15.22,14.94,15.78,16.14,
+15.88,16.55,16.77,17.62,17.66,18.84,18.42,18.54,18.89,20.04,
+19.72,20.14,20.08,20.03,20.75,20.94,22.20,22.37,22.93,22.70,
+22.49,23.37,23.54,23.86,23.74,24.05,24.49,24.87,25.65,23.94,
+25.21,26.50,25.98,26.65,25.97,27.19,26.98,27.54,27.89,27.61,
+26.77,27.92,28.16,29.31,29.62,28.93,28.98,29.19,30.24,30.66,
+30.75,31.73,30.58,31.37,31.71,30.59,32.36,31.35,31.70,31.55,
+31.37,30.33,32.35,32.60,32.05,33.00,33.73,32.72,32.78,33.05,
+33.92,35.88,35.74,34.31,33.93,34.82,36.18,35.66,36.42,36.73,
+36.30,35.00,36.10,36.06,37.90,39.00,37.01,37.87,37.63,37.63,
+37.22,38.44,38.04,39.87,39.17,40.19,39.09,40.90,39.20,40.56,
+39.13,39.81,41.31,40.32,41.35,40.56,40.28,42.46,41.67,40.51,
+41.35,40.06,40.64,43.48,40.05,42.55,41.80,41.41,42.42,45.03,
+42.94,44.99,43.05,43.40,42.35,44.40,42.28,45.15,43.08,43.51,
+44.58,44.19,45.75,45.18,46.44,46.17,46.38,45.09,45.66,44.43,
+45.74,45.96,45.61,45.17,47.05,45.63,45.58,46.13,47.61,49.05,
+48.75,47.98,47.14,46.74,48.76,46.89,47.51,49.30,48.71,47.79,
+47.70,46.61,49.13,47.31,48.95,48.29,50.33,50.49,49.46,50.56,
+51.07,52.48,50.38,49.91,50.38,51.08,50.63,49.76,49.88,50.53,
+51.28,48.47,51.87,51.27,51.68,53.28,52.65,51.23,51.40,51.32,
+51.95,52.14,51.15,52.76,55.33,54.38,53.78,52.65,53.13,53.15,
+54.65,54.31,52.78,52.52,52.36,53.96,53.73,55.18,55.18,54.38,
+52.35,54.07,54.35,54.23,56.31,54.74,55.40,54.69,56.20,57.85,
+58.50,56.25,58.77,56.92,55.33,60.12,56.41,54.24,57.95,58.77,
+59.46,56.68,59.04,56.74,59.52,62.28,61.49,59.28,57.75,57.94,
+57.21,58.59,57.21,60.73,60.00,59.06,58.34,58.20,57.86,59.27,
+59.81,57.87,59.26,57.78,56.61,58.43,60.71,60.08,59.20,60.41,
+58.63,59.71,63.12,60.43,60.32,62.07,61.73,59.97,59.84,63.30,
+61.51,60.80,64.08,61.88,63.37,63.03,60.94,63.18,62.30,60.45,
+18.19,19.53,19.51,20.50,20.29,20.86,22.27,22.19,24.00,24.85,
+24.54,25.84,26.60,26.37,27.25,27.67,28.27,28.98,28.78,28.34,
+29.95,30.34,29.83,30.39,31.89,32.31,33.50,33.35,34.60,34.22,
+34.02,36.24,36.29,36.09,36.48,35.36,36.47,39.17,37.12,37.93,
+38.81,38.38,39.56,38.01,40.55,39.02,40.54,40.23,40.26,41.48,
+42.56,41.68,41.49,42.10,43.12,43.99,44.05,45.21,45.23,44.47,
+44.69,45.15,45.28,45.96,47.42,47.78,47.02,48.12,49.92,48.26,
+48.25,49.92,49.10,49.15,49.44,51.19,52.29,51.79,50.43,50.38,
+52.13,52.66,53.51,51.73,51.40,50.51,52.38,53.30,53.19,53.13,
+52.52,53.12,54.84,55.66,55.91,55.52,55.28,57.67,54.68,57.62,
+56.47,58.27,57.00,57.28,57.89,57.97,56.74,58.51,56.74,57.95,
+58.88,57.10,60.80,58.26,58.49,62.15,62.03,61.03,60.79,59.55,
+60.47,60.99,59.48,61.48,63.56,61.80,63.96,60.67,63.52,63.10,
+64.26,65.24,64.96,64.95,66.19,65.06,64.96,63.94,67.21,63.54,
+66.47,65.49,64.63,66.79,63.89,69.20,68.16,67.65,67.28,67.89,
+67.23,69.04,69.09,66.24,67.56,67.84,67.68,72.09,70.32,68.47,
+69.15,73.46,71.06,73.01,68.05,67.95,72.67,70.72,70.93,72.41,
+70.43,70.89,72.99,72.09,74.82,73.83,70.91,75.31,73.64,74.94,
+74.42,74.60,75.32,73.10,73.37,75.25,71.96,75.73,79.09,75.59,
+72.98,75.39,77.33,78.82,73.88,78.48,79.01,73.21,78.91,75.90,
+76.40,78.42,78.59,79.72,77.83,82.03,79.96,79.72,79.38,83.00,
+82.03,80.53,82.87,79.52,81.38,82.36,82.01,80.83,83.80,84.88,
+80.89,81.79,82.68,81.09,81.74,81.55,83.78,85.75,83.03,85.68,
+81.99,86.95,85.14,80.51,85.48,85.65,82.64,83.36,86.46,82.88,
+82.71,86.86,81.46,84.15,88.71,85.19,87.15,87.06,84.58,84.12,
+82.40,83.58,88.58,85.02,87.59,90.01,88.12,88.84,87.22,87.02,
+88.11,91.88,85.07,89.89,89.59,87.38,90.01,86.77,88.21,89.41,
+88.83,90.74,88.11,89.51,93.42,87.75,96.42,89.75,88.61,89.56,
+90.68,90.88,91.27,90.77,92.05,92.35,93.57,96.86,89.28,91.46,
+17.64,18.90,19.29,20.91,22.49,22.19,22.52,24.36,25.44,24.80,
+25.31,26.62,25.95,26.45,27.41,27.48,28.29,29.51,29.11,29.18,
+31.16,31.38,32.94,33.22,33.48,34.06,34.33,34.19,35.30,36.27,
+34.62,36.20,36.58,36.56,38.10,39.05,38.55,37.25,39.52,36.40,
+39.32,40.74,40.67,39.93,40.94,41.40,40.53,40.72,43.22,43.10,
+42.11,42.29,43.65,46.73,42.86,45.75,45.09,45.09,46.44,46.73,
+46.57,47.03,47.48,47.16,47.79,46.20,48.19,50.22,50.10,48.01,
+48.64,50.14,49.29,51.07,50.82,50.76,51.70,51.90,51.59,51.75,
+52.42,53.73,53.93,54.32,53.00,56.76,55.39,56.45,55.20,55.35,
+56.56,55.66,56.94,54.78,57.56,57.77,57.43,58.02,58.16,59.02,
+59.38,57.06,60.49,59.11,60.07,58.62,60.56,59.77,61.35,60.92,
+61.86,61.81,61.59,64.01,64.74,61.12,61.89,63.58,62.58,63.53,
+64.48,63.75,63.45,64.27,65.30,62.59,64.27,65.39,66.77,64.67,
+67.75,66.03,66.53,67.11,63.87,66.04,71.22,67.24,66.55,68.48,
+67.94,67.58,73.10,70.72,67.69,68.85,68.83,69.03,69.97,70.43,
+68.82,71.59,68.52,69.40,70.33,71.16,72.21,71.64,71.08,71.73,
+74.93,74.26,72.41,71.30,73.32,70.72,72.52,73.34,72.30,72.42,
+75.01,72.73,74.70,76.01,76.69,71.98,72.32,75.47,76.42,76.96,
+76.13,77.87,74.49,79.76,75.89,76.95,77.81,77.19,78.74,76.46,
+80.82,77.19,78.39,77.54,79.35,78.63,82.78,80.56,78.59,79.04,
+80.47,80.67,79.23,79.96,80.78,83.98,86.27,82.17,81.62,86.34,
+78.81,83.27,80.50,82.31,81.51,81.02,84.37,82.22,86.06,84.68,
+84.93,86.01,85.93,83.71,86.77,85.44,85.65,86.07,85.80,89.21,
+83.83,85.06,83.88,85.58,87.42,91.21,84.27,84.14,86.21,86.65,
+86.11,86.01,92.27,89.24,88.03,91.77,87.06,87.22,91.78,86.51,
+90.34,90.25,90.97,91.71,92.08,89.15,90.59,88.44,90.14,93.73,
+91.10,92.87,91.68,90.63,92.71,93.68,91.06,89.16,89.76,96.00,
+91.77,95.88,97.11,93.90,96.38,95.33,95.38,94.60,90.62,93.56,
+98.67,97.57,92.91,93.75,95.12,93.36,93.36,95.52,93.00,96.38,
+17.90,20.24,21.12,20.87,21.21,23.05,24.29,24.19,25.67,26.62,
+24.82,26.75,27.42,27.98,27.54,29.20,30.06,29.32,30.53,31.29,
+31.06,32.04,33.14,33.04,33.17,34.20,34.66,35.10,34.83,35.81,
+35.53,38.17,36.61,36.76,38.80,37.07,38.50,38.42,39.18,40.85,
+39.69,40.26,41.00,41.88,41.40,41.98,43.91,42.67,43.52,43.43,
+42.87,42.72,43.08,45.39,45.33,45.71,47.10,45.38,45.91,45.70,
+47.93,46.39,47.34,48.50,49.04,49.38,48.92,49.89,50.14,50.71,
+48.12,51.91,51.09,51.74,51.82,52.31,53.83,51.52,51.84,53.12,
+54.69,52.57,54.68,53.60,54.67,56.54,56.85,55.02,54.55,56.52,
+57.04,56.75,55.96,57.23,56.73,56.06,60.10,60.20,58.22,62.02,
+61.17,60.10,59.69,58.84,59.89,62.72,62.29,63.26,61.54,62.77,
+61.84,63.36,63.70,61.75,63.12,61.74,65.53,63.04,63.58,63.59,
+63.60,64.64,63.71,65.50,66.50,64.69,66.26,67.06,65.75,66.02,
+66.53,69.18,66.53,66.58,67.86,69.23,68.05,69.41,68.58,67.42,
+68.50,67.58,68.50,67.56,68.53,72.64,71.14,71.23,68.50,72.72,
+71.72,74.86,73.29,70.15,73.44,72.73,72.28,71.59,72.88,73.38,
+72.59,75.58,74.06,75.28,74.14,74.69,78.10,77.45,77.40,75.83,
+77.97,74.83,75.99,76.79,77.47,78.25,75.96,79.13,80.62,79.25,
+80.71,78.27,78.18,78.91,79.63,80.68,79.92,77.94,77.57,77.33,
+79.35,80.35,81.72,78.48,78.50,83.31,83.16,81.76,83.52,84.83,
+82.39,83.24,81.96,82.13,82.04,80.46,82.13,81.38,80.04,80.20,
+81.47,82.78,86.06,86.14,85.05,84.37,83.90,84.22,84.53,84.17,
+90.17,86.17,84.03,87.17,85.40,86.40,86.71,86.18,83.17,86.98,
+87.17,83.63,86.86,87.72,91.41,89.47,88.66,89.58,88.40,85.93,
+84.83,89.38,89.39,87.13,92.57,90.35,88.96,90.44,91.70,91.10,
+86.58,89.66,94.76,89.78,90.45,94.36,88.05,90.96,94.03,94.16,
+93.25,96.31,90.62,93.98,94.09,93.69,89.87,88.07,96.82,97.75,
+89.94,93.91,94.82,94.15,95.02,92.34,94.24,98.75,91.95,99.09,
+99.44,99.25,93.68,95.61,94.75,94.25,98.27,93.69,97.02,102.31,
+19.00,19.49,20.11,21.27,21.76,22.71,23.18,23.54,25.82,25.11,
+26.00,26.95,27.57,27.55,27.99,29.04,29.66,30.63,30.39,32.45,
+32.80,32.49,32.64,34.73,33.59,33.29,34.63,36.14,33.92,37.49,
+35.20,37.86,36.23,36.51,37.42,38.90,39.25,38.76,39.67,39.92,
+38.20,41.38,41.48,41.55,43.67,42.39,42.11,41.85,44.17,43.04,
+45.23,44.64,45.38,46.16,46.61,47.07,48.35,45.87,47.43,45.99,
+48.86,48.94,48.19,48.94,49.25,48.31,51.10,51.36,52.30,50.36,
+50.86,51.35,52.84,52.67,51.37,54.79,53.45,52.59,55.11,57.98,
+54.64,52.32,55.49,56.40,57.68,55.29,55.86,56.00,55.17,56.67,
+56.07,58.67,57.29,57.14,59.80,57.41,58.81,58.03,58.14,60.65,
+60.84,58.13,59.30,60.41,58.19,61.31,59.17,61.65,63.08,62.02,
+62.65,63.38,61.64,63.02,64.86,61.80,65.32,64.91,67.81,66.14,
+65.47,66.26,68.21,66.37,65.92,67.91,65.58,65.38,65.25,68.58,
+66.33,67.24,67.75,70.73,70.19,69.90,67.80,69.29,69.56,70.35,
+71.04,74.08,71.60,70.60,71.49,72.41,71.23,76.28,72.34,71.06,
+72.16,71.43,75.37,72.04,73.29,74.14,72.98,72.25,75.73,74.79,
+74.65,75.72,77.09,76.25,77.36,76.60,73.34,73.64,77.77,76.54,
+78.48,75.83,79.05,80.31,76.29,74.55,75.77,77.23,78.33,76.90,
+79.06,79.02,76.90,82.13,78.08,78.79,78.27,78.86,76.55,81.28,
+80.67,77.58,78.52,80.65,82.43,80.19,78.24,80.83,84.48,82.14,
+78.03,80.04,84.03,80.02,84.37,85.18,84.30,84.21,82.82,88.25,
+84.09,84.74,85.56,84.19,87.74,85.51,87.85,84.01,84.36,86.24,
+89.09,85.26,85.37,88.54,94.44,87.20,86.57,87.73,90.61,86.77,
+87.84,87.20,91.50,86.79,91.70,88.43,88.19,90.61,90.07,92.21,
+90.58,90.84,89.82,87.86,94.41,89.53,90.00,93.07,92.29,92.68,
+95.30,92.26,92.30,92.47,93.47,92.18,92.88,89.87,94.66,95.07,
+97.46,97.06,93.81,94.56,92.24,96.85,96.09,96.85,95.91,94.44,
+96.84,98.00,91.38,98.73,95.72,97.59,97.31,97.97,98.36,96.54,
+95.02,102.06,90.31,96.64,102.39,98.92,105.10,97.62,96.72,100.54,
+18.56,19.36,20.84,20.98,23.07,22.43,23.12,24.71,25.48,25.02,
+25.54,26.33,27.98,29.36,27.32,29.05,29.69,29.96,30.02,32.58,
+31.66,32.95,33.02,32.60,34.52,34.10,34.66,35.58,35.57,35.11,
+35.11,36.21,36.99,36.94,38.10,38.01,38.87,39.14,38.49,39.43,
+39.73,40.19,41.28,40.01,42.53,40.36,42.61,43.69,44.16,42.97,
+43.69,44.88,44.56,44.06,44.30,45.02,45.30,48.74,48.77,48.46,
+48.51,48.57,49.47,48.24,50.74,49.83,49.16,47.99,50.09,50.28,
+49.71,50.67,52.91,51.85,53.53,52.24,50.98,54.08,53.08,53.62,
+53.81,55.04,53.02,54.49,54.78,54.89,58.07,55.73,58.45,55.24,
+56.74,56.46,58.21,59.34,58.08,57.31,55.93,57.65,57.38,56.69,
+59.20,59.95,58.47,60.28,59.96,62.84,60.66,62.97,61.01,61.86,
+62.65,63.16,61.09,61.41,62.19,63.14,63.40,66.59,62.47,66.19,
+61.67,68.53,62.70,64.98,67.41,68.32,68.85,68.88,67.68,66.63,
+67.76,65.49,68.79,68.03,68.22,66.79,69.35,68.07,66.52,69.98,
+70.95,68.28,71.47,72.19,69.40,69.84,71.97,67.47,71.22,73.67,
+73.93,73.62,73.43,73.55,71.31,75.27,71.31,76.46,74.90,72.95,
+72.67,74.31,75.88,70.91,71.88,71.73,75.36,80.42,81.63,76.61,
+77.66,73.70,76.95,77.13,74.90,77.94,79.24,74.59,75.91,79.37,
+77.92,79.35,76.61,79.57,78.95,77.23,78.35,78.22,82.58,81.29,
+82.21,84.58,78.68,81.94,79.63,82.56,83.10,82.15,82.73,82.64,
+82.21,81.94,83.16,85.78,81.56,83.86,81.59,87.63,86.79,84.43,
+83.70,85.14,84.47,85.10,83.56,82.14,85.87,85.30,84.46,87.81,
+88.29,87.11,87.27,88.81,83.24,88.85,88.66,86.23,90.33,86.13,
+87.71,89.17,88.39,88.68,89.40,82.05,90.33,89.33,87.72,91.20,
+90.01,88.98,92.52,92.74,88.61,89.46,90.73,88.50,87.25,94.02,
+89.84,92.05,92.31,92.19,91.82,96.49,95.33,94.46,94.92,93.73,
+96.94,97.05,92.17,93.02,90.20,92.02,97.04,93.95,90.19,95.43,
+97.82,94.48,97.06,95.29,94.32,96.10,96.19,96.73,96.16,98.90,
+94.56,98.30,100.22,99.47,95.22,98.14,98.28,101.23,91.13,96.60,
+18.96,19.47,20.10,20.71,21.94,22.58,23.47,24.37,24.48,24.57,
+25.55,25.57,27.45,27.02,28.02,28.80,28.46,29.29,30.29,30.85,
+31.11,32.62,32.71,33.49,32.90,34.47,33.91,33.24,36.88,36.96,
+35.73,36.44,35.97,38.14,37.90,38.89,38.63,38.50,39.88,39.97,
+40.27,40.56,40.99,42.12,40.96,40.05,42.71,43.81,42.60,44.89,
+43.65,44.19,44.77,45.68,44.88,44.37,45.57,46.53,47.05,45.66,
+48.02,46.31,46.86,49.64,49.28,47.97,49.37,50.66,49.18,49.09,
+51.85,50.77,52.85,52.14,50.70,52.24,52.58,51.86,54.17,53.12,
+52.68,52.36,55.27,53.69,54.98,53.15,55.95,56.13,57.54,56.15,
+57.31,53.39,57.25,58.42,57.88,58.99,57.64,59.23,60.56,58.17,
+59.05,60.68,58.68,61.69,59.14,60.31,63.18,62.18,61.82,58.87,
+61.40,62.16,62.74,63.74,64.85,61.67,62.08,61.93,63.61,64.21,
+66.37,66.03,63.99,64.89,64.96,66.25,66.48,66.60,65.21,66.08,
+66.73,68.64,67.04,69.69,67.85,67.25,66.78,69.27,66.01,66.64,
+69.12,68.88,70.12,71.34,71.15,70.57,69.45,71.67,70.43,68.63,
+70.24,73.46,71.90,71.63,71.43,69.27,72.77,74.99,72.18,73.34,
+74.78,73.05,76.49,73.56,76.49,76.78,74.29,73.83,75.39,75.90,
+75.15,76.19,76.24,75.89,81.35,76.49,77.96,78.87,76.52,77.31,
+77.09,76.36,76.98,78.19,78.48,77.09,78.61,79.67,78.21,80.01,
+77.87,78.05,80.59,78.36,79.58,77.46,82.48,81.86,80.45,79.44,
+82.17,82.48,79.38,81.04,85.09,84.31,79.28,85.18,86.76,82.39,
+84.27,82.16,83.99,86.80,84.47,85.86,85.93,84.57,80.76,86.11,
+83.94,87.06,86.18,86.60,87.20,85.79,87.85,88.89,87.20,91.69,
+89.53,86.89,86.70,84.93,88.93,85.11,91.28,89.99,88.94,87.59,
+88.58,89.94,87.32,88.28,90.19,93.80,87.06,90.92,89.36,91.03,
+92.15,90.89,88.98,93.35,92.43,95.39,93.44,95.48,91.85,92.18,
+89.58,95.16,91.64,93.09,90.96,94.14,93.73,93.39,91.36,91.84,
+94.49,94.95,94.70,93.04,95.81,95.81,94.91,99.52,93.37,95.99,
+96.07,101.56,97.79,97.68,97.10,95.32,94.35,92.89,99.71,99.77,
+18.47,19.53,19.27,21.04,21.00,21.84,22.49,23.67,23.67,24.24,
+25.37,24.87,25.67,27.05,27.76,29.07,27.91,30.00,29.06,30.68,
+31.55,31.05,31.67,33.72,33.55,33.84,34.55,33.21,35.06,33.08,
+34.73,36.99,35.88,36.02,37.29,37.44,37.67,37.67,38.21,39.65,
+38.77,38.98,40.34,41.63,41.00,40.31,41.49,42.01,41.22,45.10,
+41.56,44.10,43.86,42.82,42.51,45.22,45.99,44.32,47.77,47.58,
+47.11,48.26,48.70,46.38,47.11,47.18,48.43,50.42,47.94,49.42,
+48.11,50.14,50.81,51.64,49.58,49.06,51.31,51.68,50.26,52.53,
+54.71,53.44,52.59,54.20,56.53,57.14,54.82,54.10,56.34,53.82,
+55.62,55.34,57.43,55.21,54.88,55.78,57.94,56.19,57.39,59.92,
+58.05,58.66,59.36,58.78,61.12,60.37,59.29,59.32,59.19,61.15,
+59.23,59.32,63.48,61.25,63.51,63.09,62.38,63.22,60.56,63.70,
+62.71,63.85,65.46,66.44,63.69,65.11,64.77,64.74,66.65,66.82,
+66.00,68.35,65.27,64.11,65.93,66.06,67.15,67.36,66.85,68.07,
+67.72,69.81,67.67,67.55,67.34,68.05,69.10,67.88,71.42,70.57,
+70.11,74.07,71.90,68.97,69.77,71.94,72.64,73.73,71.72,73.34,
+73.28,75.63,72.28,73.73,74.25,74.49,71.46,74.09,74.19,74.78,
+75.51,76.05,75.78,74.87,71.62,77.93,74.90,75.19,76.08,76.43,
+77.43,78.90,75.53,78.31,77.53,80.56,75.55,77.65,78.03,75.98,
+79.90,75.97,77.27,82.17,81.29,77.23,79.73,79.21,80.09,80.13,
+80.57,82.42,79.58,78.96,81.89,79.75,80.17,82.60,84.07,85.36,
+84.63,82.06,82.70,83.72,83.16,84.26,80.88,85.85,80.90,84.88,
+84.18,84.85,83.64,84.89,83.02,81.36,84.52,87.80,84.71,88.10,
+85.45,83.43,87.32,88.63,84.35,84.79,87.28,84.98,87.34,84.34,
+88.12,87.12,91.24,85.86,83.88,90.39,90.86,90.60,90.70,89.84,
+90.75,91.05,89.53,90.36,90.32,94.33,90.88,94.13,89.06,89.18,
+92.87,88.60,93.82,89.12,93.58,97.67,92.24,92.78,92.83,93.86,
+91.84,93.78,92.57,94.46,92.08,90.54,93.96,91.69,93.95,93.01,
+94.47,96.30,94.25,93.08,100.35,95.78,98.05,96.44,97.89,97.59,
+17.76,19.01,19.23,19.86,20.04,21.88,21.59,23.20,23.86,24.52,
+24.31,24.54,25.88,25.78,26.74,27.34,27.24,28.19,28.38,30.18,
+29.62,30.09,30.80,31.99,32.16,32.52,34.06,33.85,33.58,34.54,
+35.06,34.64,33.52,36.33,36.92,35.71,36.07,36.68,37.70,39.00,
+38.87,39.59,40.30,40.16,39.71,39.86,41.52,41.34,41.97,42.56,
+41.89,43.69,44.84,42.80,44.83,43.04,43.21,45.02,43.88,44.77,
+42.90,45.30,46.66,45.59,47.80,48.26,46.92,46.40,47.28,50.30,
+47.84,47.89,50.53,49.47,52.08,47.18,51.44,51.41,50.67,50.65,
+51.86,52.22,51.54,52.57,53.78,52.76,55.57,52.28,52.06,52.77,
+54.07,55.46,57.47,53.07,55.83,52.96,54.81,53.74,57.39,55.96,
+57.13,59.06,57.62,57.09,59.82,58.49,57.14,59.72,60.47,58.45,
+61.47,61.69,60.10,62.33,59.28,59.14,59.97,58.75,61.33,61.96,
+61.53,61.83,62.78,64.22,61.89,60.99,62.35,64.34,66.38,62.62,
+63.24,65.77,64.09,67.26,65.43,65.74,66.29,66.68,66.02,67.54,
+63.70,65.85,67.49,67.39,64.44,66.52,66.61,69.24,67.58,66.38,
+66.68,67.66,70.06,69.76,70.62,69.34,73.45,69.36,71.64,69.53,
+70.79,72.31,71.89,71.81,73.05,71.93,68.43,73.43,73.14,72.16,
+71.87,70.97,77.66,73.40,71.14,69.54,76.66,75.65,73.68,75.23,
+76.41,73.42,74.13,72.55,75.06,77.23,77.75,78.82,73.82,74.32,
+75.59,77.13,76.37,77.81,76.27,76.00,77.42,78.47,76.15,75.17,
+78.71,78.57,78.31,80.91,76.52,77.24,78.33,78.14,80.53,82.36,
+80.43,80.79,77.44,76.64,81.34,79.77,81.91,80.50,78.44,81.70,
+80.13,80.05,83.61,82.95,81.26,80.77,84.25,79.91,85.54,87.44,
+83.28,84.46,83.12,86.17,86.10,85.88,85.99,86.14,84.87,83.26,
+85.84,88.14,86.76,87.23,85.49,88.10,86.69,86.22,88.98,85.73,
+86.15,85.55,87.98,86.61,87.83,87.84,87.88,85.97,91.35,85.23,
+88.81,88.42,88.40,88.08,89.70,91.76,86.76,90.87,90.82,91.91,
+90.77,93.71,91.26,91.97,92.61,87.11,92.43,93.18,91.90,91.98,
+92.84,92.90,91.39,89.03,96.78,90.10,92.07,91.89,89.92,92.69,
+17.40,17.73,17.93,19.26,19.75,21.05,21.51,22.13,23.36,23.97,
+23.59,25.30,25.27,26.00,27.40,27.47,27.77,27.04,28.08,28.45,
+30.36,29.15,30.17,29.48,31.07,32.29,32.18,31.85,33.27,31.59,
+34.10,35.28,34.31,34.03,33.64,35.61,36.76,36.62,37.80,38.74,
+37.17,36.87,36.13,37.69,38.87,37.57,39.22,39.83,40.14,40.99,
+41.49,40.67,41.61,42.13,42.97,43.99,42.04,44.14,43.53,44.89,
+43.33,43.79,44.44,46.00,46.04,44.82,45.96,46.72,46.53,46.43,
+47.76,45.92,47.22,47.88,48.97,48.10,49.40,47.93,49.49,48.22,
+49.86,49.66,48.90,49.27,51.63,51.14,50.78,52.97,52.64,51.21,
+52.54,52.91,51.43,53.59,54.83,55.13,52.48,53.68,54.04,54.21,
+54.18,55.78,57.10,55.32,57.64,57.89,56.76,55.21,55.36,56.95,
+59.72,57.08,57.76,56.18,59.56,60.98,60.27,57.87,57.80,59.32,
+59.95,58.52,63.43,60.85,60.29,62.77,56.51,60.63,63.62,60.95,
+62.17,62.36,64.47,61.38,65.64,64.13,62.57,63.09,65.31,62.66,
+66.78,64.84,64.38,63.53,66.78,66.95,67.72,66.17,64.83,66.07,
+69.72,66.02,67.13,67.12,65.82,66.94,66.65,65.86,66.00,68.90,
+67.06,67.58,67.50,70.76,70.55,69.06,67.73,69.98,69.58,66.86,
+68.26,69.82,70.37,73.53,69.66,71.83,72.04,70.79,71.23,72.22,
+74.01,71.27,71.16,73.98,74.51,71.02,76.03,72.13,73.23,73.75,
+73.67,76.08,77.54,73.56,76.29,74.24,75.63,74.69,76.94,74.14,
+73.79,77.50,81.55,77.49,75.46,76.60,77.75,75.10,77.52,78.36,
+81.01,78.27,78.12,76.27,80.11,76.35,80.68,80.92,81.15,80.13,
+81.96,77.71,77.44,81.98,81.41,78.89,80.39,82.89,81.00,81.72,
+82.56,80.97,77.79,80.03,78.06,77.45,80.96,80.03,84.17,82.96,
+83.74,86.85,83.96,82.97,79.84,83.56,81.80,81.99,83.85,80.40,
+86.19,86.92,83.95,84.96,84.20,84.23,83.26,86.32,85.71,88.06,
+91.80,84.05,89.82,82.92,87.38,85.84,88.92,90.93,89.34,84.46,
+91.05,87.09,89.14,89.38,88.23,90.75,85.91,88.24,90.66,92.75,
+88.59,91.05,92.17,92.34,94.96,92.35,87.53,90.13,91.85,91.42,
+16.69,17.08,18.44,18.27,19.30,20.61,21.83,21.37,22.21,22.94,
+23.99,23.58,24.96,24.85,24.14,24.82,26.26,26.68,26.80,28.61,
+28.40,28.75,28.97,29.48,30.20,29.80,31.76,30.88,31.16,31.96,
+32.54,32.68,33.28,34.64,33.18,34.45,34.67,34.88,35.25,35.66,
+36.00,37.88,36.06,36.22,37.30,38.41,38.66,37.85,39.15,38.86,
+39.28,38.62,41.17,39.62,39.93,40.32,40.90,43.03,43.11,42.08,
+42.29,44.21,44.65,44.01,46.67,44.65,44.31,44.12,44.34,45.72,
+45.24,47.65,45.77,45.91,46.59,46.80,47.04,46.18,47.16,49.78,
+49.94,49.95,49.17,48.26,49.81,49.83,48.77,51.26,49.78,49.56,
+50.81,50.82,52.13,52.89,51.51,51.56,51.10,52.23,53.30,53.26,
+55.27,53.00,54.31,53.57,53.60,53.61,55.19,57.42,52.96,54.85,
+56.45,55.47,53.09,58.25,58.67,55.30,57.76,56.45,60.32,57.40,
+57.57,58.28,59.52,59.00,56.91,58.38,59.40,59.77,60.30,60.35,
+61.04,60.79,60.76,61.45,62.24,61.00,65.29,61.68,62.90,61.71,
+60.75,63.37,62.80,61.02,63.44,65.66,63.28,67.82,63.35,63.17,
+63.36,61.52,64.51,63.80,65.53,64.91,63.80,66.21,65.85,68.45,
+63.42,65.54,66.70,66.44,66.92,67.81,68.13,68.74,66.83,70.21,
+68.85,70.25,66.70,65.58,67.02,68.94,71.45,67.92,70.41,68.81,
+70.67,69.29,70.88,70.82,72.05,68.13,69.71,72.47,71.45,69.77,
+70.95,73.83,73.01,72.80,71.83,72.47,70.20,77.32,74.60,78.08,
+74.50,72.46,72.71,78.06,75.66,70.23,71.02,77.68,75.12,75.16,
+72.94,77.17,75.37,75.86,74.84,78.26,74.38,76.42,78.35,74.93,
+76.53,74.19,76.19,76.36,76.50,72.95,78.39,79.09,80.75,80.45,
+80.71,80.58,76.92,77.76,79.40,78.01,82.80,79.45,81.47,78.90,
+80.16,81.11,79.81,82.66,80.03,81.27,82.25,82.75,82.89,80.00,
+83.37,82.80,83.87,82.52,80.12,80.31,82.83,85.90,81.90,81.95,
+82.43,84.00,84.91,84.51,85.85,81.45,84.66,85.06,86.12,82.09,
+82.72,85.22,86.92,82.84,85.58,88.61,83.71,85.65,85.51,86.32,
+89.38,85.86,87.35,89.00,88.61,87.49,87.97,87.21,85.73,88.03,
+16.41,16.39,18.00,18.58,18.58,19.02,19.93,21.04,22.43,21.59,
+21.59,23.95,23.18,23.23,24.09,25.23,25.69,26.74,26.43,26.73,
+27.92,27.56,27.57,27.36,29.51,29.60,28.65,30.43,30.24,30.38,
+31.30,32.23,31.44,32.95,32.68,33.67,33.26,33.51,33.78,35.59,
+35.59,33.81,34.88,36.67,37.13,37.32,37.39,38.93,37.82,38.71,
+36.46,38.01,37.67,36.77,39.24,40.31,40.75,40.94,40.07,38.52,
+41.85,42.18,41.40,41.66,40.50,43.52,43.30,41.76,41.68,43.40,
+42.46,43.51,45.90,45.14,46.38,45.57,47.24,45.50,47.09,45.51,
+48.54,45.39,46.23,47.40,47.19,47.85,48.79,49.12,48.92,49.12,
+49.59,50.48,49.19,50.95,50.28,49.23,50.86,52.01,54.90,52.26,
+50.81,53.00,52.81,54.23,51.74,53.01,52.94,54.48,55.29,53.59,
+55.15,53.75,52.61,54.82,53.60,54.91,54.26,54.16,55.72,56.74,
+56.13,55.78,56.94,58.46,55.46,56.11,56.43,55.86,58.04,59.75,
+55.54,56.64,57.40,59.74,59.00,60.58,60.78,59.39,58.83,58.83,
+59.12,61.86,60.99,58.94,64.37,62.78,61.19,62.86,61.71,62.72,
+63.82,62.93,60.40,62.31,62.27,62.84,61.36,64.79,64.25,63.20,
+63.03,63.02,64.35,63.70,63.65,63.93,63.45,67.64,64.88,68.32,
+66.08,64.67,67.37,66.25,67.01,67.05,65.63,67.61,66.98,66.48,
+68.60,71.70,68.60,70.79,65.72,65.78,65.48,70.12,65.31,70.19,
+69.17,69.89,70.38,70.97,69.76,69.54,70.10,71.33,72.36,71.70,
+69.30,70.67,70.80,70.98,67.75,70.00,69.57,75.03,70.49,72.85,
+71.03,72.28,71.71,74.62,77.21,73.41,73.23,75.33,75.35,75.52,
+75.34,72.36,70.88,74.44,71.94,75.39,76.61,75.68,76.96,70.56,
+76.76,74.51,77.41,77.74,77.90,77.31,77.94,77.91,74.91,79.86,
+78.77,73.64,79.98,76.47,75.97,79.17,77.37,76.46,78.39,80.98,
+79.94,80.17,79.66,78.91,76.68,80.25,80.61,80.93,77.71,77.66,
+83.50,79.87,80.13,81.84,76.20,80.34,80.75,82.32,81.03,81.47,
+81.34,82.31,83.85,77.93,80.94,83.38,81.26,82.50,81.93,82.72,
+86.70,85.46,85.00,82.97,84.40,87.38,80.29,84.64,87.09,82.88,
+15.66,16.45,16.39,18.11,17.89,18.51,19.63,19.01,20.43,20.97,
+20.46,20.98,22.70,22.69,22.40,24.27,23.58,24.75,25.37,25.78,
+27.16,26.32,27.08,26.65,29.08,27.93,28.07,27.63,29.18,29.69,
+29.47,30.42,31.02,30.42,30.87,32.49,31.78,33.16,33.30,32.79,
+33.62,33.03,34.38,33.59,33.35,34.75,34.95,35.74,35.68,35.48,
+37.26,36.47,38.10,36.68,37.22,39.21,37.80,38.65,39.49,39.70,
+39.94,39.79,40.13,39.71,40.17,41.89,41.27,41.88,42.29,41.19,
+42.57,42.32,45.41,43.78,43.60,42.53,44.01,43.18,45.31,47.10,
+43.53,45.95,45.47,43.72,46.56,45.83,45.59,44.94,47.31,47.34,
+46.85,46.13,47.86,46.83,48.74,48.66,48.74,51.11,49.48,50.09,
+50.17,50.45,50.41,50.06,51.46,49.32,50.61,51.76,51.48,51.37,
+50.42,52.39,50.46,53.79,51.87,53.05,52.67,51.77,54.92,54.80,
+53.09,55.07,54.58,53.29,54.62,52.66,55.79,56.71,57.28,58.00,
+55.87,55.75,54.47,56.64,55.24,58.75,55.73,57.52,57.56,57.58,
+59.76,57.97,59.05,56.67,58.48,60.28,59.02,58.22,58.96,58.21,
+57.72,61.45,57.40,60.68,60.45,58.12,62.02,61.76,59.75,61.28,
+61.90,60.43,62.51,62.24,59.54,60.71,61.73,61.25,63.77,63.98,
+62.00,64.54,60.86,59.07,64.91,64.17,65.68,65.85,66.15,64.13,
+62.80,62.99,63.76,65.53,67.48,64.95,66.46,62.27,65.12,69.58,
+66.23,65.85,64.47,66.46,70.64,66.38,69.67,67.45,66.78,65.62,
+68.48,68.79,70.55,66.98,64.96,66.92,67.32,68.43,69.16,68.77,
+68.36,68.86,71.53,72.67,72.07,71.00,69.59,69.68,71.30,67.56,
+70.80,72.89,71.65,71.18,70.19,72.34,72.39,74.29,73.84,71.10,
+74.94,72.26,72.94,72.73,72.72,73.26,76.66,76.23,72.27,69.76,
+73.22,74.96,74.33,75.35,74.03,73.91,75.49,75.49,73.91,78.99,
+74.16,77.21,73.76,76.17,75.07,77.34,77.65,78.97,72.60,77.00,
+76.77,74.55,76.70,80.29,77.94,76.92,77.90,75.73,77.61,80.17,
+79.09,81.88,75.41,75.87,81.93,79.21,78.83,80.92,78.45,80.01,
+83.53,79.36,80.07,78.59,81.82,77.23,76.95,82.93,85.76,80.13,
+14.94,15.28,16.13,16.51,17.57,18.10,18.15,17.54,18.82,20.09,
+20.86,19.55,21.28,22.42,21.54,22.60,23.11,23.44,23.83,24.87,
+24.13,25.25,24.95,25.90,26.33,27.93,28.54,26.94,27.80,28.69,
+29.13,28.56,28.00,29.39,30.27,29.64,29.14,29.97,31.53,30.77,
+31.83,32.64,32.63,31.48,34.59,34.80,32.76,33.47,34.05,33.30,
+33.56,35.33,35.16,35.76,36.42,36.64,36.65,36.94,36.94,37.95,
+39.76,38.38,37.02,38.61,38.57,39.03,39.30,38.95,39.30,40.25,
+41.12,42.34,41.19,40.21,40.63,40.97,40.34,41.57,42.98,39.90,
+42.52,43.49,43.11,43.41,44.52,44.90,44.86,43.84,45.43,44.68,
+43.28,45.35,44.59,47.49,45.27,45.63,44.84,47.99,48.24,47.16,
+46.98,47.62,48.19,48.77,48.65,49.40,49.62,47.18,51.35,48.60,
+47.70,49.16,50.59,49.35,50.45,52.12,50.35,51.07,50.21,51.85,
+54.05,51.19,49.37,49.83,52.32,51.11,51.54,53.81,54.26,54.11,
+53.48,54.30,53.86,53.59,53.86,51.70,54.86,53.55,54.08,55.95,
+56.77,53.75,55.04,55.63,55.16,56.40,58.45,55.75,56.65,57.80,
+57.66,55.99,58.49,58.54,60.23,57.25,56.99,59.30,59.45,59.36,
+60.77,60.15,59.01,58.20,56.90,58.63,58.98,59.00,60.95,61.19,
+58.37,62.12,59.76,58.18,61.55,60.62,59.43,61.09,61.89,62.18,
+61.57,62.28,61.24,61.69,64.30,62.57,63.14,61.86,63.01,62.62,
+65.39,64.75,66.36,62.49,62.64,65.23,67.55,65.82,64.79,66.04,
+63.27,62.60,67.61,65.70,61.68,68.25,65.87,65.28,66.89,66.34,
+69.93,65.73,68.81,68.55,67.81,68.42,67.65,65.20,70.87,65.61,
+65.97,67.85,69.97,69.92,68.32,68.44,69.68,68.86,70.20,69.17,
+67.90,69.98,71.28,71.97,68.62,69.58,73.39,68.53,70.14,74.13,
+70.09,72.86,67.53,73.13,71.60,73.31,70.40,69.44,72.78,69.90,
+70.78,74.21,73.07,75.35,71.82,70.30,73.71,71.04,74.42,76.14,
+72.13,73.68,74.97,75.19,70.98,75.17,72.28,76.36,78.88,73.33,
+75.38,73.40,73.55,75.37,76.09,77.27,79.40,76.48,74.86,74.37,
+75.91,74.98,74.87,77.78,77.13,77.61,79.94,78.88,76.96,79.97,
+13.88,14.66,15.66,16.21,16.28,16.41,17.05,18.44,18.17,18.66,
+19.94,19.21,20.15,20.69,19.36,20.76,21.86,23.17,22.80,22.78,
+24.18,23.24,24.41,25.44,25.01,25.37,25.97,27.17,27.66,28.19,
+27.91,27.23,28.94,29.04,28.75,27.67,29.21,30.04,30.21,29.52,
+29.80,31.10,31.41,32.30,32.50,31.99,31.64,32.29,32.02,32.31,
+33.42,33.53,32.83,32.39,34.95,35.47,33.57,36.18,34.13,35.77,
+35.98,36.45,36.01,36.32,37.58,36.11,38.21,37.30,37.98,39.11,
+39.82,38.86,39.18,38.07,38.60,39.13,39.28,40.16,41.38,39.61,
+42.09,40.46,39.93,39.56,41.69,40.53,43.21,42.30,42.25,41.11,
+43.34,43.62,44.86,43.25,43.84,45.75,41.64,43.82,45.29,44.26,
+44.04,44.83,45.17,44.90,44.84,47.24,45.80,47.66,45.61,46.73,
+46.06,47.46,47.09,45.58,47.50,50.22,46.09,47.93,48.06,50.87,
+48.72,50.07,51.16,49.91,50.82,49.19,48.61,48.75,49.39,51.87,
+49.67,50.15,50.04,52.40,53.36,51.86,51.49,51.43,52.37,48.64,
+50.63,49.79,53.67,53.65,52.69,55.52,53.22,54.45,54.73,52.94,
+52.64,54.09,56.09,55.13,56.09,53.33,55.29,55.47,56.01,55.61,
+54.43,53.91,59.33,55.12,54.82,57.45,56.41,57.20,56.92,59.19,
+57.02,56.64,55.82,57.02,57.02,57.20,56.87,60.05,59.56,57.05,
+56.76,58.57,58.38,60.52,58.28,59.32,59.74,59.93,59.22,63.52,
+61.38,62.62,62.64,60.86,62.12,61.96,61.98,58.12,60.98,61.42,
+62.64,60.88,61.61,62.27,63.95,64.77,64.37,62.31,64.35,63.24,
+63.62,66.19,62.14,63.66,65.24,66.18,64.25,66.68,67.60,65.88,
+63.73,64.55,65.68,65.78,65.14,64.27,66.80,69.77,63.98,65.81,
+65.71,69.47,67.42,66.50,65.40,69.42,68.49,65.92,69.54,64.82,
+67.01,67.20,69.70,68.32,67.27,64.41,69.94,69.31,67.20,67.89,
+69.24,69.81,67.94,67.16,67.41,66.80,71.09,69.37,70.28,70.65,
+70.45,69.67,64.89,72.39,71.86,72.22,72.79,71.98,69.50,74.45,
+69.91,70.50,70.06,71.84,71.45,71.14,73.30,76.14,72.66,74.57,
+75.77,70.84,73.00,73.66,70.91,72.14,77.03,73.98,72.80,74.92,
+13.07,14.10,13.52,15.57,15.55,16.65,15.86,16.98,17.42,17.82,
+18.79,18.93,20.33,20.69,19.82,20.18,21.50,21.30,22.12,21.69,
+21.92,22.74,23.25,23.03,24.13,24.68,24.08,25.54,26.09,26.25,
+25.04,26.01,26.23,25.25,25.85,27.97,28.12,28.14,29.35,27.00,
+29.01,28.07,30.46,30.67,30.14,29.66,31.26,31.20,30.85,31.21,
+30.93,30.37,32.38,31.11,31.75,32.83,32.39,33.13,33.34,33.42,
+36.45,33.57,34.44,35.50,35.66,36.03,35.13,34.04,35.25,34.92,
+36.06,37.54,37.04,36.48,37.60,39.41,37.60,38.77,37.10,40.29,
+38.17,38.29,39.30,41.00,39.16,39.73,41.81,39.68,39.66,39.15,
+41.77,40.58,40.21,41.57,42.08,42.89,42.91,40.90,41.20,41.24,
+41.45,41.31,42.48,42.33,42.98,42.74,43.71,43.48,43.86,46.48,
+43.59,46.43,46.36,42.80,44.04,44.58,46.01,46.81,47.09,46.26,
+47.61,46.94,46.78,45.85,49.05,48.13,49.20,46.59,49.75,47.92,
+49.70,47.28,48.53,47.89,48.72,48.90,49.88,49.28,50.47,48.00,
+50.49,49.91,51.29,48.65,52.24,53.11,49.16,50.50,50.33,50.27,
+50.82,53.65,51.84,50.33,52.28,51.45,52.74,50.20,54.12,53.42,
+51.74,52.74,54.53,52.11,53.55,54.53,54.50,54.98,55.69,55.14,
+53.85,53.98,54.44,57.15,53.38,55.06,55.71,55.88,56.46,56.36,
+57.15,56.30,58.74,58.43,58.68,56.06,56.25,56.97,57.61,56.91,
+57.58,56.06,59.79,57.39,59.76,60.91,58.98,58.04,58.04,59.70,
+58.91,58.18,59.58,59.36,59.07,60.24,58.88,59.12,59.39,58.82,
+60.46,61.20,61.07,59.62,59.88,60.57,60.18,61.63,61.86,59.82,
+59.36,60.89,62.25,61.24,60.32,64.09,64.13,63.08,64.23,61.48,
+63.43,61.79,61.66,65.06,59.81,64.47,63.83,61.88,63.21,64.89,
+63.00,65.15,64.60,65.16,62.48,66.18,67.23,67.54,66.16,67.06,
+63.49,66.39,64.48,66.59,68.69,65.40,64.89,66.76,65.87,65.83,
+69.33,66.27,66.15,65.71,66.49,70.99,67.95,65.77,69.61,66.15,
+66.22,69.11,69.31,68.99,69.26,68.56,67.87,71.40,68.03,69.06,
+69.76,67.21,72.66,71.48,71.78,72.25,70.29,70.36,71.95,69.66,
+18.07,19.51,19.90,21.20,20.85,21.64,22.25,22.37,24.33,24.17,
+24.82,25.69,26.35,26.75,26.72,28.77,28.02,28.13,29.04,28.74,
+30.39,30.18,32.06,32.44,32.37,32.35,32.50,33.70,33.49,33.57,
+35.15,35.36,34.50,34.99,36.39,36.75,36.34,37.71,37.93,37.70,
+39.23,38.53,37.94,38.65,39.67,39.24,42.00,40.46,43.71,41.86,
+40.81,41.84,42.18,41.72,43.82,44.21,44.88,46.06,48.00,46.76,
+46.44,44.90,46.35,47.26,47.33,47.03,46.98,46.85,48.91,48.11,
+46.38,47.57,48.98,48.65,51.52,50.48,50.88,50.63,52.09,50.16,
+51.13,51.07,51.02,51.67,53.28,52.82,55.26,54.59,53.61,53.71,
+52.77,53.09,53.18,54.54,54.96,56.58,53.83,55.65,56.63,58.20,
+56.32,56.74,58.87,59.88,57.29,55.89,58.04,58.40,59.20,57.08,
+60.18,60.05,59.10,58.53,62.03,57.35,61.56,61.28,63.75,60.84,
+62.50,63.40,64.48,63.36,61.04,63.14,64.94,62.27,62.24,62.67,
+61.18,65.26,65.02,64.49,67.86,66.46,63.66,63.42,66.56,65.62,
+65.88,67.54,61.64,67.66,66.13,69.76,65.25,66.90,68.17,66.81,
+68.07,66.47,68.64,68.06,70.15,69.21,73.06,70.46,70.59,69.83,
+71.80,72.28,72.06,72.52,70.38,69.99,71.68,70.57,73.37,72.92,
+73.13,72.89,72.95,74.01,74.07,75.02,69.45,74.10,72.03,75.04,
+77.92,75.44,75.10,72.05,71.89,71.56,75.80,73.12,77.73,74.66,
+76.17,79.88,76.27,77.22,78.04,74.71,76.78,76.11,78.78,76.95,
+78.14,80.35,78.26,78.00,78.74,78.84,76.29,80.41,76.74,80.63,
+79.58,78.78,79.90,79.21,80.38,80.99,80.12,80.78,82.29,84.21,
+84.66,80.73,83.10,81.66,81.20,80.63,81.33,85.27,85.37,81.86,
+83.52,85.38,83.15,86.44,83.56,87.38,86.15,86.23,83.48,86.01,
+83.51,85.90,85.70,85.58,82.25,86.19,87.83,83.34,87.22,85.56,
+82.38,87.28,88.30,85.39,88.24,87.97,93.09,88.33,88.60,90.53,
+88.76,88.90,87.67,89.80,91.04,88.27,87.74,85.36,90.96,90.29,
+89.42,87.44,87.05,94.56,92.04,91.41,88.47,94.22,91.15,93.22,
+91.14,95.85,90.51,89.17,93.10,92.85,90.54,96.20,94.15,94.40,
+18.87,19.35,20.08,21.31,22.08,22.81,23.49,24.37,25.23,25.46,
+25.83,26.53,27.43,28.26,28.16,28.69,28.32,29.61,30.20,31.24,
+32.15,32.21,32.94,33.36,33.03,34.06,34.09,35.03,34.42,34.88,
+36.65,37.84,37.42,35.95,38.56,38.73,38.41,38.45,39.73,39.61,
+40.12,40.12,39.84,41.08,40.93,42.14,42.58,42.29,42.84,44.08,
+45.99,46.43,43.84,43.48,44.25,46.64,48.29,43.61,46.85,47.24,
+47.47,46.85,49.42,47.76,48.18,48.22,48.21,48.14,48.19,48.99,
+50.33,51.15,54.28,52.36,50.35,53.71,52.68,52.41,51.77,55.22,
+52.54,54.42,57.14,52.88,55.76,54.28,55.33,54.50,56.50,54.53,
+56.07,57.80,57.20,55.44,60.04,58.15,57.87,57.90,60.01,59.09,
+55.32,61.56,58.46,60.92,60.33,60.09,60.18,62.20,63.11,60.94,
+63.23,60.37,61.26,61.51,64.07,63.41,66.07,61.20,64.03,64.15,
+64.62,62.88,65.14,65.88,66.04,68.08,65.96,68.69,63.54,65.37,
+66.73,66.31,67.62,66.38,65.44,65.97,66.52,65.71,67.08,68.09,
+65.91,67.67,69.08,71.38,70.81,68.37,71.71,70.90,69.65,72.80,
+70.63,72.71,73.21,71.58,71.35,70.86,68.62,74.45,73.09,72.90,
+74.04,73.58,71.95,73.15,74.74,77.47,74.37,77.46,74.64,74.38,
+77.06,71.86,77.14,76.72,75.72,76.17,77.46,74.75,76.89,77.28,
+76.47,81.87,75.12,78.48,74.96,78.33,78.17,77.15,79.21,82.60,
+78.45,80.58,79.88,79.73,79.80,81.45,81.40,81.69,82.32,83.60,
+83.25,82.43,83.05,84.25,81.02,86.31,81.99,85.05,85.50,84.26,
+83.42,83.08,84.41,83.22,84.88,83.52,85.22,84.62,88.24,84.78,
+85.62,82.15,84.43,87.03,86.57,85.69,84.36,89.69,88.06,87.79,
+86.05,83.57,87.00,85.85,87.04,88.82,84.05,89.21,87.88,86.63,
+88.81,86.01,88.04,87.64,90.20,88.81,88.10,88.27,88.61,93.65,
+91.66,89.30,90.78,91.74,91.99,92.27,91.86,94.75,91.98,89.43,
+93.83,91.33,95.72,94.97,91.49,92.12,89.02,96.96,97.49,95.83,
+96.15,95.51,90.27,92.20,98.49,96.21,92.74,95.81,97.42,96.65,
+94.29,94.37,96.09,96.99,93.12,95.79,96.92,97.03,97.88,95.35,
+19.56,19.86,21.61,21.67,21.76,22.56,24.08,24.65,24.22,26.94,
+27.47,26.74,27.33,28.97,28.31,30.10,31.68,29.60,30.91,32.20,
+34.20,32.87,32.76,32.96,33.75,34.56,36.46,36.13,35.23,37.15,
+37.17,36.45,37.62,37.55,39.33,38.22,40.36,39.61,42.17,39.88,
+40.73,42.45,41.18,42.56,42.27,42.58,44.75,43.43,44.03,44.47,
+44.98,45.78,45.85,43.93,47.97,46.59,46.34,46.25,49.71,49.25,
+48.03,47.36,49.07,50.69,51.00,50.19,49.79,51.61,51.25,51.51,
+52.03,52.47,52.50,53.68,54.12,52.52,54.03,55.63,54.20,53.58,
+56.00,55.15,54.37,55.97,56.48,56.71,53.34,57.07,56.39,58.50,
+57.74,57.34,59.93,59.86,58.28,61.42,58.18,58.46,59.11,61.51,
+63.81,62.21,61.71,59.85,61.55,61.65,60.30,60.14,63.90,60.83,
+63.04,63.02,64.08,69.02,64.05,65.44,67.07,64.69,66.82,66.11,
+65.89,65.34,67.29,66.54,64.43,68.76,65.79,65.89,68.70,67.33,
+69.14,68.19,71.56,68.46,68.75,70.76,70.31,69.64,71.82,71.46,
+70.89,70.69,71.09,73.90,70.40,70.03,72.92,72.44,75.45,74.52,
+73.33,72.78,72.43,70.44,75.07,75.53,71.67,75.06,73.50,74.83,
+76.59,76.48,75.47,72.67,73.64,71.66,79.30,78.82,76.61,77.85,
+76.33,79.05,80.56,75.79,74.36,79.20,82.67,78.67,78.34,80.05,
+79.61,80.81,80.83,80.29,82.48,78.75,82.10,79.96,84.09,85.00,
+81.60,79.10,81.98,82.79,81.33,82.64,84.24,82.72,85.10,84.92,
+87.57,82.61,85.97,84.25,85.20,84.26,84.60,86.11,83.45,89.06,
+86.31,84.31,86.36,86.66,80.82,89.01,86.54,86.69,86.84,88.62,
+87.30,86.39,87.07,86.38,87.07,87.95,92.70,90.90,92.37,89.87,
+89.49,89.52,86.96,91.10,88.62,89.33,90.89,88.31,93.64,90.67,
+91.52,89.46,90.28,90.13,93.66,94.43,94.47,95.89,88.95,95.55,
+90.93,97.14,93.01,91.90,95.34,96.59,94.97,93.09,93.68,93.76,
+96.90,95.70,97.61,92.07,98.57,95.94,95.11,94.74,98.17,95.16,
+92.12,94.61,95.11,102.49,98.12,93.63,96.33,99.26,96.85,98.04,
+95.53,99.44,94.46,99.07,97.60,99.07,97.51,101.88,98.47,99.81,
+20.24,20.60,20.86,22.28,23.05,24.31,23.51,24.27,25.48,26.71,
+26.53,27.33,28.44,28.96,29.01,29.92,30.28,29.85,31.48,31.46,
+32.73,32.28,33.68,33.85,33.37,35.52,36.08,35.19,37.24,37.40,
+38.04,37.59,38.75,40.09,39.93,38.94,41.38,42.69,39.75,41.84,
+42.03,42.73,42.56,44.09,44.11,43.99,44.98,43.69,45.00,46.39,
+45.81,46.73,44.59,48.83,46.26,47.88,47.26,47.80,49.90,48.61,
+49.30,49.74,51.97,50.12,50.03,50.15,51.64,53.10,52.94,54.96,
+54.80,53.74,51.16,53.92,55.33,51.96,52.44,54.36,56.18,54.29,
+56.70,55.11,54.17,57.83,57.38,57.01,56.56,55.41,60.35,57.45,
+60.74,58.19,60.31,59.57,57.57,59.85,61.16,61.36,61.91,61.78,
+62.91,62.00,62.69,63.70,62.01,63.05,61.13,62.28,61.61,64.48,
+67.34,64.63,66.97,65.54,65.76,67.82,67.27,66.27,65.64,66.88,
+68.74,68.84,65.60,68.05,70.75,67.41,68.25,71.05,69.59,66.93,
+71.95,70.39,69.52,72.64,68.06,70.76,71.32,72.53,72.88,70.71,
+71.60,70.80,70.35,72.19,73.97,71.54,72.23,74.57,74.55,73.13,
+72.31,72.47,73.61,74.93,76.37,73.75,77.46,76.82,76.11,78.59,
+76.79,78.10,77.72,75.40,80.27,76.75,78.45,76.58,78.26,81.25,
+82.44,75.80,80.60,79.43,79.48,79.58,79.45,79.06,78.13,79.97,
+81.63,82.06,82.09,81.71,78.28,82.83,83.70,83.05,79.66,81.33,
+82.09,84.29,80.41,86.36,84.00,84.90,85.92,82.74,85.61,86.78,
+84.39,87.48,85.76,86.39,87.57,84.13,85.75,85.60,85.88,88.63,
+89.83,89.60,88.44,87.77,88.15,87.34,89.45,86.21,89.46,87.68,
+84.09,88.70,93.45,90.07,86.85,86.04,89.44,90.29,87.17,92.27,
+91.26,88.87,92.31,92.02,89.79,91.94,90.15,90.72,96.91,89.48,
+96.14,96.01,93.52,93.29,94.89,97.57,92.31,96.74,95.82,94.05,
+93.78,93.52,99.18,94.22,94.47,97.48,92.43,98.13,98.59,96.56,
+96.01,98.15,97.81,93.07,97.64,97.09,94.07,100.19,97.19,98.58,
+96.42,99.76,101.00,94.68,97.63,100.36,95.61,93.28,100.06,99.76,
+103.02,101.38,101.40,102.78,101.44,97.80,96.34,96.92,99.70,102.91,
+19.77,20.69,21.26,22.81,23.92,23.50,24.70,25.70,26.01,26.22,
+27.62,28.08,27.20,27.60,29.37,29.19,31.82,31.38,32.72,32.89,
+33.36,34.48,33.83,34.86,35.13,34.94,36.00,36.18,36.17,38.64,
+37.48,37.68,38.47,39.51,38.81,41.77,40.63,41.04,39.37,42.80,
+41.21,43.22,43.06,44.12,44.15,43.38,44.68,45.32,44.97,46.88,
+46.98,46.27,45.91,48.77,48.84,47.95,49.14,46.71,49.71,49.38,
+49.12,50.09,47.66,51.93,50.27,52.55,50.02,53.42,52.17,54.03,
+51.25,53.74,54.07,54.71,54.06,53.02,55.92,57.54,54.88,55.95,
+56.39,56.14,57.26,56.31,56.72,61.39,57.82,56.82,57.40,59.40,
+61.21,60.11,59.45,59.28,58.38,61.99,58.60,60.59,63.92,63.34,
+60.76,63.21,61.86,63.25,63.90,63.77,61.50,63.41,67.47,65.69,
+66.76,64.45,63.82,67.68,63.62,65.79,64.99,67.12,66.52,68.21,
+69.91,65.71,69.13,68.90,66.60,66.79,69.91,71.15,71.01,70.84,
+70.27,68.70,70.18,72.63,71.95,68.57,67.98,70.61,72.87,71.27,
+70.91,73.11,69.95,70.25,71.78,73.38,74.37,74.94,71.75,74.46,
+74.93,75.40,74.11,74.83,74.59,74.79,76.95,77.90,77.81,77.73,
+78.66,76.51,77.81,76.52,77.76,77.58,78.75,77.13,77.77,80.50,
+78.19,80.16,80.93,81.64,80.05,79.28,83.86,80.24,82.49,81.93,
+81.04,82.09,82.68,85.78,83.74,82.85,82.25,81.25,83.45,85.94,
+86.09,87.07,85.30,84.08,86.27,82.99,82.67,85.09,81.15,84.88,
+83.35,86.78,90.08,87.26,84.35,88.97,86.69,89.29,88.11,87.24,
+89.55,89.09,85.84,92.82,89.97,87.73,87.17,87.37,88.86,85.99,
+90.39,87.79,95.69,89.57,94.38,91.47,91.53,95.91,92.68,94.66,
+89.16,90.28,94.48,92.27,93.66,89.11,92.80,94.62,93.22,92.11,
+94.56,90.50,90.50,96.07,95.59,95.57,94.70,94.23,92.63,95.96,
+96.85,95.48,94.39,93.51,97.97,93.32,95.67,101.36,95.48,97.94,
+99.81,97.19,100.86,95.92,99.26,98.94,96.89,99.06,99.06,95.89,
+96.30,97.24,100.45,99.58,100.11,99.11,100.02,99.20,98.77,94.39,
+102.20,99.63,100.23,99.37,106.17,101.47,102.18,101.36,101.57,102.87,
+19.75,19.82,21.38,21.64,23.52,23.34,24.65,25.54,25.51,26.82,
+25.91,27.88,28.03,29.20,29.62,29.72,30.73,31.71,31.55,32.60,
+33.77,32.78,32.51,34.59,34.33,35.04,36.89,37.46,36.66,37.51,
+36.82,37.71,38.66,38.83,39.56,41.52,39.69,40.14,41.55,42.40,
+41.40,42.44,43.39,43.56,44.09,44.48,44.07,45.72,45.31,45.31,
+46.28,47.14,48.17,46.78,48.15,47.71,47.80,46.67,49.04,48.84,
+48.60,49.71,50.35,49.43,50.62,52.51,50.57,52.25,53.61,51.36,
+52.45,53.31,53.16,53.83,55.70,54.61,54.76,56.96,56.31,55.88,
+56.43,54.30,56.46,56.57,57.80,57.66,59.42,55.15,59.12,59.84,
+60.62,60.35,59.48,61.04,59.97,61.70,60.41,60.53,60.43,63.06,
+61.85,63.23,64.89,63.94,61.63,60.08,64.66,64.27,65.05,66.64,
+64.29,67.35,66.37,67.10,66.60,68.60,67.63,68.04,64.99,68.34,
+67.17,66.58,70.49,68.07,66.16,68.58,68.53,67.50,68.84,70.30,
+68.77,68.45,73.06,68.40,70.26,71.85,71.53,69.54,68.78,72.62,
+73.73,73.74,71.01,73.25,72.02,73.56,74.08,75.24,74.29,73.29,
+76.08,75.31,74.51,77.04,73.93,76.81,75.42,75.51,74.77,75.87,
+73.32,77.00,77.16,76.58,80.88,76.89,80.07,77.53,80.38,75.64,
+79.21,79.95,81.34,79.88,77.70,83.78,79.34,80.61,86.30,80.81,
+81.90,84.48,83.05,83.73,86.30,78.70,82.24,82.26,82.53,82.80,
+84.67,85.73,83.39,81.72,82.47,85.35,82.20,85.24,83.20,84.90,
+82.20,82.07,87.71,83.79,87.15,86.51,84.13,88.14,90.96,83.63,
+87.10,84.84,87.02,87.22,84.43,90.43,85.59,90.81,89.37,86.36,
+89.39,88.77,89.32,90.96,93.52,91.81,90.34,92.66,86.40,92.36,
+89.80,90.64,91.07,97.59,91.10,92.32,96.98,91.99,92.24,92.79,
+93.57,92.49,95.13,89.56,92.44,96.36,94.20,95.83,92.82,93.65,
+93.41,94.83,92.34,92.63,97.50,95.11,95.76,99.64,94.39,97.24,
+92.07,96.92,95.28,100.16,100.01,95.14,98.80,97.63,95.76,101.02,
+95.04,100.15,102.92,99.85,95.60,97.59,98.91,99.77,99.16,102.95,
+98.37,100.62,105.25,101.77,103.55,100.01,103.01,101.57,98.75,101.17,
+19.21,20.33,21.23,22.90,22.42,23.58,23.41,24.14,25.51,25.85,
+26.94,27.99,27.39,28.77,28.80,29.19,30.57,31.67,31.32,31.63,
+31.93,33.33,34.52,34.45,33.59,35.16,34.39,36.19,36.02,35.42,
+36.70,37.57,37.85,40.41,38.72,41.00,40.48,38.86,40.10,40.62,
+42.24,40.77,43.47,43.87,43.43,43.57,42.82,45.10,43.95,45.52,
+44.40,45.97,46.80,45.76,47.43,47.86,47.81,48.00,46.81,49.19,
+51.29,49.85,49.29,50.37,47.51,50.17,50.75,51.09,51.49,51.16,
+53.16,52.51,53.45,54.20,54.95,55.64,52.83,56.16,52.64,56.29,
+53.37,56.08,55.81,56.40,56.43,56.71,56.81,58.48,59.43,61.17,
+57.88,59.95,58.06,60.14,57.70,61.51,61.10,60.39,60.25,62.09,
+61.63,60.90,60.82,63.40,64.91,61.84,65.59,62.89,63.94,66.04,
+63.66,65.54,65.32,65.38,66.88,65.89,67.72,66.63,67.00,68.45,
+67.35,65.68,63.41,65.84,70.07,71.21,70.23,68.94,68.46,69.12,
+71.19,70.42,67.59,67.30,70.58,70.39,70.85,71.22,70.77,69.81,
+71.85,71.18,74.78,72.46,72.84,71.14,74.63,76.02,73.71,70.64,
+75.24,75.52,74.83,73.77,76.63,78.95,78.20,74.53,76.22,76.22,
+75.03,77.80,76.25,80.13,80.73,75.99,77.38,75.66,79.76,80.10,
+78.97,75.78,78.86,74.29,79.30,79.23,78.44,79.09,79.10,79.29,
+80.96,78.79,84.41,81.42,80.52,79.40,78.44,79.44,81.96,79.60,
+83.25,83.81,79.81,82.72,82.37,83.13,82.32,83.14,83.97,82.62,
+84.89,85.01,84.30,88.06,87.39,84.83,85.56,89.94,84.57,87.05,
+87.32,85.23,87.20,88.18,84.48,83.67,88.72,88.97,86.85,86.94,
+87.44,87.63,91.86,88.23,88.54,88.54,91.04,90.46,89.29,90.41,
+92.06,87.59,95.71,91.52,89.23,89.30,90.37,91.42,88.99,93.13,
+95.03,94.98,89.48,90.53,91.13,96.68,94.83,93.70,98.71,90.19,
+91.50,92.66,93.09,94.99,92.41,96.03,93.45,96.55,94.07,94.10,
+97.83,94.43,96.03,97.59,96.74,94.56,95.47,99.02,96.23,97.58,
+99.07,98.75,98.28,101.25,93.05,100.09,103.09,99.34,99.83,95.45,
+98.39,101.20,100.28,97.96,100.86,98.79,101.82,102.93,100.31,100.92,
+18.98,20.40,20.31,21.38,22.10,23.03,23.59,23.52,25.27,26.15,
+25.66,28.09,26.21,27.75,28.94,29.44,29.23,30.78,32.15,31.65,
+32.02,31.78,31.72,33.75,34.87,33.19,36.21,34.75,36.18,35.72,
+36.04,36.51,37.74,37.80,38.54,38.48,38.49,39.14,40.22,40.74,
+40.51,40.76,41.47,41.08,41.57,42.86,42.75,44.29,45.00,44.25,
+42.96,46.24,46.03,46.84,46.39,44.97,47.37,46.57,47.82,46.82,
+46.53,49.43,48.77,51.26,49.28,50.40,51.15,49.78,50.88,50.17,
+50.92,50.20,51.69,49.78,54.59,52.02,53.28,55.80,52.82,55.16,
+56.17,56.67,55.33,56.69,55.49,56.70,57.34,57.06,57.44,56.94,
+59.37,58.55,57.11,60.96,58.66,58.39,56.83,60.00,59.94,56.17,
+61.35,60.81,63.80,61.28,59.26,61.13,62.44,61.28,62.39,62.01,
+61.76,64.00,62.18,66.64,63.70,65.64,65.47,62.78,66.85,65.64,
+63.54,67.49,67.21,66.97,66.71,67.58,65.97,67.58,69.46,67.98,
+69.18,68.66,69.59,67.48,70.19,69.34,69.68,68.89,67.04,72.56,
+70.73,68.23,69.37,71.93,71.39,69.87,70.98,73.48,74.43,72.28,
+72.70,71.90,75.66,73.30,71.08,72.05,73.83,71.66,74.62,76.60,
+75.66,73.85,79.53,74.12,76.41,74.28,76.44,75.37,78.42,77.57,
+75.72,77.44,79.86,77.13,79.42,77.83,81.43,80.05,76.38,81.06,
+81.01,81.44,78.43,79.27,79.44,81.00,82.81,78.52,82.25,80.74,
+81.67,79.44,80.38,83.65,79.66,85.73,82.43,82.69,83.09,80.99,
+80.23,81.30,81.43,85.37,84.22,83.12,83.04,85.20,90.89,86.09,
+85.37,82.48,84.82,84.74,84.38,84.24,87.36,89.54,87.79,87.08,
+88.72,86.18,88.31,88.03,88.56,87.84,88.53,89.55,87.69,86.44,
+92.47,88.31,89.22,88.51,91.91,87.78,91.42,92.76,88.93,91.42,
+90.72,93.50,93.99,91.54,92.15,92.48,92.58,95.82,92.09,92.83,
+90.17,92.30,94.84,93.83,93.24,94.66,95.57,91.32,96.10,93.65,
+95.23,94.72,95.54,100.51,99.67,96.38,95.25,95.24,100.00,94.87,
+98.48,94.22,99.41,97.14,98.12,96.19,98.03,95.26,98.51,99.57,
+98.99,100.14,98.86,95.92,102.47,101.96,99.85,100.54,98.73,99.83,
+18.74,19.38,20.53,20.96,21.68,23.26,23.23,22.98,24.37,25.55,
+25.68,25.31,26.24,26.95,28.87,28.71,29.12,31.30,29.84,30.98,
+31.06,32.22,32.06,32.51,32.15,34.31,35.04,36.06,34.43,35.50,
+35.29,36.79,35.94,37.66,37.64,37.39,39.49,37.67,37.99,40.33,
+41.15,41.40,41.42,41.69,39.54,42.03,42.15,44.38,42.57,43.38,
+44.23,45.57,44.68,43.94,43.25,46.44,43.82,47.32,46.35,46.80,
+45.97,48.25,48.75,49.80,47.82,49.79,48.49,48.76,50.13,51.19,
+50.94,48.06,51.38,52.00,50.39,52.39,50.97,54.56,54.67,53.34,
+52.26,55.15,54.06,52.82,52.61,55.20,59.44,55.94,57.42,55.87,
+56.18,57.97,57.40,57.73,60.51,58.22,59.24,59.60,60.08,60.43,
+57.57,59.80,60.33,60.37,60.59,62.16,59.00,61.41,61.31,58.33,
+60.73,60.34,62.73,63.40,64.89,63.53,63.21,62.57,64.19,64.23,
+64.47,64.49,65.64,64.63,65.37,63.77,66.00,65.03,65.76,64.90,
+68.39,68.43,66.69,64.90,66.47,68.33,72.06,66.36,67.87,70.48,
+68.35,69.43,67.65,70.64,69.56,71.25,69.65,68.85,71.40,71.18,
+71.52,72.20,72.90,72.16,72.37,73.51,70.72,74.33,73.05,71.65,
+72.73,70.75,74.38,74.31,76.64,75.61,77.13,76.65,73.38,76.42,
+78.21,78.22,73.59,78.25,78.86,76.26,75.83,75.15,78.03,80.23,
+78.46,78.01,74.87,79.19,77.49,79.73,77.19,78.98,75.01,78.88,
+78.18,81.00,82.18,81.08,75.83,82.50,80.32,80.12,82.13,82.16,
+84.64,80.40,83.81,83.76,85.36,81.13,83.92,81.14,80.02,84.85,
+83.23,86.77,86.26,81.05,82.94,85.81,84.80,83.52,84.73,82.17,
+83.31,84.82,86.75,87.66,84.98,88.64,86.98,86.94,88.06,90.15,
+87.81,87.98,86.09,89.60,90.47,88.58,85.49,90.60,87.51,88.28,
+89.58,88.85,92.39,88.62,92.01,87.80,90.83,89.35,88.60,90.04,
+87.85,87.29,89.74,90.91,88.40,90.12,91.02,93.05,90.66,92.09,
+91.86,92.91,96.00,88.47,91.78,88.40,93.26,90.57,92.93,95.50,
+91.84,97.74,92.29,94.49,94.51,93.41,89.89,94.15,93.65,93.05,
+99.51,100.25,94.97,93.81,97.07,99.80,98.30,97.01,96.96,100.34,
+18.10,19.33,20.20,19.68,21.21,22.25,23.40,23.41,23.75,24.81,
+24.88,25.34,24.72,26.76,26.99,27.69,28.77,29.25,30.69,28.94,
+29.74,31.18,30.86,31.13,32.06,32.12,33.07,34.28,34.00,34.51,
+34.47,35.13,35.67,36.81,37.77,38.15,36.54,37.86,38.92,39.01,
+40.67,39.46,40.75,40.75,41.70,40.02,41.26,39.25,41.08,41.62,
+43.74,41.35,44.22,45.02,44.75,43.71,43.92,44.54,45.93,45.85,
+44.93,46.54,45.54,47.18,47.87,46.53,47.89,48.28,46.50,47.25,
+50.94,49.45,49.68,49.32,51.57,50.28,49.93,50.54,50.20,53.05,
+53.07,53.87,53.23,51.34,54.73,52.17,54.74,54.93,53.96,54.94,
+56.43,55.50,56.85,57.38,56.91,56.44,58.35,57.14,57.28,57.96,
+58.15,57.18,59.38,60.58,59.18,59.19,56.40,58.80,58.85,60.05,
+61.08,59.51,60.09,59.32,60.26,61.00,64.63,59.67,62.44,61.26,
+62.65,59.71,63.19,66.06,62.48,62.47,62.26,62.77,66.36,62.26,
+66.76,63.21,66.36,65.18,65.03,69.98,66.06,67.74,66.82,69.05,
+65.90,66.93,67.96,67.67,70.47,68.92,66.76,66.77,68.58,68.27,
+68.64,68.79,67.72,69.20,68.84,72.57,69.59,69.43,70.89,74.41,
+74.66,73.83,77.34,76.37,71.95,70.89,74.51,73.81,71.75,76.99,
+73.43,73.81,75.86,73.41,77.44,75.31,76.06,74.45,73.15,74.80,
+75.79,77.36,78.38,73.79,77.76,75.52,77.22,78.32,76.96,79.42,
+78.45,79.64,78.32,78.88,78.92,81.18,81.42,79.99,80.84,78.27,
+81.93,79.25,78.19,80.23,83.90,79.86,77.74,81.20,81.16,79.46,
+82.74,85.87,83.49,80.54,81.36,79.33,83.75,81.54,85.30,82.13,
+86.18,87.26,84.50,80.41,82.77,85.37,86.01,80.98,87.10,88.37,
+83.93,85.36,87.06,85.82,85.34,83.06,84.95,84.81,88.41,83.24,
+88.60,86.29,88.13,89.13,89.46,87.76,85.61,89.09,88.66,87.38,
+87.38,88.64,86.53,89.96,87.32,91.60,94.11,91.22,87.67,88.34,
+92.12,90.64,91.91,90.69,90.90,92.35,89.90,90.37,88.73,94.72,
+91.90,92.00,93.13,92.32,92.39,92.22,88.20,88.40,95.80,94.83,
+96.39,95.77,90.60,92.41,92.77,93.27,91.07,95.15,96.13,94.35,
+17.40,18.48,19.81,20.15,20.92,21.04,21.17,22.70,23.11,23.84,
+25.44,25.01,25.05,25.44,25.82,27.43,28.59,26.98,29.70,28.96,
+29.93,31.79,30.29,30.09,32.32,31.52,31.84,32.88,33.48,32.96,
+35.15,34.39,36.27,34.29,35.47,34.83,35.99,36.63,37.49,36.65,
+39.30,39.15,38.89,40.01,39.30,39.46,40.07,41.02,38.64,41.39,
+40.43,42.59,41.66,42.60,42.47,43.62,41.79,43.56,44.04,45.29,
+42.89,45.02,45.17,46.87,47.05,46.15,45.60,46.30,46.48,48.30,
+47.02,47.60,51.55,49.91,47.02,51.07,51.24,49.40,52.03,51.03,
+49.87,50.73,50.49,50.57,52.98,51.91,53.05,52.83,53.80,52.36,
+53.55,54.17,54.15,52.08,56.02,55.40,55.80,55.45,54.99,57.73,
+54.31,56.25,57.12,55.85,58.88,57.49,58.77,58.37,58.52,61.07,
+56.46,57.24,58.44,58.90,59.41,59.50,60.68,61.54,60.51,59.37,
+59.00,60.83,59.10,61.34,59.13,63.39,62.19,62.52,62.95,62.66,
+62.04,64.84,64.92,64.00,62.66,62.44,67.08,63.24,63.14,66.61,
+64.22,66.02,63.55,66.26,67.06,67.06,67.29,66.17,67.62,65.51,
+69.73,70.40,69.13,70.70,65.88,67.25,69.59,69.46,70.08,69.45,
+70.26,71.81,68.03,67.83,70.97,71.22,67.25,72.06,70.99,72.25,
+71.08,70.74,70.71,72.86,72.92,73.44,75.17,71.49,71.29,73.05,
+74.80,73.87,75.18,73.14,75.72,75.71,72.13,76.59,75.79,74.41,
+75.23,74.81,74.85,80.37,75.97,76.77,77.24,73.63,77.97,77.40,
+76.57,75.40,75.66,80.84,78.65,80.81,79.69,79.06,77.77,79.89,
+77.62,78.75,80.92,76.36,82.82,80.04,79.11,79.69,80.81,80.86,
+77.79,82.31,83.05,83.15,81.91,81.13,83.44,79.15,80.41,83.14,
+83.65,83.68,83.64,81.87,83.00,84.24,84.58,82.70,84.17,83.81,
+85.30,83.28,84.30,85.24,84.59,83.81,84.38,83.06,85.68,88.18,
+86.19,85.84,82.10,84.58,89.37,85.31,84.14,87.84,86.03,85.76,
+87.23,87.10,87.86,87.08,86.33,88.08,88.87,85.00,92.86,90.39,
+86.08,89.44,88.12,88.47,86.40,89.81,91.62,92.28,90.65,93.62,
+92.38,91.85,90.19,97.64,90.03,92.12,94.02,92.11,90.99,94.41,
+17.24,18.06,18.45,19.61,18.96,20.22,22.18,22.12,22.32,23.70,
+23.63,23.97,23.98,24.82,25.34,26.03,26.08,26.73,27.67,27.32,
+29.02,29.05,29.40,29.28,30.85,30.55,31.78,30.92,32.35,32.64,
+33.52,34.28,33.25,36.07,34.87,34.60,36.89,35.43,35.46,35.88,
+35.55,37.29,37.91,36.48,38.29,38.69,39.37,38.92,39.20,41.24,
+40.32,41.18,42.19,41.46,41.37,41.72,42.19,41.91,44.69,42.85,
+44.14,43.06,42.18,43.75,43.72,45.24,45.91,44.90,46.06,45.92,
+45.71,48.86,45.19,47.13,50.20,47.79,48.89,46.61,48.48,48.62,
+49.01,48.05,48.36,49.53,48.46,50.00,50.73,51.70,48.07,50.53,
+51.83,51.22,52.92,54.68,51.32,52.97,51.92,51.67,53.40,55.27,
+54.35,54.02,55.70,54.77,54.36,54.23,53.72,55.61,57.22,57.45,
+55.17,56.53,56.49,57.56,54.88,56.11,57.91,58.79,60.60,56.66,
+54.69,56.77,59.86,59.15,59.65,59.47,61.13,62.37,60.72,60.35,
+62.46,60.57,64.00,62.47,62.85,61.37,62.65,62.54,63.15,58.66,
+64.54,63.08,58.06,62.61,64.30,62.99,64.90,67.99,64.41,63.16,
+67.80,67.73,64.79,65.53,65.30,65.71,70.68,67.04,69.67,65.64,
+66.62,68.01,67.77,66.32,66.90,65.69,68.49,68.28,67.82,67.93,
+68.90,67.41,70.11,68.73,67.84,69.06,71.26,68.58,68.68,66.59,
+74.81,70.26,75.03,72.38,71.23,69.61,73.17,71.80,72.61,74.02,
+71.30,71.52,72.20,72.07,69.74,73.38,74.52,72.33,72.86,76.56,
+74.26,73.37,74.88,73.96,75.96,73.57,75.60,77.04,73.52,76.89,
+74.94,77.43,73.15,73.98,77.86,76.58,75.16,77.84,77.23,79.02,
+78.24,78.87,78.40,78.16,81.24,76.92,78.53,78.77,81.07,79.84,
+75.70,81.74,79.86,81.02,79.38,82.22,84.61,81.26,79.98,81.81,
+81.60,83.59,80.49,81.35,81.23,82.61,84.30,81.34,82.48,84.26,
+81.13,77.84,81.70,83.24,86.52,81.26,87.71,84.05,82.75,82.99,
+85.79,85.48,84.22,83.88,86.27,85.45,84.51,87.09,85.15,86.57,
+90.69,89.55,83.35,83.87,83.44,86.16,88.34,88.63,85.92,89.53,
+85.03,85.91,90.20,84.25,88.17,88.99,85.29,88.25,89.17,88.61,
+16.27,16.93,17.71,18.91,18.91,19.01,20.19,20.75,21.80,21.67,
+23.23,23.15,23.77,23.79,23.18,26.14,25.28,26.12,26.70,27.47,
+26.68,26.51,27.33,28.34,28.83,29.38,30.13,30.46,30.10,31.94,
+30.72,32.74,32.68,31.92,32.08,32.84,33.16,33.33,34.51,35.51,
+35.02,34.46,37.29,35.76,36.06,36.67,37.46,36.44,38.47,37.98,
+38.60,39.26,39.82,39.17,39.86,41.23,42.71,39.62,41.59,39.52,
+40.46,42.35,41.70,44.16,43.07,42.67,43.83,42.74,44.86,46.25,
+41.87,45.03,44.77,44.21,46.23,46.39,45.51,46.12,47.85,45.90,
+49.62,49.75,47.10,47.31,47.00,49.31,48.08,48.71,51.13,49.64,
+47.38,49.82,47.78,51.60,50.02,50.57,54.28,49.68,52.62,53.36,
+53.45,53.39,51.55,51.07,52.84,53.20,53.82,52.83,51.15,53.55,
+52.97,55.09,57.55,55.54,57.22,55.28,54.42,55.79,57.07,57.48,
+56.48,56.62,54.91,56.17,56.17,59.06,58.24,58.14,59.19,60.54,
+58.91,57.89,57.66,60.03,59.43,60.28,59.26,59.38,61.22,60.59,
+60.98,60.66,62.78,63.03,62.56,62.36,61.89,64.31,62.04,63.68,
+61.49,64.30,61.22,63.41,62.37,64.67,63.51,63.48,66.11,64.64,
+64.63,64.29,66.65,64.98,61.69,66.85,65.37,64.42,68.39,66.94,
+65.79,67.85,66.08,68.20,63.90,67.48,68.18,68.56,65.48,67.80,
+67.68,69.58,69.82,70.14,69.42,69.44,70.44,68.45,69.66,68.51,
+71.82,72.60,71.78,70.48,69.41,71.14,74.84,68.94,70.29,69.36,
+72.07,74.35,72.60,74.21,71.32,72.25,73.54,73.64,72.67,73.83,
+73.69,77.02,73.46,74.85,71.97,73.04,75.21,73.74,77.21,74.22,
+75.79,75.07,71.97,74.27,74.55,75.32,75.21,78.12,76.75,76.86,
+77.63,80.68,76.64,76.06,76.35,76.59,79.26,70.98,79.70,75.53,
+78.24,78.76,79.86,76.15,78.67,78.61,77.94,78.09,77.77,81.30,
+80.64,79.84,80.78,81.14,80.72,78.82,79.50,79.92,84.47,82.09,
+79.51,81.62,77.94,81.19,79.51,83.13,80.39,81.56,82.48,83.25,
+81.04,80.83,82.58,84.97,82.71,80.86,84.64,82.35,87.98,82.92,
+87.81,89.28,85.68,84.37,88.70,90.03,84.66,82.45,84.88,85.21,
+14.77,16.46,16.48,17.98,18.66,18.51,18.11,19.80,19.92,20.95,
+22.02,21.88,22.10,22.53,25.17,23.44,23.78,24.35,25.15,26.42,
+25.69,25.56,26.54,27.95,28.19,29.70,28.51,29.05,29.71,30.83,
+31.00,30.04,31.38,32.04,31.85,32.19,31.69,32.19,33.99,33.42,
+33.18,34.12,35.25,34.47,35.41,34.65,36.51,36.48,37.50,36.64,
+38.08,37.55,37.08,38.15,38.21,37.58,39.29,39.82,36.24,39.95,
+37.86,40.93,39.96,42.09,40.54,40.38,41.31,43.30,44.33,42.78,
+43.19,41.30,41.67,43.77,42.54,46.54,44.12,44.24,44.38,46.16,
+44.44,45.42,45.83,48.48,46.12,46.69,46.24,46.80,47.98,45.87,
+49.11,48.16,47.97,49.75,49.27,49.07,50.60,49.96,49.94,48.61,
+50.26,51.05,46.93,51.24,51.64,50.14,53.92,50.01,52.19,52.83,
+51.79,52.66,53.84,55.15,53.81,53.12,53.98,52.14,54.65,57.62,
+54.28,54.67,53.00,55.50,54.26,58.47,56.30,54.97,57.05,54.51,
+56.31,57.85,56.89,58.56,57.94,57.30,55.86,57.29,59.49,56.15,
+58.37,59.83,58.89,59.25,57.14,58.40,58.89,58.27,62.30,61.06,
+60.44,61.48,60.68,60.83,59.79,60.68,61.66,62.84,59.83,63.11,
+61.04,61.61,64.46,64.91,61.72,62.41,62.16,63.14,65.74,66.00,
+63.67,66.88,60.47,67.41,63.11,63.11,66.00,64.34,67.60,63.57,
+63.60,61.76,65.55,65.48,66.68,66.41,67.89,64.53,66.99,68.81,
+66.46,68.67,68.17,67.26,66.96,66.17,69.62,69.40,69.75,69.70,
+72.35,66.20,69.14,70.04,69.14,70.59,71.67,69.37,71.53,67.83,
+71.01,66.80,72.77,71.67,73.32,71.54,72.55,70.58,71.41,70.74,
+71.89,72.70,69.67,74.18,73.85,73.72,71.68,75.89,76.20,72.44,
+73.57,75.27,74.24,72.72,73.25,75.09,73.08,73.81,74.61,77.98,
+73.04,75.95,76.02,77.39,74.89,73.40,77.63,73.71,75.96,74.56,
+74.06,76.58,77.79,79.27,78.25,74.61,79.76,76.44,79.20,78.97,
+79.74,76.76,76.35,78.99,79.32,78.21,78.42,85.04,78.05,77.84,
+79.47,76.02,80.43,80.83,80.42,78.06,80.68,81.28,77.93,80.10,
+79.60,83.40,82.00,78.75,78.06,86.42,83.64,83.21,84.53,82.16,
+14.64,15.60,15.86,17.17,17.85,17.76,18.53,19.18,19.01,20.25,
+20.89,20.69,21.60,22.55,22.85,24.73,24.40,24.28,25.05,25.64,
+25.62,25.23,25.48,27.14,27.09,27.18,28.09,27.26,28.05,28.18,
+28.65,29.58,30.38,30.39,31.30,30.46,30.24,31.93,31.18,32.56,
+33.63,32.84,32.43,32.12,34.73,34.71,35.50,34.37,34.89,35.24,
+36.42,35.36,34.74,36.25,35.82,37.99,36.57,38.08,36.87,37.99,
+37.43,38.47,38.77,39.23,38.94,40.91,39.07,40.50,41.10,40.77,
+42.21,41.39,41.80,41.36,42.54,41.39,43.07,42.05,42.11,41.43,
+44.12,42.90,43.31,42.31,43.86,43.87,43.97,43.76,44.23,44.20,
+47.02,44.70,46.59,45.47,45.76,48.67,46.56,46.65,47.60,47.54,
+46.79,47.38,48.71,48.58,48.31,48.36,48.42,50.09,49.75,49.19,
+50.24,49.66,50.46,49.36,50.15,50.90,53.09,50.37,52.49,50.24,
+52.96,52.06,53.21,54.03,53.13,53.09,52.70,53.98,52.94,53.39,
+53.30,54.13,53.75,53.49,55.26,54.51,54.36,55.57,56.49,55.81,
+56.88,56.31,56.07,57.75,55.72,55.91,58.87,58.41,58.94,58.75,
+56.94,55.36,55.87,59.67,58.42,58.19,55.95,59.55,59.44,59.24,
+60.92,57.83,58.78,58.78,59.92,58.14,59.78,61.18,60.77,61.71,
+61.40,63.32,63.30,61.59,63.10,62.17,63.46,64.15,63.41,61.97,
+61.40,64.06,62.52,64.82,63.80,62.41,63.60,65.52,66.22,67.55,
+62.12,64.31,64.79,65.42,65.31,64.93,64.20,65.62,64.90,67.67,
+67.28,66.55,66.34,68.74,67.78,66.06,66.87,67.53,66.82,65.85,
+64.38,68.15,67.50,71.67,64.33,66.73,64.64,69.43,69.03,66.05,
+69.43,72.03,71.41,70.16,70.63,70.82,70.51,68.95,73.32,69.57,
+72.68,71.04,72.00,73.35,71.76,69.30,70.38,73.90,69.87,68.56,
+74.48,72.62,72.05,73.54,71.65,71.35,73.37,74.05,71.30,74.57,
+72.58,74.71,72.99,74.37,72.58,74.55,76.79,70.17,76.80,79.55,
+77.30,73.40,76.25,76.89,74.87,73.74,76.44,77.19,76.22,72.13,
+74.19,77.64,76.98,78.42,75.66,79.81,76.99,75.24,77.42,79.46,
+73.42,74.88,76.54,75.47,80.64,73.51,81.20,78.01,78.06,76.63,
+18.18,18.89,19.36,20.61,21.58,22.59,23.30,23.34,24.10,24.37,
+25.25,24.19,25.89,27.06,26.39,27.67,28.24,27.85,28.85,30.40,
+30.22,30.87,31.34,30.85,33.19,32.66,33.68,33.34,33.41,33.47,
+33.71,34.51,34.47,36.86,36.67,37.22,37.14,37.69,38.52,38.32,
+39.27,38.98,38.67,40.36,39.67,41.42,40.31,41.83,39.55,41.61,
+43.06,42.07,42.12,43.80,44.38,46.07,45.42,45.41,45.25,44.98,
+45.24,46.06,45.65,46.36,47.05,45.01,46.34,49.29,48.50,49.65,
+50.08,48.47,48.58,49.94,48.00,52.24,49.66,50.06,48.81,50.89,
+50.34,52.60,51.78,51.73,51.75,51.31,54.88,52.07,51.69,52.47,
+54.07,54.75,54.96,54.52,55.75,55.24,56.08,55.82,56.91,56.60,
+56.69,56.22,56.79,57.75,55.47,57.39,58.38,58.48,60.00,58.83,
+59.76,59.86,59.45,59.75,60.63,60.67,59.37,63.19,59.45,60.19,
+59.99,63.46,61.19,62.37,63.47,61.28,63.99,62.25,62.59,63.16,
+63.58,60.44,64.49,65.87,65.48,64.27,65.94,65.09,66.58,63.34,
+66.39,65.26,66.42,68.40,63.34,66.59,69.08,66.71,64.38,70.76,
+68.73,68.46,68.75,71.57,67.40,67.11,69.40,70.26,70.17,69.76,
+70.30,70.37,70.33,70.88,69.72,69.08,71.09,69.20,74.48,73.25,
+70.34,71.65,72.15,71.89,70.88,72.82,73.39,75.51,73.83,72.14,
+71.38,75.83,76.03,78.39,73.58,71.70,74.78,73.43,74.76,73.12,
+73.84,75.29,77.99,75.68,76.35,82.27,77.26,78.62,78.34,78.32,
+79.09,78.30,78.79,81.82,80.87,82.82,82.25,80.15,78.59,79.65,
+79.54,82.68,78.22,80.84,82.05,81.54,80.57,81.20,83.53,79.38,
+80.06,78.90,79.80,80.94,82.35,85.06,80.56,85.28,85.27,81.93,
+85.41,80.50,83.56,82.86,81.68,82.73,84.70,84.48,89.57,85.18,
+86.05,87.38,85.60,82.01,83.87,88.73,86.56,85.89,84.82,86.86,
+84.60,83.57,88.93,85.60,85.36,87.22,85.75,89.19,88.18,86.37,
+93.38,85.66,87.59,86.89,89.53,86.31,85.53,89.71,90.38,87.00,
+89.17,92.96,92.05,91.05,91.98,93.18,89.73,87.76,94.27,91.23,
+92.41,92.35,94.03,94.81,95.09,93.26,89.74,90.71,91.23,89.74,
+19.93,20.03,20.94,21.45,22.27,22.91,23.51,24.06,25.53,26.58,
+26.55,26.23,27.04,28.14,28.64,29.25,29.50,29.05,29.88,30.68,
+31.39,31.96,32.28,32.33,33.34,34.39,33.71,34.45,36.42,35.31,
+36.15,36.68,38.01,36.87,38.91,38.67,39.36,38.88,41.46,40.03,
+40.38,40.49,41.69,42.03,42.13,42.81,42.83,43.39,43.46,44.75,
+44.66,44.62,45.76,45.02,44.51,46.85,47.14,45.55,48.42,47.49,
+47.65,48.13,49.25,48.73,47.82,48.43,51.27,49.13,50.28,52.16,
+50.78,51.49,50.43,51.84,51.09,54.32,55.15,54.35,54.71,53.66,
+52.48,53.61,55.72,54.01,54.17,56.99,56.02,55.80,56.01,58.14,
+55.45,57.19,57.94,59.46,56.76,59.93,58.78,59.85,61.32,59.24,
+59.12,57.60,58.67,59.64,59.19,59.68,59.09,60.64,61.09,62.86,
+60.95,61.78,62.49,60.97,64.88,62.46,64.34,63.43,62.76,64.43,
+66.87,64.04,64.48,65.71,66.72,66.26,65.76,67.92,66.62,64.48,
+67.71,67.61,68.03,67.16,68.85,66.01,70.41,65.54,69.39,69.36,
+69.75,71.56,72.84,71.19,70.30,70.41,75.04,72.05,68.52,73.64,
+71.55,69.25,73.84,73.02,71.39,71.73,73.50,72.57,71.86,72.24,
+71.84,76.50,71.98,72.52,74.10,74.16,74.94,76.98,73.73,75.80,
+72.86,74.35,79.36,78.06,74.55,79.78,77.03,80.43,77.73,76.22,
+78.91,76.37,79.05,79.17,76.42,77.07,80.02,82.85,82.48,82.19,
+81.33,76.88,83.08,80.94,77.67,81.27,82.58,80.50,81.44,82.63,
+79.33,84.73,82.34,85.86,81.89,82.38,84.75,83.57,84.36,83.58,
+80.98,82.81,86.88,84.21,86.80,83.18,87.78,85.71,87.03,82.80,
+88.97,89.68,87.16,82.99,87.68,89.91,86.94,87.02,88.55,86.52,
+90.30,88.27,87.75,87.61,88.94,90.22,91.11,89.06,94.75,88.92,
+93.81,93.71,86.92,90.03,90.31,87.48,91.20,87.19,89.64,94.56,
+89.72,91.53,92.64,92.84,92.25,89.84,90.31,92.00,93.08,91.93,
+91.48,94.92,92.97,93.52,89.73,91.84,95.05,92.30,98.09,92.31,
+96.69,95.07,95.06,95.63,101.94,94.53,95.13,92.77,98.53,94.69,
+92.42,98.94,96.44,93.60,90.51,94.49,98.05,96.87,97.99,100.82,
+19.58,20.88,21.05,22.11,23.32,23.45,24.93,24.61,25.33,25.61,
+27.53,26.38,28.75,28.09,29.37,29.55,31.17,31.31,30.58,31.61,
+32.88,33.26,34.48,34.06,35.48,36.01,36.81,34.67,35.75,36.66,
+38.32,37.42,39.62,41.32,38.59,39.59,39.38,41.33,39.02,43.17,
+43.02,44.09,43.00,42.23,43.88,43.67,43.42,44.81,44.32,45.64,
+46.02,45.33,46.58,47.49,47.93,47.91,46.77,49.53,51.38,48.49,
+50.62,47.92,50.18,51.44,52.38,50.90,52.32,50.68,52.72,52.57,
+52.99,53.00,53.47,51.53,53.00,54.06,53.00,51.51,55.31,54.60,
+58.38,55.17,57.41,56.56,57.58,58.28,58.06,57.36,58.89,57.90,
+55.83,58.67,60.61,60.84,58.67,61.99,58.89,60.05,60.37,59.49,
+61.66,63.86,62.39,62.05,62.57,62.32,65.36,63.50,63.71,63.57,
+63.88,66.58,63.56,66.07,64.46,65.41,67.13,64.49,66.97,65.22,
+64.50,66.12,66.28,65.06,68.15,69.05,66.67,69.42,65.56,68.45,
+71.25,71.04,68.61,72.59,67.12,72.77,71.08,70.19,72.29,71.11,
+70.67,73.00,71.03,70.03,70.07,70.26,75.56,70.77,71.84,75.41,
+76.45,73.72,74.47,73.59,75.32,74.10,74.24,76.59,74.32,75.85,
+77.75,78.76,74.55,76.21,76.57,76.29,73.62,77.12,79.99,80.04,
+77.52,79.87,76.54,77.25,79.52,79.14,78.93,80.15,79.83,77.61,
+82.24,83.83,82.22,83.22,83.57,81.35,83.88,85.29,81.96,79.47,
+81.04,81.52,84.88,84.35,80.78,85.63,86.19,83.30,86.54,88.10,
+85.82,84.81,82.54,84.60,89.18,83.20,86.66,88.12,86.60,81.59,
+89.26,86.77,87.11,88.32,88.89,90.58,85.48,85.48,87.70,89.98,
+86.55,88.36,87.10,91.17,85.72,88.73,90.71,90.23,90.74,90.88,
+91.61,92.28,90.10,95.64,95.30,94.57,91.32,93.11,90.08,93.94,
+92.06,94.13,91.84,92.76,92.02,94.32,94.76,97.15,97.54,95.78,
+93.30,93.21,97.22,95.21,96.32,98.67,96.10,98.63,99.96,95.23,
+95.02,93.42,97.67,95.79,97.04,96.91,101.60,98.65,94.41,101.95,
+98.51,100.12,96.73,98.25,98.73,96.44,96.22,96.15,96.62,99.74,
+99.03,99.34,100.31,100.63,100.62,104.30,100.21,106.30,98.92,100.20,
+20.16,20.73,22.17,22.92,22.88,24.21,25.33,24.90,26.95,26.92,
+27.16,29.32,28.39,28.24,30.14,30.13,32.24,32.76,33.06,32.39,
+32.92,34.38,35.19,34.95,36.31,35.76,37.34,37.03,38.59,37.34,
+38.90,38.13,39.30,41.25,43.05,39.82,41.87,40.65,42.71,41.92,
+43.52,44.84,43.09,42.61,42.49,44.28,44.55,45.26,45.96,46.49,
+46.02,48.31,48.53,47.23,50.97,50.21,49.58,49.27,49.63,50.91,
+50.83,49.95,49.44,53.32,51.03,51.22,51.45,51.76,53.33,55.25,
+53.40,55.36,55.40,56.53,57.70,57.02,55.81,56.63,57.63,57.18,
+57.08,59.84,58.17,58.46,58.46,56.84,58.93,58.43,60.93,59.54,
+60.00,61.56,61.13,62.63,60.88,62.82,61.99,60.80,62.88,62.06,
+62.06,62.90,64.00,62.15,65.40,65.66,63.93,66.27,65.97,67.38,
+66.21,69.39,67.65,66.68,67.94,66.85,66.00,64.07,67.67,67.76,
+68.26,67.89,70.98,69.61,70.10,68.78,70.83,68.86,71.57,71.11,
+73.52,71.07,72.36,71.48,72.57,74.08,71.71,73.20,76.45,74.03,
+73.00,75.92,75.55,73.93,72.61,75.39,73.16,77.34,75.34,79.98,
+74.86,75.47,77.87,78.39,80.83,78.48,74.00,77.44,76.47,78.46,
+77.72,78.03,76.84,79.87,81.63,82.66,74.78,79.69,81.12,80.97,
+81.65,81.29,80.98,83.86,77.91,84.75,81.72,79.48,86.14,80.52,
+80.12,83.19,82.06,84.45,82.16,83.19,83.99,83.94,85.03,90.40,
+82.64,83.98,91.32,82.38,88.25,87.44,87.27,88.75,87.66,89.48,
+87.65,85.43,86.25,89.62,88.07,86.30,89.79,89.37,86.52,87.83,
+91.37,87.30,90.05,93.32,90.26,88.13,92.52,91.87,88.65,93.00,
+86.59,91.79,91.04,89.59,91.82,91.01,94.31,89.68,92.47,95.21,
+95.40,93.04,88.48,89.56,91.51,94.06,90.72,96.23,92.21,93.17,
+96.76,95.87,98.62,98.26,92.05,98.07,98.29,95.64,95.68,100.10,
+95.59,94.32,94.53,99.72,98.29,99.58,103.91,103.00,96.73,95.23,
+98.73,104.84,96.98,98.41,99.24,99.84,96.59,97.86,98.11,96.08,
+103.37,98.68,99.46,106.39,100.88,102.25,100.81,103.43,98.30,102.12,
+101.19,101.60,104.47,101.98,102.68,98.23,103.04,104.80,106.15,101.13,
+20.12,20.77,21.91,23.13,24.13,24.43,24.60,26.43,27.32,27.63,
+27.91,27.82,29.71,29.42,30.08,31.90,32.51,32.67,32.64,33.74,
+33.78,36.09,34.73,34.35,35.56,36.28,37.99,38.63,36.86,37.78,
+40.26,40.23,40.01,39.76,40.24,41.94,42.48,42.17,42.74,43.25,
+44.76,44.67,45.50,45.01,47.01,48.15,44.99,43.74,44.93,47.58,
+47.95,47.73,49.45,48.41,49.51,47.28,51.06,49.80,50.73,49.51,
+51.07,50.89,52.80,51.48,50.28,54.69,55.04,53.47,53.66,53.66,
+54.56,55.42,54.99,53.35,54.38,56.13,58.05,56.42,56.64,58.33,
+58.23,58.44,57.91,58.20,60.31,61.54,60.14,62.17,61.18,62.21,
+63.06,62.33,62.00,60.33,62.56,61.94,62.93,64.00,63.04,65.34,
+63.73,62.97,65.08,65.30,65.87,66.56,64.65,66.44,66.79,68.53,
+64.87,69.14,67.96,65.68,66.71,66.98,71.36,68.90,66.35,68.86,
+68.06,67.49,73.77,70.17,70.77,70.54,71.65,71.05,70.84,70.98,
+71.41,71.10,73.31,73.98,71.61,74.11,75.25,75.07,72.52,72.88,
+73.78,75.21,77.79,75.11,72.36,78.00,75.16,76.90,72.99,76.07,
+76.66,74.04,79.13,77.57,78.04,77.08,80.14,80.23,79.34,77.20,
+76.56,83.74,79.79,79.82,77.84,79.50,80.08,83.55,80.98,78.46,
+82.31,80.69,84.56,82.57,86.50,85.18,86.60,82.94,83.34,86.65,
+84.10,85.87,81.52,85.50,87.56,84.87,85.99,87.47,86.81,88.58,
+84.63,90.02,89.00,85.53,87.89,85.47,89.17,83.85,89.37,87.58,
+89.40,91.68,89.36,88.23,91.87,87.26,92.24,88.11,90.01,87.54,
+91.31,90.92,92.18,89.90,92.08,92.36,92.26,94.48,94.99,92.98,
+94.13,93.26,93.16,91.10,91.33,91.97,93.62,93.28,92.57,93.24,
+90.83,94.90,95.60,96.88,93.11,96.92,96.42,95.03,97.29,95.99,
+94.05,95.73,92.95,94.39,95.95,97.19,95.80,98.31,99.46,96.93,
+99.72,97.23,94.82,94.92,99.24,102.06,99.44,98.05,100.02,99.08,
+97.69,99.34,101.57,97.12,101.41,102.97,99.14,101.50,101.42,100.81,
+102.78,101.51,101.53,101.82,102.90,101.41,101.41,101.64,104.34,102.01,
+99.68,105.90,102.02,102.67,104.74,106.57,101.42,102.72,103.46,103.85,
+19.52,20.51,21.99,23.53,23.89,25.12,24.88,26.21,27.34,28.37,
+27.97,28.95,29.47,30.15,31.73,30.03,31.60,32.14,31.84,33.63,
+34.10,34.57,34.94,36.58,35.97,36.33,37.36,37.24,38.28,39.25,
+40.10,41.09,39.86,39.34,39.89,41.97,41.14,43.66,44.74,43.84,
+43.52,44.69,44.92,45.33,45.89,46.22,46.35,47.14,46.30,46.31,
+48.13,48.37,50.31,48.60,48.35,49.19,51.03,49.95,52.03,52.01,
+52.25,52.68,52.97,53.47,53.11,52.56,53.85,51.73,56.68,55.63,
+55.27,57.25,56.06,56.62,56.14,55.91,56.86,56.56,58.82,58.90,
+58.98,59.22,59.89,59.65,58.51,57.53,59.49,59.05,62.98,63.94,
+60.10,62.72,62.58,61.33,64.45,63.27,65.86,63.76,63.60,62.45,
+64.68,66.42,67.15,65.13,65.79,66.88,68.41,63.28,66.05,65.87,
+66.09,68.22,67.54,68.02,70.03,70.58,70.71,68.05,66.24,71.11,
+70.53,68.75,71.27,73.96,71.19,72.53,72.16,77.13,71.60,73.11,
+73.04,70.75,70.96,68.94,73.76,74.57,72.98,74.78,72.51,76.55,
+75.84,75.86,75.49,76.33,76.82,77.46,76.72,76.32,76.23,79.19,
+79.37,75.45,80.53,79.71,77.56,80.61,78.08,77.44,79.78,80.32,
+77.67,81.20,83.90,80.68,82.44,81.62,83.02,77.40,82.61,84.72,
+82.74,80.86,83.18,82.93,84.38,82.40,84.98,85.04,85.68,83.23,
+82.95,80.74,85.43,81.80,89.15,87.29,87.58,87.20,85.38,88.37,
+87.86,82.88,87.17,86.46,89.76,88.95,87.27,89.69,88.00,92.86,
+89.74,92.60,88.84,91.20,90.61,93.35,89.92,88.70,88.55,90.07,
+93.72,91.31,92.12,91.12,91.77,92.11,93.93,95.26,90.97,93.47,
+95.29,90.10,94.04,93.38,92.19,97.36,94.19,95.55,95.41,94.26,
+91.88,91.16,95.45,93.78,97.93,92.47,92.37,97.58,95.53,94.80,
+96.39,97.81,98.16,99.58,98.94,97.10,98.39,98.72,103.06,94.89,
+97.73,97.28,97.95,96.49,103.43,100.56,100.11,95.67,100.57,101.38,
+101.85,102.63,100.64,105.25,102.90,104.44,101.08,103.74,104.34,102.04,
+101.86,103.39,106.26,104.49,103.96,100.66,104.29,105.97,103.63,104.35,
+104.04,102.43,105.97,107.12,100.63,106.58,103.35,105.93,111.35,105.14,
+21.12,20.87,21.92,23.26,24.59,25.23,24.29,26.24,27.11,27.18,
+29.34,28.78,30.25,30.09,30.32,31.18,31.28,33.58,31.22,32.49,
+34.97,33.74,35.02,36.27,36.65,36.84,38.51,37.05,38.67,39.33,
+39.45,40.70,41.31,40.13,40.25,40.83,43.62,42.86,43.61,42.58,
+43.46,44.20,44.69,45.99,45.98,45.71,46.46,46.89,46.91,46.33,
+48.66,48.90,48.58,49.45,47.33,49.15,48.70,48.64,49.29,52.90,
+49.35,53.22,49.46,54.97,52.66,52.14,50.62,54.28,53.80,53.43,
+55.35,54.27,53.42,54.50,57.80,55.45,59.36,57.13,58.66,57.20,
+59.01,58.30,56.68,58.58,60.91,62.25,60.32,60.09,59.72,59.29,
+62.10,60.84,64.08,62.57,62.46,61.44,62.03,66.00,62.57,62.80,
+62.93,65.25,67.01,66.65,66.49,65.75,66.42,66.78,70.11,67.72,
+68.19,71.29,65.00,67.46,65.38,69.58,72.85,69.19,67.35,68.94,
+69.65,70.27,70.56,71.79,71.48,72.92,70.91,73.77,70.01,71.81,
+74.89,71.44,73.61,74.87,73.48,76.46,72.55,75.02,74.34,74.86,
+74.28,77.81,75.55,75.20,76.57,75.78,73.83,78.26,76.98,76.53,
+77.21,77.65,77.09,79.12,78.57,76.79,80.86,75.76,77.43,81.24,
+79.68,82.66,79.41,82.71,80.91,81.18,84.31,81.53,78.62,83.66,
+83.62,80.06,86.44,83.38,82.61,82.81,83.60,81.81,86.86,87.10,
+87.36,84.30,88.31,86.55,83.60,88.19,85.36,85.90,84.25,87.70,
+85.34,85.25,86.83,88.29,88.55,91.69,88.03,88.43,90.46,87.20,
+87.95,87.41,92.13,86.13,89.60,88.20,88.44,88.04,90.07,90.45,
+93.29,92.17,92.69,91.12,97.44,91.80,92.62,91.32,89.73,91.61,
+92.33,93.20,93.28,93.30,95.00,95.20,94.33,95.25,93.65,95.24,
+95.04,96.14,97.48,98.30,96.12,92.34,93.39,98.02,95.66,97.30,
+92.89,99.48,100.86,102.31,101.42,96.10,97.16,97.46,102.00,95.62,
+98.60,100.25,100.05,96.81,100.60,97.13,98.76,99.62,103.57,100.85,
+102.13,97.06,107.17,103.37,101.16,98.39,103.72,103.04,104.01,102.19,
+99.12,95.25,100.66,106.10,101.33,100.73,102.50,105.33,104.61,106.91,
+106.23,101.15,107.21,105.49,104.03,104.92,103.39,109.18,108.14,106.19,
+20.03,22.03,21.47,22.15,23.44,24.73,25.52,26.66,26.85,27.72,
+28.65,27.59,28.76,29.12,30.78,31.44,31.33,31.85,33.54,33.23,
+33.53,32.57,35.49,36.33,34.99,37.07,39.07,39.51,38.85,36.43,
+38.00,39.97,38.32,39.31,39.22,39.45,41.98,42.26,42.04,44.45,
+43.16,45.99,46.39,44.89,43.21,45.94,44.90,44.05,46.41,46.87,
+46.07,48.51,46.79,47.97,50.03,49.05,49.06,49.87,48.45,51.34,
+52.54,51.73,50.44,51.61,53.58,54.82,55.52,54.21,51.66,53.17,
+54.31,53.34,55.39,54.39,54.98,57.13,57.57,56.72,57.20,57.52,
+56.47,56.87,58.10,58.72,61.09,56.65,59.20,60.03,60.47,61.22,
+61.17,60.44,63.35,62.10,61.32,62.31,60.95,64.58,63.22,63.50,
+62.31,65.13,63.43,66.47,66.61,63.17,62.31,66.02,65.52,66.94,
+64.09,68.08,67.82,68.35,65.13,70.81,67.73,65.96,67.31,68.65,
+69.70,69.96,71.71,73.44,70.54,70.09,70.47,72.14,73.16,71.13,
+71.17,72.97,72.69,70.61,71.01,74.15,71.17,78.36,72.97,73.98,
+73.06,74.20,73.71,76.06,72.93,76.66,75.03,74.56,76.07,75.19,
+77.89,77.14,76.74,81.64,79.21,79.19,77.04,80.34,78.79,79.71,
+80.28,82.95,80.85,80.78,78.45,78.89,82.24,83.41,82.15,80.46,
+84.49,82.62,81.40,82.89,82.53,84.79,85.10,84.44,86.36,86.67,
+81.79,81.80,86.49,87.38,86.42,84.98,82.68,82.42,82.14,86.72,
+87.69,88.58,87.39,86.27,84.92,90.67,86.33,87.49,86.11,88.16,
+86.77,90.06,92.15,89.17,89.65,89.95,91.87,88.91,92.19,90.02,
+85.39,93.53,90.21,92.85,89.77,93.04,91.95,94.14,94.02,92.75,
+93.54,92.49,93.80,90.18,93.81,90.67,89.91,94.49,90.63,95.62,
+94.88,95.87,96.85,95.98,94.03,93.02,94.72,96.09,98.23,95.68,
+97.11,95.53,94.67,98.48,94.01,100.26,100.95,97.51,92.11,96.61,
+99.65,100.20,94.94,100.77,97.65,93.14,96.60,99.72,102.00,103.19,
+97.10,100.51,100.24,100.19,97.54,101.14,98.54,99.94,103.78,100.48,
+104.70,98.74,108.46,106.10,104.55,102.77,102.08,102.49,104.53,107.29,
+104.07,102.34,104.21,99.70,103.12,105.95,100.65,105.19,105.59,105.34,
+19.96,20.42,21.98,22.27,23.46,25.03,24.45,26.10,27.58,26.85,
+27.92,27.88,28.94,27.94,31.03,31.72,30.31,32.55,33.77,33.19,
+35.08,33.67,33.59,35.39,36.59,34.50,35.90,36.33,38.41,38.34,
+37.61,38.01,41.04,40.02,41.67,39.71,39.52,43.17,41.30,42.78,
+40.87,43.45,43.61,45.78,45.37,46.71,44.91,45.10,45.86,45.07,
+46.17,47.31,47.61,46.34,49.68,49.11,48.26,50.37,48.21,49.37,
+50.71,50.39,50.55,52.11,51.29,51.56,52.65,54.40,55.45,54.34,
+54.06,53.65,53.37,53.62,53.66,56.58,54.72,58.68,57.34,56.58,
+55.42,58.73,55.67,57.99,58.20,55.78,59.19,59.28,60.38,56.26,
+61.59,59.08,60.03,61.83,60.16,60.80,60.19,60.15,61.61,63.47,
+64.43,65.42,63.08,64.02,64.14,62.81,63.53,66.34,65.28,64.19,
+68.70,65.18,66.36,66.20,70.19,67.46,67.63,68.91,68.01,68.02,
+66.63,68.02,72.29,69.67,69.26,70.48,72.09,69.82,70.25,71.89,
+70.75,72.21,73.72,69.04,69.32,72.48,74.75,70.32,75.34,71.04,
+71.07,75.87,74.83,74.33,75.94,75.09,74.81,74.61,76.81,74.73,
+75.23,74.88,74.13,76.11,73.18,79.53,76.99,79.34,79.42,76.91,
+77.63,76.93,77.81,77.50,78.38,76.36,79.07,80.82,79.00,77.60,
+83.00,83.81,83.57,81.12,79.70,82.26,80.58,82.62,82.10,81.17,
+82.40,81.43,82.82,81.35,85.40,83.31,83.91,86.71,82.49,84.26,
+86.54,83.47,83.52,85.71,88.41,86.15,89.25,83.24,86.21,88.10,
+89.17,86.56,85.00,88.63,89.30,87.91,85.80,89.07,87.65,86.17,
+89.86,88.26,88.36,91.40,87.98,89.59,87.94,89.41,91.90,88.50,
+93.13,91.90,92.29,90.42,93.06,93.69,93.71,89.33,94.74,91.68,
+96.08,92.10,90.83,91.69,92.63,91.45,98.11,94.41,95.29,95.05,
+95.56,92.83,95.37,93.20,94.96,99.02,94.17,97.01,94.39,96.93,
+98.15,97.24,96.96,97.89,101.23,98.37,100.01,98.04,98.08,96.13,
+101.30,99.24,99.06,102.65,99.96,100.28,99.51,98.69,96.46,96.98,
+98.63,102.31,98.90,100.51,102.68,102.85,101.93,107.17,98.54,101.31,
+102.09,104.30,102.48,103.17,103.00,103.70,106.30,107.19,103.60,100.07,
+19.11,20.71,21.23,21.25,22.32,22.52,23.31,24.43,25.33,27.08,
+27.69,26.96,28.05,28.65,29.30,29.87,29.26,31.54,31.22,31.46,
+32.86,33.49,33.44,34.04,34.18,33.95,36.03,36.34,35.70,37.94,
+35.93,38.77,37.86,38.17,39.63,39.29,39.96,39.35,38.69,41.84,
+41.58,41.58,42.95,42.86,43.70,44.37,44.47,44.56,44.12,44.93,
+46.45,46.16,45.70,47.47,46.95,48.69,50.44,47.51,49.88,48.28,
+50.13,49.49,50.27,50.90,49.91,51.67,51.41,52.11,51.29,52.67,
+53.02,52.79,50.46,55.75,53.83,54.45,56.11,56.60,53.41,54.61,
+56.75,59.12,56.42,56.88,55.27,56.05,56.30,56.54,59.26,59.20,
+59.20,59.06,60.52,61.83,61.64,61.20,61.11,60.87,62.18,62.21,
+62.88,61.92,62.60,62.69,63.48,61.53,63.65,62.32,64.37,64.20,
+64.34,66.26,66.28,64.42,65.59,65.33,66.69,67.24,65.61,67.17,
+66.19,67.75,69.92,66.60,67.80,67.71,67.57,68.62,68.37,69.90,
+68.74,69.14,68.16,71.57,73.79,70.41,70.17,71.94,74.08,70.86,
+75.94,69.50,77.83,72.97,74.32,72.95,75.88,75.39,77.02,72.28,
+75.93,73.73,73.60,76.90,77.36,74.72,75.83,75.43,76.50,77.08,
+76.61,74.16,76.17,73.19,78.21,79.09,77.19,77.42,76.38,77.16,
+78.99,78.82,84.52,81.40,81.68,80.63,81.03,82.39,81.63,80.92,
+78.48,84.39,84.01,82.09,79.17,80.56,80.37,86.26,82.15,81.88,
+81.35,82.70,81.88,86.65,84.63,85.41,83.55,82.67,90.50,84.95,
+87.24,83.16,84.94,86.32,86.23,84.27,86.09,84.83,88.05,84.16,
+86.64,90.61,87.21,91.55,83.43,88.92,88.44,90.00,92.62,90.51,
+88.32,86.94,88.76,86.83,92.36,88.82,92.30,93.19,93.95,94.37,
+92.74,94.30,91.46,90.98,92.00,92.72,92.25,92.13,90.98,95.05,
+92.35,94.02,96.65,93.49,95.54,93.42,93.23,96.53,98.83,93.96,
+96.75,95.06,96.17,98.03,90.85,97.47,95.86,97.14,96.59,96.44,
+99.17,96.90,94.26,97.32,95.57,94.33,98.29,94.59,100.70,98.97,
+98.46,101.09,98.40,100.12,99.75,99.53,101.94,99.55,104.03,101.77,
+98.25,98.71,102.52,100.41,97.09,102.96,98.16,100.44,101.55,98.84,
+19.22,19.29,21.21,21.57,22.27,22.41,23.60,25.00,24.79,25.98,
+26.65,26.79,26.66,28.42,29.06,29.71,30.13,31.21,30.11,31.97,
+33.54,32.07,33.49,32.99,34.14,35.49,36.35,33.25,35.94,35.55,
+37.79,38.43,38.25,36.68,37.57,38.49,38.65,39.76,39.07,41.34,
+40.31,40.66,40.45,42.30,42.59,41.90,43.52,42.91,43.53,42.82,
+46.77,45.40,46.48,44.10,45.86,46.11,47.91,47.94,46.61,48.01,
+47.25,47.25,49.80,51.06,49.74,48.71,50.50,49.17,50.18,50.89,
+53.00,50.39,52.93,51.79,51.77,53.89,52.27,54.03,53.29,53.43,
+56.20,55.16,55.17,53.84,56.71,53.88,56.86,57.07,54.90,60.00,
+59.09,58.54,57.35,58.86,59.50,61.22,60.42,60.51,60.25,57.65,
+57.52,62.04,59.72,60.64,59.20,62.90,61.92,62.06,61.41,61.49,
+64.49,62.37,63.90,64.37,63.33,66.30,64.43,64.08,63.58,67.00,
+65.03,69.27,67.60,64.48,66.23,65.84,67.94,68.89,65.24,68.81,
+68.55,72.34,67.17,66.15,69.31,69.63,70.44,70.45,70.79,71.51,
+70.73,73.47,71.98,70.81,72.46,70.06,73.62,70.16,72.47,72.76,
+72.79,73.24,73.07,73.67,73.00,74.31,74.70,75.90,72.12,74.31,
+76.01,74.18,74.09,75.89,75.27,78.91,77.21,73.44,80.28,77.51,
+79.98,78.75,78.58,76.72,78.34,77.03,80.45,77.94,76.93,76.46,
+80.38,80.53,83.16,80.19,80.22,81.72,80.15,79.21,79.02,80.24,
+80.42,82.10,83.10,86.14,82.52,84.16,86.45,84.29,82.20,83.06,
+79.85,82.86,82.59,87.40,83.88,82.52,81.06,86.68,84.21,82.72,
+86.97,84.17,86.76,89.24,85.71,85.41,85.06,85.77,86.75,85.40,
+88.21,86.49,84.59,90.74,84.46,89.71,92.38,88.73,89.84,86.26,
+91.39,85.26,87.91,88.87,92.67,86.80,90.27,88.30,89.06,91.06,
+92.75,90.07,94.61,92.49,93.69,92.01,91.82,88.90,90.18,93.29,
+92.91,93.04,94.50,90.66,95.47,92.54,95.36,95.87,91.49,100.06,
+94.13,95.90,94.24,93.98,94.51,94.61,99.04,94.97,100.68,94.76,
+96.35,96.80,97.12,98.77,99.90,95.68,96.39,98.72,101.19,96.33,
+99.55,94.40,102.58,101.82,97.93,93.47,102.82,100.50,98.06,101.67,
+19.33,19.33,20.35,20.84,21.56,21.24,23.28,23.98,24.35,25.02,
+26.30,25.38,26.96,27.00,29.71,28.51,28.07,30.22,29.41,30.31,
+31.39,32.19,33.30,33.80,32.77,33.84,35.14,34.38,36.10,34.84,
+37.03,36.49,35.69,35.66,37.70,37.81,38.37,39.54,39.82,39.20,
+39.86,40.71,40.99,41.97,41.99,41.62,42.56,42.62,43.20,43.46,
+44.94,44.61,44.47,45.02,45.10,44.55,45.53,46.74,46.52,48.63,
+47.26,47.84,46.75,46.75,47.85,47.60,48.89,49.51,47.38,50.21,
+50.54,51.32,49.40,50.81,51.29,53.10,51.79,51.65,52.66,52.71,
+52.91,54.65,51.91,53.45,53.08,52.52,56.47,55.40,55.76,56.69,
+56.25,56.32,55.80,55.72,53.88,57.58,58.73,58.96,57.30,59.14,
+60.45,62.12,59.21,59.13,59.75,59.99,61.82,60.13,62.24,60.84,
+60.78,61.51,62.65,62.46,64.08,62.56,64.68,63.74,60.35,64.43,
+62.30,64.66,65.66,64.31,65.94,64.10,64.69,63.60,66.47,65.49,
+66.54,67.47,70.44,67.15,66.53,67.48,69.96,66.73,65.98,67.34,
+67.30,68.81,68.82,67.69,71.05,68.80,68.12,71.44,69.81,71.41,
+69.94,69.92,70.31,74.68,72.04,70.54,72.13,73.17,72.92,72.11,
+72.77,72.27,74.73,72.50,74.50,75.32,76.46,75.29,72.07,74.89,
+74.65,74.32,77.32,76.58,73.64,76.33,75.44,77.92,77.46,77.35,
+76.85,77.83,77.40,76.22,77.98,75.84,77.90,73.60,79.81,81.08,
+79.20,80.05,78.66,81.20,77.63,80.57,78.42,81.20,82.18,80.43,
+79.17,81.32,81.33,80.90,82.13,83.50,79.11,82.25,78.71,84.47,
+84.83,83.13,85.31,82.76,87.74,81.99,87.82,83.26,85.90,84.65,
+86.36,88.54,86.06,88.41,86.41,87.86,88.15,83.09,89.71,85.61,
+84.65,87.95,88.59,88.73,90.67,88.79,90.26,89.30,86.78,88.55,
+87.56,88.29,92.16,86.72,85.66,87.93,90.48,93.08,89.11,90.69,
+90.32,87.94,88.94,89.45,92.53,89.90,92.25,87.53,93.65,94.99,
+90.65,92.05,92.92,93.62,92.74,92.80,89.40,94.06,97.63,95.74,
+96.29,92.19,94.20,93.94,94.83,93.37,93.47,95.15,94.65,94.35,
+98.23,97.77,95.60,99.78,93.55,99.28,95.81,100.11,95.19,95.71,
+17.92,18.69,19.72,21.22,21.05,21.46,22.21,23.33,24.32,25.07,
+23.87,24.49,25.36,26.53,27.13,27.67,28.48,28.21,29.14,28.91,
+31.63,30.05,31.41,32.62,31.57,31.76,32.14,32.54,33.09,34.07,
+34.99,36.52,37.02,35.88,36.84,37.77,38.41,38.58,38.69,38.62,
+39.00,38.28,40.84,39.86,40.41,41.63,41.02,38.85,41.37,42.05,
+41.96,42.25,42.39,43.13,44.97,40.99,44.96,44.75,45.58,45.48,
+45.08,45.21,47.35,46.49,46.61,48.62,46.99,49.57,48.29,49.39,
+49.31,49.82,50.92,51.24,49.96,50.10,50.19,51.47,51.66,51.32,
+52.05,51.01,51.88,52.46,54.12,53.17,53.98,53.72,54.08,54.43,
+53.01,54.17,53.97,56.39,54.42,57.17,57.32,54.41,54.58,56.22,
+56.76,55.74,56.62,56.89,60.69,61.38,59.33,58.15,58.63,60.56,
+59.64,60.22,57.91,58.45,60.98,60.88,62.99,61.56,60.48,62.94,
+61.08,60.26,61.35,62.38,62.04,62.43,62.10,65.48,63.00,63.59,
+63.56,65.56,64.81,65.29,63.05,65.52,65.67,66.04,65.18,68.48,
+67.20,67.18,67.62,66.58,69.67,69.29,70.68,69.15,67.50,66.21,
+68.29,73.36,67.63,69.92,69.66,67.89,72.30,68.94,70.85,68.51,
+71.70,71.17,71.46,72.69,72.38,69.43,70.51,72.66,75.00,74.46,
+72.87,74.40,74.18,74.36,73.14,74.07,73.50,72.92,73.39,77.23,
+74.40,78.00,77.46,73.76,74.48,77.20,74.43,78.99,70.84,80.65,
+76.18,78.90,76.75,78.74,78.48,76.46,80.10,79.10,76.82,78.04,
+76.43,76.10,80.40,81.08,78.21,81.74,83.02,78.75,79.92,81.06,
+79.26,80.65,81.23,83.19,83.21,82.80,82.05,79.16,80.12,79.75,
+82.50,80.35,81.85,81.08,82.38,85.31,84.62,83.54,81.44,82.76,
+83.47,82.00,86.08,83.70,86.35,84.34,83.77,86.12,87.99,83.24,
+84.84,85.85,90.77,85.44,86.92,87.24,87.40,86.36,89.09,86.09,
+85.78,88.68,90.36,92.61,84.76,90.17,88.78,90.82,89.90,89.08,
+89.77,87.95,88.47,90.25,90.91,88.52,92.42,93.54,87.07,89.76,
+92.54,92.91,92.49,93.25,91.55,91.34,92.58,93.20,93.71,92.18,
+91.23,91.97,88.17,94.22,94.23,92.39,90.12,92.20,93.49,92.08,
+16.28,19.07,18.23,19.02,20.72,20.48,21.51,22.60,22.29,22.89,
+24.21,24.47,25.99,24.97,24.38,26.68,26.89,27.99,29.48,30.47,
+28.94,28.33,29.56,31.18,30.70,31.58,31.15,31.89,32.54,32.06,
+33.24,34.15,33.04,33.99,35.67,34.44,36.26,37.56,34.93,36.16,
+34.95,37.28,37.79,38.52,37.97,39.69,39.84,39.41,39.73,38.16,
+41.19,41.68,40.17,43.41,42.89,42.19,41.95,42.88,42.60,43.62,
+44.78,42.59,44.35,45.87,44.44,44.18,44.88,47.10,46.00,46.70,
+46.97,47.05,47.17,47.00,47.48,49.15,49.05,49.67,47.99,47.96,
+50.17,52.44,49.01,50.43,51.04,52.05,51.50,51.34,50.55,52.89,
+52.63,54.42,52.01,53.23,56.20,55.81,55.13,54.31,57.15,54.67,
+55.27,55.24,59.77,57.95,56.24,55.96,56.45,56.79,59.63,56.33,
+57.19,56.47,59.77,58.44,57.99,57.23,58.36,60.88,59.51,59.48,
+61.24,59.79,61.18,59.83,59.50,62.88,61.08,62.27,62.51,62.22,
+64.91,61.33,63.80,65.22,62.83,62.49,62.95,63.15,62.30,62.57,
+65.04,64.47,63.44,65.99,63.78,66.46,65.57,66.78,66.07,67.83,
+67.37,67.54,66.28,64.06,66.85,69.09,67.50,67.80,67.88,70.16,
+70.23,68.41,69.39,68.74,70.15,69.25,73.94,70.08,72.97,70.83,
+67.74,72.01,70.29,73.02,71.22,72.11,76.04,74.24,73.72,72.71,
+72.06,74.15,71.14,72.50,76.61,72.12,74.26,72.24,73.14,72.63,
+75.00,76.40,74.38,76.76,76.83,75.56,75.94,74.82,75.25,76.16,
+77.37,76.80,75.16,78.12,72.77,77.22,79.46,79.24,77.83,77.32,
+75.49,79.49,76.57,78.50,78.57,80.75,79.57,78.82,78.39,81.58,
+84.02,78.75,78.48,80.26,78.80,78.81,79.96,79.82,82.57,77.33,
+82.09,82.71,80.35,85.71,78.24,82.52,86.35,85.45,81.31,80.46,
+81.82,81.64,82.79,79.30,82.45,83.31,82.79,83.59,83.72,83.65,
+84.08,85.79,83.29,83.02,86.66,84.33,87.84,85.87,84.10,85.29,
+86.25,88.20,87.09,85.44,86.72,87.41,88.12,89.00,88.03,88.03,
+89.16,86.59,90.33,88.39,89.03,88.28,86.29,89.93,91.49,87.66,
+90.42,90.75,89.67,88.38,90.16,89.13,88.92,92.03,93.61,90.33,
+16.16,17.67,17.93,19.40,18.47,19.55,20.08,21.01,21.96,22.93,
+22.55,23.04,25.00,25.25,25.40,25.40,28.13,26.36,26.58,27.54,
+27.61,27.65,28.35,29.06,30.44,30.07,31.07,31.10,32.16,32.26,
+32.53,31.03,33.31,33.34,32.60,33.37,35.32,34.38,34.21,36.25,
+37.38,35.26,38.14,35.99,37.00,38.51,38.35,38.30,37.87,37.94,
+39.44,37.07,40.45,40.62,40.13,41.07,41.68,41.71,41.97,43.11,
+42.93,43.15,44.35,43.42,43.41,44.31,44.53,45.11,46.20,45.96,
+44.90,46.30,46.42,45.15,46.06,46.34,47.01,47.97,46.93,47.66,
+48.63,49.61,49.56,51.67,51.00,49.73,49.26,51.63,50.27,51.62,
+52.51,52.49,52.26,51.51,53.17,51.40,53.89,53.92,52.73,52.75,
+55.00,54.67,49.34,54.01,53.91,53.95,55.19,54.37,54.48,55.94,
+54.03,54.83,56.77,54.87,58.47,53.82,55.85,57.53,57.65,57.66,
+59.27,59.51,59.76,56.92,59.19,58.11,60.06,61.21,60.26,61.14,
+60.25,60.69,60.90,61.29,60.61,60.40,62.31,62.28,60.36,62.85,
+60.04,62.21,61.73,64.36,60.49,61.34,61.63,63.91,63.01,61.58,
+64.26,63.80,65.61,66.34,65.28,64.25,63.98,66.52,68.39,63.69,
+65.45,66.37,67.19,65.43,67.50,64.25,67.56,64.55,68.27,68.86,
+70.06,68.73,70.07,69.50,67.39,69.48,69.54,71.36,72.43,70.85,
+66.85,71.91,71.17,70.27,72.35,69.07,73.00,70.46,68.86,68.17,
+70.29,74.06,70.65,72.57,71.02,72.82,71.22,74.29,72.10,74.28,
+72.70,70.53,73.11,72.69,75.87,76.30,78.17,73.04,75.92,76.25,
+79.12,77.38,76.00,72.04,74.18,76.64,76.59,77.35,74.70,75.18,
+78.69,77.64,78.23,78.74,79.92,76.53,76.61,80.43,78.96,79.29,
+78.58,77.06,80.05,79.21,79.49,80.43,78.23,80.37,80.23,79.16,
+80.81,82.15,80.40,77.92,78.53,83.35,86.37,82.46,81.68,79.76,
+80.10,82.86,82.28,83.32,83.03,80.60,80.84,81.59,83.04,85.07,
+82.60,81.50,82.22,82.17,82.15,86.00,83.07,85.33,85.25,85.27,
+87.66,84.43,82.18,86.47,83.61,82.83,84.73,88.19,86.05,84.45,
+89.08,84.78,86.05,86.26,84.42,87.97,87.87,92.37,88.40,85.38,
+17.82,19.44,18.44,21.19,21.52,21.42,23.46,22.63,22.92,25.02,
+25.87,26.28,25.96,26.61,26.56,28.59,28.30,29.49,29.94,29.57,
+29.48,29.64,30.82,31.80,31.47,31.77,32.02,33.18,32.97,33.76,
+33.63,34.96,35.64,36.60,34.33,36.27,36.76,37.08,36.77,37.80,
+38.46,39.06,38.99,39.71,38.42,41.18,39.83,40.15,40.77,39.48,
+41.51,43.45,42.53,42.83,43.77,42.94,47.13,45.04,43.83,43.85,
+45.62,45.31,43.92,46.16,45.37,46.19,45.95,47.45,47.75,47.74,
+46.04,50.45,48.61,47.07,46.71,49.20,48.65,49.82,49.12,51.92,
+50.69,53.71,50.14,53.78,50.57,50.73,53.09,54.68,52.14,53.90,
+52.51,55.13,54.48,52.99,54.69,56.82,54.20,53.73,55.84,57.09,
+56.29,56.16,52.67,58.67,57.73,59.33,56.66,59.09,59.88,58.61,
+57.61,57.37,61.06,58.91,60.89,60.04,59.65,59.38,60.55,59.35,
+60.69,61.79,62.24,61.90,64.33,65.56,61.37,61.96,65.35,63.56,
+63.07,60.88,61.46,62.93,65.21,64.91,65.77,63.88,63.28,66.05,
+65.68,65.93,64.80,65.68,65.00,67.12,65.43,64.03,66.23,66.52,
+66.86,67.27,68.92,65.35,67.32,68.71,70.87,68.56,69.11,69.79,
+70.16,67.65,69.68,68.06,68.67,67.59,67.64,71.68,73.05,75.39,
+68.24,72.95,70.90,70.73,73.16,73.55,74.28,70.85,74.45,73.70,
+72.82,73.84,70.64,70.81,74.31,73.94,74.50,72.59,73.68,73.06,
+71.31,75.61,74.91,77.60,77.04,76.44,73.83,75.41,77.87,80.65,
+78.55,76.95,76.27,76.20,74.66,81.53,76.54,75.97,80.19,76.05,
+79.69,79.10,79.61,77.42,81.67,81.94,77.97,82.94,82.02,82.94,
+77.63,81.16,82.11,82.97,79.48,78.76,81.76,84.55,82.22,78.84,
+80.96,83.26,80.39,82.60,82.16,86.03,86.68,82.45,82.11,84.81,
+84.78,82.10,84.48,84.11,84.11,87.48,85.68,85.87,85.47,86.05,
+82.49,86.35,88.13,87.36,87.19,90.89,85.91,87.48,86.81,87.54,
+83.05,90.36,86.85,87.12,86.32,88.04,90.28,88.47,89.52,85.31,
+88.96,91.95,87.50,91.79,91.24,88.59,90.86,90.01,87.06,86.41,
+90.09,87.61,87.18,92.92,92.86,89.98,86.01,90.42,89.77,90.35,
+18.91,20.23,21.28,21.20,22.98,22.73,23.80,24.23,25.36,25.25,
+26.94,27.51,27.93,27.64,29.57,29.09,30.00,29.16,30.78,32.38,
+31.89,31.56,33.61,32.70,34.69,34.88,34.89,34.30,36.16,37.47,
+37.08,36.07,37.15,37.59,38.34,38.19,39.25,39.73,39.69,39.80,
+41.27,40.04,40.08,43.30,41.67,42.78,43.72,42.70,41.91,42.80,
+44.44,44.99,45.23,47.05,47.85,45.63,46.23,47.53,47.26,46.64,
+47.15,49.47,49.68,49.76,49.08,50.79,47.46,50.52,49.70,49.84,
+51.96,51.52,51.55,50.37,52.87,51.01,53.39,52.57,53.33,52.81,
+54.66,56.72,55.79,55.20,54.54,54.61,56.95,54.47,56.97,56.32,
+57.47,56.96,58.27,57.42,58.25,57.42,57.45,57.29,58.79,59.88,
+60.12,59.95,59.99,61.78,61.14,59.90,60.86,59.80,64.14,63.57,
+63.03,63.19,62.34,62.65,63.91,63.57,62.88,61.36,62.37,63.69,
+62.54,64.58,65.62,64.20,66.94,67.14,66.47,65.44,63.68,67.30,
+66.34,70.10,67.37,67.69,66.40,67.36,69.34,67.00,68.44,67.73,
+70.78,69.61,71.56,67.90,69.79,71.93,67.83,71.63,71.31,72.80,
+72.29,74.29,71.39,71.84,72.70,74.95,72.01,74.61,72.75,74.45,
+75.20,70.95,74.18,73.57,77.50,74.63,76.15,72.65,77.38,72.83,
+78.92,72.68,75.00,77.71,76.26,77.19,77.57,79.07,79.05,77.76,
+77.04,79.45,81.75,72.93,77.93,78.84,80.57,82.95,80.01,78.20,
+78.86,78.51,79.40,79.29,79.02,77.85,79.58,79.12,82.44,83.71,
+81.79,85.13,81.16,83.47,80.20,83.34,82.85,89.32,82.44,86.14,
+79.80,82.46,83.43,86.79,84.73,81.66,87.37,84.08,86.95,85.98,
+87.52,84.52,84.14,87.80,84.18,87.76,85.48,89.21,88.09,89.15,
+90.42,88.91,88.12,87.47,87.92,89.53,86.08,89.43,87.31,92.22,
+86.58,87.87,92.00,91.15,89.31,88.24,91.33,90.12,92.30,94.39,
+93.82,88.27,88.78,88.03,92.44,89.24,88.84,92.69,92.19,93.50,
+93.58,93.79,90.09,94.17,95.07,94.25,91.84,95.31,92.55,96.55,
+95.03,96.73,94.31,95.71,96.53,94.57,98.91,98.37,96.20,97.94,
+99.45,95.46,99.73,99.66,94.76,95.90,92.96,97.47,96.34,98.06,
+20.37,20.77,21.93,22.34,23.17,24.51,24.74,26.80,26.53,27.09,
+28.14,27.82,29.23,30.27,31.08,31.13,29.41,31.27,31.93,33.59,
+33.38,33.31,32.76,34.44,34.08,34.11,37.79,36.06,37.95,38.55,
+38.52,37.87,39.05,38.46,38.91,41.03,41.35,41.10,40.19,43.56,
+41.93,42.13,46.41,43.93,43.67,43.69,46.01,44.30,44.83,46.21,
+45.68,47.77,47.12,47.11,47.91,46.62,46.72,47.89,49.26,49.35,
+51.06,49.17,48.67,49.34,50.74,50.38,52.47,52.51,51.93,52.99,
+52.02,55.18,54.08,53.86,53.24,55.43,54.22,56.10,56.17,55.30,
+57.15,55.60,56.79,57.27,58.09,58.59,59.54,57.90,58.52,60.72,
+58.59,58.71,59.19,58.02,61.42,62.34,61.45,61.25,61.56,61.83,
+63.34,63.61,62.39,63.12,63.26,61.38,66.52,60.87,65.48,66.43,
+64.91,63.54,66.14,65.90,64.40,66.70,68.44,68.65,66.70,65.32,
+71.17,66.86,68.87,66.65,69.38,68.35,69.48,66.80,73.22,70.18,
+72.71,71.32,70.63,70.65,70.57,72.69,72.15,71.03,72.23,73.38,
+72.86,73.39,73.50,73.65,71.23,73.16,72.77,73.93,73.90,75.02,
+74.12,73.22,72.68,78.11,77.34,76.35,75.23,76.61,77.22,79.46,
+74.46,78.97,78.26,77.39,76.93,74.87,75.84,81.67,78.41,76.01,
+80.02,79.99,81.93,78.32,80.22,80.25,80.61,79.62,82.24,79.05,
+82.17,79.09,82.45,80.85,79.08,82.00,85.00,82.10,80.20,81.91,
+83.95,85.31,82.28,81.13,84.13,81.55,83.91,85.77,82.73,87.35,
+86.65,84.98,87.93,86.75,85.71,84.11,85.37,89.32,87.02,91.72,
+87.77,87.28,87.85,86.87,89.94,86.64,89.41,91.38,92.83,89.07,
+92.57,91.42,90.89,90.08,86.35,86.36,90.54,91.35,93.49,94.33,
+89.24,92.23,91.83,94.56,92.11,91.19,94.51,91.87,93.78,93.18,
+97.27,87.46,91.19,94.72,93.78,91.46,94.50,95.19,96.06,93.72,
+95.77,95.25,100.00,97.52,95.17,96.14,92.55,100.95,97.74,100.67,
+92.19,93.59,97.38,98.93,98.08,99.10,99.12,97.57,97.24,98.13,
+100.96,96.89,98.41,96.83,98.18,100.59,97.85,99.35,99.45,99.11,
+101.52,105.16,101.38,98.09,100.95,102.46,101.21,98.77,99.95,102.83,
+20.28,22.05,21.84,23.15,23.76,24.93,25.72,26.60,26.03,26.71,
+28.33,29.50,29.43,30.27,30.06,30.61,32.59,32.00,33.00,33.95,
+34.58,34.50,34.09,36.14,36.28,35.40,38.41,37.97,38.93,38.33,
+38.95,39.42,39.39,41.72,41.89,41.34,42.24,43.23,43.85,42.90,
+43.28,44.81,44.39,45.21,44.82,44.99,46.21,45.75,47.16,46.76,
+48.99,48.07,49.47,49.11,47.49,49.04,52.18,50.98,50.92,50.10,
+52.12,53.45,52.89,52.85,53.93,53.16,53.43,54.45,52.99,55.80,
+54.82,53.36,54.07,53.19,57.21,56.10,56.33,58.54,58.59,59.71,
+58.61,59.04,56.79,59.10,56.99,58.47,60.85,58.88,58.26,60.93,
+61.12,58.59,63.05,64.04,62.17,61.52,64.72,61.38,62.52,63.26,
+62.20,62.35,65.81,62.37,68.09,63.50,65.56,67.19,68.18,67.63,
+67.12,69.80,65.23,67.57,65.90,69.72,67.89,70.46,65.94,70.73,
+68.85,68.46,71.79,71.04,69.00,68.40,71.74,74.04,67.99,72.07,
+74.20,72.15,72.46,70.76,75.22,74.62,72.63,74.98,77.66,77.54,
+75.76,75.56,76.57,78.62,74.85,73.43,76.61,76.48,79.89,76.04,
+78.11,77.74,77.49,80.99,75.70,75.83,79.77,78.06,78.60,78.40,
+78.47,80.89,79.70,82.05,81.75,80.47,81.86,80.72,79.02,82.51,
+82.66,83.01,82.67,84.31,81.19,81.75,87.58,85.72,86.06,84.82,
+86.93,82.10,85.14,84.24,83.13,85.42,85.10,85.17,84.83,84.76,
+86.80,86.64,85.69,86.28,93.27,91.32,86.48,83.34,89.48,92.02,
+89.33,86.72,89.00,91.70,89.91,92.95,89.82,87.90,89.32,91.02,
+86.01,88.42,92.12,95.48,91.88,92.90,92.52,89.19,96.84,90.50,
+92.28,93.51,93.36,90.79,94.11,92.39,90.59,90.60,95.55,92.20,
+94.23,95.28,97.12,91.99,91.96,93.22,92.83,93.99,98.07,95.76,
+98.04,94.34,92.45,94.33,95.13,95.15,96.14,94.57,96.99,95.40,
+96.31,97.66,93.96,97.03,102.71,101.08,102.27,100.14,97.66,98.26,
+98.93,101.09,102.90,102.53,99.77,103.32,100.83,97.99,103.27,99.71,
+100.06,105.72,100.91,100.17,101.59,101.82,102.76,100.51,103.29,104.63,
+108.54,100.80,103.58,105.54,107.75,105.91,103.03,108.73,110.84,104.46,
+21.94,22.01,22.74,23.49,24.14,25.02,26.18,26.31,26.92,29.15,
+28.20,30.31,29.77,30.73,31.90,31.92,34.01,33.22,34.00,35.06,
+34.05,35.41,35.46,38.66,37.24,38.26,36.53,37.79,38.99,39.47,
+39.96,41.11,43.32,41.53,42.43,43.50,43.16,43.61,42.84,42.83,
+44.76,45.98,47.37,45.83,46.66,47.18,48.13,45.03,46.37,47.44,
+49.04,49.16,49.78,50.67,52.03,48.64,51.68,52.23,51.39,51.89,
+51.82,53.71,56.74,53.54,53.58,54.79,55.42,54.97,54.48,55.28,
+56.43,58.04,59.70,59.64,55.42,55.59,58.06,58.81,58.19,60.72,
+61.08,59.16,60.36,61.49,60.30,60.84,58.97,60.30,62.93,62.58,
+63.65,61.27,63.46,64.30,62.45,62.95,62.90,65.84,63.32,63.36,
+65.70,65.34,67.33,66.95,66.26,67.83,67.08,64.76,66.22,68.52,
+67.14,68.19,69.58,67.93,70.21,70.77,73.11,70.01,71.59,70.19,
+71.87,72.49,70.23,72.50,71.45,73.43,74.20,73.85,74.38,74.69,
+72.22,72.95,71.60,74.77,78.98,77.58,73.83,74.81,77.18,74.28,
+75.73,75.89,79.39,78.61,81.30,80.81,79.80,77.64,75.43,79.61,
+78.90,80.51,79.51,83.45,79.02,78.76,80.81,80.09,82.50,80.22,
+80.75,83.96,83.61,81.99,84.80,85.09,82.92,82.38,81.77,82.36,
+83.97,85.59,83.80,83.30,84.30,85.95,83.62,86.78,86.38,85.13,
+87.62,85.51,86.15,85.88,86.18,85.27,88.49,89.84,89.57,87.30,
+88.32,87.79,91.75,89.96,87.13,88.66,93.19,88.44,92.72,88.93,
+88.73,88.94,89.58,91.94,93.09,92.13,87.43,92.47,91.01,94.26,
+91.73,93.55,93.82,94.24,94.71,93.76,97.82,98.29,94.52,94.32,
+97.32,91.38,94.81,95.14,97.22,97.41,96.97,95.34,97.26,100.48,
+97.60,95.27,95.99,96.38,98.62,96.33,94.37,101.01,94.22,96.21,
+95.42,95.11,100.42,99.88,100.69,98.78,97.72,103.45,100.76,101.80,
+103.94,101.19,98.48,101.57,104.36,97.64,100.82,102.64,99.39,100.86,
+102.31,98.73,98.65,103.93,102.76,104.23,100.63,105.96,102.34,104.10,
+103.88,108.74,104.45,106.32,102.51,104.38,104.70,102.29,110.20,110.91,
+106.99,106.61,108.50,106.44,100.65,101.45,108.12,110.17,105.68,109.04,
+21.52,22.50,22.81,24.67,24.71,24.90,25.53,26.25,27.20,27.56,
+28.55,29.34,30.46,31.72,31.94,32.35,34.73,33.95,33.41,34.37,
+34.65,35.81,37.24,37.33,37.79,37.29,37.68,39.60,39.90,39.67,
+40.32,40.94,41.61,40.83,43.64,43.02,43.83,42.81,44.81,43.28,
+44.96,45.48,45.78,46.01,46.55,46.52,48.45,47.86,49.50,47.52,
+49.15,48.30,50.98,51.89,50.27,53.06,52.12,50.97,52.57,54.64,
+56.87,55.79,53.79,53.82,52.87,55.60,55.51,55.59,54.56,55.68,
+55.87,56.04,56.33,59.83,55.90,58.20,58.66,59.85,60.16,60.29,
+59.13,60.16,59.96,59.81,60.39,62.40,62.51,64.58,63.63,65.56,
+63.38,64.94,65.94,62.19,66.18,64.77,65.10,67.65,63.80,64.14,
+65.53,65.44,69.49,69.85,64.59,68.48,68.12,70.89,66.83,67.72,
+67.11,68.81,70.97,69.39,70.70,70.79,70.75,69.98,74.08,73.41,
+74.60,68.01,72.36,73.21,72.50,73.84,76.36,74.23,75.41,76.07,
+74.30,72.34,75.33,74.39,79.34,74.29,74.85,77.18,78.28,76.11,
+76.87,80.47,77.08,77.75,79.90,77.80,79.79,80.89,79.00,79.93,
+78.82,81.51,81.18,77.59,80.63,81.42,83.35,81.02,79.86,79.85,
+79.93,83.99,82.36,84.11,82.09,81.85,83.92,84.30,86.21,87.16,
+81.54,88.00,84.10,88.91,83.44,87.69,90.51,85.82,83.08,83.82,
+88.80,88.57,90.40,86.74,89.83,87.04,88.48,85.55,90.00,87.08,
+88.50,91.14,94.07,88.33,89.02,91.48,90.98,89.13,90.55,88.90,
+92.68,91.00,93.34,91.83,90.71,93.85,89.12,92.28,92.36,92.52,
+95.47,90.88,97.95,97.99,91.97,94.81,96.40,99.21,91.22,96.13,
+97.32,94.33,97.91,94.00,96.31,92.74,96.67,98.73,93.65,97.47,
+97.44,97.31,98.04,101.18,100.35,100.42,96.85,100.96,101.01,99.47,
+96.35,99.87,102.07,100.94,96.41,103.17,101.76,100.18,102.30,99.72,
+103.11,103.38,103.80,103.72,101.36,102.45,101.23,104.49,101.71,107.15,
+104.83,100.15,103.85,99.54,100.84,106.96,103.82,100.78,104.77,106.06,
+105.59,105.67,105.79,107.92,104.92,108.48,104.42,107.82,108.90,109.19,
+111.44,108.26,107.83,108.32,116.42,110.11,109.60,108.14,108.72,106.91,
+21.28,22.41,22.94,23.79,25.32,24.82,25.84,26.92,27.90,28.32,
+30.07,30.20,30.24,31.24,32.79,32.66,33.82,33.96,34.75,34.72,
+35.61,35.60,37.99,36.91,36.61,38.00,39.03,40.36,39.17,39.52,
+41.41,42.60,42.45,42.44,43.49,42.63,43.73,43.14,43.47,47.46,
+45.17,45.41,48.82,44.74,45.51,48.60,47.35,48.48,49.02,49.01,
+51.35,50.94,49.64,52.02,51.07,53.02,51.20,52.63,53.26,52.73,
+51.49,55.51,53.63,54.21,54.74,53.46,57.66,57.63,58.03,54.33,
+57.77,57.43,60.22,58.11,61.97,59.11,59.11,60.98,58.73,62.16,
+59.88,62.32,63.01,61.62,62.24,63.82,64.34,63.01,62.01,63.13,
+62.44,65.10,66.65,64.84,64.59,64.79,67.41,65.34,65.78,66.43,
+67.76,66.00,69.36,69.66,65.78,67.70,68.31,72.38,68.14,67.48,
+70.75,70.80,70.54,71.36,72.45,72.31,75.15,71.56,68.84,71.34,
+74.76,75.21,75.09,74.93,73.81,71.65,72.31,74.61,76.06,74.70,
+73.85,77.26,77.98,77.06,76.23,75.01,75.61,74.69,78.72,78.56,
+75.99,80.45,78.61,77.50,80.39,78.03,79.35,78.33,82.36,79.87,
+82.98,82.43,81.63,83.59,80.56,84.32,82.29,83.91,80.98,81.75,
+83.17,85.93,82.82,87.60,81.94,82.87,85.64,85.95,87.61,85.90,
+85.38,83.99,88.90,86.07,90.23,85.35,88.49,85.08,88.87,84.57,
+86.69,84.45,89.94,89.04,87.68,90.33,90.89,88.49,91.43,90.64,
+90.63,87.83,88.29,91.19,87.92,91.48,90.89,95.81,91.57,90.99,
+93.52,90.47,91.99,91.04,95.07,95.31,92.82,93.34,97.01,94.64,
+95.12,95.12,94.92,94.69,100.86,97.37,93.39,97.32,95.52,98.20,
+98.08,90.77,95.66,98.92,96.45,99.56,93.75,97.57,97.90,98.39,
+96.69,99.88,100.34,101.76,97.81,97.55,98.88,91.96,97.38,99.91,
+101.30,98.91,98.54,104.76,102.44,101.20,100.96,104.58,99.79,105.25,
+102.03,101.94,103.06,100.84,100.76,102.34,108.08,102.61,108.86,102.61,
+103.94,102.58,105.40,109.82,103.95,104.05,107.82,104.71,109.94,106.78,
+107.46,109.97,105.80,104.81,108.12,105.65,105.44,107.52,110.21,108.11,
+111.10,108.59,106.99,109.08,112.75,114.15,108.62,114.50,110.56,108.78,
+21.27,23.22,23.34,24.64,23.96,24.57,26.78,28.24,28.16,29.04,
+30.24,30.29,30.87,30.65,32.15,32.20,32.98,33.69,34.54,35.22,
+35.27,36.25,36.24,37.02,37.86,38.51,38.54,39.74,40.80,41.53,
+40.37,41.13,43.13,43.10,42.70,42.66,44.18,42.73,45.59,46.50,
+45.45,44.79,47.88,47.38,44.99,47.84,49.03,47.26,50.39,49.60,
+48.74,49.10,51.09,51.34,49.43,51.23,52.12,52.08,55.25,52.75,
+55.30,53.36,54.97,56.65,56.64,55.22,55.59,58.05,54.28,57.39,
+57.53,58.49,59.11,60.31,58.95,58.79,61.39,61.14,58.73,57.89,
+60.05,62.68,60.99,61.97,62.78,64.05,61.87,64.06,64.58,62.10,
+63.03,67.22,64.92,66.25,65.21,62.91,66.62,64.25,63.97,68.29,
+65.28,70.26,69.26,70.30,67.63,68.89,72.24,69.69,68.52,69.98,
+68.03,69.26,72.98,71.71,69.13,71.44,72.17,70.03,67.99,73.86,
+74.91,73.83,69.48,75.22,73.94,72.82,75.12,74.39,76.87,75.41,
+76.04,72.26,76.35,76.81,78.07,75.49,74.43,77.85,79.63,77.42,
+79.08,78.82,80.35,80.29,80.36,78.10,80.40,77.73,80.99,78.87,
+80.45,80.04,81.71,81.48,79.29,81.81,81.15,82.26,83.88,82.91,
+85.05,85.04,88.01,82.68,84.44,84.72,84.24,83.58,86.46,86.40,
+85.81,86.57,86.90,88.17,85.30,87.38,85.25,85.46,92.23,90.79,
+92.90,90.02,91.37,90.09,91.23,92.90,91.38,94.04,88.19,86.38,
+92.12,90.91,93.93,89.91,88.54,89.41,92.07,91.14,87.05,91.24,
+95.43,91.16,94.46,93.91,95.19,91.48,99.53,88.40,93.53,98.05,
+94.70,95.95,95.47,98.63,98.13,98.47,91.85,96.20,93.57,98.24,
+95.18,99.07,98.74,100.54,98.56,98.61,95.07,100.65,95.65,100.59,
+99.72,98.45,96.15,96.46,100.64,100.00,100.33,98.60,99.83,97.43,
+105.52,103.06,105.52,101.36,103.06,102.07,107.38,103.61,105.87,105.27,
+101.31,102.38,105.51,103.45,103.43,103.72,103.26,104.28,102.39,102.66,
+102.83,106.95,106.60,105.28,107.67,107.02,108.94,106.31,103.07,106.27,
+108.77,105.79,105.22,107.73,108.18,108.31,107.58,107.75,108.57,108.00,
+108.00,109.33,107.44,111.96,110.13,108.91,107.66,106.77,110.76,110.70,
+21.28,21.76,24.08,23.80,24.13,25.15,26.00,26.57,27.52,28.98,
+30.32,29.91,29.74,30.58,30.66,33.02,33.84,33.58,34.29,35.61,
+36.08,36.20,37.20,36.69,37.29,37.40,39.47,38.68,39.33,41.07,
+42.05,41.68,41.67,41.51,42.15,42.71,44.06,43.19,45.54,45.19,
+45.87,46.37,46.86,47.15,46.60,47.23,49.66,50.55,47.86,50.86,
+49.01,49.48,49.99,51.13,51.12,51.27,52.10,53.27,53.89,53.72,
+54.80,50.64,51.76,53.88,53.90,55.98,56.32,55.93,55.68,57.81,
+56.55,57.69,58.36,58.32,59.06,58.43,61.70,58.90,61.08,59.81,
+64.19,61.15,60.93,63.19,62.02,60.43,62.81,63.93,61.69,61.68,
+64.26,62.33,64.98,65.42,63.22,67.68,66.63,65.86,68.43,68.21,
+67.42,66.18,67.08,68.39,69.83,66.95,65.76,68.82,66.21,69.61,
+69.44,68.54,70.80,69.78,69.24,71.51,68.89,76.58,71.10,73.03,
+71.48,70.02,72.44,74.55,69.73,73.75,71.88,78.11,76.92,75.72,
+72.25,76.35,75.08,74.73,77.17,76.49,80.96,76.39,75.84,79.50,
+79.32,79.37,76.38,79.05,80.29,75.03,78.80,80.16,81.30,79.11,
+82.15,82.96,80.14,80.02,81.73,79.35,82.69,82.58,80.91,83.73,
+81.46,84.38,83.23,82.91,81.04,83.48,86.09,82.38,80.31,85.23,
+84.78,84.97,87.81,87.35,87.26,85.92,89.41,83.82,87.25,88.18,
+88.91,90.10,91.27,88.69,87.77,88.97,90.16,90.33,92.14,90.07,
+90.82,88.09,92.22,91.01,92.72,89.50,89.71,96.53,91.42,88.61,
+92.80,94.43,90.02,94.49,91.75,95.05,91.17,91.11,92.50,91.10,
+93.40,94.13,95.47,95.44,96.32,91.97,97.96,100.46,95.95,99.31,
+95.09,95.35,95.20,97.45,98.82,94.05,95.64,98.48,100.46,100.82,
+98.28,96.95,100.18,96.85,102.52,99.42,100.83,100.37,97.83,103.18,
+96.31,101.45,101.25,104.49,101.24,99.07,103.63,104.87,106.14,100.39,
+101.71,103.40,103.03,106.94,103.64,101.64,104.97,100.02,105.71,106.46,
+103.20,106.92,105.76,101.24,103.19,105.02,104.80,105.79,104.78,105.81,
+108.98,105.26,104.77,105.18,103.49,104.09,105.44,107.23,105.33,107.66,
+110.12,110.84,111.24,105.69,108.24,109.33,109.16,107.85,113.15,113.66,
+21.18,22.09,22.31,24.01,24.39,24.78,25.45,26.97,28.10,28.84,
+28.33,27.81,29.33,31.04,30.13,32.28,32.67,33.14,32.79,34.34,
+35.56,36.11,35.64,37.45,36.85,37.25,37.94,36.44,39.81,39.65,
+41.71,39.30,42.53,41.49,41.77,42.52,42.92,42.89,44.05,45.25,
+44.85,43.54,45.12,45.51,45.95,48.36,47.58,48.18,46.62,48.32,
+48.47,46.63,49.21,50.32,52.07,52.64,49.98,51.40,53.06,53.67,
+53.22,52.71,52.19,52.86,53.58,55.18,54.91,54.53,56.57,58.68,
+55.95,56.62,58.04,57.51,58.10,59.29,59.95,57.31,60.42,61.21,
+62.56,59.54,60.51,59.18,61.05,60.07,63.74,63.19,61.07,62.42,
+62.20,63.65,63.25,63.11,63.73,65.64,65.60,67.58,65.88,67.30,
+66.84,66.95,64.95,67.64,66.68,67.57,66.10,67.73,66.02,70.80,
+69.40,67.97,69.04,68.44,71.64,70.65,70.33,70.82,73.92,76.67,
+71.44,68.09,71.16,69.80,71.22,74.29,75.43,76.11,75.04,72.91,
+74.71,75.65,74.87,74.21,76.86,74.37,73.19,77.77,78.41,77.74,
+77.17,77.15,78.71,76.49,76.23,76.17,79.32,79.66,80.91,82.37,
+78.19,80.21,79.41,79.81,81.14,76.64,81.82,79.44,82.43,80.42,
+81.60,79.56,83.39,86.64,82.14,86.70,80.10,86.05,84.66,85.45,
+86.30,85.84,82.76,87.87,85.19,86.98,84.05,87.21,84.68,87.99,
+89.19,85.77,89.19,86.85,87.86,88.13,87.80,86.75,89.46,88.30,
+94.38,89.47,88.50,88.15,89.24,91.26,89.48,87.35,91.61,96.50,
+88.35,87.84,90.19,90.16,87.89,90.77,92.87,91.73,92.21,89.93,
+93.36,90.34,91.82,96.43,96.43,99.20,91.49,93.82,97.12,95.74,
+96.82,95.21,96.03,92.91,95.88,97.02,97.10,99.74,93.49,97.75,
+99.27,99.65,98.42,99.17,102.49,97.61,99.71,99.73,97.73,101.59,
+99.63,97.26,102.20,97.93,99.52,97.91,101.10,94.99,97.69,102.72,
+100.70,104.03,105.34,106.13,100.55,105.34,103.60,108.86,104.56,103.57,
+105.02,102.49,105.72,103.49,104.66,104.08,107.65,101.72,108.67,102.27,
+105.96,103.82,105.02,104.79,103.85,102.88,104.95,109.03,105.92,104.76,
+110.18,107.02,109.48,104.33,105.33,108.78,103.78,110.41,108.55,111.13,
+20.60,21.03,21.33,23.33,24.94,24.24,25.09,25.34,26.10,28.03,
+28.91,29.08,29.84,29.61,30.67,31.53,32.12,31.11,34.05,34.68,
+33.94,36.53,35.37,36.58,36.21,36.18,37.16,38.28,37.14,39.41,
+37.82,40.13,38.83,42.24,40.60,42.16,42.18,43.39,43.05,44.16,
+43.72,45.82,45.07,46.22,45.71,48.36,45.32,46.79,46.47,46.42,
+48.57,47.22,51.11,47.66,49.67,49.14,49.20,50.46,51.52,52.22,
+52.14,53.62,53.23,52.27,54.78,54.09,56.44,52.03,56.01,55.51,
+55.81,55.94,56.86,57.11,54.44,58.37,57.43,60.17,58.16,57.57,
+57.59,60.24,59.24,58.29,60.97,60.80,62.16,62.15,62.14,62.57,
+61.53,64.64,63.71,64.87,63.57,64.13,65.20,62.17,65.50,64.30,
+65.48,67.37,67.43,65.90,66.08,66.35,68.19,68.73,66.46,70.30,
+68.97,68.88,67.69,67.13,66.12,71.09,68.95,68.48,67.46,75.80,
+68.82,71.38,71.10,73.29,72.14,69.42,70.94,73.91,76.81,70.68,
+75.02,76.36,74.21,74.21,75.95,73.28,75.18,75.67,75.06,76.44,
+75.81,74.78,75.39,77.16,73.97,77.84,76.89,81.20,81.31,79.90,
+78.38,80.14,78.51,76.47,78.93,78.85,80.93,81.17,79.93,81.77,
+80.57,79.77,81.22,81.33,79.53,84.23,82.41,80.98,81.28,83.90,
+81.90,85.08,82.56,82.19,85.60,85.73,84.58,83.27,87.66,85.62,
+86.75,86.65,81.29,89.20,88.18,85.50,87.41,88.22,91.47,85.65,
+86.64,90.31,86.92,90.16,91.08,88.63,89.02,92.39,92.68,95.32,
+89.07,87.21,91.44,87.38,89.97,94.07,88.76,90.94,93.70,93.54,
+92.98,89.61,91.89,94.05,91.80,90.95,93.71,94.13,90.93,92.34,
+88.64,93.66,92.61,93.06,94.51,94.52,94.50,96.29,96.07,96.80,
+99.61,98.15,96.81,97.01,96.06,98.46,96.62,96.09,98.72,96.65,
+97.81,94.88,95.29,96.33,99.12,98.55,99.63,102.15,97.73,99.08,
+97.29,99.89,101.91,103.54,98.54,97.19,96.15,103.16,102.32,99.68,
+102.25,103.79,103.00,101.13,101.82,103.40,106.34,104.19,106.10,102.29,
+106.57,108.76,103.43,104.29,104.25,99.94,103.20,103.53,107.09,104.15,
+106.74,105.13,106.08,108.01,106.55,110.58,104.76,108.32,107.26,108.56,
+20.38,21.33,22.07,22.40,23.60,25.09,26.03,26.96,26.50,27.47,
+27.60,30.01,29.11,28.98,29.91,31.57,31.78,32.84,33.37,34.10,
+33.17,33.93,36.52,36.89,34.63,36.36,37.27,37.38,37.59,38.07,
+38.66,39.12,39.25,39.22,41.18,40.98,43.00,42.57,42.37,43.68,
+41.68,44.93,44.39,44.05,44.66,42.84,45.82,47.88,47.84,46.32,
+49.16,47.71,47.03,46.39,49.18,48.94,48.12,49.82,50.80,51.81,
+51.56,49.92,53.06,52.68,52.09,52.89,51.66,52.14,53.91,55.14,
+56.16,52.77,53.97,58.18,57.42,55.25,57.35,56.63,55.47,57.92,
+56.25,58.72,58.52,59.77,57.55,57.10,60.82,61.34,59.69,59.17,
+60.47,61.92,61.79,61.76,60.12,61.37,63.14,62.15,62.14,63.67,
+63.37,62.43,63.70,67.29,65.50,66.58,63.92,65.57,63.08,68.38,
+68.69,66.24,67.46,65.65,68.64,67.46,66.66,66.71,68.93,67.81,
+70.27,66.35,69.90,68.36,70.33,72.20,70.28,72.04,73.14,71.98,
+71.93,69.43,73.37,74.13,73.45,73.93,71.19,73.08,72.76,73.30,
+74.83,73.89,75.42,75.28,77.39,76.75,73.92,74.54,78.27,77.93,
+73.63,74.15,78.53,75.89,78.42,77.14,77.66,76.50,79.96,81.31,
+77.93,77.51,80.99,81.08,81.07,80.79,82.83,84.31,81.65,80.62,
+79.63,80.92,83.06,83.54,81.82,81.77,82.04,83.94,83.52,82.26,
+82.42,86.07,83.98,83.87,84.20,87.89,83.25,85.43,88.62,88.46,
+87.76,86.01,84.76,91.75,85.30,86.93,85.47,88.30,88.58,85.55,
+90.45,89.57,89.39,89.79,90.30,87.54,90.66,88.47,88.71,90.77,
+90.08,91.48,91.81,90.45,92.35,89.62,91.91,89.70,89.88,88.83,
+91.48,92.09,94.61,96.27,96.72,93.77,95.25,92.32,92.92,94.81,
+92.50,90.25,96.99,95.15,93.67,95.73,98.96,96.54,96.81,94.99,
+95.84,97.73,93.82,94.07,95.99,95.84,101.49,98.90,99.58,97.63,
+98.25,97.68,98.76,102.43,96.74,102.62,97.52,100.17,97.61,104.03,
+102.61,94.23,103.02,101.92,105.30,97.43,98.89,98.85,105.07,103.89,
+97.55,106.73,95.79,105.20,103.52,103.51,97.02,105.30,103.72,101.34,
+102.72,102.88,103.28,99.83,104.10,103.91,103.56,107.57,101.00,106.77,
+19.74,21.90,20.88,21.60,22.17,23.78,24.28,24.86,25.95,26.23,
+27.01,27.68,27.62,28.23,30.50,29.47,30.43,31.22,32.66,31.13,
+32.56,32.33,33.39,34.74,34.65,34.49,36.14,36.28,35.87,37.23,
+39.20,38.94,36.98,39.28,39.82,39.98,40.52,39.90,41.04,42.02,
+43.04,41.70,43.68,44.29,43.68,43.20,46.74,45.52,45.17,44.21,
+46.23,46.08,47.82,47.74,48.10,46.91,47.31,49.20,50.07,49.83,
+49.59,50.29,50.28,49.95,52.39,51.03,52.54,53.47,52.80,53.25,
+50.25,52.32,53.18,56.36,54.29,54.10,55.63,56.26,54.91,58.04,
+55.10,58.14,56.63,55.18,59.35,57.50,57.58,58.33,56.87,57.61,
+62.08,61.62,60.10,59.71,58.79,60.53,60.24,62.59,60.09,61.22,
+64.37,61.44,65.37,64.86,66.53,64.88,60.81,63.17,63.82,64.82,
+67.21,64.32,66.40,68.25,65.56,65.88,66.41,67.57,68.43,69.66,
+67.78,66.55,67.15,71.30,68.96,66.97,71.27,72.51,69.94,69.51,
+71.39,70.29,69.04,72.49,70.37,73.90,73.41,71.40,70.63,73.30,
+75.75,75.65,74.76,71.80,72.30,71.41,76.04,75.28,74.74,75.64,
+76.40,77.26,73.78,72.25,75.96,77.02,79.97,72.17,78.82,76.57,
+76.80,75.09,78.77,83.38,72.56,77.67,79.39,79.22,79.96,80.49,
+76.66,76.91,82.27,78.97,81.53,81.37,78.00,83.18,83.08,78.32,
+82.43,87.67,82.36,79.83,79.69,86.68,85.16,84.19,83.66,83.37,
+81.18,83.43,85.20,85.24,82.28,83.75,87.01,87.29,89.88,85.94,
+86.62,89.00,91.02,86.65,88.49,84.92,85.57,83.57,86.36,86.86,
+90.46,90.34,90.82,87.82,89.12,91.43,89.70,90.45,86.25,91.33,
+92.57,88.22,93.38,97.68,91.51,86.25,88.44,94.73,90.48,92.42,
+89.87,93.84,93.61,92.97,88.38,94.66,92.99,93.58,92.78,94.29,
+96.34,94.79,92.28,98.47,91.91,96.80,96.06,90.90,96.24,94.86,
+98.94,93.68,95.66,95.51,95.02,97.84,94.73,95.31,101.65,99.14,
+95.23,99.13,99.31,100.50,100.98,98.53,97.75,99.45,100.52,97.83,
+100.92,101.45,98.67,100.14,96.41,98.46,102.27,97.09,99.37,99.65,
+101.23,97.50,102.75,103.15,100.08,102.06,98.85,101.67,101.90,98.28,
+19.06,20.46,20.88,21.69,22.32,22.06,23.94,23.94,25.32,25.42,
+26.71,27.61,27.10,28.10,28.28,28.27,30.69,32.06,29.77,32.02,
+32.89,33.20,33.07,32.91,33.50,34.30,34.97,36.77,34.17,36.19,
+35.14,37.91,38.72,38.46,38.20,39.31,39.54,40.38,39.72,40.48,
+40.60,42.06,43.15,42.21,42.08,43.42,43.22,42.70,44.72,45.23,
+44.12,45.68,46.94,47.77,45.79,47.04,48.06,47.41,49.37,48.61,
+47.23,48.37,49.20,48.11,51.02,51.80,51.29,50.37,50.18,51.54,
+50.09,53.31,53.23,53.22,55.83,52.88,53.70,53.81,54.81,54.74,
+55.82,55.92,53.68,54.41,55.47,55.98,57.37,56.74,57.92,57.10,
+56.05,57.54,59.78,58.23,61.33,61.10,57.61,61.53,61.54,60.38,
+60.80,60.86,61.07,61.65,61.08,61.24,64.60,62.60,61.97,65.59,
+63.66,60.74,63.43,66.63,62.14,65.88,62.83,64.41,65.45,65.83,
+63.37,64.98,65.98,67.65,64.91,68.47,67.90,65.27,67.87,67.21,
+68.98,64.96,69.22,69.74,69.37,70.45,67.50,70.30,71.01,70.54,
+71.22,73.25,71.98,70.48,68.10,74.27,70.21,71.85,73.25,72.52,
+72.30,70.89,72.87,73.70,72.54,73.72,74.07,71.83,71.50,73.84,
+76.11,75.52,76.64,73.40,75.28,78.71,78.83,76.60,78.78,76.17,
+77.17,79.78,80.73,76.70,78.03,80.23,79.01,79.01,80.85,77.68,
+79.53,79.09,80.71,79.86,80.70,83.52,82.00,81.65,84.40,82.07,
+81.86,84.29,79.92,83.11,80.43,83.40,80.67,81.17,85.97,78.64,
+82.03,81.55,83.13,86.12,85.36,84.34,84.59,86.03,84.67,83.30,
+86.65,81.96,88.74,84.25,88.75,86.95,87.32,88.67,85.43,90.06,
+87.12,89.23,86.79,84.67,86.45,85.58,88.25,89.83,86.33,86.40,
+90.40,91.21,91.70,89.59,91.41,91.09,92.12,91.14,91.33,90.52,
+89.93,93.38,90.09,91.27,92.79,91.68,93.28,93.37,92.09,92.77,
+91.65,96.60,94.10,92.97,92.22,95.33,95.82,93.93,95.01,91.94,
+99.34,94.20,94.77,92.85,95.20,92.64,92.98,97.55,95.42,99.61,
+90.76,100.95,96.44,97.98,101.89,97.05,93.15,102.97,96.57,99.51,
+98.12,98.96,99.32,97.63,97.92,96.68,101.57,100.96,101.63,104.81,
+17.95,18.75,20.20,21.22,22.04,23.34,22.31,23.08,24.23,25.74,
+25.54,26.15,27.37,28.42,28.51,28.50,28.81,29.64,29.63,30.36,
+31.53,32.88,32.66,32.50,31.91,32.78,35.21,34.15,34.76,34.98,
+35.61,36.47,35.42,36.58,37.75,38.76,38.32,38.60,39.60,39.16,
+39.71,40.04,41.02,40.98,42.02,43.11,42.32,42.26,43.07,43.64,
+43.33,44.24,44.42,45.05,45.64,46.43,46.48,45.83,44.63,46.32,
+47.29,49.09,48.06,47.42,47.84,47.05,49.57,50.72,49.96,49.56,
+50.18,50.86,53.24,50.65,50.38,51.57,54.00,52.68,52.71,52.93,
+54.09,53.53,53.40,53.48,53.48,56.41,56.73,56.96,55.65,55.81,
+58.14,54.20,56.11,58.06,59.19,57.07,56.57,57.72,59.76,57.69,
+60.42,58.47,59.93,61.20,59.96,57.87,61.29,59.06,61.50,61.04,
+61.05,61.28,62.28,63.60,60.49,62.83,61.94,60.15,65.47,63.37,
+62.76,65.45,67.59,65.25,65.82,62.72,63.48,65.04,65.60,64.16,
+66.93,68.05,67.65,69.00,67.98,69.81,67.07,68.54,67.34,67.03,
+68.49,68.62,69.83,69.64,71.37,72.48,68.66,71.16,70.46,68.81,
+69.56,72.57,71.46,70.24,72.33,74.38,73.26,74.80,73.28,71.03,
+75.12,75.70,73.03,73.84,77.51,73.05,73.88,73.25,76.53,74.32,
+77.20,73.22,74.20,75.51,73.70,72.95,74.07,76.31,78.64,78.60,
+75.78,78.07,79.55,78.59,77.89,80.96,78.13,79.03,77.82,79.94,
+77.31,81.40,79.10,80.11,82.06,79.57,80.18,83.28,82.38,76.90,
+78.78,82.18,82.47,81.19,81.88,79.50,83.23,83.68,84.48,85.43,
+83.19,83.40,80.24,85.56,86.85,86.50,82.13,84.67,83.56,80.26,
+86.52,83.59,85.60,85.66,82.22,83.75,83.96,84.19,86.32,87.89,
+89.40,90.32,85.92,85.84,89.17,89.38,83.73,89.35,88.83,86.74,
+91.56,86.94,89.89,92.08,90.42,91.25,90.58,90.88,90.45,91.28,
+86.54,89.93,89.55,88.57,90.53,90.72,93.20,96.24,90.28,90.04,
+90.95,92.52,94.55,95.59,93.66,93.50,92.70,90.47,91.13,94.88,
+95.16,92.19,96.86,95.57,92.49,93.65,91.50,96.34,96.28,92.89,
+93.27,97.64,93.07,92.49,98.61,92.55,98.91,96.56,99.80,96.64,
+18.46,19.77,20.07,20.25,21.15,21.68,21.58,23.10,23.85,23.35,
+25.21,26.02,26.04,26.43,27.19,27.37,27.45,28.77,28.79,30.11,
+28.91,30.81,31.12,31.04,30.12,31.84,32.75,33.23,34.29,33.76,
+33.99,36.03,35.06,36.11,35.42,35.80,37.32,36.30,36.70,36.95,
+36.63,38.65,38.20,37.51,39.61,39.28,40.43,39.98,39.00,41.28,
+41.56,41.70,42.79,42.12,43.96,41.36,43.78,43.31,43.64,42.67,
+46.06,44.08,46.13,45.88,45.94,45.41,44.88,46.67,45.40,46.38,
+48.03,45.61,47.43,47.98,47.87,47.57,52.36,48.13,51.48,49.59,
+51.64,52.43,50.00,51.29,51.43,52.23,52.54,52.13,52.23,53.90,
+54.38,54.91,52.47,54.28,55.48,52.18,56.12,53.34,53.44,55.86,
+56.43,60.60,56.79,56.38,57.15,55.71,55.66,57.19,56.42,56.41,
+56.38,56.13,59.37,57.48,59.33,60.07,59.93,59.89,58.80,59.74,
+60.09,62.48,60.97,59.97,61.13,61.06,60.91,59.43,62.28,61.19,
+60.33,63.88,62.84,63.17,63.56,63.11,63.06,64.56,64.45,63.02,
+62.94,67.05,65.30,63.58,63.25,64.69,66.06,68.03,66.70,64.39,
+65.29,69.02,65.93,66.51,67.58,66.54,67.66,64.87,68.76,67.27,
+69.18,67.85,68.28,71.54,70.96,69.44,68.51,68.61,69.75,70.00,
+71.63,69.46,69.06,70.34,73.15,70.60,74.20,71.70,72.17,75.91,
+75.25,74.64,72.39,76.14,74.45,73.29,71.47,74.28,76.46,73.24,
+74.73,73.03,71.39,73.37,75.30,74.73,77.96,74.87,74.96,76.64,
+79.17,75.02,80.83,76.50,76.16,79.88,78.32,76.82,74.68,78.50,
+74.47,76.55,75.13,76.03,76.91,76.53,80.08,78.28,76.74,80.67,
+80.10,80.08,78.48,77.82,80.39,77.36,79.67,81.59,81.95,84.30,
+79.86,82.39,81.50,82.33,79.57,82.12,84.88,81.75,82.13,83.44,
+80.68,81.02,83.31,83.14,82.83,82.72,81.46,83.30,81.57,83.95,
+83.82,83.30,84.18,84.39,86.21,85.89,81.68,85.46,89.05,87.42,
+85.27,84.90,84.48,86.23,87.83,83.86,87.06,85.27,85.35,87.01,
+87.47,86.23,86.46,86.61,90.18,90.77,86.71,86.33,88.14,88.35,
+88.33,91.02,87.44,90.18,86.99,86.67,89.01,89.42,92.05,92.51,
+19.52,19.66,20.82,21.01,22.56,23.04,23.46,23.46,25.95,25.43,
+26.03,27.08,27.57,28.15,27.24,29.47,29.68,30.66,30.29,30.50,
+31.95,31.11,32.17,33.95,34.41,32.74,34.02,34.67,34.92,35.82,
+36.89,37.28,37.75,37.34,37.69,38.22,38.52,39.37,40.69,39.68,
+40.06,40.54,41.34,41.51,41.13,41.40,42.73,43.14,43.87,41.94,
+43.68,44.15,43.92,45.02,46.55,44.67,46.97,44.71,44.59,47.06,
+47.31,46.23,46.03,47.94,48.18,49.92,49.86,48.41,49.92,48.52,
+51.25,47.88,51.47,52.70,50.18,51.85,52.07,53.70,51.43,52.81,
+54.69,53.37,58.24,54.52,53.83,57.30,53.17,56.43,56.46,55.78,
+56.26,56.80,56.02,58.56,57.77,59.53,58.61,57.56,57.12,60.19,
+58.62,57.54,57.03,58.52,60.74,57.73,62.13,60.77,59.27,59.41,
+61.57,60.61,65.35,63.06,64.35,63.30,63.07,61.63,62.35,66.20,
+65.05,64.54,63.63,66.59,65.81,66.54,66.72,63.02,66.53,66.77,
+67.63,67.79,65.49,66.56,65.32,69.91,64.86,66.74,68.92,69.61,
+68.57,66.99,65.94,71.40,68.99,67.60,69.96,69.90,71.09,68.69,
+71.30,69.34,71.32,71.52,71.38,72.91,72.50,69.55,76.47,70.03,
+72.22,73.88,72.58,71.23,69.26,72.98,76.02,77.35,76.62,77.54,
+75.28,75.73,75.01,75.03,75.91,74.05,76.30,76.12,78.70,79.87,
+78.77,75.67,77.53,75.24,78.57,76.61,77.09,77.66,77.77,81.82,
+79.19,80.18,82.56,79.71,78.11,79.64,81.82,81.11,77.85,78.60,
+82.52,82.75,81.31,81.53,80.85,78.76,82.96,84.09,78.98,82.93,
+82.73,83.81,83.81,80.70,82.79,82.95,86.63,85.94,84.89,85.08,
+81.53,82.78,85.35,86.19,89.19,86.02,86.29,90.18,86.51,84.80,
+87.61,90.83,83.95,90.64,87.77,86.84,90.74,90.65,86.58,89.24,
+87.28,85.40,88.62,89.58,88.02,88.40,90.29,87.68,90.16,86.29,
+92.15,91.38,89.11,90.75,89.05,87.71,89.52,91.11,92.79,95.02,
+88.07,92.91,92.64,92.51,90.59,93.38,92.67,92.55,92.65,92.64,
+91.45,92.28,95.14,93.19,92.86,93.49,93.15,97.57,95.92,92.71,
+92.29,96.39,93.02,96.64,96.31,99.37,95.86,97.25,95.17,95.46,
+19.89,21.21,22.49,22.90,23.82,23.71,25.37,26.19,26.53,28.69,
+27.86,27.83,29.69,28.95,28.94,30.98,31.00,31.48,32.22,32.36,
+32.74,33.14,34.10,34.48,34.48,34.77,35.94,35.83,35.36,37.50,
+38.38,37.64,38.93,39.22,39.45,40.53,40.69,41.58,42.01,42.09,
+44.41,42.77,42.54,42.15,44.57,43.24,44.62,45.48,46.32,47.61,
+43.62,45.36,45.39,47.51,46.30,47.74,50.46,47.92,50.09,48.43,
+50.88,50.37,50.42,51.53,51.08,52.29,52.27,51.04,53.14,52.05,
+51.74,53.41,54.89,57.03,52.24,55.28,56.04,56.12,55.88,55.60,
+56.73,57.69,53.82,55.65,56.54,56.78,56.67,59.92,56.09,58.93,
+59.02,61.03,61.23,60.82,60.29,60.45,61.54,60.49,61.10,62.00,
+62.29,63.97,63.48,61.97,63.82,64.50,65.87,63.62,62.72,64.95,
+63.14,64.99,65.57,65.76,68.01,68.15,66.06,67.07,65.53,65.01,
+68.55,67.64,68.32,66.96,66.63,71.54,69.56,66.90,67.73,68.53,
+69.61,69.99,67.41,70.75,71.22,71.94,71.42,71.10,70.88,73.39,
+73.84,68.79,70.07,72.78,72.13,72.79,76.43,73.48,73.71,75.88,
+73.91,78.35,77.68,73.77,75.00,75.12,76.68,75.27,74.48,75.73,
+76.53,79.63,77.74,77.51,78.17,79.18,80.09,79.33,78.65,78.82,
+82.21,80.55,80.68,76.60,83.13,79.04,75.88,80.67,81.54,81.68,
+80.08,81.82,85.27,82.44,82.47,81.32,81.89,85.10,82.28,82.97,
+86.40,82.65,82.51,81.91,80.93,86.05,84.45,83.01,87.42,86.92,
+88.60,79.70,86.68,83.01,84.84,85.72,87.15,87.38,85.28,87.33,
+87.76,90.48,85.01,87.05,87.97,88.54,87.72,87.91,87.78,91.05,
+91.36,89.28,91.07,91.48,90.56,90.91,88.45,92.02,89.77,88.97,
+90.38,89.88,93.18,94.23,94.98,91.61,94.83,93.76,89.29,93.20,
+91.94,91.72,93.03,96.43,92.60,95.22,93.50,96.86,95.57,95.82,
+92.87,96.77,95.07,97.38,97.87,96.56,100.96,98.18,94.15,95.50,
+97.17,98.83,98.81,94.70,95.86,95.46,99.25,96.81,100.28,100.45,
+93.43,101.96,99.64,99.78,100.60,101.73,98.27,104.25,100.96,98.54,
+100.80,101.89,103.83,97.35,99.92,102.90,101.00,102.67,99.13,104.70,
+21.32,22.09,22.46,24.13,24.40,25.53,26.92,25.99,27.44,26.86,
+28.37,29.90,30.30,30.89,31.04,32.07,32.03,32.35,32.08,34.07,
+34.21,34.23,35.73,36.47,36.98,38.13,37.69,38.11,39.17,38.52,
+38.02,40.27,40.16,40.66,42.26,42.40,42.28,44.50,41.31,42.55,
+45.21,44.23,43.82,45.75,45.92,47.38,45.44,48.25,46.16,48.72,
+48.88,48.20,49.99,49.76,48.10,50.76,53.08,49.91,51.55,52.73,
+51.60,53.56,53.95,52.00,53.25,53.42,52.98,53.37,54.44,56.03,
+53.00,53.23,56.78,57.16,56.42,56.23,56.87,56.22,60.37,56.32,
+60.43,59.69,59.12,60.99,61.66,59.56,60.16,61.53,61.99,61.93,
+60.66,60.26,64.08,63.31,62.54,62.93,65.87,64.21,62.62,65.22,
+66.42,63.43,67.09,65.50,66.22,65.79,66.51,66.96,70.04,67.15,
+68.91,66.33,66.64,69.72,68.04,70.47,70.73,67.77,68.96,71.11,
+71.60,68.78,69.64,68.81,72.52,72.40,72.41,72.27,72.39,74.81,
+71.44,73.35,72.15,72.43,72.58,73.88,71.94,73.17,73.97,72.43,
+70.35,76.82,74.86,76.32,81.55,76.12,75.35,77.33,77.25,74.67,
+74.43,77.74,76.18,80.07,81.04,79.80,77.26,79.53,77.78,81.85,
+79.70,78.11,80.77,82.49,79.95,82.28,85.67,84.44,81.32,80.30,
+85.42,82.83,81.94,82.67,84.68,81.01,84.64,85.26,85.66,85.66,
+86.48,87.07,89.52,82.36,82.13,83.54,83.01,85.19,86.61,87.08,
+86.87,86.71,86.85,89.32,88.63,87.30,84.91,92.41,90.61,86.15,
+84.59,89.03,92.36,91.66,90.68,88.46,90.02,93.65,93.69,89.35,
+91.97,93.96,94.86,94.33,92.67,93.87,94.77,90.20,93.67,94.57,
+94.44,92.58,96.67,94.60,96.34,93.50,93.52,91.71,100.55,93.32,
+99.41,94.62,95.87,98.06,96.94,96.71,96.18,97.84,96.90,97.72,
+99.73,93.09,96.39,98.56,95.86,100.30,101.35,94.00,100.82,100.62,
+98.63,97.52,100.35,99.59,101.65,97.81,101.06,96.68,101.23,103.44,
+96.09,102.73,101.27,99.79,100.61,103.02,104.02,102.95,98.77,101.45,
+103.45,96.93,102.70,101.39,107.26,105.06,107.23,105.77,100.95,103.08,
+102.18,104.43,104.05,103.27,105.10,108.28,107.00,106.23,103.86,107.09,
+22.02,22.24,23.31,24.23,25.12,25.77,26.38,26.95,28.20,28.57,
+29.57,30.60,30.98,31.74,32.40,33.45,33.84,33.89,35.00,35.49,
+36.55,36.53,37.08,37.13,37.68,37.97,38.72,38.38,39.73,38.53,
+40.43,41.33,41.59,42.45,42.10,44.31,44.20,43.28,42.40,45.31,
+46.17,44.94,47.72,46.73,47.55,45.97,49.45,48.95,49.38,51.24,
+50.60,50.16,51.20,51.73,54.02,49.89,51.34,52.17,54.37,53.80,
+51.72,53.89,55.46,52.81,56.20,53.96,55.50,56.11,56.40,57.22,
+58.65,57.05,59.89,56.98,58.49,59.88,60.28,60.33,60.92,64.12,
+60.43,61.48,60.47,60.19,59.43,63.44,63.23,61.46,63.84,61.15,
+64.45,65.14,63.43,64.73,66.49,67.75,63.79,66.68,66.45,65.66,
+65.14,65.83,66.95,70.18,67.83,67.08,68.17,68.08,70.07,70.24,
+72.36,69.65,71.50,69.67,66.55,71.06,72.66,74.97,73.21,75.94,
+74.98,71.45,70.27,74.85,76.60,73.00,76.24,77.19,75.73,77.99,
+74.40,73.65,73.56,76.35,78.07,76.87,77.94,77.55,78.79,75.30,
+77.46,78.12,84.77,79.11,77.75,80.89,80.27,80.79,79.39,80.83,
+77.74,81.18,79.36,79.49,82.44,82.17,81.10,81.94,84.61,78.99,
+83.10,79.24,88.13,87.01,84.59,83.52,84.80,86.75,84.18,87.22,
+82.76,85.66,86.62,87.74,84.83,86.96,85.29,84.56,84.33,89.29,
+91.39,86.86,88.11,89.15,88.96,90.09,91.36,91.52,90.47,86.95,
+89.49,87.32,88.60,87.60,89.25,92.49,90.55,90.73,88.65,95.16,
+92.43,89.94,90.96,93.40,95.45,92.33,91.56,93.14,94.73,93.24,
+96.18,92.78,93.16,94.16,95.08,94.79,96.94,94.76,93.80,96.09,
+91.88,95.65,97.30,99.58,97.88,94.97,94.81,102.99,100.65,98.87,
+98.89,95.86,97.90,95.52,105.19,98.44,98.16,102.06,97.73,104.49,
+101.20,101.01,97.79,100.88,102.88,104.02,102.82,102.04,103.94,101.46,
+103.85,101.34,104.10,104.70,99.64,107.03,103.50,108.72,104.51,103.48,
+104.11,102.09,106.90,105.03,106.87,106.79,100.79,105.66,102.05,107.98,
+106.90,102.77,108.93,103.49,101.11,109.16,105.47,106.40,108.94,111.03,
+107.45,107.93,105.11,111.45,105.13,108.59,111.91,103.80,110.63,108.64,
+21.48,23.79,23.82,25.29,24.96,25.55,26.91,26.86,28.13,28.93,
+30.96,30.14,31.23,32.02,33.91,33.68,35.04,34.08,34.19,35.59,
+36.31,37.71,36.69,38.62,38.76,38.26,40.78,39.15,41.40,40.44,
+41.88,42.87,43.22,42.42,43.29,44.23,45.58,43.60,46.86,45.01,
+45.99,47.90,47.81,47.53,46.89,48.98,48.85,50.37,49.89,52.05,
+52.71,51.37,51.85,51.08,52.64,52.72,53.00,52.13,52.91,55.51,
+54.13,53.00,57.30,55.70,57.99,58.64,56.36,56.20,59.83,58.77,
+57.01,60.12,59.29,59.06,59.52,60.94,62.04,64.05,61.79,62.54,
+64.96,61.98,62.01,64.32,63.39,64.79,66.61,65.76,60.38,66.46,
+63.44,63.15,66.86,67.94,65.11,67.63,65.93,70.62,66.81,67.43,
+67.51,68.45,68.89,66.92,66.90,69.78,68.67,70.06,67.44,73.13,
+69.79,70.55,71.97,70.14,71.78,69.71,73.58,71.97,74.64,73.68,
+76.52,74.39,74.23,75.08,75.46,77.01,77.36,77.40,76.01,76.50,
+78.57,78.20,78.86,78.55,79.03,80.39,74.78,79.16,77.56,81.13,
+81.73,79.89,79.85,82.20,80.06,79.64,83.71,81.09,83.06,80.21,
+82.97,82.33,82.37,82.81,82.96,81.41,83.85,84.14,85.85,86.41,
+85.55,86.53,83.69,86.38,86.59,87.87,87.77,87.98,86.60,84.46,
+90.93,86.60,89.41,88.71,87.93,90.23,89.83,89.02,88.91,89.41,
+92.55,89.27,89.24,87.45,92.28,87.52,90.25,91.33,91.51,91.33,
+89.96,93.19,91.13,90.66,93.57,94.16,92.88,94.03,91.84,92.91,
+92.43,97.55,92.32,95.92,92.15,95.02,93.68,95.15,95.95,92.05,
+98.11,100.28,94.42,97.13,94.87,98.20,98.53,99.58,98.26,99.76,
+102.20,98.17,99.27,100.64,97.38,100.99,99.90,97.68,98.58,99.71,
+98.44,104.40,98.34,100.82,103.75,105.78,99.21,103.06,101.64,101.07,
+99.82,107.14,106.16,106.59,102.46,105.64,102.31,107.37,106.14,100.05,
+105.47,106.06,104.82,107.82,105.98,105.73,99.57,107.30,106.46,105.75,
+107.79,104.61,109.30,104.98,105.13,103.59,107.67,109.53,108.17,106.47,
+111.94,109.29,109.08,107.19,104.88,103.29,109.05,109.47,110.08,109.31,
+109.86,111.23,105.99,110.98,109.07,111.93,116.03,112.74,118.47,109.70,
+22.84,23.47,23.72,24.86,26.12,25.66,26.27,28.22,28.16,30.10,
+31.17,30.74,31.69,34.26,33.71,34.19,34.22,36.51,37.51,36.16,
+35.44,35.69,37.73,38.54,38.33,40.27,40.37,41.38,40.41,43.38,
+41.94,42.91,43.88,43.90,43.93,45.59,45.49,45.01,46.22,48.29,
+47.15,45.60,48.44,48.03,48.94,50.25,49.99,49.99,50.66,50.90,
+50.75,52.29,52.37,53.17,53.66,52.65,55.68,54.97,54.22,58.20,
+55.43,55.59,56.30,57.49,55.57,57.72,56.44,57.45,59.35,59.12,
+58.62,58.23,60.48,60.25,60.43,59.77,60.31,62.35,59.86,61.26,
+63.25,61.35,62.87,63.79,63.29,64.52,65.58,65.35,65.98,65.00,
+65.81,66.56,67.81,67.25,66.19,69.36,69.12,68.22,69.00,69.72,
+67.64,69.12,72.35,69.20,70.94,68.56,71.72,73.44,70.54,69.22,
+70.31,74.52,69.70,73.21,74.39,74.86,73.18,74.23,70.77,74.66,
+75.62,74.62,76.73,76.98,75.42,74.67,76.46,80.85,77.94,74.50,
+75.52,79.41,78.42,81.20,79.41,81.06,79.86,78.18,80.88,80.39,
+80.50,80.45,85.59,81.37,83.19,85.02,83.47,83.28,83.90,82.42,
+81.27,84.53,83.16,84.04,85.31,85.31,89.00,84.61,85.58,87.33,
+86.21,84.88,84.02,89.67,86.79,87.42,85.24,86.00,87.69,88.68,
+86.56,86.82,93.35,90.00,87.51,89.70,90.78,88.05,91.14,91.75,
+91.59,92.42,91.42,90.53,90.15,93.60,93.49,89.47,95.12,91.14,
+94.71,94.86,93.79,95.51,94.69,93.39,92.80,95.36,91.82,96.03,
+95.10,97.36,100.84,95.72,93.74,100.13,98.24,93.17,98.29,99.60,
+95.95,97.65,94.13,98.25,95.69,97.97,98.78,104.48,98.23,100.79,
+97.92,100.55,97.78,102.82,102.10,102.38,99.24,102.24,105.03,103.97,
+102.07,102.14,99.78,102.25,102.52,103.22,104.00,105.49,107.47,99.36,
+103.36,105.54,108.73,106.28,99.86,99.82,102.57,106.37,103.93,109.21,
+108.02,108.74,104.86,108.51,106.19,104.63,105.97,103.73,107.83,106.22,
+107.95,106.85,110.53,109.69,106.82,108.20,107.82,106.74,111.52,106.39,
+112.45,114.59,109.41,108.10,110.99,111.02,110.29,106.84,107.97,113.75,
+108.83,115.23,119.12,111.82,111.60,114.86,111.01,114.38,114.57,114.31,
+22.36,23.20,24.26,25.27,26.25,26.68,28.10,28.47,29.61,30.03,
+30.40,32.25,32.75,33.02,33.46,34.22,35.67,34.93,36.45,36.20,
+36.56,37.66,38.25,38.81,37.44,41.65,41.34,39.94,42.71,43.38,
+43.08,42.96,42.30,45.01,43.09,44.42,46.59,48.52,45.98,47.70,
+48.33,47.38,49.50,48.25,48.61,50.52,50.95,49.92,49.77,51.26,
+53.04,54.16,52.54,53.75,52.57,52.46,57.34,54.57,53.56,58.20,
+54.88,56.16,57.26,56.87,56.88,60.22,58.65,59.46,58.60,59.71,
+60.23,60.17,63.89,61.20,63.91,61.76,61.20,62.09,61.78,63.13,
+64.75,65.17,64.58,62.94,64.69,62.89,64.71,65.66,67.67,66.08,
+69.08,67.44,67.63,67.52,66.75,68.36,69.69,68.23,66.66,67.40,
+72.29,71.21,68.53,70.59,71.18,72.66,69.94,71.60,70.20,73.38,
+71.68,73.20,73.49,75.19,73.94,78.11,73.82,72.51,72.20,78.45,
+72.82,76.95,75.90,74.38,79.91,76.24,75.03,80.47,77.12,75.99,
+78.63,82.08,76.91,78.48,80.57,83.39,81.05,82.56,77.71,77.34,
+80.17,86.14,80.45,79.99,81.86,82.18,84.72,79.15,84.08,84.07,
+85.75,87.96,83.28,83.01,86.87,83.19,87.28,85.02,83.59,87.00,
+87.87,88.76,86.08,88.58,83.49,89.15,87.59,87.29,88.30,91.25,
+89.57,91.25,92.62,90.96,87.13,92.38,92.57,86.79,87.40,92.16,
+91.92,90.70,94.20,93.92,92.62,94.75,94.86,91.79,95.44,93.65,
+91.42,90.67,93.53,95.03,91.92,94.94,97.00,97.80,98.30,95.16,
+95.85,95.13,96.88,99.60,95.18,98.23,100.38,99.24,98.37,94.81,
+102.00,98.36,100.56,101.24,98.23,99.55,101.58,101.25,98.31,100.43,
+97.89,102.28,99.36,101.46,100.54,99.48,101.84,101.23,101.99,103.81,
+103.30,107.85,100.58,102.55,100.62,105.76,104.93,105.00,104.45,104.87,
+105.41,102.74,102.52,106.88,107.08,108.44,108.93,106.82,108.95,109.01,
+107.49,108.14,106.40,109.67,111.07,109.80,108.77,106.40,108.38,110.70,
+107.87,110.51,109.90,110.86,109.33,107.54,109.72,111.14,113.76,114.84,
+113.79,110.52,110.89,114.29,110.51,109.85,110.23,113.84,110.28,115.46,
+112.73,116.16,110.46,110.83,110.27,118.97,114.49,112.12,114.83,121.90,
+22.93,23.46,24.32,24.99,25.42,25.84,27.79,28.07,30.11,30.80,
+30.38,31.38,32.57,32.17,32.73,34.62,34.56,33.63,35.17,35.87,
+37.74,37.44,39.15,39.95,39.85,38.66,42.22,41.31,42.75,42.41,
+42.41,43.81,43.45,42.95,43.12,45.61,45.37,44.49,47.50,45.08,
+47.86,46.71,46.48,49.53,49.53,51.08,50.23,52.71,51.20,51.12,
+53.20,53.67,52.70,53.40,53.50,54.59,53.24,56.74,53.74,58.16,
+57.72,56.47,56.72,57.22,57.71,57.93,59.92,57.71,59.20,61.75,
+60.38,58.92,61.32,62.35,63.02,61.13,60.54,59.10,62.29,64.43,
+64.54,62.74,63.22,62.86,65.22,65.81,64.55,66.88,65.69,66.70,
+66.76,67.79,71.89,70.17,68.55,71.68,68.59,68.94,70.29,67.98,
+68.00,70.44,72.47,73.59,70.69,70.77,71.28,73.22,72.94,73.91,
+72.07,73.37,74.37,73.79,76.41,73.96,72.65,75.53,75.74,76.97,
+79.05,76.95,76.30,74.93,77.68,75.76,80.53,78.81,77.47,77.85,
+81.99,80.99,76.32,80.37,81.58,80.30,80.07,81.76,79.17,85.19,
+83.89,83.50,83.49,81.92,86.60,83.41,81.23,86.49,83.83,80.94,
+85.55,88.72,84.43,82.82,81.75,85.69,86.23,83.27,87.23,86.05,
+86.82,84.97,89.31,86.70,87.88,90.71,87.63,89.40,93.46,85.56,
+86.94,89.69,87.88,88.78,89.65,88.89,88.80,90.48,91.47,87.71,
+94.13,92.91,89.53,95.01,92.62,91.94,92.40,96.24,93.70,94.48,
+93.21,94.91,93.84,92.16,96.87,93.80,96.85,95.65,94.00,96.31,
+94.57,94.80,96.77,97.03,94.40,98.73,98.49,98.46,94.88,100.26,
+94.01,96.05,98.37,105.79,98.22,95.79,103.18,99.89,103.39,99.68,
+98.02,99.60,103.55,100.65,100.66,104.12,101.66,99.70,105.31,103.34,
+105.49,102.66,106.11,101.66,106.25,103.48,105.95,103.48,104.86,106.67,
+109.64,106.87,108.14,107.49,104.91,102.38,108.18,105.99,110.73,106.27,
+106.95,109.68,106.03,105.48,108.47,110.51,109.30,112.05,109.57,109.30,
+110.11,112.57,109.74,108.83,106.81,110.44,111.48,114.28,111.81,106.01,
+113.89,109.63,111.48,112.33,114.42,113.66,115.31,115.19,109.64,114.98,
+111.36,111.06,114.85,112.95,112.83,114.39,110.48,117.30,115.48,116.60,
+22.39,23.11,24.55,25.06,24.75,26.90,28.38,27.46,31.21,30.60,
+30.92,32.42,30.97,33.96,32.83,33.29,33.67,35.72,35.26,36.43,
+37.07,37.82,37.02,39.15,39.25,39.21,39.03,40.83,42.46,42.42,
+43.68,41.99,44.28,44.11,42.70,45.68,45.21,47.30,46.03,47.44,
+47.74,46.54,48.26,48.17,49.53,49.86,48.41,50.38,52.11,51.12,
+52.76,50.98,51.86,52.54,53.33,52.37,54.89,54.63,55.90,56.78,
+56.42,56.60,56.39,55.69,56.38,56.22,56.55,58.63,60.01,59.67,
+58.77,59.55,59.56,62.91,60.17,61.56,63.38,61.33,62.33,64.12,
+64.42,63.61,64.38,62.64,64.30,64.62,63.55,64.98,65.54,65.23,
+65.23,64.16,66.35,65.53,69.04,67.93,69.22,69.18,69.42,71.64,
+67.92,70.74,71.98,70.83,72.20,70.94,72.15,71.82,73.76,69.56,
+71.11,76.21,72.98,71.12,71.59,73.28,74.88,77.35,78.49,74.97,
+76.84,75.38,77.00,73.52,77.25,79.34,76.50,79.83,80.83,76.78,
+79.81,78.98,78.53,79.28,78.67,81.29,80.90,80.62,82.77,83.99,
+83.58,82.90,79.11,82.74,82.70,82.26,80.36,85.24,82.57,84.04,
+88.06,86.46,84.93,87.36,83.49,87.30,84.28,87.14,84.57,85.09,
+86.96,87.75,86.39,93.83,87.55,87.83,87.94,86.73,90.23,85.83,
+90.90,87.72,86.79,90.03,89.41,89.19,91.02,89.30,87.99,89.74,
+90.28,94.28,90.80,89.87,92.21,91.56,91.33,96.54,94.31,96.15,
+90.65,92.10,93.32,97.10,96.95,95.69,96.58,93.92,94.01,94.39,
+97.69,95.43,93.71,94.73,94.20,100.10,101.31,97.29,99.93,97.64,
+101.09,97.76,98.41,99.33,100.82,104.39,102.71,101.02,102.80,99.85,
+99.49,100.57,98.84,101.78,100.77,101.55,99.32,107.26,102.81,103.25,
+103.87,103.74,107.66,103.02,103.48,102.39,104.46,105.46,104.14,107.37,
+106.01,103.89,105.98,111.12,104.38,109.94,113.58,106.89,107.85,107.34,
+108.56,108.34,110.25,109.64,105.03,107.55,107.68,114.05,106.90,110.82,
+107.39,113.58,112.87,109.49,109.52,110.76,108.32,107.03,107.98,111.28,
+114.26,109.24,109.28,114.70,112.87,116.19,110.22,107.81,110.39,115.50,
+113.46,114.37,115.32,112.56,117.16,110.77,111.94,116.42,110.49,114.92,
+22.89,23.44,24.36,24.39,25.40,27.07,26.91,29.20,28.16,30.09,
+30.24,31.16,31.33,31.27,32.93,34.57,32.96,35.25,35.88,35.66,
+35.45,36.16,38.10,38.61,38.64,39.28,39.42,39.66,40.31,41.73,
+40.95,41.10,43.59,44.11,42.32,43.91,46.35,44.14,45.11,44.69,
+47.36,48.41,47.89,48.81,49.30,51.03,51.36,52.13,50.40,52.56,
+50.74,50.06,52.02,51.74,51.64,53.70,54.86,53.51,55.40,55.42,
+56.01,56.90,55.68,55.93,56.71,59.30,53.49,58.46,57.00,59.27,
+61.01,58.22,60.71,60.39,62.74,60.55,62.30,62.13,60.70,62.07,
+61.74,63.40,64.16,63.73,65.21,64.18,63.40,67.73,65.85,66.67,
+66.89,65.45,67.13,66.57,69.59,69.41,69.05,68.42,70.02,69.63,
+71.89,67.99,70.22,72.35,68.78,69.94,68.88,71.89,72.15,70.15,
+73.94,74.08,71.52,75.01,72.63,73.86,75.57,73.78,74.04,75.28,
+73.65,72.21,76.01,78.10,76.91,77.93,76.36,77.40,73.29,77.21,
+77.31,78.43,77.24,76.18,78.43,79.65,79.69,80.61,83.90,79.61,
+82.10,83.69,83.13,83.72,83.10,82.05,83.93,84.32,82.82,83.59,
+83.49,83.62,81.67,84.75,89.02,85.24,82.28,87.26,85.53,84.75,
+82.73,85.02,87.90,87.58,89.83,90.06,84.03,90.30,89.78,89.00,
+89.85,87.68,91.99,89.21,90.64,90.07,91.55,93.20,90.94,89.23,
+90.92,93.55,87.11,92.21,91.98,90.99,95.81,94.57,93.02,94.36,
+93.63,94.52,95.21,92.10,94.69,94.81,98.88,95.48,94.29,94.63,
+96.33,95.46,95.56,101.04,98.76,97.21,95.31,95.35,92.59,95.14,
+97.72,93.58,101.11,95.10,98.79,99.80,101.84,100.21,100.31,97.49,
+96.75,101.28,96.40,97.54,99.92,101.59,101.95,100.06,102.54,101.71,
+101.67,100.99,99.94,101.45,100.96,104.90,103.66,102.54,103.13,102.67,
+106.46,105.29,103.60,104.58,107.06,103.69,103.31,104.58,105.20,106.22,
+109.17,106.33,106.97,106.69,109.30,107.40,107.64,112.14,107.89,107.71,
+106.12,110.30,108.73,111.43,110.61,106.52,108.53,110.31,109.07,116.00,
+112.17,108.89,107.17,111.08,110.84,113.76,113.25,112.03,113.06,109.85,
+117.72,111.37,112.65,109.79,119.11,111.24,110.50,113.51,115.14,117.76,
+22.35,23.09,23.23,25.13,24.87,26.41,26.97,27.62,28.95,29.12,
+30.76,30.47,31.19,32.42,32.50,33.65,33.34,33.70,35.77,35.19,
+36.67,37.41,35.38,38.36,36.66,38.41,39.73,41.63,39.10,39.23,
+40.85,42.62,43.28,43.02,43.60,44.28,44.75,45.92,46.93,46.61,
+46.58,45.73,45.69,49.17,46.98,49.70,50.13,48.32,49.16,52.65,
+49.98,51.91,53.13,50.71,52.71,54.88,53.60,54.94,54.23,54.56,
+55.99,54.37,55.23,56.58,57.43,58.29,55.80,55.33,57.10,56.69,
+59.41,58.14,57.79,58.56,61.03,57.30,60.47,60.89,60.62,62.46,
+60.05,62.53,63.15,64.74,62.28,64.45,62.58,64.07,66.40,62.23,
+64.61,66.96,67.01,67.11,66.44,69.50,69.46,68.75,69.15,68.73,
+67.49,67.29,67.56,69.27,67.81,71.35,69.05,70.72,72.14,70.35,
+70.48,72.56,71.80,71.38,72.70,72.97,72.51,71.75,72.08,71.98,
+75.39,74.86,72.70,76.82,76.47,75.84,76.85,78.41,77.47,76.99,
+75.97,76.75,80.70,79.54,76.52,76.91,76.27,79.66,77.68,76.80,
+78.99,79.71,79.95,81.08,81.95,84.12,79.54,83.05,82.34,83.49,
+82.18,82.99,83.56,85.88,81.33,83.61,84.06,82.50,81.28,84.73,
+85.58,83.80,84.79,82.44,84.49,90.90,85.83,86.98,86.46,86.05,
+86.43,90.82,88.85,89.04,88.58,87.97,87.13,88.13,89.57,87.95,
+88.40,91.85,90.96,87.24,90.94,92.16,90.19,91.83,92.17,93.94,
+92.10,91.93,95.89,92.39,93.30,93.55,91.71,96.30,89.99,95.23,
+93.77,93.48,92.43,96.52,94.36,94.99,96.67,93.13,95.03,95.77,
+100.10,96.43,94.23,94.05,99.64,99.76,94.32,95.78,96.97,95.21,
+99.72,97.56,94.37,100.47,96.77,101.24,100.14,100.37,96.27,101.96,
+101.29,97.80,101.32,100.10,103.54,102.98,108.97,102.74,101.48,104.27,
+102.47,102.12,102.43,103.35,102.97,101.05,101.84,100.94,106.45,106.63,
+103.67,103.26,108.27,102.72,101.66,105.17,106.41,112.62,106.09,106.34,
+104.88,105.28,109.60,107.80,105.84,104.23,108.49,106.97,101.99,108.84,
+106.50,111.60,107.53,108.31,110.77,110.78,112.32,115.57,107.93,112.49,
+113.13,111.56,115.27,109.03,107.05,110.76,117.21,112.64,109.34,112.34,
+21.20,22.16,23.75,25.04,23.60,26.80,26.00,26.37,28.12,29.66,
+29.14,30.21,31.00,30.54,31.49,33.54,32.58,34.50,34.08,34.91,
+35.71,35.14,37.31,37.14,39.15,39.16,38.93,38.84,41.92,40.97,
+40.57,42.09,41.78,42.75,42.64,44.60,43.94,43.48,44.77,43.85,
+45.75,47.59,45.95,47.39,47.31,46.93,46.17,50.24,48.79,50.30,
+50.94,50.38,50.06,51.42,53.12,53.06,52.89,53.71,52.81,52.08,
+54.31,54.64,54.65,52.98,55.23,53.28,55.09,57.92,58.94,57.31,
+56.09,63.26,58.48,57.25,59.97,57.61,60.50,60.65,59.19,62.95,
+61.29,62.41,61.38,60.58,62.71,61.76,64.48,62.08,61.55,65.57,
+64.49,62.69,66.72,66.19,66.48,67.28,64.49,67.44,68.39,68.39,
+67.55,67.78,68.08,70.35,67.45,67.93,72.86,68.09,70.26,70.87,
+69.31,71.73,71.27,71.61,71.06,70.11,72.70,72.65,75.07,70.66,
+72.24,72.96,73.88,75.18,73.57,76.08,74.30,75.67,73.13,77.26,
+78.98,75.16,76.19,75.23,76.16,74.09,77.83,76.98,76.23,76.19,
+78.45,79.79,80.79,76.61,80.43,83.09,80.02,81.21,80.70,82.28,
+81.19,83.08,81.29,81.41,82.04,82.71,84.89,80.58,85.31,80.79,
+85.70,80.18,83.71,87.17,85.27,86.21,84.00,88.33,84.40,88.89,
+86.94,88.43,87.89,87.64,85.85,89.32,89.17,84.66,86.87,92.74,
+88.36,88.48,87.34,91.57,91.68,90.58,90.50,92.44,92.46,90.20,
+87.22,90.82,93.83,89.32,91.07,90.93,90.59,89.50,91.94,91.66,
+89.65,91.65,92.72,88.63,93.54,95.79,94.04,96.46,91.25,92.50,
+93.13,96.92,95.50,90.03,94.78,96.38,95.23,97.47,97.73,98.09,
+98.29,97.54,101.86,97.26,99.19,98.74,98.43,102.63,97.96,100.74,
+99.60,98.35,98.97,100.43,100.60,100.59,99.89,98.10,95.80,103.69,
+100.08,96.83,100.64,98.24,104.72,99.46,103.46,103.58,103.61,105.08,
+107.67,102.69,100.24,103.87,102.74,103.24,104.08,103.95,106.01,106.79,
+105.44,103.97,106.66,107.04,102.52,109.94,104.09,105.30,101.32,108.84,
+109.75,107.20,108.66,106.26,104.85,110.06,106.17,110.14,109.41,108.00,
+108.55,110.55,110.59,108.40,110.95,106.40,107.38,110.83,112.02,112.06,
+21.42,21.36,22.19,23.89,24.40,25.41,24.74,26.78,27.33,27.83,
+27.87,29.48,29.79,31.78,33.00,31.53,32.58,32.48,34.20,35.03,
+33.82,36.94,35.03,37.10,37.73,37.08,38.16,38.30,39.28,39.79,
+40.26,40.90,42.29,41.87,43.40,44.06,43.49,43.65,43.89,44.87,
+45.81,46.32,45.14,43.55,46.43,45.26,47.07,47.10,47.30,50.82,
+48.84,48.96,49.34,50.61,50.10,51.66,50.93,54.48,53.87,52.56,
+51.19,53.23,53.26,53.14,52.53,54.97,56.12,55.84,56.55,55.63,
+57.21,59.82,56.63,56.86,59.16,57.39,59.11,58.32,61.03,60.06,
+59.94,59.98,61.03,59.91,60.91,60.98,61.84,62.69,61.29,61.98,
+65.12,62.87,64.77,64.02,67.71,65.64,65.20,64.10,64.77,66.35,
+65.45,67.86,66.43,68.27,69.10,68.89,68.29,69.62,65.88,67.50,
+68.16,69.72,66.84,69.01,69.18,69.78,70.66,71.31,71.28,71.92,
+70.39,68.41,70.90,72.02,75.18,75.34,74.02,76.32,76.72,77.42,
+71.53,76.14,77.28,73.83,72.37,76.31,74.42,76.51,77.09,79.11,
+78.26,79.74,78.24,82.59,76.09,75.57,78.23,80.85,78.23,81.60,
+77.72,78.36,79.09,81.02,78.60,85.29,82.24,80.52,82.97,79.37,
+80.40,86.55,84.16,85.67,85.21,84.14,86.19,84.19,85.14,84.86,
+84.10,86.81,83.55,85.99,86.76,85.74,86.64,85.78,85.30,87.59,
+85.29,88.94,84.71,87.93,89.83,90.35,90.03,88.94,88.03,86.49,
+91.73,89.60,92.01,89.15,86.61,89.61,91.18,89.96,88.42,96.07,
+92.89,90.74,94.88,89.40,92.85,93.24,90.32,92.05,92.13,92.27,
+93.35,92.58,94.89,92.97,96.27,96.62,91.05,93.25,92.84,93.27,
+95.74,97.69,96.97,95.35,97.56,99.46,97.18,99.12,97.21,95.41,
+98.78,102.27,97.43,101.10,99.25,97.31,99.20,101.46,98.68,101.53,
+97.39,99.39,101.59,100.24,100.63,99.04,103.91,101.04,101.04,102.49,
+99.96,101.94,100.30,100.58,105.34,102.49,98.37,101.44,103.87,103.65,
+105.51,101.91,106.70,104.01,104.60,106.04,102.23,103.74,103.25,102.84,
+101.91,107.24,105.92,103.05,107.90,111.68,104.58,107.34,105.35,105.81,
+109.64,106.44,106.45,110.62,111.83,109.37,105.34,108.41,112.49,109.67,
+19.47,20.50,22.44,23.25,23.93,24.18,24.96,25.78,28.17,27.54,
+26.77,29.22,29.40,29.32,31.57,32.78,32.03,33.11,34.62,33.42,
+33.56,35.75,35.49,37.19,36.17,35.82,37.54,38.10,38.24,38.22,
+38.38,40.77,40.78,41.62,40.41,41.53,42.29,44.75,42.44,41.17,
+45.42,45.60,44.70,44.68,44.66,46.94,46.17,48.53,48.46,48.53,
+48.10,48.28,47.85,50.87,47.70,50.95,50.38,50.09,50.49,50.21,
+53.52,53.37,52.22,52.06,52.86,54.60,56.93,53.11,55.12,54.87,
+55.10,55.09,57.44,56.84,58.28,55.93,55.71,57.97,56.42,55.83,
+58.65,58.84,58.29,61.23,58.62,59.66,60.27,60.57,60.77,61.51,
+60.29,60.95,61.71,62.72,62.99,64.09,62.29,64.23,64.58,63.42,
+63.44,65.90,66.61,69.34,63.18,62.14,65.29,67.61,65.56,69.07,
+69.06,66.06,71.19,70.54,69.66,67.20,68.73,70.50,71.06,70.50,
+70.43,72.44,72.30,70.15,70.91,70.87,72.60,74.25,72.87,72.12,
+71.63,74.25,71.72,72.04,76.51,75.42,74.20,72.94,75.66,76.65,
+74.01,75.33,76.94,75.10,76.78,79.89,74.61,76.64,77.72,75.27,
+78.69,76.92,78.29,77.76,77.67,80.78,77.02,79.46,78.26,79.33,
+84.72,80.76,82.69,82.03,79.04,81.27,82.17,80.09,85.32,82.47,
+82.13,82.52,83.05,80.65,84.25,83.65,84.02,88.56,85.79,82.15,
+85.40,85.54,84.26,84.02,84.27,87.00,85.99,88.61,91.28,86.15,
+87.87,85.11,88.28,88.64,86.84,91.91,88.77,88.05,87.34,89.60,
+88.61,88.60,87.59,90.26,89.25,89.26,88.03,89.99,88.59,91.67,
+91.09,93.14,93.29,92.37,90.59,92.16,91.41,95.55,92.24,96.05,
+92.47,94.91,98.08,94.83,95.64,91.05,96.06,94.39,94.07,96.79,
+91.43,96.84,95.85,90.69,96.62,95.67,100.49,96.71,98.31,97.73,
+97.50,96.61,98.46,94.08,99.66,92.40,99.03,100.23,97.99,99.74,
+103.12,98.20,101.17,100.68,103.63,98.86,103.48,100.80,98.93,101.54,
+99.93,103.76,101.29,102.89,100.03,99.95,101.85,105.33,105.36,105.62,
+103.60,103.25,101.69,102.85,102.83,102.86,101.46,106.52,102.09,103.24,
+102.68,102.43,108.11,105.46,107.28,106.12,106.53,105.53,112.61,104.09,
+18.39,19.12,20.02,20.31,21.01,22.15,22.04,22.22,22.98,24.43,
+24.39,24.49,24.78,26.33,25.86,27.36,27.42,27.75,29.68,30.38,
+30.02,29.36,29.85,29.81,32.18,31.98,31.15,31.84,32.65,32.37,
+33.83,33.58,33.81,34.41,34.59,35.26,36.49,37.15,36.30,36.20,
+37.00,35.87,38.17,38.38,37.42,38.32,38.28,40.40,39.02,40.17,
+38.97,40.73,39.79,40.14,41.20,41.90,43.46,42.52,42.42,44.55,
+42.01,43.27,44.08,42.89,44.32,44.75,45.84,45.91,46.22,47.38,
+46.55,45.26,45.94,46.27,46.80,47.81,46.24,49.27,46.93,49.14,
+48.50,49.16,49.64,51.48,48.20,51.23,52.60,46.96,51.21,50.45,
+51.67,51.53,52.06,51.87,53.46,54.83,51.60,51.84,51.58,54.74,
+53.11,53.96,55.07,54.40,54.06,53.70,56.05,56.03,54.72,54.52,
+54.38,57.28,56.82,57.14,57.09,56.27,58.08,58.93,56.76,53.15,
+57.12,60.36,56.93,57.80,58.92,60.06,58.99,60.98,60.44,59.67,
+61.20,59.45,59.66,61.59,62.68,63.24,63.46,62.21,60.29,62.08,
+61.73,64.48,61.86,63.33,64.95,64.00,62.82,64.41,65.31,63.99,
+65.35,66.12,62.83,62.90,66.59,64.29,63.74,65.16,65.53,64.23,
+67.80,65.78,67.28,66.79,69.96,69.79,67.25,71.00,68.67,69.07,
+70.83,67.84,68.01,68.37,68.43,71.14,66.02,69.61,69.06,68.40,
+72.40,71.71,72.72,70.52,72.83,71.51,71.76,73.44,73.98,72.02,
+70.70,72.10,72.15,71.87,74.64,74.01,71.90,74.06,74.18,73.93,
+73.15,74.69,70.44,74.41,72.96,76.42,72.74,74.62,75.88,74.47,
+72.83,76.22,77.64,75.87,73.52,76.57,74.58,76.84,76.72,78.32,
+78.19,80.38,77.37,78.10,77.83,77.63,80.36,77.09,78.16,78.35,
+80.47,81.72,79.19,79.23,80.16,78.53,79.21,79.25,79.58,82.73,
+83.39,81.49,79.24,82.87,79.65,80.06,84.76,83.99,85.72,83.82,
+82.15,81.10,82.75,82.77,82.40,84.83,82.45,81.10,83.46,82.36,
+84.04,86.64,83.65,84.01,84.69,83.15,83.42,81.79,87.10,88.50,
+86.30,84.86,83.92,84.41,84.30,87.05,83.01,86.31,87.54,88.43,
+88.14,86.27,88.71,83.63,89.11,85.60,87.62,82.16,86.49,81.20,
+19.41,19.76,20.87,21.55,21.33,22.58,23.80,24.80,24.97,26.00,
+25.82,26.52,26.33,26.49,27.61,29.32,30.25,30.23,30.45,31.45,
+30.04,32.05,32.93,33.09,33.29,33.99,34.24,34.26,36.07,36.07,
+35.09,35.43,37.75,37.02,36.47,38.39,39.36,39.77,39.17,39.25,
+39.43,40.34,40.05,41.71,41.41,42.41,41.75,41.95,41.91,43.16,
+43.01,44.58,43.31,43.98,45.28,45.79,45.89,44.14,47.10,47.93,
+45.52,48.17,47.39,47.05,47.93,48.22,47.69,49.28,49.37,48.29,
+48.89,48.45,52.67,50.23,51.71,49.98,52.62,51.31,53.84,54.28,
+54.72,52.41,52.88,51.15,52.12,53.50,53.60,52.76,52.72,54.33,
+56.20,54.81,53.43,54.00,56.57,57.24,55.76,56.02,58.17,57.43,
+57.05,57.58,57.90,62.26,61.30,57.91,60.23,59.76,60.24,58.47,
+60.61,59.70,61.34,59.98,60.07,61.47,63.17,65.21,62.79,61.35,
+62.57,62.21,62.25,64.04,63.74,60.87,64.10,62.80,65.28,65.99,
+64.68,65.57,65.09,67.84,64.06,64.85,66.93,65.45,67.85,66.62,
+66.60,68.91,69.20,70.40,68.50,66.08,70.32,68.77,68.46,69.36,
+68.26,70.42,69.67,70.87,71.03,70.40,70.44,70.24,67.97,70.74,
+72.30,69.81,74.24,69.17,71.40,74.76,73.46,75.06,72.01,72.43,
+77.34,73.83,75.04,74.44,78.76,75.09,75.95,70.55,74.97,72.98,
+72.75,73.89,74.69,76.32,74.71,78.85,77.36,77.21,77.44,77.68,
+77.40,77.11,77.30,76.37,79.95,77.66,79.06,78.08,77.96,82.85,
+80.29,80.55,81.28,78.61,81.98,80.81,79.59,80.30,83.25,78.07,
+83.33,78.10,78.40,83.61,83.88,80.52,83.69,83.49,82.65,85.70,
+84.22,82.58,84.24,83.76,84.73,84.71,81.85,79.21,85.80,81.36,
+85.60,84.31,84.25,87.57,86.92,87.14,84.87,87.54,83.77,84.21,
+89.30,89.47,87.68,88.34,87.05,87.96,85.42,84.50,85.41,88.08,
+86.26,84.24,88.94,91.31,87.36,90.51,90.71,87.85,92.27,89.24,
+86.37,86.46,93.32,90.87,90.36,90.06,88.59,92.33,91.68,93.84,
+91.02,90.30,93.09,91.08,91.69,94.42,91.96,94.47,94.14,92.75,
+91.78,95.50,89.89,92.02,95.92,94.16,96.39,96.25,90.37,98.22,
+20.11,21.00,23.02,22.08,23.35,25.21,24.60,26.13,25.79,26.80,
+27.72,28.48,28.86,29.21,29.90,30.20,30.92,30.35,34.05,32.48,
+33.50,33.51,35.09,34.04,34.01,36.44,37.22,36.24,35.75,36.41,
+37.41,37.19,38.78,39.71,40.10,39.08,41.14,42.22,41.50,41.16,
+42.65,42.93,44.20,45.02,43.55,44.22,44.35,43.82,44.17,43.52,
+43.68,47.23,46.41,47.41,48.57,48.52,48.26,49.14,49.58,49.77,
+48.74,49.39,48.67,51.48,53.00,50.49,50.99,50.93,52.52,50.60,
+51.40,52.00,51.92,53.91,54.42,55.13,54.52,56.63,57.25,56.86,
+57.27,54.81,56.04,58.75,57.80,58.07,57.02,59.86,56.41,58.29,
+59.11,61.29,60.35,57.50,62.96,60.94,59.02,59.16,62.70,62.61,
+62.24,63.05,61.82,61.85,62.48,63.24,61.20,62.31,62.72,62.28,
+65.63,66.00,61.19,67.41,64.01,66.78,67.57,65.46,67.89,70.58,
+66.89,65.11,64.97,71.92,68.75,67.83,67.78,67.58,67.25,71.13,
+69.14,68.82,71.59,68.63,68.66,69.47,70.91,71.64,74.34,68.90,
+71.16,71.27,72.90,72.85,72.37,73.93,73.30,73.44,72.69,75.93,
+73.69,75.05,73.96,73.37,73.97,76.53,74.91,75.24,76.88,75.33,
+77.17,77.60,74.99,73.38,78.58,74.22,76.03,80.28,78.72,75.92,
+80.97,77.04,78.56,79.95,82.16,80.48,80.01,81.37,81.20,78.49,
+79.27,81.25,79.00,77.74,83.88,83.76,83.31,80.13,82.29,80.41,
+79.31,87.06,83.50,85.62,82.34,81.76,82.94,83.76,84.18,83.42,
+84.02,82.90,84.49,84.22,85.19,82.80,88.05,86.39,83.76,83.62,
+85.13,85.82,87.57,86.89,85.78,88.05,86.09,88.53,89.47,86.02,
+88.95,89.29,87.75,94.73,93.32,87.69,91.27,88.57,85.86,93.31,
+95.07,89.08,92.44,89.38,93.07,93.02,90.43,92.42,92.90,92.20,
+92.37,93.64,92.15,94.31,91.50,91.57,97.45,95.55,92.08,93.20,
+94.36,94.65,94.99,98.49,95.70,93.71,93.48,94.97,95.65,93.62,
+96.91,95.63,98.27,94.90,96.76,99.29,96.89,102.17,97.54,99.06,
+97.65,103.14,97.53,99.95,97.92,98.22,94.77,100.56,95.90,98.78,
+101.48,99.17,99.40,103.94,98.45,100.58,100.22,99.87,99.19,100.06,
+21.34,21.89,23.34,23.76,24.39,26.15,25.01,27.70,27.42,29.71,
+29.51,29.09,29.19,31.40,31.67,32.09,32.18,32.65,33.82,33.78,
+34.62,35.65,37.20,37.02,35.95,36.13,37.71,38.90,38.11,40.26,
+39.02,39.77,41.85,40.00,41.50,42.01,42.09,43.12,42.89,44.64,
+45.97,45.93,45.67,45.89,47.54,46.19,46.33,47.44,46.76,45.79,
+48.21,48.75,50.28,48.85,50.02,51.69,50.11,49.62,50.94,51.32,
+54.07,50.41,51.09,53.63,51.79,53.73,52.32,54.44,55.99,55.10,
+55.02,55.65,55.98,54.93,58.68,57.31,57.29,59.35,56.43,58.75,
+60.22,56.05,56.09,60.50,61.64,60.54,60.04,60.05,60.59,60.01,
+64.14,61.04,63.56,61.12,62.58,64.16,61.95,63.72,64.87,62.68,
+64.57,66.24,67.54,65.12,65.04,68.50,64.66,68.21,65.45,66.24,
+67.70,65.70,69.78,67.22,70.78,70.83,70.28,70.45,68.68,71.02,
+72.91,69.05,70.16,71.99,71.47,72.83,72.14,73.10,73.22,74.41,
+71.73,70.69,74.68,74.63,70.38,74.06,78.40,72.47,76.60,75.31,
+75.96,77.15,75.67,78.01,78.13,76.83,74.51,77.69,79.38,78.18,
+79.16,76.77,75.89,77.17,79.34,81.82,79.98,79.49,80.87,80.42,
+77.54,82.26,79.26,79.78,79.96,79.48,83.48,82.69,81.03,79.96,
+80.52,79.57,83.33,82.39,81.09,83.12,82.93,84.05,83.41,83.52,
+84.25,84.48,86.60,84.09,87.77,85.32,86.48,86.09,91.44,88.98,
+85.34,86.07,89.15,88.25,87.16,89.53,86.89,86.32,89.59,87.85,
+89.54,85.85,87.48,89.72,89.90,90.00,90.20,88.95,86.75,87.64,
+89.12,91.24,89.30,92.68,93.99,96.98,88.53,93.41,92.59,93.10,
+90.72,93.14,94.32,95.21,93.77,93.43,93.50,93.42,94.96,97.83,
+92.74,95.06,96.08,97.15,92.56,96.53,99.09,95.69,93.94,98.23,
+99.20,98.31,101.88,97.79,98.70,99.01,98.91,100.45,99.22,97.54,
+97.23,98.40,98.32,100.78,103.83,98.95,100.71,103.29,101.88,102.90,
+97.10,98.98,102.65,100.37,103.97,102.20,100.16,102.48,104.98,100.66,
+101.28,104.27,103.29,106.66,103.79,110.96,102.49,102.72,102.27,100.31,
+100.83,101.66,107.68,100.74,106.37,106.16,103.47,105.72,107.07,101.73,
+22.11,23.23,24.22,24.21,26.29,25.94,26.11,28.08,29.72,28.88,
+29.42,31.14,31.03,34.06,32.33,31.54,34.08,33.85,33.63,34.79,
+35.54,36.00,36.39,38.44,38.83,38.17,38.96,41.49,41.56,40.08,
+41.86,40.97,40.23,42.32,42.43,44.91,44.48,43.25,46.55,46.73,
+46.18,46.30,45.83,47.18,46.75,47.91,46.77,48.57,50.89,50.02,
+49.22,49.83,52.03,49.74,51.69,51.80,52.57,52.93,55.07,51.65,
+54.71,53.59,54.45,56.97,57.38,54.96,54.81,58.21,58.91,58.68,
+57.59,56.56,56.17,57.43,59.43,56.38,60.89,59.45,59.26,63.22,
+59.09,61.79,60.70,62.85,61.36,61.73,61.51,62.65,65.24,65.10,
+62.56,65.59,63.36,65.51,63.19,62.88,67.55,65.22,65.83,65.45,
+67.88,67.42,68.92,67.57,70.13,67.39,68.48,68.94,71.64,69.45,
+67.27,68.93,71.58,68.16,73.87,72.68,70.45,73.38,72.15,71.90,
+72.11,72.58,73.35,73.77,74.63,75.37,75.44,75.93,76.34,76.23,
+77.04,75.71,75.31,76.17,78.46,75.38,78.41,78.93,81.68,78.56,
+77.24,78.29,78.66,74.55,78.99,76.70,79.14,79.93,78.90,81.17,
+81.80,80.32,81.90,78.25,83.33,83.82,82.73,82.66,84.46,83.22,
+80.71,83.47,83.78,86.78,87.94,83.51,83.93,84.00,87.27,84.77,
+87.46,84.18,86.54,84.84,86.73,87.21,86.03,88.26,84.22,87.24,
+85.93,86.27,90.76,89.55,88.75,91.38,84.41,88.39,88.31,92.03,
+89.29,90.14,91.87,86.98,94.85,87.79,89.16,89.96,90.77,93.34,
+93.97,90.27,95.17,91.72,89.99,96.43,95.25,93.90,95.83,93.90,
+94.91,93.97,94.77,94.14,93.46,92.90,95.28,99.43,95.63,101.72,
+98.25,98.69,95.36,99.05,93.21,97.18,99.60,100.40,100.08,94.82,
+100.33,98.10,100.18,98.16,100.35,99.38,104.11,101.57,101.55,96.82,
+100.04,99.94,98.89,100.41,102.09,101.22,101.71,101.87,102.07,104.26,
+101.39,103.58,103.46,101.76,105.04,104.69,105.39,106.50,99.02,101.65,
+105.56,106.65,107.50,107.81,103.97,106.28,107.58,104.56,108.03,110.26,
+107.99,104.79,106.33,106.84,107.40,110.15,106.37,108.51,105.32,109.44,
+109.13,108.98,113.00,111.96,108.87,110.20,107.61,108.93,112.31,111.62,
+22.59,23.11,24.13,25.30,25.78,27.76,27.96,29.01,30.04,29.97,
+30.92,31.30,31.31,34.07,35.33,33.53,33.10,35.02,37.22,35.81,
+37.66,38.32,38.53,39.65,38.32,39.89,39.99,41.01,38.11,40.16,
+42.37,44.03,44.17,43.32,43.87,45.07,45.36,46.21,45.94,46.18,
+46.79,48.69,49.63,49.31,47.80,48.81,51.69,53.06,50.43,51.29,
+51.99,52.50,52.67,53.59,54.96,52.52,52.09,55.82,55.00,56.41,
+55.69,55.67,57.36,54.93,58.60,56.63,57.80,58.45,57.61,57.81,
+61.94,61.11,59.20,59.88,60.64,62.09,60.31,60.81,61.95,61.40,
+63.44,66.77,64.33,64.96,63.57,65.37,64.35,65.21,65.37,64.84,
+64.94,69.19,66.39,66.21,68.06,65.98,67.47,65.17,68.98,70.28,
+68.15,66.03,69.55,67.85,69.78,71.19,68.72,69.03,73.64,71.37,
+73.52,71.68,71.89,72.38,74.64,74.78,75.24,73.53,76.75,77.43,
+73.59,77.98,73.33,78.58,76.31,82.34,77.94,79.80,77.02,76.98,
+79.84,79.41,76.39,76.45,79.08,78.73,80.19,82.67,79.56,79.50,
+80.52,80.15,81.95,80.03,84.52,86.02,82.30,83.05,83.94,82.99,
+86.33,82.65,85.66,81.45,83.26,82.77,85.61,82.72,86.92,83.40,
+86.24,86.44,86.04,83.12,86.80,88.98,86.27,89.20,86.62,86.84,
+87.28,88.19,87.09,91.34,88.62,89.75,94.68,91.29,88.54,89.99,
+89.12,93.72,90.60,89.61,91.65,91.73,92.78,94.73,94.22,95.53,
+94.18,92.63,93.87,97.72,97.78,90.72,91.02,93.76,98.12,94.81,
+95.33,96.47,95.67,96.32,97.94,101.86,99.13,98.52,95.73,94.96,
+101.32,95.69,100.67,95.67,97.32,96.58,99.72,99.64,98.90,98.51,
+103.48,99.07,99.99,101.74,97.56,100.81,102.97,99.32,102.25,102.30,
+104.54,105.91,100.89,100.51,105.32,103.32,103.97,102.84,106.12,105.08,
+106.51,104.51,106.33,104.07,101.33,104.14,103.17,106.49,104.35,106.31,
+105.02,112.58,107.75,106.57,109.25,109.76,108.76,111.14,109.47,112.14,
+107.87,105.66,109.41,109.20,107.11,109.66,108.08,109.93,110.88,112.34,
+108.66,107.48,113.43,111.41,107.35,111.66,108.87,111.51,109.63,109.01,
+109.29,106.83,110.77,115.28,112.16,111.27,114.30,111.08,114.92,110.02,
+22.40,23.95,24.06,25.20,26.02,27.58,27.76,29.30,30.61,29.50,
+31.35,31.81,31.42,32.65,34.92,35.20,35.28,36.69,36.77,37.12,
+36.79,37.19,39.48,38.95,39.64,41.90,42.51,41.84,41.37,43.43,
+42.54,43.18,44.44,45.52,43.50,45.55,45.49,46.75,46.63,49.20,
+49.23,49.24,50.88,49.07,50.16,48.16,50.78,49.85,50.43,51.58,
+51.67,54.03,53.71,53.81,54.86,55.20,57.17,55.38,53.84,58.23,
+56.03,57.49,56.86,57.63,59.75,58.61,59.73,60.07,59.92,60.78,
+57.64,60.94,63.13,61.45,62.44,61.86,63.31,65.13,61.34,63.58,
+61.04,63.97,63.45,66.71,64.94,64.76,66.09,66.18,67.74,69.14,
+68.95,67.19,68.03,69.06,70.40,68.59,71.24,68.57,72.93,70.63,
+72.56,69.34,73.25,72.23,71.81,74.01,74.14,72.17,73.33,74.79,
+76.57,75.63,74.48,74.64,76.06,75.28,76.24,75.78,77.12,75.87,
+77.38,77.00,78.12,79.69,80.25,80.10,79.76,79.27,76.82,79.47,
+81.91,80.47,79.39,76.50,81.10,80.68,81.08,83.74,84.59,84.83,
+82.19,81.09,83.26,84.56,80.43,81.05,84.21,85.68,82.41,84.67,
+84.66,84.98,87.65,88.05,84.46,85.71,83.78,83.61,86.86,91.16,
+88.75,89.06,86.15,94.46,92.79,92.03,86.48,88.03,90.45,91.73,
+92.77,94.41,89.64,93.22,88.40,95.62,92.35,92.88,96.22,91.72,
+91.42,93.35,95.82,96.51,93.93,99.23,92.54,95.52,93.55,98.21,
+95.68,97.79,99.91,97.83,93.25,97.62,96.23,95.66,97.93,96.80,
+95.68,96.92,98.86,101.09,101.56,97.95,97.80,99.06,101.37,96.35,
+100.13,98.80,101.14,99.30,102.40,99.78,102.76,103.67,102.23,104.54,
+100.30,99.40,102.40,104.78,105.54,103.72,97.81,106.91,102.41,102.92,
+104.12,104.31,105.90,106.04,104.62,102.73,105.76,108.04,104.63,107.52,
+104.30,109.17,101.86,104.78,108.39,106.29,108.51,107.09,104.19,109.26,
+105.07,110.78,105.85,111.12,114.32,104.26,107.54,112.59,111.19,108.55,
+114.50,111.22,106.90,111.62,115.45,106.42,114.47,115.52,112.34,110.83,
+110.86,115.89,118.44,114.38,111.51,114.46,112.21,115.28,111.14,115.23,
+118.94,116.74,116.71,115.07,116.11,112.81,120.36,117.83,116.27,118.75,
+24.09,24.81,25.74,26.23,26.92,28.33,29.01,28.97,30.85,31.94,
+31.71,32.55,32.56,33.33,34.42,36.23,36.70,35.62,37.79,37.48,
+37.95,38.59,40.64,39.66,41.34,40.67,40.00,42.30,42.57,43.38,
+44.35,45.76,44.92,44.04,48.10,45.66,46.86,47.89,48.68,49.07,
+48.61,47.82,50.22,51.01,50.55,50.83,52.99,53.45,52.26,51.46,
+53.06,55.44,52.27,52.44,54.85,55.02,56.56,58.01,55.81,56.08,
+56.99,57.58,57.30,58.80,59.75,57.67,58.83,62.85,59.22,63.96,
+61.72,62.69,64.29,64.02,63.16,63.24,63.53,65.54,66.23,62.08,
+69.76,66.73,66.40,67.62,66.37,66.14,68.29,67.90,68.19,69.93,
+69.36,69.39,70.40,71.40,70.84,68.04,69.15,70.74,71.72,73.17,
+73.55,74.07,69.68,74.35,71.89,72.36,74.55,75.59,74.49,79.11,
+77.35,76.53,76.68,76.41,76.53,76.80,77.64,78.68,78.33,76.98,
+80.41,76.87,80.99,81.64,85.78,79.77,81.74,78.97,83.61,80.88,
+81.81,83.76,84.20,80.82,81.67,82.90,80.50,82.55,83.85,82.74,
+84.95,84.43,83.93,88.25,82.97,91.38,86.78,87.78,86.88,87.27,
+87.88,86.61,87.59,90.78,87.51,88.34,88.93,88.08,89.62,91.48,
+94.18,87.63,89.03,87.73,93.70,94.42,93.21,90.52,90.38,88.27,
+92.64,91.76,92.93,93.08,96.22,93.56,92.10,94.91,95.50,92.39,
+97.30,93.77,95.87,94.22,98.32,95.07,98.63,98.06,96.58,96.99,
+96.49,98.36,101.20,97.64,103.07,99.58,97.51,98.15,93.82,99.43,
+98.05,102.68,100.54,98.91,102.33,100.90,100.00,100.52,100.95,102.64,
+100.06,100.62,105.12,101.85,99.89,104.12,102.87,105.30,101.89,104.42,
+108.27,104.34,102.27,102.31,105.29,109.33,104.89,106.55,106.01,106.79,
+106.58,104.80,105.71,105.64,107.54,105.69,110.65,108.26,107.78,108.37,
+103.85,110.39,112.86,110.86,109.75,110.56,107.63,107.27,114.70,112.96,
+111.73,109.35,103.27,111.47,114.23,109.09,106.82,110.86,114.61,115.46,
+109.09,114.46,112.95,116.31,109.19,114.36,117.70,115.33,114.59,114.92,
+114.51,115.47,118.99,113.14,109.90,116.06,114.55,117.67,114.99,121.65,
+115.70,116.75,119.32,115.92,113.14,118.09,118.01,123.15,112.64,117.88,
+23.55,25.13,26.25,27.20,26.48,28.12,27.87,30.54,29.92,31.69,
+32.87,32.46,33.99,34.27,35.71,36.77,38.58,36.29,37.71,37.64,
+39.20,38.67,40.08,42.02,40.36,40.96,42.71,43.55,43.43,43.23,
+45.75,45.10,45.95,47.89,45.39,45.35,46.67,47.81,48.86,49.53,
+50.14,49.82,52.33,52.46,52.17,52.46,51.68,51.97,51.55,53.39,
+53.54,55.75,53.05,56.47,57.89,56.56,56.58,56.57,56.56,55.99,
+59.50,56.70,60.97,59.09,60.75,61.11,62.76,60.53,58.33,62.63,
+60.31,60.91,64.18,65.15,63.96,65.50,65.72,64.22,67.21,66.24,
+64.78,65.83,66.86,65.18,67.02,67.88,70.06,67.92,64.86,68.06,
+71.06,68.86,70.08,69.16,71.09,73.39,70.37,71.57,73.16,70.65,
+75.67,73.04,74.08,75.48,71.51,74.57,74.59,74.80,78.49,74.39,
+75.00,75.27,80.17,77.93,77.52,74.98,80.96,77.80,77.83,76.42,
+77.19,79.79,78.89,80.31,80.05,82.19,82.09,82.74,84.95,81.11,
+84.63,81.19,82.05,86.76,85.58,82.98,85.08,84.08,84.58,82.65,
+81.85,83.64,84.58,84.90,88.62,89.77,84.87,88.68,88.11,89.40,
+87.82,86.62,86.09,89.64,94.18,89.76,88.50,89.11,89.87,92.46,
+89.74,88.67,91.70,91.78,91.70,93.63,95.14,94.12,93.71,90.16,
+95.54,93.18,93.09,97.68,98.88,96.69,94.15,93.59,96.23,91.85,
+94.63,98.40,94.00,96.50,99.15,95.89,95.72,94.76,95.97,102.81,
+97.62,98.57,97.52,101.19,103.65,99.06,101.15,97.28,99.17,96.52,
+99.88,100.99,100.18,100.86,101.81,98.53,102.84,103.42,102.81,101.07,
+100.50,102.48,103.35,103.74,106.35,105.99,106.94,107.45,105.09,106.50,
+107.12,103.85,107.01,104.01,103.74,105.44,111.85,113.12,107.29,104.43,
+104.80,105.88,112.44,106.90,111.57,108.87,108.66,104.32,107.93,108.67,
+110.03,107.50,109.92,113.46,110.97,108.47,111.72,114.15,113.36,116.13,
+115.02,113.69,108.74,116.63,111.93,109.01,114.22,110.19,111.24,114.70,
+113.80,116.33,108.68,114.27,116.54,118.08,117.22,115.51,117.12,117.60,
+119.04,115.37,119.81,114.73,118.18,115.20,121.20,117.50,116.17,121.41,
+120.24,120.82,123.41,116.56,118.88,118.47,115.73,119.33,121.13,119.82,
+22.80,24.01,25.76,26.20,26.18,27.89,29.15,31.58,30.55,31.15,
+32.48,33.03,33.27,34.87,34.67,35.32,36.53,37.08,37.83,37.97,
+38.71,39.00,40.19,40.26,42.33,42.34,42.54,42.56,41.62,44.47,
+45.11,46.30,45.14,46.08,46.28,45.78,47.96,46.28,48.44,48.32,
+49.61,50.15,50.34,50.82,52.69,52.02,53.24,52.57,53.81,53.63,
+54.16,54.42,55.87,55.71,55.64,55.89,57.13,57.58,58.35,58.59,
+57.11,59.01,60.28,58.75,60.95,60.13,63.33,60.57,60.82,60.22,
+60.31,61.50,63.81,64.31,63.77,64.72,63.88,66.95,66.58,66.97,
+66.95,68.55,68.27,67.80,68.24,67.07,66.39,66.11,68.76,68.53,
+70.15,69.58,70.53,73.06,73.20,70.36,70.36,69.67,73.53,72.24,
+73.00,75.93,74.91,75.19,73.82,75.33,71.74,75.26,75.65,76.30,
+75.82,74.18,75.48,77.07,78.32,78.04,78.20,80.63,81.73,77.93,
+77.57,80.91,79.81,81.56,79.08,79.70,82.92,80.41,84.23,78.23,
+81.55,80.57,84.34,85.92,83.77,83.77,85.45,86.13,86.31,82.66,
+84.43,86.47,84.44,83.28,86.45,88.58,84.58,85.33,85.53,88.08,
+89.92,84.86,89.13,88.15,89.11,89.15,91.52,91.25,89.75,88.24,
+92.54,95.68,91.86,92.11,92.85,95.39,91.04,93.12,91.62,90.42,
+95.89,94.77,92.50,91.82,97.06,94.37,95.04,100.29,94.10,98.35,
+93.99,94.71,96.98,95.13,99.25,95.93,95.06,95.54,97.11,100.33,
+99.17,97.76,102.07,99.99,98.05,99.54,102.38,101.25,99.43,100.26,
+101.99,102.36,100.12,100.90,103.82,96.93,101.93,105.28,103.57,102.61,
+104.48,103.21,104.46,107.47,101.50,103.86,101.42,107.15,103.11,105.58,
+108.31,102.32,109.20,107.35,109.14,105.29,107.41,103.68,106.10,110.72,
+102.41,107.25,105.69,106.19,106.46,110.44,105.52,108.56,108.40,108.54,
+112.33,109.50,108.29,115.38,113.93,110.58,107.38,111.85,110.25,115.38,
+110.75,110.08,114.69,110.54,115.12,108.74,112.77,114.90,111.23,113.32,
+116.29,118.53,114.28,114.49,113.79,114.89,112.90,113.95,116.56,119.35,
+118.60,119.59,119.77,117.58,111.37,114.02,116.63,122.02,123.01,115.86,
+117.00,120.05,115.65,117.81,115.59,115.86,122.75,114.81,117.81,120.62,
+24.06,24.41,24.98,26.48,27.58,28.42,30.12,29.47,29.90,31.28,
+33.09,33.28,33.01,34.37,33.94,36.65,36.13,36.85,37.20,38.56,
+39.98,39.01,40.10,42.77,40.68,41.15,44.01,42.67,43.66,45.06,
+44.63,45.94,45.81,46.31,47.49,47.40,48.52,48.17,49.49,50.50,
+49.16,49.27,48.87,49.25,50.15,50.18,54.61,52.83,52.16,52.29,
+53.47,53.32,52.01,55.88,55.24,57.87,58.08,57.89,55.11,59.21,
+58.31,60.70,60.39,58.63,62.62,60.28,61.28,61.63,62.72,63.25,
+66.14,63.61,63.27,63.61,64.64,64.39,61.91,66.29,64.41,65.97,
+66.26,63.52,68.15,66.41,68.65,68.22,70.18,68.25,71.88,70.90,
+72.20,68.02,70.54,70.48,69.96,73.07,71.47,75.57,70.52,69.48,
+75.83,73.52,76.61,71.93,75.94,75.81,76.56,73.83,74.08,75.67,
+75.58,73.76,77.56,75.53,78.05,78.87,79.80,79.95,76.59,79.41,
+77.71,76.70,79.27,77.20,80.39,81.40,80.31,81.74,81.04,81.81,
+85.57,82.40,84.95,80.71,81.80,83.61,87.77,83.41,85.21,84.47,
+86.07,85.64,84.21,87.02,86.57,84.44,87.39,85.60,83.89,90.00,
+89.17,86.46,91.00,87.28,89.61,87.00,92.55,90.24,87.67,86.12,
+90.87,90.83,90.60,90.87,91.94,95.07,91.53,92.33,93.53,92.23,
+93.88,96.32,94.89,94.43,94.27,91.36,92.01,93.67,97.69,97.93,
+96.40,90.72,98.92,97.36,100.97,96.60,95.90,101.13,96.47,96.92,
+100.35,102.28,99.95,98.76,99.64,103.14,100.43,96.74,102.57,101.01,
+101.80,103.45,102.51,100.75,101.38,103.55,100.84,103.01,103.20,104.19,
+105.62,103.49,105.05,107.30,103.61,105.41,107.49,103.72,107.25,105.36,
+105.31,104.56,107.67,107.81,103.23,105.69,108.16,106.18,102.77,108.47,
+106.09,106.33,105.18,110.28,110.36,108.90,108.42,106.87,110.44,109.37,
+109.30,115.29,115.38,110.42,109.93,112.20,111.68,113.45,115.15,113.29,
+115.20,112.71,107.07,117.04,112.16,114.09,116.14,110.75,110.76,114.10,
+112.18,112.82,118.10,111.56,112.34,112.83,115.30,112.70,112.95,117.19,
+115.49,121.48,118.31,112.02,115.22,116.72,120.82,113.37,118.99,117.91,
+116.98,117.29,120.27,120.73,118.62,120.22,120.43,120.82,118.19,117.20,
+23.10,24.37,25.35,26.38,26.47,27.17,28.60,28.40,30.85,29.86,
+32.08,32.10,33.21,34.23,35.85,34.65,36.57,36.81,37.27,36.49,
+39.53,38.62,39.17,41.74,39.58,41.45,41.02,42.77,43.86,43.76,
+44.48,44.07,44.79,46.16,45.21,48.32,47.47,47.45,46.78,47.78,
+50.50,52.41,52.07,54.20,51.26,50.89,52.99,53.60,51.76,55.94,
+53.23,53.16,51.93,52.95,54.79,55.55,56.01,58.11,57.46,58.75,
+57.80,60.27,59.16,61.48,58.95,60.74,58.63,60.54,60.74,59.36,
+61.87,62.36,64.32,63.53,63.09,63.91,63.38,67.94,69.89,68.19,
+67.27,66.86,68.73,66.55,66.28,68.71,70.96,70.26,69.11,68.75,
+69.78,70.37,70.31,71.83,69.45,70.36,72.76,70.17,74.16,71.14,
+76.87,72.84,72.06,74.84,71.97,71.73,76.12,72.96,73.31,76.56,
+77.07,71.03,75.29,75.06,77.56,79.30,77.12,78.67,77.27,79.73,
+80.95,77.39,76.88,81.49,82.50,82.33,83.32,85.31,80.79,81.04,
+80.19,82.46,85.10,87.96,84.81,80.18,83.86,84.13,84.92,84.44,
+83.24,85.35,84.26,85.46,86.00,84.44,85.33,89.18,84.87,91.46,
+89.82,90.05,89.08,89.76,90.56,84.98,88.76,92.34,90.35,89.15,
+89.87,96.73,89.04,90.88,91.75,94.99,92.65,91.80,91.91,93.45,
+93.97,95.40,92.02,93.94,96.62,95.42,96.04,96.35,97.37,98.35,
+91.96,96.68,96.50,93.31,96.62,96.92,99.51,98.69,97.57,98.77,
+96.61,98.65,98.98,97.52,98.01,100.13,97.98,102.02,99.09,99.10,
+103.46,102.23,102.26,99.50,101.97,101.72,103.99,104.17,103.83,96.79,
+99.50,104.84,96.86,100.21,105.32,104.35,103.64,107.41,104.55,106.38,
+103.71,107.94,100.73,110.92,106.77,102.87,105.47,110.40,107.83,103.01,
+107.36,106.27,109.55,107.08,107.62,107.65,110.88,111.17,114.83,112.27,
+108.11,110.10,110.80,111.73,110.77,109.48,109.65,112.91,112.09,113.78,
+114.23,107.34,111.94,113.57,114.70,117.68,113.10,111.98,107.55,116.24,
+114.27,111.17,116.60,115.44,111.03,115.08,114.98,113.04,112.87,115.75,
+115.71,116.58,113.39,113.90,119.70,115.66,118.89,116.09,114.78,117.98,
+115.71,117.79,118.62,119.98,113.55,124.16,121.33,117.83,120.24,117.93,
+22.96,24.06,24.39,25.84,26.57,27.38,28.66,29.95,29.78,30.79,
+30.04,31.65,32.95,33.47,34.58,35.42,37.40,35.93,37.65,36.77,
+37.60,39.62,39.56,41.04,39.34,40.46,42.88,41.37,44.58,43.73,
+44.00,46.12,45.16,45.77,46.85,46.19,46.55,50.11,47.91,46.46,
+49.07,49.84,50.85,51.11,50.89,52.64,51.21,50.86,53.44,52.51,
+54.79,51.86,52.52,55.22,56.37,54.54,57.95,55.46,56.75,58.72,
+59.93,59.17,60.17,56.53,61.12,59.78,59.81,63.04,62.29,61.22,
+60.40,62.73,63.33,60.24,62.29,62.07,64.22,63.38,64.05,67.45,
+65.93,66.45,65.18,68.09,65.85,67.34,69.78,68.63,69.57,73.15,
+71.24,67.90,70.87,71.04,69.96,71.10,68.91,70.71,70.40,69.03,
+69.75,74.46,73.03,73.77,73.86,74.92,75.84,75.75,72.67,74.22,
+75.80,73.63,74.26,77.05,78.96,76.40,79.73,77.23,78.59,75.79,
+77.05,74.07,78.33,81.37,78.29,77.12,80.28,80.55,81.10,84.21,
+81.38,82.75,84.06,83.05,84.92,84.53,83.10,82.04,86.87,81.93,
+85.92,85.12,83.50,80.77,84.79,83.66,90.54,82.68,89.52,88.23,
+89.30,91.28,86.37,87.05,84.71,88.95,89.33,91.56,88.45,88.25,
+92.31,87.32,88.71,92.65,88.24,92.46,89.13,92.50,87.49,93.38,
+91.64,95.87,94.47,92.00,93.85,97.19,94.05,95.72,93.49,91.63,
+92.97,94.90,97.84,92.00,96.54,94.09,100.35,93.46,94.54,91.41,
+99.44,94.24,100.18,96.39,102.75,100.68,98.48,98.95,100.67,98.61,
+101.81,96.58,96.01,96.04,99.46,99.89,104.04,100.95,101.43,101.34,
+100.33,104.36,105.99,103.25,102.25,101.79,103.50,103.87,103.50,103.55,
+102.94,102.97,104.17,105.80,106.52,103.60,107.19,105.74,107.16,102.34,
+102.57,108.72,106.09,105.79,104.72,104.51,107.72,110.38,108.22,107.16,
+108.48,111.93,108.46,108.63,110.61,108.92,108.63,109.86,111.29,106.47,
+112.67,113.94,111.98,106.97,111.72,116.10,112.63,115.88,113.74,111.30,
+115.69,112.20,112.34,113.70,116.92,112.49,115.28,112.09,116.32,115.33,
+113.77,119.03,118.95,118.31,115.06,117.28,120.22,115.16,115.31,117.31,
+113.02,113.85,116.10,114.29,118.52,116.93,116.94,115.22,122.19,122.59,
+22.51,23.71,25.02,26.25,26.65,27.87,27.88,29.07,29.57,30.23,
+31.13,32.87,32.28,32.71,33.58,34.54,35.53,36.00,36.41,38.93,
+38.32,37.76,39.51,40.28,39.06,40.29,41.63,42.07,43.73,45.52,
+43.28,44.47,44.81,46.15,45.56,46.43,45.91,47.98,46.38,49.45,
+47.91,47.80,51.57,50.96,52.12,51.05,50.93,52.15,53.37,52.35,
+52.21,55.71,54.10,55.68,53.98,56.04,57.28,55.37,57.04,58.45,
+59.10,57.41,59.11,57.54,60.47,59.70,59.91,58.07,61.19,60.74,
+60.47,62.19,62.01,61.20,62.64,62.54,61.13,64.39,63.39,66.44,
+65.37,64.09,65.97,65.31,67.01,65.87,66.90,65.34,69.13,67.11,
+67.80,68.36,69.12,73.70,69.85,68.63,69.70,72.73,73.24,70.57,
+70.90,74.18,70.83,72.95,71.66,73.18,72.12,73.22,75.91,74.13,
+72.39,75.22,77.64,75.74,74.82,75.48,72.87,75.42,76.86,77.86,
+78.60,77.01,75.00,81.37,78.17,78.16,77.71,78.81,80.68,79.48,
+79.39,80.07,82.49,80.18,78.80,83.28,81.84,83.54,86.46,81.16,
+83.26,84.86,85.28,84.25,87.90,85.30,87.62,83.06,85.59,85.18,
+87.70,87.27,86.63,85.43,86.81,88.78,91.44,87.47,86.18,87.68,
+87.43,85.08,89.65,86.76,91.01,93.10,86.86,89.45,88.06,90.77,
+91.58,93.61,90.55,90.67,90.56,93.40,90.93,96.38,94.56,96.79,
+92.96,91.53,97.58,94.54,93.16,94.69,94.88,97.41,92.91,98.46,
+96.68,93.47,97.03,100.59,95.84,98.52,97.72,98.45,101.82,100.19,
+102.13,97.42,100.18,96.87,99.51,102.05,101.97,102.08,99.55,101.43,
+98.11,101.01,99.46,97.54,101.48,105.45,99.12,99.74,101.64,106.00,
+102.07,106.23,101.94,105.04,103.48,107.61,104.49,104.35,105.51,102.22,
+107.75,105.96,107.40,104.95,106.54,104.14,107.59,109.38,105.44,106.95,
+105.33,109.05,106.08,108.01,107.65,107.66,108.60,108.87,105.12,107.56,
+112.37,111.31,113.70,113.06,108.92,109.63,108.33,110.93,111.00,116.82,
+110.14,110.10,113.85,111.70,115.79,113.57,117.09,114.68,107.01,115.89,
+111.01,111.30,116.18,114.61,112.33,113.94,115.53,114.12,118.68,117.48,
+114.68,118.52,118.65,121.10,118.56,116.66,114.91,116.82,117.32,121.38,
+21.41,23.90,24.60,25.01,26.70,27.06,28.31,28.37,28.09,31.17,
+30.29,32.79,32.27,31.69,33.05,34.61,34.75,34.85,36.36,37.28,
+37.93,37.61,38.04,38.89,39.04,41.77,40.97,41.86,41.48,41.59,
+43.26,42.06,44.39,44.79,44.61,44.45,46.64,45.24,46.93,46.91,
+47.08,49.76,49.32,49.90,49.82,48.38,50.11,49.72,49.88,49.35,
+53.95,54.32,53.84,51.93,53.84,54.73,57.27,55.45,55.40,54.81,
+57.31,56.60,57.84,56.70,56.94,58.75,58.18,58.51,58.96,60.52,
+62.73,62.43,62.54,61.07,63.37,61.61,62.86,63.42,62.73,63.66,
+63.96,65.17,63.15,64.20,64.53,68.06,64.49,67.65,69.56,69.34,
+69.10,68.78,67.92,65.57,69.46,71.04,71.78,70.70,71.50,68.29,
+69.99,70.33,71.14,71.38,72.25,72.53,69.80,72.58,75.16,75.21,
+73.11,72.79,73.73,75.74,76.58,77.99,75.89,77.25,73.92,74.89,
+75.07,76.16,76.25,78.07,77.42,76.55,79.96,79.88,79.93,78.65,
+81.51,79.39,76.81,81.42,78.28,84.25,80.29,80.54,83.46,81.52,
+81.55,81.76,82.50,81.80,84.52,84.88,84.38,84.71,83.12,86.85,
+84.40,84.01,86.22,82.91,81.43,87.45,82.64,85.48,88.96,86.63,
+87.65,85.30,88.77,84.44,89.49,89.09,85.49,89.46,89.83,93.52,
+88.56,88.90,91.21,91.51,90.24,89.04,91.31,94.04,89.48,88.25,
+95.75,94.57,92.02,92.12,92.76,94.65,95.92,92.39,91.97,97.62,
+93.55,92.70,97.99,96.27,99.48,97.55,95.09,95.74,98.26,96.37,
+98.86,95.76,100.06,102.23,99.05,99.94,97.67,98.10,101.29,97.64,
+99.62,101.69,98.36,99.62,104.86,103.41,100.70,100.34,100.66,102.37,
+97.45,98.96,98.16,100.44,104.68,102.57,104.22,102.51,103.49,104.65,
+106.73,106.50,100.93,101.95,107.38,107.52,100.88,108.19,105.07,108.70,
+104.35,105.36,106.70,103.96,107.44,109.01,105.51,108.23,109.05,106.78,
+107.70,111.58,107.87,111.63,108.09,105.91,111.71,111.53,107.73,104.07,
+112.51,111.52,112.05,112.17,113.23,111.95,113.21,109.67,111.61,109.69,
+110.99,115.21,108.41,114.80,112.96,112.25,116.19,111.77,116.36,119.05,
+111.52,121.32,114.17,115.13,115.07,115.02,115.08,111.26,118.50,113.72,
+18.18,19.02,19.55,20.83,21.01,21.99,22.04,21.83,23.10,23.32,
+23.07,24.34,26.13,25.18,25.85,27.14,27.14,27.16,26.63,28.68,
+28.00,28.82,28.69,30.07,29.64,30.51,31.20,31.12,31.07,32.40,
+32.43,32.95,31.91,33.10,35.05,33.77,34.08,34.56,35.79,34.59,
+36.67,35.31,36.97,37.72,38.48,36.29,37.36,38.94,38.64,38.43,
+37.09,37.39,38.86,40.35,39.89,41.83,39.66,41.97,41.50,41.82,
+40.08,42.70,42.24,42.10,43.05,43.51,43.60,45.03,44.73,43.66,
+44.72,44.75,46.03,45.73,47.97,46.53,46.40,47.37,46.98,46.91,
+48.49,47.01,47.66,48.16,47.42,48.95,49.66,49.27,50.01,50.50,
+48.92,50.37,51.30,51.34,50.86,48.62,52.44,50.51,52.30,51.40,
+50.94,54.41,52.42,54.06,53.56,53.15,54.22,52.47,53.13,56.22,
+52.78,56.65,55.39,55.48,54.72,56.04,55.81,55.40,53.73,55.12,
+55.30,58.03,59.62,57.31,58.85,56.43,60.77,56.80,57.69,56.97,
+58.14,61.56,59.67,60.39,58.46,58.20,57.74,59.52,60.76,57.19,
+61.98,61.20,59.91,60.47,60.34,61.99,63.65,62.35,62.02,59.63,
+60.76,64.29,63.92,62.18,62.94,63.87,63.72,64.42,64.76,63.11,
+63.10,64.43,65.03,67.62,65.33,64.83,66.15,69.59,65.67,65.89,
+68.44,66.30,64.48,66.69,67.28,70.63,67.37,66.76,67.61,65.83,
+66.36,68.23,68.63,67.19,69.62,70.56,66.92,71.95,69.62,68.84,
+70.30,72.62,72.80,71.26,71.89,70.71,70.65,69.76,73.17,71.08,
+70.83,68.91,69.86,70.01,70.38,74.39,71.10,77.01,72.73,74.88,
+73.57,72.95,71.38,72.22,75.16,73.96,74.32,74.60,74.81,71.08,
+73.79,75.60,74.79,74.36,77.84,77.32,76.04,76.76,75.65,76.29,
+79.01,76.82,76.69,76.59,75.51,73.05,80.95,76.90,76.37,80.16,
+76.21,78.31,78.86,79.06,78.54,77.65,83.74,81.66,78.45,78.29,
+77.08,74.22,82.22,81.43,76.60,82.64,79.62,79.45,81.43,83.91,
+84.78,80.82,82.16,80.81,80.49,80.32,81.98,82.08,81.93,79.82,
+80.15,84.92,82.27,85.92,84.45,82.25,84.65,84.50,84.11,87.49,
+82.48,84.36,83.00,85.26,84.09,82.85,83.97,84.76,83.78,85.19,
+18.83,20.14,20.88,22.03,21.67,22.98,23.46,23.75,25.88,24.53,
+25.88,25.82,26.34,27.19,27.64,28.60,28.64,28.46,30.54,31.07,
+31.23,30.93,31.08,33.18,31.83,32.38,32.07,33.91,33.87,34.36,
+35.86,35.24,35.64,34.62,35.66,36.69,37.78,37.96,37.64,39.23,
+39.05,39.49,40.47,37.65,40.07,38.92,41.00,41.89,41.11,41.64,
+40.97,43.51,43.92,44.15,43.60,44.41,46.08,44.49,44.71,44.88,
+46.49,47.39,46.93,47.20,47.58,47.98,46.07,47.96,46.01,49.17,
+47.42,47.21,47.19,49.33,49.75,50.38,50.93,50.53,49.77,50.74,
+53.92,50.52,52.56,53.15,50.40,50.43,53.23,54.88,54.78,56.16,
+53.04,54.94,54.01,54.46,57.49,54.22,56.43,54.25,56.55,55.76,
+56.77,55.36,57.50,57.99,55.72,56.77,57.51,56.57,58.66,59.16,
+59.30,61.35,55.88,60.46,58.93,59.31,59.81,62.95,60.49,60.04,
+61.76,60.99,58.64,61.66,61.02,62.03,65.02,63.42,62.76,63.19,
+64.54,63.29,63.29,60.37,62.05,63.01,64.34,65.76,68.05,64.91,
+64.87,66.42,65.97,65.92,65.47,69.04,66.65,69.71,67.07,68.69,
+69.67,68.43,69.66,66.82,69.82,68.48,67.74,69.64,70.18,69.53,
+70.19,69.74,69.76,70.99,69.36,68.35,71.12,70.68,70.18,71.68,
+72.47,71.20,72.75,73.61,74.02,74.25,76.68,72.83,71.38,75.24,
+76.94,71.29,74.47,75.15,73.04,71.15,72.27,74.22,75.80,74.18,
+74.87,77.62,74.54,75.13,76.94,79.21,75.30,76.20,77.79,79.21,
+80.31,75.76,75.28,78.12,79.96,76.56,77.86,80.10,77.42,81.36,
+79.33,80.60,75.95,80.11,79.72,80.75,80.02,82.30,81.84,83.22,
+80.84,79.76,82.36,83.40,82.60,80.60,83.61,81.74,81.39,82.52,
+80.52,85.95,85.77,81.32,81.02,85.18,82.92,86.29,83.64,88.29,
+86.27,87.75,83.99,85.85,82.47,87.98,83.01,85.40,85.89,86.83,
+88.56,87.46,83.74,86.83,86.50,87.08,86.59,88.13,84.96,88.48,
+90.30,86.95,86.49,89.68,88.80,83.20,87.92,88.63,91.43,92.52,
+89.27,89.23,88.80,90.05,91.89,92.35,88.48,89.71,90.61,91.22,
+89.24,90.83,92.47,93.45,90.72,90.78,91.53,92.53,93.44,94.97,
+20.91,21.61,22.38,23.28,24.01,24.06,24.11,24.82,25.61,26.14,
+28.31,27.85,29.62,29.74,30.19,31.15,29.77,30.69,31.19,32.65,
+33.83,34.07,33.39,34.46,34.69,34.92,35.61,37.15,37.01,36.49,
+38.60,37.80,37.95,40.79,38.82,39.76,40.38,40.05,39.61,41.18,
+40.92,41.70,42.42,42.47,44.54,43.02,43.64,43.98,44.91,45.56,
+44.38,47.71,46.20,47.55,47.33,44.96,47.11,46.53,49.48,48.63,
+49.76,49.23,50.67,49.44,49.74,49.40,52.26,50.96,51.79,51.73,
+52.46,50.09,51.44,52.50,52.95,53.46,52.25,53.98,56.64,54.70,
+57.50,58.64,55.56,56.01,58.16,53.79,57.20,56.73,57.02,56.99,
+55.94,57.72,57.89,58.71,58.94,59.50,59.74,60.24,60.28,59.96,
+62.11,62.37,59.34,63.42,61.06,60.30,61.35,62.83,64.03,62.33,
+65.14,64.60,62.93,64.80,63.18,65.96,65.57,63.28,65.40,67.25,
+64.40,68.69,65.98,68.80,66.27,67.43,66.03,68.83,67.83,67.76,
+67.80,70.77,64.80,68.18,67.07,66.81,68.64,68.64,69.41,71.32,
+70.99,71.86,73.00,71.57,70.06,72.70,73.85,69.00,68.92,72.05,
+70.99,71.47,74.14,74.81,74.45,71.75,75.22,71.99,72.86,74.95,
+74.92,74.48,76.92,76.09,74.09,75.74,78.31,76.52,76.46,79.94,
+76.73,77.42,75.96,79.56,75.71,77.78,78.10,77.16,78.38,76.18,
+77.99,79.04,79.05,78.75,81.10,80.98,80.82,79.53,82.09,81.46,
+81.34,82.46,81.22,80.26,82.30,83.22,81.79,83.19,83.05,85.63,
+85.74,81.15,83.92,82.81,81.39,81.83,87.65,88.14,81.55,83.97,
+83.66,86.87,85.73,84.75,87.10,85.27,88.41,85.08,86.87,89.68,
+86.64,91.54,83.51,87.83,87.23,90.48,91.93,91.62,89.15,86.73,
+87.38,91.41,92.64,88.89,92.87,87.02,89.09,89.52,90.82,90.54,
+94.56,90.31,90.63,93.67,91.10,91.09,89.86,91.99,90.03,88.01,
+90.71,93.78,94.76,93.32,94.88,93.56,95.43,92.64,90.70,92.47,
+97.44,91.01,99.51,96.35,94.09,95.42,93.72,92.48,98.74,98.97,
+94.70,91.13,94.79,97.47,99.10,96.95,94.72,93.29,96.91,102.62,
+98.78,98.08,96.55,100.06,92.01,102.03,100.62,102.03,95.54,97.07,
+21.64,22.64,23.39,24.08,25.38,25.37,26.47,25.49,27.36,28.21,
+29.59,29.00,29.96,29.86,31.39,32.04,31.51,33.10,32.75,33.91,
+33.62,35.42,35.20,36.57,35.51,35.98,38.34,37.88,38.62,39.39,
+39.05,39.67,41.48,42.44,42.06,42.62,42.37,42.44,43.46,42.69,
+42.08,42.46,44.69,44.17,45.70,45.72,47.46,47.73,48.13,46.52,
+48.60,49.00,45.87,48.08,47.28,50.77,48.32,50.73,50.82,51.19,
+51.73,51.70,50.50,54.31,51.98,54.26,53.69,52.33,53.67,55.98,
+52.86,55.54,57.00,57.89,57.21,58.47,55.90,55.82,57.32,56.59,
+56.08,59.44,56.68,59.50,62.17,57.09,61.54,61.08,60.15,61.27,
+59.81,62.93,60.05,61.32,61.14,63.26,64.41,64.10,63.03,62.83,
+63.25,65.27,67.11,62.92,64.12,64.39,63.26,67.89,66.82,68.50,
+66.46,66.85,68.42,65.69,70.08,69.54,67.81,71.56,68.16,69.59,
+66.88,70.59,69.04,67.30,72.29,68.22,69.37,70.07,71.42,71.90,
+75.22,73.34,73.13,69.19,73.33,72.06,73.12,74.55,73.46,73.62,
+73.86,73.25,77.08,73.55,76.88,77.40,75.36,77.37,77.26,75.02,
+77.79,78.73,81.53,78.35,76.92,77.46,75.95,80.24,77.84,76.70,
+78.90,80.99,83.11,79.75,78.57,83.04,81.23,82.37,82.33,86.22,
+82.23,82.18,82.64,80.60,82.42,81.27,84.61,82.16,79.56,82.18,
+82.30,85.37,86.41,83.38,81.39,83.83,83.41,86.17,88.08,88.73,
+88.36,86.38,84.47,82.84,86.19,87.80,85.63,88.13,86.69,86.38,
+88.31,88.09,89.43,87.08,87.26,88.61,88.35,90.04,89.58,91.18,
+89.37,91.30,89.63,90.84,91.22,91.93,93.32,94.34,92.60,90.48,
+87.75,89.84,87.69,92.99,95.45,91.30,92.45,93.63,96.94,91.23,
+98.10,91.76,91.96,93.79,95.09,93.94,91.74,95.19,93.58,94.08,
+96.93,93.11,95.68,97.03,94.44,93.92,100.06,97.75,101.98,95.67,
+97.92,97.15,97.85,97.47,98.85,100.30,97.89,99.37,101.75,99.21,
+99.24,98.70,97.79,99.46,99.57,98.26,101.73,102.18,100.57,103.32,
+101.78,99.98,103.20,108.01,100.67,104.06,97.96,104.33,102.76,103.76,
+104.70,102.47,102.01,102.24,106.60,105.04,106.03,103.05,106.10,102.75,
+22.78,23.57,23.35,24.94,25.49,26.46,26.18,28.70,28.16,28.28,
+31.22,30.61,30.11,32.16,32.95,32.52,34.28,35.54,34.09,34.60,
+36.29,36.07,37.03,38.06,38.83,39.93,38.88,42.21,39.25,39.98,
+41.41,41.77,42.26,42.56,43.06,44.39,43.29,43.39,46.11,43.66,
+47.34,45.58,46.60,46.93,49.40,48.43,47.97,50.38,49.23,50.67,
+51.80,50.57,49.92,51.91,51.90,51.57,55.33,52.86,50.45,52.63,
+54.10,55.71,53.97,53.93,54.85,54.75,54.69,56.58,58.09,57.83,
+59.58,58.22,58.92,60.44,58.63,61.25,59.91,59.26,61.14,61.86,
+61.35,61.09,60.74,62.98,61.58,63.59,62.75,61.94,65.00,64.04,
+65.27,65.27,63.01,63.73,66.19,63.47,66.57,67.14,65.74,65.44,
+66.93,68.40,66.56,67.59,68.32,68.81,71.06,70.53,70.62,69.51,
+70.68,73.24,71.82,71.64,73.17,71.29,71.97,72.87,74.48,73.09,
+70.37,75.95,73.12,73.39,74.82,73.08,74.46,73.81,73.88,75.36,
+74.43,76.40,73.51,76.72,78.28,78.67,78.44,77.73,79.93,78.74,
+81.31,77.60,77.79,79.59,78.31,77.97,80.71,81.43,83.98,79.43,
+79.74,79.29,82.59,83.31,77.65,80.42,84.20,80.92,83.50,81.93,
+86.46,85.94,84.79,84.71,84.48,83.87,83.36,85.71,86.39,85.06,
+83.93,86.37,85.64,82.06,84.58,85.03,86.39,88.35,88.83,87.29,
+86.63,88.58,90.06,86.46,88.13,86.55,87.14,89.35,89.12,90.92,
+84.71,93.14,92.91,90.40,93.23,93.40,90.50,92.77,92.47,93.91,
+90.07,90.24,91.88,90.88,90.96,92.52,90.84,94.88,92.48,94.63,
+92.97,93.85,94.09,98.85,92.73,93.59,97.31,95.09,94.02,94.75,
+95.98,93.88,100.81,99.73,96.13,98.87,96.81,97.04,98.05,98.09,
+95.33,97.51,98.64,100.80,97.90,98.42,101.67,98.55,99.83,99.73,
+101.10,100.34,100.91,101.58,103.44,98.13,103.56,98.11,102.56,102.56,
+101.43,101.00,105.08,103.20,102.73,108.38,103.87,105.81,106.37,103.24,
+101.90,105.27,106.70,109.26,105.70,106.02,107.16,106.47,107.21,109.04,
+106.62,104.44,107.33,108.82,106.25,109.16,108.35,106.84,109.37,108.86,
+107.39,107.16,111.28,109.87,103.89,111.80,112.65,106.69,106.63,109.59,
+22.96,23.98,25.77,25.81,27.30,27.97,28.19,28.91,30.04,29.44,
+30.28,31.84,32.32,32.49,33.68,34.62,33.63,35.25,37.25,36.95,
+37.67,37.77,39.67,36.97,38.16,40.42,38.73,40.61,40.38,41.11,
+42.67,44.42,44.06,44.68,44.84,45.55,46.19,47.61,47.53,45.50,
+48.90,48.64,50.43,51.10,49.40,50.74,50.06,52.58,50.93,50.21,
+50.00,54.87,52.21,52.14,53.19,54.36,53.56,54.28,54.22,55.73,
+55.63,55.57,56.50,57.24,57.48,59.21,61.12,58.58,59.56,60.14,
+58.59,61.92,60.85,62.43,60.77,63.01,62.94,62.39,60.29,66.15,
+61.99,63.70,61.99,66.10,67.48,66.44,65.67,64.80,66.31,68.90,
+66.48,65.76,66.85,69.33,67.69,68.56,68.63,67.67,69.49,67.84,
+70.32,71.37,71.47,69.01,69.60,70.66,73.13,73.51,71.69,74.60,
+71.97,75.15,74.45,71.14,75.00,74.48,75.03,76.28,75.35,76.10,
+75.50,74.88,76.40,75.53,76.82,75.93,78.91,79.88,79.50,78.66,
+78.80,78.32,80.14,80.47,78.38,81.22,80.02,78.80,80.98,82.08,
+81.62,82.75,82.96,79.50,81.39,79.81,79.56,84.36,86.24,83.66,
+85.73,83.08,84.73,83.08,82.10,83.36,86.19,87.37,86.22,83.25,
+86.71,87.98,85.78,87.84,89.13,87.64,89.07,88.28,88.56,86.09,
+88.91,85.50,93.09,90.52,91.80,91.99,88.61,91.79,88.34,87.57,
+92.22,90.20,90.08,88.59,95.12,99.34,95.01,92.71,91.67,93.91,
+97.35,93.64,93.66,97.34,93.18,91.16,94.81,94.48,95.66,93.66,
+97.24,95.70,92.57,96.66,98.39,96.27,98.96,94.94,98.16,98.19,
+97.91,100.94,97.17,99.28,97.22,101.33,101.69,97.13,99.05,94.84,
+101.21,100.00,100.94,98.40,102.51,103.26,99.43,102.24,101.11,101.18,
+102.97,102.72,102.77,109.41,104.01,106.55,104.58,103.18,101.82,107.83,
+100.61,104.25,108.82,101.68,108.69,103.61,103.61,107.19,106.16,105.44,
+104.79,108.99,107.11,109.35,106.18,105.44,103.69,112.03,108.81,112.50,
+106.94,110.04,108.82,106.83,109.81,113.53,111.41,107.63,111.59,109.93,
+113.61,111.98,109.62,111.98,110.48,114.31,108.85,106.57,113.52,113.38,
+114.90,115.36,113.12,110.27,116.11,111.14,114.90,110.53,111.21,115.34,
+24.06,24.08,25.87,27.12,27.00,26.34,29.25,29.51,30.20,30.98,
+31.48,32.22,32.58,33.86,34.55,35.63,35.66,36.20,37.26,39.42,
+38.34,38.98,39.00,41.49,41.97,43.39,41.95,41.76,42.68,44.01,
+45.92,45.83,44.80,46.12,46.20,47.77,47.05,48.92,48.94,47.74,
+48.19,49.81,51.17,52.22,52.01,51.02,51.89,53.11,51.54,51.55,
+51.88,53.30,56.01,54.45,55.97,54.15,55.43,56.11,56.45,57.52,
+57.19,57.97,56.33,58.87,60.73,58.73,58.60,62.47,62.80,61.06,
+59.58,59.27,62.04,60.26,64.13,62.30,63.72,62.78,65.09,64.95,
+64.56,63.68,67.39,67.31,65.72,66.20,68.19,66.64,67.57,69.60,
+68.45,68.46,70.80,69.37,68.39,71.22,72.82,70.24,70.68,69.90,
+71.09,72.67,72.99,71.95,72.30,73.54,71.72,72.63,74.29,73.67,
+78.01,76.16,77.34,74.36,77.59,76.49,76.58,80.70,80.47,77.96,
+77.54,82.23,82.95,76.51,78.92,81.72,78.50,80.67,79.75,78.14,
+81.49,80.25,79.93,82.59,82.41,79.78,83.06,84.39,83.39,83.41,
+87.80,84.25,83.13,82.73,85.70,87.74,84.07,86.25,85.26,88.56,
+88.90,88.17,87.49,87.02,88.07,86.38,88.95,90.49,87.02,85.59,
+91.30,87.99,88.34,91.02,93.72,89.07,94.09,88.52,89.06,94.00,
+88.47,94.24,88.46,91.45,90.56,91.91,93.78,95.03,95.22,92.91,
+91.58,92.61,91.76,96.12,95.46,97.36,93.44,95.57,92.99,100.29,
+98.38,101.11,98.07,97.05,97.46,98.47,95.04,99.67,102.76,98.34,
+99.22,98.29,101.85,100.31,101.87,101.33,103.87,100.90,101.80,100.44,
+100.69,105.46,100.43,102.12,101.91,101.38,104.36,103.21,100.69,101.23,
+101.65,106.68,102.44,100.63,108.16,104.72,103.49,103.18,101.48,101.65,
+109.92,105.11,103.71,102.47,108.10,108.61,109.78,108.80,110.67,106.43,
+109.83,108.76,105.04,109.96,105.99,105.24,108.08,112.39,109.84,112.87,
+106.91,112.17,109.60,110.82,109.48,110.61,116.01,108.33,116.20,114.18,
+114.02,113.31,113.02,109.48,113.34,112.37,109.86,109.98,110.87,117.15,
+110.23,111.78,114.00,113.21,117.93,116.47,113.71,117.08,118.60,112.88,
+118.18,118.92,119.74,115.30,115.64,117.01,114.78,118.74,119.36,116.05,
+23.88,24.47,25.61,27.15,27.55,28.07,29.05,29.27,31.41,32.29,
+31.91,33.01,34.58,35.19,35.25,36.38,38.04,37.79,39.05,36.98,
+39.02,40.81,41.04,38.95,41.41,42.98,43.34,44.12,43.53,45.86,
+46.00,45.91,46.26,47.34,45.85,48.00,48.78,50.03,46.95,49.09,
+50.32,50.56,51.26,52.01,50.83,52.90,54.03,54.44,53.24,53.66,
+55.29,54.15,56.78,56.68,55.72,57.55,55.57,57.45,58.05,58.84,
+60.95,59.34,58.43,60.44,62.42,59.88,61.40,62.08,60.02,62.87,
+62.39,63.23,62.86,64.68,65.35,65.95,64.92,63.84,66.36,66.66,
+66.47,66.39,68.11,69.87,65.66,69.67,66.94,69.02,70.04,68.32,
+69.19,72.43,70.42,73.70,71.84,72.73,70.13,70.17,71.87,72.66,
+74.36,73.86,76.31,77.59,73.23,77.57,78.04,75.98,77.64,78.96,
+75.57,76.07,81.77,78.16,76.15,77.07,80.56,79.24,78.37,80.44,
+80.12,80.67,83.06,81.06,83.19,83.58,79.72,82.96,80.07,78.78,
+83.24,82.26,83.25,85.26,86.36,83.95,87.59,86.41,87.88,82.90,
+87.01,85.27,86.75,87.33,86.04,88.07,87.73,90.51,89.22,90.12,
+90.10,91.81,84.97,90.89,90.01,87.87,85.31,86.70,92.66,87.78,
+90.18,88.52,90.51,91.90,90.04,93.81,93.01,96.43,94.32,92.28,
+94.11,95.28,97.56,94.46,94.61,95.47,94.42,97.34,94.40,99.23,
+98.22,96.63,96.05,96.11,100.43,92.86,98.35,100.89,98.27,100.72,
+101.47,99.31,97.68,97.08,98.07,98.91,102.83,100.39,102.01,104.58,
+100.28,103.20,106.28,102.07,100.10,103.66,100.60,104.19,105.99,103.60,
+103.39,103.42,102.56,106.45,106.42,107.90,104.19,103.35,109.02,107.41,
+106.35,106.23,106.71,107.62,108.86,107.72,111.08,107.01,109.32,102.18,
+110.13,112.67,110.31,114.07,115.54,107.34,105.88,104.44,111.43,111.81,
+110.57,110.71,109.02,111.96,109.65,115.67,111.29,115.03,116.90,113.49,
+112.61,113.24,114.03,114.73,111.86,112.76,115.14,120.80,113.35,110.34,
+116.97,116.02,114.28,118.70,114.44,113.78,113.55,113.80,118.27,121.09,
+115.58,118.01,122.40,117.55,123.14,118.64,116.21,120.81,119.01,118.22,
+119.00,116.46,120.79,125.37,117.56,121.46,120.33,120.19,125.88,118.23,
+24.53,25.70,26.37,26.79,28.40,30.50,30.35,31.36,32.37,31.96,
+33.67,32.77,34.45,35.29,37.21,36.06,36.75,38.37,37.05,38.00,
+41.03,42.11,40.20,42.53,41.86,43.57,43.70,44.21,43.25,44.53,
+45.43,45.92,46.24,48.32,48.52,49.69,49.65,50.86,50.95,52.29,
+53.69,51.89,53.39,52.23,53.93,51.92,53.86,53.58,54.08,55.79,
+56.14,56.37,58.00,60.36,57.76,59.81,58.17,56.61,60.34,63.79,
+62.24,60.14,61.10,63.82,61.98,61.97,62.67,60.73,64.73,61.93,
+64.95,66.78,62.78,64.65,66.49,68.30,68.16,67.65,69.38,66.46,
+69.32,66.33,68.33,70.29,70.99,69.36,69.81,71.30,72.03,71.19,
+71.55,70.69,74.06,73.16,72.73,71.11,72.07,75.03,74.58,75.13,
+73.65,75.80,75.68,72.46,71.15,77.30,76.73,77.56,80.17,78.72,
+77.63,79.55,81.40,79.02,78.85,81.25,82.12,79.78,82.53,85.13,
+82.58,77.15,83.61,82.29,80.47,80.34,83.05,85.84,88.40,85.00,
+84.53,83.55,83.98,85.71,84.83,83.92,82.92,88.56,85.75,83.94,
+86.49,88.98,88.33,88.13,88.57,91.12,89.09,91.60,87.48,88.40,
+90.46,90.39,90.29,87.50,89.12,89.21,88.24,88.05,94.81,93.78,
+92.65,98.06,90.88,92.64,96.15,94.00,96.32,92.10,97.73,95.78,
+94.61,99.46,101.26,97.70,92.86,95.01,98.93,99.57,95.11,98.45,
+99.68,98.26,97.98,99.63,96.97,97.75,100.49,98.36,101.25,99.24,
+100.48,98.72,102.36,102.52,104.43,104.64,98.58,101.27,101.18,105.90,
+107.63,104.26,104.79,101.90,105.82,103.31,104.39,102.75,104.64,103.60,
+103.99,104.24,104.17,107.03,105.25,105.47,107.70,107.74,109.36,107.70,
+107.69,102.49,110.13,105.98,111.08,113.64,113.71,108.11,110.29,109.05,
+113.64,110.67,114.08,108.22,110.60,107.68,113.14,112.21,113.23,108.87,
+116.47,115.57,108.12,110.07,108.09,113.70,111.65,116.26,114.23,110.62,
+116.63,113.52,115.79,116.96,114.56,116.49,119.82,116.43,116.82,117.44,
+116.52,119.22,117.21,120.95,118.37,122.37,116.49,118.51,124.38,118.81,
+118.52,124.13,120.36,123.21,119.50,117.61,124.13,126.45,123.27,120.92,
+127.73,123.84,121.23,121.18,123.52,124.30,124.45,124.49,125.01,124.78,
+24.51,25.56,27.62,27.56,28.47,28.97,29.91,31.99,33.22,32.35,
+33.76,35.24,34.96,35.86,37.02,37.87,38.25,39.28,39.48,40.53,
+40.74,40.22,41.72,41.90,41.81,43.06,42.89,46.52,45.69,45.56,
+44.67,47.75,47.47,49.74,47.19,49.95,49.12,50.54,51.42,51.93,
+51.89,52.93,53.16,51.65,52.08,53.80,55.34,54.61,55.79,55.46,
+55.88,58.30,57.01,59.33,58.85,57.34,56.07,59.94,61.27,61.63,
+63.32,62.19,60.81,62.48,59.39,61.19,63.25,64.08,63.88,63.61,
+62.67,66.29,64.21,66.15,65.39,67.07,66.13,65.66,68.31,70.44,
+67.22,69.20,67.15,69.61,68.59,68.65,72.57,68.98,69.76,75.07,
+73.02,70.02,70.38,71.92,73.67,72.81,75.75,75.52,72.99,74.27,
+74.56,75.58,74.03,77.23,77.36,77.65,78.08,76.93,78.32,75.76,
+79.17,78.78,79.34,80.40,83.75,80.83,81.71,81.63,80.63,82.48,
+84.83,79.44,83.96,81.49,84.68,84.25,82.58,82.06,83.84,84.50,
+85.35,79.77,84.72,86.06,89.02,84.77,86.72,91.27,87.52,88.76,
+87.06,84.65,89.91,87.15,91.35,88.55,86.79,93.68,92.36,89.30,
+95.79,92.04,92.19,92.41,92.73,90.53,93.78,96.24,96.00,94.41,
+92.32,94.44,96.86,93.45,94.69,95.14,92.19,97.53,92.89,96.69,
+96.50,101.51,95.58,96.34,98.25,99.15,95.93,96.07,97.51,99.72,
+102.75,100.83,98.73,100.74,102.58,100.40,96.23,101.58,104.05,99.17,
+100.63,100.12,102.48,104.48,102.13,99.36,106.05,103.85,101.46,104.17,
+105.26,101.31,104.00,108.06,109.03,105.44,105.98,104.33,104.96,108.82,
+108.91,105.77,109.51,110.01,107.82,108.33,112.19,107.63,112.81,108.56,
+112.47,103.81,108.85,110.20,107.27,112.84,113.91,112.79,113.66,115.97,
+113.87,110.39,110.95,108.73,111.35,111.35,114.74,113.03,111.63,115.47,
+114.19,112.63,114.75,114.68,118.09,113.45,115.63,112.02,115.56,121.39,
+115.52,119.13,120.23,117.77,110.68,115.64,119.09,114.99,119.26,119.11,
+117.17,117.84,115.35,119.05,121.41,120.16,122.38,121.16,124.53,117.75,
+123.07,123.76,123.99,120.39,115.38,130.68,120.46,119.44,120.52,121.91,
+119.21,118.30,119.67,121.24,122.35,121.68,126.83,124.42,124.46,128.58,
+24.21,26.43,26.31,26.56,29.13,29.70,30.54,32.52,31.66,32.14,
+33.56,34.85,34.87,37.35,37.25,37.65,39.17,37.94,40.86,40.22,
+40.25,41.21,43.35,43.39,42.07,43.03,44.24,45.63,45.49,44.98,
+47.61,47.51,48.82,49.42,49.55,47.39,49.40,49.86,49.58,50.92,
+54.05,53.30,51.94,50.53,53.87,54.29,54.21,54.63,56.03,58.74,
+55.70,57.21,56.75,57.15,59.88,59.12,59.60,61.52,59.22,60.08,
+61.72,61.61,59.63,61.32,64.24,60.84,67.62,62.57,63.99,67.45,
+65.83,66.23,66.63,67.06,65.77,68.15,66.85,67.91,68.75,69.91,
+67.77,73.52,72.97,72.66,71.55,72.84,75.38,70.16,72.87,72.73,
+71.02,72.32,73.63,77.12,73.75,71.58,74.20,73.63,72.19,75.97,
+78.92,78.71,77.74,77.89,78.75,78.60,79.87,77.94,80.41,80.28,
+81.36,81.20,83.79,80.90,81.01,84.72,81.16,83.02,81.37,84.05,
+83.57,83.26,85.91,85.15,87.36,83.70,85.01,88.39,88.07,83.79,
+84.66,89.52,86.19,86.86,89.16,84.24,85.45,89.75,89.15,85.93,
+89.69,90.31,91.09,93.25,90.13,90.54,89.65,90.71,89.15,93.17,
+94.32,92.60,93.46,94.02,92.12,93.41,96.20,93.02,92.93,92.45,
+96.26,92.50,96.58,96.36,94.35,98.14,96.98,96.71,98.96,100.98,
+96.90,95.29,94.93,98.05,98.95,98.15,97.72,103.13,103.14,99.44,
+99.90,102.70,98.40,99.59,98.07,100.70,99.72,99.50,100.36,101.26,
+103.14,102.38,101.03,106.24,103.19,109.16,104.92,107.16,106.93,101.49,
+107.93,108.22,107.38,102.04,103.61,107.20,107.34,102.74,108.37,106.92,
+107.06,107.13,108.80,113.01,108.18,113.76,109.75,107.24,112.18,112.16,
+107.01,108.51,111.29,113.07,104.81,112.18,113.25,111.73,110.76,110.35,
+112.40,114.90,110.66,112.62,117.15,112.05,110.84,114.95,114.57,113.83,
+115.28,115.83,115.57,117.11,112.17,119.61,111.14,114.85,120.66,118.48,
+116.20,117.61,119.61,118.77,117.11,117.59,116.17,118.83,118.11,117.26,
+115.91,120.26,122.96,116.54,125.03,121.40,120.55,124.77,123.29,118.12,
+126.53,122.49,121.01,116.63,118.88,120.55,119.68,125.95,125.66,119.47,
+123.13,124.41,124.69,129.31,123.54,128.37,122.14,126.81,124.13,118.83,
+24.69,25.45,26.44,27.81,29.48,29.85,31.13,31.71,31.33,32.17,
+34.34,34.86,35.23,35.98,35.50,37.23,37.19,38.61,40.40,40.93,
+40.91,40.86,41.29,43.09,44.11,44.70,46.34,45.23,46.16,45.57,
+46.10,49.34,48.12,49.60,48.06,49.11,49.82,50.39,50.12,51.35,
+53.99,52.15,52.81,51.47,53.30,56.78,54.29,56.09,55.72,57.17,
+55.88,57.51,57.87,60.05,59.00,61.75,60.41,59.79,62.51,60.28,
+62.55,66.38,62.90,63.33,63.39,65.29,63.10,61.81,62.78,64.47,
+65.94,65.57,67.13,65.48,66.40,68.75,66.86,68.01,69.00,69.44,
+70.65,70.72,65.37,73.70,68.97,72.42,76.17,71.04,73.47,70.34,
+75.47,77.64,76.12,74.52,75.74,76.50,78.77,75.99,73.52,78.73,
+77.78,76.62,79.11,73.49,76.94,75.51,79.04,81.52,80.44,78.46,
+81.09,81.35,78.08,81.52,81.31,86.33,81.53,80.08,80.22,87.46,
+81.33,81.65,85.70,83.01,83.57,85.15,81.39,90.40,86.70,85.86,
+88.86,86.90,87.45,88.85,86.67,88.65,89.89,90.71,85.06,88.84,
+88.49,89.21,91.55,91.31,90.65,94.11,91.37,91.33,88.07,94.08,
+92.67,91.86,93.03,95.31,96.87,90.36,97.36,94.69,93.87,94.90,
+97.87,95.49,94.65,97.97,94.57,101.53,97.73,95.37,99.99,96.14,
+98.65,100.67,100.07,98.49,97.91,98.80,101.57,98.77,97.86,99.95,
+102.00,105.44,102.35,102.51,107.70,103.16,101.34,109.40,101.70,102.05,
+100.47,104.24,102.27,102.02,104.10,104.14,105.79,101.44,105.54,103.04,
+104.36,109.09,106.74,109.04,104.02,107.11,106.24,110.82,111.46,108.98,
+109.95,107.36,111.91,112.45,106.57,109.00,112.80,109.70,105.89,107.08,
+109.45,108.12,109.48,111.65,113.32,111.82,114.56,110.34,112.33,113.07,
+113.73,108.56,115.28,113.94,114.80,116.39,119.96,112.24,109.82,120.47,
+114.07,115.68,114.79,112.53,116.80,115.10,115.51,113.90,119.96,120.12,
+119.49,118.17,123.51,122.23,114.43,118.49,115.45,118.71,119.66,121.44,
+118.51,122.55,121.45,123.09,120.40,125.34,122.25,124.81,122.35,121.83,
+124.45,115.56,119.77,116.53,123.89,120.18,121.54,118.62,119.03,124.41,
+123.32,127.22,126.25,130.43,123.40,124.12,128.16,130.41,124.06,127.52,
+24.47,25.36,25.52,28.11,28.61,29.64,30.68,31.95,30.73,31.96,
+34.62,33.78,35.73,35.65,37.48,37.51,38.61,41.05,40.00,39.55,
+40.47,41.29,41.17,41.96,43.70,44.43,43.59,45.09,44.75,43.77,
+47.87,47.89,46.81,49.80,47.73,49.38,50.51,51.78,52.69,50.15,
+51.25,53.33,51.61,55.27,54.38,55.24,57.28,56.02,56.86,56.98,
+58.07,57.02,57.23,58.11,60.66,61.06,59.60,61.06,60.35,61.11,
+62.10,61.73,62.39,63.08,63.46,63.74,61.38,63.35,66.61,64.88,
+66.09,68.02,68.43,66.63,66.76,69.73,66.74,68.69,70.05,66.41,
+71.21,69.61,71.43,69.66,72.11,70.82,73.10,71.19,72.25,73.59,
+72.45,73.92,72.78,73.36,72.92,73.32,72.08,75.46,77.16,76.97,
+78.56,76.41,78.10,75.70,78.40,81.08,79.56,78.97,81.26,82.34,
+80.42,77.75,80.83,80.76,82.74,84.09,83.48,82.03,84.45,81.38,
+83.36,85.55,82.51,81.21,82.57,87.24,86.69,86.73,87.40,83.92,
+86.92,81.24,85.01,87.54,87.47,85.42,89.36,88.27,85.81,86.95,
+89.10,92.35,94.03,93.03,90.69,91.77,91.65,91.74,92.87,91.50,
+94.00,94.59,91.82,92.88,93.23,93.49,95.54,94.05,90.49,94.16,
+95.23,94.03,97.16,94.27,97.28,95.03,95.14,99.27,97.45,100.42,
+95.26,96.20,96.26,95.31,99.14,96.76,101.63,100.29,98.59,102.28,
+98.74,102.42,100.40,102.71,99.65,102.28,100.84,101.36,99.62,103.92,
+102.89,104.31,104.57,100.00,101.36,105.39,103.70,106.38,106.71,103.75,
+105.42,104.08,107.08,108.35,108.00,104.33,110.69,109.43,110.82,108.87,
+106.06,108.19,110.32,107.15,107.75,108.95,107.42,109.46,108.78,110.48,
+110.46,107.25,112.22,108.39,115.17,113.22,111.55,114.03,112.46,110.54,
+112.57,111.93,110.94,114.29,112.99,114.40,117.63,115.58,116.80,118.31,
+113.72,111.84,115.09,118.94,119.18,114.71,117.78,115.13,116.51,116.94,
+120.56,118.24,118.06,116.67,117.90,112.46,124.31,122.25,127.57,122.68,
+120.45,122.37,120.75,119.71,125.02,120.33,123.07,123.16,120.10,118.37,
+123.90,122.05,116.02,123.98,120.15,125.53,124.46,126.61,125.25,124.13,
+123.33,124.57,125.93,129.51,123.93,119.93,125.08,123.46,130.41,132.77,
+24.04,25.85,26.59,27.67,28.20,29.02,30.86,31.82,31.56,34.06,
+33.76,34.44,35.84,36.31,37.94,35.76,37.20,40.44,39.43,41.03,
+41.91,41.42,42.10,41.94,42.46,45.23,46.09,44.67,45.01,45.88,
+45.61,45.36,46.28,47.95,50.06,48.86,49.73,49.79,50.11,50.73,
+53.01,51.68,51.17,52.92,55.19,53.86,56.01,56.34,55.79,53.84,
+58.00,58.74,58.92,55.81,59.29,57.95,59.19,60.23,61.56,60.07,
+62.39,62.07,63.16,61.16,63.73,61.80,62.74,65.84,67.73,66.93,
+67.18,66.31,66.86,69.90,66.77,67.06,66.66,67.15,67.81,70.51,
+70.85,69.34,70.86,71.42,70.39,72.03,71.84,70.90,72.87,72.87,
+73.40,71.71,74.60,73.59,71.46,76.68,75.72,78.10,75.83,78.02,
+75.62,75.16,77.75,74.83,74.78,76.40,76.87,78.03,78.10,78.73,
+81.26,80.91,81.72,79.03,80.78,83.50,83.00,84.06,84.60,79.51,
+82.86,84.46,83.64,84.11,87.64,87.31,85.85,85.93,87.42,86.65,
+84.91,89.84,83.88,89.82,86.26,86.50,87.47,88.44,88.30,90.36,
+89.67,88.32,86.71,91.48,90.69,91.57,91.21,92.69,95.32,89.21,
+89.24,94.03,91.78,89.62,91.42,92.22,95.55,91.51,95.12,97.29,
+94.85,96.69,97.76,98.91,91.37,97.46,94.16,97.37,95.75,96.93,
+98.81,98.04,99.95,99.75,102.85,95.65,98.23,97.68,99.10,102.02,
+96.11,99.50,104.52,99.56,100.61,99.00,99.94,100.01,99.59,101.22,
+105.06,105.17,104.26,104.30,105.02,103.57,107.03,102.54,106.86,112.63,
+104.49,102.93,107.29,110.06,103.73,105.16,112.64,105.74,107.21,106.47,
+108.51,109.65,107.73,111.47,106.92,107.57,105.87,107.95,111.41,111.92,
+111.16,110.21,108.65,114.39,106.53,112.64,110.29,113.25,113.06,112.95,
+112.97,114.00,112.30,111.05,112.01,114.40,111.74,111.77,113.51,115.62,
+113.92,114.03,113.59,116.91,116.05,116.51,115.58,118.95,119.62,117.06,
+116.53,116.19,121.31,121.33,123.14,113.13,116.09,116.87,123.01,113.23,
+119.99,117.95,116.65,117.74,123.57,121.42,123.92,121.28,120.77,117.62,
+122.93,121.07,126.82,118.75,120.47,123.38,117.95,122.66,118.71,122.99,
+123.59,122.16,129.54,125.51,126.84,126.15,125.87,122.15,122.52,126.39,
+24.57,24.66,26.35,27.46,28.91,29.40,28.54,30.00,32.49,32.24,
+33.69,33.83,35.20,35.39,36.79,35.83,38.46,37.47,38.20,39.07,
+39.97,40.67,42.11,42.11,44.06,44.14,44.13,43.32,45.61,45.81,
+45.26,47.68,48.65,48.54,48.24,49.45,48.98,50.80,50.51,50.70,
+50.34,51.85,53.10,52.37,53.01,55.23,56.20,55.52,54.57,55.73,
+57.85,58.39,56.69,57.94,58.08,58.37,58.88,60.98,57.83,59.49,
+59.26,60.51,62.29,62.33,61.81,62.33,62.47,65.07,66.84,61.18,
+64.57,63.17,66.88,66.53,65.26,65.71,67.40,65.88,66.77,70.40,
+69.86,68.29,72.32,70.38,72.21,71.88,70.44,71.48,73.56,71.91,
+71.07,71.93,71.51,73.88,73.00,73.64,74.03,75.17,79.17,75.14,
+76.43,75.76,76.76,75.91,77.18,78.71,74.48,79.27,80.34,79.76,
+77.16,78.35,79.13,82.15,80.51,82.15,83.55,83.78,83.98,80.31,
+82.02,81.05,83.38,82.38,83.51,85.42,84.44,87.08,85.53,89.11,
+86.75,85.27,85.82,87.28,87.13,86.56,84.80,86.12,89.00,89.57,
+90.79,88.30,91.96,87.69,91.71,90.25,91.12,92.53,91.19,87.11,
+90.14,93.60,93.03,92.14,94.48,93.02,90.24,93.87,93.30,89.59,
+94.30,95.87,96.02,93.06,92.81,97.66,95.48,98.09,96.80,93.50,
+92.15,99.51,95.63,97.98,95.11,99.15,98.34,99.51,99.03,97.69,
+102.44,102.29,97.32,98.60,98.90,98.80,101.15,99.22,97.24,98.24,
+99.24,104.51,99.63,102.08,100.29,104.76,104.60,104.99,101.21,102.60,
+103.08,102.11,105.98,105.27,108.64,105.11,110.70,105.54,109.42,108.72,
+110.21,106.16,108.07,110.21,108.00,104.50,104.60,107.61,109.83,110.78,
+111.14,107.33,113.30,113.64,112.24,113.04,110.80,108.41,108.02,108.10,
+107.33,112.62,112.28,108.77,113.01,114.28,111.89,111.52,114.67,113.43,
+119.15,117.29,117.19,120.36,121.93,113.47,118.85,121.69,113.50,117.34,
+118.75,117.02,116.62,114.97,118.00,115.14,115.45,117.57,117.69,115.58,
+120.43,121.30,119.88,120.49,115.61,119.48,121.74,121.98,123.55,125.50,
+121.02,123.73,123.48,120.83,122.71,120.21,124.25,131.40,122.80,123.72,
+127.47,119.91,124.68,126.23,124.22,121.03,122.53,126.63,125.64,126.15,
+17.45,18.84,19.18,19.81,20.36,20.70,21.75,23.14,21.99,23.05,
+23.47,23.76,24.24,25.18,24.82,25.93,25.60,26.50,28.11,27.52,
+28.12,28.53,27.72,28.73,29.78,30.61,30.01,30.47,29.96,31.83,
+30.47,31.88,30.84,33.09,31.78,33.31,32.55,35.12,33.50,32.38,
+33.84,36.30,34.30,34.57,33.86,37.38,35.94,36.09,35.91,38.14,
+36.44,37.39,38.05,38.03,38.98,39.45,39.38,41.37,40.60,39.66,
+40.35,38.43,41.30,41.78,41.56,41.28,41.99,42.43,42.93,42.52,
+42.53,43.73,42.35,43.12,43.10,43.28,44.11,45.30,42.40,45.58,
+45.44,47.34,46.39,45.79,46.05,47.31,46.29,45.78,50.67,46.68,
+47.79,48.55,48.44,46.28,48.94,47.66,48.40,51.00,48.49,49.46,
+50.05,49.71,49.54,49.65,51.35,50.33,50.24,49.95,51.84,51.58,
+54.08,50.57,53.57,52.21,53.12,52.05,53.03,53.53,53.06,53.56,
+53.10,55.17,53.95,52.77,55.71,53.93,56.73,55.66,56.94,56.52,
+53.99,55.67,55.55,57.92,54.69,57.70,58.59,55.99,58.42,57.01,
+57.35,58.35,58.64,58.14,57.67,57.84,57.44,59.40,59.85,59.37,
+61.51,57.33,58.93,58.94,57.77,63.35,60.59,62.85,63.51,58.24,
+63.24,61.73,63.19,59.31,62.37,61.30,61.21,62.93,65.33,63.39,
+61.26,61.92,65.77,65.07,63.74,65.53,63.44,65.61,65.02,64.50,
+65.04,63.74,63.10,63.83,66.61,65.75,66.45,63.34,65.02,66.09,
+65.36,67.05,66.44,67.03,66.93,67.27,68.48,65.12,67.98,66.69,
+68.13,67.86,67.18,69.18,69.67,69.57,66.27,68.48,71.00,68.84,
+69.52,69.86,71.41,70.23,71.89,69.70,71.00,72.75,71.31,70.01,
+69.72,70.21,71.34,73.09,73.00,76.16,71.59,71.21,72.78,74.62,
+72.86,72.99,72.69,71.49,72.70,73.19,73.66,73.99,77.02,74.14,
+73.15,78.52,74.74,72.71,76.53,75.59,76.51,77.77,73.95,76.09,
+74.32,74.51,78.27,78.86,76.60,75.84,78.01,76.02,75.82,78.87,
+74.23,77.83,76.08,78.95,77.77,81.22,77.58,76.22,77.40,78.89,
+77.23,78.40,77.19,79.40,77.92,79.40,77.16,78.84,79.55,79.15,
+78.84,83.50,82.62,77.99,80.14,82.56,78.65,79.36,80.43,81.98,
+19.17,18.95,19.55,20.37,21.71,22.35,23.56,23.04,24.35,25.42,
+25.56,25.72,26.50,26.91,28.67,28.51,28.49,29.24,28.19,28.83,
+28.26,30.90,31.21,30.06,32.79,31.61,32.13,32.64,34.13,32.17,
+34.00,34.69,34.44,35.74,35.66,35.61,35.51,35.66,37.64,36.80,
+37.55,36.03,39.24,38.29,38.07,38.55,38.90,40.10,40.03,38.90,
+42.90,42.98,40.41,40.67,42.01,43.65,42.33,44.44,43.64,44.81,
+43.79,46.58,44.80,45.80,46.13,44.45,46.04,46.99,44.65,46.98,
+47.20,46.27,46.56,48.64,47.83,47.52,50.36,47.89,48.94,49.12,
+47.95,49.90,50.38,49.34,50.31,51.74,52.19,52.20,52.91,50.41,
+52.37,51.78,53.57,52.09,52.02,52.99,55.04,54.30,54.80,53.05,
+54.76,55.31,55.88,54.95,54.58,55.07,57.76,57.08,56.77,55.05,
+57.55,57.53,59.55,56.47,53.83,57.65,58.56,59.53,57.64,58.26,
+58.54,57.85,61.47,59.68,59.42,59.40,59.07,62.62,59.88,61.19,
+62.64,61.62,61.06,62.46,61.95,61.41,62.61,63.14,63.59,62.12,
+63.26,62.58,62.27,66.70,64.00,63.69,64.48,61.01,62.15,66.54,
+68.41,66.80,64.40,64.57,62.84,67.18,67.76,66.56,67.16,69.10,
+66.40,67.11,66.14,67.58,69.35,65.69,67.58,67.64,68.18,70.72,
+70.19,70.65,71.35,67.96,71.61,69.38,66.72,72.51,70.68,72.28,
+71.90,70.65,70.17,73.71,70.21,70.68,75.48,69.02,72.47,72.18,
+71.87,73.04,73.07,72.03,72.66,74.41,71.39,74.34,76.71,74.76,
+78.33,73.51,74.89,75.21,76.10,74.73,75.63,75.20,76.69,77.27,
+74.67,75.70,74.99,75.56,77.14,78.32,74.89,77.74,79.60,76.78,
+76.56,76.86,80.77,78.01,78.47,79.66,80.56,79.29,77.67,78.81,
+79.68,80.59,83.46,80.97,80.42,80.05,79.30,79.27,81.26,83.59,
+81.77,79.63,84.55,83.42,78.03,85.01,84.41,83.51,81.03,83.43,
+83.66,81.64,81.58,84.85,81.09,82.05,81.82,85.12,86.39,84.38,
+86.93,82.70,85.86,81.71,84.33,85.01,86.67,84.10,85.10,87.64,
+85.66,84.23,84.02,86.81,84.80,85.53,89.62,86.31,85.59,88.82,
+83.90,88.65,84.82,90.15,87.82,87.65,86.79,90.22,91.52,90.17,
+20.57,21.49,22.53,22.69,23.18,24.20,23.97,25.18,25.63,26.33,
+27.53,27.31,27.16,27.76,30.57,30.53,30.04,30.96,31.16,32.62,
+32.94,31.86,33.43,32.82,33.33,35.39,34.98,35.16,34.88,36.90,
+36.41,37.27,36.60,37.14,38.23,39.02,37.65,40.02,39.84,40.53,
+40.89,39.54,42.24,41.24,41.68,42.36,42.80,41.92,43.02,42.52,
+44.28,44.09,44.25,44.59,45.46,45.90,45.76,46.31,45.63,46.34,
+48.38,46.48,46.97,48.76,48.57,48.97,47.91,50.56,50.51,49.98,
+52.20,50.48,49.68,50.43,52.33,50.89,53.52,52.62,55.70,52.89,
+53.17,56.26,54.90,53.94,54.44,54.41,57.76,56.68,54.45,57.21,
+56.73,57.45,54.54,58.25,58.34,57.78,57.34,56.13,58.14,58.38,
+58.07,58.45,56.97,62.08,60.85,60.35,57.62,58.60,62.41,58.88,
+61.73,60.37,60.62,63.04,63.35,63.11,62.48,64.83,63.28,60.94,
+62.32,63.43,66.02,64.46,62.42,62.35,63.71,62.12,63.05,66.98,
+66.07,65.14,64.73,66.48,66.78,66.15,67.05,66.46,71.24,70.73,
+71.51,67.29,68.33,70.06,67.25,66.72,69.44,71.72,69.44,68.05,
+68.11,70.72,70.00,71.08,71.90,71.66,74.27,72.03,69.00,71.32,
+71.71,72.72,73.14,73.50,71.34,70.80,72.22,76.72,75.23,75.16,
+73.86,78.52,74.22,78.06,76.27,75.33,75.34,76.19,77.83,78.27,
+77.10,76.17,78.76,76.80,78.08,77.35,76.76,76.69,79.06,76.42,
+78.01,77.40,80.53,75.33,83.01,79.05,80.27,81.61,78.79,80.42,
+79.95,78.56,78.72,81.35,77.14,81.23,81.70,80.88,84.33,82.35,
+83.49,82.29,83.43,81.44,84.11,81.87,82.90,82.50,81.85,81.88,
+83.37,83.90,87.98,83.37,85.81,84.51,82.80,87.86,83.22,82.51,
+86.36,86.80,89.39,87.03,84.50,88.05,88.81,87.54,85.87,86.85,
+88.64,88.44,88.19,85.63,88.36,89.08,88.77,91.69,90.58,91.11,
+87.17,90.68,89.72,88.33,89.30,88.80,89.59,92.30,92.22,87.38,
+91.10,92.80,94.05,87.45,91.58,93.39,91.29,92.87,92.75,92.05,
+89.86,94.62,97.85,92.58,94.24,93.55,91.36,95.05,93.17,93.51,
+91.88,95.54,94.57,94.11,90.04,98.49,94.53,90.99,95.94,94.87,
+21.96,23.23,22.95,23.62,24.29,25.26,26.73,27.18,25.76,27.10,
+28.84,30.18,30.14,30.29,30.70,32.46,33.06,33.02,32.36,34.76,
+33.49,35.60,34.51,33.55,36.06,36.22,36.13,37.22,37.62,38.25,
+40.56,39.79,40.35,40.67,41.25,39.21,40.19,42.52,43.28,40.24,
+42.76,44.31,43.81,44.71,43.22,44.48,45.41,46.57,44.90,45.67,
+47.62,47.47,45.82,49.97,47.17,49.39,51.09,49.13,49.62,50.15,
+50.29,50.65,51.99,49.07,52.69,51.26,52.71,53.31,51.61,52.73,
+54.17,52.85,52.02,53.57,54.35,55.88,56.22,55.87,58.38,56.65,
+56.58,56.07,59.56,58.61,60.60,57.88,60.06,58.28,60.04,61.42,
+60.36,60.93,58.93,60.29,63.68,62.67,62.88,62.43,63.09,61.94,
+61.10,60.73,63.99,63.14,63.98,67.55,66.60,63.32,66.83,67.32,
+65.17,65.84,66.75,65.57,67.42,67.34,65.51,66.53,68.45,69.43,
+67.46,69.61,71.22,69.04,70.98,71.15,69.96,69.23,70.75,71.50,
+74.58,71.37,71.29,70.67,74.11,71.84,75.31,69.34,73.89,75.13,
+70.90,72.29,74.98,72.49,71.44,69.87,75.08,73.76,73.78,75.91,
+73.97,77.39,75.38,77.95,75.58,76.67,75.57,73.41,78.82,78.99,
+80.82,79.59,81.03,76.61,79.03,78.96,79.14,79.61,75.83,79.76,
+82.04,80.07,81.79,82.18,78.53,81.50,81.51,80.98,80.31,83.82,
+80.31,80.89,84.60,82.12,80.40,81.35,82.67,83.66,85.55,83.00,
+83.07,82.25,83.10,85.55,82.75,83.47,86.60,87.19,84.59,83.79,
+85.28,86.30,87.60,87.26,83.43,84.10,86.00,90.37,87.13,87.60,
+89.17,86.97,90.80,87.88,90.89,87.98,86.64,88.30,92.15,87.54,
+91.66,92.64,89.17,90.64,92.39,88.48,89.74,89.52,92.57,92.64,
+94.34,91.05,91.62,94.36,92.66,93.98,91.85,94.54,94.60,94.14,
+94.97,94.45,91.45,93.27,91.40,92.69,90.60,91.60,95.70,93.61,
+98.70,94.32,96.64,100.12,94.33,95.56,96.74,95.31,95.67,98.45,
+94.20,93.76,99.60,95.61,98.05,95.79,94.71,96.40,99.96,99.87,
+98.76,103.53,97.93,101.98,100.68,98.84,100.60,98.89,101.72,103.58,
+99.27,104.07,101.48,101.11,99.34,103.79,102.44,100.45,99.75,98.02,
+23.95,23.44,23.74,25.73,25.27,26.30,26.30,28.59,27.50,29.54,
+29.91,30.50,32.19,31.62,33.12,33.24,32.98,35.17,35.33,36.07,
+37.79,36.86,35.91,37.12,38.54,38.60,40.07,40.13,39.78,40.36,
+40.59,40.88,42.69,43.68,42.66,44.19,42.08,43.74,44.09,45.81,
+45.96,44.42,46.53,47.34,45.64,46.39,49.45,47.19,50.25,49.26,
+50.88,51.17,47.77,50.92,51.27,53.30,53.68,50.59,52.01,52.10,
+51.24,53.00,55.04,55.37,56.06,55.59,55.41,56.25,57.13,56.15,
+57.05,57.15,57.74,59.62,59.72,60.12,58.59,58.90,59.84,60.29,
+58.42,62.39,61.12,60.26,62.90,61.72,62.09,63.63,61.80,63.46,
+63.61,61.54,62.82,63.44,63.69,62.83,63.86,65.05,67.52,66.80,
+65.79,64.38,65.38,66.70,69.78,67.82,67.50,65.47,69.00,70.20,
+70.20,69.85,67.25,71.87,70.18,68.69,70.17,71.58,73.98,73.07,
+71.95,72.57,72.19,71.63,74.78,72.92,73.36,72.91,73.10,71.43,
+76.32,74.37,78.22,78.37,74.73,75.41,77.43,79.02,75.25,75.33,
+78.29,79.45,77.91,80.37,77.32,76.75,80.37,78.38,79.47,77.89,
+82.14,79.82,83.42,77.74,80.19,79.14,80.09,81.30,82.49,81.88,
+82.87,80.05,82.56,84.95,79.61,83.03,81.52,85.12,85.28,86.72,
+85.93,83.58,81.55,84.83,87.40,88.22,83.82,83.32,86.04,84.88,
+86.41,89.86,85.51,86.60,85.82,85.38,86.76,91.00,89.78,83.30,
+87.16,89.82,90.03,88.71,87.55,94.26,92.65,87.51,91.75,89.65,
+88.89,89.80,92.35,91.44,93.82,96.87,91.99,90.62,93.07,89.71,
+93.26,89.57,90.55,88.22,92.38,97.15,94.70,92.23,92.93,94.43,
+96.66,96.91,95.40,94.26,96.82,97.11,95.38,96.72,96.68,97.92,
+95.48,98.77,93.54,96.06,98.76,97.56,99.94,98.62,97.81,100.05,
+95.37,97.17,98.06,101.66,100.74,100.20,101.15,98.32,100.37,102.42,
+103.29,100.82,100.22,100.45,99.10,99.22,99.20,102.36,104.36,102.93,
+101.59,102.92,106.98,105.49,105.39,99.80,104.55,103.30,102.61,106.87,
+105.05,101.41,106.96,108.45,103.07,108.31,107.52,108.85,106.35,106.57,
+107.89,110.14,110.17,108.88,109.28,110.01,107.65,108.20,107.82,108.43,
+22.67,24.47,25.07,26.43,27.75,27.57,28.12,28.50,29.58,31.69,
+30.91,31.14,32.54,33.26,32.16,33.83,34.26,36.75,36.68,37.91,
+37.54,38.09,38.29,37.96,39.71,39.17,41.58,41.98,41.79,41.54,
+42.40,42.58,42.31,43.91,44.27,44.92,45.29,46.23,48.35,46.65,
+47.58,48.05,46.82,47.49,50.34,48.94,50.74,49.41,50.67,52.13,
+51.71,52.72,55.14,55.12,53.50,50.80,53.61,53.90,54.96,57.13,
+52.62,54.36,56.22,55.93,57.09,55.96,62.14,59.15,60.16,57.39,
+61.86,61.10,60.38,62.52,59.93,59.89,60.00,62.21,62.99,65.24,
+61.94,64.40,63.09,66.44,63.38,64.15,65.84,68.97,65.96,66.42,
+66.51,66.90,67.83,67.29,70.50,69.15,68.35,69.41,68.26,67.17,
+70.63,68.72,68.93,71.25,69.61,68.89,71.25,72.61,74.01,71.92,
+74.42,72.52,71.27,71.49,70.60,74.94,70.62,77.32,75.13,75.97,
+75.59,73.52,78.40,74.16,75.67,77.06,75.87,74.36,75.10,79.03,
+76.44,79.11,79.87,77.43,78.98,79.30,81.60,82.64,78.94,76.29,
+81.02,80.14,82.82,85.21,81.24,79.55,82.90,81.94,83.24,82.74,
+82.19,84.08,81.94,85.74,83.95,85.23,85.87,83.49,87.16,83.36,
+85.05,88.62,85.07,88.33,86.88,84.88,88.34,86.32,88.39,89.08,
+88.56,91.92,86.38,87.43,90.89,92.89,89.04,91.19,86.11,92.11,
+92.42,92.41,93.38,94.71,92.57,94.00,90.16,94.25,93.16,96.12,
+93.95,95.29,94.21,93.45,95.39,95.91,94.94,97.28,96.79,95.40,
+94.20,95.28,96.68,95.40,93.09,98.30,96.61,95.57,98.75,100.62,
+97.01,99.98,97.43,100.01,99.10,94.22,98.97,100.60,99.96,98.81,
+98.83,101.81,102.66,102.09,103.09,102.42,101.64,97.80,101.09,103.36,
+101.21,103.08,107.42,103.74,104.42,105.08,106.25,101.50,102.26,104.89,
+99.46,100.13,102.09,107.10,106.59,105.26,101.89,104.66,107.86,103.28,
+106.16,103.72,105.85,106.00,105.99,107.83,106.23,106.18,101.85,106.67,
+109.02,103.73,110.50,107.17,107.72,107.38,113.78,109.48,105.44,114.24,
+111.17,110.25,108.42,112.49,110.84,111.16,115.74,109.00,113.83,112.40,
+111.90,114.25,111.49,108.73,115.90,115.71,113.03,113.62,111.04,108.01,
+23.90,25.19,25.03,26.33,27.13,28.39,29.22,29.85,31.00,32.15,
+32.89,34.68,34.43,34.60,35.53,35.63,36.16,37.14,36.94,39.30,
+38.86,38.64,40.33,40.89,42.48,40.57,43.87,43.14,43.46,42.78,
+42.92,43.76,45.52,47.25,46.50,45.20,46.52,48.89,47.96,46.28,
+49.13,49.21,50.24,50.85,50.61,51.08,53.28,52.65,50.25,52.56,
+53.29,54.21,54.63,55.50,56.42,57.32,54.97,56.68,57.86,57.22,
+59.03,57.59,58.59,60.31,59.34,58.00,59.30,61.67,62.50,61.72,
+63.03,62.88,64.12,62.11,60.95,65.54,62.91,62.59,63.05,65.01,
+66.48,66.40,67.23,65.67,64.76,69.98,67.80,66.58,67.99,66.26,
+65.69,70.96,69.78,70.54,69.70,68.96,72.41,72.43,72.49,73.68,
+70.40,71.33,72.45,75.13,75.74,75.55,73.00,77.31,74.73,73.57,
+73.09,73.93,73.80,73.15,76.42,80.35,78.98,79.82,78.64,78.41,
+77.19,79.26,76.70,78.61,83.56,77.48,78.98,79.51,82.28,82.48,
+79.87,80.42,81.47,82.81,82.32,80.80,82.89,86.79,81.06,80.64,
+86.43,84.12,84.81,85.21,86.28,87.02,83.77,86.70,86.28,87.33,
+88.04,83.79,87.10,90.68,86.56,89.03,89.39,88.10,86.60,84.51,
+87.70,92.39,89.45,88.16,89.46,91.47,90.90,92.70,95.70,89.25,
+92.38,90.30,92.16,93.77,94.65,95.19,95.56,96.02,91.40,90.49,
+94.87,95.30,96.73,95.84,94.20,91.38,96.85,99.25,95.99,100.53,
+98.72,94.84,95.17,94.63,96.38,97.94,93.62,97.90,98.53,101.52,
+98.33,101.11,100.24,101.85,97.09,100.72,99.91,98.03,98.61,98.24,
+99.72,102.18,104.04,100.75,101.92,102.31,104.92,102.21,100.13,102.89,
+104.49,107.02,105.63,105.74,105.91,108.03,103.43,105.43,106.49,103.48,
+108.96,104.97,102.82,105.91,104.63,107.70,107.33,109.47,107.81,103.69,
+110.43,106.70,105.61,107.76,108.82,110.73,107.71,107.53,107.08,106.69,
+110.46,109.72,111.33,113.41,112.61,111.92,111.67,115.54,112.89,112.95,
+116.64,109.57,112.22,112.34,114.41,112.32,114.19,115.94,112.17,112.98,
+112.04,114.25,110.94,109.79,117.80,109.94,113.30,112.28,119.75,114.51,
+118.25,117.37,117.60,116.12,120.02,116.16,119.16,117.50,116.89,120.73,
+24.94,26.35,26.74,27.41,29.31,28.16,30.92,29.92,32.52,32.42,
+33.93,34.44,35.45,36.68,37.17,35.27,37.37,37.70,39.62,39.64,
+40.60,42.09,43.07,40.52,44.39,43.92,42.61,44.04,43.64,47.00,
+45.26,49.13,46.55,48.56,49.63,48.61,48.04,50.18,48.49,51.18,
+50.23,50.40,52.69,54.11,54.24,52.15,54.73,52.93,53.87,54.66,
+53.50,55.65,58.64,57.36,58.64,57.48,60.42,57.95,58.43,58.16,
+59.83,58.51,60.97,59.54,62.51,61.25,63.34,64.04,62.40,63.96,
+62.60,65.44,62.85,66.68,63.26,64.76,69.21,66.37,66.68,68.62,
+66.04,68.90,67.96,66.99,69.38,68.57,68.48,69.64,68.28,71.99,
+73.70,70.37,70.83,67.77,71.96,71.96,73.68,69.73,72.33,73.18,
+74.66,76.36,76.78,76.14,73.97,76.04,79.44,74.53,76.49,76.57,
+76.71,78.87,74.73,76.61,81.12,77.80,80.78,79.49,78.74,80.58,
+79.21,81.73,82.17,85.64,80.81,83.98,85.15,82.99,81.29,80.04,
+84.44,84.07,85.70,85.63,84.59,81.91,82.45,84.17,88.09,87.16,
+86.55,90.81,90.94,86.25,91.29,88.45,89.62,88.53,88.13,87.71,
+85.61,87.16,91.80,91.62,93.56,88.55,90.10,87.33,93.26,92.86,
+92.79,92.34,89.65,91.39,95.95,95.76,93.68,97.54,92.69,95.24,
+99.25,95.66,94.49,98.28,93.96,96.24,97.63,93.05,94.92,97.45,
+100.88,95.30,98.71,98.91,102.20,98.56,100.38,96.54,98.11,100.59,
+98.30,99.18,101.91,98.60,98.51,102.63,105.91,97.47,105.85,99.47,
+101.96,106.30,102.41,109.57,102.02,102.36,101.40,104.85,108.37,102.84,
+107.31,105.29,107.24,104.25,107.35,109.33,103.02,106.70,105.00,106.71,
+109.52,104.66,107.69,107.54,109.28,107.90,109.09,107.93,106.24,109.76,
+108.42,106.98,109.16,110.16,111.19,109.24,114.77,110.62,113.54,112.18,
+115.03,113.00,112.93,110.38,115.05,114.97,115.49,114.93,112.82,113.52,
+112.19,113.86,113.89,114.37,115.12,114.85,118.98,115.60,113.06,117.46,
+116.47,115.44,114.14,117.92,114.76,118.55,119.39,116.00,118.78,118.72,
+121.38,117.93,115.82,120.23,121.29,118.08,120.24,118.65,119.65,124.05,
+120.42,123.52,117.01,118.58,117.73,125.57,118.34,122.46,123.57,122.59,
+25.19,25.63,27.59,28.32,28.67,30.64,32.24,31.71,32.11,32.85,
+35.05,34.54,36.16,36.81,37.57,38.58,38.26,39.62,40.05,41.05,
+41.50,42.15,43.10,41.79,42.57,45.53,44.59,46.50,47.61,45.82,
+45.17,48.11,47.81,48.49,48.93,50.55,50.08,50.50,50.19,48.94,
+50.34,53.69,53.88,55.12,52.67,52.36,53.45,55.11,56.55,56.80,
+56.84,58.34,58.77,58.50,58.18,57.65,59.49,59.64,59.04,60.95,
+61.72,63.90,59.58,61.71,61.11,62.06,63.08,62.14,64.77,65.33,
+67.44,65.72,64.78,66.66,66.78,69.20,67.08,67.42,68.31,68.89,
+69.55,69.19,68.15,74.13,70.44,70.25,71.32,67.63,72.40,72.11,
+72.75,70.75,73.54,72.84,74.29,73.87,78.44,74.26,77.40,76.50,
+75.55,76.36,77.45,77.64,76.38,76.45,80.41,81.15,81.31,78.76,
+81.87,78.47,78.87,80.19,82.44,80.02,83.89,83.43,79.45,81.78,
+83.71,84.69,80.85,84.89,86.36,86.79,83.74,83.91,86.41,86.15,
+87.49,85.81,86.03,85.19,86.50,88.32,88.97,86.88,85.65,90.71,
+90.33,89.95,91.29,88.69,92.55,87.24,93.06,87.96,91.88,89.98,
+91.10,92.16,94.05,94.33,93.82,93.23,90.07,92.29,92.76,100.21,
+95.93,92.73,98.56,96.12,96.61,96.62,95.01,97.11,93.65,100.26,
+97.40,95.79,96.25,97.96,98.68,97.65,99.09,94.62,97.18,100.32,
+102.11,98.61,101.55,100.46,98.68,98.38,99.32,103.33,100.00,104.03,
+105.20,108.43,101.07,103.64,99.03,102.75,102.77,100.20,104.05,102.67,
+107.15,108.59,105.95,104.89,104.24,103.73,109.04,104.75,107.76,106.22,
+105.94,109.02,108.67,107.89,111.20,116.76,113.16,109.32,106.41,108.08,
+106.43,103.39,109.20,110.55,112.65,110.35,110.12,111.29,113.79,114.11,
+110.71,114.50,116.06,112.47,118.22,114.28,115.75,112.07,117.51,112.93,
+112.49,112.91,115.02,115.66,113.17,113.68,118.38,112.73,117.40,118.73,
+117.53,113.98,117.78,117.33,114.08,119.61,118.90,117.88,120.46,120.36,
+115.28,117.99,118.36,124.42,120.58,114.94,117.78,120.31,123.31,124.62,
+117.19,120.29,121.01,119.96,119.31,115.59,119.80,128.51,127.92,128.03,
+122.65,123.78,126.98,127.68,123.89,122.42,125.20,119.59,126.95,125.16,
+26.45,26.46,28.61,28.57,29.47,29.15,31.68,31.46,33.98,33.12,
+36.28,35.28,35.79,37.25,38.21,38.33,39.00,38.61,39.56,43.64,
+41.84,41.02,44.77,43.13,42.67,46.55,45.34,47.19,47.45,48.13,
+47.21,48.47,49.70,48.50,49.13,51.60,51.46,49.97,53.35,52.71,
+52.80,53.12,52.68,53.61,54.79,54.53,54.99,57.67,59.77,58.10,
+55.75,57.30,58.72,60.52,59.80,59.97,62.10,60.11,62.33,59.45,
+61.35,62.18,65.17,61.99,64.22,64.54,66.80,62.51,68.35,66.80,
+67.09,68.08,69.18,66.87,65.76,68.94,67.07,68.72,71.90,70.33,
+71.52,70.54,72.36,68.76,72.68,72.69,71.63,73.00,78.07,72.12,
+75.75,74.62,74.22,74.67,76.67,74.30,78.66,76.30,75.74,75.88,
+78.37,77.72,80.27,78.60,79.24,80.17,81.03,80.67,83.58,79.21,
+81.40,77.86,82.11,82.27,82.82,82.72,77.97,83.52,85.31,84.23,
+84.63,84.45,84.34,82.69,86.01,87.94,87.53,86.23,86.93,86.32,
+86.98,88.85,87.40,90.18,91.22,89.22,89.38,90.25,90.54,91.50,
+88.79,87.80,94.72,94.31,92.62,91.58,92.10,90.53,94.81,92.12,
+91.03,96.79,95.00,95.00,90.34,96.01,95.13,94.91,98.00,97.10,
+94.03,97.11,98.64,94.82,96.97,98.36,102.56,97.46,101.24,99.45,
+99.14,103.34,98.68,99.96,97.90,99.31,101.74,104.84,99.82,101.26,
+102.13,101.62,103.05,101.67,106.66,103.44,102.41,107.52,104.32,105.74,
+105.74,104.23,106.19,106.98,107.83,105.11,109.57,108.37,106.25,107.33,
+106.25,109.11,109.65,109.35,109.06,105.44,105.34,109.98,103.21,110.23,
+110.93,113.22,107.91,113.45,111.67,113.35,107.91,106.94,115.51,111.69,
+109.08,111.10,111.90,113.09,111.58,114.09,116.29,114.60,113.56,113.75,
+114.68,122.19,114.09,118.33,114.09,113.02,114.48,114.09,118.75,115.93,
+114.69,115.84,117.36,117.57,117.95,117.82,117.47,120.82,118.65,115.90,
+117.75,119.11,123.15,117.84,114.58,121.34,121.88,122.05,119.40,117.19,
+124.47,121.52,121.19,127.90,123.82,128.99,119.77,118.46,123.44,120.66,
+126.71,126.63,119.01,123.63,124.34,126.29,124.60,126.32,127.04,129.27,
+128.00,126.34,127.38,123.51,127.72,128.78,127.66,128.43,123.74,126.82,
+26.12,26.82,28.05,28.74,30.90,30.88,32.62,33.41,32.94,34.25,
+34.34,35.59,37.71,37.49,37.58,40.89,38.66,41.54,40.34,41.96,
+40.94,43.70,45.26,45.74,43.61,45.62,46.42,48.67,48.37,47.16,
+48.78,48.59,50.46,47.50,51.32,50.16,51.65,51.59,52.43,53.21,
+54.64,53.21,54.38,54.55,55.73,56.92,57.99,55.86,57.46,56.11,
+60.70,59.62,60.15,58.13,59.15,61.42,63.64,63.19,62.30,64.28,
+64.96,65.29,60.62,66.21,67.82,65.34,64.52,68.34,66.80,68.79,
+69.35,67.12,70.86,69.13,70.03,68.91,67.58,71.59,73.16,73.53,
+73.12,72.01,73.73,71.01,73.29,72.94,70.83,73.14,71.44,74.89,
+73.26,74.85,78.04,79.11,71.84,76.26,75.42,76.95,77.91,81.14,
+80.80,79.77,77.87,81.56,82.41,80.67,82.59,83.19,81.71,86.24,
+81.90,81.76,79.87,83.22,83.78,86.61,87.06,85.47,83.22,86.21,
+86.79,86.50,85.22,85.44,83.79,88.99,87.39,88.03,92.51,91.77,
+93.01,88.09,88.94,89.52,90.87,90.35,89.02,92.63,89.60,91.38,
+90.44,93.68,91.50,89.11,94.30,95.12,94.28,92.80,96.81,93.62,
+92.50,96.42,93.80,98.28,94.44,94.97,96.94,97.83,98.65,101.50,
+98.79,99.35,98.28,98.23,100.54,99.76,102.21,101.11,99.93,102.73,
+100.96,102.55,99.57,101.02,101.12,105.38,98.67,103.23,99.80,101.48,
+105.04,104.12,108.13,105.15,107.72,105.92,104.42,105.68,105.79,107.41,
+112.65,108.00,105.93,104.76,107.72,107.94,107.87,108.47,105.67,110.67,
+106.40,111.76,108.82,113.92,106.97,111.93,112.20,109.95,111.97,111.63,
+114.35,112.06,113.59,112.53,114.72,111.94,112.54,114.79,109.16,112.65,
+114.83,115.55,115.91,117.93,114.92,120.79,122.66,115.15,116.17,121.71,
+116.85,114.48,114.77,114.53,114.90,113.58,117.07,115.35,118.57,116.39,
+121.13,117.16,118.74,121.32,119.91,126.43,117.84,124.85,123.46,125.48,
+118.30,123.55,124.23,121.11,119.92,121.87,124.49,120.43,119.96,124.37,
+123.49,124.38,128.51,126.62,124.69,126.45,131.17,124.91,128.27,128.80,
+126.04,122.45,123.93,126.40,126.02,126.73,124.25,127.59,129.48,125.22,
+128.19,126.12,132.50,131.02,128.19,128.74,123.45,129.04,127.83,125.50,
+27.23,26.13,28.74,28.96,29.96,31.25,31.81,32.13,34.25,35.64,
+34.59,37.13,38.08,38.15,39.45,38.29,41.39,42.89,40.41,40.50,
+43.87,43.52,44.79,44.68,44.02,46.80,45.74,49.62,46.89,51.19,
+49.09,49.87,48.38,49.73,52.47,52.98,52.30,52.56,52.46,56.06,
+54.13,56.31,55.55,55.61,57.29,57.40,57.58,56.35,58.29,59.83,
+58.47,63.86,61.16,61.76,63.30,64.00,61.49,60.92,64.09,61.99,
+63.23,64.22,63.05,65.14,68.03,65.35,69.52,69.95,68.39,69.87,
+69.19,67.92,68.04,71.83,69.85,70.91,71.08,70.32,72.31,71.83,
+72.35,72.92,72.65,71.59,74.36,75.21,75.37,73.60,75.56,76.06,
+74.33,78.46,75.25,80.15,78.09,79.67,79.42,79.05,78.26,81.36,
+75.79,81.82,81.24,79.36,81.73,80.05,84.00,82.89,84.71,85.32,
+83.75,86.84,82.37,85.41,86.07,84.51,87.83,86.50,87.38,87.88,
+88.11,89.77,87.58,90.71,88.88,86.78,88.62,87.96,91.04,90.84,
+92.24,91.58,93.39,92.63,91.01,92.51,92.51,92.99,93.26,95.92,
+94.08,93.52,93.06,96.64,94.09,92.53,93.26,95.60,95.69,96.89,
+92.79,96.27,97.68,96.62,97.88,98.39,96.86,99.34,101.19,98.57,
+100.75,99.97,105.06,100.15,101.68,98.08,102.62,100.24,101.72,99.14,
+100.91,103.58,103.62,103.60,102.04,104.57,107.33,101.57,105.95,103.85,
+105.71,104.31,104.24,104.23,106.96,107.98,102.54,107.59,109.08,108.41,
+109.19,104.30,105.48,111.09,111.07,111.86,104.74,106.56,109.89,105.80,
+108.43,109.11,111.25,109.61,109.59,111.21,109.96,109.61,116.05,110.96,
+115.21,111.72,114.87,118.18,110.02,118.08,114.78,112.94,118.87,116.18,
+117.12,115.08,117.40,116.70,117.02,119.02,116.32,114.26,121.12,120.19,
+117.51,122.28,114.39,116.78,119.15,118.35,118.66,120.09,120.44,115.53,
+117.79,114.68,126.54,122.46,122.11,123.06,119.24,120.19,123.07,120.17,
+123.39,128.66,125.01,121.64,125.15,126.26,127.61,122.57,128.61,128.59,
+126.22,128.69,125.53,129.87,124.59,127.39,124.56,124.36,127.92,127.80,
+125.90,127.87,131.83,126.16,128.63,127.40,130.34,126.27,127.98,123.66,
+128.37,129.99,129.22,131.46,132.28,130.81,130.23,130.00,128.13,129.89,
+27.36,27.66,28.74,28.18,30.21,32.43,32.86,34.57,33.15,34.06,
+35.74,36.95,35.49,37.35,38.51,40.35,40.62,42.08,39.88,44.02,
+44.51,44.18,45.07,45.74,44.44,46.68,45.72,48.40,48.41,48.32,
+50.60,50.96,50.53,50.28,51.52,52.61,53.44,52.96,56.35,55.56,
+56.42,55.61,55.77,56.83,54.98,57.74,56.63,57.93,58.35,60.17,
+59.50,60.23,60.97,60.63,63.39,62.49,63.00,64.42,61.31,61.30,
+61.68,66.07,65.19,65.86,64.52,66.68,67.86,67.21,66.57,67.42,
+69.74,69.76,68.81,67.89,69.55,72.04,72.01,74.62,70.66,68.27,
+75.52,70.23,73.85,75.81,76.16,75.70,75.78,75.38,77.73,75.89,
+75.75,76.81,77.82,78.25,78.35,79.97,80.04,76.95,77.95,78.83,
+80.81,82.33,79.52,79.95,83.67,82.00,85.06,83.75,83.04,84.45,
+84.28,83.14,82.47,83.45,84.17,87.21,82.93,91.09,83.59,86.24,
+87.11,88.30,92.24,86.85,84.99,90.39,92.47,87.88,92.04,92.34,
+88.99,87.28,91.50,92.51,92.07,89.53,91.96,95.09,91.20,95.74,
+93.89,95.44,95.36,95.86,97.56,95.00,95.60,98.92,99.04,97.78,
+99.42,95.84,95.72,96.59,96.27,96.05,98.43,97.96,100.77,99.16,
+98.16,103.85,97.84,106.59,101.04,101.04,98.90,102.83,103.83,104.23,
+102.14,104.42,108.21,103.75,107.41,100.32,106.63,103.80,107.67,105.08,
+103.77,107.57,108.44,105.93,107.32,109.64,110.28,106.38,105.62,105.61,
+111.56,112.32,111.61,109.86,108.22,107.14,111.33,108.14,113.80,108.25,
+110.06,112.93,112.32,110.06,111.42,109.58,115.35,115.37,115.20,115.65,
+114.20,114.51,114.00,115.46,114.17,113.31,114.59,114.13,112.40,119.98,
+111.26,115.98,119.10,116.71,112.86,111.42,117.46,118.46,116.48,123.73,
+116.45,119.23,120.04,117.96,113.09,119.77,117.21,121.13,122.64,130.27,
+118.73,125.11,119.76,125.36,122.62,120.14,125.87,125.60,122.83,123.17,
+117.44,129.05,123.21,124.79,123.76,126.41,124.51,128.03,124.55,124.04,
+120.84,123.19,122.39,123.98,128.09,128.57,124.58,127.44,128.72,129.18,
+132.03,132.48,131.53,127.88,128.05,130.74,123.61,133.29,127.20,131.16,
+129.26,128.21,128.84,136.90,132.44,132.88,132.09,131.26,134.47,131.45,
+25.66,27.76,28.22,29.76,30.72,30.87,32.64,34.30,33.52,35.05,
+34.55,35.77,37.03,38.22,39.54,39.50,39.71,41.88,41.81,44.05,
+44.51,44.45,44.30,45.62,45.34,46.20,48.35,48.28,48.12,49.25,
+47.30,51.81,49.47,51.30,53.36,52.68,51.76,55.97,53.56,55.15,
+54.19,53.76,56.46,58.41,56.17,57.66,59.00,60.13,62.40,60.71,
+59.82,62.13,60.24,60.55,63.25,63.41,60.34,61.02,65.00,65.57,
+63.00,64.38,66.09,65.73,67.84,67.07,68.36,66.28,68.43,69.47,
+69.74,70.78,70.90,70.56,71.52,71.67,72.28,70.96,71.43,74.36,
+74.45,74.81,74.31,74.58,75.89,73.18,74.74,78.49,79.93,76.89,
+76.77,78.47,76.61,80.42,81.27,79.74,78.41,82.75,81.88,81.89,
+79.40,80.46,80.64,83.89,79.00,84.55,84.62,78.73,84.24,83.71,
+82.22,87.40,87.35,82.75,85.30,83.56,84.85,87.80,88.29,84.36,
+87.48,90.01,87.85,87.59,88.55,90.19,90.34,92.07,91.87,89.49,
+93.15,94.38,92.27,91.29,95.63,95.44,95.66,95.09,92.77,91.61,
+96.17,94.90,94.27,91.57,94.86,95.70,96.62,98.27,97.88,96.91,
+93.67,97.58,97.74,100.87,94.81,99.24,98.66,99.62,99.79,97.94,
+102.50,101.66,100.05,107.74,100.83,102.26,103.75,102.05,104.21,100.63,
+108.33,103.74,99.93,102.81,102.46,101.19,103.87,106.04,107.15,104.96,
+106.00,108.93,103.22,107.86,106.31,109.11,102.45,108.34,106.25,112.74,
+110.72,108.25,104.90,113.99,113.95,113.58,111.80,112.37,114.11,109.65,
+113.70,112.46,112.86,108.75,113.29,113.67,112.13,113.23,112.66,114.93,
+115.86,116.04,117.49,119.41,112.51,119.42,115.38,116.86,111.67,117.60,
+115.90,116.40,119.50,117.66,121.23,114.56,118.57,114.79,118.38,118.44,
+121.60,116.05,118.27,118.23,118.67,124.47,122.42,126.37,122.44,121.55,
+118.48,116.35,122.80,124.18,121.63,120.91,114.60,121.86,122.30,121.52,
+121.82,121.83,124.70,124.42,122.78,126.74,127.80,126.88,128.70,124.88,
+128.19,126.26,129.81,128.80,123.96,130.14,126.86,126.85,124.18,127.92,
+133.11,127.84,127.59,128.57,128.14,124.64,127.15,130.18,127.09,133.49,
+130.81,132.11,129.38,130.90,130.01,131.87,128.65,131.34,133.82,131.61,
+25.47,26.92,28.73,29.13,29.94,30.16,33.13,32.98,34.56,35.26,
+36.11,37.58,38.09,38.62,38.37,39.99,40.94,39.99,42.56,41.76,
+41.64,42.52,44.03,45.62,46.38,47.02,48.93,47.54,49.01,48.47,
+50.53,51.39,49.35,52.70,53.16,53.20,52.38,57.00,54.63,52.56,
+56.13,54.70,56.97,59.91,58.96,57.70,57.73,58.47,60.06,60.91,
+61.50,59.98,61.67,62.80,60.68,62.05,63.24,63.45,60.37,64.97,
+64.11,64.87,65.69,67.71,68.05,64.52,65.81,68.48,71.13,71.11,
+68.89,68.11,69.05,72.92,70.46,70.42,69.60,72.68,72.75,70.95,
+75.31,70.73,73.89,74.01,76.01,77.61,76.24,75.48,72.89,77.14,
+76.13,75.77,79.05,79.76,78.60,81.75,82.93,78.26,82.60,79.68,
+84.72,84.22,85.72,81.22,86.38,81.81,84.28,85.07,85.54,83.83,
+83.60,86.25,82.07,83.48,86.85,85.74,88.89,85.97,87.55,88.91,
+89.19,87.68,85.69,89.62,89.32,92.01,89.11,92.88,92.09,91.34,
+91.05,91.29,92.12,92.26,93.07,94.14,98.85,90.81,94.17,92.98,
+94.06,92.29,97.98,96.54,95.38,98.08,98.41,92.57,94.62,100.10,
+102.59,98.50,97.78,101.21,97.68,99.54,99.60,94.58,103.50,97.57,
+99.79,99.97,102.90,105.42,100.94,99.43,96.94,100.39,101.94,101.33,
+103.68,105.79,107.85,103.21,106.68,106.13,101.87,104.50,110.90,108.29,
+104.77,104.71,110.05,107.89,106.04,109.73,107.45,109.54,101.32,111.05,
+104.01,109.60,111.28,109.00,109.88,115.60,108.76,107.62,111.39,107.53,
+111.43,113.35,113.22,113.24,108.19,107.24,111.48,111.72,115.37,112.97,
+118.06,111.65,114.90,113.70,114.46,115.48,113.77,115.92,113.81,115.69,
+119.83,116.19,112.76,118.79,115.40,120.59,120.76,118.52,114.32,116.32,
+123.60,117.88,121.16,120.86,121.27,121.14,120.99,121.48,122.67,120.10,
+123.48,124.19,124.28,124.27,122.42,121.03,123.97,119.13,121.65,122.98,
+118.79,122.80,124.50,125.67,126.56,126.47,126.38,124.99,127.32,132.21,
+124.90,126.07,122.74,124.67,123.94,125.68,126.57,122.64,128.14,127.12,
+126.47,124.25,126.65,127.97,132.58,129.33,133.71,131.11,130.16,128.23,
+131.62,132.54,130.99,134.98,132.27,127.19,134.04,134.82,132.82,132.24,
+18.31,18.58,18.78,20.26,19.17,20.72,20.65,22.10,22.01,23.18,
+22.29,22.36,23.33,24.09,25.20,25.43,25.63,25.94,25.14,25.31,
+26.80,26.88,27.26,28.44,28.78,28.47,28.80,29.03,29.97,29.87,
+29.97,30.00,31.77,30.85,31.11,31.04,31.71,31.94,32.89,32.70,
+32.37,31.40,33.51,33.51,33.84,33.98,33.96,35.56,35.96,34.65,
+35.76,35.17,37.24,36.03,37.31,36.09,37.83,37.26,37.93,38.77,
+39.17,37.80,38.90,39.65,39.05,38.72,39.08,39.13,40.29,39.71,
+39.86,41.74,40.04,42.36,40.92,43.08,42.89,42.23,42.06,43.29,
+42.58,41.81,42.30,42.68,44.16,43.06,45.15,45.11,44.78,46.18,
+45.36,45.40,45.55,45.84,46.44,45.71,46.50,47.52,46.65,47.98,
+50.34,46.99,48.11,46.61,47.92,47.20,47.98,47.52,50.44,49.91,
+49.51,49.72,50.11,49.97,51.36,49.61,51.21,48.56,50.55,51.32,
+50.62,50.86,53.12,51.94,50.62,52.56,53.67,53.60,53.41,52.63,
+52.49,52.98,51.72,53.21,54.24,55.32,53.90,53.65,53.94,57.41,
+55.73,55.44,57.04,57.02,54.78,55.35,56.00,57.05,55.26,56.80,
+57.80,57.30,54.88,57.65,57.97,57.08,56.45,57.35,55.91,56.89,
+57.70,58.44,59.52,59.91,59.29,59.87,61.31,58.38,59.95,59.49,
+58.80,58.70,59.66,59.57,61.23,59.41,58.98,62.11,61.89,59.04,
+59.86,59.72,64.91,61.62,62.17,64.53,63.74,64.68,60.30,62.23,
+61.04,60.24,63.67,63.25,62.75,65.25,63.62,62.23,62.83,63.73,
+64.02,64.97,61.56,63.47,64.85,65.78,63.82,65.61,69.05,66.44,
+65.71,64.76,65.81,65.79,66.35,65.69,68.75,67.54,66.40,65.66,
+68.88,66.49,69.45,66.38,66.95,68.96,66.76,66.86,67.60,68.54,
+69.72,67.24,68.13,68.51,64.67,70.44,70.06,68.61,70.05,73.06,
+68.11,67.29,72.47,70.46,72.45,70.57,71.39,69.89,71.35,72.87,
+70.65,73.45,71.74,68.81,71.35,71.49,72.31,71.66,74.23,74.87,
+72.17,71.97,71.66,73.49,72.78,73.10,71.95,71.57,74.27,74.19,
+73.85,72.55,75.29,76.75,74.35,76.57,73.16,72.33,74.64,76.75,
+71.99,74.90,75.72,73.71,75.10,75.32,75.63,75.65,73.87,77.10,
+19.64,19.83,21.13,21.12,21.76,22.57,22.65,23.59,23.52,24.02,
+25.41,25.42,25.23,25.93,26.51,26.50,27.35,27.74,28.26,28.63,
+29.59,30.24,29.63,29.80,30.40,30.77,30.89,30.68,32.79,32.54,
+32.06,32.19,33.47,33.06,34.50,34.72,34.22,34.11,35.19,34.30,
+35.93,36.59,37.91,36.03,36.34,37.18,38.66,38.35,39.63,38.85,
+40.00,39.94,41.14,39.23,39.63,39.54,42.74,40.03,41.63,42.42,
+41.92,41.56,42.48,44.35,42.64,44.33,43.06,45.00,44.25,44.44,
+45.29,44.98,44.76,43.21,46.40,46.15,44.33,46.01,47.98,45.51,
+48.10,47.19,47.14,49.06,46.50,48.21,50.90,50.00,49.06,50.49,
+50.99,51.35,51.15,50.55,48.64,50.57,50.86,51.22,50.01,52.79,
+51.07,53.49,53.10,51.09,53.60,52.48,52.31,53.30,54.05,52.49,
+54.98,54.20,54.84,53.97,56.38,54.78,55.71,57.03,55.39,58.56,
+57.02,56.56,58.39,56.23,56.62,56.64,59.87,57.89,58.22,58.18,
+59.90,57.63,55.60,60.74,60.22,57.45,58.33,61.73,60.52,57.24,
+61.18,60.21,59.81,61.32,60.52,61.07,61.65,63.48,61.69,61.73,
+62.79,61.68,62.84,62.22,61.85,63.19,64.21,66.56,64.30,64.37,
+66.82,62.57,63.72,63.55,64.65,62.94,63.58,64.77,65.99,67.24,
+63.29,67.25,67.21,64.05,65.30,66.10,65.66,69.00,67.74,66.35,
+68.61,66.93,67.39,68.70,68.93,66.78,68.86,67.79,68.62,71.74,
+69.96,68.12,70.56,71.01,71.01,71.49,69.35,69.13,71.66,70.72,
+70.06,73.72,70.21,73.03,71.20,72.66,70.23,69.51,74.10,73.23,
+73.06,72.92,74.30,71.60,73.19,73.13,71.54,71.81,73.48,71.41,
+74.81,74.90,77.62,75.31,77.23,75.41,71.98,73.62,77.16,75.75,
+78.14,74.91,76.49,76.92,75.44,78.45,77.66,75.60,74.43,76.34,
+77.77,79.45,79.13,79.38,77.40,77.74,81.94,78.12,78.84,77.39,
+78.99,77.89,82.82,78.85,79.88,78.89,78.97,76.28,80.80,77.51,
+78.64,81.30,83.61,75.98,78.20,82.43,81.99,80.03,79.04,82.44,
+84.24,83.91,80.24,81.23,82.60,83.56,78.83,80.75,87.83,82.34,
+81.19,86.04,86.43,84.33,81.66,82.88,86.54,84.30,85.99,83.33,
+20.28,20.50,21.55,21.44,24.00,24.23,24.38,24.08,25.18,26.72,
+27.05,27.43,28.16,28.52,28.70,28.93,29.55,29.53,31.29,32.19,
+31.50,32.67,32.52,32.76,32.56,33.01,34.56,33.72,35.30,33.62,
+35.94,35.28,35.46,35.79,37.65,37.26,38.66,37.18,37.20,40.41,
+40.17,39.32,40.26,39.63,40.57,39.98,40.49,39.53,41.44,41.79,
+42.94,42.61,44.07,42.94,42.94,42.44,44.03,43.87,45.72,45.79,
+45.19,44.62,46.11,46.48,46.86,48.59,47.11,47.89,49.95,47.54,
+48.98,49.12,49.63,48.37,51.02,49.98,50.98,51.11,49.38,50.81,
+51.58,52.12,52.50,53.86,52.83,53.54,53.06,53.34,53.38,53.75,
+55.52,56.65,54.94,54.58,54.86,55.11,54.37,54.79,57.48,55.34,
+53.77,57.32,54.88,56.93,56.04,57.64,58.67,59.24,59.50,59.76,
+58.78,61.67,59.24,60.43,58.23,60.91,59.44,59.69,60.25,61.30,
+59.92,60.04,59.23,63.04,62.65,60.08,64.68,66.68,65.78,60.94,
+61.44,64.11,66.24,63.61,63.62,61.42,62.74,66.61,66.54,65.08,
+66.47,65.23,67.41,66.32,66.11,65.70,65.26,69.56,68.67,66.60,
+69.56,66.26,68.49,69.08,65.51,69.39,67.07,67.23,69.63,67.58,
+69.72,70.67,70.87,69.25,70.16,68.63,74.73,67.13,71.85,73.66,
+72.10,70.33,71.69,73.16,70.94,72.79,73.16,76.06,72.90,77.31,
+75.85,74.00,75.89,76.22,74.34,75.89,73.79,73.77,74.41,75.33,
+74.38,77.25,76.61,74.32,76.43,74.60,75.93,77.15,77.50,77.89,
+76.84,79.24,76.47,79.24,74.40,78.36,74.82,80.71,79.27,79.85,
+77.50,77.47,78.77,81.33,76.18,79.47,80.17,77.42,81.48,79.30,
+80.79,83.44,76.55,81.35,80.11,84.08,82.47,80.65,82.16,84.12,
+83.04,83.35,84.77,82.89,83.71,82.18,85.31,82.86,83.66,83.70,
+86.15,83.83,86.43,83.40,85.77,81.06,82.76,81.30,86.31,83.84,
+87.75,83.49,86.81,84.65,86.58,89.14,83.26,87.63,84.03,85.30,
+85.46,86.94,85.01,85.48,89.52,84.93,86.29,88.68,89.74,90.92,
+83.56,86.70,91.65,87.64,91.48,86.74,88.04,91.09,90.13,91.47,
+91.06,88.20,88.28,92.66,90.60,92.54,90.45,89.59,91.25,94.07,
+21.50,22.58,23.69,24.10,24.28,25.03,26.27,28.14,27.31,27.54,
+28.65,29.01,29.36,29.54,30.56,31.10,32.10,32.29,32.31,33.17,
+33.96,33.96,32.87,34.62,35.88,35.78,36.62,36.15,37.22,37.23,
+38.78,37.55,37.74,38.03,40.48,39.90,39.78,39.42,40.42,42.01,
+40.62,44.11,44.24,43.81,43.92,44.04,45.02,44.18,44.45,44.83,
+45.37,45.26,44.66,44.93,45.02,47.70,47.13,47.90,48.00,47.67,
+47.45,51.22,50.12,48.72,50.69,50.31,49.57,51.95,52.99,51.83,
+53.11,52.74,51.82,51.22,52.87,54.74,54.90,53.76,55.27,53.46,
+54.59,54.75,56.16,56.10,57.79,56.33,56.64,60.80,60.49,57.28,
+58.93,58.34,57.20,58.18,59.50,59.70,57.85,60.61,60.61,62.45,
+60.11,62.98,60.42,62.99,63.63,62.12,60.98,62.50,61.47,65.50,
+64.76,63.33,63.16,67.38,63.42,64.18,64.33,66.21,62.62,66.15,
+65.13,63.01,65.95,66.32,66.39,66.49,66.86,67.96,68.97,70.14,
+66.77,69.88,66.25,69.35,70.41,68.04,68.28,69.25,69.44,68.84,
+68.17,70.12,70.43,72.28,73.88,71.26,69.19,71.81,74.13,70.51,
+71.17,74.89,74.46,72.89,75.96,69.98,75.15,73.29,74.64,73.98,
+73.72,73.66,75.00,77.07,72.76,75.71,78.70,74.14,76.33,76.52,
+74.31,80.78,77.13,73.55,78.26,74.83,76.61,75.11,75.76,80.82,
+80.05,77.07,82.36,81.06,78.69,79.65,81.61,78.65,81.25,81.84,
+79.16,82.46,81.39,79.41,84.82,82.94,80.99,80.43,82.82,85.32,
+80.30,83.95,82.87,82.99,83.90,88.73,85.04,84.83,82.36,83.64,
+85.28,88.30,85.18,86.02,85.94,88.48,86.88,84.23,84.06,90.96,
+84.51,88.19,89.14,87.18,87.57,89.96,85.94,88.07,83.38,90.17,
+88.97,89.38,89.97,94.78,87.87,88.30,90.08,90.61,92.20,89.86,
+88.85,90.50,91.19,92.78,92.27,93.00,88.83,92.40,88.02,91.90,
+93.77,90.18,91.40,96.75,93.39,92.85,93.18,90.39,89.26,94.55,
+93.92,92.83,93.91,94.06,88.72,95.92,93.74,96.00,89.61,96.27,
+95.60,97.41,96.74,92.28,96.76,96.48,98.30,95.06,94.59,95.68,
+97.47,98.89,97.59,98.08,99.51,96.76,100.04,100.66,98.93,97.82,
+22.70,23.01,24.32,25.13,25.60,25.99,28.36,28.54,27.51,29.36,
+29.56,30.58,30.18,31.56,31.62,32.88,34.30,34.00,35.52,34.88,
+35.13,35.30,37.29,38.23,36.89,38.03,38.32,38.79,39.59,39.46,
+41.10,41.49,41.27,42.31,41.62,42.45,43.52,46.20,44.59,44.68,
+45.15,44.25,45.30,45.09,46.76,47.63,47.27,47.27,47.58,48.58,
+48.93,47.80,48.15,50.70,48.12,49.71,53.11,51.00,51.61,50.82,
+51.38,55.75,54.32,52.71,53.63,53.03,54.15,55.78,54.51,56.65,
+56.53,58.52,55.40,57.86,55.15,55.95,59.98,59.73,57.32,57.35,
+57.00,59.82,57.99,58.08,57.84,59.82,61.45,61.50,59.05,62.02,
+64.81,62.93,63.05,64.40,60.61,62.12,63.35,63.85,64.96,64.57,
+65.70,66.96,62.97,63.70,65.36,67.14,68.78,66.35,66.70,71.62,
+69.79,67.24,67.47,70.23,66.26,67.05,68.80,70.65,70.51,70.93,
+70.03,70.20,68.43,69.40,70.11,71.82,72.48,71.56,73.68,68.90,
+73.75,70.97,74.68,70.60,71.21,77.65,75.95,74.14,74.01,72.85,
+75.48,76.54,71.74,75.16,76.00,77.05,75.48,76.99,74.46,74.59,
+76.13,80.67,78.05,77.60,78.73,77.14,81.83,78.55,77.04,80.44,
+79.63,80.31,80.84,81.92,81.45,83.62,78.62,79.66,83.60,80.59,
+81.20,79.30,83.66,83.67,79.84,85.72,85.61,81.33,84.48,84.25,
+88.29,83.08,86.59,84.26,86.50,86.68,86.26,82.90,86.18,85.14,
+84.73,91.75,84.05,86.56,88.86,91.57,81.48,88.92,89.07,88.11,
+88.42,87.29,89.81,89.08,87.17,87.76,92.70,84.87,89.30,88.69,
+91.51,90.82,87.95,91.42,91.29,95.51,92.85,87.22,89.94,90.91,
+94.89,89.15,91.87,95.12,94.07,91.85,93.86,93.90,97.92,94.49,
+96.37,93.38,94.14,97.15,94.59,97.26,96.44,95.01,94.20,94.51,
+95.51,99.02,97.82,94.17,97.13,100.60,96.09,96.58,100.29,95.89,
+101.39,97.89,96.71,100.09,101.86,98.03,102.08,97.52,100.84,102.70,
+101.53,107.40,101.55,99.51,102.17,99.99,102.17,100.70,102.32,103.67,
+104.90,98.41,100.87,104.71,101.30,100.23,100.08,105.46,102.73,101.44,
+104.98,102.34,100.37,104.77,104.09,102.21,100.39,105.42,103.75,105.89,
+25.24,23.27,25.83,25.62,27.41,26.66,27.62,29.58,30.18,30.88,
+31.01,31.05,31.52,32.83,32.96,35.03,35.71,35.06,36.34,37.05,
+37.70,37.08,38.59,40.72,38.66,39.04,39.45,40.78,40.12,41.73,
+42.03,42.79,43.45,43.31,43.63,44.76,44.95,46.00,46.91,46.66,
+46.47,46.81,47.32,48.65,49.42,50.28,49.30,50.90,52.86,51.78,
+49.77,51.83,53.03,54.31,53.33,53.10,52.09,54.00,56.04,52.66,
+54.04,54.47,57.23,55.94,54.88,57.78,59.08,57.83,57.43,57.90,
+57.68,58.73,57.80,59.23,58.21,61.86,62.87,63.20,62.00,59.90,
+61.34,63.93,62.32,64.07,64.18,61.76,66.43,63.52,66.06,64.03,
+62.96,64.72,65.24,67.79,66.50,66.90,68.92,67.42,68.81,69.18,
+68.46,65.65,68.52,67.58,68.77,66.49,68.83,71.58,71.10,69.73,
+70.57,72.11,73.36,70.47,72.11,70.61,72.13,76.57,72.01,75.73,
+74.54,74.90,72.47,74.29,73.71,76.51,76.10,72.96,78.21,77.21,
+77.55,75.15,76.39,77.65,76.46,77.87,80.58,79.06,79.01,81.63,
+77.12,78.52,78.78,81.70,80.28,79.72,82.46,82.66,82.83,81.52,
+82.24,84.49,79.76,84.85,84.16,80.88,81.90,83.04,79.33,82.60,
+87.16,81.77,86.48,82.68,84.25,86.25,87.51,86.54,86.30,87.17,
+85.83,89.57,85.92,89.07,87.30,89.10,86.52,87.07,90.92,87.90,
+88.40,89.98,88.95,89.42,90.39,88.70,88.36,87.64,90.64,90.87,
+92.85,91.09,87.39,93.68,93.17,90.69,97.21,90.02,91.04,88.82,
+95.73,92.72,92.99,93.46,94.74,98.29,95.07,95.97,95.00,95.34,
+93.55,94.21,97.78,94.87,94.29,96.43,100.21,97.72,99.39,100.99,
+98.18,93.59,102.43,94.64,98.13,100.32,102.05,102.23,98.48,99.35,
+98.50,101.87,97.56,102.25,98.90,103.08,103.10,105.69,100.28,103.57,
+98.08,96.98,102.42,103.51,101.25,104.33,102.40,107.38,105.44,106.14,
+103.37,105.75,107.28,107.03,101.15,108.57,108.57,102.70,104.53,104.98,
+106.92,102.33,105.45,104.91,104.68,105.17,105.19,108.83,102.92,105.91,
+107.11,106.30,107.16,107.89,105.69,106.34,111.14,114.75,107.91,108.89,
+108.76,114.70,111.12,111.89,107.48,110.52,112.50,110.07,109.38,112.78,
+25.21,24.81,25.57,27.24,27.43,27.97,29.42,30.46,32.26,31.19,
+31.72,32.28,32.86,34.26,34.60,35.78,36.64,37.41,37.35,38.82,
+38.98,39.66,40.32,40.61,41.96,41.24,41.21,43.82,44.54,42.13,
+44.36,43.00,45.92,45.37,45.87,45.69,45.20,48.73,47.74,47.50,
+48.91,48.55,51.09,51.60,51.02,53.56,50.09,52.15,51.41,53.86,
+53.85,53.69,55.46,56.07,53.31,53.30,56.70,56.17,55.85,56.84,
+58.25,60.31,56.53,58.32,59.00,59.09,59.07,60.21,59.74,64.01,
+61.26,59.83,62.57,61.69,61.18,61.41,62.31,62.63,64.92,60.51,
+65.37,64.40,65.90,63.31,69.79,66.00,67.65,67.07,64.91,69.89,
+69.66,67.98,70.05,67.47,70.90,69.68,69.63,70.62,71.18,70.11,
+72.09,73.25,72.43,72.81,70.41,71.89,73.15,74.27,73.21,75.01,
+72.44,74.65,79.12,76.50,79.94,75.96,77.49,77.63,77.40,78.64,
+80.70,77.17,76.24,76.33,81.23,79.39,79.19,76.43,82.41,79.75,
+81.59,77.20,77.73,79.80,82.38,81.66,83.24,83.12,82.56,82.96,
+80.14,83.28,85.96,81.03,86.70,87.73,86.02,85.76,84.19,87.35,
+84.53,84.80,89.45,86.49,86.58,88.15,91.17,86.32,87.05,88.20,
+91.14,87.75,87.20,84.78,87.95,90.65,88.95,91.38,91.60,93.20,
+90.38,84.58,88.63,91.00,94.39,90.83,92.25,90.44,92.02,89.82,
+93.55,92.03,93.26,89.77,94.48,95.38,92.90,91.94,95.70,95.34,
+93.28,94.89,96.41,91.78,97.30,93.06,99.11,99.67,96.17,96.97,
+95.28,95.46,97.64,94.95,97.01,99.20,99.81,97.73,99.93,97.57,
+99.39,100.85,104.16,100.15,101.92,97.32,101.57,100.65,103.97,97.55,
+104.85,106.24,104.89,106.23,102.54,104.19,103.80,103.81,102.72,103.28,
+102.72,104.60,104.85,107.95,102.85,109.54,104.62,102.77,103.63,105.04,
+105.87,103.50,109.09,105.32,107.00,108.11,110.35,106.28,110.42,110.33,
+115.97,110.03,115.40,107.80,109.36,107.09,106.98,110.47,110.35,110.76,
+112.43,113.22,111.55,112.92,111.23,115.25,112.99,113.86,114.32,112.02,
+115.22,113.76,109.19,112.29,110.52,114.76,118.87,118.11,113.73,115.76,
+116.86,111.55,111.71,107.94,114.60,118.24,114.65,117.15,115.41,118.26,
+25.40,26.18,26.92,27.54,28.18,29.51,30.24,33.47,32.33,32.70,
+34.68,33.62,34.86,35.12,35.90,37.30,38.35,38.52,39.65,39.89,
+39.54,41.13,42.02,42.33,42.35,42.04,43.59,44.11,45.80,47.19,
+44.92,46.15,47.16,46.92,48.75,48.09,49.56,48.73,50.71,49.23,
+50.76,52.64,53.86,52.26,52.35,52.46,54.41,55.64,53.27,54.53,
+55.60,55.62,56.62,54.53,57.16,56.57,56.83,57.42,61.02,57.44,
+58.71,61.63,62.75,59.31,61.28,60.96,63.30,62.51,65.21,62.95,
+64.35,62.21,65.09,68.22,64.82,67.49,66.44,66.32,69.64,65.23,
+68.32,67.04,70.03,68.07,69.36,69.72,70.20,71.85,69.57,71.55,
+68.83,71.66,70.10,72.99,73.96,71.87,71.41,72.64,74.07,74.25,
+74.91,74.34,73.80,71.94,73.76,76.74,81.38,81.32,73.68,76.99,
+80.05,79.94,77.64,76.34,80.05,78.76,77.33,78.86,81.00,81.23,
+81.92,79.61,80.16,80.83,80.27,82.80,85.55,82.82,84.15,86.05,
+83.45,81.57,84.09,83.45,84.06,82.80,84.25,84.39,86.63,84.69,
+84.56,87.39,86.61,84.42,86.64,90.37,86.01,89.10,88.36,89.03,
+87.35,89.90,89.85,86.94,90.08,86.15,89.18,89.60,90.05,90.38,
+93.48,93.43,92.93,90.89,92.87,94.50,91.00,94.68,95.39,94.81,
+96.87,94.88,94.25,91.85,94.67,93.93,94.67,98.48,96.67,99.56,
+97.88,99.80,98.87,95.32,96.83,95.44,99.38,97.11,97.62,102.76,
+102.41,103.47,101.34,99.77,96.33,97.51,101.16,106.00,99.89,100.78,
+104.21,100.40,106.24,99.63,102.51,104.57,100.60,102.66,103.32,106.15,
+104.48,106.67,108.82,103.33,104.19,105.69,100.26,108.15,107.39,104.20,
+104.31,104.42,105.92,110.46,110.95,109.90,106.54,106.62,106.61,105.47,
+110.56,105.34,107.18,109.33,108.84,113.77,107.74,111.34,109.00,110.64,
+105.70,107.49,108.32,112.81,107.49,111.50,115.56,113.07,114.79,116.41,
+115.92,112.43,113.97,113.88,118.70,115.41,115.69,111.77,115.77,116.17,
+118.67,116.94,118.10,112.54,116.18,118.84,117.57,116.45,118.61,114.64,
+120.03,119.76,116.09,120.94,119.77,117.28,120.48,117.49,119.16,120.68,
+121.00,125.39,119.48,120.70,118.83,120.18,118.78,124.21,117.99,118.36,
+26.08,27.22,28.03,29.20,29.45,31.04,30.92,31.79,33.79,34.17,
+33.94,37.07,35.42,37.02,38.22,38.46,39.41,40.35,41.32,40.51,
+41.24,42.63,43.49,43.55,43.70,44.57,44.51,47.79,44.64,47.75,
+49.33,50.11,49.51,47.30,50.33,50.92,49.05,50.19,49.70,53.38,
+52.07,53.97,55.07,53.59,54.18,53.95,55.74,56.65,56.21,57.59,
+56.36,59.45,57.31,59.94,58.24,59.57,61.69,59.16,62.03,62.13,
+58.24,62.43,61.59,63.12,64.38,64.50,64.04,63.84,64.87,63.79,
+66.81,65.52,66.65,68.88,66.33,66.13,67.01,68.45,67.73,69.68,
+67.58,71.33,69.13,70.61,70.99,67.60,70.46,70.68,71.42,71.76,
+73.62,72.16,71.30,74.26,75.93,76.52,76.28,78.30,74.86,76.64,
+77.55,78.36,74.99,78.17,75.81,82.30,77.04,78.79,80.12,77.37,
+79.84,80.39,80.21,79.95,83.01,86.83,78.10,83.31,82.22,83.14,
+84.94,87.93,85.28,85.06,85.35,84.82,83.27,82.82,86.61,86.40,
+88.51,88.33,86.21,88.25,88.72,89.67,85.19,88.00,88.55,92.29,
+88.35,87.17,85.88,89.95,87.27,90.14,92.99,90.72,92.48,94.52,
+93.08,93.64,92.77,90.34,92.28,91.81,94.73,95.46,92.73,92.34,
+94.05,95.33,97.93,100.22,96.91,99.33,94.31,94.79,98.36,98.38,
+97.22,97.50,98.68,102.32,96.98,98.93,102.70,102.94,101.67,100.55,
+97.25,101.53,97.92,101.03,101.72,101.06,103.81,98.61,98.63,102.96,
+97.96,101.58,102.58,106.62,105.43,105.67,105.12,99.54,101.63,106.44,
+97.41,109.43,104.63,109.29,104.70,106.37,108.24,108.09,105.46,110.46,
+109.78,111.43,112.80,109.01,108.43,107.97,109.43,112.07,110.07,110.11,
+109.03,111.60,111.16,115.59,114.17,111.57,110.74,115.49,110.79,112.33,
+111.36,115.09,115.07,117.16,115.84,114.20,113.55,115.84,112.06,115.89,
+111.83,113.22,118.63,112.42,118.25,119.23,117.66,115.64,112.35,115.14,
+119.54,116.17,117.41,119.88,119.72,116.58,117.06,122.73,120.89,121.28,
+119.95,126.63,120.05,120.09,117.07,121.78,119.16,123.17,125.00,119.24,
+121.86,119.66,121.02,124.44,124.00,124.87,124.85,116.02,123.38,125.02,
+115.96,120.72,122.61,126.21,121.01,123.59,120.52,129.82,128.69,124.44,
+27.21,27.77,28.76,29.48,29.57,32.04,31.76,33.43,34.52,35.42,
+34.32,36.42,36.04,37.21,38.35,38.38,39.99,40.41,40.61,44.50,
+40.22,42.87,43.76,42.75,45.57,44.61,46.74,46.92,47.93,48.45,
+50.31,50.32,49.81,50.24,52.49,51.87,52.85,50.94,53.62,53.19,
+54.94,54.00,56.09,56.78,56.62,55.12,58.13,58.79,59.37,57.59,
+59.43,57.39,55.72,59.52,59.56,61.06,60.59,62.49,62.36,62.21,
+62.84,66.42,64.31,64.49,64.96,65.99,65.78,65.75,67.96,68.77,
+69.82,65.88,68.16,66.61,69.31,70.25,70.84,70.75,69.47,73.49,
+69.06,70.79,73.45,72.60,75.92,74.58,74.44,73.88,74.22,75.31,
+74.94,74.18,77.26,77.78,80.17,75.98,78.93,79.02,79.28,78.35,
+81.71,79.27,77.99,78.87,78.58,81.55,79.57,79.63,83.83,82.98,
+83.11,82.22,79.59,81.17,83.04,78.98,84.54,82.45,85.32,84.34,
+85.90,85.45,86.11,86.74,86.67,85.08,89.35,85.87,90.45,89.51,
+88.98,88.07,91.85,90.27,88.86,91.43,94.45,90.72,90.53,93.72,
+89.81,91.77,94.50,91.60,92.26,91.63,91.89,90.65,97.61,90.63,
+92.51,92.08,92.54,97.68,93.82,95.32,95.86,95.43,95.13,97.57,
+100.74,97.31,97.98,99.78,96.77,96.61,97.42,100.19,101.25,102.44,
+102.42,105.39,101.23,103.38,99.43,104.23,103.43,102.49,100.42,102.05,
+103.63,103.31,101.86,106.63,104.20,104.83,105.79,103.89,102.76,112.54,
+106.69,106.36,110.37,107.17,106.41,110.61,107.16,110.23,101.74,106.72,
+109.15,111.38,110.65,107.80,112.88,113.80,109.60,113.97,111.29,109.00,
+115.09,113.13,115.88,112.61,114.25,112.07,109.31,108.13,112.66,113.37,
+113.25,114.71,115.72,115.65,114.24,112.74,117.69,114.54,111.85,118.17,
+114.72,120.16,119.17,116.12,110.39,120.42,119.28,112.73,117.22,120.50,
+114.57,118.51,113.70,119.08,114.75,118.68,123.06,114.82,121.15,119.66,
+111.94,117.35,120.85,118.40,124.54,122.77,122.83,123.54,123.43,126.64,
+122.35,125.43,122.53,119.84,125.82,127.34,122.82,124.47,125.52,125.12,
+128.40,127.51,124.03,131.00,121.31,127.06,123.28,123.28,126.20,126.45,
+128.75,128.82,129.43,126.22,131.97,128.29,127.89,128.89,126.55,129.26,
+27.20,27.90,28.93,30.87,29.66,31.58,33.81,34.41,34.42,36.18,
+35.59,37.33,38.29,38.14,39.78,39.66,40.54,43.47,42.83,41.73,
+43.80,43.88,45.18,45.78,45.76,44.76,47.39,46.90,47.42,49.64,
+50.75,48.53,50.75,52.48,52.16,51.64,54.91,53.28,54.19,54.83,
+55.14,57.13,54.68,57.04,56.75,59.30,58.58,58.52,60.80,58.07,
+60.25,62.69,61.49,62.47,61.09,61.75,63.43,62.14,64.91,65.10,
+64.84,63.98,65.84,68.00,67.87,67.29,66.70,67.90,67.32,70.36,
+68.73,70.76,70.39,66.36,69.35,72.54,71.49,70.44,72.15,71.68,
+73.47,71.68,73.39,74.29,75.10,74.76,78.48,75.43,76.61,77.53,
+80.74,78.24,76.90,76.67,79.63,81.03,79.04,81.58,80.07,81.01,
+80.41,79.40,80.17,79.83,82.48,81.30,84.32,82.27,81.99,83.25,
+87.13,83.88,83.83,84.88,84.62,85.52,87.45,85.12,85.67,87.44,
+86.08,88.14,87.83,89.63,90.07,88.76,86.70,88.16,93.10,93.36,
+92.13,90.21,89.09,90.02,90.33,93.65,93.82,93.67,97.73,93.32,
+95.18,91.32,92.96,95.67,95.76,96.77,92.89,97.58,97.63,100.16,
+95.83,100.62,97.32,98.98,99.58,99.57,100.40,97.11,101.19,103.65,
+98.22,98.89,103.26,98.87,102.22,99.44,99.12,100.01,100.89,103.74,
+100.60,104.92,103.59,106.62,102.43,105.41,105.36,103.17,106.89,104.47,
+109.12,105.01,108.66,111.80,104.92,103.47,104.34,106.92,114.75,112.17,
+108.76,110.86,110.62,106.92,106.13,108.66,109.75,112.05,107.28,108.62,
+110.62,111.14,109.35,112.07,112.33,109.53,110.88,113.60,112.85,112.64,
+114.42,114.60,113.33,118.17,116.20,111.46,117.19,115.19,117.88,113.76,
+114.36,115.86,115.21,117.54,118.48,117.24,119.25,120.57,114.33,118.45,
+120.07,122.32,119.48,123.44,115.62,115.57,119.22,118.44,118.14,120.80,
+118.13,119.97,122.97,118.46,123.51,123.17,120.12,116.83,123.41,124.59,
+126.25,125.16,124.23,122.96,124.08,126.40,121.10,125.07,128.03,120.76,
+127.30,125.41,125.97,131.03,128.41,123.65,127.75,125.63,130.19,123.15,
+131.91,127.23,127.92,126.73,126.44,125.18,126.22,130.77,133.21,122.92,
+133.13,133.33,131.30,132.97,129.15,131.45,132.16,132.66,126.10,128.76,
+26.95,28.42,29.60,30.00,31.26,32.52,33.98,33.75,36.21,35.64,
+36.86,37.82,37.70,38.52,39.63,39.95,41.71,42.63,43.09,42.62,
+44.95,45.30,46.59,46.21,48.00,46.92,46.03,46.85,50.31,48.74,
+49.47,50.13,53.38,52.87,52.50,53.77,54.37,53.72,54.19,57.53,
+55.79,59.19,55.47,55.16,58.79,58.54,59.81,61.29,61.22,60.08,
+61.29,62.02,64.90,63.34,64.21,63.32,64.04,63.71,63.90,63.34,
+67.67,66.10,67.18,68.05,66.12,68.63,69.27,70.55,71.01,67.00,
+70.71,68.69,74.48,73.44,72.68,75.70,76.38,72.66,72.42,75.49,
+72.73,75.20,79.06,73.47,74.68,76.94,81.04,77.42,78.32,79.55,
+77.12,78.76,81.18,78.40,79.85,78.96,80.34,83.27,80.19,82.29,
+82.81,80.96,82.67,81.55,82.82,84.48,80.78,83.89,85.02,87.99,
+88.33,83.94,87.86,89.87,86.72,88.49,90.05,91.58,87.59,87.71,
+91.41,88.91,89.46,89.96,90.10,89.92,89.51,96.06,92.88,92.62,
+93.55,94.50,91.18,94.61,95.08,92.88,92.89,97.88,97.46,94.59,
+97.81,94.53,95.87,94.99,97.88,103.76,97.19,99.28,96.89,98.41,
+98.63,93.09,98.51,97.30,99.20,101.12,100.32,102.43,101.33,101.00,
+104.20,104.40,103.38,100.94,103.32,107.15,98.78,105.89,102.04,102.63,
+104.13,101.75,105.60,101.72,106.33,104.64,103.06,105.90,102.65,105.54,
+106.24,102.68,108.13,106.34,113.49,105.90,110.82,112.86,111.55,109.92,
+110.73,109.25,114.28,111.79,113.18,110.31,112.98,113.66,111.22,114.78,
+112.36,112.36,113.34,121.08,115.67,113.97,111.90,115.29,114.87,112.48,
+118.43,116.72,116.32,115.13,114.64,120.53,121.53,122.28,117.77,116.50,
+119.22,124.36,114.71,118.55,118.04,119.69,118.03,122.44,121.85,116.32,
+123.89,126.05,126.56,123.78,126.17,120.97,124.81,128.42,120.81,124.80,
+121.87,126.30,125.14,120.44,119.86,123.43,120.39,122.21,126.95,125.58,
+121.88,129.32,122.62,123.47,125.98,124.33,125.93,125.70,134.75,131.66,
+131.62,128.57,129.53,132.91,128.83,129.60,128.16,126.35,130.52,131.30,
+128.50,126.53,127.50,130.48,135.70,131.65,129.91,133.76,134.64,135.39,
+131.97,132.88,131.66,131.07,133.63,132.23,135.52,132.89,134.06,130.80,
+28.47,28.90,29.25,30.58,33.18,32.74,34.23,34.12,36.39,34.42,
+37.70,38.28,40.03,38.88,40.42,42.97,42.31,42.89,44.01,43.84,
+45.20,45.48,45.81,47.89,48.47,47.44,48.62,49.80,49.12,49.83,
+50.53,51.91,51.56,52.57,54.64,55.06,56.54,56.40,55.96,56.42,
+57.26,57.57,59.71,58.58,59.18,59.57,59.74,62.02,63.10,61.80,
+62.67,61.46,65.73,63.81,63.15,66.31,62.36,67.35,66.70,64.85,
+68.38,66.19,67.06,66.71,68.19,68.53,68.80,70.25,69.85,69.75,
+73.19,75.99,71.01,73.34,70.15,76.45,71.36,75.54,76.87,75.25,
+75.60,78.44,79.41,72.39,77.57,75.77,77.84,80.52,76.65,75.45,
+78.54,84.05,78.04,78.53,82.05,83.11,84.46,83.74,84.23,85.31,
+85.64,82.45,89.24,86.51,87.71,83.61,83.71,89.10,86.82,85.76,
+87.03,88.17,88.63,89.54,87.95,94.37,91.26,87.30,93.03,87.77,
+93.18,91.76,93.06,90.87,92.81,91.85,96.47,94.13,91.96,96.24,
+90.28,92.97,92.39,96.93,97.27,92.87,99.17,101.16,95.52,100.45,
+95.76,98.45,99.94,99.40,97.44,98.27,100.03,99.89,98.78,100.46,
+105.84,99.28,105.84,103.84,102.27,102.08,100.15,99.40,103.99,108.19,
+106.24,105.16,100.38,104.71,100.83,106.96,103.13,106.84,104.60,107.59,
+110.74,105.54,105.25,106.28,109.83,110.30,107.92,105.87,108.94,107.13,
+110.35,108.41,106.31,110.64,111.69,107.22,109.59,109.27,109.12,111.50,
+111.73,113.02,112.40,109.15,113.95,112.23,114.05,114.96,111.52,116.78,
+112.60,115.71,113.96,115.39,116.71,113.01,117.19,117.07,118.76,116.25,
+118.98,120.41,116.10,118.16,119.98,118.43,118.67,120.66,119.68,118.37,
+117.38,122.07,119.42,116.95,117.57,123.77,120.02,125.46,122.69,123.15,
+126.06,125.08,119.50,125.17,122.34,123.44,124.66,125.57,120.92,122.70,
+125.52,128.27,125.20,126.11,127.94,124.61,130.21,127.69,129.17,131.11,
+134.05,136.97,125.32,130.08,131.84,127.72,125.31,131.69,132.86,130.93,
+134.93,129.32,126.93,132.78,132.06,130.63,131.05,130.28,129.22,133.78,
+128.81,134.49,131.68,130.86,133.66,126.24,136.45,132.35,131.33,134.56,
+138.48,137.02,140.43,141.21,136.96,130.01,136.28,139.11,142.58,141.76,
+26.93,28.91,30.31,30.65,30.94,32.73,33.77,35.79,35.70,37.00,
+38.07,37.58,41.23,39.06,42.98,40.33,41.58,43.44,45.25,44.77,
+45.66,46.74,44.67,46.52,47.80,49.81,48.04,49.30,52.62,52.75,
+53.05,53.29,51.61,53.28,54.94,52.82,55.36,56.04,55.31,57.71,
+58.11,58.48,57.74,61.48,59.61,61.92,60.74,62.84,60.18,62.86,
+63.51,63.17,65.88,63.41,64.82,65.84,66.57,65.91,64.56,64.09,
+69.80,69.81,67.89,68.70,70.78,69.60,70.91,69.72,71.78,71.25,
+74.54,73.11,74.54,72.90,74.89,71.99,76.93,75.96,74.86,76.69,
+76.28,76.79,77.61,77.83,80.47,75.82,80.28,76.11,79.84,77.85,
+80.12,78.86,82.02,79.64,82.10,82.88,83.74,84.32,82.26,84.42,
+85.34,82.37,85.71,86.60,85.48,85.08,86.82,87.92,85.14,85.04,
+86.45,89.85,86.94,93.29,89.71,89.22,90.17,92.19,95.46,89.39,
+89.78,91.76,91.32,95.34,92.56,93.33,95.59,95.65,92.24,96.36,
+93.13,96.43,96.54,95.48,94.36,96.52,98.04,100.46,98.39,98.34,
+101.20,103.62,100.36,97.70,102.80,100.53,100.80,96.41,104.74,97.19,
+99.84,102.65,102.62,100.54,102.62,106.95,98.34,100.98,102.86,104.16,
+101.08,109.86,105.86,99.28,100.91,99.64,105.81,110.38,104.53,107.83,
+107.84,110.89,110.97,110.25,108.03,113.43,113.05,109.97,107.77,104.90,
+111.23,112.25,108.12,110.30,115.90,105.97,114.08,107.55,111.48,112.87,
+109.84,112.60,110.66,116.84,115.23,116.50,113.62,114.46,115.49,117.99,
+113.72,112.27,113.43,117.39,120.24,118.46,117.37,116.32,120.08,114.32,
+118.83,121.38,121.95,124.85,119.49,122.54,117.92,120.66,120.39,118.82,
+121.45,126.41,121.58,121.68,120.93,122.65,119.10,125.29,129.47,131.91,
+122.56,124.34,126.19,127.79,132.78,125.65,123.79,124.41,124.63,129.84,
+124.77,134.52,128.35,126.41,125.35,130.13,126.22,131.53,128.51,132.69,
+126.24,132.26,129.21,132.78,126.08,129.83,131.87,129.78,137.61,131.39,
+130.26,131.76,128.70,133.94,132.91,131.94,134.95,136.67,133.05,133.69,
+132.69,129.18,132.92,133.49,130.25,136.04,133.99,138.79,135.13,140.84,
+132.85,138.23,132.56,135.46,135.22,142.65,140.74,137.53,140.21,138.81,
+27.96,29.29,30.88,30.14,32.37,33.14,33.75,36.46,36.19,36.84,
+38.10,38.95,38.94,39.65,40.02,43.84,41.73,41.96,43.93,46.27,
+46.81,46.27,45.71,48.47,48.52,48.61,51.45,51.64,51.84,51.84,
+53.45,54.25,54.40,53.78,55.54,56.10,56.32,56.55,57.78,56.88,
+56.14,59.10,60.12,59.93,60.53,58.72,62.03,61.58,63.48,65.28,
+63.39,65.79,61.59,65.78,66.56,66.01,66.79,68.33,67.10,67.00,
+67.26,69.98,68.66,66.95,70.23,69.08,70.84,72.94,72.64,72.95,
+73.09,72.41,72.37,74.92,75.55,74.39,73.43,74.11,76.95,77.53,
+79.30,75.76,79.43,76.91,78.06,78.48,77.78,81.69,83.51,79.09,
+82.85,85.40,86.80,78.88,84.21,83.53,84.19,83.33,86.63,86.96,
+82.85,87.26,84.84,85.29,86.70,82.72,86.40,87.19,91.80,85.48,
+89.47,90.16,91.60,86.75,92.71,92.07,89.42,93.46,89.41,89.72,
+89.56,93.65,95.22,94.91,92.76,97.96,95.54,93.14,95.57,92.75,
+95.54,95.18,98.83,97.07,95.99,95.69,95.19,98.54,96.79,96.90,
+101.16,97.71,99.12,99.93,102.20,102.87,98.21,104.09,101.21,102.66,
+101.97,101.62,102.94,102.11,105.04,102.24,101.98,105.12,105.25,105.52,
+108.19,103.69,104.21,104.89,111.08,105.26,106.26,107.30,107.34,104.82,
+108.15,109.77,111.65,108.38,110.30,111.32,111.88,109.72,113.40,112.52,
+106.14,113.77,108.52,113.60,111.31,119.44,112.12,116.47,114.10,115.57,
+116.97,112.45,110.50,116.56,117.68,107.03,112.40,114.02,116.99,120.61,
+112.10,119.14,116.21,121.63,121.58,119.92,117.25,120.88,118.23,116.97,
+121.97,118.59,118.93,119.90,124.76,124.18,118.59,119.09,121.18,121.17,
+120.54,124.78,122.95,124.10,120.93,119.70,121.87,123.38,122.48,125.54,
+123.20,129.38,122.54,123.44,123.95,127.56,127.67,126.36,128.55,131.25,
+128.47,126.08,130.93,125.40,128.86,131.94,129.64,133.99,130.64,129.81,
+129.53,128.36,131.11,134.39,131.91,137.50,133.19,128.81,131.33,134.63,
+125.86,130.19,132.14,134.17,130.31,132.31,133.73,136.22,133.00,131.13,
+129.78,133.77,136.93,137.55,132.69,134.95,137.24,134.42,140.25,137.69,
+134.17,139.31,138.90,139.41,136.57,140.26,142.96,142.76,138.65,142.34,
+18.42,20.37,19.94,19.74,19.29,21.46,20.75,20.45,21.56,21.62,
+22.23,23.39,23.26,23.21,23.60,24.22,24.40,25.24,25.59,24.38,
+27.06,26.43,27.08,26.44,27.64,26.86,27.92,27.98,28.91,27.29,
+28.28,27.96,28.65,29.37,30.00,30.24,29.61,32.24,29.40,30.91,
+31.84,31.79,31.52,32.09,31.42,32.37,33.54,33.22,32.85,34.56,
+32.32,32.72,35.18,36.24,34.15,33.50,34.94,35.67,35.00,34.68,
+36.46,36.77,38.08,38.39,39.51,37.22,36.94,36.62,36.72,38.23,
+38.83,37.79,37.72,39.58,38.48,39.59,38.60,38.96,39.57,40.73,
+38.64,40.26,41.00,40.14,40.84,39.93,42.58,41.30,42.99,44.45,
+42.10,44.13,42.78,42.98,43.38,42.99,43.96,42.27,44.41,43.54,
+43.98,44.24,45.31,44.32,44.67,45.01,44.66,45.46,43.81,44.36,
+45.76,46.38,48.25,45.84,46.25,47.76,45.78,46.71,47.15,47.02,
+48.37,48.96,46.43,47.42,48.09,50.16,47.23,50.14,46.57,48.97,
+49.17,50.47,49.80,49.25,49.40,51.47,50.26,51.86,48.72,52.93,
+50.25,51.81,51.37,51.40,52.50,52.60,49.83,52.39,52.28,51.46,
+53.14,52.22,51.16,52.17,55.25,53.09,54.93,53.66,53.41,54.74,
+52.97,54.21,54.35,53.88,55.65,55.38,55.15,55.55,54.78,58.04,
+54.47,54.45,55.64,54.31,56.36,59.11,55.87,55.60,57.24,54.89,
+57.18,56.27,56.37,57.32,59.57,55.52,56.89,58.53,58.33,57.48,
+57.93,57.33,57.21,60.98,58.66,62.01,63.68,60.68,60.74,61.00,
+59.43,59.90,60.32,61.22,60.25,60.58,59.11,62.37,60.33,62.34,
+60.55,61.91,61.86,61.32,59.57,61.42,63.26,61.24,61.44,63.40,
+59.55,64.43,65.97,62.62,62.44,65.48,61.28,65.34,63.99,62.77,
+63.72,65.25,63.38,64.16,62.62,62.82,67.38,61.95,65.65,64.07,
+63.37,66.15,64.35,66.36,67.68,63.90,65.69,64.55,65.63,68.47,
+66.61,67.73,66.90,66.25,69.76,69.04,66.82,69.53,69.00,66.37,
+67.17,67.53,69.31,67.10,67.17,69.57,66.82,70.06,68.27,68.72,
+70.33,69.61,70.74,69.07,67.99,70.51,67.81,72.96,69.66,69.96,
+69.98,70.85,68.28,72.03,73.64,70.73,71.51,72.84,73.40,69.07,
+19.52,20.40,20.36,20.38,22.09,22.67,22.78,22.60,22.97,23.16,
+22.77,25.01,25.22,25.23,27.67,26.74,26.10,26.68,27.64,27.17,
+27.98,26.46,29.76,30.45,29.50,30.49,30.03,29.89,31.30,31.41,
+31.25,31.78,31.29,31.83,32.68,35.16,34.25,33.41,34.54,34.59,
+35.21,34.45,35.97,35.38,35.57,34.56,36.76,36.13,36.48,36.42,
+37.29,38.76,38.62,38.58,37.97,38.35,39.81,39.81,39.92,39.26,
+40.39,40.87,41.15,41.43,41.16,41.53,42.88,41.72,41.27,42.17,
+43.08,41.37,43.84,43.97,43.95,42.42,44.71,43.31,43.63,44.66,
+45.63,43.26,44.66,45.25,44.38,45.41,46.10,46.00,46.73,48.17,
+46.36,47.05,47.63,47.16,49.75,50.84,47.36,50.19,48.97,48.58,
+48.82,48.64,48.47,49.92,50.33,49.47,49.67,50.29,49.85,53.23,
+50.44,52.39,51.90,51.20,51.86,54.08,52.07,53.92,52.09,55.01,
+51.67,54.87,53.96,53.61,53.84,52.58,52.57,52.63,56.60,54.60,
+54.89,55.39,54.58,57.33,54.53,55.40,55.65,56.66,57.59,57.51,
+56.51,55.04,55.74,58.02,57.88,57.15,60.08,57.74,56.94,59.14,
+58.54,58.77,57.40,59.98,57.84,60.42,58.78,57.71,58.61,60.92,
+59.75,58.59,59.82,61.60,59.36,61.06,58.28,63.27,61.47,61.59,
+63.98,61.36,64.85,63.59,62.43,64.48,66.11,62.35,61.37,61.94,
+62.62,61.79,62.54,63.97,63.13,66.89,65.90,62.48,61.70,65.22,
+66.18,65.09,65.50,64.88,64.70,62.89,64.18,66.91,66.13,66.23,
+67.70,66.74,68.82,66.63,66.01,66.92,69.23,70.77,65.57,67.48,
+67.98,68.11,69.69,68.47,67.69,70.40,69.71,67.54,71.62,67.31,
+69.80,68.59,70.36,70.29,70.71,69.05,69.58,72.05,69.15,71.37,
+68.29,72.31,71.94,69.14,70.28,70.58,73.15,70.93,73.83,72.96,
+72.49,71.02,73.10,71.54,71.56,72.30,72.37,74.00,78.49,75.46,
+74.46,75.42,74.19,74.52,73.38,76.65,77.03,75.23,77.07,74.93,
+77.07,75.40,74.64,75.20,76.29,73.94,75.13,75.95,73.94,74.79,
+75.93,74.33,77.33,75.92,81.26,77.58,78.91,77.10,76.64,75.23,
+76.82,77.31,80.42,78.32,80.35,74.38,80.10,77.69,75.88,80.88,
+20.37,20.86,21.84,23.07,21.78,24.25,24.24,23.95,25.57,25.77,
+25.80,25.76,26.38,28.69,28.15,29.65,29.38,29.38,30.27,29.49,
+30.52,30.87,31.01,31.51,32.04,31.53,32.18,32.00,34.33,34.93,
+34.37,34.70,33.99,37.27,35.35,35.19,36.19,35.66,36.72,36.14,
+38.37,38.94,38.66,39.51,38.08,38.74,39.82,38.61,39.15,40.08,
+40.25,41.71,40.43,42.51,42.43,42.61,42.51,42.27,42.99,42.66,
+42.07,43.00,44.48,44.09,45.70,44.47,45.40,44.09,45.10,45.18,
+47.32,47.13,47.83,45.97,45.99,47.08,46.96,47.01,50.93,47.60,
+48.24,48.90,48.54,50.83,49.72,49.87,48.48,50.21,48.96,50.78,
+53.40,53.40,52.76,50.13,53.42,51.90,50.79,52.90,52.22,52.92,
+54.51,53.31,54.30,54.46,54.20,55.66,55.10,54.71,54.39,54.75,
+56.71,57.81,55.95,56.74,57.85,58.70,55.64,57.17,58.67,55.95,
+57.24,56.82,57.64,58.54,60.53,58.31,60.74,60.28,59.33,58.56,
+60.84,60.45,60.17,61.78,59.05,63.26,60.81,59.54,60.90,59.24,
+60.41,62.96,62.15,65.15,62.27,62.07,62.19,64.88,64.84,61.26,
+63.73,63.40,64.63,63.11,66.43,63.54,65.84,65.82,64.20,63.44,
+66.79,67.13,65.98,64.35,68.94,68.35,68.27,67.44,65.61,67.10,
+67.05,66.19,68.12,68.94,67.01,68.02,70.53,68.50,65.97,69.48,
+68.07,69.58,67.68,68.94,71.65,72.54,68.04,71.71,71.62,73.18,
+71.29,75.88,72.67,71.72,68.14,72.89,72.08,72.59,72.73,74.37,
+71.71,74.39,74.81,73.95,74.34,71.56,71.53,72.30,76.07,74.20,
+74.59,75.28,77.73,74.88,76.45,76.05,73.94,75.81,70.97,76.69,
+73.78,75.88,77.89,76.06,75.50,76.66,73.77,78.46,74.70,77.58,
+79.15,79.02,74.68,76.47,77.37,80.08,74.65,75.50,78.36,73.91,
+82.82,77.87,75.20,79.07,79.10,80.59,80.14,79.72,81.16,81.40,
+78.10,79.13,85.74,82.80,80.55,81.26,81.47,82.62,82.85,85.14,
+83.97,85.35,83.17,78.97,82.50,81.49,82.46,86.19,81.58,83.18,
+84.30,81.53,81.96,82.87,83.54,84.78,86.78,84.64,86.02,84.11,
+85.24,85.56,87.23,87.07,86.85,87.10,85.40,88.99,86.98,90.76,
+21.62,22.32,22.93,25.85,24.09,25.27,25.57,26.76,25.78,26.03,
+27.51,28.73,28.50,30.08,29.24,29.96,30.29,31.03,31.69,32.82,
+32.97,32.31,33.92,34.08,34.14,35.28,33.88,34.36,36.80,34.70,
+36.78,36.59,36.95,37.26,38.21,39.09,39.26,37.04,38.20,39.05,
+39.96,40.55,42.04,40.77,40.46,40.67,42.96,41.90,44.34,44.16,
+45.32,43.71,45.20,46.61,45.83,45.62,46.26,46.53,46.47,47.00,
+46.60,47.41,46.48,48.41,50.69,49.63,48.07,48.61,50.77,48.47,
+49.92,48.44,49.00,51.46,51.21,52.30,51.65,50.54,53.67,50.83,
+54.19,53.00,53.29,53.67,53.65,55.62,53.33,55.28,55.01,55.26,
+55.32,53.37,57.73,54.96,55.98,55.41,57.37,58.51,56.79,57.58,
+56.85,58.36,57.32,58.31,59.73,60.20,60.48,57.51,60.58,58.52,
+61.85,59.97,60.09,62.52,62.64,61.32,64.84,61.38,62.14,62.67,
+63.02,64.23,64.18,63.76,61.98,63.93,66.56,62.91,64.48,66.09,
+63.04,65.14,65.09,66.05,66.01,69.44,65.35,66.75,67.74,67.00,
+65.73,64.04,66.76,68.12,68.05,68.85,68.38,68.44,69.53,69.47,
+69.27,69.62,69.70,68.83,68.73,70.91,68.94,69.60,70.00,71.56,
+71.72,70.27,70.55,71.36,70.33,77.67,72.14,69.91,74.81,71.13,
+75.45,74.52,75.35,74.76,76.91,72.59,74.82,76.75,74.78,76.79,
+75.70,77.63,73.79,77.31,75.47,75.42,75.78,76.78,72.55,75.59,
+79.68,76.89,76.10,75.94,77.70,75.69,75.69,78.15,78.87,79.71,
+79.37,81.18,76.91,78.91,81.43,79.34,80.65,81.10,79.51,80.12,
+79.97,82.34,77.59,83.18,80.12,81.41,82.99,81.98,82.78,86.19,
+84.33,81.97,83.78,82.04,83.57,84.24,83.29,83.65,85.33,84.67,
+85.40,83.10,86.04,84.77,86.51,83.05,86.73,89.29,82.87,85.37,
+85.81,85.21,87.92,84.88,87.40,81.74,89.08,89.56,89.44,86.95,
+86.04,82.54,91.14,90.08,89.79,89.25,91.05,89.66,91.99,90.97,
+91.61,91.21,86.48,89.39,86.34,90.87,92.33,88.91,88.60,90.69,
+89.01,89.87,89.83,87.34,90.39,92.52,89.01,90.28,90.71,94.30,
+91.42,91.37,88.06,92.94,94.13,90.74,94.05,93.09,94.65,94.57,
+23.47,21.82,24.72,25.06,25.62,27.45,27.45,27.64,28.17,27.87,
+29.11,29.02,30.98,32.53,32.15,30.71,33.13,32.27,32.12,33.92,
+34.69,34.40,36.60,36.41,37.27,37.03,37.33,37.95,37.26,38.75,
+39.59,41.29,38.93,41.28,39.15,39.40,41.41,41.65,42.64,43.45,
+42.81,43.44,42.11,42.63,45.06,45.40,45.58,45.72,46.21,46.96,
+45.18,45.94,49.26,48.25,47.05,47.76,47.58,49.40,51.97,48.40,
+49.49,50.94,50.61,51.24,51.05,52.03,53.55,50.33,53.02,53.51,
+54.23,53.42,54.97,54.69,56.76,56.25,56.83,56.84,56.05,54.78,
+57.02,57.84,57.35,58.42,57.75,58.58,56.65,57.43,57.96,58.28,
+60.22,59.94,59.92,61.03,61.42,61.73,60.55,59.28,61.83,59.21,
+61.75,62.09,63.30,62.87,66.24,66.51,65.17,65.95,63.25,60.51,
+65.45,65.36,64.90,64.07,66.25,66.36,64.94,67.27,66.54,69.34,
+67.92,67.67,69.77,67.39,67.24,68.21,70.12,69.32,70.67,67.90,
+70.66,69.09,74.10,71.05,67.37,69.46,70.52,67.30,69.04,73.12,
+72.67,73.36,69.85,74.38,71.31,73.03,73.79,72.05,71.58,76.14,
+77.03,75.31,74.84,77.12,76.08,74.57,74.01,78.93,74.33,78.18,
+74.39,78.86,76.90,74.99,72.63,74.98,79.87,79.42,76.36,75.96,
+76.56,78.85,75.73,81.10,79.76,76.09,83.09,79.25,81.03,81.16,
+82.04,79.45,80.06,81.75,81.91,80.77,81.89,85.64,81.91,82.54,
+82.80,83.08,84.33,82.98,83.88,81.47,82.33,80.52,85.43,84.04,
+85.92,84.68,87.05,84.99,86.89,83.38,85.01,85.82,84.85,87.28,
+87.30,90.21,85.72,85.35,88.50,89.43,89.51,87.10,85.59,91.14,
+88.68,86.37,88.15,90.14,91.11,85.89,90.59,85.96,87.92,87.68,
+92.03,94.21,89.21,88.36,88.63,89.07,89.82,96.44,91.69,93.12,
+96.42,89.77,92.93,97.00,93.37,95.54,92.76,89.93,91.80,97.72,
+97.09,95.77,99.18,93.02,97.47,93.72,95.89,97.48,96.59,97.22,
+94.07,94.05,96.97,93.23,97.60,97.43,99.08,93.00,98.89,96.01,
+94.88,103.05,95.92,97.86,97.11,97.70,98.90,95.09,104.54,98.15,
+107.25,100.46,102.88,99.21,99.79,104.84,97.65,94.98,102.42,97.76,
+23.92,24.30,25.39,26.66,28.08,27.35,28.49,28.97,29.71,31.48,
+30.29,31.83,31.80,32.10,32.85,34.96,32.35,36.20,35.06,34.03,
+36.50,36.96,37.51,38.19,38.43,38.45,40.97,41.51,41.36,39.38,
+40.97,42.43,40.35,42.89,43.59,45.38,44.05,44.19,44.41,45.09,
+46.16,46.32,47.39,46.57,46.83,47.78,46.81,48.63,51.03,47.58,
+49.38,50.87,51.28,52.39,51.51,50.39,53.43,52.23,52.74,53.21,
+53.28,53.94,55.55,54.16,54.96,55.08,54.38,56.57,57.02,56.58,
+54.46,59.14,59.00,55.95,58.83,58.41,59.28,59.75,58.47,62.12,
+60.22,60.56,58.57,58.26,61.11,59.73,60.89,60.39,62.38,62.56,
+62.03,63.67,65.90,63.66,64.20,65.02,64.45,63.38,64.54,66.28,
+67.76,66.78,67.44,65.02,66.54,68.22,66.29,66.46,69.93,69.81,
+68.54,67.72,67.37,68.91,70.04,69.22,70.71,69.14,69.35,72.00,
+71.16,70.07,71.68,71.76,71.74,71.58,74.59,75.58,70.87,73.11,
+75.34,75.34,74.10,74.74,77.26,75.50,76.83,74.89,78.19,76.93,
+77.49,76.76,77.81,76.11,74.90,80.67,76.37,79.59,77.59,79.02,
+79.82,78.91,78.72,79.22,77.69,78.48,76.62,82.09,82.03,81.79,
+81.34,86.07,79.36,83.96,80.63,78.97,79.44,80.74,78.88,84.10,
+84.42,83.10,83.46,85.77,83.84,84.96,87.94,83.36,83.50,86.54,
+88.83,86.31,85.66,87.84,89.86,88.16,89.41,90.31,90.49,83.43,
+83.67,86.38,91.23,91.20,88.70,91.92,90.20,90.64,91.28,88.77,
+86.79,91.93,89.59,91.63,92.17,88.83,89.10,94.08,91.28,94.97,
+90.27,98.10,93.54,93.28,91.68,93.07,93.38,94.34,96.33,95.53,
+93.73,96.08,95.73,92.32,93.92,94.46,96.81,94.35,94.40,97.07,
+96.04,97.09,94.54,95.86,96.36,95.38,96.31,102.32,100.28,98.13,
+93.87,96.60,99.65,101.14,101.10,100.47,103.09,96.22,98.79,98.17,
+99.22,101.73,99.05,98.32,99.33,101.05,102.05,105.15,98.26,103.50,
+102.53,100.42,104.78,105.04,103.15,100.71,107.22,106.03,99.93,104.36,
+103.76,104.91,101.99,101.81,105.10,103.93,101.41,105.82,106.60,108.99,
+106.81,107.02,104.02,102.93,103.80,104.63,104.66,104.94,108.03,110.19,
+24.29,25.14,26.56,26.51,28.95,27.97,30.71,29.74,31.16,32.17,
+32.93,32.34,32.30,34.24,36.67,35.00,37.50,36.35,37.90,38.24,
+38.12,38.96,39.26,39.65,41.02,39.60,42.51,42.69,42.62,40.62,
+42.41,44.10,44.23,44.89,47.37,44.57,47.02,47.95,46.59,46.34,
+47.16,48.41,48.15,48.76,49.00,48.57,49.36,49.51,51.37,52.44,
+52.61,52.89,55.46,52.34,54.94,54.69,55.46,55.87,55.40,56.89,
+57.42,56.89,59.64,56.01,59.79,57.75,56.25,60.22,58.35,59.12,
+60.89,59.29,59.97,61.92,61.17,61.45,60.76,64.23,63.52,64.70,
+62.84,62.22,61.90,64.05,64.06,64.04,65.40,66.95,64.78,63.57,
+65.09,63.50,67.95,71.69,67.76,67.54,71.66,67.51,68.20,69.19,
+69.29,70.07,68.03,71.14,71.02,71.33,69.09,69.49,74.85,72.38,
+73.49,73.89,75.90,75.86,74.89,73.30,76.23,75.87,72.71,72.98,
+76.15,73.94,74.65,75.77,75.79,77.90,75.60,79.15,76.19,77.11,
+76.27,77.44,77.81,78.79,78.44,79.62,80.70,81.62,81.80,80.60,
+85.28,79.57,81.10,79.31,82.74,80.99,84.96,81.62,81.76,81.86,
+84.07,83.48,86.46,87.85,84.34,85.15,86.70,86.94,87.50,87.01,
+84.33,87.13,89.33,83.83,87.34,85.53,85.65,87.78,83.73,85.74,
+88.17,87.03,84.95,89.74,88.18,88.11,89.42,91.21,91.06,88.57,
+90.77,91.04,92.90,88.81,92.14,92.05,92.03,94.63,90.19,95.12,
+91.55,94.28,95.87,97.40,94.88,91.45,95.80,90.02,95.79,94.49,
+93.05,94.61,96.50,94.24,96.89,94.84,95.75,100.59,96.27,96.90,
+100.14,95.14,96.55,97.87,94.93,94.63,99.90,100.08,98.92,98.56,
+103.12,99.20,105.84,100.69,101.32,100.86,103.10,102.29,100.58,101.24,
+100.15,102.02,103.89,104.11,103.15,100.22,103.16,105.77,101.15,104.47,
+106.52,105.81,101.43,103.75,105.62,106.66,109.05,106.48,108.88,103.46,
+105.84,105.34,105.80,106.55,104.75,107.76,104.87,110.19,108.38,109.78,
+110.99,107.08,104.49,106.70,103.23,109.48,109.06,109.77,111.28,111.21,
+110.81,111.77,114.46,107.66,113.13,110.25,111.94,116.14,112.90,112.15,
+107.69,108.63,112.29,109.97,107.88,112.88,111.32,115.76,114.68,114.40,
+26.22,26.28,27.99,28.67,28.99,30.54,31.09,32.03,33.48,33.20,
+33.41,34.68,35.57,35.76,36.34,37.84,38.66,37.78,38.79,38.46,
+40.72,39.96,40.77,41.60,40.72,42.38,42.03,44.41,43.79,45.28,
+45.82,46.76,46.94,46.78,46.88,48.15,48.19,46.68,50.14,49.62,
+52.19,50.74,50.88,52.29,52.23,50.58,54.69,54.23,54.33,54.11,
+52.22,55.41,54.65,55.43,53.47,56.98,57.13,56.64,57.73,58.08,
+57.78,59.57,58.59,62.66,61.27,58.36,63.67,60.29,62.52,63.07,
+61.24,63.97,65.00,66.41,63.63,63.58,65.43,68.02,66.65,67.55,
+65.96,66.10,66.86,65.86,67.46,65.16,68.53,66.45,69.32,68.44,
+72.86,67.98,73.02,71.02,68.69,70.09,70.52,72.89,71.43,71.02,
+75.96,74.39,75.00,71.75,71.27,75.30,73.94,73.26,78.33,77.45,
+75.79,74.72,77.50,76.73,80.26,76.00,75.73,77.75,78.43,79.48,
+80.30,79.34,77.22,80.26,80.33,79.75,77.19,78.97,84.88,84.43,
+81.43,77.02,80.22,84.10,81.98,82.11,82.84,84.13,83.88,81.63,
+81.43,87.03,85.12,87.87,84.42,83.79,82.79,89.24,86.47,91.17,
+90.76,90.57,87.85,85.42,88.67,89.86,90.46,92.69,92.86,91.61,
+91.70,91.83,91.37,92.03,95.34,94.38,94.28,93.34,95.79,92.37,
+88.08,93.52,91.44,88.66,92.24,92.83,92.42,90.26,95.00,96.06,
+96.07,96.59,97.32,97.38,96.89,95.39,97.08,95.40,95.82,94.95,
+94.19,96.12,97.13,98.22,95.79,97.02,103.68,101.05,97.80,99.97,
+98.63,98.58,101.63,97.09,102.12,99.24,97.04,103.58,103.43,102.17,
+103.60,100.28,98.53,100.48,105.69,102.21,101.20,103.48,102.83,104.45,
+105.13,104.90,102.26,105.11,105.60,100.42,100.29,104.43,105.12,106.14,
+105.58,107.06,106.98,113.73,108.75,106.39,108.45,107.29,103.39,109.78,
+105.42,106.59,108.41,112.82,110.28,106.13,108.52,110.59,106.90,105.10,
+107.66,114.01,109.69,111.13,112.86,113.84,112.19,113.04,111.78,111.52,
+110.69,114.52,113.65,110.47,109.55,114.36,115.56,118.13,113.88,111.58,
+114.73,114.79,113.48,115.49,113.31,115.33,115.51,116.79,112.85,116.87,
+114.88,111.75,114.42,114.37,117.54,118.78,119.48,117.94,120.62,121.82,
+26.80,27.37,28.51,29.43,29.78,31.18,32.12,32.83,32.45,34.23,
+34.51,35.36,35.56,35.69,38.20,37.92,38.94,40.85,39.80,41.92,
+41.25,42.67,41.92,43.32,46.71,43.86,43.70,45.67,45.89,45.45,
+48.35,46.48,47.21,49.52,49.46,49.91,51.72,51.39,49.62,53.30,
+54.19,52.55,53.08,53.69,53.91,53.50,54.22,58.77,58.26,56.59,
+56.86,57.44,56.18,59.05,61.87,59.40,59.78,60.12,58.12,59.25,
+64.16,60.36,61.19,61.04,63.43,63.77,63.97,63.72,62.47,63.77,
+63.74,65.25,65.13,67.73,66.46,68.34,68.31,67.17,67.81,70.01,
+71.92,68.94,67.58,71.49,68.77,72.34,70.46,71.04,70.36,71.94,
+73.28,72.66,70.27,73.59,74.87,73.71,76.91,74.85,76.94,75.80,
+74.41,73.90,77.91,77.47,79.11,77.07,77.75,74.55,79.02,77.61,
+80.04,77.49,76.93,79.44,80.96,80.11,80.98,80.25,83.57,84.57,
+82.02,83.41,81.65,84.49,84.09,82.48,83.20,81.68,85.80,86.62,
+84.01,87.83,84.74,82.53,84.32,86.60,87.58,88.24,90.36,89.64,
+88.04,89.99,86.06,88.26,89.85,90.83,91.80,90.72,91.47,88.30,
+91.39,88.35,93.25,88.32,92.03,89.82,94.22,92.39,91.56,93.82,
+96.08,97.36,97.20,95.67,94.61,98.46,95.81,99.02,95.03,96.90,
+98.75,102.13,96.52,99.78,98.22,100.62,98.68,94.75,98.37,99.00,
+101.20,98.53,100.99,96.40,98.97,98.78,99.50,101.06,102.71,101.07,
+101.67,101.42,100.03,102.22,103.22,104.34,103.03,102.89,105.21,103.45,
+102.87,108.49,102.66,107.24,103.96,105.07,104.76,104.25,104.60,108.38,
+106.18,106.68,105.63,109.96,108.76,103.92,109.80,103.58,108.98,109.77,
+107.81,108.30,110.08,106.89,108.04,111.55,108.65,114.22,112.66,113.89,
+111.80,113.30,115.95,110.10,111.95,116.38,111.92,110.04,112.11,114.78,
+112.19,112.87,106.91,116.59,114.99,115.69,110.86,111.97,112.84,115.30,
+115.09,116.12,116.02,117.04,118.68,117.84,115.11,118.57,116.97,119.40,
+113.38,115.96,116.09,118.85,123.44,115.34,125.45,120.27,120.96,120.58,
+120.83,123.22,119.37,121.50,117.24,116.28,122.16,123.63,122.63,124.54,
+121.69,121.46,122.73,124.35,123.14,126.23,122.59,125.04,124.36,123.41,
+27.71,29.01,28.53,29.81,31.29,30.94,32.72,33.23,35.18,35.67,
+36.03,36.24,36.03,38.26,40.92,40.78,40.17,41.16,41.88,42.63,
+43.31,42.63,43.69,43.77,46.34,46.75,46.47,47.02,45.50,49.01,
+50.85,47.92,51.06,50.21,49.16,52.44,52.84,50.54,53.96,53.15,
+53.76,54.43,56.22,54.55,56.33,54.62,57.13,55.90,57.36,57.56,
+56.55,55.38,58.76,58.86,61.25,58.80,62.06,60.22,61.85,63.93,
+64.43,64.23,61.64,65.52,65.56,64.27,64.91,66.54,67.55,70.50,
+67.45,67.00,67.61,66.69,70.25,65.99,69.54,70.76,69.64,72.34,
+69.06,72.04,71.72,73.66,73.01,75.93,72.07,71.04,72.12,73.65,
+76.45,74.65,74.95,74.50,77.46,77.40,77.19,76.04,76.67,77.58,
+77.85,80.26,78.18,81.89,80.38,81.20,82.62,84.12,85.19,79.22,
+82.99,84.71,80.16,82.76,85.78,82.76,83.90,82.62,79.94,87.56,
+85.24,89.92,85.24,88.40,84.12,88.76,86.71,84.44,89.44,87.63,
+85.51,91.63,88.46,90.04,91.44,92.50,91.64,90.75,89.69,87.62,
+89.76,93.29,92.09,88.98,94.33,91.43,94.14,95.06,96.89,94.44,
+96.19,92.62,97.48,95.64,97.20,96.13,97.76,95.10,98.82,97.49,
+97.42,98.83,98.28,95.84,96.69,98.04,98.08,99.95,102.10,101.41,
+102.63,102.81,99.30,102.29,99.19,100.73,106.91,103.29,100.66,96.95,
+104.07,104.34,104.41,101.86,103.20,105.64,105.42,103.43,106.94,102.37,
+103.37,106.30,106.13,105.92,105.95,106.17,105.53,106.31,107.76,107.51,
+108.92,107.54,109.24,105.06,104.50,106.77,108.79,112.90,111.91,106.13,
+109.92,109.70,108.52,110.39,111.47,113.50,114.74,111.90,112.58,114.54,
+113.92,113.74,115.24,111.94,115.10,112.26,115.17,115.04,111.94,118.45,
+118.60,114.68,117.59,112.00,118.21,114.21,113.67,117.97,114.25,112.36,
+117.39,111.84,117.01,119.18,120.23,120.11,125.73,118.62,119.87,114.63,
+121.48,121.23,122.68,118.44,121.04,120.58,120.91,121.13,123.33,120.31,
+125.17,120.72,124.16,122.12,121.66,121.13,124.59,120.62,123.73,125.50,
+122.18,125.97,126.79,124.37,124.84,123.68,122.89,123.56,126.86,127.27,
+126.97,122.91,129.08,126.58,122.30,133.12,128.87,127.53,125.65,130.93,
+28.07,28.92,30.82,30.55,32.07,31.46,34.82,34.49,34.56,35.90,
+37.10,38.01,37.94,39.15,39.93,41.10,41.22,42.27,42.36,43.56,
+43.53,45.05,42.77,45.79,46.43,48.06,48.43,50.02,48.43,47.42,
+49.73,50.79,52.25,51.84,52.11,53.28,54.08,52.11,52.90,55.13,
+55.47,57.12,57.06,58.14,58.95,59.12,57.79,59.04,59.78,63.03,
+62.04,62.63,63.32,63.39,61.68,61.19,64.61,63.26,64.46,65.62,
+61.66,67.95,67.14,69.76,69.86,66.40,66.43,68.45,65.19,69.76,
+67.96,69.90,70.36,72.62,70.01,75.26,72.59,75.24,74.12,73.54,
+72.92,75.12,74.54,75.27,76.07,75.10,77.26,75.59,79.06,77.98,
+77.40,73.40,77.92,77.56,80.87,79.70,78.05,78.36,81.62,78.96,
+78.38,82.90,79.82,79.35,82.24,81.54,82.32,84.47,88.25,83.97,
+84.69,83.18,84.11,86.85,89.73,83.97,88.49,89.89,87.02,86.32,
+87.49,87.38,89.53,89.25,86.63,90.17,88.25,91.40,87.31,90.83,
+89.22,91.61,92.85,96.37,91.70,91.49,91.21,96.78,93.83,92.03,
+95.11,99.09,94.34,94.47,93.30,98.40,92.92,98.51,97.21,97.71,
+92.34,94.22,95.78,97.96,100.34,99.91,95.60,97.51,101.40,102.10,
+97.45,99.70,102.60,103.57,100.88,102.82,100.41,103.16,103.90,103.57,
+101.28,105.93,102.72,106.85,105.13,105.88,105.70,105.80,106.83,101.87,
+102.06,104.49,108.65,102.39,106.11,108.03,109.30,107.53,107.88,109.42,
+107.65,108.11,109.91,106.20,112.54,106.84,114.18,111.65,113.21,109.59,
+112.89,107.88,109.77,113.03,111.87,114.38,112.69,111.94,117.16,110.64,
+119.83,115.97,114.28,120.05,114.26,112.45,116.38,108.09,114.36,111.97,
+118.22,116.81,116.65,121.57,120.85,119.67,116.03,112.90,119.70,116.20,
+119.91,120.02,123.41,122.31,122.29,117.40,122.27,127.13,114.97,115.27,
+122.58,120.89,124.03,124.38,123.67,120.47,120.78,125.23,120.28,125.58,
+126.10,122.33,120.41,120.95,120.73,124.03,126.98,125.42,122.52,129.08,
+119.59,126.19,125.40,130.99,130.50,126.49,128.15,123.56,129.82,126.54,
+131.10,126.13,130.57,127.62,128.40,127.93,130.31,127.09,129.86,126.14,
+127.41,129.86,133.19,128.93,129.87,132.24,135.24,127.42,136.87,133.21,
+28.28,30.67,30.12,31.34,31.96,33.43,35.71,35.33,36.56,37.01,
+38.46,38.85,39.71,41.27,44.15,42.06,42.58,43.57,44.54,44.05,
+46.48,44.96,46.11,44.96,50.14,49.48,49.37,49.71,50.42,49.16,
+50.58,51.63,51.66,53.00,56.20,56.35,57.84,53.60,56.00,57.90,
+57.66,58.65,58.42,58.05,57.36,60.49,59.98,61.92,63.29,62.50,
+62.72,60.47,63.28,62.51,64.28,65.67,65.15,69.42,65.20,67.59,
+67.96,65.86,68.90,67.51,67.81,66.98,70.71,70.65,70.78,70.32,
+72.39,73.57,71.77,72.65,74.23,72.40,73.20,76.70,76.68,74.41,
+76.76,77.04,78.13,79.66,76.21,76.73,78.34,79.28,78.29,81.62,
+79.64,81.90,82.42,80.93,82.14,80.11,81.04,82.89,79.58,80.53,
+82.55,84.49,83.68,86.65,84.93,84.87,85.86,86.95,85.75,87.88,
+88.60,87.02,87.93,90.10,86.30,89.37,88.97,88.33,87.14,85.55,
+93.99,90.64,86.13,90.84,89.37,89.86,94.68,90.28,89.78,94.86,
+98.38,90.90,95.37,94.43,93.98,98.68,97.84,92.27,97.44,95.63,
+99.06,98.76,99.97,95.48,93.22,101.70,96.99,98.09,103.26,98.26,
+101.57,100.88,99.62,99.39,100.65,103.88,105.23,100.18,102.45,102.02,
+96.48,102.20,100.46,108.63,100.65,107.76,102.10,109.27,104.75,104.71,
+101.70,109.58,107.91,103.56,109.85,105.75,107.04,106.65,107.38,109.74,
+108.12,107.33,108.34,108.25,111.56,113.20,112.20,112.19,112.50,108.97,
+110.37,113.33,112.59,111.55,117.44,113.96,110.90,112.41,114.48,115.47,
+113.86,113.70,113.51,113.41,114.38,111.96,120.05,116.80,117.57,112.75,
+121.84,117.06,114.40,112.81,112.82,117.31,116.28,113.15,122.44,115.48,
+119.05,114.08,117.91,114.95,122.27,123.19,120.20,120.58,124.16,122.92,
+123.22,120.31,124.64,124.27,117.85,124.03,120.08,122.08,119.10,129.15,
+127.88,124.55,126.06,128.06,129.31,127.35,128.48,130.54,124.77,129.79,
+126.47,129.38,131.28,122.37,127.16,126.13,128.90,127.26,130.66,126.69,
+131.92,131.73,133.70,133.51,134.39,139.49,131.47,131.32,131.82,132.52,
+126.20,132.28,131.42,135.59,130.96,136.13,130.20,134.28,136.96,133.17,
+138.69,142.80,126.42,136.27,135.43,136.28,140.25,130.68,135.17,134.17,
+29.25,30.51,32.56,34.07,33.92,33.79,35.74,36.59,37.59,38.38,
+40.55,39.85,39.99,42.34,41.33,44.04,44.13,44.17,44.67,45.22,
+46.73,47.55,48.35,46.91,49.02,49.77,50.96,50.84,50.91,50.67,
+53.30,53.94,54.31,53.88,55.56,58.17,55.81,52.69,55.33,55.27,
+56.16,59.39,58.02,58.04,61.10,61.52,60.69,63.18,62.74,63.69,
+62.46,62.88,66.31,65.32,65.28,67.52,68.83,67.66,66.60,69.27,
+69.51,70.98,66.85,70.59,69.46,72.11,71.67,75.80,73.04,72.61,
+71.75,71.25,74.80,73.82,71.31,74.03,74.58,75.57,74.69,77.57,
+75.52,77.10,79.26,79.47,78.50,83.47,79.05,82.11,79.35,80.03,
+83.89,83.35,80.29,81.86,85.17,82.16,83.32,84.82,87.76,83.82,
+83.99,84.23,83.60,86.04,83.91,88.46,86.70,87.25,85.85,86.74,
+90.07,89.36,90.27,89.71,90.62,92.47,89.56,93.50,91.48,94.24,
+90.22,88.30,92.17,95.73,96.50,91.68,95.50,94.07,91.00,95.37,
+95.36,97.66,96.74,97.90,98.19,95.97,96.20,95.88,98.50,93.60,
+100.71,100.58,97.54,103.04,102.35,101.80,102.83,104.06,101.00,102.10,
+102.21,101.60,101.15,104.32,103.31,104.41,103.59,113.50,104.85,105.51,
+101.17,109.72,108.18,102.88,110.18,108.53,110.47,109.16,108.48,104.23,
+108.84,107.82,108.02,105.30,110.74,107.14,110.10,109.17,112.10,110.90,
+109.11,110.69,117.37,106.90,110.62,115.28,115.49,115.51,115.08,111.29,
+112.58,115.57,114.82,119.25,114.01,116.03,113.90,117.10,115.08,117.11,
+117.09,116.07,121.73,117.37,114.31,114.68,115.57,121.05,116.26,124.38,
+123.85,120.14,117.45,115.59,117.80,113.67,120.64,120.54,118.12,119.72,
+121.77,123.93,120.23,118.75,127.88,123.35,126.13,122.14,125.52,123.95,
+120.69,125.41,122.63,126.95,126.00,130.29,131.62,131.40,126.61,129.77,
+127.51,122.81,134.14,134.29,130.51,129.54,130.52,124.47,136.22,130.02,
+126.47,126.44,131.76,135.27,128.51,126.78,132.47,131.46,129.50,131.76,
+135.13,133.34,131.91,138.06,133.93,131.95,129.41,132.10,134.47,131.36,
+132.42,136.18,135.57,130.04,140.48,142.44,128.18,135.62,134.60,140.07,
+131.96,144.00,138.48,141.60,135.31,132.64,136.52,140.58,135.47,141.09,
+29.29,30.98,32.14,31.67,34.30,35.20,37.49,37.71,37.17,38.23,
+38.87,38.84,39.75,42.57,41.76,43.65,44.15,43.68,45.61,46.59,
+46.85,46.66,49.12,48.57,49.00,52.23,50.99,53.35,53.59,54.04,
+53.15,53.38,54.16,56.07,54.50,56.90,56.52,58.82,56.85,59.89,
+59.30,59.63,58.74,60.75,60.91,60.50,60.68,64.03,65.34,63.68,
+64.86,65.61,65.10,67.69,65.38,67.83,68.40,68.19,70.14,68.07,
+70.72,68.19,70.59,71.51,72.96,70.29,70.62,71.61,73.28,71.27,
+75.23,74.18,74.16,74.53,77.43,79.54,79.49,76.03,77.70,76.41,
+80.33,77.13,79.75,78.03,78.22,77.74,82.19,78.71,82.88,83.00,
+81.49,79.44,84.68,81.17,80.95,87.81,87.57,83.54,85.44,84.66,
+86.30,86.94,85.02,90.77,87.98,90.33,91.14,87.35,87.75,88.90,
+94.63,93.05,93.20,93.62,93.89,93.80,87.88,95.32,93.62,94.40,
+93.68,94.46,92.60,95.07,96.60,97.08,100.00,97.46,96.35,98.40,
+100.29,98.94,93.98,99.99,98.30,96.87,98.92,101.62,102.54,100.37,
+99.55,102.31,102.98,99.80,103.59,102.15,104.12,99.87,103.55,103.65,
+107.03,104.71,98.21,106.52,106.02,103.04,105.70,107.08,108.29,108.08,
+107.34,103.74,106.62,104.45,109.92,108.41,110.87,110.27,107.80,110.22,
+110.60,111.79,107.98,110.91,113.25,114.55,113.96,114.19,113.82,113.83,
+110.48,114.11,118.09,112.19,114.48,116.33,111.58,122.41,115.55,113.98,
+117.52,116.53,116.05,115.29,116.41,122.19,117.48,114.81,122.37,115.54,
+119.24,120.55,115.49,120.48,117.27,120.86,118.78,119.28,120.16,122.31,
+120.79,119.19,127.94,123.40,123.58,121.76,133.43,124.80,122.81,127.70,
+130.90,127.13,126.66,123.56,123.20,128.00,127.67,124.70,126.25,126.27,
+123.10,127.56,128.15,123.51,132.69,125.85,129.63,131.16,133.45,129.52,
+128.07,128.86,124.07,134.90,127.61,132.98,135.23,134.70,132.96,129.61,
+132.34,131.23,131.68,134.55,135.21,131.13,137.09,130.10,128.86,140.95,
+137.82,136.12,133.71,140.37,138.89,131.76,135.31,138.34,134.98,140.51,
+136.92,134.88,145.42,134.98,140.28,131.38,136.69,143.09,137.27,138.81,
+136.91,136.96,141.40,141.77,143.82,141.43,143.29,141.57,147.71,142.83,
+29.70,30.63,31.39,32.44,33.39,34.43,35.79,37.16,38.54,38.93,
+40.87,40.49,40.88,41.78,43.74,43.10,45.62,44.37,46.90,45.88,
+48.69,48.67,48.78,48.92,51.92,51.82,51.28,52.62,50.82,54.77,
+54.65,53.71,55.61,57.51,56.08,57.76,57.64,58.08,58.86,58.65,
+60.55,61.55,62.64,61.36,62.54,63.66,62.36,67.60,63.26,68.55,
+65.69,65.93,65.70,66.48,67.85,68.46,67.61,70.43,68.81,69.58,
+71.11,70.98,70.81,77.01,72.88,70.38,74.15,75.60,75.31,73.34,
+77.13,76.25,74.57,75.14,78.45,76.45,77.75,78.05,78.03,79.58,
+77.76,79.27,80.35,82.62,84.69,81.66,78.54,86.15,83.55,82.63,
+84.59,85.30,84.61,88.04,83.11,84.90,87.18,88.28,83.87,87.39,
+87.41,88.00,84.77,87.59,90.06,89.73,87.55,90.90,93.86,93.72,
+89.66,94.20,91.07,95.66,94.37,94.43,90.25,92.65,96.79,96.93,
+95.26,96.80,97.35,96.18,97.65,95.97,100.30,97.78,97.51,97.04,
+101.24,102.66,99.52,100.86,101.96,97.88,98.86,100.24,102.42,101.02,
+100.13,102.80,99.12,99.17,98.47,100.77,103.84,104.35,106.44,105.23,
+107.76,103.36,103.49,105.12,105.73,110.05,110.04,107.13,110.45,107.12,
+108.94,107.96,111.14,108.99,108.07,105.53,115.58,113.03,112.27,110.07,
+108.54,108.80,112.88,111.77,115.67,111.03,112.16,113.70,112.89,114.78,
+110.03,113.36,117.23,119.80,118.29,118.75,114.38,122.33,115.58,116.89,
+116.12,117.83,118.77,114.42,119.19,124.89,123.77,117.88,119.82,116.62,
+120.39,120.78,123.31,121.68,129.28,123.60,117.48,122.24,122.55,118.97,
+122.17,121.47,124.85,122.85,129.60,128.91,125.71,124.14,123.71,124.39,
+127.65,131.59,125.71,123.86,123.15,126.32,128.34,131.22,124.54,137.72,
+133.25,125.73,129.93,134.15,131.71,133.20,130.19,127.66,132.50,129.34,
+134.25,135.93,133.35,130.10,140.81,130.14,131.84,133.64,133.45,133.24,
+130.68,135.92,131.94,137.59,133.82,136.81,132.54,140.41,138.04,139.79,
+133.96,137.97,139.57,137.35,133.34,140.84,135.85,138.68,140.76,139.13,
+131.74,142.96,136.02,139.54,141.91,139.18,137.46,138.54,142.51,141.78,
+138.50,140.93,144.79,138.75,142.85,139.59,141.64,148.37,145.61,137.31,
+19.23,18.71,19.33,19.78,19.94,19.76,20.24,21.42,21.21,22.06,
+23.45,22.17,22.53,23.19,22.03,23.00,23.81,24.91,24.78,23.67,
+25.71,25.11,25.56,26.30,26.69,26.30,27.06,27.01,27.91,27.36,
+26.39,27.65,26.78,28.56,27.41,29.42,29.11,28.85,28.57,31.17,
+29.62,31.33,30.54,31.06,29.19,31.45,29.96,30.99,32.53,32.12,
+31.21,32.75,33.20,32.12,32.26,33.29,33.01,32.55,34.91,34.56,
+35.25,33.71,32.78,34.56,35.21,33.69,36.23,34.70,36.63,34.35,
+34.54,36.01,35.94,36.16,36.40,36.98,37.49,38.42,37.27,37.25,
+38.10,38.26,38.15,38.89,38.37,37.72,37.41,38.82,37.97,37.60,
+39.41,38.73,40.18,40.13,39.24,39.95,39.63,40.32,41.68,41.42,
+39.66,39.92,40.72,40.74,40.91,39.52,42.88,42.11,41.16,42.54,
+42.92,41.91,40.75,44.10,43.06,43.92,42.05,42.97,43.26,40.71,
+43.12,42.99,45.66,43.95,43.96,44.67,46.40,44.75,45.81,46.43,
+47.22,44.85,46.07,45.52,47.41,48.46,48.92,47.20,46.15,46.60,
+46.94,46.84,48.58,46.79,48.40,47.04,48.37,47.35,47.48,48.00,
+48.25,48.88,48.18,51.18,49.13,48.97,48.80,48.62,49.93,49.80,
+48.41,49.65,48.80,50.39,50.59,48.17,51.92,52.21,51.35,48.43,
+49.97,51.85,52.09,53.33,52.45,50.81,52.91,54.15,50.84,49.15,
+51.17,51.43,53.70,52.72,52.74,54.63,53.04,55.64,54.50,54.03,
+54.06,54.60,53.57,54.40,52.94,56.70,53.80,55.03,56.37,54.48,
+55.87,53.73,57.03,54.46,53.36,55.14,55.98,55.94,55.45,56.67,
+54.18,58.03,53.28,57.96,55.67,55.01,58.30,55.30,57.73,57.34,
+57.61,58.79,58.16,57.50,56.88,57.66,57.94,57.15,59.51,59.71,
+57.58,58.95,59.21,60.60,57.51,58.52,58.74,58.09,58.15,56.11,
+61.27,57.45,58.08,60.62,60.40,59.59,61.01,63.45,60.87,60.20,
+61.33,61.40,62.12,60.26,61.45,60.36,61.38,61.29,62.23,60.04,
+62.30,59.67,61.72,63.97,64.87,62.44,61.29,60.48,62.88,63.10,
+61.45,64.22,63.34,62.82,61.94,63.35,60.93,60.81,63.62,65.49,
+62.67,65.11,64.57,64.17,61.61,62.20,65.55,62.97,62.73,65.17,
+20.57,20.58,21.34,21.19,21.57,21.64,22.70,21.66,22.91,23.47,
+23.55,23.95,24.44,23.81,25.20,25.04,25.88,25.24,26.83,26.74,
+26.45,28.19,28.42,28.17,27.35,28.37,27.98,29.22,29.52,30.97,
+30.75,29.38,29.08,31.27,30.30,30.14,31.79,32.36,32.15,32.69,
+31.92,33.37,32.55,34.12,33.30,35.31,33.79,33.13,34.12,34.31,
+34.40,35.21,37.40,38.27,36.98,35.93,36.50,37.30,37.26,37.55,
+36.69,36.82,38.01,38.90,38.70,37.39,38.56,40.50,38.49,39.57,
+39.30,38.92,40.14,42.14,39.84,40.54,40.81,39.78,40.98,41.24,
+41.17,40.22,41.20,43.96,42.54,42.22,41.47,42.62,44.04,43.37,
+44.59,43.28,43.76,43.65,46.01,44.98,44.79,44.81,44.41,44.90,
+46.98,46.16,45.48,44.93,46.47,47.61,46.17,46.69,45.69,46.74,
+46.49,48.43,48.85,46.81,48.41,47.94,46.91,47.59,51.35,48.98,
+47.09,47.06,48.78,49.46,51.74,51.45,53.55,51.19,50.07,51.11,
+52.03,49.24,51.16,50.61,50.74,51.29,52.68,50.59,52.20,52.13,
+53.34,51.63,52.87,51.67,52.96,53.25,54.09,53.67,56.03,54.29,
+54.43,55.34,53.63,51.19,54.06,53.53,54.23,56.41,55.26,55.90,
+55.27,56.34,55.13,58.04,58.14,57.32,55.89,58.21,57.71,56.99,
+56.26,56.46,57.40,56.97,57.47,58.41,57.79,60.08,57.78,57.32,
+57.75,58.48,58.93,59.64,59.03,60.34,58.29,61.21,60.99,58.72,
+62.06,61.79,59.17,61.33,61.43,63.65,63.20,58.85,60.00,60.70,
+59.87,59.99,62.08,61.99,61.75,62.03,64.34,60.92,65.17,64.67,
+60.62,62.53,62.91,61.68,63.96,60.83,62.00,62.82,62.42,64.32,
+63.98,65.33,62.70,65.96,66.61,62.25,65.25,64.37,62.57,63.86,
+64.88,65.76,63.47,63.51,66.28,65.59,66.45,66.21,65.62,68.42,
+64.10,66.75,69.50,68.62,65.39,66.47,68.58,66.03,66.78,66.95,
+67.66,68.89,68.86,69.35,71.29,68.97,67.19,67.96,70.41,71.00,
+67.54,70.36,71.26,66.68,70.14,66.91,69.91,70.89,67.84,69.54,
+70.60,72.90,70.47,69.78,71.59,68.74,72.03,68.30,72.36,70.59,
+72.31,71.84,74.16,72.43,74.01,72.63,71.84,73.79,73.61,75.52,
+20.44,20.99,20.93,22.63,21.76,23.33,22.88,24.79,24.62,25.84,
+24.33,25.45,26.12,26.95,25.82,27.81,29.20,26.89,28.13,29.39,
+27.79,28.61,30.18,30.16,29.55,32.60,30.11,31.94,31.62,31.16,
+31.88,33.83,33.55,33.12,34.43,34.71,33.91,34.07,34.00,32.99,
+36.27,37.17,35.54,35.78,35.44,36.32,36.99,36.73,39.38,37.29,
+37.71,37.76,40.26,37.69,40.50,39.54,40.42,39.99,41.67,40.72,
+40.40,39.19,39.62,42.14,40.13,43.13,44.28,41.33,42.66,44.09,
+44.21,42.59,43.73,45.31,43.90,45.95,45.85,45.45,44.75,46.41,
+46.49,46.18,46.11,47.34,47.34,48.07,47.64,48.36,50.75,46.03,
+47.34,49.56,48.26,49.63,48.77,50.19,46.14,50.04,49.96,48.09,
+49.82,50.04,49.54,47.81,50.81,51.41,51.37,52.33,50.28,49.88,
+52.42,53.17,52.56,53.20,54.83,51.79,52.30,54.58,56.41,54.91,
+52.02,54.96,55.06,54.40,56.99,54.94,55.38,55.24,56.74,55.61,
+54.73,55.82,56.73,55.68,53.84,56.95,58.02,57.87,53.77,57.66,
+60.19,58.93,58.77,58.62,60.70,55.68,57.59,58.71,58.32,59.46,
+59.28,58.88,57.94,59.18,58.97,62.98,61.97,60.79,61.81,60.70,
+60.56,60.31,60.58,58.16,62.97,61.25,59.90,60.62,64.48,61.07,
+62.13,64.11,62.24,60.93,63.40,62.56,64.44,61.93,64.60,65.36,
+64.56,64.52,67.17,63.60,68.13,67.04,65.33,64.38,66.27,68.08,
+62.10,66.90,68.01,66.00,64.69,66.73,67.97,69.93,65.12,66.68,
+67.31,71.75,68.33,67.63,67.51,68.33,69.85,69.52,68.78,70.94,
+72.28,70.43,72.49,70.48,70.87,71.85,69.95,70.88,72.91,72.17,
+69.62,70.47,70.05,69.57,68.32,69.18,72.46,72.66,73.67,72.08,
+72.60,72.10,74.40,73.41,71.68,72.97,72.31,74.73,73.71,71.99,
+75.04,75.19,74.41,73.24,71.27,76.35,71.83,74.24,79.01,75.70,
+77.76,73.62,72.72,73.25,73.18,77.07,77.04,77.51,75.87,80.10,
+75.53,74.77,76.22,81.35,79.00,75.33,77.65,78.23,76.38,80.91,
+76.69,79.23,79.77,78.23,76.88,79.73,78.33,77.78,81.73,76.92,
+78.24,78.87,82.25,77.90,82.91,78.59,76.11,81.30,79.56,83.22,
+22.75,23.51,24.48,24.81,23.33,24.76,25.27,25.99,26.18,26.61,
+28.82,27.92,28.16,27.85,28.06,30.73,30.64,29.91,29.93,30.64,
+30.16,32.55,32.22,34.24,33.14,32.90,33.86,33.86,34.61,36.29,
+35.19,35.21,36.20,35.83,37.61,37.46,37.39,37.07,37.89,38.30,
+37.99,38.99,38.80,40.15,41.38,39.27,40.25,39.79,40.02,41.86,
+42.52,41.91,41.21,43.11,43.03,43.36,44.74,43.52,44.02,44.38,
+43.70,45.60,45.15,45.05,46.09,45.62,45.77,45.29,47.91,47.13,
+45.03,47.02,48.48,50.06,46.67,48.99,49.53,50.42,48.55,50.56,
+50.60,49.56,50.17,51.18,52.15,51.35,49.77,50.95,52.64,49.05,
+49.26,52.25,53.32,51.99,52.78,57.53,51.73,52.04,54.27,54.13,
+54.62,55.16,56.20,54.05,55.58,56.67,55.47,56.18,58.32,58.41,
+58.26,54.98,57.38,57.23,58.38,56.68,56.71,58.52,57.45,59.34,
+59.00,58.45,57.69,56.61,60.13,60.78,59.80,61.93,58.65,62.69,
+61.47,58.28,60.10,61.11,62.68,60.94,61.89,62.20,63.62,63.93,
+58.79,64.51,61.91,60.16,64.98,65.05,64.04,64.65,65.65,64.23,
+64.81,64.99,66.93,67.94,67.29,64.13,64.20,64.01,65.62,66.40,
+64.21,67.51,65.76,67.99,67.87,67.14,69.66,68.51,65.09,68.32,
+68.88,67.94,69.23,71.27,68.84,67.43,68.92,73.27,68.53,67.76,
+71.82,69.22,70.93,68.81,72.92,71.10,70.50,73.54,71.84,71.03,
+73.66,72.14,73.51,72.15,71.54,73.91,74.46,74.99,75.32,73.09,
+71.82,74.83,75.87,74.22,72.94,74.92,73.47,75.42,76.17,78.41,
+75.37,73.79,74.44,75.45,79.82,78.45,76.58,75.48,78.40,77.58,
+75.68,75.93,74.59,78.71,75.29,79.05,78.63,78.31,78.12,78.75,
+78.36,79.25,80.28,78.18,79.05,78.59,78.87,78.07,80.99,79.94,
+79.92,80.78,82.14,81.10,78.99,84.54,81.37,81.30,84.55,83.33,
+83.02,79.76,79.88,83.52,83.41,83.40,83.54,83.84,85.40,85.22,
+82.17,80.68,80.53,83.53,88.25,85.48,84.86,84.64,83.00,86.29,
+87.11,84.94,80.73,86.40,84.62,86.58,87.09,86.02,85.56,86.49,
+86.85,85.65,87.71,85.97,84.85,86.47,83.71,83.79,88.78,89.99,
+22.64,23.73,24.10,24.85,25.98,25.49,27.25,26.29,26.57,28.42,
+29.59,28.73,29.87,30.17,30.52,30.97,30.56,32.12,31.07,32.66,
+32.23,34.12,35.34,35.08,33.22,35.94,37.55,35.68,36.64,38.45,
+36.78,37.94,38.24,39.01,40.68,38.24,40.35,40.90,41.83,40.82,
+39.39,41.03,42.46,43.05,42.66,43.53,43.80,45.00,45.36,44.61,
+43.84,44.75,45.75,46.27,46.42,45.05,47.37,48.66,46.26,47.92,
+48.62,46.35,49.07,47.94,47.85,49.47,51.47,48.53,50.18,52.56,
+50.47,52.23,50.10,52.73,52.93,51.78,51.19,53.31,52.42,53.88,
+53.29,54.27,55.94,51.37,56.09,54.13,56.87,52.70,56.54,54.43,
+56.98,54.80,57.78,57.82,56.58,54.95,59.11,58.56,57.36,59.92,
+58.77,55.84,56.81,59.31,60.11,57.84,59.05,61.38,58.71,60.91,
+63.11,60.83,61.06,61.72,61.66,61.61,61.96,62.36,61.27,61.81,
+62.58,63.29,65.38,63.67,64.03,64.19,66.68,65.80,66.64,63.94,
+66.66,62.44,65.53,66.50,66.18,65.81,66.65,68.96,67.33,65.13,
+66.89,70.16,67.87,69.59,70.09,68.78,69.63,71.16,68.99,74.83,
+67.46,69.26,67.05,70.95,72.82,68.06,72.09,70.13,71.81,68.92,
+70.11,70.85,71.70,72.40,73.41,68.95,71.90,71.45,75.81,73.98,
+72.11,72.30,72.01,73.90,74.78,76.98,73.41,72.88,78.24,77.32,
+77.32,80.32,77.35,75.32,78.95,74.27,76.68,79.13,79.49,76.53,
+77.98,81.75,80.30,78.16,78.29,77.64,77.73,81.88,77.32,82.12,
+80.81,79.49,79.66,78.84,79.95,79.49,78.42,80.56,81.30,80.45,
+81.54,78.25,84.11,82.63,81.09,81.17,82.27,84.26,83.66,82.31,
+82.60,82.90,81.40,83.38,82.47,82.27,89.86,81.68,87.28,87.37,
+85.05,85.05,83.98,85.58,83.12,84.94,85.74,86.47,85.22,88.63,
+86.67,85.31,85.87,86.19,88.49,85.58,88.93,89.48,93.44,89.16,
+86.18,88.96,87.96,90.97,88.48,90.16,90.05,89.86,91.05,88.65,
+93.07,92.27,90.37,87.33,89.21,94.15,88.23,88.65,94.61,89.06,
+87.64,91.44,95.92,92.05,92.38,89.92,90.81,90.39,94.30,89.47,
+95.64,91.85,93.93,95.18,90.33,94.59,91.25,96.64,96.63,91.13,
+24.03,23.43,25.66,26.86,26.70,29.46,27.23,28.31,28.98,29.89,
+30.64,32.19,29.87,32.78,31.59,32.83,32.38,31.97,36.90,34.79,
+35.27,34.06,36.21,37.59,37.26,38.29,38.78,39.11,39.50,39.30,
+39.08,39.68,40.24,40.14,42.02,40.50,42.52,41.95,42.27,43.55,
+43.60,44.77,45.31,47.01,44.96,46.34,46.59,46.81,46.80,47.19,
+47.20,47.11,48.09,49.30,49.97,47.66,49.02,49.83,51.17,51.80,
+49.04,53.48,52.21,52.10,52.31,53.34,52.85,52.97,52.57,54.10,
+54.94,53.81,54.24,55.95,55.56,57.39,56.54,57.52,57.13,57.07,
+58.72,56.07,59.51,59.07,58.78,59.34,56.63,58.31,59.08,58.93,
+60.81,60.59,59.73,58.55,60.69,61.50,61.04,64.65,61.36,62.12,
+62.30,64.70,63.62,62.81,63.76,63.16,65.63,61.10,63.39,66.87,
+65.70,61.50,66.80,66.48,63.52,67.37,66.90,67.57,66.25,68.25,
+68.66,67.38,69.35,68.40,67.87,70.08,68.14,70.18,69.05,71.62,
+69.70,69.00,70.13,68.62,69.56,71.19,70.94,69.81,71.03,72.66,
+69.88,72.51,71.22,73.20,68.51,76.44,72.97,76.46,74.01,76.78,
+78.45,74.49,76.81,74.00,76.42,77.77,73.76,78.59,78.07,76.68,
+76.54,74.31,77.68,78.82,79.22,79.07,80.43,78.86,78.75,79.01,
+81.63,81.69,81.58,81.20,78.83,77.15,80.24,78.26,80.73,82.85,
+80.94,81.07,81.36,83.27,77.71,79.21,85.29,84.35,83.53,82.93,
+86.92,86.32,81.06,84.49,82.88,84.11,86.23,86.03,87.43,82.79,
+84.60,85.76,87.36,83.32,85.58,84.88,87.55,86.54,90.42,87.44,
+88.07,92.49,85.23,89.90,86.67,91.48,90.07,87.88,87.03,92.08,
+90.10,86.48,90.81,85.78,91.49,89.53,88.16,89.75,87.91,89.30,
+92.96,93.13,93.27,91.08,90.92,94.08,90.35,93.42,86.01,91.77,
+91.75,96.09,94.38,92.35,95.83,91.57,95.21,93.53,94.12,93.83,
+94.84,93.10,97.14,96.85,94.40,96.01,93.61,94.31,96.21,98.20,
+98.80,99.09,100.50,94.80,98.54,99.71,97.94,98.15,96.07,97.00,
+101.77,107.76,103.40,97.85,98.02,98.42,103.14,105.38,101.76,102.64,
+101.70,104.17,98.21,98.70,102.27,103.21,99.36,102.98,100.58,100.36,
+26.51,25.14,26.85,25.84,28.69,28.49,29.69,29.53,31.71,31.70,
+32.29,32.77,32.66,32.87,32.55,34.75,34.74,35.56,36.89,36.76,
+38.83,36.52,39.81,39.62,38.64,39.13,39.91,40.07,41.05,41.59,
+40.92,43.26,43.22,43.39,44.58,43.60,43.79,45.95,45.36,46.42,
+44.73,46.30,47.91,47.41,46.73,49.06,48.30,47.93,51.19,50.59,
+52.08,50.62,54.17,52.02,53.71,53.87,54.52,52.33,52.31,55.69,
+53.79,54.95,56.07,55.43,55.89,54.42,55.85,57.89,57.57,56.14,
+56.79,56.87,54.77,58.87,58.74,58.94,58.55,60.72,60.25,61.41,
+63.03,62.50,59.34,62.39,63.27,62.14,61.09,61.31,63.81,64.62,
+63.67,63.03,64.42,65.73,63.08,62.07,63.07,65.80,65.08,65.00,
+66.01,65.80,66.11,69.59,65.81,69.65,69.20,67.60,69.75,70.85,
+69.67,70.95,67.80,66.36,69.99,70.51,73.05,73.22,72.40,70.48,
+71.71,74.06,71.30,75.28,73.64,74.46,77.04,76.31,73.25,73.63,
+73.10,75.21,74.53,74.79,79.60,78.41,77.03,74.74,75.20,78.47,
+77.34,76.54,77.12,80.93,77.81,80.67,78.78,80.15,77.00,80.67,
+79.94,78.97,80.56,84.35,82.80,81.53,82.76,84.27,82.59,80.26,
+82.82,84.07,81.68,82.04,82.40,85.30,84.06,82.86,79.79,83.41,
+84.43,82.58,85.21,86.82,86.58,85.48,83.81,87.82,82.99,86.62,
+86.99,84.37,85.73,87.46,88.16,86.05,92.92,86.98,87.60,88.02,
+84.41,85.00,92.81,82.61,88.39,89.29,89.56,89.32,93.99,92.61,
+92.94,90.48,90.20,91.40,95.48,90.48,92.45,94.25,94.47,94.79,
+93.97,90.76,92.50,94.33,92.77,95.18,93.29,92.34,97.37,94.16,
+92.85,93.48,93.67,94.09,94.71,100.92,94.03,98.37,91.21,93.61,
+97.53,98.37,97.24,97.93,95.00,96.98,97.15,96.66,97.73,96.20,
+99.01,100.17,99.30,101.80,99.11,99.13,98.36,95.30,99.78,100.09,
+101.57,99.93,99.82,102.25,103.09,96.10,101.86,99.34,98.00,101.37,
+99.58,103.63,100.58,103.46,104.35,100.32,103.96,105.59,101.95,103.99,
+105.06,103.91,105.49,104.85,106.02,101.99,110.36,106.02,106.68,101.44,
+105.23,106.18,104.02,102.96,104.54,112.49,108.02,102.09,104.11,106.21,
+27.26,26.61,27.31,28.23,30.98,29.93,30.03,32.29,31.69,32.29,
+33.28,33.42,35.44,32.76,35.90,36.65,36.66,36.98,36.89,40.07,
+40.42,39.54,38.68,41.41,42.28,42.46,43.43,43.19,42.58,44.26,
+42.81,43.62,45.42,44.08,44.01,47.18,47.46,46.57,47.06,48.62,
+48.56,48.77,50.02,50.75,52.31,51.85,52.70,51.59,51.60,53.69,
+52.71,52.61,55.59,55.11,53.68,52.46,57.48,55.23,56.74,55.77,
+56.65,56.96,57.37,56.90,57.43,59.48,58.45,58.43,59.15,63.01,
+60.07,59.08,60.77,61.20,59.53,61.87,60.59,64.81,64.73,64.19,
+64.48,63.60,65.45,65.77,63.89,63.89,61.95,65.94,66.09,66.34,
+68.37,67.20,69.58,68.72,72.08,67.75,72.53,70.75,69.97,69.62,
+70.67,69.65,73.03,71.65,72.68,72.06,71.85,72.65,74.32,73.28,
+74.65,75.41,73.55,73.10,74.77,75.80,74.15,74.33,74.18,77.89,
+74.97,76.02,75.91,77.80,73.79,75.96,76.82,75.28,76.47,77.36,
+79.95,77.06,81.03,78.72,79.06,79.41,82.82,80.92,81.23,78.12,
+81.52,80.16,84.08,83.78,81.13,81.78,82.18,84.14,83.32,84.30,
+83.32,82.76,84.25,83.44,82.26,81.30,83.73,85.40,81.73,83.04,
+86.56,87.60,86.87,90.22,85.46,91.16,88.89,89.61,86.04,87.93,
+88.95,86.65,91.88,92.79,91.65,91.87,91.78,85.29,86.67,88.82,
+89.17,89.30,93.17,92.26,91.49,92.74,94.01,91.26,92.13,96.34,
+94.35,94.03,92.09,95.69,98.89,96.60,95.50,90.46,96.30,99.49,
+97.67,97.69,96.71,96.20,98.72,93.02,95.31,95.97,93.03,101.35,
+95.19,101.48,100.11,98.69,97.05,99.68,100.24,103.01,99.91,100.58,
+102.36,100.41,103.57,99.41,97.70,99.30,97.23,101.88,102.49,101.99,
+101.93,97.60,100.04,104.45,101.85,98.07,103.40,103.33,101.34,103.49,
+103.43,107.44,103.70,102.26,105.34,110.58,104.25,106.16,106.36,107.05,
+107.62,108.32,105.04,108.81,104.64,106.57,103.11,110.61,105.87,107.90,
+110.99,107.18,109.11,106.78,108.74,113.25,110.52,112.68,108.99,109.07,
+108.19,109.20,109.31,115.16,113.05,111.33,111.79,111.77,115.85,112.35,
+112.79,113.04,113.49,112.52,111.07,111.36,114.28,113.54,112.75,112.81,
+26.97,27.61,29.14,29.27,29.59,30.68,32.10,33.09,33.20,34.79,
+34.31,36.61,35.99,37.13,35.94,35.91,37.63,39.02,40.27,40.97,
+40.10,41.16,43.56,42.60,41.83,44.79,43.68,45.51,44.80,46.45,
+45.26,45.76,48.20,46.95,48.63,49.22,51.74,49.51,50.63,48.98,
+49.38,50.59,51.48,51.53,54.18,52.57,53.63,54.22,55.13,56.39,
+55.64,56.76,57.09,56.46,59.10,59.03,59.24,58.55,60.18,58.82,
+62.21,58.57,58.72,61.61,61.63,61.22,62.38,63.62,61.71,64.52,
+64.01,63.14,65.00,63.98,66.67,67.56,65.56,65.50,64.72,66.27,
+65.60,66.33,67.59,67.12,66.71,67.51,68.24,70.90,69.47,70.92,
+69.09,71.11,71.73,71.67,69.49,73.85,75.00,72.90,73.71,71.08,
+74.95,73.08,74.47,77.57,73.72,73.70,76.19,75.07,75.60,74.02,
+74.75,75.01,78.32,79.60,80.35,80.04,77.10,78.08,76.84,81.05,
+81.49,82.59,79.50,78.77,82.00,81.85,82.92,79.15,82.77,80.12,
+83.72,82.55,85.13,82.87,81.41,81.82,85.06,83.78,84.85,87.30,
+86.96,81.63,88.94,86.73,85.51,90.30,86.63,86.61,88.89,87.37,
+90.11,86.29,90.58,90.34,89.34,87.31,90.20,85.76,93.89,90.22,
+91.55,93.63,93.20,88.93,94.80,88.23,92.63,90.06,94.57,88.77,
+94.76,92.12,91.36,98.13,97.07,96.32,97.30,90.23,93.41,95.54,
+96.60,96.68,99.54,97.68,95.79,96.41,96.37,97.90,98.13,98.15,
+102.16,100.73,103.27,96.03,94.06,96.15,99.68,96.02,98.50,100.86,
+97.87,100.60,104.44,104.22,103.00,99.56,103.30,102.16,100.57,107.83,
+104.97,106.44,102.24,101.08,106.02,103.02,106.69,106.09,103.62,103.98,
+105.27,108.12,106.35,104.97,106.96,104.08,108.89,110.88,109.17,103.13,
+104.97,108.52,110.63,107.34,104.19,107.26,111.69,105.87,109.32,105.02,
+112.20,111.45,109.46,109.53,113.57,108.83,113.61,112.49,113.77,107.46,
+111.49,112.54,114.61,113.31,116.71,115.87,114.76,115.92,114.03,110.30,
+112.05,113.01,109.03,114.60,116.26,114.24,117.66,118.49,114.91,115.03,
+120.20,112.86,117.65,115.29,114.24,111.17,119.83,114.07,114.70,114.16,
+116.70,119.10,115.00,120.84,117.92,119.26,118.70,122.80,117.59,122.15,
+28.52,29.09,28.74,30.53,30.68,31.88,34.84,33.58,33.66,35.59,
+37.67,36.35,38.24,37.17,39.29,38.72,42.37,41.05,41.25,41.27,
+43.46,42.05,44.07,43.43,43.59,45.21,46.70,46.94,46.18,48.83,
+48.84,50.00,50.81,49.92,50.21,50.95,51.81,51.48,52.96,52.46,
+52.95,54.97,54.46,53.47,54.03,55.82,53.49,53.73,57.24,57.58,
+59.93,59.27,59.27,59.60,59.24,59.53,61.96,60.01,61.24,62.63,
+63.64,62.28,63.21,60.89,63.26,63.98,63.46,63.93,64.82,67.51,
+66.07,66.55,66.80,68.48,66.87,68.34,67.80,70.39,68.19,69.09,
+69.26,69.98,68.03,69.54,69.10,71.04,69.86,72.17,70.29,74.20,
+70.16,71.55,74.60,74.18,75.49,74.98,80.24,75.03,74.51,74.03,
+77.93,73.09,78.32,78.53,80.57,78.79,79.42,83.42,80.52,76.10,
+80.40,81.00,81.34,80.62,79.84,81.48,81.07,85.31,84.48,84.36,
+82.08,80.88,84.95,86.08,85.74,83.94,85.85,88.53,85.51,85.67,
+84.89,88.06,88.51,83.16,86.01,86.85,88.34,90.81,87.88,92.23,
+89.07,87.66,89.09,92.19,91.82,93.10,89.50,90.33,89.21,92.31,
+91.89,94.86,90.44,90.90,93.85,92.03,93.11,94.68,94.67,92.12,
+94.99,97.83,93.48,94.47,100.89,94.79,96.69,94.57,98.13,94.74,
+99.74,99.55,96.31,97.73,100.12,99.77,94.43,97.24,94.43,100.19,
+99.78,96.47,102.08,103.67,99.32,103.48,97.76,106.48,103.49,104.33,
+101.59,101.43,100.41,106.20,105.60,105.07,103.36,104.15,102.41,104.27,
+108.22,106.81,109.03,105.13,108.15,108.88,106.33,109.53,104.91,107.19,
+106.69,105.83,106.82,110.48,108.02,110.76,108.53,110.92,110.61,111.24,
+114.10,112.59,107.45,111.36,108.15,115.41,110.35,110.99,110.40,113.61,
+112.58,115.23,115.62,112.16,111.33,112.70,114.29,114.81,117.85,113.13,
+114.06,115.75,112.10,115.67,109.51,114.63,115.54,114.17,116.39,117.65,
+117.48,116.87,121.75,121.87,119.54,120.53,117.77,120.44,122.67,118.93,
+126.37,122.82,120.45,126.21,116.99,120.95,124.98,118.75,125.18,118.09,
+123.27,119.76,117.91,118.72,120.67,120.16,121.88,118.17,123.52,127.17,
+124.87,124.58,127.78,119.45,124.82,121.32,123.18,119.89,123.50,120.46,
+29.97,28.33,31.40,30.98,31.53,32.65,33.37,34.87,35.82,35.25,
+36.04,36.81,38.18,39.62,40.27,40.89,39.34,42.52,44.72,42.85,
+43.93,44.81,45.67,46.32,46.15,48.12,46.58,46.87,49.22,50.37,
+51.41,51.48,52.81,52.51,51.45,54.26,53.44,55.13,53.20,54.54,
+54.46,55.71,54.62,54.85,56.85,56.38,59.60,58.33,61.08,60.86,
+59.14,61.23,58.29,62.16,62.91,63.55,62.47,63.85,61.03,64.91,
+65.49,66.25,64.50,65.08,67.19,65.52,67.72,66.57,66.43,68.74,
+67.24,67.77,67.90,71.73,68.78,72.88,71.72,70.13,72.04,72.20,
+71.36,73.41,73.04,76.65,73.76,75.03,73.34,75.70,77.73,76.98,
+75.93,76.73,74.56,79.94,79.87,78.22,78.07,82.59,79.64,77.79,
+78.59,80.30,83.04,78.80,82.18,79.64,79.54,81.81,80.98,80.43,
+81.20,83.43,84.91,87.28,83.30,84.39,85.93,84.93,87.54,85.85,
+87.32,85.95,87.91,90.22,88.92,91.25,85.92,93.20,87.62,86.86,
+88.33,86.42,91.15,87.39,93.73,88.40,90.28,96.60,91.95,93.51,
+91.62,92.24,95.26,96.58,93.62,93.34,92.15,94.14,93.48,95.74,
+96.29,93.45,97.73,95.86,99.73,98.38,98.98,94.18,99.28,98.96,
+100.13,103.76,97.69,100.72,94.06,103.51,100.44,101.53,103.25,96.12,
+102.59,102.05,103.13,99.93,102.97,100.83,106.37,101.86,99.75,100.18,
+103.27,103.53,105.28,104.14,105.19,103.43,103.87,104.36,105.57,110.80,
+104.62,109.57,107.45,109.65,105.43,107.93,105.36,108.83,110.07,110.93,
+109.23,111.21,107.18,108.58,110.03,108.45,103.65,112.56,105.06,113.02,
+113.83,110.51,113.06,116.76,113.81,110.36,117.43,109.89,117.40,112.16,
+119.15,117.52,115.81,115.12,111.79,114.33,118.77,118.44,115.12,117.50,
+119.14,111.67,113.43,115.42,117.96,116.07,122.50,113.28,114.87,115.88,
+116.13,115.20,120.77,121.68,121.05,124.44,125.08,123.22,123.53,121.77,
+120.45,123.17,121.22,123.14,120.48,116.65,125.06,126.60,119.30,123.91,
+124.01,124.99,121.09,126.86,124.66,127.04,125.76,127.69,124.37,123.54,
+120.49,123.17,125.54,125.76,119.55,125.98,126.08,125.11,132.53,130.94,
+131.63,127.16,131.77,128.23,128.90,125.40,132.73,134.56,124.68,130.91,
+29.60,31.00,31.81,31.86,32.55,33.18,35.55,35.27,36.31,37.76,
+38.57,38.07,39.73,41.96,42.96,42.56,42.17,42.49,45.54,43.66,
+44.82,47.73,48.42,47.58,48.98,49.29,48.06,50.95,48.13,51.47,
+52.85,53.34,52.69,51.17,53.41,52.57,54.11,56.31,55.77,56.09,
+56.11,57.87,58.36,61.93,59.09,59.90,59.70,59.38,59.58,58.66,
+62.66,62.62,64.04,63.22,67.10,62.80,62.82,65.50,65.82,67.75,
+64.82,65.34,69.11,67.77,70.51,64.95,69.15,70.68,69.39,70.69,
+70.48,74.15,70.22,72.20,72.06,75.36,74.65,74.97,74.73,73.95,
+73.16,77.03,77.46,76.81,75.03,77.28,73.95,77.92,74.85,79.58,
+76.62,79.36,78.88,79.11,79.99,81.14,83.19,83.53,84.18,81.87,
+83.63,84.00,84.43,83.61,82.65,88.38,83.68,83.67,84.52,86.12,
+86.30,87.99,86.87,87.75,87.86,85.62,91.85,90.19,88.49,87.89,
+90.25,90.28,86.60,89.10,91.57,88.79,88.60,90.72,90.76,92.72,
+93.96,93.30,95.94,95.33,98.01,93.02,95.10,92.36,97.54,93.60,
+94.50,94.88,99.21,100.12,94.57,96.50,97.27,95.81,96.52,99.95,
+96.98,96.64,97.75,100.84,97.07,99.69,101.34,102.56,103.77,105.19,
+102.30,103.90,102.14,103.03,107.18,102.83,99.23,99.84,100.09,107.56,
+107.29,104.15,106.89,104.75,107.32,105.34,104.13,108.31,106.94,108.11,
+107.13,108.81,106.66,112.29,108.35,112.51,108.06,106.94,105.13,104.88,
+107.71,112.74,110.35,109.80,112.18,113.63,113.57,110.43,108.29,114.47,
+110.60,115.69,110.92,115.65,113.21,114.96,113.60,113.99,117.62,114.01,
+113.65,116.15,114.50,119.13,111.90,115.99,114.57,120.61,116.19,121.73,
+121.04,120.58,115.51,121.48,117.76,122.80,117.52,116.70,123.51,121.01,
+117.76,124.54,119.03,123.53,124.91,116.73,122.17,121.89,125.79,124.50,
+123.56,123.50,124.86,123.80,126.33,120.44,122.40,120.30,127.78,125.68,
+127.41,126.27,126.32,123.70,128.27,123.05,123.93,127.86,130.87,125.70,
+121.30,128.71,130.62,129.47,128.91,132.16,130.56,129.32,131.23,126.27,
+126.13,128.62,127.59,135.51,128.40,131.60,129.35,130.13,128.69,132.13,
+128.26,129.42,133.94,132.97,128.87,137.27,130.42,140.67,139.99,130.72,
+29.46,30.68,32.38,34.16,33.38,36.19,35.64,36.40,36.84,37.14,
+38.67,39.35,40.25,40.08,40.74,43.66,44.86,45.14,45.15,47.04,
+47.39,49.49,47.74,48.19,49.08,49.81,51.14,52.26,50.86,51.81,
+55.07,52.94,51.54,54.01,57.24,55.31,57.25,56.26,55.90,58.03,
+59.25,60.11,58.43,59.99,63.06,59.28,63.30,61.25,65.52,63.37,
+61.94,64.61,65.85,65.31,64.42,62.76,65.19,67.14,68.29,67.19,
+65.21,68.12,72.27,71.50,71.03,71.86,67.05,70.56,70.38,72.72,
+72.09,71.94,77.94,77.74,74.67,73.81,73.60,74.92,75.50,75.61,
+77.34,78.44,79.32,76.39,82.81,78.29,79.95,79.72,81.07,78.89,
+80.64,82.98,83.79,79.62,84.36,84.78,83.04,82.21,89.28,84.96,
+85.88,85.90,87.72,87.41,86.25,87.22,87.41,85.24,87.31,88.96,
+87.97,90.55,83.92,84.99,91.25,90.07,87.92,95.22,93.38,92.07,
+92.48,93.59,86.70,92.36,92.32,93.53,95.66,95.08,94.90,92.79,
+93.85,95.44,96.73,99.40,95.99,96.74,97.19,96.14,97.84,98.42,
+102.65,96.07,99.93,102.21,100.49,102.96,102.15,100.32,102.98,101.01,
+106.60,107.70,102.90,103.63,103.16,102.80,101.29,104.34,104.04,108.33,
+106.42,105.89,104.29,108.54,105.12,101.77,105.53,107.16,109.44,106.26,
+110.83,110.36,112.82,108.85,107.29,112.38,110.63,109.01,111.57,112.53,
+110.85,111.52,116.16,115.54,116.12,113.43,111.77,119.15,117.08,116.53,
+113.21,110.69,112.91,116.46,112.92,119.79,113.56,114.06,112.02,120.28,
+114.22,110.47,119.02,118.17,119.78,119.51,119.47,119.49,116.83,115.03,
+116.19,118.69,122.83,122.02,117.62,119.38,118.57,120.91,122.92,126.01,
+118.68,124.60,118.07,123.08,126.03,118.88,123.64,117.75,125.09,126.46,
+124.72,124.81,127.39,123.92,122.62,126.52,125.80,125.72,126.49,130.87,
+128.35,122.70,124.68,129.44,124.91,127.61,124.76,127.04,129.30,132.15,
+129.85,128.27,128.47,129.40,130.40,133.88,131.78,133.05,132.35,126.78,
+128.49,129.39,135.07,125.32,130.09,137.06,127.80,138.06,130.14,135.43,
+127.87,132.46,135.82,139.25,131.94,138.26,136.92,138.41,136.04,136.79,
+136.32,139.07,135.07,134.08,136.40,136.08,136.81,135.92,141.38,131.79,
+31.00,32.43,33.05,32.83,34.49,36.04,36.16,36.22,40.65,39.93,
+40.83,41.90,40.66,43.59,43.46,42.21,42.65,44.99,45.42,47.34,
+47.22,47.91,48.64,49.70,50.09,51.06,52.54,52.18,51.17,54.41,
+55.76,54.89,56.27,56.81,55.73,57.32,58.11,57.99,60.39,59.63,
+59.89,59.61,62.30,61.26,62.35,63.67,63.05,64.53,61.79,64.43,
+67.56,65.03,66.74,66.26,67.89,67.26,68.84,70.29,67.85,70.95,
+68.35,71.98,71.00,74.31,73.41,74.89,72.80,73.26,72.95,75.25,
+76.96,74.69,78.23,76.75,79.28,79.23,77.28,77.15,78.07,79.58,
+77.75,78.79,78.81,79.44,81.25,75.61,79.23,83.87,78.56,82.79,
+80.58,82.42,84.02,84.95,85.09,90.15,87.84,85.35,86.93,83.83,
+90.87,87.98,91.79,90.79,89.72,86.95,91.06,94.39,88.05,93.21,
+92.38,92.41,94.29,94.50,93.97,88.81,91.80,92.29,93.98,93.29,
+96.11,93.78,99.17,98.68,94.95,93.35,96.75,97.34,100.75,98.93,
+97.05,96.91,98.52,101.86,98.52,100.03,101.24,101.43,101.05,105.00,
+103.16,102.48,102.85,103.78,105.12,101.75,101.52,104.57,106.48,105.85,
+101.11,101.97,102.15,101.06,102.37,102.65,105.96,108.19,105.83,111.60,
+103.10,107.12,107.46,105.86,114.61,108.23,107.52,108.72,107.24,112.45,
+109.41,104.28,105.78,105.96,116.87,113.93,112.37,114.55,116.72,118.20,
+114.35,112.19,112.03,111.29,110.92,113.61,117.31,114.11,115.10,112.18,
+117.02,119.28,117.79,119.71,119.60,118.23,122.70,118.74,121.90,120.31,
+116.84,118.29,119.51,119.68,118.94,123.60,118.23,117.74,121.80,127.29,
+122.00,121.90,126.14,120.03,126.56,124.15,117.54,127.28,124.20,126.07,
+123.47,128.48,119.93,124.80,127.49,123.52,128.55,125.23,123.86,125.65,
+127.47,124.98,125.55,130.55,129.04,129.29,125.51,125.15,127.95,133.91,
+132.25,130.50,132.93,129.52,130.45,129.21,129.88,128.97,134.01,131.78,
+128.39,129.02,133.74,130.27,133.14,135.14,130.33,133.11,138.34,137.26,
+135.10,142.69,134.62,135.68,136.25,135.12,136.43,139.86,136.53,137.61,
+139.48,134.92,141.70,137.42,136.70,140.51,140.25,138.13,144.08,140.64,
+137.50,140.35,138.09,142.43,145.69,143.69,142.88,140.99,140.90,144.20,
+31.54,33.09,34.07,34.39,35.97,35.62,37.79,38.69,39.97,39.32,
+41.59,41.49,41.73,42.81,45.29,45.20,44.53,46.03,47.48,47.60,
+48.09,49.42,50.70,50.29,50.98,51.39,52.71,54.33,56.36,56.68,
+56.84,57.33,56.61,55.38,57.95,60.43,59.27,59.12,62.07,61.23,
+60.46,61.43,64.43,61.59,63.90,64.79,65.55,62.55,66.05,66.87,
+65.73,67.97,69.57,66.70,71.17,68.26,72.27,69.35,70.97,72.95,
+71.25,72.14,74.04,72.54,74.90,75.43,76.45,75.73,78.06,75.28,
+77.89,75.20,76.53,77.28,77.67,78.92,81.15,80.87,80.47,78.10,
+79.01,78.06,80.32,81.11,80.89,82.88,85.53,83.67,85.10,87.66,
+83.99,86.86,88.55,88.57,86.83,89.06,88.50,88.53,89.46,88.29,
+87.95,92.17,87.86,91.52,89.73,88.88,92.80,92.09,94.41,93.50,
+94.48,92.10,96.57,94.05,97.27,93.95,92.50,98.87,96.19,93.42,
+97.21,98.57,97.80,97.22,97.44,96.67,100.08,96.22,100.09,98.08,
+100.24,101.81,102.79,104.51,104.00,103.07,100.41,100.92,103.71,104.91,
+108.01,101.01,104.26,103.95,103.64,104.91,110.62,108.22,106.33,106.56,
+106.93,109.23,106.45,104.44,119.20,106.58,108.12,108.82,109.42,108.14,
+109.24,111.14,114.82,111.34,116.59,109.23,109.09,109.89,113.14,117.38,
+112.97,117.43,113.42,115.78,108.86,119.61,113.78,115.78,116.67,113.15,
+112.26,118.74,114.19,118.90,123.29,119.60,118.56,118.43,117.99,123.24,
+116.52,118.65,117.34,118.30,121.36,122.15,121.24,119.24,121.33,123.61,
+118.12,125.56,116.73,116.08,125.24,126.48,124.14,126.50,121.10,123.61,
+122.32,120.63,125.63,128.14,128.77,126.38,129.39,125.48,124.53,125.21,
+133.02,123.16,129.48,121.77,137.20,131.92,136.02,125.27,128.35,125.35,
+131.09,130.24,126.73,131.61,132.70,134.07,130.42,131.34,132.41,136.66,
+136.06,133.15,139.81,134.84,135.39,132.77,136.08,138.45,135.20,139.15,
+132.64,133.81,132.35,137.94,135.45,138.95,138.75,141.51,138.00,139.74,
+137.20,138.90,136.58,132.15,137.60,136.89,139.56,137.83,143.77,145.39,
+143.19,143.34,144.82,143.18,140.10,142.98,140.69,145.12,145.73,144.16,
+144.19,144.18,145.91,144.21,150.67,145.06,146.99,145.92,148.89,142.37,
+19.84,20.91,19.29,21.12,21.58,20.78,21.79,21.37,21.35,21.87,
+22.04,22.16,21.88,22.31,23.55,21.83,23.87,23.44,24.29,23.73,
+24.54,24.81,25.28,24.38,25.12,25.53,26.31,25.86,27.09,27.07,
+26.72,28.11,26.31,26.82,26.90,26.02,26.90,28.08,28.32,29.61,
+28.90,27.84,27.51,29.98,29.97,28.67,29.24,30.76,29.91,30.07,
+29.83,30.72,29.76,30.51,29.87,31.62,30.30,31.68,32.01,33.60,
+32.25,32.04,31.35,32.86,32.50,33.30,33.50,33.25,32.56,34.59,
+33.66,33.27,33.94,35.14,34.26,33.11,33.99,36.21,33.90,34.42,
+34.85,34.47,36.32,35.30,35.20,35.89,35.78,36.76,36.66,37.45,
+35.57,37.53,36.47,37.76,36.40,38.56,38.23,37.50,36.88,36.13,
+37.31,38.62,39.44,38.49,38.56,38.42,38.09,38.61,38.65,39.16,
+39.53,37.70,39.81,38.53,39.10,38.68,39.17,38.31,39.91,40.51,
+41.29,40.78,43.18,40.08,41.41,41.34,41.93,41.46,41.07,41.48,
+40.68,40.78,41.77,41.05,43.73,43.20,43.32,43.40,40.68,42.52,
+43.33,43.81,43.26,42.79,43.91,43.36,42.13,43.68,44.23,42.98,
+45.01,42.78,46.71,45.29,43.22,44.74,46.30,45.00,44.84,45.83,
+46.39,44.75,44.42,47.12,47.74,45.12,45.99,46.03,44.86,45.71,
+45.87,47.67,47.68,46.01,47.10,48.16,46.51,47.90,46.46,47.22,
+47.41,46.77,49.41,47.64,47.61,51.03,47.69,49.42,49.90,48.11,
+47.30,49.96,48.95,49.09,48.60,48.83,50.12,50.66,47.97,48.82,
+47.60,48.13,49.57,50.28,50.06,50.73,49.04,48.06,50.22,49.22,
+52.17,50.45,48.07,50.66,51.58,50.68,49.85,54.17,50.67,52.64,
+51.85,51.56,50.59,50.14,53.51,53.31,53.67,52.06,54.60,51.94,
+54.11,51.96,51.98,51.77,52.22,52.06,54.32,53.91,52.61,52.69,
+53.09,51.57,55.00,54.41,54.12,54.83,51.42,54.09,52.66,53.57,
+53.48,53.88,56.18,52.18,57.11,53.87,55.91,54.63,55.69,55.44,
+58.75,52.98,55.44,54.72,56.05,56.85,56.50,55.67,58.99,56.56,
+58.70,58.18,57.41,58.18,59.60,57.33,57.60,56.12,56.80,56.97,
+58.24,57.51,58.40,59.01,60.48,58.49,58.40,58.08,58.39,57.73,
+21.81,21.11,20.49,20.68,22.90,21.49,22.16,22.66,22.12,22.47,
+23.55,23.69,25.20,25.01,25.50,25.26,25.01,25.98,25.39,27.30,
+25.40,26.38,27.72,27.82,27.57,27.33,26.98,29.21,28.62,29.17,
+27.80,29.38,28.90,29.91,29.54,29.12,30.97,30.05,31.19,31.00,
+31.70,30.98,31.62,31.29,31.57,31.57,33.05,33.53,32.89,33.61,
+32.89,33.62,33.80,33.59,32.88,33.91,34.71,33.85,33.87,35.12,
+35.94,35.52,34.59,35.15,35.84,36.75,35.69,37.19,36.38,36.87,
+37.46,37.33,36.17,38.92,37.01,36.45,39.14,39.17,37.43,41.18,
+38.83,39.30,39.36,39.28,39.69,40.39,40.35,40.64,39.17,40.51,
+40.96,40.27,40.06,40.97,41.39,41.86,43.15,41.57,42.65,41.14,
+41.19,43.38,42.73,40.99,42.60,42.14,42.40,42.86,44.11,43.43,
+42.89,43.01,45.62,43.68,45.39,45.16,44.96,46.13,44.14,44.97,
+43.43,44.39,44.98,46.61,46.72,45.39,45.43,45.12,45.52,46.54,
+45.85,47.03,47.21,45.90,48.66,47.02,47.24,46.88,48.50,46.75,
+47.01,50.09,45.69,48.05,49.73,48.16,48.29,49.24,47.78,51.91,
+48.77,48.21,50.26,48.21,47.94,50.94,51.20,52.32,49.63,48.55,
+51.77,50.72,50.52,51.51,52.49,49.40,50.64,53.55,51.41,54.01,
+52.93,51.85,50.94,51.95,52.28,52.06,51.46,53.37,51.76,52.81,
+55.10,54.73,52.07,54.95,52.33,54.00,52.18,54.02,54.69,51.75,
+53.55,54.05,54.95,54.67,56.07,57.93,55.89,56.38,55.47,54.26,
+54.48,56.49,55.98,56.03,55.26,56.39,57.78,56.08,57.63,58.23,
+55.33,57.73,56.58,56.01,57.64,56.14,57.55,55.57,56.73,61.49,
+59.39,57.11,55.52,56.32,57.65,58.06,56.89,60.86,59.56,57.90,
+58.89,57.94,56.31,59.56,58.85,58.28,61.05,59.40,59.45,60.95,
+57.74,61.76,62.69,59.06,61.31,61.01,59.91,61.83,64.20,59.73,
+61.19,61.13,59.39,61.21,61.77,63.68,61.73,65.44,62.70,62.35,
+59.95,61.91,62.77,63.68,63.28,60.37,61.79,63.79,61.99,64.56,
+63.44,63.28,66.18,62.46,65.38,65.58,62.59,66.06,62.92,64.59,
+65.52,64.41,65.76,62.25,67.42,64.48,67.61,67.06,69.50,65.68,
+22.41,22.83,21.96,22.86,23.12,24.01,23.90,23.86,24.53,25.22,
+25.07,25.23,26.11,26.02,26.41,26.83,26.38,28.18,26.62,28.42,
+28.44,29.02,28.22,29.47,30.68,29.53,29.06,27.79,32.30,30.54,
+31.65,30.36,31.92,32.58,33.38,31.95,32.22,32.13,34.56,34.16,
+34.45,33.34,34.04,35.65,34.71,34.61,35.58,35.68,35.07,35.70,
+35.21,35.54,36.35,38.71,36.59,36.02,38.65,39.24,37.45,39.03,
+36.67,38.28,37.29,38.68,38.62,38.74,39.90,40.42,41.28,39.98,
+40.82,39.43,41.04,42.02,41.27,39.76,41.38,40.75,44.00,43.56,
+41.94,43.11,42.40,42.03,43.28,42.77,43.37,44.61,42.19,44.59,
+44.38,47.29,44.65,45.00,46.67,43.23,45.86,45.62,45.84,44.64,
+46.92,45.21,47.14,46.64,46.33,45.46,48.65,48.42,46.88,49.01,
+46.31,47.59,47.83,49.47,49.91,45.30,48.68,49.00,50.73,49.67,
+51.04,49.32,49.95,51.02,50.27,49.55,50.62,51.80,49.71,51.02,
+50.88,51.88,52.97,50.85,51.55,51.89,53.66,51.51,52.94,53.82,
+52.99,53.08,53.87,54.28,53.51,53.22,55.44,54.22,52.72,52.18,
+54.37,54.59,52.11,55.13,54.92,56.71,57.40,53.44,55.29,56.01,
+55.31,55.80,57.28,58.17,56.06,57.27,55.41,55.44,57.32,55.28,
+58.65,59.71,56.68,57.89,57.72,57.46,59.19,58.82,57.52,57.71,
+57.03,60.14,58.69,57.21,57.55,59.56,60.36,59.25,61.39,58.34,
+60.31,60.64,61.35,59.75,60.77,61.93,60.98,61.21,61.19,65.07,
+63.08,62.01,62.91,63.07,62.61,59.74,63.75,63.73,65.92,61.94,
+64.44,65.19,63.31,64.25,59.60,62.69,64.83,64.92,62.93,64.12,
+63.54,67.25,64.59,63.21,64.48,64.35,65.17,66.76,64.66,67.70,
+63.95,64.07,64.88,66.61,64.19,65.71,63.59,69.59,67.48,65.40,
+66.17,66.09,66.78,66.50,65.50,65.95,67.44,68.45,68.07,68.11,
+68.10,68.64,68.92,71.95,70.40,68.81,67.31,67.96,69.39,68.89,
+68.78,69.33,70.24,68.13,69.96,69.45,69.78,71.94,69.39,69.03,
+72.29,70.34,72.56,71.11,72.63,70.95,69.79,69.86,69.39,70.56,
+71.60,75.20,71.85,73.16,72.54,69.66,71.81,72.21,71.64,70.40,
+22.46,23.72,24.62,23.27,25.38,24.84,25.52,25.38,26.13,26.84,
+26.62,26.51,28.47,26.15,28.20,27.66,28.27,29.74,29.82,30.26,
+30.54,29.93,30.24,30.84,32.03,30.81,33.16,31.82,33.92,32.64,
+33.73,34.36,33.85,35.03,34.37,34.29,36.06,35.02,37.75,35.21,
+37.08,36.15,35.91,35.73,36.74,37.43,36.97,38.64,39.82,38.68,
+38.94,38.25,39.98,39.13,39.66,41.18,39.98,40.72,41.36,40.86,
+41.95,42.28,41.53,41.20,42.42,42.35,42.93,44.33,44.63,45.57,
+44.19,43.87,44.02,46.03,45.84,45.81,45.71,44.85,45.27,45.75,
+46.81,47.04,47.67,48.01,45.08,46.32,46.83,47.32,47.21,48.68,
+48.25,47.96,46.98,49.72,48.46,48.97,47.55,50.94,49.75,50.21,
+49.79,51.77,52.07,51.08,51.85,51.66,50.32,52.04,52.28,51.09,
+53.40,52.61,51.52,54.05,51.60,51.15,53.60,52.90,55.64,54.87,
+54.32,53.43,55.65,54.90,55.74,54.06,55.40,54.25,56.33,55.80,
+56.33,54.44,56.51,55.08,58.35,56.45,53.91,57.10,56.56,59.09,
+56.21,59.22,60.11,59.13,57.49,58.04,59.12,58.62,59.05,57.05,
+58.60,60.09,59.29,59.97,60.41,62.85,59.06,62.34,58.89,59.11,
+62.18,61.21,61.14,61.42,63.68,63.11,62.66,62.66,61.72,61.34,
+62.95,64.24,60.21,63.04,63.64,62.46,65.69,61.96,63.46,65.34,
+63.22,63.90,64.74,64.81,63.90,66.51,63.56,64.09,66.89,65.07,
+68.52,65.58,67.46,67.00,64.52,66.29,68.13,66.42,66.08,64.62,
+66.02,65.79,67.51,70.83,65.90,65.44,66.63,67.89,70.02,69.49,
+69.49,68.64,69.83,69.42,70.34,69.14,69.15,69.05,68.44,67.51,
+70.90,70.30,71.14,70.37,68.70,67.48,67.87,70.15,72.47,69.50,
+69.74,71.95,75.81,69.54,72.19,72.28,74.40,72.54,69.34,70.71,
+73.79,75.62,77.17,74.51,71.02,73.13,72.70,77.93,73.25,76.87,
+73.16,76.38,72.70,75.77,75.17,77.63,73.22,77.18,73.92,73.49,
+74.28,76.48,76.94,75.38,77.50,76.92,76.62,77.61,76.04,74.30,
+76.09,78.20,75.04,76.31,75.96,79.68,79.28,76.11,79.05,80.28,
+78.96,79.35,77.02,78.59,79.68,78.43,82.32,78.04,79.52,82.33,
+22.59,23.11,24.93,25.65,25.05,26.66,26.15,27.30,27.89,28.00,
+27.21,27.02,29.10,30.79,29.32,29.62,31.25,31.00,31.58,31.45,
+31.29,33.52,33.41,32.62,32.24,33.12,35.02,35.06,35.31,35.50,
+35.97,36.09,34.42,38.07,37.43,37.36,37.47,38.26,39.62,38.56,
+39.71,39.35,39.42,38.46,40.04,39.98,39.59,42.57,41.07,41.76,
+40.79,42.47,42.51,42.26,40.76,42.78,46.02,44.10,44.05,44.49,
+44.15,47.07,44.42,45.68,44.84,44.60,46.49,44.95,46.77,46.23,
+47.73,47.85,48.94,48.17,47.85,47.80,48.18,50.97,49.74,49.43,
+51.00,47.37,49.33,51.01,51.30,48.95,52.70,54.70,52.92,54.42,
+53.50,51.38,51.93,51.21,54.91,53.10,53.33,55.13,54.93,55.34,
+56.16,55.13,54.33,54.50,55.07,55.30,57.13,55.49,57.44,57.23,
+53.45,57.48,56.88,57.49,55.46,57.55,53.74,57.68,56.08,60.41,
+57.26,60.49,57.61,58.70,61.15,61.10,59.85,59.27,61.40,60.98,
+60.29,57.09,59.26,61.15,63.02,62.71,64.56,61.27,62.49,63.20,
+64.55,64.13,62.60,65.27,60.99,61.66,66.18,63.22,64.35,65.39,
+62.74,65.65,63.98,63.10,63.25,65.71,67.09,65.84,66.24,68.20,
+65.35,65.56,66.06,68.24,67.33,65.82,67.90,68.48,70.03,68.83,
+68.32,68.79,70.62,68.62,72.51,69.09,69.99,69.36,67.19,68.62,
+70.51,69.68,68.27,71.71,69.31,71.50,72.27,72.38,70.86,69.38,
+70.20,68.87,72.03,70.74,70.89,70.50,73.92,70.13,74.60,75.61,
+73.39,75.29,74.09,72.66,74.07,72.06,75.94,74.29,76.06,75.14,
+75.29,76.85,74.21,75.92,75.81,74.39,76.51,73.98,76.03,76.93,
+78.00,76.71,77.97,75.97,78.84,76.34,75.05,76.38,77.63,77.34,
+76.11,80.33,79.68,76.85,80.80,74.49,83.22,81.34,79.53,79.73,
+84.92,78.98,76.98,78.23,80.35,80.96,77.59,82.25,80.35,80.42,
+79.96,80.36,83.26,80.46,81.35,83.74,80.97,80.13,79.17,81.25,
+84.12,84.82,86.06,82.20,83.84,81.45,85.38,85.31,84.55,83.32,
+84.58,81.77,83.40,86.31,86.35,81.52,83.44,82.61,88.57,83.46,
+87.44,88.49,86.63,83.84,86.31,87.13,87.31,87.62,83.96,89.46,
+23.62,24.66,26.44,25.32,28.13,26.47,26.15,29.04,28.67,31.22,
+30.15,30.06,29.37,31.58,31.02,32.89,33.31,31.41,33.20,34.00,
+32.85,32.79,33.70,35.86,35.06,35.90,35.66,37.48,35.78,38.18,
+38.17,37.87,40.79,40.83,39.68,37.87,38.75,42.11,41.06,39.72,
+42.47,40.49,42.82,41.87,42.57,42.74,44.34,45.08,44.37,44.12,
+44.51,47.02,46.26,46.35,45.95,46.30,46.61,48.04,46.99,47.45,
+47.98,44.71,50.06,47.91,49.77,49.92,49.24,51.93,51.53,47.97,
+48.96,52.46,51.54,52.29,51.08,51.96,51.95,54.22,53.10,52.48,
+54.11,53.85,54.30,53.68,53.28,55.89,57.32,57.33,56.81,55.86,
+57.34,56.52,57.93,56.98,54.32,58.72,58.36,58.33,57.97,57.75,
+59.29,59.91,58.99,57.39,58.04,58.49,57.77,60.47,63.27,61.92,
+60.88,62.30,61.10,63.14,59.84,62.24,65.38,63.76,62.25,63.20,
+62.03,62.90,63.24,62.82,62.97,63.55,62.43,63.58,65.47,65.61,
+63.13,64.22,68.96,64.37,66.09,66.06,65.71,67.80,69.42,69.75,
+65.65,66.98,68.97,68.49,69.72,69.87,68.74,67.87,67.73,67.93,
+68.54,69.76,67.42,73.75,71.76,70.85,70.75,68.71,72.00,70.33,
+72.30,70.72,69.27,73.20,71.41,70.93,71.58,76.25,73.21,73.91,
+72.89,73.09,73.09,74.93,73.79,74.21,75.73,76.98,77.28,75.84,
+77.21,75.52,74.54,74.30,79.88,76.17,78.23,77.28,77.28,74.41,
+76.68,76.63,77.73,77.91,75.31,81.81,76.97,80.69,78.33,79.99,
+78.40,77.29,80.06,81.69,79.12,76.38,80.01,77.26,80.14,83.22,
+78.38,79.87,84.57,83.52,82.57,85.47,82.84,81.24,83.61,84.54,
+83.06,83.72,83.13,81.63,85.58,83.06,86.72,87.88,83.08,86.90,
+82.67,84.43,84.90,84.84,83.92,86.14,82.74,88.91,83.55,84.94,
+83.27,83.09,87.54,85.64,86.11,88.18,88.38,87.47,90.11,89.63,
+88.26,90.66,89.68,87.10,85.45,86.56,89.21,92.70,87.42,94.88,
+91.09,91.96,91.32,85.98,90.07,90.09,87.13,89.03,87.39,91.18,
+90.62,90.59,93.53,91.81,93.02,90.30,92.28,92.84,88.71,92.21,
+92.18,88.04,91.54,91.73,87.81,92.75,88.29,93.41,96.65,93.95,
+24.56,26.23,26.96,27.07,27.36,28.75,29.12,29.20,31.25,31.21,
+32.14,31.23,31.57,34.71,32.54,34.22,34.28,35.42,34.45,35.44,
+36.33,37.27,36.90,37.66,37.92,39.04,38.19,38.69,37.92,38.82,
+40.31,40.04,41.09,42.42,41.56,42.48,42.81,42.26,44.72,46.07,
+43.96,44.11,44.96,45.65,43.99,45.10,46.07,46.22,49.45,47.62,
+46.17,48.31,49.97,48.76,48.68,49.83,49.88,49.07,49.70,49.64,
+49.93,50.46,51.32,52.40,55.15,52.28,52.65,54.19,55.49,52.74,
+54.07,54.19,53.88,54.34,54.37,55.12,54.49,53.16,56.39,55.75,
+55.67,58.84,56.46,59.70,59.45,60.33,59.40,58.79,60.24,60.21,
+57.24,59.96,59.77,58.13,61.83,61.62,60.69,59.75,63.72,62.50,
+65.02,63.17,62.60,64.49,63.52,63.68,65.08,63.31,65.26,67.43,
+66.32,65.07,65.75,65.68,66.04,67.06,68.63,66.92,68.04,67.70,
+66.47,67.49,67.56,70.86,69.92,69.03,70.41,67.50,72.53,71.57,
+67.75,69.28,70.03,68.31,71.49,74.00,68.90,69.45,69.55,74.05,
+73.24,72.33,73.21,76.71,66.98,73.87,73.49,71.00,75.09,75.16,
+71.87,74.07,74.97,76.32,76.49,76.72,74.65,78.47,75.44,77.33,
+79.02,73.88,76.96,77.63,76.31,77.54,81.64,76.55,79.66,77.74,
+79.80,78.50,79.50,78.93,79.06,83.60,80.44,78.21,80.20,77.27,
+81.31,80.15,79.51,83.12,77.07,78.23,80.70,80.81,85.46,79.16,
+84.98,82.90,83.85,81.30,83.48,83.00,84.50,83.45,85.27,85.71,
+83.33,87.17,83.91,83.93,84.52,85.52,86.06,90.88,87.73,88.21,
+88.91,86.86,88.24,89.97,87.04,85.87,85.90,86.41,89.12,87.69,
+85.48,91.03,90.19,92.46,90.67,93.50,90.45,91.26,93.35,90.98,
+89.51,90.50,89.59,89.74,92.85,90.42,92.05,88.66,93.17,94.51,
+88.59,91.10,89.76,91.46,89.37,92.42,89.87,89.46,95.96,94.36,
+90.42,93.67,95.48,96.13,97.52,95.90,98.72,94.31,97.43,96.03,
+96.85,97.86,97.99,96.43,96.87,97.13,93.92,96.76,95.86,95.41,
+91.09,97.60,98.15,98.96,95.40,97.52,100.33,101.10,94.28,100.80,
+97.22,96.86,98.12,103.33,100.96,100.42,100.18,96.20,96.61,105.08,
+26.78,26.44,28.54,28.38,29.30,30.96,30.22,31.53,30.81,31.95,
+33.24,34.73,33.71,35.02,34.48,35.57,35.74,37.52,37.18,37.24,
+39.25,38.87,41.38,38.93,40.52,40.43,39.70,42.45,39.76,41.71,
+43.41,42.60,44.19,43.55,43.82,45.36,45.39,44.68,46.04,43.96,
+46.14,47.20,45.92,46.80,47.75,49.21,50.39,47.52,50.16,50.56,
+50.53,50.77,51.60,53.04,50.43,51.08,52.52,53.92,51.51,54.21,
+55.97,53.21,52.72,54.88,56.57,55.36,56.71,55.29,56.81,58.50,
+56.85,57.48,58.44,58.21,58.60,60.11,59.48,59.33,57.95,59.56,
+62.17,62.75,61.92,61.60,62.52,61.27,62.98,64.98,62.46,63.36,
+59.88,65.11,64.66,63.73,66.56,62.21,65.85,64.80,64.93,63.61,
+66.90,67.44,65.31,66.29,67.25,67.94,70.78,68.15,69.19,69.17,
+68.32,69.06,67.42,68.54,70.59,69.22,69.07,69.67,69.77,69.19,
+71.58,70.96,71.05,73.36,72.64,75.83,71.98,73.50,73.04,75.50,
+77.47,73.60,73.57,73.36,79.01,75.39,74.58,75.10,75.53,74.05,
+72.38,75.75,80.25,78.93,78.56,77.47,77.96,75.36,76.75,76.02,
+81.75,77.74,78.65,79.10,78.51,80.53,80.77,82.62,78.94,81.44,
+82.08,80.45,84.74,83.28,82.22,84.79,85.74,81.08,82.34,86.79,
+85.32,81.11,83.84,83.85,81.64,85.79,87.30,83.93,86.66,85.80,
+82.45,86.82,89.51,85.54,87.19,85.34,86.09,87.12,86.06,85.13,
+87.91,89.02,89.58,90.22,83.82,87.75,91.86,88.55,90.43,88.58,
+88.98,92.59,93.50,91.92,88.72,90.04,88.97,88.34,91.95,95.27,
+87.13,95.00,92.41,94.15,95.21,92.80,94.74,93.43,92.36,92.48,
+93.97,95.10,96.86,95.08,97.92,94.07,96.09,92.17,94.42,95.45,
+94.85,93.56,99.31,95.96,96.78,96.78,95.32,95.23,96.00,96.50,
+96.93,99.29,94.54,97.55,96.88,97.26,97.62,100.37,99.48,98.92,
+101.53,99.68,101.17,101.28,101.86,102.17,98.86,102.22,102.58,100.72,
+98.51,101.85,105.20,100.30,103.36,100.13,106.27,101.43,105.37,102.04,
+102.38,102.84,106.27,104.52,105.69,102.26,104.22,107.77,104.05,99.64,
+102.28,104.37,107.02,105.66,106.10,104.22,106.10,103.68,104.73,106.90,
+27.85,29.01,29.10,30.03,31.26,31.96,31.79,33.25,32.95,35.18,
+34.86,33.60,37.45,35.83,35.79,36.22,38.25,38.74,38.52,40.27,
+39.16,38.96,41.36,40.69,43.33,41.96,42.21,43.27,44.17,41.58,
+44.04,43.17,45.71,46.34,44.82,47.50,49.15,47.69,50.09,49.23,
+49.86,49.03,48.26,52.52,49.92,52.04,51.17,50.69,52.62,51.38,
+51.80,54.17,53.19,55.23,54.58,57.20,56.50,53.01,56.24,58.08,
+56.10,57.14,55.83,59.18,57.03,59.48,59.18,57.92,57.94,60.55,
+59.73,61.22,61.32,61.50,60.12,61.57,63.38,65.52,63.86,62.64,
+63.93,65.94,65.33,61.41,65.32,68.48,68.49,65.28,67.27,63.60,
+68.54,67.91,66.20,69.01,68.39,70.88,68.60,71.14,70.60,69.76,
+69.79,67.17,70.30,67.57,72.20,71.75,71.33,70.84,71.85,71.22,
+70.24,71.72,73.52,75.10,77.68,70.82,72.11,75.86,75.55,73.35,
+77.36,74.89,75.64,78.75,75.69,76.58,77.67,77.46,79.76,78.05,
+77.27,77.39,74.95,78.65,74.56,78.47,80.63,80.07,82.52,80.82,
+78.72,84.62,79.92,83.32,78.36,81.65,81.35,80.52,84.60,84.68,
+85.21,81.04,83.99,86.77,85.21,83.36,83.47,83.64,87.17,88.65,
+89.77,85.73,87.11,88.07,85.50,86.35,84.33,84.23,86.35,89.59,
+86.12,87.07,87.73,86.87,90.57,93.24,85.25,88.65,92.74,90.89,
+92.25,88.40,91.40,94.09,89.79,89.84,86.82,90.94,93.27,91.16,
+95.34,93.25,91.81,91.83,95.45,97.86,93.29,93.79,97.87,97.98,
+95.04,95.39,97.87,92.83,92.53,100.00,100.36,96.51,97.93,94.95,
+97.34,95.84,101.70,98.82,94.57,96.54,98.46,97.89,99.89,97.71,
+101.40,101.71,103.24,96.00,100.45,100.97,100.98,101.02,96.12,103.09,
+100.44,102.51,96.85,103.89,99.81,102.69,100.84,102.56,103.00,101.26,
+102.27,102.76,102.19,102.02,104.04,103.10,102.27,107.40,106.89,105.89,
+106.56,110.42,104.13,109.42,107.16,106.13,102.58,105.15,105.46,111.89,
+105.31,110.36,109.99,108.91,114.69,109.20,107.86,111.11,105.81,109.65,
+109.30,104.89,107.06,111.51,111.05,113.23,108.38,117.83,107.53,110.23,
+112.14,109.26,116.43,111.28,109.20,107.28,115.43,114.38,112.04,113.57,
+28.18,29.75,28.87,29.08,30.73,32.29,32.66,32.97,33.82,35.32,
+36.05,35.04,36.33,35.15,38.83,39.36,39.29,39.38,42.21,38.94,
+43.25,41.39,42.78,43.90,43.52,43.34,44.17,43.52,46.97,45.39,
+46.78,48.30,47.03,48.33,48.69,48.51,50.25,48.56,51.39,51.49,
+50.99,51.23,49.54,51.89,51.56,53.14,54.82,53.42,54.58,55.72,
+53.73,56.91,56.62,56.93,56.80,57.08,58.78,60.19,57.11,59.85,
+58.51,57.96,59.44,58.92,64.88,60.76,62.69,58.70,62.80,64.62,
+62.36,63.84,65.05,66.90,65.78,65.77,67.08,66.82,65.47,67.04,
+66.54,68.49,70.28,68.05,69.04,67.70,67.24,67.68,69.19,68.84,
+69.40,70.00,68.98,68.64,71.82,74.02,73.83,72.48,73.33,74.81,
+71.38,77.75,71.21,75.98,75.71,72.59,71.15,76.32,71.54,75.98,
+76.29,77.27,76.18,77.40,78.91,79.35,78.00,76.45,78.73,82.00,
+80.64,81.31,77.85,80.55,82.19,80.53,78.44,78.71,81.92,81.99,
+83.55,77.29,80.89,84.83,86.40,84.68,83.29,84.13,85.42,85.89,
+86.30,84.37,85.42,84.91,86.54,87.72,85.59,87.91,88.93,84.99,
+85.69,85.25,87.77,87.10,90.79,92.82,87.79,86.52,87.87,88.82,
+90.32,91.69,93.62,93.07,90.30,91.08,91.72,91.73,90.78,89.13,
+91.20,94.16,93.54,91.64,90.06,94.84,94.33,93.57,93.28,94.51,
+92.67,95.28,93.74,97.34,98.12,99.94,97.53,99.02,97.42,95.66,
+97.02,98.59,96.42,96.10,95.60,95.34,97.16,97.68,100.29,102.32,
+98.70,102.77,101.98,101.74,98.41,99.72,98.11,101.60,97.43,99.92,
+101.87,103.58,100.94,102.17,104.88,105.24,107.12,104.58,104.15,104.35,
+102.90,102.44,104.70,105.74,109.94,106.07,104.78,106.55,109.74,107.53,
+109.12,104.58,103.44,105.37,104.07,108.79,112.13,104.32,105.72,111.03,
+103.44,110.68,106.34,114.26,109.41,108.80,107.77,107.12,108.56,109.47,
+107.51,107.42,109.20,113.30,113.42,114.79,113.30,106.54,113.03,114.91,
+115.79,112.88,112.03,111.65,110.47,113.41,112.49,111.90,115.42,114.71,
+112.93,112.92,120.47,117.14,114.98,115.45,117.70,119.16,116.69,117.55,
+116.24,116.80,114.45,114.99,113.60,121.16,120.07,117.19,116.24,116.59,
+28.15,30.01,31.04,31.29,33.03,34.73,33.70,33.57,35.90,35.96,
+36.71,36.91,37.30,38.55,38.20,40.36,39.62,43.44,42.87,41.81,
+42.57,43.76,43.28,42.33,46.99,46.19,46.76,47.51,45.71,48.12,
+47.76,50.38,51.71,51.04,52.05,49.88,49.00,53.23,49.98,53.57,
+54.09,55.09,54.94,56.19,58.19,57.44,57.41,58.17,55.31,57.92,
+59.17,58.42,55.99,59.31,61.67,57.74,62.54,62.13,61.09,60.19,
+62.01,60.31,63.81,64.18,63.72,64.57,65.66,65.26,66.57,65.65,
+67.96,65.35,67.97,65.59,66.06,67.28,69.32,70.11,70.44,72.06,
+68.74,70.40,70.50,69.97,71.61,69.15,71.79,72.21,74.97,73.71,
+73.33,71.82,72.19,75.77,74.46,75.49,74.75,74.13,77.58,74.70,
+78.41,78.28,79.44,76.83,76.73,74.82,79.20,78.95,80.79,80.98,
+77.82,81.94,82.78,79.29,80.35,79.88,82.63,83.35,86.41,84.85,
+83.40,83.72,81.60,81.99,84.94,89.29,85.70,83.12,88.96,87.48,
+89.39,83.61,88.89,83.83,83.94,85.37,89.05,88.09,92.18,87.93,
+88.19,88.19,87.80,93.31,86.49,92.13,90.65,90.78,88.38,90.03,
+88.52,93.77,90.11,97.86,92.62,94.12,94.65,95.56,94.39,97.10,
+92.41,97.00,95.78,93.97,94.46,94.07,94.34,95.15,97.22,96.00,
+96.73,95.16,98.23,102.83,98.64,100.91,99.66,96.92,100.54,98.69,
+97.41,100.00,100.73,101.09,101.22,101.12,101.33,98.90,100.49,104.94,
+101.73,97.44,100.52,100.98,101.95,108.88,106.41,101.79,102.97,98.47,
+106.77,106.05,101.58,105.00,103.87,107.98,103.98,105.97,108.00,107.04,
+105.78,106.82,108.53,108.53,110.13,106.77,104.15,106.72,113.07,109.60,
+110.88,107.12,111.85,112.47,110.97,106.60,111.60,111.99,112.42,110.96,
+110.33,107.02,111.01,113.58,117.53,113.40,110.98,112.14,118.05,114.62,
+115.06,115.84,113.46,111.80,114.64,115.84,117.74,115.55,115.68,113.65,
+111.44,112.36,113.37,117.77,116.25,121.47,116.77,119.45,118.73,118.05,
+116.77,114.18,121.77,114.94,115.38,123.77,119.66,120.26,124.09,120.95,
+121.08,117.23,120.63,118.38,118.95,123.81,121.24,114.08,125.51,121.66,
+121.66,125.38,123.75,122.85,124.47,122.00,125.48,128.26,122.78,124.62,
+30.28,31.03,32.90,32.55,33.09,33.40,34.32,35.62,37.33,38.46,
+38.55,38.63,38.72,39.28,39.82,41.00,41.01,43.38,43.54,44.91,
+44.92,46.72,47.10,46.86,46.85,47.36,47.91,49.10,47.90,49.35,
+50.33,51.80,51.17,53.82,53.08,50.36,54.18,55.06,52.84,54.70,
+56.58,55.62,54.87,56.67,59.72,59.09,57.49,60.62,59.21,63.71,
+58.55,62.96,60.21,58.13,64.13,63.50,65.60,65.14,60.64,64.30,
+65.38,66.69,66.82,64.70,67.19,66.20,70.26,67.65,68.28,71.36,
+68.23,68.16,69.74,68.19,70.31,71.31,72.08,70.14,72.72,70.41,
+72.77,74.36,76.88,72.50,77.03,75.25,74.52,74.66,77.70,79.14,
+75.67,76.41,75.89,76.17,78.05,78.29,80.26,77.02,78.24,80.87,
+76.83,78.97,81.21,79.89,81.64,80.42,84.05,81.08,86.00,82.57,
+82.74,82.96,83.16,84.97,80.26,87.60,86.93,86.44,89.54,86.04,
+89.02,86.60,87.83,89.65,89.12,88.67,86.19,87.69,86.39,89.51,
+89.61,90.82,89.26,89.65,92.75,88.59,91.47,92.90,92.67,96.06,
+90.77,91.98,91.27,92.45,93.53,93.68,95.88,95.14,94.04,93.80,
+93.78,95.70,94.58,96.84,97.26,95.24,96.15,96.03,95.61,98.81,
+98.93,95.44,97.75,98.64,98.50,97.83,100.94,101.24,98.56,96.41,
+95.97,97.71,104.12,103.14,101.91,103.95,103.14,99.33,106.55,100.12,
+100.09,101.88,104.27,104.44,105.06,103.67,106.49,106.13,103.33,106.65,
+102.43,100.43,105.17,108.26,111.53,109.17,109.90,107.14,108.67,109.50,
+107.90,103.48,111.11,113.36,108.00,108.69,106.43,111.26,110.99,110.60,
+113.38,112.10,109.35,113.93,117.11,114.90,110.53,112.83,113.91,113.89,
+114.16,113.50,116.81,115.60,114.64,115.28,111.39,115.71,119.82,115.68,
+116.55,117.26,120.74,114.94,119.22,118.79,116.93,116.39,118.27,122.66,
+114.62,119.79,124.45,115.56,124.34,123.14,118.06,123.21,115.61,122.47,
+119.95,125.07,123.82,123.24,121.78,125.00,125.22,115.62,121.01,122.08,
+121.02,127.14,120.72,125.58,127.86,128.75,120.24,121.63,126.31,120.88,
+129.95,124.37,124.71,125.17,125.68,127.43,130.23,126.05,125.86,127.51,
+126.22,130.06,126.17,128.38,129.92,131.65,131.61,129.86,132.72,123.27,
+32.28,31.60,33.90,33.35,35.54,35.28,36.01,36.84,37.66,40.48,
+38.11,39.94,39.23,42.17,43.01,43.07,43.58,43.83,44.93,47.06,
+45.70,47.80,47.19,48.65,48.98,45.95,49.43,49.76,52.53,50.58,
+51.74,52.52,52.15,54.61,57.38,54.01,54.72,55.08,57.75,56.59,
+55.53,59.28,58.27,58.11,58.91,59.40,61.98,61.66,62.82,63.10,
+60.10,67.81,65.16,65.56,66.85,63.20,63.47,66.07,66.65,66.93,
+67.58,71.81,68.36,66.39,68.08,70.10,68.66,71.15,72.38,70.48,
+71.85,70.92,70.17,73.85,73.67,73.97,75.92,74.75,72.68,74.20,
+76.28,74.75,77.39,75.05,76.12,77.74,78.03,76.48,78.57,77.49,
+77.71,78.69,80.62,84.54,79.51,80.37,81.82,86.65,80.92,82.51,
+82.59,82.15,84.46,81.26,84.10,83.81,85.63,83.79,89.23,85.47,
+87.06,87.17,85.96,88.66,89.38,89.44,89.03,90.50,90.33,90.59,
+91.93,87.61,91.01,90.00,89.02,90.56,95.39,92.77,90.69,91.80,
+91.18,95.52,90.64,95.81,92.02,92.41,93.92,98.13,93.64,97.57,
+94.50,96.95,95.05,95.97,98.16,96.55,98.17,99.48,98.64,100.42,
+101.67,102.87,101.72,98.49,101.43,101.41,100.22,103.89,100.99,105.75,
+101.07,98.99,104.25,102.52,104.86,103.80,104.92,103.79,101.65,103.20,
+102.89,104.67,106.89,105.80,105.61,104.55,107.32,103.27,107.57,110.36,
+109.51,109.84,107.80,109.31,110.47,109.96,109.94,107.07,108.45,109.20,
+108.50,113.23,108.78,106.94,113.69,113.44,112.49,111.78,110.61,116.81,
+112.93,116.00,113.52,111.28,115.21,113.07,113.20,119.81,115.68,114.04,
+116.31,118.31,114.34,115.67,117.17,118.59,115.31,118.66,113.93,118.53,
+117.43,119.18,117.39,118.27,118.75,124.14,121.16,122.18,122.06,119.87,
+122.61,120.04,117.15,120.14,118.33,118.92,122.24,122.57,121.25,123.10,
+125.56,125.13,118.02,123.79,125.28,126.20,121.65,130.40,123.33,122.77,
+121.70,124.70,127.60,128.75,127.56,128.62,126.73,128.47,124.05,131.51,
+129.88,128.05,128.05,127.04,130.92,128.43,132.38,129.23,130.55,130.54,
+129.32,126.45,131.19,130.83,131.27,130.50,128.80,132.68,132.52,128.92,
+132.20,129.82,126.80,135.35,130.81,132.95,137.47,132.99,139.06,133.83,
+31.15,32.18,32.96,33.25,35.89,37.73,36.70,36.97,38.94,38.77,
+39.05,40.46,41.50,42.74,42.60,44.42,45.83,46.11,46.05,48.09,
+49.91,46.24,47.46,50.36,50.83,51.57,51.36,51.30,52.46,54.36,
+53.05,54.40,54.88,52.29,55.46,56.15,59.74,59.26,58.87,58.01,
+60.00,59.94,58.71,62.05,62.57,61.68,62.01,64.98,64.13,64.76,
+63.80,65.43,63.94,65.09,66.64,66.31,68.95,67.71,69.00,68.81,
+67.83,69.49,69.50,68.41,68.23,70.00,71.61,72.73,72.34,71.13,
+74.33,73.18,73.60,76.67,75.45,77.67,76.93,80.32,81.15,76.90,
+77.58,77.64,79.05,78.06,78.58,80.70,81.93,76.72,81.60,82.41,
+75.70,81.11,82.93,82.21,81.57,80.88,83.84,83.64,84.85,86.48,
+85.82,85.00,91.27,86.79,89.92,90.21,90.73,88.19,87.84,89.28,
+89.44,89.02,91.07,91.29,91.81,92.17,92.00,92.69,87.45,92.50,
+97.21,91.01,88.76,92.59,95.41,94.74,95.42,94.34,94.21,97.13,
+95.78,97.01,97.27,100.79,97.02,95.24,97.86,99.36,100.30,99.46,
+96.97,99.21,99.66,102.67,99.27,102.79,103.69,99.81,105.94,103.94,
+99.41,102.09,104.51,104.37,99.28,102.10,102.67,98.87,104.03,110.31,
+106.01,106.46,103.60,105.32,111.15,100.73,111.34,107.33,107.77,105.41,
+106.86,112.07,105.77,113.30,108.58,110.84,113.72,113.70,108.91,108.18,
+109.85,113.10,112.23,109.72,111.94,113.73,113.55,108.71,112.32,111.10,
+115.29,116.44,117.04,117.96,110.54,114.02,114.92,116.56,118.31,119.67,
+114.59,113.30,119.13,116.20,114.33,118.37,116.17,122.87,116.69,119.60,
+122.21,118.53,115.21,124.30,121.20,123.83,123.06,122.06,120.36,119.05,
+120.74,123.03,125.51,124.44,121.47,123.77,123.84,123.71,119.65,124.97,
+123.11,126.26,130.56,122.92,125.60,129.52,126.61,127.46,131.10,127.14,
+123.96,121.82,128.71,128.22,127.73,123.29,130.06,134.08,129.99,134.65,
+130.96,129.56,130.86,124.83,134.81,133.56,129.82,128.73,135.25,129.51,
+132.05,128.24,127.19,124.63,134.01,130.53,133.15,135.62,135.53,131.90,
+134.43,130.84,139.00,134.91,139.50,142.51,134.94,131.09,131.75,134.35,
+136.27,137.18,141.53,141.95,144.69,132.68,139.84,139.42,138.14,140.61,
+32.56,33.78,34.40,35.26,36.89,37.98,39.92,39.63,40.88,38.80,
+44.34,41.43,41.30,43.13,44.34,45.41,47.62,48.66,49.39,47.81,
+48.61,49.53,48.52,52.05,51.20,52.22,50.65,53.52,54.80,55.07,
+55.10,54.90,55.15,56.51,58.41,59.16,60.96,59.95,57.81,61.74,
+62.85,62.61,62.53,62.07,66.00,65.67,64.88,66.97,66.94,67.98,
+65.10,69.09,67.27,67.74,65.91,70.75,71.25,71.07,71.09,69.64,
+72.31,71.65,70.26,74.12,74.00,75.32,74.69,74.36,72.52,75.59,
+76.18,78.10,77.59,78.98,75.59,76.98,79.45,83.27,77.44,80.27,
+80.38,77.46,79.43,82.25,81.55,81.23,81.24,86.26,83.55,86.09,
+85.69,85.16,87.15,87.02,82.29,84.94,85.36,85.18,87.82,87.93,
+88.63,87.98,88.81,86.28,84.82,88.52,92.73,94.47,93.04,93.47,
+93.42,92.59,95.44,92.25,96.62,94.60,96.60,96.35,99.72,95.62,
+97.16,96.53,96.91,97.07,98.21,97.24,96.49,100.91,96.51,99.24,
+98.93,95.39,101.25,102.29,99.22,104.09,103.30,101.05,101.45,101.80,
+100.09,101.10,105.86,103.40,103.87,104.29,102.40,105.46,105.01,106.80,
+104.76,102.67,104.84,109.24,108.00,110.64,108.25,106.28,103.07,111.12,
+108.53,106.61,104.90,112.56,109.56,112.56,107.99,109.76,111.88,107.66,
+113.42,114.14,109.06,113.78,111.60,115.14,115.21,109.81,111.06,115.63,
+115.40,117.98,115.55,116.75,116.37,116.10,119.78,118.33,120.86,118.94,
+120.01,116.34,121.32,120.29,121.30,123.21,115.70,119.25,117.94,119.76,
+118.91,120.00,122.10,121.63,124.11,123.75,126.05,117.82,126.20,121.50,
+121.64,122.51,124.65,116.36,125.67,123.12,120.58,123.72,122.23,124.26,
+128.57,128.47,127.19,128.18,126.31,124.79,126.36,124.76,128.86,124.83,
+130.10,128.93,131.75,132.86,127.38,132.50,128.23,127.54,131.49,130.07,
+131.14,132.10,133.72,130.69,129.55,130.86,137.71,131.30,137.55,135.08,
+135.05,128.49,136.52,134.24,138.05,138.98,135.00,140.70,128.21,133.84,
+131.77,138.31,133.84,134.99,141.56,142.82,135.64,140.69,137.72,136.90,
+141.85,141.14,140.50,141.03,145.70,134.28,141.08,143.15,137.94,135.65,
+143.94,139.25,135.97,142.05,146.51,140.13,144.63,139.89,145.76,143.92
+};
+#endif
diff --git a/libcpp/alignment/statistics/LookupAnchorDistribution.cpp b/libcpp/alignment/statistics/LookupAnchorDistribution.cpp
new file mode 100644
index 0000000..ebab522
--- /dev/null
+++ b/libcpp/alignment/statistics/LookupAnchorDistribution.cpp
@@ -0,0 +1,58 @@
+#include "statistics/LookupAnchorDistribution.hpp"
+
+int LookupAnchorDistribution(int readLength, int minMatchLength, 
+    int accuracy, float &mn, float &sdn, float &mnab, 
+    float &sdnab) {
+
+    int kIndex, accIndex, lengthIndex;
+    int returnValue = 0;
+
+    // Major index is by accuracy
+    if (accuracy < anchorReadAccuracies[0]) {
+        returnValue = -2;
+        accuracy    = anchorReadAccuracies[0];
+    }
+    else if (accuracy >= anchorReadAccuracies[1]) {
+        returnValue = 2;
+        accuracy    = anchorReadAccuracies[1] - anchorReadAccuracies[2];
+    }
+
+    accIndex = ( ((int)accuracy) - anchorReadAccuracies[0]) / anchorReadAccuracies[2];
+
+    // middle index is by k 
+    if (minMatchLength < anchorMinKValues[0]) {
+        returnValue = -1; // signal too low
+        minMatchLength = anchorMinKValues[0];
+    }
+    else if (minMatchLength >= anchorMinKValues[1]) {
+        returnValue = 1; // signal too high
+        minMatchLength = anchorMinKValues[1] - anchorMinKValues[2]; // max match length
+    }
+
+    kIndex = (minMatchLength - anchorMinKValues[0])/ anchorMinKValues[2];
+
+    // last index is by read length
+    if (readLength < anchorReadLengths[0]){ 
+        returnValue = -3;
+        readLength = anchorReadLengths[0];
+    }
+    else if (readLength >= anchorReadLengths[1]) {
+        returnValue = 3;
+        readLength = anchorReadLengths[1] - anchorReadLengths[2]; // max read length
+    }
+
+    lengthIndex = (readLength - anchorReadLengths[0]) / anchorReadLengths[2];
+
+
+    int nLengths = (anchorReadLengths[1] - anchorReadLengths[0]) / anchorReadLengths[2];
+    int nAccuracies = (anchorReadAccuracies[1] - anchorReadAccuracies[0]) / anchorReadAccuracies[2];
+    int nAnchors = (anchorMinKValues[1] - anchorMinKValues[0]) / anchorMinKValues[2];
+    int index = accIndex*(nLengths*nAnchors) + kIndex*nLengths + lengthIndex;
+
+    mn = meanNumAnchors[index];
+    sdn = sdNumAnchors[index];
+    mnab = meanNumAnchorBases[index];
+    sdnab = sdNumAnchorBases[index];
+
+    return returnValue;
+}
diff --git a/libcpp/alignment/statistics/LookupAnchorDistribution.hpp b/libcpp/alignment/statistics/LookupAnchorDistribution.hpp
new file mode 100644
index 0000000..cfc9e35
--- /dev/null
+++ b/libcpp/alignment/statistics/LookupAnchorDistribution.hpp
@@ -0,0 +1,10 @@
+#ifndef _BLASR_LOOKUP_ANCHOR_DISTRIBUTION_HPP_
+#define _BLASR_LOOKUP_ANCHOR_DISTRIBUTION_HPP_
+
+#include "statistics/AnchorDistributionTable.hpp" // not ported
+
+int LookupAnchorDistribution(int readLength, int minMatchLength, 
+    int accuracy, float &mn, float &sdn, float &mnab, 
+    float &sdnab);
+
+#endif
diff --git a/libcpp/alignment/statistics/StatUtils.cpp b/libcpp/alignment/statistics/StatUtils.cpp
new file mode 100644
index 0000000..cc6bf79
--- /dev/null
+++ b/libcpp/alignment/statistics/StatUtils.cpp
@@ -0,0 +1,45 @@
+#include "StatUtils.hpp" 
+
+void InitializeRandomGenerator(int value) {
+  srandom((unsigned) value);
+}
+
+
+unsigned int RandomUnsignedInt(unsigned int randMax) {
+ // 
+ //  step 1, pack an unsigned integer with a random value, this 
+ //
+ unsigned int randVal = RAND_MAX * (1.0*random())/RAND_MAX;
+
+ // step 2, 
+ unsigned int lastBit = random() % 2;
+ lastBit = lastBit << ( __WORDSIZE/2-1);
+ // This should never overflow, add a 31-bit number into a 32.
+ randVal+= lastBit; 
+ double fpRandVal = 1.0*randVal;
+ return (randMax * fpRandVal / UINT_MAX);
+}
+	
+unsigned int RandomInt(int randMax) {
+  int randVal = (randMax * ((1.0*random()) / RAND_MAX));
+  return std::min(randMax-1, randVal);
+}
+
+unsigned int RandomInt(unsigned int min, unsigned int max) {
+	return RandomInt(max - min) + min;
+}
+
+float Random() {
+	return (RandomInt(0,RAND_MAX)*1.0)/RAND_MAX;
+}
+
+bool FindQNorm(float prob, float & nStdDev) {
+    if (prob < 0.5 or prob > 1.0) {
+        return false;
+    }
+    else {
+        nStdDev = qnorm[(int)((prob - 0.50) * 500)];
+        return true;
+    }
+}
+
diff --git a/libcpp/alignment/statistics/StatUtils.hpp b/libcpp/alignment/statistics/StatUtils.hpp
new file mode 100644
index 0000000..40ba2a5
--- /dev/null
+++ b/libcpp/alignment/statistics/StatUtils.hpp
@@ -0,0 +1,165 @@
+#ifndef _BLASR_STAT_UTILS_HPP_
+#define _BLASR_STAT_UTILS_HPP_
+
+#include <math.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <time.h>
+#include <vector>
+#include <algorithm>
+#include <assert.h>
+
+static const long FactorialTableLength = 21;
+
+static const long long FactorialTable[] = {
+    1L, //0
+    1L, //1
+    2L, //2
+	6L, //3
+	24L,//4
+	120L, //5
+	720L, //6
+	5040L, //7
+	40320L,//8
+	362880L, //9
+	3628800L,//10
+	39916800L,//11
+	479001600L,//12
+	6227020800LL,//13
+	87178291200LL,//14
+	1307674368000LL,//15
+	20922789888000LL,//16
+	355687428096000LL,//17
+	6402373705728000LL,//18
+	121645100408832000LL,//19
+	2432902008176640000LL//20
+};
+
+static const float qnorm[] = { 
+    0.00,  0.00250,  0.00501,  0.00751,  0.0100248,  0.0125393,  0.0150457,
+    0.0175408,  0.0200506,  0.0225647,  0.0250611, 0.0275717, 
+    0.0300891,  0.0325931,  0.0351088,  0.0376059,  0.0401181,
+    0.0426244,  0.0451313,  0.0476466,  0.0501537,  0.0526685,
+    0.0551768,  0.0576842,  0.0601966,  0.0627038,  0.0652137,
+    0.0677392,  0.0702467,  0.0727575,  0.0752699,  0.0777852,
+    0.080295,  0.0828113,  0.0853292,  0.0878418,  0.0903688,
+    0.0928765,  0.095392,  0.0979195,  0.10043,  0.102954,
+    0.105478,  0.107994,  0.110512,  0.113035,  0.115563,
+    0.118083,  0.120607,  0.123137,  0.125664,  0.128186,
+    0.130713,  0.133244,  0.135772,  0.138305,  0.140837,
+    0.143367,  0.145904,  0.14843,  0.150967,  0.153507,
+    0.15604,  0.158573,  0.161116,  0.163651,  0.166199,
+    0.168748,  0.171287,  0.173822,  0.176371,  0.178922,
+    0.181467,  0.184019,  0.186569,  0.189112,  0.19167,
+    0.194223,  0.196777,  0.199337,  0.201891,  0.204451,
+    0.207017,  0.209579,  0.212134,  0.214704,  0.217263,
+    0.219839,  0.222406,  0.224971,  0.227549,  0.230116,
+    0.232695,  0.235260,  0.237849,  0.240428,  0.243002,
+    0.245581,  0.248173,  0.250756,  0.25334,  0.255933,
+    0.258520,  0.261118,  0.26371,  0.266315,  0.268900,
+    0.271509,  0.274117,  0.276717,  0.279314,  0.281921,
+    0.284532,  0.287145,  0.289754,  0.292374,  0.294996,
+    0.29761,  0.300232,  0.302859,  0.305487,  0.308105,
+    0.310732,  0.313366,  0.316003,  0.318635,  0.321276,
+    0.323913,  0.326563,  0.329201,  0.331857,  0.334502,
+    0.337157,  0.339807,  0.342461,  0.345122,  0.347787,
+    0.350451,  0.353119,  0.355785,  0.358454,  0.361132,
+    0.363806,  0.366484,  0.36917,  0.371855,  0.374543,
+    0.377232,  0.379927,  0.382624,  0.385328,  0.388027,
+    0.39072,  0.393437,  0.396148,  0.398857,  0.401579,
+    0.404289,  0.407016,  0.409731,  0.412465,  0.415197,
+    0.417922,  0.420666,  0.423403,  0.426148,  0.428892,
+    0.431646,  0.434391,  0.437152,  0.439914,  0.442672,
+    0.44544,  0.448219,  0.450981,  0.45376,  0.45654,
+    0.459323,  0.462117,  0.464905,  0.467698,  0.470491,
+    0.473297,  0.476105,  0.478915,  0.48172,  0.484549,
+    0.487361,  0.490189,  0.493015,  0.495853,  0.498682,
+    0.501528,  0.504372,  0.507226,  0.510075,  0.512938,
+    0.515798,  0.518651,  0.521522,  0.524401,  0.527279,
+    0.530169,  0.533049,  0.53594,  0.53883,  0.541737,
+    0.544649,  0.547551,  0.550462,  0.553383,  0.556308,
+    0.559237,  0.562176,  0.565104,  0.568053,  0.570997,
+    0.573953,  0.576911,  0.579874,  0.582846,  0.585819,
+    0.588790,  0.591776,  0.594768,  0.597768,  0.600759,
+    0.60376,  0.606775,  0.60979,  0.612817,  0.615842,
+    0.618879,  0.621914,  0.624957,  0.62800,  0.631069,
+    0.63412,  0.637195,  0.640264,  0.643347,  0.646437,
+    0.649525,  0.652621,  0.655723,  0.658838,  0.661952,
+    0.665073,  0.668203,  0.671345,  0.674482,  0.677636,
+    0.680795,  0.683962,  0.68713,  0.690304,  0.69349,
+    0.696681,  0.699881,  0.703089,  0.706308,  0.709528,
+    0.712753,  0.715985,  0.719224,  0.722473,  0.725735,
+    0.729009,  0.73227,  0.73555,  0.738844,  0.74214,
+    0.745449,  0.748769,  0.752081,  0.75541,  0.758751,
+    0.762107,  0.765458,  0.768822,  0.772195,  0.775574,
+    0.778965,  0.782367,  0.785774,  0.789192,  0.792612,
+    0.796053,  0.799507,  0.802953,  0.80642,  0.809898,
+    0.813384,  0.816873,  0.820371,  0.823897,  0.827412,
+    0.830958,  0.83449,  0.838056,  0.841624,  0.84519,
+    0.848787,  0.852385,  0.855992,  0.859611,  0.86325,
+    0.866898,  0.870544,  0.874213,  0.877899,  0.881584,
+    0.885292,  0.889005,  0.892736,  0.896476,  0.900224,
+    0.903991,  0.907766,  0.91156,  0.915364,  0.91918,
+    0.92301,  0.926854,  0.93071,  0.93458,  0.938479,
+    0.94237,  0.946296,  0.950225,  0.954165,  0.958123,
+    0.962092,  0.966083,  0.970097,  0.97411,  0.978152,
+    0.98220,  0.986279,  0.990355,  0.994453,  0.99857,
+    1.00271,  1.00686,  1.01103,  1.01522,  1.01942,
+    1.02365,  1.02789,  1.03215,  1.03643,  1.04073,
+    1.04504,  1.04938,  1.05374,  1.05812,  1.06251,
+    1.06693,  1.07137,  1.07583,  1.08031,  1.08482,
+    1.08934,  1.09389,  1.09846,  1.10306,  1.10768,
+    1.11232,  1.11698,  1.12167,  1.12639,  1.13113,
+    1.13589,  1.14068,  1.14550,  1.15034,  1.15522,
+    1.16011,  1.16504,  1.17000,  1.17498,  1.18000,
+    1.18504,  1.19011,  1.19522,  1.20035,  1.20552,
+    1.21072,  1.21596,  1.22122,  1.22652,  1.23186,
+    1.23723,  1.24264,  1.24808,  1.25356,  1.25908,
+    1.26464,  1.27023,  1.27587,  1.28155,  1.28727,
+    1.29303,  1.29883,  1.30468,  1.31057,  1.31651,
+    1.32250,  1.32853,  1.33462,  1.34075,  1.34693,
+    1.35317,  1.35946,  1.36580,  1.37220,  1.37865,
+    1.38517,  1.39174,  1.39837,  1.40507,  1.41183,
+    1.41865,  1.42554,  1.43250,  1.43953,  1.44663,
+    1.45380,  1.46105,  1.46838,  1.47579,  1.48328,
+    1.49085,  1.49851,  1.50626,  1.51410,  1.52203,
+    1.53006,  1.53819,  1.54643,  1.55477,  1.56322,
+    1.57178,  1.58046,  1.58926,  1.59819,  1.60724,
+    1.61643,  1.62576,  1.63523,  1.64485,  1.65462,
+    1.66456,  1.67466,  1.68494,  1.69539,  1.70604,
+    1.71688,  1.72793,  1.73919,  1.75068,  1.76241,
+    1.77438,  1.78661,  1.79911,  1.81191,  1.82500,
+    1.83842,  1.85217,  1.86629,  1.88079,  1.89569,
+    1.91103,  1.92683,  1.94313,  1.95996,  1.97736,
+    1.99539,  2.01409,  2.03352,  2.05374,  2.07485,
+    2.09692,  2.12007,  2.14441,  2.17009,  2.19728,
+    2.22621,  2.25712,  2.29036,  2.32634,  2.36561,
+    2.40891,  2.45726,  2.51214,  2.57582,  2.65206,
+    2.74778,  2.87816,  3.09023,  10000};
+
+
+inline int Choose(int a, int b);
+
+void InitializeRandomGenerator(int value);
+
+template<typename T>
+void MeanVar(std::vector<T> &values, float &mean, float &var);
+
+inline void InitializeRandomGeneratorWithTime() {
+	time_t t;
+    srandom((unsigned) time(&t));
+}
+
+unsigned int RandomUnsignedInt(unsigned int randMax);
+
+unsigned int RandomInt(int randMax);
+
+unsigned int RandomInt(unsigned int min, unsigned int max);
+
+float Random();
+
+bool FindQNorm(float prob, float &nStdDev);
+
+#include "StatUtilsImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/statistics/StatUtilsImpl.hpp b/libcpp/alignment/statistics/StatUtilsImpl.hpp
new file mode 100644
index 0000000..3d1cc76
--- /dev/null
+++ b/libcpp/alignment/statistics/StatUtilsImpl.hpp
@@ -0,0 +1,57 @@
+#ifndef _BLASR_STAT_UTILS_IMPL_HPP_
+#define _BLASR_STAT_UTILS_IMPL_HPP_
+
+#include <vector>
+#include <time.h>
+
+inline int Choose(int a, int b) {
+	// A quick choose for small values.
+	assert(a >= b);
+	if (a < FactorialTableLength and b < FactorialTableLength) {
+		return (FactorialTable[a] /
+                (FactorialTable[b] * FactorialTable[a-b]));
+	} else {
+		//
+		// Less quick choose for numerically stable values.
+		//
+		unsigned long al =a, bl=b, fact=0;
+		fact = al;
+		//
+		// The full value of b! must be able to be computed.
+		//
+		if (b >= FactorialTableLength) {
+			return 0;
+		}
+		while (al > bl) {
+			--al;
+			if (ULONG_MAX / al < fact) {
+				// there is overflow in the computation of a!/(a-b)!
+				return 0;
+			}
+			else {
+				fact = fact * al;
+			}
+		}
+		return fact / FactorialTable[b];
+	}
+}
+
+
+template<typename T>
+void MeanVar(std::vector<T> &values, float &mean, float &var) {
+  T sum = 0;
+  T sumsq = 0;
+  int i;
+  if (values.size() == 0) {
+    mean = 0; var = 0;
+    return;
+  }
+  for (i = 0; i < values.size(); i++) {
+    sum += values[i];
+    sumsq += values[i]*values[i];
+  }
+  mean = (1.0*sum) / values.size();
+  var  = sumsq / values.size() - (mean*mean);
+}
+
+#endif
diff --git a/libcpp/alignment/statistics/VarianceAccumulator.hpp b/libcpp/alignment/statistics/VarianceAccumulator.hpp
new file mode 100644
index 0000000..068bc62
--- /dev/null
+++ b/libcpp/alignment/statistics/VarianceAccumulator.hpp
@@ -0,0 +1,28 @@
+#ifndef _BLASR_VARIANCE_ACCUMULATOR_HPP_
+#define _BLASR_VARIANCE_ACCUMULATOR_HPP_
+
+template<typename T>
+class VarianceAccumulator {
+public:
+    int nSamples;
+    T sumSqVal;
+    T sumVal;
+    T maxVal;
+    T minVal;
+
+    VarianceAccumulator<T>();
+
+    T GetMean();
+
+    T GetVariance();
+
+    void Reset();
+
+    float GetNStdDev(T value);
+
+    void Append(T v);
+};
+
+#include "statistics/VarianceAccumulatorImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/statistics/VarianceAccumulatorImpl.hpp b/libcpp/alignment/statistics/VarianceAccumulatorImpl.hpp
new file mode 100644
index 0000000..98bda35
--- /dev/null
+++ b/libcpp/alignment/statistics/VarianceAccumulatorImpl.hpp
@@ -0,0 +1,60 @@
+#ifndef _BLASR_VARIANCE_ACCUMULATOR_IMPL_HPP_
+#define _BLASR_VARIANCE_ACCUMULATOR_IMPL_HPP_
+
+template<typename T>
+VarianceAccumulator<T>::
+VarianceAccumulator() {
+    Reset();
+}
+
+template<typename T>
+void VarianceAccumulator<T>::Reset() {
+    sumSqVal = 0;
+    sumVal   = 0;
+    nSamples = 0;
+    maxVal = minVal = 0;
+}
+
+template<typename T>
+T VarianceAccumulator<T>::
+GetMean() {return ((1.0)*sumVal)/nSamples;}
+
+template<typename T>
+T VarianceAccumulator<T>::
+GetVariance() {
+    return (1.0*sumSqVal)/nSamples -  GetMean()*GetMean();
+}
+ 
+template<typename T>
+float VarianceAccumulator<T>::
+GetNStdDev(T value) {
+    T variance = GetVariance();
+    T mean     = GetMean();
+    if (variance > 0) {
+        return fabs(value - mean)/(sqrt(variance));
+    }
+    else {
+        return 0;
+    }
+}
+
+template<typename T>
+void VarianceAccumulator<T>::
+Append(T v) {
+    if (nSamples == 0) {
+        maxVal = minVal = v;
+    }
+    else {
+        if (maxVal < v) {
+            maxVal = v;
+        }
+        if (minVal > v) {
+            minVal = v;
+        }
+    }
+    sumSqVal += v*v;
+    sumVal   += v;
+    nSamples++;
+}
+
+#endif
diff --git a/libcpp/alignment/statistics/cdfs.cpp b/libcpp/alignment/statistics/cdfs.cpp
new file mode 100644
index 0000000..ab37322
--- /dev/null
+++ b/libcpp/alignment/statistics/cdfs.cpp
@@ -0,0 +1,53 @@
+#include "cdfs.hpp"
+	
+float NormalCDF(float mu, float sigmaSq, float x) {
+    float nStdDev = (x - mu)/sqrt(sigmaSq);
+    if ((int) nStdDev <= -10.0) return 0;
+    if ((int) nStdDev >= 10.0) return 1;
+
+    int cdfindex = 1000 + 100*nStdDev;
+    assert(cdfindex >= 0);
+    assert(cdfindex <= 2000);
+    if (cdfindex == 2000) {
+        return 1;
+    }
+    //	cout << "nstdev: " << nStdDev << " mu " << mu 
+    //       << " sigma " << sigmaSq << " x " << x 
+    //       << " norm cdf index: " << cdfindex << endl;
+    return NormCDFTable[cdfindex];
+}
+
+
+float PoissonCDF(float lambda, int a, int b) {
+	float cdf = 0;
+	int i;
+	for (i = a; i <= b; i++ ){
+		// cout << "poiss " << lambda << ", " << i 
+        //      << " " << Poisson(lambda, i) << endl;
+		cdf += Poisson(lambda, i);
+	}
+	return cdf;
+}
+
+
+float PoissonCDF(float lambda, int a) {
+
+	float cdf = 0;
+	int i;
+	float p;
+	float epsilon =0.000000000001;
+	if (lambda > (int)(FactorialTableLength*2/3)) {
+		// lambda is too large, use normal approximation.
+		// cout << "using table: lambda: " << lambda 
+        //      << " a: " << a << endl;
+		return NormalCDF(lambda, lambda, a);
+	}
+	
+	for (i = 0; i <= a; i++ ){
+		p = Poisson(lambda, i);
+		if (p < epsilon and i > (int) lambda) break;
+		// cout << "p: " << p << endl;
+		cdf += p;
+	}
+	return cdf;
+}
diff --git a/libcpp/alignment/statistics/cdfs.hpp b/libcpp/alignment/statistics/cdfs.hpp
new file mode 100644
index 0000000..b7ac3d2
--- /dev/null
+++ b/libcpp/alignment/statistics/cdfs.hpp
@@ -0,0 +1,418 @@
+#ifndef _BLASR_CDFS_HPP_
+#define _BLASR_CDFS_HPP_
+
+#include "pdfs.hpp"
+
+static const float NormCDFTable[2000] = { 
+	7.61985302416053e-24, 8.42908720044307e-24, 9.32333910390851e-24, 1.03114418389443e-23, 1.14031357813280e-23,
+	1.26091606702069e-23, 1.39413569342072e-23, 1.54127771659480e-23, 1.70378087485724e-23, 1.88323087358676e-23,
+	2.08137521949321e-23, 2.30013953380610e-23, 2.54164548995384e-23, 2.80823053544230e-23, 3.10246957313482e-23,
+	3.42719879411367e-23, 3.78554187290007e-23, 4.18093875618591e-23, 4.61717729854569e-23, 5.09842802303871e-23,
+	5.62928231137653e-23, 6.21479435763827e-23, 6.860527251602e-23, 7.57260359288958e-23, 8.3577610755683e-23,
+	9.22341352493942e-23, 1.01777179142962e-22, 1.12296479398304e-22, 1.23890747870050e-22, 1.36668557820343e-22,
+	1.50749316881020e-22, 1.6626433478118e-22, 1.83357994947588e-22, 2.02189039948453e-22, 2.22931981695015e-22,
+	2.45778648347233e-22, 2.70939880997893e-22, 2.98647394442484e-22, 3.29155817689778e-22, 3.62744931340731e-22,
+	3.99722120572624e-22, 4.40425064223392e-22, 4.85224682392038e-22, 5.34528367069058e-22, 5.88783522602465e-22,
+	6.48481445307726e-22, 7.14161574262827e-22, 7.86416148313604e-22, 8.65895307572446e-22, 9.53312681249342e-22,
+	1.04945150753626e-21, 1.15517133550207e-21, 1.27141536357825e-21, 1.39921847426015e-21, 1.53971603015202e-21,
+	1.69415350248814e-21, 1.86389700981111e-21, 2.05044485163175e-21, 2.25544012968370e-21, 2.48068455788088e-21,
+	2.72815357134612e-21, 3.00001285497641e-21, 3.29863642301526e-21, 3.62662639309896e-21, 3.98683461131598e-21,
+	4.38238629906651e-21, 4.81670590802906e-21, 5.29354538645474e-21, 5.81701507843054e-21, 6.39161749781974e-21,
+	7.02228424044163e-21, 7.71441632185196e-21, 8.4739282539989e-21, 9.30729620224586e-21, 1.02216105949631e-20,
+	1.12246335913280e-20, 1.23248618493586e-20, 1.35315950758093e-20, 1.48550108826456e-20, 1.63062465217032e-20,
+	1.78974881201405e-20, 1.96420680947798e-20, 2.15545714837844e-20, 2.36509519997439e-20, 2.59486586796199e-20,
+	2.84667740846022e-20, 3.12261650872937e-20, 3.42496473753623e-20, 3.75621649004811e-20, 4.1190985609727e-20,
+	4.51659149143546e-20, 4.95195284787818e-20, 5.42874260516386e-20, 5.95085082117206e-20, 6.52252780657133e-20,
+	7.1484170112697e-20, 7.83359086839063e-20, 8.5835898576284e-20, 9.4044650726485e-20, 1.03028246019560e-19,
+	1.12858840595384e-19, 1.23615216307614e-19, 1.35383380306580e-19, 1.48257218061103e-19, 1.62339204507009e-19,
+	1.77741178414554e-19, 1.94585185505699e-19, 2.13004396328083e-19, 2.33144105408587e-19, 2.55162818769100e-19,
+	2.79233437493965e-19, 3.05544545696482e-19, 3.34301811945149e-19, 3.65729513983357e-19, 4.00072197414327e-19,
+	4.37596479930904e-19, 4.78593013653989e-19, 5.23378619209301e-19, 5.7229860632712e-19, 6.25729297000645e-19,
+	6.84080768593555e-19, 7.47799835754742e-19, 8.1737329158706e-19, 8.93331430237564e-19, 9.76251874938821e-19,
+	1.06676373754749e-18, 1.16555213780823e-18, 1.27336311293298e-18, 1.39100895064098e-18, 1.51937398157053e-18,
+	1.65942086996478e-18, 1.81219744477020e-18, 1.97884411678722e-18, 2.16060193129749e-18, 2.35882130968722e-18,
+	2.57497153801189e-18, 2.81065106523422e-18, 3.06759867904084e-18, 3.34770563273514e-18, 3.65302880274925e-18,
+	3.98580496284818e-18, 4.34846626815861e-18, 4.74365704977974e-18, 5.17425202897168e-18, 5.64337606881557e-18,
+	6.15442559085038e-18, 6.71109179457108e-18, 7.31738582887958e-18, 7.97766607668324e-18, 8.69666772689607e-18,
+	9.47953482220332e-18, 1.03318549861686e-17, 1.12596970496900e-17, 1.22696518145366e-17, 1.33688762108225e-17,
+	1.45651411259094e-17, 1.58668832044827e-17, 1.72832609435602e-17, 1.88242154320746e-17, 2.05005361125985e-17,
+	2.23239319728804e-17, 2.43071086073182e-17, 2.64638516234818e-17, 2.88091169065084e-17, 3.13591282948427e-17,
+	3.41314832645815e-17, 3.71452672668869e-17, 4.04211774137699e-17, 4.39816562623235e-17, 4.78510365064786e-17,
+	5.20556974489026e-17, 5.66242341940844e-17, 6.15876405773299e-17, 6.69795069237318e-17, 7.2836233816555e-17,
+	7.91972631464248e-17, 8.61053278116287e-17, 9.36067215463159e-17, 1.01751590467945e-16, 1.10594248058595e-16,
+	1.20193515427359e-16, 1.30613088843666e-16, 1.41921936684837e-16, 1.54194728106090e-16, 1.67512295918692e-16,
+	1.81962136352663e-16, 1.97638948585499e-16, 2.14645217138836e-16, 2.33091840481832e-16, 2.5309880943477e-16,
+	2.74795939239823e-16, 2.98323659460026e-16, 3.23833866183229e-16, 3.51490841347056e-16, 3.81472244365282e-16,
+	4.13970181627315e-16, 4.49192359862693e-16, 4.87363329813632e-16, 5.28725827143121e-16, 5.73542218025806e-16,
+	6.22096057427178e-16, 6.74693768675356e-16, 7.31666453572489e-16, 7.93371842982395e-16, 8.60196398570778e-16,
+	9.32557577168123e-16, 1.01090627007634e-15, 1.09572943055325e-15, 1.18755290368805e-15, 1.28694447393013e-15,
+	1.39451714665926e-15, 1.51093268139136e-15, 1.63690539550678e-15, 1.77320625877395e-15, 1.92066730042609e-15,
+	2.08018635213939e-15, 2.25273215196613e-15, 2.43934983610145e-15, 2.64116684731894e-15, 2.85939929100417e-15,
+	3.0953587719587e-15, 3.35045974754833e-15, 3.62622743534104e-15, 3.92430631613157e-15, 4.24646927619696e-15,
+	4.59462743577860e-15, 4.97084071416196e-15, 5.37732918533406e-15, 5.81648528206159e-15, 6.29088691036376e-15,
+	6.80331154077401e-15, 7.35675134750924e-15, 7.9544294717215e-15, 8.59981749040868e-15, 9.29665417833992e-15,
+	1.00489656565263e-14, 1.08610870273690e-14, 1.17376856036716e-14, 1.26837858462427e-14, 1.37047961328694e-14,
+	1.48065374900481e-14, 1.59952744280531e-14, 1.72777480297408e-14, 1.86612114539743e-14, 2.01534680257531e-14,
+	2.17629120970858e-14, 2.34985728754111e-14, 2.53701614299986e-14, 2.73881211013013e-14, 2.95636815537589e-14,
+	3.19089167291090e-14, 3.44368069749374e-14, 3.71613056420548e-14, 4.00974104643949e-14, 4.32612400565811e-14,
+	4.66701158871906e-14, 5.03426501101292e-14, 5.42988396625522e-14, 5.85601670654849e-14, 6.3149708392861e-14,
+	6.80922489062002e-14, 7.34144068857165e-14, 7.91447662244323e-14, 8.53140183899803e-14, 9.19551143994013e-14,
+	9.91034274954757e-14, 1.0679692725923e-13, 1.15076365942292e-13, 1.23985477855031e-13, 1.33571192702046e-13,
+	1.43883863815759e-13, 1.54977512301920e-13, 1.66910088177930e-13, 1.79743749656217e-13, 1.93545161800965e-13,
+	2.08385815867207e-13, 2.24342370717358e-13, 2.41497017801669e-13, 2.59937871286364e-13, 2.79759385016643e-13,
+	3.01062798111745e-13, 3.23956611106135e-13, 3.48557094675241e-13, 3.7498883311623e-13, 4.03385304894755e-13,
+	4.33889502717806e-13, 4.66654595751316e-13, 5.01844636769645e-13, 5.3963531720292e-13, 5.80214773238327e-13,
+	6.23784446333159e-13, 6.70560001711864e-13, 7.20772308646748e-13, 7.74668486563648e-13, 8.32513021270262e-13,
+	8.94588955876992e-13, 9.6119916126894e-13, 1.03266769129427e-12, 1.10934122815914e-12, 1.19159062386450e-12,
+	1.27981254388584e-12, 1.37443121968512e-12, 1.47590031705553e-12, 1.58470492773607e-12, 1.70136369219568e-12,
+	1.82643106197697e-12, 1.96049971050927e-12, 2.10420310185185e-12, 2.25821822741171e-12, 2.42326852129899e-12,
+	2.60012696563817e-12, 2.78961939784764e-12, 2.99262803263505e-12, 3.21009521223458e-12, 3.44302739923701e-12,
+	3.69249942723561e-12, 3.95965902543588e-12, 4.24573163435442e-12, 4.55202553076802e-12, 4.8799372811693e-12,
+	5.23095754414459e-12, 5.60667724331564e-12, 6.00879413378503e-12, 6.43911978639591e-12, 6.89958701556968e-12,
+	7.39225777801782e-12, 7.91933157124842e-12, 8.48315436250203e-12, 9.08622808056533e-12, 9.7312207048268e-12,
+	1.04209769879652e-11, 1.11585298507993e-11, 1.19471124900909e-11, 1.27901712424794e-11, 1.36913792502502e-11,
+	1.46546509773028e-11, 1.56841576264994e-11, 1.67843435125431e-11, 1.79599434476731e-11, 1.92160012007750e-11,
+	2.05578890939952e-11, 2.19913288046425e-11, 2.35224134440417e-11, 2.51576309891186e-11, 2.69038891468201e-11,
+	2.87685417360433e-11, 3.07594166765647e-11, 3.28848456795426e-11, 3.51536957395174e-11, 3.75754025334884e-11,
+	4.01600058385912e-11, 4.29181870861797e-11, 4.58613091767249e-11, 4.90014586869096e-11, 5.23514906076399e-11,
+	5.59250757594271e-11, 5.97367510397311e-11, 6.38019726654473e-11, 6.81371725827341e-11, 7.27598182259036e-11,
+	7.76884758170981e-11, 8.29428774090212e-11, 8.85439918840776e-11, 9.45141001349502e-11, 1.00876874663930e-10,
+	1.07657463851216e-10, 1.14882581156030e-10, 1.22580599528633e-10, 1.30781651326424e-10, 1.39517734043067e-10,
+	1.48822822176231e-10, 1.58732985576987e-10, 1.69286514642305e-10, 1.80524052731342e-10, 1.92488736206550e-10,
+	2.05226342521894e-10, 2.18785446802903e-10, 2.33217587386751e-10, 2.48577440815301e-10, 2.6492300679994e-10,
+	2.82315803704329e-10, 3.00821075119684e-10, 3.20508008137342e-10, 3.41449963954737e-10, 3.63724721484069e-10,
+	3.87414734667567e-10, 4.12607404239677e-10, 4.3939536471467e-10, 4.67876787418161e-10, 4.98155700423128e-10,
+	5.30342326294884e-10, 5.64553438595807e-10, 6.00912738148843e-10, 6.39551250109663e-10, 6.80607742950414e-10,
+	7.24229170513764e-10, 7.70571138354246e-10, 8.19798395645136e-10, 8.72085353992974e-10, 9.27616634569113e-10,
+	9.86587645037698e-10, 1.04920518783315e-09, 1.11568810141717e-09, 1.18626793622573e-09, 1.26118966710109e-09,
+	1.34071244409187e-09, 1.42511038359657e-09, 1.51467340192265e-09, 1.60970809343425e-09, 1.71053865556700e-09,
+	1.81750786309943e-09, 1.93097809418531e-09, 2.05133241077260e-09, 2.17897569616056e-09, 2.31433585257856e-09,
+	2.45786506180803e-09, 2.61004111201292e-09, 2.77136879409463e-09, 2.94238137104436e-09, 3.12364212393002e-09,
+	3.31574597832617e-09, 3.51932121517463e-09, 3.73503127024975e-09, 3.96357662659765e-09, 4.20569680452203e-09,
+	4.46217245390161e-09, 4.73382755384558e-09, 5.02153172492455e-09, 5.3262026594555e-09, 5.64880867557094e-09,
+	5.99037140106353e-09, 6.35196859327198e-09, 6.73473710155753e-09, 7.13987597921841e-09, 7.56864975199771e-09,
+	8.02239185066354e-09, 8.50250821547506e-09, 9.01048108069906e-09, 9.54787294770427e-09, 1.01163307555414e-08,
+	1.07175902583109e-08, 1.13534806190322e-08, 1.20259292301549e-08, 1.27369667712999e-08, 1.34887325152785e-08,
+	1.42834798939228e-08, 1.51235823357610e-08, 1.60115393880909e-08, 1.69499831365509e-08, 1.79416849358471e-08,
+	1.89895624658877e-08, 2.00966871281765e-08, 2.12662917979592e-08, 2.25017789482686e-08, 2.38067291627004e-08,
+	2.51849100544611e-08, 2.66402856099673e-08, 2.81770259760399e-08, 2.97995177105363e-08, 3.15123745170822e-08,
+	3.33204484854287e-08, 3.5228841859843e-08, 3.72429193588712e-08, 3.93683210707590e-08, 4.16109759498197e-08,
+	4.3977115940059e-08, 4.64732907534413e-08, 4.91063833312853e-08, 5.18836260184242e-08, 5.48126174809566e-08,
+	5.79013403996459e-08, 6.1158179972306e-08, 6.4591943259825e-08, 6.82118794118624e-08, 7.20277008096596e-08,
+	7.60496051648871e-08, 8.02882986149588e-08, 8.47550198568288e-08, 8.94615653629075e-08, 9.44203157244297e-08,
+	9.96442631693347e-08, 1.05147040303541e-07, 1.10942950126346e-07, 1.17046997372632e-07, 1.23474921236516e-07,
+	1.30243229533202e-07, 1.37369234357842e-07, 1.44871089302508e-07, 1.52767828294566e-07, 1.61079406122137e-07,
+	1.6982674071476e-07, 1.79031757249834e-07, 1.8871743415806e-07, 1.98907851103713e-07, 2.09628239018370e-07,
+	2.20905032269544e-07, 2.327659230486e-07, 2.4523991806537e-07, 2.58357397639973e-07, 2.72150177285582e-07,
+	2.86651571879194e-07, 3.01896462520848e-07, 3.17921366185283e-07, 3.34764508273617e-07, 3.52465898176424e-07,
+	3.71067407963333e-07, 3.90612854318327e-07, 4.11148083843931e-07, 4.32721061861702e-07, 4.55381964840732e-07,
+	4.79183276590321e-07, 5.04179888357536e-07, 5.30429202975094e-07, 5.57991243209782e-07, 5.86928764466638e-07,
+	6.17307372009198e-07, 6.49195642861335e-07, 6.82665252561663e-07, 7.177911069469e-07, 7.54651479146372e-07,
+	7.93328151975595e-07, 8.3390656592291e-07, 8.76475972929203e-07, 9.21129596167143e-07, 9.67964796032733e-07,
+	1.01708324256870e-06, 1.06859109454593e-06, 1.12259918543618e-06, 1.17922321651640e-06, 1.23858395735247e-06,
+	1.30080745391728e-06, 1.36602524460614e-06, 1.43437458442013e-06, 1.50599867759616e-06, 1.58104691897051e-06,
+	1.65967514437147e-06, 1.74204589034466e-06, 1.82832866352416e-06, 1.91870021997090e-06, 2.01334485480934e-06,
+	2.11245470250285e-06, 2.21623004811754e-06, 2.32487964993441e-06, 2.43862107377942e-06, 2.55768103945153e-06,
+	2.68229577963886e-06, 2.81271141172421e-06, 2.94918432289151e-06, 3.09198156895618e-06, 3.24138128735339e-06,
+	3.39767312473006e-06, 3.56115867959756e-06, 3.73215196051449e-06, 3.9109798602807e-06, 4.09798264663636e-06,
+	4.29351446997187e-06, 4.49794388856792e-06, 4.71165441189724e-06, 4.93504506253327e-06, 5.16853095722413e-06,
+	5.41254390770387e-06, 5.66753304182674e-06, 5.93396544562466e-06, 6.2123268269015e-06, 6.50312220099279e-06,
+	6.80687659933406e-06, 7.12413580149534e-06, 7.45546709135513e-06, 7.80146003810134e-06, 8.16272730276308e-06,
+	8.53990547099181e-06, 8.933655912827e-06, 9.34466567019636e-06, 9.77364837291759e-06, 1.02213451839841e-05,
+	1.06885257749344e-05, 1.11759893321206e-05, 1.16845655947074e-05, 1.22151159252530e-05, 1.27685344137350e-05,
+	1.33457490159063e-05, 1.39477227268813e-05, 1.45754547908670e-05, 1.52299819479779e-05, 1.59123797190822e-05,
+	1.66237637296523e-05, 1.73652910736041e-05, 1.81381617181309e-05, 1.89436199505532e-05, 1.97829558682240e-05,
+	2.06575069125468e-05, 2.15686594481806e-05, 2.25178503885254e-05, 2.35065688685956e-05, 2.45363579664098e-05,
+	2.56088164740415e-05, 2.67256007194921e-05, 2.78884264405639e-05, 2.90990707119310e-05, 3.03593739266182e-05,
+	3.16712418331199e-05, 3.30366476294024e-05, 3.44576341150531e-05, 3.59363159028538e-05, 3.74748816910734e-05,
+	3.90755965977875e-05, 4.07408045585508e-05, 4.24729307887612e-05, 4.42744843120707e-05, 4.61480605562088e-05,
+	4.80963440176028e-05, 5.01221109961885e-05, 5.22282324018202e-05, 5.44176766336997e-05, 5.66935125342568e-05,
+	5.90589124189226e-05, 6.15171551832553e-05, 6.40716294888745e-05, 6.67258370296846e-05, 6.94833958798653e-05,
+	7.234804392512e-05, 7.53236423786833e-05, 7.8414179383585e-05, 8.16237737026862e-05, 8.4956678497998e-05,
+	8.84172852008039e-05, 9.20101274741054e-05, 9.57398852689147e-05, 9.96113889759167e-05, 0.000103629623674031,
+	0.000107799733477388, 0.000112127025982247, 0.000116616976815368, 0.000121275234285358, 0.000126107624138487,
+	0.000131120154420485, 0.000136319020445802, 0.000141710609875819, 0.000147301507907473, 0.000153098502573756,
+	0.000159108590157534, 0.000165338980720110, 0.000171797103745931, 0.000178490613904847, 0.000185427396933278,
+	0.000192615575635633, 0.00020006351600732, 0.000207779833480621, 0.000215773399294718, 0.000224053346991093,
+	0.000232629079035525, 0.000241510273567836, 0.000250706891280538, 0.000260229182427467, 0.000270087693963475,
+	0.000280293276816177, 0.000290857093290744, 0.000301790624608638, 0.0003131056785812, 0.000324814397418878,
+	0.000336929265676882, 0.000349463118337972, 0.000362429149033044, 0.000375840918400083, 0.000389712362582032,
+	0.000404057801864022, 0.00041889194945037, 0.000434229920381655, 0.000450087240592117, 0.00046647985610755,
+	0.000483424142383777, 0.000500936913785722, 0.000519035433206972, 0.000537737421829696, 0.000557061069024622,
+	0.000577025042390767, 0.000597648497934415, 0.000618951090386836, 0.000640952983660057, 0.000663674861439968,
+	0.000687137937915848, 0.000711363968645365, 0.000736375261553932, 0.000762194688067235, 0.000788845694375573,
+	0.000816352312828564, 0.000844739173458628, 0.000874031515631568, 0.00090425519982234, 0.000935436719514101,
+	0.000967603213218358, 0.00100078247661401, 0.00103500297480284, 0.00107029385467892, 0.00110668495740925,
+	0.0011442068310227, 0.00118289074310441, 0.00122276869359226, 0.0012638734276723, 0.00130623844876947,
+	0.00134989803163009, 0.00139488723549225, 0.00144124191734002, 0.00148899874523747, 0.00153819521173806,
+	0.00158886964736487, 0.001641061234157, 0.00169481001927726, 0.0017501569286761, 0.00180714378080643,
+	0.00186581330038404, 0.00192620913218786, 0.00198837585489433, 0.00205235899493975, 0.00211820504040462,
+	0.00218596145491324, 0.00225567669154232, 0.00232740020673155, 0.00240118247418925, 0.00247707499878586,
+	0.00255513033042793, 0.00263540207790495, 0.00271794492270126, 0.00280281463276503, 0.00289006807622615,
+	0.00297976323505456, 0.00307195921865049, 0.0031667162773578, 0.00326409581589132, 0.00336416040666919,
+	0.00346697380304067, 0.00357260095239974, 0.00368110800917499, 0.00379256234768549, 0.00390703257485278,
+	0.00402458854275831, 0.00414530136103605, 0.00426924340908935, 0.00439648834812131, 0.00452711113296733,
+	0.00466118802371875, 0.00479879659712618, 0.00494001575777064, 0.00508492574899103, 0.0052336081635558,
+	0.00538614595406669, 0.0055426234430826, 0.00570312633295069, 0.00586774171533257, 0.00603655808041266,
+	0.00620966532577613, 0.00638715476494317, 0.00656911913554677, 0.00675565260714066, 0.00694685078862432,
+	0.00714281073527142, 0.00734363095534836, 0.00754941141630921, 0.00776025355055365, 0.00797626026073373,
+	0.00819753592459614, 0.0084241863993457, 0.00865631902551655, 0.00889404263033678, 0.00913746753057268,
+	0.00938670553483859, 0.00964186994535833, 0.00990307555916425, 0.0101704386687197, 0.0104440770619511,
+	0.0107241100216758, 0.0110106583244114, 0.0113038442385528, 0.0116037915219036, 0.0119106254185471,
+	0.0122244726550447, 0.0125454614359466, 0.0128737214386020, 0.0132093838072563, 0.0135525811464200,
+	0.0139034475134986, 0.0142621184106689, 0.0146287307759893, 0.0150034229737322, 0.0153863347839254,
+	0.0157776073910905, 0.0161773833721661, 0.016585806683605, 0.0170030226476328, 0.0174291779376571,
+	0.0178644205628166, 0.0183088998516590, 0.0187627664349377, 0.0192261722275173, 0.0196992704093769,
+	0.0201822154057044, 0.0206751628660701, 0.0211782696426723, 0.0216916937676468, 0.0222155944294315,
+	0.0227501319481792, 0.0232954677502118, 0.0238517643415085, 0.0244191852802225, 0.0249978951482205,
+	0.0255880595216387, 0.0261898449404527, 0.026803418877055, 0.0274289497038368, 0.0280666066597725,
+	0.0287165598160018, 0.0293789800404094, 0.0300540389611999, 0.030741908929466, 0.0314427629807527,
+	0.0321567747956137, 0.0328841186591639, 0.0336249694196283, 0.03437950244589, 0.0351478935840388,
+	0.0359303191129258, 0.0367269556987264, 0.0375379803485168, 0.0383635703628713, 0.0392039032874827,
+	0.0400591568638171, 0.0409295089788074, 0.0418151376135949, 0.0427162207913289, 0.043632936524032,
+	0.0445654627585431, 0.0455139773215499, 0.0464786578637201, 0.0474596818029473, 0.0484572262667228,
+	0.0494714680336481, 0.0505025834741036, 0.0515507484900895, 0.0526161384542521, 0.0536989281481198,
+	0.054799291699558, 0.0559174025194695, 0.0570534332377542, 0.058207555638553, 0.059379940594793,
+	0.0605707580020589, 0.061780176711812, 0.0630083644639785, 0.0642554878189359, 0.0655217120889165,
+	0.066807201268858, 0.0681121179667254, 0.0694366233333317, 0.0707808769916854, 0.0721450369658939,
+	0.0735292596096484, 0.0749336995343271, 0.0763585095367391, 0.0778038405265464, 0.0792698414533924,
+	0.080756659233771, 0.0822644386776688, 0.0837933224150144, 0.085343450821967, 0.0869149619470851,
+	0.0885079914374021, 0.0901226724644525, 0.0917591356502808, 0.0934175089934717, 0.095097917795239,
+	0.0968004845856105, 0.098525329049748, 0.100272567954442, 0.102042315074819, 0.103834681121300,
+	0.105649773666855, 0.107487697074587, 0.109348552425692, 0.111232437447834, 0.113139446443977,
+	0.115069670221708, 0.117023196023109, 0.119000107455201, 0.121000484421018, 0.123024403051343,
+	0.125071935637150, 0.127143150562798, 0.129238112240018, 0.131356881042731, 0.133499513242747,
+	0.135666060946383, 0.137856572032035, 0.140071090088769, 0.142309654355939, 0.144572299663909,
+	0.146859056375896, 0.149169950330982, 0.151505002788344, 0.153864230372735, 0.156247645021255,
+	0.158655253931457, 0.161087059510831, 0.163543059327692, 0.166023246063529, 0.168527607466838,
+	0.171056126308482, 0.173608780338625, 0.176185542245258, 0.178786379614372, 0.181411254891797,
+	0.184060125346759, 0.186732943037172, 0.189429654776712, 0.192150202103696, 0.194894521251808,
+	0.197662543122692, 0.200454193260450, 0.203269391828068, 0.206108053585813, 0.208970087871601,
+	0.211855398583397, 0.214763884163637, 0.217695437585733, 0.220649946342650, 0.223627292437600,
+	0.226627352376868, 0.229649997164791, 0.232695092300897, 0.235762497779251, 0.238852068089987,
+	0.241963652223073, 0.245097093674310, 0.248252230453571, 0.25142889509531, 0.254626914671336,
+	0.257846110805865, 0.261086299692861, 0.264347292115678, 0.267628893468983, 0.270930903783006,
+	0.274253117750074, 0.277595324753465, 0.280957308898564, 0.284338849046324, 0.287739718849027,
+	0.291159686788347, 0.294598516215698, 0.298055965394877, 0.301531787546966, 0.305025730897519,
+	0.308537538725987, 0.312066949417390, 0.315613696516222, 0.319177508782556, 0.322758110250348,
+	0.326355220287920, 0.329968553660594, 0.333597820595458, 0.337242726848250, 0.340902973772323,
+	0.344578258389676, 0.348268273464017, 0.351972707575838, 0.355691245199453, 0.359423566782009,
+	0.363169348824381, 0.366928263963972, 0.370699981059346, 0.37448416527668, 0.378280478177981,
+	0.382088577811048, 0.385908118801123, 0.389738752444203, 0.393580126801961, 0.39743188679824,
+	0.401293674317076, 0.405165128302204, 0.409045884857994, 0.412935577351785, 0.416833836517558,
+	0.420740290560897, 0.424654565265205, 0.428576284099099, 0.432505068324962, 0.436440537108567,
+	0.440382307629757, 0.444329995194093, 0.448283213345439, 0.452241573979416, 0.456204687457683,
+	0.460172162722971, 0.464143607414828, 0.468118627986013, 0.472096829819479, 0.476077817345893,
+	0.480061194161628, 0.48404656314717, 0.488033526585888, 0.492021686283098, 0.496010643685368,
+	0.5, 0.503989356314631, 0.507978313716902, 0.511966473414112, 0.515953436852831,
+	0.519938805838373, 0.523922182654107, 0.527903170180521, 0.531881372013987, 0.535856392585172,
+	0.539827837277029, 0.543795312542317, 0.547758426020584, 0.551716786654561, 0.555670004805907,
+	0.559617692370243, 0.563559462891433, 0.567494931675038, 0.571423715900901, 0.575345434734795,
+	0.579259709439103, 0.583166163482443, 0.587064422648215, 0.590954115142006, 0.594834871697796,
+	0.598706325682924, 0.60256811320176, 0.60641987319804, 0.610261247555797, 0.614091881198878,
+	0.617911422188953, 0.62171952182202, 0.62551583472332, 0.629300018940654, 0.633071736036028,
+	0.636830651175619, 0.640576433217991, 0.644308754800547, 0.648027292424163, 0.651731726535983,
+	0.655421741610324, 0.659097026227677, 0.66275727315175, 0.666402179404542, 0.670031446339406,
+	0.67364477971208, 0.677241889749653, 0.680822491217444, 0.684386303483778, 0.68793305058261,
+	0.691462461274013, 0.69497426910248, 0.698468212453034, 0.701944034605123, 0.705401483784302,
+	0.708840313211654, 0.712260281150973, 0.715661150953676, 0.719042691101436, 0.722404675246535,
+	0.725746882249926, 0.729069096216994, 0.732371106531017, 0.735652707884323, 0.738913700307139,
+	0.742153889194135, 0.745373085328664, 0.74857110490469, 0.75174776954643, 0.75490290632569,
+	0.758036347776927, 0.761147931910014, 0.764237502220749, 0.767304907699103, 0.77035000283521,
+	0.773372647623132, 0.7763727075624, 0.77935005365735, 0.782304562414267, 0.785236115836363,
+	0.788144601416603, 0.791029912128399, 0.793891946414187, 0.796730608171932, 0.79954580673955,
+	0.802337456877308, 0.805105478748191, 0.807849797896304, 0.810570345223288, 0.813267056962828,
+	0.81593987465324, 0.818588745108203, 0.821213620385628, 0.823814457754742, 0.826391219661375,
+	0.828943873691518, 0.831472392533162, 0.83397675393647, 0.836456940672308, 0.838912940489169,
+	0.841344746068543, 0.843752354978745, 0.846135769627265, 0.848494997211656, 0.850830049669019,
+	0.853140943624104, 0.85542770033609, 0.85769034564406, 0.85992890991123, 0.862143427967965,
+	0.864333939053617, 0.866500486757253, 0.86864311895727, 0.870761887759982, 0.872856849437202,
+	0.87492806436285, 0.876975596948657, 0.878999515578982, 0.880999892544799, 0.882976803976891,
+	0.884930329778292, 0.886860553556023, 0.888767562552165, 0.890651447574308, 0.892512302925413,
+	0.894350226333145, 0.8961653188787, 0.897957684925181, 0.899727432045558, 0.901474670950252,
+	0.90319951541439, 0.904902082204761, 0.906582491006528, 0.908240864349719, 0.909877327535548,
+	0.911492008562598, 0.913085038052915, 0.914656549178033, 0.916206677584986, 0.917735561322331,
+	0.919243340766229, 0.920730158546608, 0.922196159473454, 0.92364149046326, 0.925066300465673,
+	0.926470740390352, 0.927854963034106, 0.929219123008315, 0.930563376666668, 0.931887882033275,
+	0.933192798731142, 0.934478287911083, 0.935744512181064, 0.936991635536021, 0.938219823288188,
+	0.93942924199794, 0.940620059405207, 0.941792444361447, 0.942946566762246, 0.94408259748053,
+	0.945200708300442, 0.94630107185188, 0.947383861545748, 0.94844925150991, 0.949497416525896,
+	0.950528531966352, 0.951542773733277, 0.952540318197053, 0.95352134213628, 0.95448602267845,
+	0.955434537241457, 0.956367063475968, 0.95728377920867, 0.958184862386405, 0.959070491021193,
+	0.959940843136183, 0.960796096712517, 0.961636429637129, 0.962462019651483, 0.963273044301274,
+	0.964069680887074, 0.96485210641596, 0.96562049755411, 0.966375030580372, 0.967115881340836,
+	0.967843225204386, 0.968557237019247, 0.969258091070534, 0.9699459610388, 0.97062101995959,
+	0.971283440183998, 0.971933393340228, 0.972571050296163, 0.973196581122945, 0.973810155059547,
+	0.974411940478361, 0.97500210485178, 0.975580814719778, 0.976148235658492, 0.976704532249788,
+	0.977249868051821, 0.977784405570569, 0.978308306232353, 0.978821730357328, 0.97932483713393,
+	0.979817784594296, 0.980300729590623, 0.980773827772483, 0.981237233565062, 0.98169110014834,
+	0.982135579437183, 0.982570822062343, 0.982996977352367, 0.983414193316395, 0.983822616627834,
+	0.98422239260891, 0.984613665216075, 0.984996577026268, 0.98537126922401, 0.985737881589331,
+	0.986096552486501, 0.98644741885358, 0.986790616192744, 0.987126278561398, 0.987454538564053,
+	0.987775527344955, 0.988089374581453, 0.988396208478096, 0.988696155761447, 0.988989341675589,
+	0.989275889978324, 0.98955592293805, 0.98982956133128, 0.990096924440836, 0.990358130054642,
+	0.990613294465161, 0.990862532469427, 0.991105957369663, 0.991343680974483, 0.991575813600654,
+	0.991802464075404, 0.992023739739266, 0.992239746449446, 0.99245058858369, 0.992656369044652,
+	0.992857189264729, 0.993053149211376, 0.99324434739286, 0.993430880864453, 0.993612845235057,
+	0.993790334674224, 0.993963441919587, 0.994132258284667, 0.99429687366705, 0.994457376556917,
+	0.994613854045933, 0.994766391836444, 0.99491507425101, 0.99505998424223, 0.995201203402874,
+	0.995338811976281, 0.995472888867033, 0.995603511651879, 0.99573075659091, 0.995854698638964,
+	0.995975411457242, 0.996092967425147, 0.996207437652315, 0.996318891990825, 0.9964273990476,
+	0.99653302619696, 0.996635839593331, 0.996735904184109, 0.996833283722642, 0.99692804078135,
+	0.997020236764945, 0.997109931923774, 0.997197185367235, 0.997282055077299, 0.997364597922095,
+	0.997444869669572, 0.997522925001214, 0.99759881752581, 0.997672599793268, 0.997744323308458,
+	0.997814038545087, 0.997881794959595, 0.99794764100506, 0.998011624145106, 0.998073790867812,
+	0.998134186699616, 0.998192856219194, 0.998249843071324, 0.998305189980723, 0.998358938765843,
+	0.998411130352635, 0.998461804788262, 0.998511001254763, 0.99855875808266, 0.998605112764508,
+	0.99865010196837, 0.99869376155123, 0.998736126572328, 0.998777231306408, 0.998817109256896,
+	0.998855793168977, 0.99889331504259, 0.998929706145321, 0.998964997025197, 0.998999217523386,
+	0.999032396786782, 0.999064563280486, 0.999095744800178, 0.999125968484368, 0.999155260826541,
+	0.999183647687171, 0.999211154305624, 0.999237805311933, 0.999263624738446, 0.999288636031355,
+	0.999312862062084, 0.99933632513856, 0.99935904701634, 0.999381048909613, 0.999402351502066,
+	0.99942297495761, 0.999442938930975, 0.99946226257817, 0.999480964566793, 0.999499063086214,
+	0.999516575857616, 0.999533520143892, 0.999549912759408, 0.999565770079618, 0.99958110805055,
+	0.999595942198136, 0.999610287637418, 0.9996241590816, 0.999637570850967, 0.999650536881662,
+	0.999663070734323, 0.99967518560258, 0.999686894321419, 0.999698209375391, 0.99970914290671,
+	0.999719706723184, 0.999729912306036, 0.999739770817572, 0.99974929310872, 0.999758489726432,
+	0.999767370920964, 0.999775946653009, 0.999784226600705, 0.99979222016652, 0.999799936483993,
+	0.999807384424364, 0.999814572603067, 0.999821509386095, 0.999828202896254, 0.99983466101928,
+	0.999840891409842, 0.999846901497426, 0.999852698492093, 0.999858289390124, 0.999863680979554,
+	0.99986887984558, 0.999873892375862, 0.999878724765715, 0.999883383023185, 0.999887872974018,
+	0.999892200266523, 0.999896370376326, 0.999900388611024, 0.99990426011473, 0.999907989872526,
+	0.9999115827148, 0.999915043321502, 0.999918376226297, 0.999921585820616, 0.999924676357621,
+	0.999927651956075, 0.99993051660412, 0.99993327416297, 0.999935928370511, 0.999938482844817,
+	0.999940941087581, 0.999943306487466, 0.999945582323366, 0.999947771767598, 0.999949877889004,
+	0.999951903655982, 0.999953851939444, 0.999955725515688, 0.999957527069211, 0.99995925919544,
+	0.999960924403402, 0.99996252511831, 0.999964063684097, 0.999965542365885, 0.99996696335237,
+	0.999968328758167, 0.999969640626073, 0.999970900929288, 0.99997211157356, 0.99997327439928,
+	0.999974391183526, 0.999975463642034, 0.999976493431131, 0.999977482149611, 0.999978431340552,
+	0.999979342493088, 0.999980217044132, 0.99998105638005, 0.999981861838282, 0.999982634708926,
+	0.99998337623627, 0.99998408762028, 0.999984770018052, 0.99998542454521, 0.999986052277273,
+	0.999986654250984, 0.999987231465586, 0.999987784884075, 0.999988315434405, 0.999988824010668,
+	0.999989311474225, 0.999989778654816, 0.999990226351627, 0.99999065533433, 0.999991066344087,
+	0.999991460094529, 0.999991837272697, 0.999992198539962, 0.999992544532909, 0.999992875864198,
+	0.9999931931234, 0.9999934968778, 0.999993787673173, 0.999994066034554, 0.999994332466958,
+	0.999994587456092, 0.999994831469043, 0.999995064954938, 0.999995288345588, 0.999995502056111,
+	0.99999570648553, 0.999995902017353, 0.99999608902014, 0.99999626784804, 0.99999643884132,
+	0.999996602326875, 0.999996758618713, 0.999996908018431, 0.999997050815677, 0.999997187288588,
+	0.99999731770422, 0.99999744231896, 0.999997561378926, 0.99999767512035, 0.999997783769952,
+	0.999997887545298, 0.999997986655145, 0.99999808129978, 0.999998171671336, 0.99999825795411,
+	0.999998340324856, 0.99999841895308, 0.999998494001322, 0.999998565625416, 0.999998633974755,
+	0.999998699192546, 0.999998761416043, 0.999998820776783, 0.999998877400815, 0.999998931408906,
+	0.999998982916757, 0.999999032035204, 0.999999078870404, 0.999999123524027, 0.999999166093434,
+	0.999999206671848, 0.99999924534852, 0.999999282208893, 0.999999317334747, 0.999999350804357,
+	0.999999382692628, 0.999999413071236, 0.999999442008757, 0.999999469570797, 0.999999495820112,
+	0.999999520816723, 0.999999544618035, 0.999999567278938, 0.999999588851916, 0.999999609387146,
+	0.999999628932592, 0.999999647534102, 0.999999665235492, 0.999999682078634, 0.999999698103538,
+	0.999999713348428, 0.999999727849823, 0.999999741642602, 0.999999754760082, 0.999999767234077,
+	0.999999779094968, 0.999999790371761, 0.99999980109215, 0.999999811282566, 0.999999820968243,
+	0.99999983017326, 0.999999838920594, 0.999999847232172, 0.99999985512891, 0.999999862630766,
+	0.99999986975677, 0.999999876525079, 0.999999882953003, 0.99999988905705, 0.99999989485296,
+	0.999999900355737, 0.999999905579684, 0.999999910538435, 0.99999991524498, 0.999999919711701,
+	0.999999923950395, 0.9999999279723, 0.99999993178812, 0.999999935408057, 0.99999993884182,
+	0.99999994209866, 0.999999945187383, 0.999999948116374, 0.999999950893617, 0.99999995352671,
+	0.999999956022884, 0.999999958389024, 0.99999996063168, 0.99999996275708, 0.999999964771158,
+	0.999999966679551, 0.999999968487626, 0.999999970200482, 0.999999971822974, 0.999999973359714,
+	0.99999997481509, 0.99999997619327, 0.999999977498221, 0.999999978733708, 0.999999979903313,
+	0.999999981010438, 0.999999982058315, 0.999999983050017, 0.99999998398846, 0.999999984876418,
+	0.99999998571652, 0.999999986511268, 0.999999987263033, 0.99999998797407, 0.99999998864652,
+	0.99999998928241, 0.99999998988367, 0.999999990452127, 0.999999990989519, 0.999999991497492,
+	0.999999991977608, 0.99999999243135, 0.999999992860124, 0.999999993265263, 0.999999993648031,
+	0.999999994009629, 0.99999999435119, 0.999999994673797, 0.999999994978468, 0.999999995266172,
+	0.999999995537828, 0.999999995794303, 0.999999996036423, 0.999999996264969, 0.999999996480679,
+	0.999999996684254, 0.999999996876358, 0.999999997057619, 0.999999997228631, 0.99999999738996,
+	0.999999997542135, 0.999999997685664, 0.999999997821024, 0.999999997948668, 0.999999998069022,
+	0.999999998182492, 0.999999998289461, 0.999999998390292, 0.999999998485327, 0.99999999857489,
+	0.999999998659288, 0.99999999873881, 0.999999998813732, 0.999999998884312, 0.999999998950795,
+	0.999999999013412, 0.999999999072383, 0.999999999127915, 0.999999999180202, 0.999999999229429,
+	0.99999999927577, 0.999999999319392, 0.99999999936045, 0.999999999399087, 0.999999999435447,
+	0.999999999469658, 0.999999999501844, 0.999999999532123, 0.999999999560605, 0.999999999587393,
+	0.999999999612585, 0.999999999636275, 0.99999999965855, 0.999999999679492, 0.99999999969918,
+	0.999999999717684, 0.999999999735077, 0.999999999751423, 0.999999999766782, 0.999999999781215,
+	0.999999999794774, 0.999999999807511, 0.999999999819476, 0.999999999830714, 0.999999999841267,
+	0.999999999851177, 0.999999999860482, 0.999999999869218, 0.99999999987742, 0.999999999885117,
+	0.999999999892343, 0.999999999899123, 0.999999999905486, 0.999999999911456, 0.999999999917057,
+	0.999999999922311, 0.99999999992724, 0.999999999931863, 0.999999999936198, 0.999999999940263,
+	0.999999999944075, 0.999999999947649, 0.999999999950999, 0.999999999954139, 0.999999999957082,
+	0.99999999995984, 0.999999999962425, 0.999999999964846, 0.999999999967115, 0.99999999996924,
+	0.999999999971231, 0.999999999973096, 0.999999999974842, 0.999999999976478, 0.999999999978009,
+	0.999999999979442, 0.999999999980784, 0.99999999998204, 0.999999999983216, 0.999999999984316,
+	0.999999999985345, 0.999999999986309, 0.99999999998721, 0.999999999988053, 0.999999999988841,
+	0.999999999989579, 0.999999999990269, 0.999999999990914, 0.999999999991517, 0.99999999999208,
+	0.999999999992608, 0.9999999999931, 0.99999999999356, 0.999999999993991, 0.999999999994393,
+	0.99999999999477, 0.99999999999512, 0.999999999995448, 0.999999999995754, 0.99999999999604,
+	0.999999999996308, 0.999999999996557, 0.99999999999679, 0.999999999997007, 0.99999999999721,
+	0.9999999999974, 0.999999999997577, 0.999999999997742, 0.999999999997896, 0.99999999999804,
+	0.999999999998174, 0.999999999998299, 0.999999999998415, 0.999999999998524, 0.999999999998626,
+	0.99999999999872, 0.999999999998808, 0.99999999999889, 0.999999999998967, 0.999999999999039,
+	0.999999999999105, 0.999999999999167, 0.999999999999225, 0.99999999999928, 0.99999999999933,
+	0.999999999999376, 0.99999999999942, 0.99999999999946, 0.999999999999498, 0.999999999999533,
+	0.999999999999566, 0.999999999999597, 0.999999999999625, 0.999999999999651, 0.999999999999676,
+	0.999999999999699, 0.99999999999972, 0.99999999999974, 0.999999999999759, 0.999999999999776,
+	0.999999999999792, 0.999999999999806, 0.99999999999982, 0.999999999999833, 0.999999999999845,
+	0.999999999999856, 0.999999999999866, 0.999999999999876, 0.999999999999885, 0.999999999999893,
+	0.9999999999999, 0.999999999999908, 0.999999999999915, 0.99999999999992, 0.999999999999927,
+	0.999999999999932, 0.999999999999937, 0.999999999999941, 0.999999999999946, 0.99999999999995,
+	0.999999999999953, 0.999999999999957, 0.99999999999996, 0.999999999999963, 0.999999999999966,
+	0.999999999999968, 0.99999999999997, 0.999999999999973, 0.999999999999975, 0.999999999999976,
+	0.999999999999978, 0.99999999999998, 0.999999999999981, 0.999999999999983, 0.999999999999984,
+	0.999999999999985, 0.999999999999986, 0.999999999999987, 0.999999999999988, 0.99999999999999,
+	0.99999999999999, 0.99999999999999, 0.999999999999991, 0.999999999999992, 0.999999999999993,
+	0.999999999999993, 0.999999999999994, 0.999999999999994, 0.999999999999995, 0.999999999999995,
+	0.999999999999995, 0.999999999999996, 0.999999999999996, 0.999999999999996, 0.999999999999997,
+	0.999999999999997, 0.999999999999997, 0.999999999999997, 0.999999999999998, 0.999999999999998,
+	0.999999999999998, 0.999999999999998, 0.999999999999998, 0.999999999999998, 0.999999999999998,
+	0.999999999999999, 0.999999999999999, 0.999999999999999, 0.999999999999999, 0.999999999999999,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1,
+};
+
+// Normal cumulative distribution function
+float NormalCDF(float mu, float sigmaSq, float x);
+
+// Poisson cumulative distribution function
+float PoissonCDF(float lambda, int a, int b);
+
+// Poisson cumulative distribution function
+float PoissonCDF(float lambda, int a);
+
+#endif
diff --git a/libcpp/alignment/statistics/pdfs.cpp b/libcpp/alignment/statistics/pdfs.cpp
new file mode 100644
index 0000000..1e066d1
--- /dev/null
+++ b/libcpp/alignment/statistics/pdfs.cpp
@@ -0,0 +1,36 @@
+#include "pdfs.hpp" 
+
+float Binomial(float p, int x, int n) {
+	return pow(p,n) * pow(1-p,x-n) * Choose(x,n);
+}
+
+float Poisson(float lambda, int n) {
+	if (n < FactorialTableLength) {
+		float lambdaToN = pow(lambda, n);
+		if (lambdaToN == HUGE_VALF)
+			return 1;
+		return (pow(lambda, n) * exp(-lambda)) / FactorialTable[n];
+	}
+	else {
+		return 0;
+	}
+}
+
+float Gamma(float lambda, float t, int n) {
+	if (n <= FactorialTableLength) {
+		return (pow(lambda, n) * pow(t,n-1) * exp(-lambda*t)) / FactorialTable[n-1];
+	}
+	else {
+		return 0;
+	}
+}
+
+float Exponential(float lambda, int t) {
+	return lambda * exp(-lambda*t);
+}
+
+float Normal(float mu, float sigma, float x) {
+	assert(0);
+	return 0;
+}
+
diff --git a/libcpp/alignment/statistics/pdfs.hpp b/libcpp/alignment/statistics/pdfs.hpp
new file mode 100644
index 0000000..5f760c6
--- /dev/null
+++ b/libcpp/alignment/statistics/pdfs.hpp
@@ -0,0 +1,18 @@
+#ifndef _BLASR_PDFS_HPP_
+#define _BLASR_PDFS_HPP_
+
+#include <math.h>
+#include <assert.h>
+#include "StatUtils.hpp"
+
+float Binomial(float p, int x, int n);
+
+float Poisson(float lambda, int n);
+
+float Gamma(float lambda, float t, int n);
+
+float Exponential(float lambda, int t);
+
+float Normal(float mu, float sigma, float x);
+
+#endif
diff --git a/libcpp/alignment/suffixarray/LCPTable.hpp b/libcpp/alignment/suffixarray/LCPTable.hpp
new file mode 100644
index 0000000..85037f2
--- /dev/null
+++ b/libcpp/alignment/suffixarray/LCPTable.hpp
@@ -0,0 +1,182 @@
+#ifndef _BLASR_LCP_TABLE_HPP_
+#define _BLASR_LCP_TABLE_HPP_
+
+#include <map>
+#include <fstream>
+
+template <typename T>
+class LCPTable {
+    //
+    // Change the following TWO type defs if 
+    // the max LCP is changed.
+    //
+    typedef short SignedPrefixLength;
+    typedef unsigned short PrefixLength;
+    typedef std::map<int, int> LongPrefixMap;
+    PrefixLength maxPrefixLength;
+    LongPrefixMap llongPrefixMap, rlongPrefixMap;
+    int tableLength;
+    public:
+    PrefixLength *llcp, *rlcp;
+    LCPTable() {
+        tableLength =0;
+        llcp = rlcp = NULL;
+    }
+
+    LCPTable(T* data, unsigned int pTableLength) {
+        Init(data, pTableLength);
+    }
+
+    inline	int LengthLongestCommonPrefix(T* a, int alen, T* b, int blen) {
+        int i;
+        for (i = 0 ; i < alen and i < blen; i++ ) 
+            if (a[i] != b[i])
+                break;
+        return i;
+    }
+
+    void Init(T* data, unsigned int pTableLength, unsigned int *index) {
+        tableLength = pTableLength;
+        maxPrefixLength = (PrefixLength) (SignedPrefixLength(-1));
+        llcp = new PrefixLength[tableLength];
+        rlcp = new PrefixLength[tableLength];
+        std::fill(llcp, llcp + tableLength, 0);
+        std::fill(rlcp, rlcp + tableLength, 0);
+        FillTable(data, index);
+    }
+
+    int SetL(int index, int length) {
+        assert(index >= 0);
+        assert(index < tableLength);
+        if (index >= maxPrefixLength) {
+            llcp[index] = maxPrefixLength;
+            llongPrefixMap[index] = length;
+        }
+        else {
+            llcp[index] = length;
+        }
+        return llcp[index];
+    }
+
+    int SetR(int index, int length) {
+        assert(index >= 0);
+        assert(index < tableLength);
+        if (index >= maxPrefixLength) {
+            rlcp[index] = maxPrefixLength;
+            rlongPrefixMap[index] = length;
+        }
+        else {
+            rlcp[index] = length;
+        }
+        return rlcp[index];
+    }
+
+
+    int GetL(int index) {
+        if (llcp[index] == maxPrefixLength) {
+            assert(llongPrefixMap.find(index) != llongPrefixMap.end());
+            return llongPrefixMap[index];
+        }
+        else {
+            return llcp[index];
+        }
+    }
+
+    int GetR(int index) {
+        if (rlcp[index] == maxPrefixLength) {
+            assert(rlongPrefixMap.find(index) != llongPrefixMap.end());
+            return rlongPrefixMap[index];
+        }
+        else {
+            return rlcp[index];
+        }
+    }
+
+
+    ~LCPTable() {
+        /*
+           if (llcp != NULL) 
+           delete[] llcp;
+           llcp = NULL;
+           if (rlcp != NULL)
+           delete[] rlcp;
+           rlcp = NULL;
+           */
+        // the two maps automatically go away.
+    }
+
+    void WriteLCPTable(std::ofstream &out) {
+        out.write((char*) &tableLength, sizeof(tableLength));
+        out.write((char*) llcp, sizeof(PrefixLength)*tableLength);
+        out.write((char*) rlcp, sizeof(PrefixLength)*tableLength);
+        typename LongPrefixMap::iterator llcpTableIt, llcpTableEnd;
+        int llongPrefixMapSize = llongPrefixMap.size();
+        out.write((char*) &llongPrefixMapSize, sizeof(llongPrefixMapSize));
+        for((llcpTableIt = llongPrefixMap.begin(),
+                    llcpTableEnd = llongPrefixMap.end());
+                llcpTableIt != llcpTableEnd;
+                ++llcpTableIt) {
+            out.write((char*) &llcpTableIt->first, sizeof(typename LongPrefixMap::key_type));
+            out.write((char*) &llcpTableIt->second, sizeof(typename LongPrefixMap::mapped_type));
+        }
+        typename LongPrefixMap::iterator rlcpTableIt, rlcpTableEnd;
+        int rlongPrefixMapSize = rlongPrefixMap.size();
+        out.write((char*) &rlongPrefixMapSize, sizeof(rlongPrefixMapSize));
+        for((rlcpTableIt = rlongPrefixMap.begin(),
+                    rlcpTableEnd = rlongPrefixMap.end());
+                rlcpTableIt != rlcpTableEnd;
+                ++rlcpTableIt) {
+            out.write((char*) &rlcpTableIt->first, sizeof(typename LongPrefixMap::key_type));
+            out.write((char*) &rlcpTableIt->second, sizeof(typename LongPrefixMap::mapped_type));
+        }
+    }
+
+    void ReadLCPTables(std::ifstream &in) {
+        in.read((char*) &tableLength, sizeof(tableLength));
+        in.read((char*) &llcp, sizeof(PrefixLength)*tableLength);
+        in.read((char*) &rlcp, sizeof(PrefixLength)*tableLength);
+        int longPrefixMapSize;
+        in.read((char*) &longPrefixMapSize, sizeof(longPrefixMapSize));
+        int i;
+        int index, lcpLength;
+        // The rest is stored as a tree, but read and construct this on the fly.
+        for (i = 0; i < longPrefixMapSize; i++) {
+            in.read((char*) &index, sizeof(index));
+            in.read((char*) &lcpLength, sizeof(lcpLength));
+            llongPrefixMap[index] = lcpLength;
+        }
+
+        // Read the rlcp
+        in.read((char*) &longPrefixMapSize, sizeof(longPrefixMapSize));
+        for (i = 0; i < longPrefixMapSize; i++) {
+            in.read((char*) &index, sizeof(index));
+            in.read((char*) &lcpLength, sizeof(lcpLength));
+            rlongPrefixMap[index] = lcpLength;
+        }
+    }
+
+
+    void FillTable(T* data, unsigned int *index) {
+        //
+        // This assumes that the index table is now in sorted order.
+        //
+        FillTable(0, tableLength, data, index);
+    }
+
+    void FillTable(unsigned int low, unsigned int high, T* data, unsigned int *index) {
+        if (low == high) 
+            return;
+        unsigned int mid = (low + high) / 2;
+        assert (mid != low);
+        SetL(mid, LengthLongestCommonPrefix(&data[index[low]], tableLength - index[low],
+                    &data[index[mid]], tableLength - index[mid]));
+        FillTable(low, mid, data, index);
+        assert(mid != high);
+        SetR(mid, LengthLongestCommonPrefix(&data[index[mid]], tableLength - index[mid],
+                    &data[index[high]], tableLength - index[high]));
+        FillTable(mid+1, high, data, index);
+    }
+
+};
+
+#endif // _BLASR_LCP_TABLE_HPP_
diff --git a/libcpp/alignment/suffixarray/SharedSuffixArray.hpp b/libcpp/alignment/suffixarray/SharedSuffixArray.hpp
new file mode 100644
index 0000000..dd31437
--- /dev/null
+++ b/libcpp/alignment/suffixarray/SharedSuffixArray.hpp
@@ -0,0 +1,83 @@
+#ifndef _BLASR_SHARED_SUFFIX_ARRAY_HPP_
+#define _BLASR_SHARED_SUFFIX_ARRAY_HPP_
+
+#include <stdlib.h>
+#include <fstream>
+#include <sstream>
+#include "SuffixArray.hpp"
+#include "ipc/SharedMemoryAllocator.hpp"
+#include "tuples/DNATuple.hpp"
+#include "tuples/CompressedDNATuple.hpp"
+#include "algorithms/compare/CompareStrings.hpp"
+
+
+template<typename T, 
+    typename Sigma,
+    typename Compare = DefaultCompareStrings<T>,
+    typename Tuple   = DNATuple >
+class SharedSuffixArray : public SuffixArray<T, Sigma, Compare, Tuple> {
+public:
+    std::string shmIdTag;
+    SAIndex *indexShared;
+    int indexID;
+    std::string indexHandle;
+    SAIndex *lookupTableShared;
+    int lookupTableID;
+    std::string lookupTableHandle;
+    int lookupPrefixLength;
+
+    void InitShmIdTag() {
+        std::stringstream tagStrm;
+        tagStrm << "_" << getpid();
+        shmIdTag = tagStrm.str();
+    }
+
+
+    void ReadSharedArray(std::ifstream &saIn) {
+        std::cout << "reading a shared suffix array index." << std::endl;
+        saIn.read((char*) &this->length, sizeof(int));
+        indexHandle = "suffixarray.index." + shmIdTag;
+        AllocateMappedShare(indexHandle, this->length + 1, indexShared, indexID);
+        std::cout << "the shared index is: " << indexShared << std::endl;
+        this->index = indexShared;
+        std::cout << "the index used is: " << this->index << std::endl;
+        this->ReadAllocatedArray(saIn);
+    }
+
+    void ReadSharedLookupTable(std::ifstream &saIn) {
+        this->ReadLookupTableLengths(saIn);
+        lookupTableHandle = "suffixarray.lookuptable." + shmIdTag;
+        AllocateMappedShare(lookupTableHandle, this->lookupTableLength + 1, lookupTableShared, lookupTableID);
+        this->lookupTable = lookupTableShared;
+        this->ReadAllocatedLookupTable(saIn);
+    }
+
+    void ReadShared(std::string &inFileName) {
+        std::ifstream saIn;
+        InitShmIdTag();
+        saIn.open(inFileName.c_str(), std::ios::binary);
+        this->ReadComponentList(saIn);
+        if (this->componentList[SuffixArray<T,Sigma,Compare,Tuple>::CompArray]) {
+            this->ReadSharedArray(saIn);
+        }
+        if (this->componentList[SuffixArray<T,Sigma,Compare,Tuple>::CompLookupTable]) {
+            this->ReadSharedLookupTable(saIn);
+        }
+        saIn.close();
+    }
+
+    void FreeShared() {
+
+        if (this->componentList[SuffixArray<T,Sigma,Compare,Tuple>::CompArray]) {
+            shm_unlink(indexHandle.c_str());
+        }
+        if (this->componentList[SuffixArray<T,Sigma,Compare,Tuple>::CompLookupTable]) {
+            shm_unlink(lookupTableHandle.c_str());
+        }
+    }
+
+
+};
+
+
+#endif // _BLASR_SHARED_SUFFIX_ARRAY_HPP_
diff --git a/libcpp/alignment/suffixarray/SuffixArray.hpp b/libcpp/alignment/suffixarray/SuffixArray.hpp
new file mode 100644
index 0000000..907bf1b
--- /dev/null
+++ b/libcpp/alignment/suffixarray/SuffixArray.hpp
@@ -0,0 +1,1197 @@
+#ifndef _BLASR_SUFFIX_ARRAY_HPP_
+#define _BLASR_SUFFIX_ARRAY_HPP_
+
+#include <string.h>
+#include <assert.h>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+#include "LCPTable.hpp"
+#include "defs.h"
+#include "utils.hpp"
+#include "tuples/DNATuple.hpp"
+#include "tuples/CompressedDNATuple.hpp"
+#include "qvs/QualityValue.hpp"
+#include "DNASequence.hpp"
+#include "NucConversion.hpp"
+#include "algorithms/compare/CompareStrings.hpp"
+#include "algorithms/sorting/qsufsort.hpp"
+#include "algorithms/sorting/LightweightSuffixArray.hpp"
+/*
+ * Suffix array implementation, with a Manber and Meyers sort, but
+ * that is typically not used.
+ *
+ */
+
+typedef enum E_SAType {manmy, slow, mcilroy, larsson, kark, mafe, welter} SAType;
+
+template<typename T>
+class CompareSuffixes {
+public:
+    T t;
+    int refLength;
+    CompareSuffixes(T tref, int prefLength) {
+        t = tref;
+        refLength = prefLength;
+    }
+    int operator()(int a, int b) {
+        int aSufLen = refLength - a;
+        int bSufLen = refLength - b;
+        int abMinLength = MIN(aSufLen, bSufLen);
+        int cmpRes = memcmp(&(t[a]), &(t[b]), abMinLength);
+        if (cmpRes == 0) {
+            if (aSufLen < bSufLen) {
+                return 1;
+            }
+            else {
+                return 0;
+            }
+        }
+        else {
+            return cmpRes < 0;
+        }
+    }
+};
+
+typedef uint32_t SAIndex;
+typedef uint32_t SAIndexLength;
+
+template<typename T, 
+    typename Sigma,
+    typename Compare = DefaultCompareStrings<T>,
+    typename Tuple   = DNATuple >
+class SuffixArray {
+public:
+    SAIndex *index;
+    bool deleteStructures;
+    T*  target;
+    SAIndex length;
+    SAIndex *startPosTable, *endPosTable;
+    SAIndexLength lookupTableLength;
+    SAIndex lookupPrefixLength;
+    TupleMetrics tm;
+    unsigned int magicNumber;
+    unsigned int ckMagicNumber;
+    typedef Compare CompareType;
+    enum Component { CompArray, CompLookupTable, CompLCPTable};
+    static const int ComponentListLength = 2;
+    static const int FullSearch = -1;
+    int componentList[ComponentListLength];
+
+    // vector<SAIndex> leftBound, rightBound;
+
+    inline	int LengthLongestCommonPrefix(T *a, int alen, T *b, int blen) {
+        int i;
+        for (i = 0 ; i < alen and i < blen; i++ ) 
+            if (a[i] != b[i])
+                break;
+        return i;
+    }
+
+    SuffixArray() {
+        // Not necessarily using the lookup table.
+        // The magic number is linked with a version 
+        magicNumber = 0xacac0001;
+        startPosTable = endPosTable = NULL;
+        lookupPrefixLength = 0;
+        lookupTableLength = 0;
+        deleteStructures  = true;
+        ckMagicNumber = 0;
+        length = 0;
+        int i;
+        for (i = 0; i < ComponentListLength; i++) {
+            componentList[i] = false;
+        }
+        // Must create a suffix array, but for now make it null.
+        target = NULL;
+        index = NULL;
+    }
+    ~SuffixArray() {
+        if (deleteStructures == false) {
+            //
+            // It is possible this class is referencing another structrue. In
+            // this case, do not try and delete in the destructor.
+            //
+            return;
+        }
+        if (startPosTable != NULL) {
+            delete[] startPosTable;
+        }
+        if (endPosTable != NULL) {
+            delete[] endPosTable;
+        }
+        if (index != NULL) {
+            delete[] index;
+        }
+    }
+
+    int StringLessThanEqual(T *a, int aLen, T *b, int bLen) {
+        return Compare::LessThanEqual(a, aLen, b, bLen);
+    }
+
+    int StringEquals(T *a, int aLen, T *b, int bLen) {
+        return Compare::Equal(a, aLen, b, bLen);
+    }
+    int StringLessThan(T *a, int aLen, T *b, int bLen) {
+        return Compare::LessThan(a, aLen, b, bLen);
+    }
+
+    void InitAsciiCharDNAAlphabet(std::vector<int> &dnaAlphabet) {
+        int i;
+        for (i = 0; i < 127; i++) {
+            dnaAlphabet.push_back(i);
+        }
+    }
+
+    void InitTwoBitDNAAlphabet(std::vector<int> &dnaAlphabet) {
+        dnaAlphabet.push_back(0);
+        dnaAlphabet.push_back(1);	
+        dnaAlphabet.push_back(2);
+        dnaAlphabet.push_back(3);
+    }
+
+    void InitThreeBitDNAAlphabet(std::vector<int> &dnaAlphabet) {
+        //
+        // This is initialized to have ACTG-0123, N=4, and EOF=5
+        //
+        dnaAlphabet.push_back(0);
+        dnaAlphabet.push_back(1);	
+        dnaAlphabet.push_back(2);
+        dnaAlphabet.push_back(3);
+        dnaAlphabet.push_back(4);
+        dnaAlphabet.push_back(5);
+    }
+
+    void PrintSuffices(T *target, int targetLength, int maxPrintLength) {
+        std::string seq;
+        seq.resize(maxPrintLength+1);
+        SAIndex i, s;
+        seq[maxPrintLength] = '\0';
+        for (i = 0; i < length; i++) {
+            DNALength suffixLength = maxPrintLength;
+            if (index[i] + maxPrintLength > length) {
+                suffixLength = length - index[i];
+            }
+            std::cout << index[i] << " " << suffixLength << " ";
+            seq.resize(suffixLength);
+            for (s = 0; s < suffixLength; s++ ){ 
+                seq[s] = TwoBitToAscii[target[index[i] + s]];
+            }
+            seq[suffixLength] = '\0';
+            std::cout << seq << std::endl;
+        }
+    }
+
+    void BuildLookupTable(T *target, SAIndexLength targetLength, int prefixLengthP) { 
+
+        //
+        // pprefixLength is the length used to lookup the index boundaries
+        // given a string.
+        //
+
+        SAIndexLength i;
+        tm.tupleSize = lookupPrefixLength = prefixLengthP;
+        tm.InitializeMask();
+        lookupTableLength = 1 << (2*lookupPrefixLength);
+
+        if (startPosTable) {delete [] startPosTable;}
+        startPosTable = ProtectedNew<SAIndex>(lookupTableLength);
+
+        if (endPosTable) {delete [] endPosTable;}
+        endPosTable   = ProtectedNew<SAIndex>(lookupTableLength);
+        deleteStructures = true;
+
+        Tuple curPrefix, nextPrefix;
+        SAIndex tablePrefixIndex = 0;
+
+        for (i = 0; i < lookupTableLength; i++) {
+            startPosTable[i] = endPosTable[i] = 0;
+        }
+        i = 0;
+        VectorIndex tablePos;
+        SAIndex     indexPos;
+        indexPos = 0;
+        do {
+            // Advance to the first position that may be translated into a tuple.
+            if (targetLength < lookupPrefixLength)
+                break;
+            while(indexPos < targetLength - lookupPrefixLength + 1 and 
+                    index[indexPos] + lookupPrefixLength > targetLength) {
+                indexPos++;
+            }
+            if (indexPos >= targetLength - lookupPrefixLength + 1) {
+                break;
+            }
+            while (indexPos < targetLength - lookupPrefixLength + 1 and
+                    curPrefix.FromStringLR((Nucleotide*) &target[index[indexPos]], tm) == 0) {
+                ++indexPos;
+            }
+
+            startPosTable[curPrefix.tuple] = indexPos;
+            indexPos++;
+            while(indexPos < targetLength - lookupPrefixLength + 1 and
+                    index[indexPos] + lookupPrefixLength < targetLength) {
+                nextPrefix.tuple = 0;
+                nextPrefix.FromStringLR((Nucleotide*) &target[index[indexPos]], tm);
+                if (nextPrefix.tuple != curPrefix.tuple) {
+                    break;
+                }
+                else {
+                    indexPos++;
+                }
+            }
+            endPosTable[curPrefix.tuple] = indexPos;
+        }
+        while ((indexPos < targetLength - lookupPrefixLength + 1) and 
+               (uint32_t(curPrefix.tuple) < uint32_t(lookupTableLength - 1)));
+    }
+
+    void AllocateSuffixArray(SAIndexLength stringLength) {
+        assert(index == NULL or not deleteStructures);
+        index = ProtectedNew<SAIndex>(stringLength + 1);
+        deleteStructures = true;
+        length = stringLength;
+    }
+
+    void LarssonBuildSuffixArray(T* target, SAIndexLength targetLength, Sigma &alphabet) {
+        assert(index == NULL or not deleteStructures);
+        index =  ProtectedNew<SAIndex>(targetLength+1);
+        deleteStructures = true;
+        SAIndex *p = ProtectedNew<SAIndex>(targetLength+1);
+        SAIndexLength i;
+        for (i = 0; i < targetLength; i++) { index[i] = target[i] + 1;}
+        SAIndexLength maxVal = 0;
+        for (i = 0; i < targetLength; i++) { maxVal = index[i] > maxVal ?  index[i] : maxVal;}
+        index[targetLength] = 0;
+        LarssonSuffixSort<SAIndex, UINT_MAX> sorter;
+        sorter(index, p, ((SAIndex) targetLength), ((SAIndex) maxVal+1), (SAIndex) 1 );
+        for (i = 0; i < targetLength; i++ ){ index[i] = p[i+1];};
+        length = targetLength;
+        delete[] p;
+    }
+
+    void LightweightBuildSuffixArray(T*target, SAIndexLength targetLength, int diffCoverSize=2281) {
+        assert(index == NULL or not deleteStructures);
+        index = ProtectedNew<SAIndex>(targetLength+1);
+        deleteStructures = true;
+        length = targetLength;
+        DNALength pos;
+        for (pos = 0; pos < targetLength; pos++) {
+            target[pos]++;
+        }
+        LightweightSuffixSort(target, targetLength, index, diffCoverSize);
+        for (pos = 0; pos < targetLength; pos++) {
+            target[pos]--;
+        }
+
+    }
+
+    void MMBuildSuffixArray(T* target, SAIndexLength targetLength, Sigma &alphabet) {
+        /*
+         * Manber and Myers suffix array construction.
+         */
+        length = targetLength;
+        VectorIndex a;
+        std::vector<int> prm;
+        std::vector<int> bucket;
+        std::vector<int> count;
+        // To be changed to bit vectors
+        std::vector<bool> bh, b2h;
+        bucket.resize(alphabet.size());
+
+        prm.resize(targetLength);
+        count.resize(targetLength);
+        bh.resize(targetLength+1);
+        b2h.resize(targetLength+1);
+        std::fill(bh.begin(), bh.end(), false);
+        std::fill(b2h.begin(), b2h.end(), false);
+        std::fill(count.begin(), count.end(), 0);
+        assert(index == NULL or not deleteStructures);
+        index = ProtectedNew<SAIndex>(targetLength);
+        //index = new SAIndex[targetLength];
+        deleteStructures = true;
+        for (a = 0; a < alphabet.size(); a++ ) {
+            bucket[a] = -1;
+        }
+
+        SAIndexLength i;
+        for (i = 0; i < targetLength; i++) {
+            index[i] = bucket[target[i]];
+            bucket[target[i]] = i;
+        }
+
+        int j;
+        SAIndex c;
+        std::fill(prm.begin(), prm.end(), -1);
+        //
+        // Prepare the buckets.
+        //
+        c = 0;
+        int b;
+        for (a = 0; a < alphabet.size(); a++) { 
+            b = bucket[alphabet[a]]; // position of last suffix starting with 'a'
+            while (b != -1) {
+                j = index[b];
+                prm[b] = c;
+                if (b == bucket[a]) {
+                    bh[c] = true;
+                }
+                else {
+                    bh[c] = false;
+                }
+                c = c + 1;
+                b = j;
+            }
+        }
+        b2h[targetLength] = bh[targetLength] = true;
+        // fill the index with positions sorted by the first character.
+        for (i = 0; i < targetLength; i++) {
+            index[prm[i]] = i;
+        }
+
+        SAIndex h;
+        h = 1;
+        SAIndex l, r;
+
+        while (h < targetLength) {
+            // re-order the buckets;
+            l = 0;
+            int bstart;
+            while (l < targetLength) {
+                bstart = l;
+                r = l + 1;
+                count[l] = 0;
+                //				bh[l] = 0;
+                while (bh[r] == false) {r++;} // find the begining of the next bucket.
+                while (l < r) {
+                    assert(l < targetLength);
+                    prm[index[l]] = bstart;
+                    l++;
+                }
+            }
+
+            SAIndex d = targetLength - h;
+            SAIndex e = prm[d]; 
+
+            /*
+             * Phase 1: Set up the buckets in the index and bh list.
+             */
+
+            //
+            // suffix d needs to be moved to the front of it's bucket.
+            // d should exist in the bucket starting at prm[d]
+            SAIndex i;
+
+            l = 0;
+            r = 1;
+
+            //
+            // Move each d that is h backwards up in it's 2h bucket.
+            //
+
+            d = targetLength - h; 
+            e = prm[d]; 
+            bh[e]    = true;     // e is bstart, the beginning of the bucket.
+            prm[d]   = e + count[e];
+            count[e] = count[e] + 1;
+            b2h[prm[d]] = true;
+
+            for (c = 0; c < targetLength; c++ ){
+                // d is T_i
+                d = index[c] - h;
+                if (index[c] >= h and d < targetLength) {
+                    e           = prm[d];
+                    prm[d]      = e + count[e];
+                    count[e]    = count[e] + 1;
+                    b2h[prm[d]] = true;
+                }
+            }
+
+
+            //
+            // Fix the bucket boundaries.
+            //
+
+            l = 0;
+
+
+            while(l < targetLength) {
+
+                // First assign b2h to be 1 on the entire portion of the 
+                // current bucket (from l ... bh[c]==true).
+                for (c = l; c == l or bh[c] == false; c++)  {
+                    d = index[c] - h;
+                    if (d < targetLength) {
+                        b2h[prm[d]] = true;
+                    }
+                }
+
+                //
+                // Mark the start boundaries of the 2h bucket.
+                //
+                for (c = l; c == l or bh[c] == false; c++) {
+                    d = index[c] - h;
+                    if (d < targetLength) {
+                        if (b2h[prm[d]] == true) {
+                            j = prm[d] + 1;
+                            // advance j to the next bucket.
+                            while (!(bh[j] == true or b2h[j] == false)) {
+                                j++;
+                            }
+
+                            e = j;
+                            SAIndex f;
+                            for (f = prm[d] + 1; f <= e - 1; f++) { 
+                                b2h[f] = false;
+                            }
+                        }
+                    }
+                }
+                l = c;
+            }
+
+            for (i = 0; i < targetLength; i++) { 
+                index[prm[i]] = i;
+            }
+
+            for (i = 0 ; i < targetLength; i++) {
+                if (b2h[i] == true and bh[i] == false) {
+                    bh[i] = b2h[i];
+                }
+            }
+            h <<= 1;
+        }
+    }
+
+    void BuildSuffixArray(T* target, SAIndex targetLength, Sigma &alphabet) {
+        length = targetLength;
+        assert(index == NULL or not deleteStructures);
+        index  = ProtectedNew<SAIndex>(length);
+        deleteStructures = true;
+        CompareSuffixes<T*> cmp(target, length);
+        SAIndex i;
+        for (i = 0; i < length; i++ ){ 
+            index[i] = i;
+        }
+        std::sort(index, index + length, cmp);
+    }
+
+    void WriteArray(std::ofstream &out) {
+        out.write((char*) &length, sizeof(int));
+        out.write((char*) index, sizeof(int) * (length));
+    }
+
+    void WriteLookupTable(std::ofstream &out) {
+
+        out.write((char*) &lookupTableLength, sizeof(SAIndex));
+        out.write((char*) &lookupPrefixLength, sizeof(SAIndex));
+        out.write((char*) startPosTable, sizeof(SAIndex) * (lookupTableLength));
+        out.write((char*) endPosTable, sizeof(SAIndex) * (lookupTableLength));
+    }
+
+    void WriteComponentList(std::ofstream &out) {
+        //
+        // First build the component list.
+        //
+        if (index != NULL)
+            componentList[CompArray] = 1;
+        else 
+            componentList[CompArray] = 0;
+
+        if (startPosTable != NULL)
+            componentList[CompLookupTable] = 1;
+        else
+            componentList[CompLookupTable] = 0;
+
+        out.write((char*) componentList, sizeof(int) * ComponentListLength);
+    }
+
+    void WriteLCPTable(std::ofstream &out) {
+        std::cout << "NOT YET IMPLEMENTED." << std::endl;
+        exit(1);
+    }
+
+    void Write(std::string &outFileName) {
+
+        //
+        // The suffix array is written in 2 or more parts:
+        //   1 - a preamble listing the components of the
+        //       array that are written
+        //   2 - The components.
+        //
+        // 
+        std::ofstream suffixArrayOut;
+        suffixArrayOut.open(outFileName.c_str(), std::ios::binary);
+        if (!suffixArrayOut.good()) {
+            std::cout << "Could not open " << outFileName << std::endl;
+            exit(1);
+        }
+        WriteMagicNumber(suffixArrayOut);
+        // write the preamble
+        WriteComponentList(suffixArrayOut);
+
+        // write the components
+        if (componentList[CompArray]) {
+            WriteArray(suffixArrayOut);
+        }
+        if (componentList[CompLookupTable]) {
+            WriteLookupTable(suffixArrayOut);
+        }
+        suffixArrayOut.close();
+    }
+    void WriteMagicNumber(std::ofstream &out) {
+        out.write((char*) &magicNumber, sizeof(int));
+    }
+
+    int ReadMagicNumber(std::ifstream &in) {
+        in.read((char*) &ckMagicNumber, sizeof(int));
+        if (ckMagicNumber != magicNumber) {
+            return 0;
+        }
+        else { 
+            return 1;
+        }
+    }
+
+    void ReadComponentList(std::ifstream &in) { 
+        in.read((char*) componentList, sizeof(int) * ComponentListLength);
+    }
+
+    void ReadAllocatedArray(std::ifstream &in) {
+        in.read((char*) index, sizeof(int) * length);
+    }
+
+    void LightReadArray(std::ifstream &in) {
+        in.read((char*) &length, sizeof(int));
+        // skip the actual array
+        in.seekg(length*sizeof(int), std::ios_base::cur);
+    }
+
+    void ReadArray(std::ifstream &in) {
+        in.read((char*) &length, sizeof(int));
+        assert(index == NULL or not deleteStructures);
+        index = ProtectedNew<SAIndex>(length);
+        deleteStructures = true;
+        ReadAllocatedArray(in);
+    }
+
+    void ReadAllocatedLookupTable(std::ifstream &in) {
+        in.read((char*) startPosTable, sizeof(int) * (lookupTableLength));
+        in.read((char*) endPosTable, sizeof(int) * (lookupTableLength));
+    }
+
+    void ReadLookupTableLengths(std::ifstream &in) {
+        in.read((char*) &lookupTableLength, sizeof(int));
+        in.read((char*) &lookupPrefixLength, sizeof(int));
+    }
+
+    void ReadLookupTable(std::ifstream &in) {
+        ReadLookupTableLengths(in);
+        tm.Initialize(lookupPrefixLength);
+        assert(startPosTable == NULL or not deleteStructures);
+        assert(endPosTable == NULL or not deleteStructures);
+        startPosTable = ProtectedNew<SAIndex>(lookupTableLength);
+        endPosTable   = ProtectedNew<SAIndex>(lookupTableLength);
+        deleteStructures = true;
+        ReadAllocatedLookupTable(in);
+    }
+
+    void ReadLCPTable(std::ifstream &in) {
+        std::cout <<" NOT YET IMPLEMENTED!!!" << std::endl;
+        exit(1);
+    }
+
+    bool LightRead(std::string &inFileName) {
+        std::ifstream saIn;
+        saIn.open(inFileName.c_str(), std::ios::binary);
+        int hasMagicNumber;
+        hasMagicNumber = ReadMagicNumber(saIn);
+        if (hasMagicNumber == 1) {
+            ReadComponentList(saIn);
+            LightReadArray(saIn);
+            ReadLookupTable(saIn);
+            saIn.close();
+            return true;
+        }
+        else {
+            saIn.close();
+            return false;
+        }
+    }
+
+    bool Read(std::string &inFileName) {
+        std::ifstream saIn;
+        saIn.open(inFileName.c_str(), std::ios::binary);
+        int hasMagicNumber;
+        hasMagicNumber = ReadMagicNumber(saIn);
+        if (hasMagicNumber == 1) {
+            ReadComponentList(saIn);
+            if (componentList[CompArray]) {
+                ReadArray(saIn);
+            }
+            if (componentList[CompLookupTable]) {
+                ReadLookupTable(saIn);
+            }
+            saIn.close();
+            return true;
+        }
+        else {
+            saIn.close();
+            return false;
+        }
+    }
+
+    int SearchLCP(T* target, T* query, DNALength queryLength, SAIndex &low, SAIndex &high, DNALength &lcpLength, DNALength maxlcp) {
+        //		cout << "searching lcp with query of length: " << queryLength << endl;
+        lcpLength = 0;
+        if (startPosTable != NULL and
+                queryLength >= lookupPrefixLength) {
+            Tuple lookupTuple;
+            int left, right;
+            // just in case this was changed.
+            lookupTuple.FromStringLR(query, tm);
+            left  = startPosTable[lookupTuple.tuple];
+            right = endPosTable[lookupTuple.tuple];
+            //
+            // When left == right, the k-mer in the read did not exist in the
+            // genome.  Don't even try and map it in this case.
+            //
+            if (left == right) {
+                low = high = 0;
+                return 0;
+            }
+
+            //
+            // Otherwise, the sequence of length 'lookupPrefixLength' was found
+            // in the genome.  The bounds of this prefix in the suffix array
+            // are stored in the lookup tables, so begin the binary search there.
+            //
+            lcpLength = lookupPrefixLength;
+            low = left, high = right;
+        }
+        else {
+            low = 0; high = length - 1;
+            lcpLength = 0;
+        }		
+        int prevLow = low;
+        int prevHigh = high;
+        int prevLCPLength = lcpLength - 1;
+
+        // When the boundaries and the string share a prefix, it is not necessary
+        // to use this as a comparison in further lcp searches.
+        prevLCPLength = lcpLength;
+
+        Search(target, query, queryLength, low, high, low, high, 0);
+
+        DNALength lowLCP = lookupPrefixLength, highLCP = lookupPrefixLength;
+        while (lowLCP < queryLength and index[low]+lowLCP < length and 
+                target[index[low] + lowLCP] == query[lowLCP]) lowLCP++;
+
+        while (highLCP < queryLength and index[high]+highLCP < length and 
+                target[index[high] + highLCP] == query[highLCP]) highLCP++;
+
+        DNALength minLCP = highLCP;
+        if (lowLCP < highLCP ) { 
+            minLCP = lowLCP;
+        }
+
+        while (minLCP >= (lookupPrefixLength -2 )and 
+                low > 0 and high < (length - minLCP) and high - low < 10) {
+            while(low  > 0 and StringEquals(&target[index[low]], minLCP, &target[index[high]], minLCP)) low--;
+            while(high > 0 and StringEquals(&target[index[low]], minLCP, &target[index[high]], minLCP)) high++;
+            --minLCP;
+        }
+
+        //
+        // The LCP is not an exact match to the end of the string.
+        //
+
+        prevLow  = low;
+        prevHigh = high;
+
+        low = prevLow; high = prevHigh;
+        if (low < high and high - low < 100) {
+            return queryLength;
+        }
+        else {
+            high = low - 1;
+            lcpLength = 0;
+        }
+        return lcpLength;
+    }
+
+    int Search(T* target, T* query, DNALength queryLength, SAIndex left, SAIndex right, SAIndex &low, SAIndex &high, unsigned int offset=0) {
+        if (offset >= queryLength) {
+            return high - low;
+        }
+        SearchLow(target, query, queryLength, left, right, low, offset);
+        SearchHigh(target, query, queryLength, left, right, high, offset);
+        return high - low;
+    }
+
+    int Search(T* target, T* query, DNALength queryLength, SAIndex &low, SAIndex &high, int offset = 0) {
+
+        int left = 0;
+        int right = length - 1;
+        //
+        // Constrain the lookup if a lookup table exists.
+        //
+        if (startPosTable != NULL and
+                queryLength >= lookupPrefixLength) {
+            Tuple lookupTuple;
+            lookupTuple.FromStringLR(query, tm);
+            left  = startPosTable[lookupTuple.tuple];
+            right = endPosTable[lookupTuple.tuple];
+        }
+        return Search(target, query, queryLength, left, right, low, high, offset);
+    }
+
+
+    long SearchLeftBound(T* target, long targetLength, DNALength targetOffset,  T queryChar, long l, long r) {
+        long ll, lr;
+        ll = l;
+        lr = r;
+        long m;
+        long targetSufLen = 0;
+        while (ll < lr) {
+            m = (ll + lr) / 2;
+            targetSufLen = targetLength - index[m];
+            if (targetSufLen == targetOffset) {
+                ll =m + 1;
+                continue;
+            }
+            //
+            // The suffix at index[m] is shorter than the lengths of the 
+            // two sequences being compared.  With the Larsson
+            // implementation, that means that the target suffix is lex-less
+            // than the read.
+            int comp;
+            if (targetSufLen < targetOffset) {
+                comp = -1;
+            }
+            else {
+                //
+                // There is enough sequence to compare the target suffix with
+                // the query suffix.
+                //
+                assert(index[m]+targetOffset < targetLength);
+
+                /*
+                   if (ThreeBit[target[index[m]+targetOffset]] >= 4 or 
+                   ThreeBit[queryChar] >= 4) {
+                   lr = ll;
+                   break;
+                   }
+                   */
+                comp = Compare::Compare(target[index[m]+targetOffset], queryChar);
+
+            }
+            if (comp < 0) {
+                ll = m + 1;
+            }
+            else {
+                lr = m;
+            }
+        }
+        return ll;
+    }
+
+    long SearchRightBound(T* target, long targetLength, DNALength targetOffset, 
+            T queryChar, long l, long r) {
+        long rl, rr;
+        rl = l;
+        rr = r;
+        long m;
+        long targetSufLen;
+        while (rl < rr) {
+            m = (rl + rr) / 2;
+            targetSufLen = targetLength - index[m];
+            if (targetSufLen == targetOffset) { 
+                rr = m;
+                break; 
+            }
+            if (targetSufLen < targetOffset) {
+                rr = m ;
+            }
+            else {
+                /*
+                 * Do not try and map stretches of N. These do not add
+                 * infomrative anchors.
+                 */
+                /*
+                   if (ThreeBit[target[index[m]+targetOffset]] >= 4 or
+                   ThreeBit[queryChar] >= 4) {
+                   rl = rr;
+                   break;
+                   }
+                   */
+                int comp = Compare::Compare(target[index[m] + targetOffset], queryChar);
+                if (comp <= 0) {
+                    rl = m + 1;
+                }
+                else {
+                    rr = m ;
+                }
+            }
+        }
+        return rr;
+    }
+
+    /*
+     * Search the suffix array for the bounds l and r that specify the
+     * indices in the suffix array that have the longest common prefix
+     * between the read and the genome.
+     */
+
+    int SearchLCPBounds(T*target, long targetLength, T*query, DNALength queryLength, SAIndex &l, SAIndex &r, DNALength &refOffset, DNALength &queryOffset) {
+        //	 l = 0; r = targetLength;
+        for (; refOffset < targetLength and  queryOffset < queryLength and l < r; queryOffset++, refOffset++) {
+            std::cout << "bounds: " << l << ", " << r << std::endl;
+            //
+            // Band l by the character at query[offset]
+            //
+
+            l = SearchLeftBound(target, targetLength, refOffset, query[queryOffset], l, r);
+
+            //
+            // If the current search is past the end of the suffix array, it
+            // will be impossible to extend.
+            //
+            if (index[l] + refOffset >= targetLength or 
+                    Compare::Compare(target[index[l] + refOffset], query[queryOffset]) != 0) {
+                break;
+            }
+
+            r = SearchRightBound(target, targetLength, refOffset, query[queryOffset], l, r);
+            if (Compare::Compare(query[queryOffset], target[index[l]+refOffset]) != 0 or
+                    Compare::Compare(query[queryOffset], target[index[r]+refOffset]) != 0) {
+                break;
+            }
+        }
+        return refOffset;
+    }
+
+
+    int StoreLCPBounds(T *target, long targetLength,
+            T *query,  long queryLength,
+            SAIndex &low, SAIndex &high) {
+
+        DNALength targetOffset = 0;
+        DNALength queryOffset  = 0;
+
+        DNALength lcpLength = 0;
+        low = 0; high = targetLength;
+        for (; index[low] + targetOffset < targetLength and
+                targetOffset < targetLength  and 
+                queryOffset < queryLength and 
+                low < high ;
+                targetOffset++, queryOffset++, lcpLength++) {
+            //
+            // Band l by the character at query[offset]
+            //
+
+            low = SearchLeftBound(target, targetLength, targetOffset, query[queryOffset], low, high);
+
+            //
+            // If the current search is past the end of the suffix array, it
+            // will be impossible to extend.
+            //
+            if (index[low] + targetOffset > targetLength or 
+                    Compare::Compare(target[index[low] + targetOffset], query[queryOffset]) != 0 or
+                    ThreeBit[query[queryOffset]] > 3) {
+                break;
+            }
+
+            high = SearchRightBound(target, targetLength, targetOffset, query[queryOffset], low, high);
+
+        }
+        return lcpLength;
+
+    }
+
+    int CountNumBranches(T* target, DNALength targetLength, DNALength targetOffset, SAIndex low, SAIndex high) {
+        //
+        // look to see how many different characters start suffices between
+        // low and high at targetOffset
+        //
+
+        // Check some easy boundary conditions.
+        //
+
+        // 1. No branches (indices do not define any subset of the suffix
+        // array). 
+        if (high <= low) {
+            return 0;
+        }
+        // 2. One branch, 
+        if (target[index[low] + targetOffset ] == target[index[high-1] + targetOffset]) {
+            return 1;
+        }
+        int numBranches = 1;
+        // More than one branch.
+        while ( low < high ) {
+            //
+            // Find the band where the suffices share the same chatacter
+            // 'targetOffset' bases into the suffix as the first suffix in
+            // the band given to this function.
+            //
+            SAIndex curCharHigh = high;
+            curCharHigh = SearchRightBound(target, targetLength, targetOffset, target[index[low]+targetOffset], low, high);
+            if (curCharHigh != high) {
+                ++numBranches;
+            }
+            low = curCharHigh;
+        }
+        return numBranches;
+    }
+
+
+    int StoreLCPBounds(T *target, long targetLength, // The string which the suffix array is built on.
+            T *query, DNALength queryLength, // The query string. search starts at pos 0 in this string
+            bool useLookupTable,  // Should the indices of the first k bases be determined by a lookup table?
+            int  maxMatchLength,  // Stop extending match at lcp length = maxMatchLength,
+            // Vectors containing lcpLeft and lcpRight from 0 ... lcpLength.
+            std::vector<SAIndex> &lcpLeftBounds, std::vector<SAIndex> &lcpRightBounds,
+            bool stopOnceUnique=false) {
+
+        //
+        // Precondition: target[l][0] >= query[offset]
+        //
+        long l, r;
+
+        l = 0; r = targetLength;
+        DNALength lcpLength = 0;
+        Tuple lookupTuple;
+        lookupTuple.tuple = -1;
+
+        /*
+         * Various parameters may make the search through the SA not use
+         * the full binary search. If priorLCP is > 0, the search for an
+         * LCP is limited to lcpLeftBounds[priorLCP] and lcpRightBounds[priorLCP].
+         * This is the case when continuing a search using branched
+         * re-uses previous lcp searches.
+         */
+
+        if (useLookupTable and 
+                startPosTable != NULL) {
+            // just in case this was changed.
+            if (lookupTuple.FromStringLR(query, tm)) {
+                l  = startPosTable[lookupTuple.tuple];
+                r  = endPosTable[lookupTuple.tuple];
+                lcpLength = lookupPrefixLength;
+            }
+            else {
+                //
+                // Not able to find a match for this sequence, so do not
+                // register a hit.
+                //
+                l = 0;
+                r = 0;
+                lcpLength = 0;
+                return 0;
+            }
+            //
+            // the values of startPosTable and endPosTable are the same when
+            // there are no matches.  When they are not equal, a valid range
+            // has been found, so store this.
+            //
+            if (l < r) {
+                VectorIndex off_i;
+                VectorIndex boundLength = lcpLeftBounds.size();
+                lcpLeftBounds.push_back(l);
+                lcpRightBounds.push_back(r);
+            }
+            else {
+                //
+                // No exact match found in the lookup table, do not bother
+                // searching, and return 0 lcp length.
+                //
+                return 0;
+            }
+        }
+
+        //
+        // Search the suffix array for the longest common prefix between
+        // the read and the genome.
+        //
+        while( l < r and  
+                lcpLength < queryLength // stop searching when the end of
+                // the query is reached.
+             ) {
+
+            //
+            // If there is only one match in the suffix array, and and not
+            // extending matches as far as possible (stopping the search once
+            // they are unique), halt the search.
+            if (stopOnceUnique and l == r - 1) {
+                break;
+            }
+
+            //
+            // If there is a maximal match length and it is reached, stop
+            // searchign as well.
+            //
+            if (maxMatchLength and lcpLength >= maxMatchLength) {
+                break;
+            }
+
+            //
+            // If the match extends into one or more N's, stop.  The reason
+            // for this is that sometimes people will set up genome databases
+            // by appending a stretch of N's between matches (although they
+            // should just use a multi-fasta file).  Since the reads also
+            // have stretches of N's, this tends to slow the search down
+            // dramatically. 
+            if (ThreeBit[target[index[l] + lcpLength]] >= 4) {
+                break;
+            }
+
+            //
+            // Find the bounds in the suffix array matching query[0... lcp]
+            // and target.
+            //
+
+            l = SearchLeftBound(target, targetLength, lcpLength, query[lcpLength], l, r);
+            r = SearchRightBound(target, targetLength, lcpLength, query[lcpLength], l, r);
+
+
+            //
+            // If the current search is past the end of the suffix array, it
+            // will be impossible to extend.
+            //
+            if (l == r or // if this point is reached, stop loop now since
+                    // otherwise the lcp length will be incremented by
+                    // 1, which will give one longer than the actual
+                    // LCP length.
+                    index[l] + lcpLength >= targetLength or  // This shouldn't
+                    // happen
+                    // End on a mismatch.
+                    ThreeBit[query[lcpLength]] >= 4 or 
+                    Compare::Compare(target[index[l] + lcpLength], query[lcpLength]) != 0
+
+               ) {
+                break;
+            }
+
+
+
+            //
+            // Store the bounds for the current offset.  These are used later
+            // to expand the search if necessary.
+            //
+            lcpLeftBounds.push_back(l);
+            lcpRightBounds.push_back(r);
+            lcpLength++;
+
+
+        }
+        return lcpLength;
+    }
+
+
+    int SearchLow(T *target, T *query, DNALength queryLength, SAIndex l, SAIndex r, SAIndex &low, unsigned int offset=0) {
+
+        long midPos;
+        int high;
+        int numSteps = 0;
+        // 
+        // Boundary conditions, the string is either before (lexicographically) the text
+        // or after.
+        //
+        if (StringLessThanEqual(&query[offset], 
+                    queryLength-offset, 
+                    &target[index[l]+offset], 
+                    length - index[l]-offset)) {
+            low = l;
+            return low;
+        }
+        else if (StringLessThan(&target[index[r]+offset], 
+                    length - index[r] - offset , 
+                    &query[offset], 
+                    queryLength  - offset)) {
+            low = length;
+            return low;
+        }
+
+        //
+        // The string fits somewhere in the text.
+        //
+        low = l;
+        high = r;
+        long diff = ((long) high) - ((long) low);
+        while (diff > 1) {
+            ++numSteps;
+            midPos = ((long) high) + ((long) low);
+            midPos = midPos / 2;
+            if (StringLessThanEqual(&query[offset], queryLength-offset, &target[index[midPos]+offset], length - index[midPos]-offset)) {
+                high = midPos;
+            }
+            else {
+                low = midPos;
+            }
+            diff = ((long) high) - ((long) low);
+        }
+
+        //
+        // The search is for the least position such that the query is greater than or equal to the text.
+        // High tracks the positions that may be equal to the query, and low is strictly less than the query. 
+        // At the end of the search, high is either pointing to the query, or the first element where the query
+        // could be placed before high without changing the order of target.
+        //
+        low = high;
+        diff = ((long) high) - ((long) low);
+        return low;
+        //		cout << "search low took: " << numSteps << endl;
+    }
+
+
+    int SearchHigh(T *target, T *query, DNALength queryLength, SAIndex l, SAIndex r,  SAIndex &high, unsigned int offset=0) {
+
+        //
+        // Find the last position where the query is less than the target.
+        //
+        long midPos;
+        int low;
+        int numSteps = 0;
+        // 
+        // Boundary conditions, the string is either before (lexicographically) the text
+        // or after.
+        //
+        if (StringLessThan(&target[index[r]+offset], length - index[r] - offset, &query[offset], queryLength-offset)) {
+            high = -1;
+            return high;
+        }
+
+        //
+        // The string fits somewhere in the text.
+        //
+        low = l;
+        high = r;
+        long diff = ((long) high) - ((long) low);
+        while (diff > 1) {
+            ++numSteps;
+            midPos = ((long) high) + ((long) low);
+            midPos = midPos / 2;
+            if (StringLessThan(&query[offset], queryLength - offset, &target[index[midPos]+offset], length - index[midPos] - offset)) {
+                high = midPos;
+            }
+            else {
+                low = midPos;
+            }
+            diff = ((long) high) - ((long) low);
+        }
+
+        //
+        // The search is for the last position where the query is less than or equal to the text.  High is 
+        // strictly greater than or the query.  Low is less than or equal to the query.  At the end, low will be 
+        // the last spot where query could be inserted after and not wreck the ordering of the array.
+        //
+        high = low;
+        //		cout << "search high took: " << numSteps << " steps." << endl;
+    }
+};
+
+
+
+#endif // _BLASR_SUFFIX_ARRAY_HPP_
diff --git a/libcpp/alignment/suffixarray/SuffixArrayTypes.hpp b/libcpp/alignment/suffixarray/SuffixArrayTypes.hpp
new file mode 100644
index 0000000..a9047dc
--- /dev/null
+++ b/libcpp/alignment/suffixarray/SuffixArrayTypes.hpp
@@ -0,0 +1,17 @@
+#ifndef _BLASR_SUFFIX_ARRAY_TYPES_HPP_
+#define _BLASR_SUFFIX_ARRAY_TYPES_HPP_
+
+#include <vector>
+#include "SuffixArray.hpp"
+#include "SharedSuffixArray.hpp"
+
+#include "CompressedSequence.hpp"
+#include "Compare4BitCompressed.hpp"
+#include "FASTASequence.hpp"
+
+typedef SuffixArray<Nucleotide, std::vector<int> > DNASuffixArray;
+typedef SuffixArray<Nucleotide, std::vector<int>, 
+	                  Compare4BitCompressed<Nucleotide>,
+	                  CompressedDNATuple<FASTASequence> >       CompressedDNASuffixArray;
+
+#endif // _BLASR_SUFFIX_ARRAY_TYPES_HPP_
diff --git a/libcpp/alignment/suffixarray/ssort.hpp b/libcpp/alignment/suffixarray/ssort.hpp
new file mode 100644
index 0000000..0a6f9b8
--- /dev/null
+++ b/libcpp/alignment/suffixarray/ssort.hpp
@@ -0,0 +1,449 @@
+/****************************************************************
+Copyright (C) Lucent Technologies 1997
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name Lucent Technologies or any of
+its entities not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+****************************************************************/
+/*
+	Suffix sort
+	Peter M. McIlroy
+	M. Douglas McIlroy
+
+Prototype
+	int ssort(int a[], int s[]);
+
+Purpose
+	Return in a[] a suffix array for the original
+	contents of a[].  (The original values in a[]
+	are typically serial numbers of distinct tokens
+	in some list.)  Optionally return in s[] an
+	array of shared lengths between adjacent sorted
+	suffixes.
+
+Precondition
+	Array a[] holds n values, with n>=1.  Exactly k 
+	distinct values, in the range 0..k-1, are present.
+	Value 0, an endmark, appears exactly once, at a[n-1].
+	Pointer s is 0 or points to an array of n elements.
+
+Postcondition
+	Array a[] is a copy of the internal array p[]
+	that records the sorting permutation: if i<j
+	then the original suffix a[p[i]..n-1] is
+	lexicographically less than a[p[j]..n-1].
+
+	If s is nonzero, its elements are filled in with
+	"shared lengths": s[i] is the length of the agreeing
+	prefixes of a[p[i-1]..n-1] and a[p[i]..n-1].
+	s[0] is 0.
+
+Return value
+	0 success
+	1 out of space; data unchanged
+	2 bad data; data may be changed
+
+Cost
+	Sorting takes time O(n log m), where m is the longest
+	duplicate (possibly overlapped) substring, and uses n words
+	of temporary memory.  There are at most log n passes,
+	each involving essentially 5 serial and 6 random
+	traversals of size-n arrays (a[] and p[]).  Shared
+	lengths cost an extra n words of temporary memory;
+	for time cost see comment with function shared() below.
+
+	A tradeoff desribed after step (3) below saves
+	about 20% in time at the cost of another n words.
+
+Terminology
+	"The h-gram at a[i]" is the string a[i], a[i+1], ...,
+	a[i+h-1], with subscripts taken mod n, except that
+	when h=0 the "0-gram" at a[i] is a[i].  (More succinctly,
+	the h-gram at a[i] is a[i], ..., a[i+max(h,1)-1].)
+	"The h-successor of the h-gram at a[i]" is the h-gram
+	at a[i+h].  
+	
+Method
+	Order 2h-grams by doing steps (1)-(5) below
+	for h = 0, 1, 2, 4, ...  Because of the unique endmark,
+	ordering n-grams (or longer grams) is exactly the same as 
+	ordering the suffixes of a[].
+
+	This is a fillip on radix sort.  The i-th stage of a
+	traditional radix sort distributes on the i-th "character"
+	counting from the right of the keys, thus arranging the keys
+	so that their i-character suffixes are in lexicographic order.
+	Here, instead, we distribute on h-gram prefixes of 2h-grams,
+	where h = 2^i, thus arranging 2h-grams in order.  Each 
+	h-gram is coded into one element of a[].
+	This is possible within a constant word width because
+	there are only n h-grams for any h.  With 2^i-grams being
+	placed in order at stage i, and each stage taking time O(n),
+	sorting is complete after log n stages for a total
+	time of O(n log n).
+
+	The method for shared lengths is given with the
+	shared-length code far below.
+
+History
+	The general radix-sorting notion is due to Manber and
+	Myers, SODA '91, who used a big-endian radix sort.  They
+	also made the observation that by cleverly multiplexing
+	uses of the two arrays, one can get by with O(1) extra
+	space beyond arrays a[] and p[].  The circular-array idea,
+	which greatly simplifies the program, is due to P. McIlroy.
+	Steps (1) and (2) below are based on M&M's method for
+	the first cycle (h=0); they do something entirely different
+	for the h-gram doubling cycles and develop in a[] the
+	inverse of permutation p[].  
+
+	The state of the art has improved since this code was
+	written.  A variant developed independently by (at least)
+	Larssen at Lund, Sadakane at Tokyo and Quinlan at Bell Labs
+	is several times as fast; see Larssen and Sadakane 
+	LU-CS-TR:99-214, Dept. of CS, Lund Univ. Sweden.
+
+Data used in the sort
+	a[]   array of h-gram codes.
+	al[]  linked-list area, overlaid on a[].
+	p[]   permutation.
+	pl[]  list heads, overlaid on p[].
+	s[]   array of shared lengths (optional).
+	q[]   tree of bucket refinements, for calculating s[].
+	ORIG  mark at the end of lists, originally on p[].
+	BUCK  mark at start of "buckets", stretches of p[]
+	      that point to identical codes in a[].
+
+	Were the overlaid arrays pulled apart, the algorithm would
+	simplify only slightly, mainly by dropping the inner loop from
+	steps (1) and (2).
+
+Description of steps, except for optional shared lengths
+
+(0)	(0a) Initialize p[] to contain the identity permutation.
+	(0b) Place mark ORIG on every element of p[].
+
+State before step 1
+	Each element a[i] encodes the h-gram at a[i].
+	The h-grams are coded 0,..,k-1 in increasing
+	lexicographic order.  When h>0, permutation p[] 
+	lists h-grams in lexicographic order: if i<j then
+	a[p[i]] <= a[p[j]].  When h=0, p[] contains
+	the input order 0,..,n-1.
+
+(1)	Construct in al[] linked lists of like-valued
+	codes in a[] ordered in reverse of the order
+	of their h-successors as given by p[].
+	(Done by iterating over elements of a[] in p[]-order
+	and operating on their h-predecessors.)
+
+	Place in pl[j] the head of the list of elements with
+	value j.  Thus, if a[7]=a[3]=a[9]=2, and these
+	elements were visited in this order according to p[],
+	then pl[2]=9, al[9]=3, al[3]=7.  The list is developed
+	by pushing previous contents of pl[j] onto the list.
+	In particular the original content of pl[j] (which
+	was p[j]) gets pushed to the end of the list (al[7]
+	in the example), still bearing the mark ORIG.  The mark
+	serves both to note the end of the list and to flag the
+	fact that this element contains a quantity of a different
+	kind.
+
+	During step (1), a[] contains three kinds of data:
+	unprocessed elements of a[], list links of al[]
+	and list ends, marked ORIG, that contain original
+	data from p[].  p[] contains two kinds of data:
+	elements of p[], marked ORIG, and elements of pl[].
+
+	The elements of p[] that have been displaced by pl[] 
+	are retrieved by chasing the lists; this is done by
+	a for loop.  Each list will be chased at most once in
+	step (1) and once in step (2) and the total size of
+	all lists will never exceed n, so the overhead of list
+	chasing is at most linear in n.
+
+State before step (2)
+	Array a[] has been wiped out and replaced by
+	the lists of al[], which together with pl[] give
+	exactly the same information.  The first k elements
+	of p[] are occupied by pl[] and the remaining elements
+	are occupied by ORIG-marked elements of p[].
+
+(2)	Make p[] point to the (former) elements of a[]
+	in order of increasing value.  This is done in reverse:
+	biggest values first, and for each value running out the
+	list created in (1), which is already in reverse order.
+	New values fill in the size-n array p[] from the top,
+	while the size-k array pl[] of list heads shrinks
+	toward the bottom.  Because no list is empty, the 
+	two uses of p[] cannot collide.
+
+	Place mark BUCK at each bucket start, namely the
+	element of p[] last transferred from each list.
+
+State before step 3
+	Permutation p[] lists h-grams in lexicographic order.
+	It is bucketed by h-grams.  Within each bucket h-grams
+	are ordered by their h-successors.
+
+(3)	Reconstruct codes in a[] from the buckets.  The
+	element of a[] pointed to from the first bucket is 0;
+	the elements pointed to from the second bucket are 1;
+	and so on.
+
+	This step would be unnecessary if al[] did not share
+	storage with a[].  Then steps (2) and (4) could
+	be combined.
+
+State before step 4
+	Permutation p[] is as before step 3, and code array
+	a[] is as before step 1.
+
+(4)	Refine buckets by values of h-successors in a[] by
+	placing a BUCK mark on each p[i] where the h-successors
+	of a[p[i]] and a[p[i-1]] differ.
+
+State before step 5
+	Array p[] holds an ordered, bucketed list of 2h-grams.
+
+(5)	Recode a[] according to the new buckets, exactly as
+	a[] was reconstructed in step (3).  Count the
+	buckets to determine a new value of k.  If k==n, every
+	bucket is a singleton and sorting is complete.
+
+
+Bad input
+	Code that invokes finish() is solely defensive.  It
+	could be dropped if you like to live dangerously.
+*/
+
+#include <stdlib.h>
+
+enum {
+	ORIG = ~(~0u>>1),			/* sign bit */
+	BUCK = ~(~0u>>1)
+};
+
+void shared(SAIndex a[], SAIndex n, SAIndex p[], SAIndex q[], SAIndex s[], int h);
+
+#define pred(i, h) ((t=(i)-(h))<0?  t+n: t)
+#define succ(i, h) ((t=(i)+(h))>=n? t-n: t)
+
+inline int
+ssort(SAIndex a[], SAIndex s[]) 
+{
+    SAIndex h, i, j, l, n, t;
+    SAIndex k = 0;				/* initialized for lint */
+    SAIndex *p = 0;
+    int result = 0;
+    SAIndex *q = 0;
+#	define al a
+#	define pl p
+#	define finish(r)  if(1){result=r; goto out;}else
+
+    for(j=n=0; a[n]>0; n++)			/* find n */
+        if(a[n] > j)
+            j = a[n];		/* and max element */
+    if(a[n++]<0 || j>=n)
+        finish(2);
+    //	p = malloc(n*sizeof(int));
+    p = new SAIndex[n];
+    if(p == 0)
+        finish(1);
+
+    for(i=0; i<n; i++)			/* (0) initialize */
+        p[i] = i | ORIG;
+
+    if(s) {					/* shared lengths */
+        //		q = malloc(n*sizeof(int));
+        q = new SAIndex[n];
+        if(q == 0)
+            finish(1);
+    }
+
+    for(h = 0; ; h = h==0? 1: 2*h) {
+        for(i=0; i<n; i++) {		/* (1) link */
+            for(j=p[i]; !(j&ORIG); j=al[j]);
+            j = pred(j&~ORIG, h);
+            l = a[j];
+            al[j] = pl[l];
+            pl[l] = j;
+        }
+
+        if(h == 0) {			/* find k */
+            for(k=0; k<n; k++)
+                if(pl[k]&ORIG)
+                    break;
+
+            for(i=k; i<n; i++)	/* check input */
+                if(!(pl[i]&ORIG))
+                    finish(2);
+        }
+
+        for(i=n; --k>=0; ) {		/* (2) order */
+            j = pl[k];
+            do
+                p[--i] = j;
+            while(!((j=al[j]) & ORIG));
+            p[i] |= BUCK;
+        }
+
+        for(i=0; i<n; i++) {		/* (3) reconstruct */
+            if(p[i] & BUCK)
+                k++;
+            a[p[i]&~BUCK] = k;
+        }
+
+        for(i=0, j=-1; i<n; i++, j=l) {	/* (4) refine */
+            l = a[succ(p[i]&~BUCK, h)];
+            if(l != j)
+                p[i] |= BUCK;
+
+        }
+        if(s)
+            shared(a, n, p, q, s, h);
+
+        for(i=0, k=-1; i<n; i++) {	/* (5) recode */
+            if(p[i] & BUCK)
+                k++;
+            a[p[i]&~BUCK] = k;
+            p[i] |= ORIG;		/* (0b) reinitialize */
+        }
+        if(++k >= n)
+            break;
+    }
+
+    for(i=0; i<n; i++)
+        a[i] = p[i] & ~ORIG;
+
+out:
+    delete [] p;
+    delete [] q;
+    return result;
+}
+
+/* shareda.c: shared lengths for suffix arrays by ancestor tree
+
+	a[] temporary space, used for pointers to containing buckets
+	n, p[], s[], h as in ssort()
+	q[] tree of bucket heads
+
+	Array q holds a tree of bucket heads.  Initially q[0]
+	is 0 and q[i] = -1 for i>0.  For each new bucket i
+	created in the current pass, q[i] is (notionally)
+	made to point to the previous bucket, j.  The shared
+	length between the i-1st and i-th smallest suffix
+	is stored in s[i].  The shared length between two
+	arbitrary buckets is the minimum of the stored
+	shared lengths on the paths to their nearest common
+	ancestor (excluding that ancestor).
+
+	For efficient search, paths are compressed by making
+	each bucket point to the next bucket on the path to
+	the root with a strictly smaller stored shared length.  
+	This may change the identity of the nearest common
+	ancestor, but does not affect shared lengths.
+
+Cost
+	There are 3 serial passes and 1 random pass over
+	size-n arrays per call, plus the inner loops of steps
+	(2) and (3), each of which is executed n times fpr
+	each call of ssort().  The asymptotic worst case has
+	not been analyzed, however the code has always been
+	seen to be at least as fast as a guaranteed O(n log n)
+	method that takes twice as much code.  (That method
+	keeps in element i of an integer array the minimum
+	value of s[] over the largest aligned power-of-2
+	interval beginning at i.)
+
+(0)	On the first pass, with h=0, the shared length between
+	buckets is zero, and every bucket bcomes a child of the
+	root node, 0.
+
+(1)	On subsequent passes the old bucket that each potential
+	new bucket refines is remembered in a[].  Array a[]
+	is ordered by substring places, while q[] is ordered
+	by substring values.
+
+	If the values placed in a[] were kept in another array,
+	the loops of shared() could be combined with loops of
+	lssort().
+
+(2)	When an h-gram bucket is split, the shared lengths between 
+	adjacent subbuckets is h+u, where u is the shared length
+	between the h-successors that differed (causing the split).
+	To find u, we locate the nearest common ancestor.
+
+	The common ancestor is found by searching the path from
+	the higher-numbered bucket, k1, until reaching a bucket
+	whose number does not exceed that of the lower-numbered
+	bucket, k0.  This method is justified by two observations.
+	All the new subbuckets have strictly longer shared lengths
+	than all the old buckets.  All the subbuckets of a
+	bucket fall between the bucket head and its next higher
+	numbered sibling.
+
+(3)	After new buckets have been processed, the tree q is
+	updated.  New buckets are recognized by having mark
+	BUCK and q[i]<0.
+*/
+
+inline void
+shared(SAIndex a[], SAIndex n, SAIndex p[], SAIndex q[], SAIndex s[], int h)
+{
+    SAIndex i, j, k0, k1, t, u;
+    if(h == 0) {			/* (0) initialize */
+        for(i=0; i<n; i++)
+            if(p[i]&BUCK)
+                q[i] = s[i] = 0;
+            else
+                q[i] = -1;
+        return;
+    }
+
+    for(i=j=0; i<n; i++) {		/* (1) get parents */
+        if(q[i] >= 0)
+            j = i;
+        a[p[i]&~BUCK] = j;
+    }
+
+    for(i=0; i<n; i++) {		/* (2) find lengths */
+        if(!(p[i]&BUCK))
+            continue;
+        k0 = j;			/* k0=garbage if i=0 */
+        k1 = j = a[succ(p[i]&~BUCK, h)];
+        if(q[i] >= 0)
+            continue;
+        for(u=n; k1>k0; k1=q[k1])
+            if(s[k1] < u)
+                u = s[k1];
+        s[i] = h + u;
+    }
+
+    for(i=0; i<n; i++)		/* (3) update tree */
+        if(p[i]&BUCK) {
+            if(q[i] < 0)
+                for(t=j; ;t=q[t]) {
+                    q[i] = t;
+                    if(s[i] > s[t])
+                        break;
+                }
+            j = i;
+        }
+}
diff --git a/libcpp/alignment/tuples/BaseTuple.cpp b/libcpp/alignment/tuples/BaseTuple.cpp
new file mode 100644
index 0000000..fefbab7
--- /dev/null
+++ b/libcpp/alignment/tuples/BaseTuple.cpp
@@ -0,0 +1,53 @@
+#include <stdint.h>
+#include "Types.h"
+#include "TupleMask.h"
+#include "TupleMetrics.hpp"
+#include "BaseTuple.hpp"
+
+ULong BaseTuple::HashPowerOfFour(int nBases, TupleMetrics &tm) {
+    //
+    // When the hash can fit inside the entire tuple, just return the
+    // tuple.
+    //
+    if (tm.tupleSize > nBases) {
+        return tuple;
+    }
+    else {
+        return ((tuple & TupleMask[nBases]) + (tuple % 1063)) % (1 << (nBases*2));
+    }
+}
+
+int BaseTuple::operator<(const BaseTuple &rhs) const {
+    return tuple < rhs.tuple;
+}
+
+int BaseTuple::operator==(const BaseTuple &rhs) const {
+    return tuple == rhs.tuple;
+}
+
+int BaseTuple::operator!= (const BaseTuple &rhs) const {
+    return tuple != rhs.tuple;
+}
+
+BaseTuple BaseTuple::ShiftLeft(TupleMetrics &tm, ULong shift) {
+    tuple = tuple << shift;
+    tuple = tuple & tm.tupleMask;
+    return *this;
+}
+
+BaseTuple BaseTuple::ShiftRight(ULong shift) {
+    tuple = tuple >> shift;
+    return *this;
+}
+
+BaseTuple BaseTuple::Append(ULong val, TupleMetrics &tm, ULong nBits) {
+    tuple = tuple << nBits;
+    tuple = tuple & tm.tupleMask;
+    tuple = tuple + val;
+    return *this;
+}
+
+long BaseTuple::ToLongIndex() {
+    long tempTuple = tuple;
+    return tempTuple;
+}
diff --git a/libcpp/alignment/tuples/BaseTuple.hpp b/libcpp/alignment/tuples/BaseTuple.hpp
new file mode 100644
index 0000000..0a6a9ea
--- /dev/null
+++ b/libcpp/alignment/tuples/BaseTuple.hpp
@@ -0,0 +1,27 @@
+#ifndef _BLASR_BASE_TUPLE_HPP_
+#define _BLASR_BASE_TUPLE_HPP_
+
+#include "tuples/TupleMetrics.hpp"
+
+class BaseTuple {
+public:
+    ULong  tuple;
+
+    ULong  HashPowerOfFour(int nBases, TupleMetrics &tm);
+
+    int operator<(const BaseTuple &rhs) const; 
+
+    int operator==(const BaseTuple &rhs) const; 
+
+    int operator!= (const BaseTuple &rhs) const;
+
+    BaseTuple ShiftLeft(TupleMetrics &tm, ULong shift=1L); 
+
+    BaseTuple ShiftRight(ULong shift=1L); 
+
+    BaseTuple Append(ULong val, TupleMetrics &tm, ULong nBits); 
+
+    long ToLongIndex(); 
+};
+
+#endif
diff --git a/libcpp/alignment/tuples/CompressedDNATuple.hpp b/libcpp/alignment/tuples/CompressedDNATuple.hpp
new file mode 100644
index 0000000..c60a838
--- /dev/null
+++ b/libcpp/alignment/tuples/CompressedDNATuple.hpp
@@ -0,0 +1,63 @@
+#ifndef _BLASR_COMPRESSED_DNA_TUPLE_HPP_
+#define _BLASR_COMPRESSED_DNA_TUPLE_HPP_
+
+#include "DNATuple.hpp"
+#include "CompressedSequence.hpp"
+
+template<typename T_Sequence>
+class CompressedDNATuple : public DNATuple {
+    static const unsigned char mask = 0xf;
+    public:
+    int FromStringLR(Nucleotide *strPtr, TupleMetrics &tm) {
+        //
+        // Make sure the sequence contains all valid characters.
+        //
+
+        if (!CompressedSequence<T_Sequence>::Only4BitACTG(strPtr, tm.tupleSize)) 
+            return 0;
+
+        if (tm.tupleSize == 0)
+            return 1;
+
+        tuple = 0;
+        Nucleotide *p;
+        Nucleotide *endPtr = &strPtr[tm.tupleSize - 1];
+        for (p = strPtr; p != endPtr; p++) {
+            tuple += TwoBit[*p & mask];
+            tuple <<=2;
+        }
+        //
+        // The tuple size is guaranteed to be at least 
+        // 1, so it's safe to add the last value.
+        // This cannot be in the previous loop since
+        // the shift shouldn't happen.
+        tuple += TwoBit[*p & mask];
+        return 1;
+    }
+
+
+    int FromStringRL(Nucleotide *strPtr, TupleMetrics &tm) {
+
+        if (!CompressedSequence<T_Sequence>::Only4BitACTG((CompressedNucleotide*)strPtr, tm.tupleSize))
+            return 0;
+
+        if (tm.tupleSize == 0)
+            return 1;
+
+        tuple = 0;
+        Nucleotide *p;
+        for (p = strPtr + tm.tupleSize - 1; p > strPtr; p--) {
+            tuple += TwoBit[*p & mask];
+            tuple <<=2;
+        }
+        //
+        // The tuple size is guaranteed to be at least 
+        // 1, so it's safe to add the last value.
+        // This cannot be in the previous loop since
+        // the shift shouldn't happen.
+        tuple += TwoBit[*p & mask];
+        return 1;
+    }
+};
+
+#endif // _BLASR_COMPRESSED_DNA_TUPLE_HPP_
diff --git a/libcpp/alignment/tuples/CountedTuple.h b/libcpp/alignment/tuples/CountedTuple.h
new file mode 100644
index 0000000..acb997e
--- /dev/null
+++ b/libcpp/alignment/tuples/CountedTuple.h
@@ -0,0 +1,16 @@
+#ifndef COUNTED_TUPLE_H_
+#define COUNTED_TUPLE_H_
+
+#include "tuples/DNATuple.h"
+
+class CountedDNATuple : public DNATuple {
+ public:
+	int count;
+	int IncrementCount() {
+		count = count + 1;
+	}
+	
+};
+
+
+#endif
diff --git a/libcpp/alignment/tuples/DNATuple.cpp b/libcpp/alignment/tuples/DNATuple.cpp
new file mode 100644
index 0000000..cf779dd
--- /dev/null
+++ b/libcpp/alignment/tuples/DNATuple.cpp
@@ -0,0 +1,94 @@
+#include "tuples/DNATuple.hpp"
+
+
+int DNATuple::FromStringRL(Nucleotide *strPtr, TupleMetrics &tm) {
+
+    //
+    // Tuples are created with the right-most character
+    // in the most significant bit in the sequence.
+    //
+    DNASequence tmpSeq;
+    tmpSeq.seq = strPtr;
+    tmpSeq.length = tm.tupleSize;
+    if (!OnlyACTG(tmpSeq))
+        return 0;
+
+    if (tm.tupleSize == 0)
+        return 1;
+
+    tuple = 0;
+    Nucleotide *p;
+    for (p = strPtr + tm.tupleSize - 1; p > strPtr; p--) {
+        tuple += TwoBit[*p];
+        tuple <<=2;
+    }
+    //
+    // The tuple size is guaranteed to be at least 
+    // 1, so it's safe to add the last value.
+    // This cannot be in the previous loop since
+    // the shift shouldn't happen.
+    tuple += TwoBit[*p];
+    return 1;
+}
+
+
+int DNATuple::MakeRC(DNATuple &dest, TupleMetrics &tm) {
+    int i;
+    ULong tempTuple = tuple;
+    dest.tuple = 0;
+    ULong mask = 0x3;
+    if (tm.tupleSize == 0)
+        return 0;
+    for (i = 0; i < tm.tupleSize - 1; i++ ) {
+        dest.tuple += (~tempTuple & mask);
+        tempTuple >>= 2;
+        dest.tuple <<= 2;
+    }
+    dest.tuple += (~tempTuple & mask);
+    return 1;
+}
+
+std::string DNATuple::ToString(TupleMetrics &tm) {
+    int i;
+    std::string s;
+    ULong tempTuple = tuple;
+    for (i = 0;i < tm.tupleSize;i++) {
+        s.insert(s.begin(), TwoBitToAscii[tempTuple & 3]);
+        tempTuple = tempTuple >> 2;
+    }
+    return s;
+}
+
+bool 
+CompareByTuple::operator()(const DNATuple &lhs, const DNATuple &rhs) 
+const {
+    return lhs.tuple < rhs.tuple;
+}
+
+int PositionDNATuple::operator==(const DNATuple &pTuple) const {
+    return tuple == pTuple.tuple;
+}
+
+PositionDNATuple::PositionDNATuple() : DNATuple() {
+    pos = -1;
+}
+
+PositionDNATuple::PositionDNATuple(PositionDNATuple &tupleP, DNALength posP) {
+    tuple = tupleP.tuple;
+    pos   = posP;
+}
+
+
+int 
+OrderPositionDNATuplesByPosition::operator()(
+    const PositionDNATuple &lhs, const PositionDNATuple &rhs) 
+const {
+    return lhs.pos < rhs.pos;
+}
+
+int
+OrderPositionDNATuplesByTuple::operator()(
+    const PositionDNATuple &lhs, const PositionDNATuple &rhs) 
+const {
+    return lhs.tuple < rhs.tuple;
+}
diff --git a/libcpp/alignment/tuples/DNATuple.hpp b/libcpp/alignment/tuples/DNATuple.hpp
new file mode 100644
index 0000000..57a12ff
--- /dev/null
+++ b/libcpp/alignment/tuples/DNATuple.hpp
@@ -0,0 +1,103 @@
+#ifndef _BLASR_DNA_TUPLE_HPP_
+#define _BLASR_DNA_TUPLE_HPP_
+
+#include <cassert>
+#include <vector>
+#include <stdint.h>
+#include <ostream>
+#include <string>
+#include "Types.h"
+#include "SeqUtils.hpp"
+#include "DNASequence.hpp"
+#include "NucConversion.hpp"
+#include "tuples/BaseTuple.hpp"
+#include "tuples/TupleMetrics.hpp"
+#include "tuples/TupleList.hpp"
+#include "tuples/TupleOperations.h"
+
+class DNATuple : public BaseTuple {
+public:
+    DNALength pos;
+
+    inline int FromStringLR(Nucleotide *strPtr, TupleMetrics &tm);
+
+    int FromStringRL(Nucleotide *strPtr, TupleMetrics &tm); 
+
+    inline int ShiftAddRL(Nucleotide nuc, TupleMetrics &tm); 
+
+    int MakeRC(DNATuple &dest, TupleMetrics &tm); 
+
+    std::string ToString(TupleMetrics &tm); 
+};
+
+class CompareByTuple {
+public:
+    bool operator()(const DNATuple &lhs, const DNATuple &rhs) const; 
+};
+
+
+class CountedDNATuple : public DNATuple {
+public:
+    int count;
+};
+
+class PositionDNATuple : public DNATuple {
+public:
+    PositionDNATuple& operator=(const PositionDNATuple &rhs) {
+        pos = rhs.pos;
+        tuple = rhs.tuple;
+        return *this;
+    }
+
+    int operator<(const PositionDNATuple & pTuple) const {
+        if (tuple < pTuple.tuple) 
+            return 1;
+        else if (tuple == pTuple.tuple) 
+            return pos < pTuple.pos;
+        else 
+            return 0;
+    }
+
+    int operator==(const PositionDNATuple &pTuple) const {
+        return tuple == pTuple.tuple and pos == pTuple.pos;
+    }
+
+    int operator<(const DNATuple &pTuple) const {
+        return (tuple < pTuple.tuple);
+    }
+
+    int operator==(const DNATuple &pTuple) const; 
+
+    int operator!=(const DNATuple &pTuple) const {
+        return tuple != pTuple.tuple;
+    }
+
+    PositionDNATuple();
+
+    PositionDNATuple(PositionDNATuple &tupleP, DNALength posP); 
+
+};
+
+class OrderPositionDNATuplesByPosition {
+public:
+    int operator()(const PositionDNATuple &lhs, const PositionDNATuple &rhs) const; 
+};
+
+class OrderPositionDNATuplesByTuple {
+public:
+    int operator()(const PositionDNATuple &lhs, const PositionDNATuple &rhs) const; 
+};
+
+
+template<typename Sequence> 
+int SearchSequenceForTuple(Sequence &seq, TupleMetrics &tm, DNATuple &queryTuple); 
+
+template<typename Sequence>
+int SequenceToTupleList(Sequence &seq, TupleMetrics &tm, TupleList<DNATuple> &tupleList);
+
+template<typename Sequence>
+int SequenceToTupleList(Sequence &seq, TupleMetrics &tm, TupleList<PositionDNATuple> &tupleList); 
+
+#include "DNATupleImpl.hpp"
+
+#endif // _BLASR_DNA_TUPLE_HPP_
diff --git a/libcpp/alignment/tuples/DNATupleImpl.hpp b/libcpp/alignment/tuples/DNATupleImpl.hpp
new file mode 100644
index 0000000..4ba748e
--- /dev/null
+++ b/libcpp/alignment/tuples/DNATupleImpl.hpp
@@ -0,0 +1,200 @@
+#include <cassert>
+#include "NucConversion.hpp"
+
+inline int DNATuple::FromStringLR(Nucleotide *strPtr, TupleMetrics &tm) {
+    DNASequence tmpSeq;
+    tmpSeq.seq = strPtr;
+    tmpSeq.length = tm.tupleSize;
+    if (!OnlyACTG(tmpSeq))
+        return 0;
+
+    if (tm.tupleSize == 0)
+        return 1;
+
+    tuple = 0;
+    Nucleotide *p;
+    Nucleotide *endPtr = &strPtr[tm.tupleSize - 1];
+    for (p = strPtr; p != endPtr; p++) {
+        // If it is not possible to convert this string, return null.
+        if (ThreeBit[*p] > 3) {
+            return 0;
+        }
+        tuple += TwoBit[*p];
+        tuple <<=2;
+    }
+    //
+    // The tuple size is guaranteed to be at least 
+    // 1, so it's safe to add the last value.
+    // This cannot be in the previous loop since
+    // the shift shouldn't happen.
+    tuple += TwoBit[*p];
+    return 1;
+}
+
+
+inline int DNATuple::ShiftAddRL(Nucleotide nuc, TupleMetrics &tm) {
+    if (ThreeBit[nuc] > 3) {
+        return 0;
+    }
+    else {
+        tuple >>= 2;
+        tuple += (TwoBit[nuc] << ((tm.tupleSize-1)*2));
+        return 1;
+    }
+}
+
+
+template<typename Sequence> 
+int SearchSequenceForTuple(Sequence &seq, TupleMetrics &tm, DNATuple &queryTuple) {
+    DNALength p;
+    PositionDNATuple tempTuple, upperTuple;
+
+    p = 0;
+    DNALength cur = 0;
+    DNALength curValidEnd = 0;
+
+    //
+    // Construct the mask-off bit pair for the shifted tuple.
+    //
+    PositionDNATuple maskLeftTuple;
+    maskLeftTuple.tuple = 3;
+    maskLeftTuple.tuple = maskLeftTuple.tuple << 2*tm.tupleSize;
+    maskLeftTuple.tuple = ~maskLeftTuple.tuple;
+    PositionDNATuple testTuple;
+    while (curValidEnd < seq.length) {
+        //
+        // Search for the next available window that can be translated into a tuple.
+        //
+        cur = curValidEnd;
+        while(curValidEnd < seq.length and IsACTG[seq.seq[curValidEnd]]) {
+            curValidEnd++;
+        }
+        if (curValidEnd - cur >= tm.tupleSize) {
+            //
+            // Found a span that does not have N's in it, 
+            //
+            assert (tempTuple.FromStringRL(&(seq.seq[cur]), tm) == 1);
+            p = cur;
+            if (tempTuple.tuple == queryTuple.tuple) {
+                return 1;
+            }
+            for (p++; p < curValidEnd - tm.tupleSize + 1; p++) {
+                tempTuple.tuple >>=2;
+                //				tempTuple.tuple &= maskLeftTuple.tuple;
+                upperTuple.tuple = TwoBit[seq.seq[p+tm.tupleSize-1]];
+                upperTuple.tuple = upperTuple.tuple << (2 * (tm.tupleSize-1));
+                tempTuple.tuple += upperTuple.tuple;
+                if (tempTuple.tuple == queryTuple.tuple) {
+                    return 1;
+                }
+            }
+        }
+        else {
+            ++curValidEnd;
+        }
+    }
+}
+
+
+template<typename Sequence>
+int SequenceToTupleList(Sequence &seq, TupleMetrics &tm, TupleList<DNATuple> &tupleList) {
+    DNALength p;
+    PositionDNATuple tempTuple, upperTuple;
+
+    p = 0;
+    DNALength cur = 0;
+    DNALength curValidEnd = 0;
+
+    //
+    // Construct the mask-off bit pair for the shifted tuple.
+    //
+    PositionDNATuple maskLeftTuple;
+    maskLeftTuple.tuple = 3;
+    maskLeftTuple.tuple = maskLeftTuple.tuple << 2*tm.tupleSize;
+    maskLeftTuple.tuple = ~maskLeftTuple.tuple;
+    PositionDNATuple testTuple;
+    while (curValidEnd < seq.length) {
+        //
+        // Search for the next available window that can be translated into a tuple.
+        //
+        cur = curValidEnd;
+        while(curValidEnd < seq.length and IsACTG[seq.seq[curValidEnd]]) {
+            curValidEnd++;
+        }
+        if (curValidEnd - cur >= tm.tupleSize) {
+            //
+            // Found a span that does not have N's in it, 
+            //
+            assert (tempTuple.FromStringRL(&(seq.seq[cur]), tm) == 1);
+            p = cur;
+            tupleList.Append(tempTuple);
+            for (p++; p < curValidEnd - tm.tupleSize + 1; p++) {
+                tempTuple.tuple >>=2;
+                //				tempTuple.tuple &= maskLeftTuple.tuple;
+                upperTuple.tuple = TwoBit[seq.seq[p+tm.tupleSize-1]];
+                upperTuple.tuple = upperTuple.tuple << (2 * (tm.tupleSize-1));
+                tempTuple.tuple += upperTuple.tuple;
+                //testTuple.FromStringRL(&seq.seq[p], tm);
+                //assert(testTuple.tuple == tempTuple.tuple);
+                tupleList.Append(tempTuple);
+            }
+        }
+        else {
+            ++curValidEnd;
+        }
+    }
+    return tupleList.size();
+}
+
+
+template<typename Sequence>
+int SequenceToTupleList(Sequence &seq, TupleMetrics &tm, TupleList<PositionDNATuple> &tupleList) {
+    DNALength p;
+    PositionDNATuple tempTuple, upperTuple;
+
+    p = 0;
+    DNALength cur = 0;
+    DNALength curValidEnd = 0;
+
+    //
+    // Construct the mask-off bit pair for the shifted tuple.
+    //
+    PositionDNATuple maskLeftTuple;
+    maskLeftTuple.tuple = 3;
+    maskLeftTuple.tuple = maskLeftTuple.tuple << 2*tm.tupleSize;
+    maskLeftTuple.tuple = ~maskLeftTuple.tuple;
+    PositionDNATuple testTuple;
+    while (curValidEnd < seq.length) {
+        //
+        // Search for the next available window that can be translated into a tuple.
+        //
+        cur = curValidEnd;
+        while(curValidEnd < seq.length and IsACTG[seq.seq[curValidEnd]]) {
+            curValidEnd++;
+        }
+        if (curValidEnd - cur >= tm.tupleSize) {
+            //
+            // Found a span that does not have N's in it, 
+            //
+            assert (tempTuple.FromStringRL(&(seq.seq[cur]), tm) == 1);
+            p = cur;
+            tempTuple.pos = p;
+            tupleList.Append(tempTuple);
+            for (p++; p < curValidEnd - tm.tupleSize + 1; p++) {
+                tempTuple.tuple >>=2;
+                //				tempTuple.tuple &= maskLeftTuple.tuple;
+                upperTuple.tuple = TwoBit[seq.seq[p+tm.tupleSize-1]];
+                upperTuple.tuple = upperTuple.tuple << (2 * (tm.tupleSize-1));
+                tempTuple.tuple += upperTuple.tuple;
+                tempTuple.pos = p;
+                //testTuple.FromStringRL(&seq.seq[p], tm);
+                //assert(testTuple.tuple == tempTuple.tuple);
+                tupleList.Append(tempTuple);
+            }
+        }
+        else {
+            ++curValidEnd;
+        }
+    }
+    return tupleList.size();
+}
diff --git a/libcpp/alignment/tuples/DNATupleList.h b/libcpp/alignment/tuples/DNATupleList.h
new file mode 100644
index 0000000..a5b0dae
--- /dev/null
+++ b/libcpp/alignment/tuples/DNATupleList.h
@@ -0,0 +1,53 @@
+#ifndef TUPLES_DNA_TUPLE_LIST_H_
+#define TUPLES_DNA_TUPLE_LIST_H_
+
+#include <vector>
+#include "DNATuple.h"
+
+
+
+
+
+template<typename Sequence>
+	DNALength StoreTuplePosList(Sequence seq, TupleMetrics &tm, vector<PositionDNATuple> &tupleList) {
+	//
+	// Do this faster later on with a suffix tree -- faster than n log n construction time.
+	// 
+	DNALength s;
+	
+	PositionDNATuple tempTuple;
+	for (s = 0; s < seq.length - tm.tupleSize + 1; s++) {
+		if (tempTuple.FromStringLR(&(seq.seq[s]), tm)) {
+			tempTuple.pos = s;
+			tupleList.push_back(tempTuple);
+		}
+	}
+
+	std::sort(tupleList.begin(), tupleList.end());
+	
+		// 
+		// Be nice and leave the pos list in ascending sorted order,
+		// even though the top of this function does not specify it.
+		//
+	
+	return tupleList.size();
+}
+
+
+void WriteTuplePosList(vector<PositionDNATuple> &tupleList, int tupleSize, ofstream &out) {
+	DNALength tupleListLength = tupleList.size();
+	out.write((char*) &tupleSize, sizeof(tupleSize));
+	out.write((char*) &tupleListLength, sizeof(DNALength));
+	out.write((char*) &tupleList[0], sizeof(PositionDNATuple) * tupleList.size());
+}
+
+void ReadTuplePosList(ifstream &in, vector<PositionDNATuple> &tupleList, int &tupleSize) {
+	DNALength tupleListLength;
+	in.read((char*) &tupleSize, sizeof(int));
+	in.read((char*) &tupleListLength, sizeof(DNALength));
+	tupleList.resize(tupleListLength);
+	in.read((char*) &tupleList[0], sizeof(PositionDNATuple) * tupleListLength);
+}
+
+
+#endif
diff --git a/libcpp/alignment/tuples/HashedTupleList.hpp b/libcpp/alignment/tuples/HashedTupleList.hpp
new file mode 100644
index 0000000..8695844
--- /dev/null
+++ b/libcpp/alignment/tuples/HashedTupleList.hpp
@@ -0,0 +1,61 @@
+#ifndef _BLASR_HASHED_TUPLE_LIST_HPP_
+#define _BLASR_HASHED_TUPLE_LIST_HPP_
+
+#include "tuples/TupleList.hpp"
+#include "tuples/TupleMetrics.hpp"
+#include "DNASequence.hpp"
+
+template<typename T_Tuple>
+class HashedTupleList {
+public:
+    long mask;
+    std::vector<TupleList<T_Tuple> > hashTable;
+    int hashLength;
+    int hashTableLength;
+    typedef T_Tuple Tuple;
+
+    //
+    // Provide a default constructor with a small 
+    // tuple size for testing.
+    //
+    HashedTupleList();
+
+    void Initialize(int _hashLength);
+
+    HashedTupleList(int _hashLength);
+
+    void clear();
+
+    void Clear();
+
+    void Sort();
+
+    void Append(T_Tuple tuple);
+
+    void Insert(T_Tuple tuple);
+
+    int Find(T_Tuple tuple);
+
+    void Print();
+
+    //
+    // Provide a version of find that stores easy access to 
+    // the original tuple.
+    //
+    int Find(T_Tuple tuple, int &hashValue, int &index);
+
+    void FindAll(T_Tuple &tuple, 
+        typename std::vector<T_Tuple>::const_iterator &firstPos, 
+        typename std::vector<T_Tuple>::const_iterator &endPos);
+
+    int GetHashLength();
+};
+
+
+template<typename T_Tuple>
+void SequenceToHash(DNASequence &seq, HashedTupleList<T_Tuple> &hash, 
+    TupleMetrics &tm);
+
+#include "tuples/HashedTupleList.hpp"
+
+#endif
diff --git a/libcpp/alignment/tuples/HashedTupleListImpl.hpp b/libcpp/alignment/tuples/HashedTupleListImpl.hpp
new file mode 100644
index 0000000..41d9832
--- /dev/null
+++ b/libcpp/alignment/tuples/HashedTupleListImpl.hpp
@@ -0,0 +1,144 @@
+#ifndef _BLASR_HASHED_TUPLE_LIST_IMPL_HPP_
+#define _BLASR_HASHED_TUPLE_LIST_IMPL_HPP_
+
+template<typename T_Tuple>
+HashedTupleList<T_Tuple>::
+HashedTupleList() {
+    Initialize(5);
+}
+
+template<typename T_Tuple>
+HashedTupleList<T_Tuple>::
+HashedTupleList(int _hashLength) {
+    Initialize(_hashLength);
+    cout << hashTable.size() << endl;
+}
+
+template<typename T_Tuple>
+void HashedTupleList<T_Tuple>::
+Initialize(int _hashLength) {
+    mask = 0;
+    int i;
+    hashLength = _hashLength;
+    hashTable.resize(1L << (hashLength*2));
+    hashTableLength = hashTable.size();
+
+    for (i = 0; i < hashLength; i++ ){
+        mask = mask << 2L;
+        mask = mask + 3L;
+    }
+}
+
+template<typename T_Tuple>
+void HashedTupleList<T_Tuple>::
+clear() {
+    // Synonym.
+    Clear();
+}
+
+template<typename T_Tuple>
+void HashedTupleList<T_Tuple>::
+Clear() {
+    int i;
+    for (i = 0; i < hashTableLength; i++ ){ 
+        hashTable[i].tupleList.clear();
+    }
+}
+
+
+template<typename T_Tuple>
+void HashedTupleList<T_Tuple>::
+Sort() {
+    int i;
+    for (i = 0; i < hashTableLength; i++ ){ 
+        sort(hashTable[i].tupleList.begin(), 
+             hashTable[i].tupleList.end());
+    }
+}    
+
+template<typename T_Tuple>
+void HashedTupleList<T_Tuple>::
+Append(T_Tuple tuple) {
+    int hashValue = tuple.tuple & mask;
+    std::cout << "htl adding " << tuple.tuple << std::endl;
+    hashTable[hashValue].tupleList.push_back(tuple);
+}
+
+
+template<typename T_Tuple>
+void HashedTupleList<T_Tuple>::
+Insert(T_Tuple tuple) {
+    std::cout << "htl adding " << tuple.tuple << std::endl;
+    int hashValue = tuple.tuple & mask;
+    hashTable[hashValue].Insert(tuple);
+}
+
+template<typename T_Tuple>
+int HashedTupleList<T_Tuple>::
+Find(T_Tuple tuple) {
+    int hashValue, index;
+    return Find(tuple, hashValue, index);
+}
+
+
+template<typename T_Tuple>
+void HashedTupleList<T_Tuple>::
+Print() {
+    int i;
+    for (i = 0; i < hashTableLength; i++ ){ 
+        hashTable[i].Print();
+    }
+}
+
+//
+// Provide a version of find that stores easy access to 
+// the original tuple.
+//
+template<typename T_Tuple>
+int HashedTupleList<T_Tuple>::
+Find(T_Tuple tuple, int &hashValue, int &index) {
+    hashValue = tuple.tuple & mask;
+    if (hashTable[hashValue].size()) {
+        return ((index = hashTable[hashValue].Find(tuple)) != -1);
+    }
+    else {
+        return 0;
+    }
+}
+
+
+template<typename T_Tuple>
+void HashedTupleList<T_Tuple>::
+FindAll(T_Tuple &tuple, 
+        typename vector<T_Tuple>::const_iterator &firstPos, 
+        typename vector<T_Tuple>::const_iterator &endPos ) {
+    int hashValue;
+    hashValue = tuple.tuple & mask;
+    hashTable[hashValue].FindAll(tuple, firstPos, endPos);
+}
+
+
+template<typename T_Tuple>
+int HashedTupleList<T_Tuple>::
+GetHashLength() {
+    return hashLength;
+}
+
+
+template<typename T_Tuple>
+void SequenceToHash(DNASequence &seq, HashedTupleList<T_Tuple> &hash, 
+    TupleMetrics &tm) {
+
+    int i;
+    T_Tuple tuple;
+    int res = 0;
+    for (i = 0; i < seq.length - hash.hashLength + 1; i++ ) {
+        if ((res and 
+             (res = tuple.ShiftAddRL(seq.seq[i+tm.tupleSize-1], tm))) or
+            (!res and (res = tuple.FromStringRL(&seq.seq[i], tm)))) {
+            hash.Insert(tuple);
+        }
+    }
+}
+
+#endif
diff --git a/libcpp/alignment/tuples/TupleCountTable.hpp b/libcpp/alignment/tuples/TupleCountTable.hpp
new file mode 100644
index 0000000..603ccd9
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleCountTable.hpp
@@ -0,0 +1,33 @@
+#ifndef _BLASR_TUPLE_COUNT_TABLE_HPP_
+#define _BLASR_TUPLE_COUNT_TABLE_HPP_
+
+#include <algorithm>
+#include <fstream>
+#include <iostream>
+#include <assert.h>
+#include "tuples/TupleMetrics.hpp"
+using namespace std;
+
+template<typename TSequence, typename TTuple>
+class TupleCountTable {
+public:
+	int *countTable;
+	int countTableLength;
+	int nTuples;
+	TupleMetrics tm;
+	bool deleteStructures;
+	void InitCountTable(TupleMetrics &ptm);
+
+	TupleCountTable();
+   	~TupleCountTable();
+	void Free();
+
+	void IncrementCount(TTuple &tuple);
+	void AddSequenceTupleCountsLR(TSequence &seq);
+	void Write(ofstream &out);
+	void Read(ifstream &in);
+};
+
+#include "tuples/TupleCountTableImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/tuples/TupleCountTableImpl.hpp b/libcpp/alignment/tuples/TupleCountTableImpl.hpp
new file mode 100644
index 0000000..805dc66
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleCountTableImpl.hpp
@@ -0,0 +1,101 @@
+#ifndef _BLASR_TUPLE_COUNT_TABLE_IMPL_HPP_
+#define _BLASR_TUPLE_COUNT_TABLE_IMPL_HPP_
+
+using namespace std;
+
+template<typename TSequence, typename TTuple>
+void TupleCountTable<TSequence, TTuple>::InitCountTable(TupleMetrics &ptm) {
+    Free();
+    tm = ptm;
+    tm.InitializeMask();
+    assert(tm.tupleSize > 0);
+    // create the mask just in case the ptm is not initialized 
+    // properly.
+    countTableLength = 4;
+    countTableLength = countTableLength << ((tm.tupleSize - 1)*2);
+
+    assert(countTableLength > 0);
+    countTable = new int[countTableLength];
+    deleteStructures = true;
+    fill(&countTable[0], &countTable[countTableLength], 0);
+    nTuples = 0;
+}
+
+
+template<typename TSequence, typename TTuple>
+TupleCountTable<TSequence, TTuple>::TupleCountTable() {
+    countTable = NULL;
+    countTableLength = 0;
+    nTuples = 0;
+    deleteStructures = false;
+}
+
+
+template<typename TSequence, typename TTuple>
+TupleCountTable<TSequence, TTuple>::~TupleCountTable() {
+    Free();
+}
+
+template<typename TSequence, typename TTuple>
+void TupleCountTable<TSequence, TTuple>::Free() {
+    if (deleteStructures == false) {
+        //
+        // Do not delete this if it is referencing another structure
+        //
+        return;
+    }
+    if (countTable != NULL) {
+        delete [] countTable;
+        countTable = NULL;
+    }
+    countTableLength = nTuples = 0;
+}
+
+
+template<typename TSequence, typename TTuple>
+void TupleCountTable<TSequence, TTuple>::IncrementCount(
+    TTuple &tuple) {
+    long tupleIndex = tuple.ToLongIndex();
+    assert(tupleIndex < countTableLength);
+    countTable[tupleIndex]++;
+    ++nTuples;
+}
+
+
+template<typename TSequence, typename TTuple>
+void TupleCountTable<TSequence, TTuple>::AddSequenceTupleCountsLR(
+    TSequence &seq) {
+    VectorIndex i;
+    TTuple tuple;
+    if (seq.length>= tm.tupleSize) {
+        for (i = 0; i < seq.length - tm.tupleSize + 1; i++ ) { 
+            if (tuple.FromStringLR(&seq.seq[i], tm)) {
+                IncrementCount(tuple);
+            }
+        }
+    }
+}
+
+
+template<typename TSequence, typename TTuple>
+void TupleCountTable<TSequence, TTuple>::Write(ofstream &out) {
+    out.write((char*) &countTableLength, sizeof(int));
+    out.write((char*) &nTuples, sizeof(int));
+    out.write((char*) &tm.tupleSize, sizeof(int));
+    out.write((char*) countTable, sizeof(int) * countTableLength);
+}
+
+
+template<typename TSequence, typename TTuple>
+void TupleCountTable<TSequence, TTuple>::Read(ifstream &in) {
+    Free(); // Clear before reusing this object.
+    in.read((char*) &countTableLength, sizeof(int));
+    in.read((char*) &nTuples, sizeof(int));
+    in.read((char*) &tm.tupleSize, sizeof(int));
+    tm.InitializeMask();
+    countTable = new int[countTableLength];
+    deleteStructures = true;
+    in.read((char*) countTable, sizeof(int) * countTableLength);
+}
+
+#endif
diff --git a/libcpp/alignment/tuples/TupleList.hpp b/libcpp/alignment/tuples/TupleList.hpp
new file mode 100644
index 0000000..2f9eef0
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleList.hpp
@@ -0,0 +1,64 @@
+#ifndef _BLASR_TUPLE_LIST_HPP_
+#define _BLASR_TUPLE_LIST_HPP_
+
+#include <stdint.h>
+#include <algorithm>
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include "Types.h"
+#include "tuples/TupleMetrics.hpp"
+
+template<typename T>
+class TupleList {
+    int listLength;
+    TupleMetrics tm;
+    public:
+    typedef T Tuple;
+    std::vector<T> tupleList;
+
+    TupleList(); 
+
+    void Reset(); 
+    
+    T &operator[](int index); 
+
+    void GetTupleMetrics(TupleMetrics &ptm); 
+    
+    void SetTupleMetrics(TupleMetrics &ptm); 
+    
+    int size();
+    
+    int GetLength();
+    
+    int InitFromFile(std::string &fileName); 
+
+    void clear(); 
+
+    int WriteToFile(std::string &fileName); 
+
+    //
+    // Find one instance of a match.
+    //
+    int Find(T& tuple); 
+
+    //
+    // Find the boundaries of all instances of a match.
+    //
+    void FindAll(T &tuple, 
+        typename std::vector<T>::const_iterator &firstPos, 
+        typename std::vector<T>::const_iterator &endPos ); 
+
+    void Append( T&tuple); 
+
+    void Insert(T&tuple); 
+
+    void Sort(); 
+
+    void Print(); 
+};
+
+#include "TupleListImpl.hpp"
+#endif // _BLASR_TUPLE_LIST_HPP_
diff --git a/libcpp/alignment/tuples/TupleListImpl.hpp b/libcpp/alignment/tuples/TupleListImpl.hpp
new file mode 100644
index 0000000..fdbf91f
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleListImpl.hpp
@@ -0,0 +1,134 @@
+
+template<typename T>
+TupleList<T>::TupleList() {
+    listLength = 0;
+}
+
+template<typename T>
+void TupleList<T>::Reset() {
+    std::vector<T>().swap(tupleList);
+}
+
+template<typename T>
+T& TupleList<T>::operator[](int index) {
+    return tupleList[index];
+}
+
+template<typename T>
+void TupleList<T>::GetTupleMetrics(TupleMetrics &ptm) {
+    ptm = tm;
+}
+
+template<typename T>
+void TupleList<T>::SetTupleMetrics(TupleMetrics &ptm) {
+    tm = ptm;
+}
+
+template<typename T>
+int TupleList<T>::size() {
+    return tupleList.size();
+}
+
+template<typename T>
+int TupleList<T>::GetLength() {
+    return tupleList.size();
+}
+
+template<typename T>
+int TupleList<T>::InitFromFile(std::string &fileName) {
+    std::ifstream listIn;
+    listIn.open(fileName.c_str(), std::ios_base::binary);
+    if (!listIn)
+        return 0;
+    listIn.read((char*) &listLength, sizeof(int));
+    listIn.read((char*) &tm.tupleSize, sizeof(int));
+    tm.InitializeMask();
+    //list = new T[listLength];
+    tupleList.resize(listLength);
+    listIn.read((char*) &tupleList[0], sizeof(T) * listLength);
+    return 1;
+}
+
+template<typename T>
+void TupleList<T>::clear() {
+    tupleList.clear();
+    listLength = 0;
+}
+
+template<typename T>
+int TupleList<T>::WriteToFile(std::string &fileName) {
+    std::ofstream listOut;
+    listOut.open(fileName.c_str(), std::ios_base::binary);
+    if (!listOut)
+        return 0;
+    listLength = tupleList.size();
+    std::cout << "writing tuple lis of length " << listLength << std::endl;
+    listOut.write((char*) &listLength, sizeof(int));
+    listOut.write((char*) &tm.tupleSize, sizeof(int));
+    listOut.write((char*) &tupleList[0], sizeof(T)*listLength);
+    return 1;
+}
+
+//
+// Find one instance of a match.
+//
+template<typename T>
+int TupleList<T>::Find( T& tuple)  {
+    typename std::vector<T>::const_iterator begin, end, matchIt;
+    begin = tupleList.begin();
+    end   = tupleList.end();
+    matchIt = lower_bound(begin, end, tuple);
+    if (*matchIt != tuple) {
+        return -1;
+    }
+    else {
+        return matchIt - tupleList.begin();
+    }
+}
+
+//
+// Find the boundaries of all instances of a match.
+//
+template<typename T>
+void TupleList<T>::FindAll(T &tuple, 
+    typename std::vector<T>::const_iterator &firstPos, 
+    typename std::vector<T>::const_iterator &endPos ) {
+    firstPos = lower_bound(tupleList.begin(), tupleList.end(), tuple);
+    typename std::vector<T>::const_iterator firstPos2;
+    endPos = tupleList.end();
+    endPos = upper_bound(firstPos, endPos, tuple);
+    while (endPos != tupleList.end()) {
+        if (*endPos != tuple) {
+            return;
+        }
+        else {
+            endPos++;
+        }
+    }
+}
+
+template<typename T>
+void TupleList<T>::Append( T&tuple) {
+    tupleList.push_back(tuple);
+}
+
+template<typename T>
+void TupleList<T>::Insert(T&tuple) {
+    // insert and maintain order.
+    typename std::vector<T>::iterator pos;
+    pos = std::lower_bound(tupleList.begin(), tupleList.end(), tuple);
+    tupleList.insert(pos, tuple);
+}
+
+template<typename T>
+void TupleList<T>::Sort() {
+    sort(tupleList.begin(), tupleList.end());
+}
+
+template<typename T>
+void TupleList<T>::Print() {
+    int i;
+    for (i = 0; i< tupleList.size(); i++) {
+        std::cout << tupleList[i].tuple << std::endl;
+    }
+}
diff --git a/libcpp/alignment/tuples/TupleMask.h b/libcpp/alignment/tuples/TupleMask.h
new file mode 100644
index 0000000..f731db1
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleMask.h
@@ -0,0 +1,13 @@
+#ifndef TUPLES_TUPLE_MASK
+#define TUPLES_TUPLE_MASK
+//
+// Each f is conveniently 2 bases.
+//
+//                     
+static unsigned long TupleMask[] = {0, 0xf, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff,  // 0 - 6
+                                  0xfffffff, 0xfffffff, 0xffffffff, 0xfffffffff,   // 7 - 9
+                                  0xffffffffff, 0xfffffffffff, 0xffffffffffff,     // 10-12
+                                  0xfffffffffffff, 0xffffffffffffff, 0xfffffffffffffff, // 13-15
+                                  0xffffffffffffffff}; // 16
+
+#endif
diff --git a/libcpp/alignment/tuples/TupleMatching.hpp b/libcpp/alignment/tuples/TupleMatching.hpp
new file mode 100644
index 0000000..dd8c01e
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleMatching.hpp
@@ -0,0 +1,25 @@
+#ifndef _BLASR_TUPLE_MATCHING_HPP_
+#define _BLASR_TUPLE_MATCHING_HPP_
+
+#include "tuples/TupleMetrics.hpp"
+#include "tuples/TupleList.hpp"
+#include "tuples/BaseTuple.hpp"
+#include "tuples/DNATuple.hpp"
+#include "tuples/TupleMatching.hpp"
+
+template<typename Sequence, typename T_TupleList> 
+int SequenceToTupleList(
+    Sequence &seq, TupleMetrics &tm, T_TupleList &tupleList); 
+
+template<typename TSequence, typename TMatch, typename T_TupleList>
+int StoreMatchingPositions(
+    TSequence &querySeq, TupleMetrics &tm, T_TupleList &targetTupleList, 
+    std::vector<TMatch> &matchSet); 
+
+template<typename Sequence, typename Tuple>
+int StoreUniqueTuplePosList(Sequence seq, TupleMetrics &tm, 
+    std::vector<int> &uniqueTuplePosList); 
+
+#include "TupleMatchingImpl.hpp"
+
+#endif // _BLASR_TUPLE_MATCHING_HPP_
diff --git a/libcpp/alignment/tuples/TupleMatchingImpl.hpp b/libcpp/alignment/tuples/TupleMatchingImpl.hpp
new file mode 100644
index 0000000..c89a247
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleMatchingImpl.hpp
@@ -0,0 +1,106 @@
+#include <vector>
+#include <algorithm>
+#include <utility>
+#include <iostream>
+#include <stdint.h>
+#include "Types.h"
+#include "NucConversion.hpp"
+#include "DNASequence.hpp"
+#include "SeqUtils.hpp"
+
+using namespace std;
+
+template<typename Sequence, typename T_TupleList> 
+int SequenceToTupleList(Sequence &seq, TupleMetrics &tm, T_TupleList &tupleList) {
+    int s;
+    typename T_TupleList::Tuple tempTuple;
+    if (seq.size() < tm.tupleSize) {
+        return 1; 
+    }
+
+    // Otherwise, there is at least one tuple
+
+    tupleList.Append(tempTuple);
+    int res = 0;
+    for (s = 0; s < seq.length - tm.tupleSize + 1; s++ ) {
+        if ((res and (res = tempTuple.ShiftAddRL(seq.seq[s+tm.tupleSize-1], tm))) or
+                (!res and (res = tempTuple.FromStringRL(&seq.seq[s], tm)))) {
+            tempTuple.ShiftAddRL(seq.seq[s + tm.tupleSize - 1], tm);
+            tempTuple.pos = s;
+            tupleList.Append(tempTuple);
+        }
+    }
+    return 1;
+}
+
+
+template<typename TSequence, typename TMatch, typename T_TupleList>
+int StoreMatchingPositions(TSequence &querySeq, TupleMetrics &tm, T_TupleList &targetTupleList, vector<TMatch> &matchSet) {
+    DNALength s;
+    //	TQueryTuple queryTuple;
+    typename T_TupleList::Tuple queryTuple;
+    queryTuple.pos = 0;
+    if (querySeq.length >= tm.tupleSize) {
+        int res = 0;
+        for (s = 0; s < querySeq.length - tm.tupleSize + 1; s++) {
+            if ((res and (res = queryTuple.ShiftAddRL(querySeq.seq[s+tm.tupleSize-1], tm))) or
+                    (!res and (res = queryTuple.FromStringRL(&querySeq.seq[s], tm)))) {
+                int targetListIndex = 0;
+                typename vector<typename T_TupleList::Tuple>::const_iterator curIt, endIt;
+                targetTupleList.FindAll(queryTuple, curIt, endIt);
+
+                for(; curIt != endIt; curIt++) {
+                    matchSet.push_back(TMatch(s, (*curIt).pos));
+                    ++targetListIndex;
+                }
+            }
+        }
+    }
+    return matchSet.size();
+}
+
+
+template<typename Sequence, typename Tuple>
+int StoreUniqueTuplePosList(Sequence seq, TupleMetrics &tm, vector<int> &uniqueTuplePosList) {
+    //
+    // Do this faster later on with a suffix tree -- faster than n log n construction time.
+    // 
+    int s;
+    vector<pair<Tuple, int> > tuples;
+    Tuple tempTuple;
+    for (s = 0; s < seq.length - tm.tupleSize + 1; s++) {
+        tempTuple.FromStringRL(&(seq.seq[s]), tm);
+        tuples.push_back(make_pair(tempTuple, s));
+    }
+    std::sort(tuples.begin(), tuples.end());
+    int curUnique = 0, curPos = 0;
+
+    //
+    // Filter out the repetitive tuples.
+    //
+
+    while ( curPos < tuples.size() ) {
+        int nextPos = curPos;
+
+        while (nextPos < tuples.size() and tuples[nextPos] == tuples[curPos])
+            nextPos++;
+        if (nextPos - curPos == 1) {
+            tuples[curUnique].first == tuples[curPos].first;
+            uniqueTuplePosList.push_back(tuples[curUnique].second);
+            ++curUnique;
+            ++curPos;
+        }
+        else {
+            curPos = nextPos;
+        }
+    }
+
+    // 
+    // Be nice and leave the pos list in ascending sorted order,
+    // even though the top of this function does not specify it.
+    //
+    std::sort(uniqueTuplePosList.begin(), uniqueTuplePosList.end());
+    return uniqueTuplePosList.size();
+}
+
+
diff --git a/libcpp/alignment/tuples/TupleMetrics.cpp b/libcpp/alignment/tuples/TupleMetrics.cpp
new file mode 100644
index 0000000..5b00a7b
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleMetrics.cpp
@@ -0,0 +1,16 @@
+#include <stdint.h>
+#include "TupleMask.h"
+#include "TupleMetrics.hpp"
+
+TupleMetrics::TupleMetrics() {
+    tupleSize = tupleMask = 0;
+}
+
+void TupleMetrics::InitializeMask() {
+    tupleMask = TupleMask[tupleSize];
+}
+
+void TupleMetrics::Initialize(int pTupleSize) {
+    tupleSize = pTupleSize;
+    InitializeMask();
+}
diff --git a/libcpp/alignment/tuples/TupleMetrics.hpp b/libcpp/alignment/tuples/TupleMetrics.hpp
new file mode 100644
index 0000000..841aaf2
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleMetrics.hpp
@@ -0,0 +1,19 @@
+#ifndef _BLASR_TUPLE_METRICS_HPP_
+#define _BLASR_TUPLE_METRICS_HPP_
+
+#include "Types.h"
+
+class TupleMetrics {
+public:
+    unsigned int tupleSize;
+    ULong tupleMask;
+
+    TupleMetrics();
+
+    void InitializeMask();
+
+    void Initialize(int pTupleSize);
+};
+
+
+#endif //_BLASR_TUPLE_METRICS_HPP_
diff --git a/libcpp/alignment/tuples/TupleOperations.h b/libcpp/alignment/tuples/TupleOperations.h
new file mode 100644
index 0000000..2c7d13e
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleOperations.h
@@ -0,0 +1,7 @@
+#ifndef TUPLE_OPERATIONS_H_
+#define TUPLE_OPERATIONS_H_
+
+
+#endif
+
+
diff --git a/libcpp/alignment/tuples/TupleTranslations.h b/libcpp/alignment/tuples/TupleTranslations.h
new file mode 100644
index 0000000..a96cf15
--- /dev/null
+++ b/libcpp/alignment/tuples/TupleTranslations.h
@@ -0,0 +1,4 @@
+#ifndef TUPLE_OPERATIONS_H_
+#define TUPLE_OPERATIONS_H_
+
+
diff --git a/libcpp/alignment/tuples/tuple.h b/libcpp/alignment/tuples/tuple.h
new file mode 100644
index 0000000..5063f08
--- /dev/null
+++ b/libcpp/alignment/tuples/tuple.h
@@ -0,0 +1,82 @@
+#ifndef TUPLE_H_
+#define TUPLE_H_
+
+#include <vector>
+#include <utility>
+
+#include "Types.h"
+#include "tuples/TupleMetrics.hpp"
+
+template<typename Sequence, typename Tuple>
+  BuildTupleList(Sequence seq, vector<Tuple> &tupleList) {
+		BuildTupleList(seq, 0, seq.length, tupleList);
+	}
+
+template<typename Sequence, typename Tuple>
+	BuildTupleList(Sequence seq, int seqStart, int length, vector<Tuple> &tupleList) {
+		
+	}
+
+template<typename Sequence, typename CountedTuple>
+	BuildCountedTupleList(Sequence seq, int seqStart, int length, TupleMetrics &tm, vector<CountedTuple> &tupleList) {
+		int s;
+		CountedTuple tuple;
+		for (s = 0; s < seq.length - tm.tupleSize  + 1; s++) {
+		}
+	}
+
+
+template<typename Sequence, typename Tuple>
+	StoreUniqueTuplePosList(Sequence seq, TupleMetrics &tm, vector<int> &uniqueTuplePosList) {
+		//
+		// Do this faster later on with a suffix tree -- faster than n log n construction time.
+		// 
+		int s;
+		vector<pair<Tuple, int> > tuples;
+		Tuple tempTuple;
+		for (s = 0; s < seq.length; s++) {
+			tempTuple.FromStringLR(&(seq.seq[s]), tm);
+			tuples.push_back(make_pair(tempTuple, s));
+		}
+		std::sort(tuples.begin(), tuples.end());
+		int curUnique = 0, curPos = 0;
+
+		//
+		// Filter out the repetitive tuples.
+		//
+
+		while ( curPos < tuples.size() ) {
+			int nextPos = curPos;
+
+			while (nextPos < tuples.size() and tuples[nextPos] == tuples[curPos])
+				nextPos++;
+			if (nextPos - curPos == 1) {
+				tuples[curUnique].first == tuples[curPos].first;
+				uniqueTuplePosList.push_back(tuples[curUnique].second);
+				++curUnique;
+				++curPos;
+			}
+			else {
+				curPos = nextPos;
+			}
+		}
+
+		// 
+		// Be nice and leave the pos list in ascending sorted order,
+		// even though the top of this function does not specify it.
+		//
+		std::sort(uniqueTuplePosList.begin(), uniqueTuplePosList.end());
+	}
+
+
+
+
+	
+
+
+				
+			
+		
+
+
+#endif
diff --git a/libcpp/alignment/utils/FileOfFileNames.cpp b/libcpp/alignment/utils/FileOfFileNames.cpp
new file mode 100644
index 0000000..da738bd
--- /dev/null
+++ b/libcpp/alignment/utils/FileOfFileNames.cpp
@@ -0,0 +1,102 @@
+#include "utils/FileOfFileNames.hpp"
+#include "HDFNewBasReader.hpp"
+#include <cstdlib>
+
+void
+FileOfFileNames::StoreFileOrFileList(std::string fileName, 
+    std::vector<std::string> &fofnList) {
+
+    std::vector<std::string> tmpList;
+    if (IsFOFN(fileName)) {
+        FOFNToList(fileName, tmpList);
+    }
+    else {
+        tmpList.push_back(fileName);
+    }
+    for (int i = 0; i < int(tmpList.size()); i++) {
+        if (FileOfFileNames::IsFOFN(tmpList[i])) {
+            std::cout << "ERROR. Nested File of File Names are not allowed. "
+                      << std::endl;
+            exit(1);
+        } else if (FileOfFileNames::IsBasH5(tmpList[i])) {
+            std::vector<std::string> baxFNs = FileOfFileNames::Bas2Bax(tmpList[i]);
+            fofnList.insert(fofnList.end(), baxFNs.begin(), baxFNs.end());
+        } else {
+            fofnList.push_back(tmpList[i]);
+        }
+    }
+}
+
+void 
+FileOfFileNames::FOFNToList(std::string &fofnFileName, 
+    std::vector<std::string> &fofnList) {
+    std::ifstream fofnIn;
+    CrucialOpen(fofnFileName, fofnIn);
+    while(fofnIn) {
+        std::string name;
+        getline(fofnIn, name);
+        if (name.size() > 0) {
+            fofnList.push_back(name);
+        }
+    }
+}
+
+bool 
+FileOfFileNames::IsFOFN(std::string &fileName) {
+    std::string::size_type dotPos = fileName.rfind(".");
+    if (dotPos != std::string::npos) {
+        std::string extension;
+        extension.assign(fileName, dotPos+1, fileName.size() - (dotPos+1));
+        if (extension == "fofn") {
+            return true;
+        }
+    }
+    return false;
+}
+
+bool 
+FileOfFileNames::IsBasH5(std::string & fileName) {
+    // Return true if file ends with bas.h5
+    if (fileName.size() > 6) {
+        if (fileName.rfind("bas.h5") == fileName.size() - 6) {
+            return true;
+        }
+    }
+    return false;
+}
+
+std::vector<std::string> 
+FileOfFileNames::Bas2Bax(std::string & basFN) {
+    // There are two types of bas.h5 files.
+    // Before SMRT 2.0, bas.h5 files contain all the /PulseData data,
+    // in this case, return the bas.h5.
+    // After SMRT 2.0, bas.h5 files have been changed to only contain
+    // paths to bax.h5 files (in the /MultiPart/Parts group), while
+    // all base calls and QVs are in bax.h5 files. In this case,
+    // return path to the bax.h5 files. Assumption is that bax.h5
+    // files are in the same directory as bas.h5 file.
+    vector<string> baxFNs;
+    HDFNewBasReader reader;
+    if (reader.Initialize(basFN) != 0) {
+        baxFNs = reader.GetBaxFileNames();
+    } else {
+        baxFNs.push_back(basFN);
+    }
+    reader.Close();
+    return baxFNs;
+}
+
+
+int
+FileOfFileNames::ExpandFileNameList(std::vector<std::string> &fileNames) {
+    int rfn;
+    std::vector<std::string> expandedFileNames;
+    for (rfn = 0; rfn < fileNames.size(); rfn++) {
+        std::vector<std::string> tmpList;
+        FileOfFileNames::StoreFileOrFileList(fileNames[rfn], tmpList);
+        expandedFileNames.insert(expandedFileNames.end(),
+                                 tmpList.begin(), tmpList.end());
+    }
+    fileNames = expandedFileNames;
+    return fileNames.size();
+}
diff --git a/libcpp/alignment/utils/FileOfFileNames.hpp b/libcpp/alignment/utils/FileOfFileNames.hpp
new file mode 100644
index 0000000..2aef7c6
--- /dev/null
+++ b/libcpp/alignment/utils/FileOfFileNames.hpp
@@ -0,0 +1,27 @@
+#ifndef _BLASR_FILE_OF_FILE_NAMES_HPP_
+#define _BLASR_FILE_OF_FILE_NAMES_HPP_
+
+#include <iostream>
+#include <string>
+#include <vector>
+#include <fstream>
+#include "utils.hpp"
+
+class FileOfFileNames {
+public:
+    static void StoreFileOrFileList(std::string fileName,
+            std::vector<std::string> &fofnList);
+
+    static void FOFNToList(std::string &fofnFileName, 
+            std::vector<std::string> &fofnList);
+
+    static bool IsFOFN(std::string &fileName);
+
+    static bool IsBasH5(std::string &fileName);
+
+    static std::vector<std::string> Bas2Bax(std::string &basFN);
+
+    static int ExpandFileNameList(std::vector<std::string> &fileNames);
+};
+
+#endif
diff --git a/libcpp/alignment/utils/FileUtils.cpp b/libcpp/alignment/utils/FileUtils.cpp
new file mode 100644
index 0000000..84813e8
--- /dev/null
+++ b/libcpp/alignment/utils/FileUtils.cpp
@@ -0,0 +1,61 @@
+#include "utils/FileUtils.hpp"
+
+using namespace std;
+
+bool FileExists(string &fileName) {
+    FILE *fp = fopen(fileName.c_str(),"r");
+    if( fp ) {
+        // exists
+        fclose(fp);
+        return true;
+    } 
+    else {
+        return false;
+    }
+}
+
+void CriticalOpenRead(string &fileName, ifstream &file, std::ios::openmode mode) {
+    file.open(fileName.c_str(), mode | std::ios::in);
+    if (!file.good()) {
+        cerr << "Could not open file:"  << fileName << endl;
+        exit(1);
+    }
+}
+
+int OpenRead(string &fileName, ifstream &file, std::ios::openmode mode) {
+    file.open(fileName.c_str(), mode | std::ios::in);
+    return file.good();
+}
+
+
+void CriticalOpenWrite(string &fileName, ofstream &file, std::ios::openmode mode) {
+    file.open(fileName.c_str(), mode | std::ios::out);
+    if (!file.good()) { 
+        cerr << "Could not open file: " << fileName << endl;
+        exit(1);
+    }
+}
+
+int OpenWrite(string &fileName, ofstream &file, std::ios::openmode mode) {
+    file.open(fileName.c_str(), mode | std::ios::out);
+    return file.good();
+}
+
+
+int CountLinesInFile(string fileName) {
+    char* filePtr;
+    long fileSize;
+    int fileDes;
+    fileDes = open(fileName.c_str(), O_RDONLY);  
+    fileSize = lseek(fileDes, 0, SEEK_END);
+    lseek(fileDes, 0, SEEK_SET);
+    filePtr = (char*) mmap(0, fileSize, PROT_READ, MAP_PRIVATE, fileDes, 0);
+    long pos;
+    int numLines = 0;
+    for (pos = 0; pos < fileSize; pos++, filePtr++) {
+        if (*filePtr == '\n') {
+            numLines++;
+        }
+    }
+    return numLines;
+}
diff --git a/libcpp/alignment/utils/FileUtils.hpp b/libcpp/alignment/utils/FileUtils.hpp
new file mode 100644
index 0000000..7457b33
--- /dev/null
+++ b/libcpp/alignment/utils/FileUtils.hpp
@@ -0,0 +1,27 @@
+#ifndef _BLASR_FILE_UTILS_HPP_
+#define _BLASR_FILE_UTILS_HPP_
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include "sys/fcntl.h"
+#include "sys/mman.h"
+#include <sys/types.h> // for lseek
+#include <unistd.h> // for lseek
+#include <stdio.h>
+
+using namespace std;
+
+bool FileExists(string &fileName);
+
+void CriticalOpenRead(string &fileName, ifstream &file, std::ios::openmode mode=std::ios::in);
+
+int OpenRead(string &fileName, ifstream &file, std::ios::openmode mode=std::ios::in);
+
+void CriticalOpenWrite(string &fileName, ofstream &file, std::ios::openmode mode=std::ios::out);
+
+int OpenWrite(string &fileName, ofstream &file, std::ios::openmode mode=std::ios::out);
+
+int CountLinesInFile(string fileName);
+
+#endif
diff --git a/libcpp/alignment/utils/LogUtils.cpp b/libcpp/alignment/utils/LogUtils.cpp
new file mode 100644
index 0000000..018d7bc
--- /dev/null
+++ b/libcpp/alignment/utils/LogUtils.cpp
@@ -0,0 +1,55 @@
+#include "LogUtils.hpp"
+
+double LogSumOfTwo(double value1, double value2) {
+    //
+    // value1 and value2 are in log space already.
+    //
+    double minValue, maxValue;
+    minValue = value1, maxValue = value2;
+
+    if (maxValue < minValue) {
+        minValue = value2; maxValue = value1;
+    }
+
+    // convert to log10
+    minValue *= LOG10;
+    maxValue *= LOG10;
+
+    double difference = minValue - maxValue;
+
+    if (difference < LOG_EPSILON) {
+        return maxValue / LOG10;
+    }
+    else if (difference < LOG_EPSILON2) {
+        return (maxValue + exp(difference))/LOG10;
+    }
+    else {
+        float expv = exp(difference);
+        float log1pv = log1p(expv);
+        return (maxValue + log1pv)/LOG10;
+    }
+}
+
+double LogSumOfThree(double value1, double value2, double value3) {
+    double minValue, maxValue, middleValue;
+    if (value1 > value2 and value2 > value3) {
+        maxValue = value1; middleValue = value2; minValue = value3;
+    }
+    else if (value1 > value3 and value3 > value2) {
+        maxValue = value1; middleValue = value3; minValue = value2;
+    }
+    else if (value2 > value1 and value1 > value3) {
+        maxValue = value2; middleValue = value1; minValue = value3;
+    }
+    else if (value2 > value3 and value3 > value1) {
+        maxValue = value2; middleValue = value3; minValue = value1;
+    }
+    else if (value3 > value1 and value1 > value2) {
+        maxValue = value3; middleValue = value1; minValue = value2;
+    }
+    else {
+        maxValue = value3; middleValue = value2; minValue = value1;
+    }
+    return LogSumOfTwo(maxValue, LogSumOfTwo(middleValue, minValue));
+}
+
diff --git a/libcpp/alignment/utils/LogUtils.hpp b/libcpp/alignment/utils/LogUtils.hpp
new file mode 100644
index 0000000..16f2ecd
--- /dev/null
+++ b/libcpp/alignment/utils/LogUtils.hpp
@@ -0,0 +1,15 @@
+#ifndef _BLASR_UTILS_SUM_OF_LOG_HPP_
+#define _BLASR_UTILS_SUM_OF_LOG_HPP_
+
+#include <math.h>
+
+#define LOG_EPSILON   -30
+#define LOG_EPSILON2  -8
+#define LOG_EPSILON4  (logEpsilon/4.0)
+#define LOG10 2.3025850929
+
+double LogSumOfTwo(double value1, double value2); 
+
+double LogSumOfThree(double value1, double value2, double value3); 
+
+#endif // _BLASR_UTILS_SUM_OF_LOG_HPP_
diff --git a/libcpp/alignment/utils/PhredUtils.cpp b/libcpp/alignment/utils/PhredUtils.cpp
new file mode 100644
index 0000000..b2653d0
--- /dev/null
+++ b/libcpp/alignment/utils/PhredUtils.cpp
@@ -0,0 +1,13 @@
+#include <math.h>
+#include "PhredUtils.hpp"
+
+double InversePhred(double phred) {
+    float num = 1;
+    float denom = (1+pow(10,phred/10));
+    return num/denom;
+}
+
+double Phred(double pvalue) {
+    double v = log10(pvalue);
+    return -10*v;
+}
diff --git a/libcpp/alignment/utils/PhredUtils.hpp b/libcpp/alignment/utils/PhredUtils.hpp
new file mode 100644
index 0000000..c90dbdd
--- /dev/null
+++ b/libcpp/alignment/utils/PhredUtils.hpp
@@ -0,0 +1,8 @@
+#ifndef _BLASR_UTILS_PHRED_UTILS_HPP_
+#define _BLASR_UTILS_PHRED_UTILS_HPP_
+
+double InversePhred(double phred); 
+
+double Phred(double pvalue); 
+
+#endif // _BLASR_UTILS_PHRED_UTILS_HPP_
diff --git a/libcpp/alignment/utils/RangeUtils.cpp b/libcpp/alignment/utils/RangeUtils.cpp
new file mode 100644
index 0000000..90a1458
--- /dev/null
+++ b/libcpp/alignment/utils/RangeUtils.cpp
@@ -0,0 +1,107 @@
+
+#include <stdexcept>
+
+#include "RangeUtils.hpp"
+
+using namespace std;
+
+Range::Range(UInt pStart) {
+    start = end = pStart;
+}
+Range::Range(UInt pStart, UInt pEnd) {
+    start = pStart;
+    end = pEnd;
+    if (start > end) {
+        cout << "ERROR: start of a range should be less than the end."
+             << endl;
+        exit(1);
+    }
+}
+
+bool Range::contains(const UInt & query) {
+    return (start <= query && query <= end);
+}
+bool Range::operator < (const Range & pRange) const {
+    if (start == pRange.start) {
+        return (end > pRange.end);
+    }
+    return (start < pRange.start);
+}
+
+//
+// Input is a comma-delimited string of ranges.
+// e.g. 1,2,3,10-20
+bool ParseRanges(string & rangesStr, vector<Range> & ranges) {
+    ranges.clear();
+    bool parseSucceed = true;
+    vector<string> strList;
+    ParseSeparatedList(rangesStr, strList, ',');
+    for(int i=0; i<int(strList.size()); i++) {
+        string & str = strList[i];
+        if(str.find('-') == string::npos) {
+            ranges.push_back(Range(atoi(str.c_str())));
+        } else {
+            vector<string> start_end;
+            ParseSeparatedList(str, start_end, '-');
+            if (start_end.size() != 2) {
+                parseSucceed = false;
+                break;
+            }
+            ranges.push_back(Range(atoi(start_end[0].c_str()),
+                        atoi(start_end[1].c_str())));
+        }
+    }
+    if (parseSucceed) {
+        sort(ranges.begin(), ranges.end());
+    } else {
+        ranges.clear();
+    }
+    return parseSucceed;
+}
+
+Ranges::Ranges(string rangesStr) {
+    if (!ParseRanges(rangesStr, ranges))
+        throw std::invalid_argument("bad range");
+}
+
+bool Ranges::setRanges(string rangesStr) {
+    return ParseRanges(rangesStr, ranges);
+}
+
+int Ranges::size() {
+    return ranges.size();
+}
+
+UInt Ranges::max() {
+    if (size() == 0) {
+        cout << "ERROR, could not determine the maximum value "
+             << "of an empty Ranges object." << endl;
+        exit(1);
+    }
+    return ranges.back().end;
+}
+
+bool Ranges::contains(const UInt & query) {
+    if (ranges.size() == 0) return false;
+    vector<Range> searchRanges;
+    searchRanges.push_back(Range(0, ranges.size()-1));
+    while (searchRanges.size() > 0) {
+        Range searchRange = searchRanges.back();
+        searchRanges.pop_back();
+        UInt mid = (searchRange.start + searchRange.end) / 2;
+        if (ranges[mid].contains(query)) {
+            return true;
+        }
+        if (mid > 0 && searchRange.start <= mid - 1) {
+            searchRanges.push_back(Range(searchRange.start,
+                                   mid - 1));
+        }
+        if (ranges[mid].start <= query and
+            searchRange.end >= mid + 1) {
+            searchRanges.push_back(Range(mid + 1,
+                                   searchRange.end));
+        }
+    }
+    return false;
+}
+
diff --git a/libcpp/alignment/utils/RangeUtils.hpp b/libcpp/alignment/utils/RangeUtils.hpp
new file mode 100644
index 0000000..b0a41ba
--- /dev/null
+++ b/libcpp/alignment/utils/RangeUtils.hpp
@@ -0,0 +1,56 @@
+/*
+ * ============================================================================
+ *
+ *       Filename:  RangeUtils.h
+ *
+ *    Description:  Parse a list of ranges separated by commas.
+ *                  Designed for specifying a set of holeNumbers to analyze.
+ *
+ *        Version:  1.0
+ *        Created:  05/02/2013 12:51:27 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+#include <stdlib.h>
+#include <algorithm>
+#include "StringUtils.hpp"
+#include "Types.h"
+
+class Range {
+public:
+    UInt start;  // Start position of a range, inclusive
+    UInt end;    // End position of a range, inclusive
+
+    Range(UInt pStart); 
+
+    Range(UInt pStart, UInt pEnd); 
+
+    bool contains(const UInt & query); 
+
+    bool operator < (const Range & pRange) const; 
+};
+
+// Input is a comma-delimited string of ranges.
+// e.g. 1,2,3,10-20
+bool ParseRanges(string & rangesStr, vector<Range> & ranges); 
+
+class Ranges {
+public:
+    std::vector<Range> ranges;
+    Ranges(std::string rangesStr=""); 
+
+    bool setRanges(std::string rangesStr); 
+    
+    int size(); 
+
+    UInt max(); 
+
+    bool contains(const UInt & query); 
+};
+
+
diff --git a/libcpp/alignment/utils/RegionUtils.cpp b/libcpp/alignment/utils/RegionUtils.cpp
new file mode 100644
index 0000000..0448f2e
--- /dev/null
+++ b/libcpp/alignment/utils/RegionUtils.cpp
@@ -0,0 +1,302 @@
+#include "utils/RegionUtils.hpp"
+
+// General functions.
+bool LookupHQRegion(int holeNumber, RegionTable &regionTable, 
+    int &start, int &end, int &score) {
+
+	int regionLowIndex, regionHighIndex;
+	regionLowIndex = regionHighIndex = 0;
+
+	regionTable.LookupRegionsByHoleNumber(holeNumber,
+        regionLowIndex, regionHighIndex);
+
+	bool readHasGoodRegion = true;
+	int  regionIndex = regionLowIndex;
+	while (regionIndex < regionHighIndex and 
+		   regionTable.GetType(regionIndex) != HQRegion) {
+		regionIndex++;
+	}
+	
+	if (regionIndex == regionHighIndex) {
+    start = end = score = 0;
+		return false;
+	}
+	else {
+		start = regionTable.GetStart(regionIndex);
+		end   = regionTable.GetEnd(regionIndex);
+        score = regionTable.GetScore(regionIndex);
+		return true;
+	}
+}
+
+// Functions of class CompareRegionIndicesByStart.
+int CompareRegionIndicesByStart::
+operator()(const int a, const int b) const {
+    if (regionTablePtr->GetStart(a) == regionTablePtr->GetStart(b)) {
+        return (regionTablePtr->GetEnd(a) < regionTablePtr->GetEnd(b));
+    }
+    else {
+        return (regionTablePtr->GetStart(a) < regionTablePtr->GetStart(b));
+    }
+}
+
+// General functions.
+int SortRegionIndicesByStart(RegionTable &regionTable, 
+    std::vector<int> &indices) {
+
+    CompareRegionIndicesByStart cmpFctr;
+    cmpFctr.regionTablePtr = ®ionTable;
+    std::sort(indices.begin(), indices.end(), cmpFctr);
+    return indices.size();
+}
+
+
+// Functions of OrderRegionsByReadStart:
+int OrderRegionsByReadStart::
+operator()(const ReadInterval &lhs, const ReadInterval &rhs) const {
+    return lhs.start < rhs.start;
+}
+
+
+// General functions.
+int FindRegionIndices(unsigned int holeNumber, RegionTable *regionTablePtr,
+    int &regionLowIndex, int &regionHighIndex) {
+
+    int regionIndex;						 
+    regionLowIndex = regionHighIndex = 0;
+
+    regionTablePtr->LookupRegionsByHoleNumber(holeNumber, 
+        regionLowIndex, regionHighIndex);  
+
+    return regionHighIndex - regionLowIndex;
+}
+
+
+int FindRegionIndices(SMRTSequence &read, RegionTable *regionTablePtr, 
+    int &regionLowIndex, int &regionHighIndex) {
+    return FindRegionIndices(read.zmwData.holeNumber, 
+        regionTablePtr, regionLowIndex, regionHighIndex);
+}
+
+
+//
+// Collect region indices for either all region types, or just a few specific region types.
+//
+//
+int CollectRegionIndices(SMRTSequence &read, RegionTable &regionTable, 
+    std::vector<int> &regionIndices, RegionType *regionTypes,
+    int numRegionTypes) {
+
+    int regionLow, regionHigh;
+    int prevNumRegionIndices = regionIndices.size();
+    if (FindRegionIndices(read, &regionTable, regionLow, regionHigh)) {
+        int i;
+        for (i = regionLow; i < regionHigh; i++) {
+            if (regionTypes == NULL) {
+                regionIndices.push_back(i);
+            }
+            else {
+                int t;
+                for (t = 0; t < numRegionTypes; t++) {
+                    if (regionTable.GetType(i) == regionTypes[t]) {
+                        regionIndices.push_back(i);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    return regionIndices.size() - prevNumRegionIndices;
+}
+
+
+// Given a vecotr of ReadInterval objects and their corresponding 
+// directions, intersect each object with an interval 
+// [hqStart, hqEnd), if there is no intersection or the intersected
+// interval is less than minIntervalLength, remove this object and
+// their corresponding directions; otherwise, replace this object 
+// with the intersected interval and keep their directions. 
+// Return index of the (left-most) longest subread interval in the
+// updated vector.
+int GetHighQualitySubreadsIntervals(
+    std::vector<ReadInterval> & subreadIntervals, 
+    std::vector<int> & subreadDirections, 
+    int hqStart, int hqEnd, int minIntervalLength) {
+
+   // Avoid using vector.erase() when possible, as it is slow.
+    int ret = -1;
+    int maxLength = 0;
+    assert(subreadIntervals.size() == subreadDirections.size());
+    std::vector<ReadInterval> subreadIntervals2; 
+    std::vector<int> subreadDirections2;
+    for(int i = 0; i < int(subreadIntervals.size()); i++) {
+        int & thisStart = subreadIntervals[i].start;
+        int & thisEnd   = subreadIntervals[i].end;
+        int & thisScore = subreadIntervals[i].score;
+
+        if (thisStart >= hqEnd or thisEnd <= hqStart) {
+            continue;
+        } 
+        if (thisStart < hqStart and thisEnd > hqStart) {
+            thisStart = hqStart;
+        }
+        if (thisStart < hqEnd   and thisEnd > hqEnd  ) {
+            thisEnd   = hqEnd;
+        }
+        if (thisEnd - thisStart >= minIntervalLength) {
+            if (maxLength < thisEnd - thisStart) {
+                ret = subreadIntervals2.size();
+                maxLength = thisEnd - thisStart;
+            }
+            subreadIntervals2.push_back(subreadIntervals[i]);
+            subreadDirections2.push_back(subreadDirections[i]);
+        }
+    }
+    subreadIntervals  = subreadIntervals2;
+    subreadDirections = subreadDirections2;
+    return ret;
+}
+
+
+// Given a vector of subreads and a vector of adapters, return 
+// indices of all fullpass subreads in the input subreads vector.
+std::vector<int> 
+GetFullPassSubreadIndices(std::vector<ReadInterval> & subreadIntervals,
+                          std::vector<ReadInterval> & adapterIntervals) {
+    std::vector<int> indices; // Indices of fullpass subread.
+    for(int i = 0; i < subreadIntervals.size(); i++) {
+        ReadInterval & subread = subreadIntervals[i];
+        bool ladapter = false, radapter = false;
+        for(int j = 0; j < adapterIntervals.size(); j++) {
+            ReadInterval & adapter = adapterIntervals[j];
+            if (abs(subread.start - adapter.end) < 10) {
+                ladapter = true;
+            } else if(abs(subread.end - adapter.start) < 10) {
+                radapter = true;
+            }
+            if (ladapter && radapter) {
+                indices.push_back(i);
+                break;
+            }
+        }
+    }
+    return indices;
+}
+
+bool cmp_index_len_pair(std::pair<int, int> x, std::pair<int, int> y) { 
+    if (x.second == y.second) {
+        return x.first < y.first;
+    } else 
+    return x.second < y.second;
+}
+
+// Given a vector of subreads and a vector of adapters, return
+// index of the (left-most) longest subread which has both
+// adapters before & after itself. If no full-pass subread available, 
+// return -1;
+int GetLongestFullSubreadIndex(std::vector<ReadInterval> & subreadIntervals,
+                               std::vector<ReadInterval> & adapterIntervals) {
+
+    std::vector<int> indices = GetFullPassSubreadIndices(subreadIntervals, adapterIntervals);
+    if (indices.size() == 0)
+        return -1;
+    std::vector<std::pair<int, int>> indices_lens;
+
+    for (int i = 0; i < indices.size(); i++) {
+        ReadInterval & subread = subreadIntervals[indices[i]];
+        indices_lens.push_back(std::make_pair(indices[i], subread.end - subread.start));
+    }
+
+    std::sort(indices_lens.begin(), indices_lens.end(), cmp_index_len_pair);
+    return indices_lens[int(indices_lens.size()-1)].first;
+}
+
+    
+// Given a vector of subreads and a vector of adapters, return
+// index of the typical fullpass subread which can represent subreads
+// of this zmw.
+// * if there is no fullpass subread, return -1;
+// * if number of fullpass subreads is less than 4, return index of the 
+//   left-most longest subread
+// * if number of fullpass subreads is greater than or equal 4, 
+//   * if length of the longest read does not exceed 
+//      meanLength + 1.96 * deviationLength
+//     then, return index of the longest left-most subread 
+//   * otherwise, return index of the second longest left-most subread
+int GetTypicalFullSubreadIndex(std::vector<ReadInterval> & subreadIntervals,
+                               std::vector<ReadInterval> & adapterIntervals) {
+
+    std::vector<int> indices = GetFullPassSubreadIndices(subreadIntervals, adapterIntervals);
+    if (indices.size() == 0)
+        return -1; // no full-pass subread in this zmw
+    std::vector<std::pair<int, int>> indices_lens;
+    std::vector<int> lengths;
+
+    for (int i = 0; i < indices.size(); i++) {
+        ReadInterval & subread = subreadIntervals[indices[i]];
+        indices_lens.push_back(std::make_pair(indices[i], subread.end - subread.start));
+        lengths.push_back(subread.end - subread.start);
+    }
+
+    std::sort(indices_lens.begin(), indices_lens.end(), cmp_index_len_pair);
+
+    int longestIndex = indices_lens[int(indices_lens.size()-1)].first; 
+    int secondLongestIndex = (indices_lens.size() <= 1)?(-1): (indices_lens[int(indices_lens.size()-2)].first);
+
+    if (indices.size() < 4) { 
+        // very few fullpass subreads, use the longest subread anyway.
+        return longestIndex;
+    } else { 
+        // if length of the longest falls out of 95% CI of all other 
+        // fullpass subreads, use the second longest. 
+        sort(lengths.begin(), lengths.end());
+        float meanLength, varLength;
+        MeanVar(lengths, meanLength, varLength);
+        if (lengths[int(lengths.size()-1)] > meanLength + 1.96 * sqrt(varLength)) {
+            return secondLongestIndex;
+        } else {
+            return longestIndex;
+        }
+    }
+}
+
+
+// Given a vector of subreads and a vector of adapters, return
+// index of the median length subread which has both
+// adapters before & after itself. If no full-pass subreads are
+// available, return -1.
+int GetMedianLengthFullSubreadIndex(
+    std::vector<ReadInterval> & subreadIntervals,
+    std::vector<ReadInterval> & adapterIntervals) {
+
+    std::vector<int> indices = GetFullPassSubreadIndices(subreadIntervals, adapterIntervals);
+    if (indices.size() == 0)
+        return -1;
+    std::vector<std::pair<int, int>> indices_lens;
+
+    for (int i = 0; i < indices.size(); i++) {
+        ReadInterval & subread = subreadIntervals[indices[i]];
+        indices_lens.push_back(std::make_pair(indices[i], subread.end - subread.start));
+    }
+    std::sort(indices_lens.begin(), indices_lens.end(), cmp_index_len_pair);
+    return indices_lens[int(indices_lens.size()/2)].first;
+}
+
+// Create a vector of n directions consisting of interleaved 0 and 1s.
+void CreateDirections(std::vector<int> & directions, const int & n) {
+    directions.clear();
+    directions.resize(n);
+    for(int i = 0; i < n; i++) {
+        directions[i] = i % 2;
+    }
+}
+
+// Flop all directions in the given vector, if flop is true.
+void UpdateDirections(std::vector<int> & directions, bool flop) { 
+    if (not flop) return;
+    for (int i = 0; i < int(directions.size()); i++) {
+        assert(directions[i] == 0 or directions[i] == 1);
+        directions[i] = (directions[i] == 0)?1:0;
+    }
+}
+
diff --git a/libcpp/alignment/utils/RegionUtils.hpp b/libcpp/alignment/utils/RegionUtils.hpp
new file mode 100644
index 0000000..f5fb870
--- /dev/null
+++ b/libcpp/alignment/utils/RegionUtils.hpp
@@ -0,0 +1,132 @@
+#ifndef _BLASR_REGION_UTILS_HPP_
+#define _BLASR_REGION_UTILS_HPP_
+
+#include <algorithm>
+#include <cmath>
+#include "SMRTSequence.hpp"
+#include "statistics/StatUtils.hpp"
+#include "reads/ReadInterval.hpp"
+#include "reads/RegionTable.hpp"
+
+bool LookupHQRegion(int holeNumber, RegionTable &regionTable, 
+    int &start, int &end, int &score);
+
+template<typename T_Sequence>
+bool MaskRead(T_Sequence &fastaRead, ZMWGroupEntry &zmwData,
+    RegionTable &regionTable);
+
+
+template<typename T_Sequence>
+bool GetReadTrimCoordinates(T_Sequence &fastaRead,
+	ZMWGroupEntry &zmwData,	RegionTable &regionTable,
+	DNALength &readStart ,DNALength &readEnd, int &score);
+
+template<typename T_Sequence>
+bool TrimRead(T_Sequence &fastaRead, ZMWGroupEntry &zmwData,
+    RegionTable &regionTable, T_Sequence &trimmedRead);
+
+
+class CompareRegionIndicesByStart {
+public:
+	RegionTable *regionTablePtr;
+	int operator()(const int a, const int b) const;
+};
+
+		
+int SortRegionIndicesByStart(RegionTable &regionTable, 
+    std::vector<int> &indices);
+
+class OrderRegionsByReadStart {
+public:
+    int operator()(const ReadInterval &lhs, const ReadInterval &rhs) const;
+};
+
+int FindRegionIndices(unsigned int holeNumber, RegionTable *regionTablePtr,
+    int &regionLowIndex, int &regionHighIndex);
+
+int FindRegionIndices(SMRTSequence &read, RegionTable *regionTablePtr, 
+    int &regionLowIndex, int &regionHighIndex);
+
+//
+// Collect region indices for either all region types, or just a few 
+// specific region types.
+//
+int CollectRegionIndices(SMRTSequence &read, RegionTable &regionTable, 
+    std::vector<int> &regionIndices, RegionType *regionTypes=NULL,
+    int numRegionTypes = 0);
+
+
+template<typename T_Sequence>
+void CollectSubreadIntervals(T_Sequence &read, RegionTable *regionTablePtr, 
+    std::vector<ReadInterval> &subreadIntervals, bool byAdapter=false);
+
+// Get all adapter intervals of a ZMW.
+// Input:
+//   read - read.zmwData.holeNumber specifies the zmw.
+//   regionTablePtr - a pointer to a region table.
+// Output:
+//   adapterIntervals - where to assign all adapter intervals of the zmw
+template<typename T_Sequence>
+void CollectAdapterIntervals(T_Sequence &read, RegionTable *regionTablePtr,
+    std::vector<ReadInterval> &adapterIntervals);
+
+// Given a vecotr of ReadInterval objects and their corresponding 
+// directions, intersect each object with an interval 
+// [hqStart, hqEnd), if there is no intersection or the intersected
+// interval is less than minIntervalLength, remove this object and
+// their corresponding directions; otherwise, replace this object 
+// with the intersected interval and keep their directions. 
+// Return index of the (left-most) longest subread interval in the
+// updated vector.
+int GetHighQualitySubreadsIntervals(
+    std::vector<ReadInterval> & subreadIntervals, 
+    std::vector<int> & subreadDirections, 
+    int hqStart, int hqEnd, int minIntervalLength = 0); 
+
+// Given a vector of subreads and a vector of adapters, return
+// indices of all full-pass subreads.
+std::vector<int> GetFullPassSubreadIndices(
+    std::vector<ReadInterval> & subreadIntervals,
+    std::vector<ReadInterval> & adapterIntervals);
+
+// Given a vector of subreads and a vector of adapters, return
+// index of the (left-most) longest subread which has both
+// adapters before & after itself. If no full-pass subreads are
+// available, return -1.
+int GetLongestFullSubreadIndex(
+    std::vector<ReadInterval> & subreadIntervals,
+    std::vector<ReadInterval> & adapterIntervals);
+
+// Given a vector of subreads and a vector of adapters, return
+// index of the median length subread which has both
+// adapters before & after itself. If no full-pass subreads are
+// available, return -1.
+int GetMedianLengthFullSubreadIndex(
+    std::vector<ReadInterval> & subreadIntervals,
+    std::vector<ReadInterval> & adapterIntervals);
+
+
+// Given a vector of subreads and a vector of adapters, return
+// index of the typical fullpass subread which can represent subreads
+// of this zmw.
+// * if there is no fullpass subread, return -1;
+// * if number of fullpass subreads is less than 4, return index of the 
+//   left-most longest subread
+// * if number of fullpass subreads is greater than or equal 4, 
+//   * if length of the longest read does not exceed 
+//      meanLength + 1.96 * deviationLength
+//     then, return index of the longest left-most subread 
+//   * otherwise, return index of the second longest left-most subread
+int GetTypicalFullSubreadIndex(
+    std::vector<ReadInterval> & subreadIntervals,
+    std::vector<ReadInterval> & adapterIntervals);
+
+// Create a vector of n directions consisting of interleaved 0 and 1s.
+void CreateDirections(std::vector<int> & directions, const int & n);
+
+// Flop all directions in the given vector, if flop is true.
+void UpdateDirections(std::vector<int> & directions, bool flop = false);
+
+#include "utils/RegionUtilsImpl.hpp"
+
+#endif
diff --git a/libcpp/alignment/utils/RegionUtilsImpl.hpp b/libcpp/alignment/utils/RegionUtilsImpl.hpp
new file mode 100644
index 0000000..fc4b859
--- /dev/null
+++ b/libcpp/alignment/utils/RegionUtilsImpl.hpp
@@ -0,0 +1,215 @@
+#ifndef _BLASR_REGION_UTILS_IMPL_HPP 
+#define _BLASR_REGION_UTILS_IMPL_HPP 
+
+
+template<typename T_Sequence>
+bool MaskRead(T_Sequence &fastaRead, ZMWGroupEntry &zmwData,
+    RegionTable &regionTable) {
+    int regionIndex;						 
+    int regionLowIndex, regionHighIndex;
+    regionLowIndex = regionHighIndex = 0;
+
+    regionTable.LookupRegionsByHoleNumber(zmwData.holeNumber, 
+        regionLowIndex, regionHighIndex);
+
+    bool readHasGoodRegion = true;
+
+    DNALength readPos;
+
+    regionIndex = regionLowIndex;
+    int lastHQRegionIndex;
+
+    int hqRegionStart=0, hqRegionEnd=0, hqRegionScore = 0;
+    readHasGoodRegion = LookupHQRegion(zmwData.holeNumber, 
+        regionTable, hqRegionStart, hqRegionEnd, hqRegionScore);
+
+    //
+    // Mask off the low quality portion of this read.
+    //
+    for (readPos = 0; (readPos < hqRegionStart and
+         readPos < fastaRead.length); readPos++) {
+        fastaRead.seq[readPos] = 'N';
+    }
+
+    for (readPos = hqRegionEnd; readPos < fastaRead.length; readPos++) {
+        fastaRead.seq[readPos] = 'N';
+    }
+
+    //
+    // Look to see if there is region information provided, but the
+    // entire read is bad.
+    //
+    if (hqRegionEnd == hqRegionStart) {
+        //
+        // This read is entirely bad, flag that.
+        //
+        readHasGoodRegion = false;
+    }
+
+    return readHasGoodRegion;
+}
+
+
+template<typename T_Sequence>
+bool GetReadTrimCoordinates(T_Sequence &fastaRead,
+	ZMWGroupEntry &zmwData,	RegionTable &regionTable,
+	DNALength &readStart ,DNALength &readEnd, int &score) {
+
+	int regionIndex;						 
+	int regionLowIndex, regionHighIndex;
+	regionLowIndex = regionHighIndex = 0;
+
+	regionTable.LookupRegionsByHoleNumber(zmwData.holeNumber,
+        regionLowIndex, regionHighIndex);
+
+	bool readHasGoodRegion = true;
+
+	DNALength readPos;
+
+	regionIndex = regionLowIndex;
+	int lastHQRegionIndex;
+	
+	while (regionIndex < regionHighIndex and 
+		   regionTable.GetType(regionIndex) != HQRegion) {
+	    regionIndex++;
+	}
+	
+	if (regionIndex < regionHighIndex ) {
+		readStart = regionTable.GetStart(regionIndex);
+		readEnd   = regionTable.GetEnd(regionIndex);
+        score     = regionTable.GetScore(regionIndex);
+		return true;
+	}
+	else {
+		readStart = 0;
+		readEnd   = fastaRead.length;
+		return false;
+	}
+}
+
+
+template<typename T_Sequence>
+bool TrimRead(T_Sequence &fastaRead, ZMWGroupEntry &zmwData,
+    RegionTable &regionTable, T_Sequence &trimmedRead) {
+
+	DNALength readStart, readEnd;
+
+	GetReadTrimCoordinates(fastaRead, zmwData, regionTable,
+        readStart, readEnd);
+
+	if (readEnd - readStart > 0) {
+		trimmedRead.CopySubsequence((FASTQSequence&)fastaRead, 
+			readStart, readEnd);
+		// signal that the read has a good region.
+		return true;
+	}
+	else {
+		//
+		// There is no information for this read. Make it skipped.
+		//
+		trimmedRead.seq = NULL;
+		trimmedRead.CopyTitle(fastaRead.title);
+		// signal this read has no good region.
+		return false;
+	}
+}
+
+template<typename T_Sequence>
+void CollectSubreadIntervals(T_Sequence &read, RegionTable *regionTablePtr, 
+    std::vector<ReadInterval> &subreadIntervals, bool byAdapter) {
+
+	int regionIndex;						 
+	int regionLowIndex, regionHighIndex;
+	regionLowIndex = regionHighIndex = 0;
+
+	regionTablePtr->LookupRegionsByHoleNumber(read.zmwData.holeNumber,
+        regionLowIndex, regionHighIndex);
+
+	if (byAdapter == false) { 
+        // read subreads (insert) directly from region table. 
+		for (regionIndex = regionLowIndex; 
+             regionIndex < regionHighIndex; regionIndex++) {
+			if (regionTablePtr->GetType(regionIndex) ==  Insert) {
+
+                RegionAnnotation & ra = regionTablePtr->table[regionIndex];
+				subreadIntervals.push_back(ReadInterval(
+                    ra.row[RegionAnnotation::RegionStart],
+				    ra.row[RegionAnnotation::RegionEnd],
+                    ra.row[RegionAnnotation::RegionScore]));
+			}
+		}
+	}
+	else { // Determine subreads according to adapters only.
+        std::vector<int> adapterIntervalIndices;
+		for (regionIndex = regionLowIndex; 
+             regionIndex < regionHighIndex; regionIndex++) {
+			if (regionTablePtr->GetType(regionIndex) == Adapter) {
+				adapterIntervalIndices.push_back(regionIndex);
+			}
+		}
+		// Sort indices so that the intervals appear in order on the read.
+		SortRegionIndicesByStart(*regionTablePtr, adapterIntervalIndices);
+		int curIntervalStart = 0;
+		int i;
+		if (adapterIntervalIndices.size() == 0) {
+            // no adapter, this zmw has only one subread (pass)
+			subreadIntervals.push_back(ReadInterval(0, read.length));
+		}
+		else {
+            // The first subread covers [0, RegionStart of first adapter)
+			subreadIntervals.push_back(ReadInterval(0, 
+                regionTablePtr->table[adapterIntervalIndices[0]].
+                    row[RegionAnnotation::RegionStart]));
+
+            // The subread[i] covers (RegionEnd of i-1-th adapter, RegionStart of i-th adapter)
+			for (i = 0; i + 1 < adapterIntervalIndices.size(); i++) {
+				subreadIntervals.push_back(ReadInterval(
+                    regionTablePtr->table[adapterIntervalIndices[i]].
+                        row[RegionAnnotation::RegionEnd],
+				    regionTablePtr->table[adapterIntervalIndices[i+1]].
+                        row[RegionAnnotation::RegionStart]));
+			}
+            // The last subread covers (RegionEnd of last adapter, end of read)
+			subreadIntervals.push_back(
+                ReadInterval(regionTablePtr->table[
+                    adapterIntervalIndices[adapterIntervalIndices.size()-1]].
+                        row[RegionAnnotation::RegionEnd],
+				read.length));
+		}
+	}
+	sort(subreadIntervals.begin(), subreadIntervals.end(), 
+        OrderRegionsByReadStart());
+}
+
+
+// Get all adapter intervals of a ZMW.
+// Input:
+//   read - read.zmwData.holeNumber specifies the zmw.
+//   regionTablePtr - a pointer to a region table.
+// Output:
+//   adapterIntervals - where to assign all adapter intervals of the zmw
+template<typename T_Sequence>
+void CollectAdapterIntervals(T_Sequence &read, 
+    RegionTable *regionTablePtr, 
+    std::vector<ReadInterval> &adapterIntervals) {
+
+    assert(regionTablePtr != NULL);
+    int regionLowIndex = 0, regionHighIndex = 0;
+
+    regionTablePtr->LookupRegionsByHoleNumber(read.zmwData.holeNumber,
+        regionLowIndex, regionHighIndex);
+
+    for (int regionIndex = regionLowIndex; 
+         regionIndex < regionHighIndex; regionIndex++) {
+
+        if (regionTablePtr->GetType(regionIndex) ==  Adapter) {
+            RegionAnnotation & ra = regionTablePtr->table[regionIndex];
+            adapterIntervals.push_back(ReadInterval(
+                ra.row[RegionAnnotation::RegionStart],
+                ra.row[RegionAnnotation::RegionEnd],
+                ra.row[RegionAnnotation::RegionScore]));
+        }
+    }
+}
+
+#endif
diff --git a/libcpp/alignment/utils/SimpleXMLUtils.hpp b/libcpp/alignment/utils/SimpleXMLUtils.hpp
new file mode 100644
index 0000000..020a4bb
--- /dev/null
+++ b/libcpp/alignment/utils/SimpleXMLUtils.hpp
@@ -0,0 +1,99 @@
+#ifndef _BLASR_SIMPLE_XML_UTILS_HPP_
+#define _BLASR_SIMPLE_XML_UTILS_HPP_
+
+#include <string>
+#include <sstream>
+
+/*
+ * WARNING !!! The functions here use TONS of temoprary variables and are 
+ * very slow. Do not use for high-throughput xml generation.
+ */
+
+/*
+ * none of this is really used... just the keyword value pair items.
+ */
+
+template<typename T_String, typename T_Value>
+int OutputKeywordValuePair(T_String title, T_Value value, std::ostream out) {
+	out << title << "=\"" << value << "\" ";
+	return out.good();
+}
+
+template<typename T_String>
+int OutputBeginElement(T_String title, std::ostream out) {
+	out << "<" << title << " ";
+	return 1;
+}
+
+template<typename T_String>
+int OutputEndElement(T_String title, std::ostream out) {
+	out << "/" << title;
+	return 1;
+}
+
+template<typename T_String>
+int OutputElement(T_String title, std::ostream out) {
+	out << "<" << title << " ";
+	return 1;
+}
+
+inline
+void OutputEnd(std::ostream out) {
+	out << "/>";
+}
+
+template<typename T_String, typename T_Value> 
+T_String CreateKeywordValuePair(T_String title, T_Value value) {
+	T_String keywordPair;
+    std::stringstream sstrm;
+	sstrm << title << "=\"" << value << "\"";
+	keywordPair = sstrm.str();
+	return keywordPair;
+}
+
+template<typename T_String>
+T_String BeginDataEntry(T_String id, T_String data) {
+	T_String entry;
+	entry += "<";
+	entry += id;
+	entry += " ";
+	entry += data;
+	entry += ">";
+	return entry;
+}
+
+template<typename T_String>
+T_String EndDataEntry(T_String id) {
+	T_String entry;
+	entry = "<" + id + ">/";
+	return entry;
+}
+
+
+template<typename T_String>
+T_String CreateDataEntry(T_String id, T_String data) {
+	T_String entry;
+	entry += "<";
+	entry += id;
+	entry += " ";
+	entry += data;
+	entry += " />";
+	return entry;
+}
+
+
+template<typename T_String> 
+ T_String CreateStartEntry(T_String id, T_String data) {
+	T_String entry;
+	entry = "<" + id + " " + data + ">";
+	return entry;
+}
+
+template<typename T_String>
+T_String CreateEndEntry(T_String id) {
+	T_String entry;
+	entry = "<" + id + "/>";
+	return entry;
+}
+
+#endif
diff --git a/libcpp/alignment/utils/TimeUtils.cpp b/libcpp/alignment/utils/TimeUtils.cpp
new file mode 100644
index 0000000..94f7851
--- /dev/null
+++ b/libcpp/alignment/utils/TimeUtils.cpp
@@ -0,0 +1,20 @@
+#include <sstream> 
+#include <time.h>
+#include <iomanip> // std::setfill setd::setw
+#include "utils/TimeUtils.hpp"
+
+std::string GetTimestamp() {
+  time_t timer;
+  time(&timer);  // t is an integer type
+  // Prepare timestamp in the format : 2012-04-05T09:26:02.689093
+  std::stringstream timeStrm;
+  struct tm t;
+  localtime_r(&timer, &t);
+  timeStrm << t.tm_year + 1900 << "-"
+           << std::setfill('0') << std::setw(2) << t.tm_mon + 1 << "-"
+           << std::setfill('0') << std::setw(2) << t.tm_mday << "T"
+           << std::setfill('0') << std::setw(2) << t.tm_hour << ":"
+           << std::setfill('0') << std::setw(2) << t.tm_min << ":"
+           << std::setfill('0') << std::setw(2) << t.tm_sec;
+  return timeStrm.str();
+}
diff --git a/libcpp/alignment/utils/TimeUtils.hpp b/libcpp/alignment/utils/TimeUtils.hpp
new file mode 100644
index 0000000..543d929
--- /dev/null
+++ b/libcpp/alignment/utils/TimeUtils.hpp
@@ -0,0 +1,7 @@
+#ifndef _BLASR_TIME_UTILS_HPP_
+#define _BLASR_TIME_UTILS_HPP_ 
+
+#include <string>
+std::string GetTimestamp();
+
+#endif
diff --git a/libcpp/configure.py b/libcpp/configure.py
new file mode 100755
index 0000000..b147c09
--- /dev/null
+++ b/libcpp/configure.py
@@ -0,0 +1,268 @@
+#!/usr/bin/env python
+"""Configure the build.
+
+- Fetch HDF5 headers.
+- Create libconfig.h
+- Create defines.mk
+
+This is not used by './unittest/'.
+"""
+import commands
+import contextlib
+import os
+import sys
+
+def log(msg):
+    sys.stderr.write(msg)
+    sys.stderr.write('\n')
+
+def shell(cmd):
+    log(cmd)
+    status, output = commands.getstatusoutput(cmd)
+    if status:
+        raise Exception('%d <- %r' %(status, cmd))
+    return output
+
+def update_content(fn, content):
+    current_content = open(fn).read() if os.path.exists(fn) else None
+    if content != current_content:
+        log('writing to %r' %fn)
+        log('"""\n' + content + '"""')
+        open(fn, 'w').write(content)
+
+def compose_libconfig(pbbam=False):
+    if pbbam:
+        content = """
+#define USE_PBBAM
+"""
+    else:
+        content = """
+"""
+    return content
+
+def compose_defines_with_hdf(HDF5_INCLUDE, HDF5_LIB):
+    """We have to use := for HDF5_LIB b/c blasr
+    is using it to mean the directory, not the file,
+    and it's in the environment.
+    """
+    thisdir = os.path.dirname(os.path.abspath(__file__))
+    return """
+HDF5_INCLUDE:=%(HDF5_INCLUDE)s
+HDF5_LIB:=%(HDF5_LIB)s
+#CPPFLAGS+=-I../pbdata -I../hdf -I../alignment
+LIBPBDATA_INCLUDE     ?=../pbdata
+LIBPBIHDF_INCLUDE     ?=../hdf
+LIBBLASR_INCLUDE      ?=../alignment
+LIBPBDATA_LIB     ?=../pbdata/libpbdata.so
+LIBPBIHDF_LIB     ?=../hdf/libpbihdf.so
+LIBBLASR_LIB      ?=../alignment/libblasr.so
+"""%(dict(
+    thisdir=thisdir,
+    HDF5_INCLUDE=HDF5_INCLUDE,
+    HDF5_LIB=HDF5_LIB))
+
+
+def compose_defines_with_hdf_headers(HDF_HEADERS):
+    thisdir = os.path.dirname(os.path.abspath(__file__))
+    return """
+HDF_HEADERS:=%(HDF_HEADERS)s
+#HDF5_INCLUDE?=${HDF_HEADERS}/src
+CPPFLAGS+=-I${HDF_HEADERS}/src -I${HDF_HEADERS}/c++/src
+CPPFLAGS+=-I../pbdata -I../hdf -I../alignment
+LIBPBDATA_LIB     ?=../pbdata/libpbdata.so
+LIBPBIHDF_LIB     ?=../pbdata/libpbihdf.so
+LIBBLASR_LIB      ?=../pbdata/libblasr.so
+"""%(dict(thisdir=thisdir, HDF_HEADERS=HDF_HEADERS))
+
+def compose_defines():
+    """
+    Note that our local 'hdf' subdir will not even build
+    in this case.
+    """
+    thisdir = os.path.dirname(os.path.abspath(__file__))
+    return """
+LIBPBDATA_INCLUDE ?=../pbdata
+LIBPBIHDF_INCLUDE ?=../hdf
+LIBBLASR_INCLUDE  ?=../alignment
+LIBPBDATA_LIB     ?=%(thisdir)s/pbdata/libpbdata.so
+LIBPBIHDF_LIB     ?=%(thisdir)s/pbdata/libpbihdf.so
+LIBBLASR_LIB      ?=%(thisdir)s/pbdata/libblasr.so
+nohdf             ?=1
+"""%(dict(thisdir=thisdir))
+
+def get_OS_STRING():
+    G_BUILDOS_CMD = """bash -c 'set -e; set -o pipefail; id=$(lsb_release -si | tr "[:upper:]" "[:lower:]"); rel=$(lsb_release -sr); case $id in ubuntu) printf "$id-%04d\n" ${rel/./};; centos) echo "$id-${rel%%.*}";; *) echo "$id-$rel";; esac' 2>/dev/null"""
+    return shell(G_BUILDOS_CMD)
+def get_PREBUILT():
+    cmd = 'cd ../../../../prebuilt.out 2>/dev/null && pwd || echo -n notfound'
+    return shell(cmd)
+def get_BOOST_INCLUDE(env):
+    key_bi = 'BOOST_INCLUDE'
+    key_br = 'BOOST_ROOT'
+    if key_bi in env:
+        return env[key_bi]
+    if key_br in env:
+        return env[key_br]
+    return '${PREBUILT}/boost/boost_1_55_0'
+
+def get_PBBAM(env, prefix):
+    """
+    key = 'PBBAM'
+    if key in env:
+        return env[key]
+    cmd = 'cd $(THIRD_PARTY_PREFIX)/../staging/PostPrimary/pbbam 2>/dev/null && pwd || echo -n notfound' %(
+            THIRD_PARTY_PREFIX=prefix)
+    return shell(cmd)
+    """
+def get_HTSLIB(env, prefix):
+    """
+    key = 'HTSLIB'
+    if key in env:
+        return env[key]
+    cmd = 'cd $(THIRD_PARTY_PREFIX)/../staging/PostPrimary/htslib 2>/dev/null && pwd || echo -n notfound' %(
+            THIRD_PARTY_PREFIX=prefix)
+    return shell(cmd)
+    """
+def ifenvf(env, key, func):
+    if key in env:
+        return env[key]
+    else:
+        return func()
+def setifenvf(envout, envin, key, func):
+    envout[key] = ifenvf(envin, key, func)
+def setifenv(envout, envin, key, val):
+    envout[key] = envin.get(key, val)
+def setenv(envout, key, val):
+    envout[key] = val
+def update_env_if(envout, envin, keys):
+    for key in keys:
+        if key in envin:
+            envout[key] = envin[key]
+def compose_defs_env(env):
+    # We disallow env overrides for anything with a default from GNU make.
+    nons = ['CXX', 'CC', 'AR'] # 'SHELL'?
+    ovr    = ['%-20s ?= %s' %(k, v) for k,v in env.items() if k not in nons]
+    nonovr = ['%-20s := %s' %(k, v) for k,v in env.items() if k in nons]
+    return '\n'.join(ovr + nonovr + [''])
+def compose_defines_pacbio(envin):
+    """
+    This is used by mobs via buildcntl.sh.
+    """
+    env = dict()
+    setenv(env, 'SHELL', 'bash')
+    setifenvf(env, envin, 'OS_STRING', get_OS_STRING)
+    setifenvf(env, envin, 'PREBUILT', get_PREBUILT)
+    setifenv(env, envin, 'LIBPBDATA_INCLUDE', '../pbdata')
+    setifenv(env, envin, 'LIBPBIHDF_INCLUDE', '../hdf')
+    setifenv(env, envin, 'LIBBLASR_INCLUDE', '../alignment')
+    setifenv(env, envin, 'LIBPBDATA_LIB', '../pbdata/libpbdata.so')
+    setifenv(env, envin, 'LIBPBIHDF_LIB', '../hdf/libpbihdf.so')
+    setifenv(env, envin, 'LIBBLASR_LIB', '../alignment/libblasr.so')
+    if 'nohdf' in envin:
+        env['nohdf'] = envin['nohdf']
+        # Otherwise, do not define it at all.
+    nondefaults = set([
+            'CXX', 'AR',
+            'HDF5_INCLUDE', 'HDF5_LIB',
+            'PBBAM_INCLUDE', 'PBBAM_LIB',
+            'HTSLIB_INCLUDE', 'HTSLIB_LIB',
+            'BOOST_INCLUDE',
+            'ZLIB_LIB',
+    ])
+    update_env_if(env, envin, nondefaults)
+    return compose_defs_env(env)
+
+
+ at contextlib.contextmanager
+def cd(nwd):
+    cwd = os.getcwd()
+    log('cd %r -> %r' %(cwd, nwd))
+    os.chdir(nwd)
+    yield
+    os.chdir(cwd)
+    log('cd %r <- %r' %(cwd, nwd))
+
+def fetch_hdf5_headers():
+    """Fetch into ./hdf/HEADERS directory.
+    Return actual directory path, relative to subdirs.
+    """
+    version = 'hdf5-1.8.12-headers'
+    if not os.path.isdir(os.path.join('hdf', version)):
+        with cd('hdf'):
+            cmd = 'curl -k -L https://www.dropbox.com/s/8971bcyy5o42rxb/hdf5-1.8.12-headers.tar.bz2\?dl\=0 | tar xjf -'
+            shell(cmd)
+    return os.path.join('../hdf', version) # Relative path might help caching.
+
+def update(content_defines_mk, content_libconfig_h):
+    """ Write these relative to the same directory as *this* file.
+    """
+    thisdir = os.path.dirname(os.path.abspath(__file__))
+    fn_defines_mk = os.path.join(thisdir, 'defines.mk')
+    update_content(fn_defines_mk, content_defines_mk)
+    fn_libconfig_h = os.path.join(thisdir, 'pbdata', 'libconfig.h')
+    update_content(fn_libconfig_h, content_libconfig_h)
+
+def configure_nopbbam():
+    """Use HDF5 from env-vars.
+    This is the path used by blasr in a GitHub build, for now.
+    """
+    HDF5_INCLUDE = os.environ.get('HDF5_INCLUDE')
+    if not HDF5_INCLUDE:
+        HDF5_INCLUDE = os.environ['HDF5_INC']
+    HDF5_LIB = os.environ['HDF5_LIB']
+    content1 = compose_defines_with_hdf(HDF5_INCLUDE, HDF5_LIB)
+    content2 = compose_libconfig(pbbam=False)
+    update(content1, content2)
+
+def configure_nopbbam_skip_hdf():
+    """Fetch HDF5 headers.
+    We lack HDF5 libs, so we cannot build our hdf/ subdir.
+    But the others are fine.
+    """
+    HDF_HEADERS = fetch_hdf5_headers()
+    content1 = compose_defines_with_hdf_headers(HDF_HEADERS)
+    content2 = compose_libconfig(pbbam=False)
+    update(content1, content2)
+
+def configure_nopbbam_nohdf5():
+    content1 = compose_defines()
+    content2 = compose_libconfig(pbbam=False)
+    update(content1, content2)
+
+def configure_pacbio(envin):
+    content1 = compose_defines_pacbio(envin)
+    content2 = compose_libconfig(pbbam=True)
+    update(content1, content2)
+
+def get_make_style_env(envin, args):
+    envout = dict()
+    for arg in args:
+        if '=' in arg:
+            k, v = arg.split('=')
+            envout[k] = v
+    envout.update(envin)
+    return envout
+
+def main(prog, *args):
+    """We are still deciding what env-vars to use, if any.
+    """
+    if 'NOPBBAM' in os.environ:
+        if 'NOHDF' in os.environ:
+            configure_nopbbam_nohdf5()
+        else:
+            if 'HDF5_LIB' in os.environ:
+                assert 'HDF5_INC' in os.environ or 'HDF5_INCLUDE' in os.environ, 'Hey! You have HDF5_LIB but not HDF5_INCLUDE!'
+                if 'HDF5_INC' not in os.environ:
+                    print "NOT1"
+                if 'HDF5_INCLUDE' not in os.environ:
+                    print "NOT2"
+                configure_nopbbam()
+            else:
+                configure_nopbbam_skip_hdf()
+    else:
+        envin = get_make_style_env(os.environ, args)
+        configure_pacbio(envin)
+
+
+if __name__=="__main__":
+    main(*sys.argv)
diff --git a/libcpp/hdf/BufferedHDF2DArray.cpp b/libcpp/hdf/BufferedHDF2DArray.cpp
new file mode 100644
index 0000000..204d4d7
--- /dev/null
+++ b/libcpp/hdf/BufferedHDF2DArray.cpp
@@ -0,0 +1,79 @@
+#include "BufferedHDF2DArray.hpp"
+/*
+ *
+ * Implementation of a 2-D array for IO from an HDF array.
+ * This is templated, but specialized for a few data types, so that 
+ * the HDF data types do not need to be specified by somebody when reading.
+ *
+ * Currently no support exists for reading non-contiguous blocks of data, and
+ * the main intended use is to read in increments of rows.
+
+ int main(int argc, char* argv[]) {
+	if (argc < 1) {
+		cout << "usage: testHDFReading hdfFile" << endl;
+		exit(0);
+	}
+
+	string hdfFileName = argv[1];
+	
+	H5File hdfFile;
+	hdfFile.openFile(hdfFileName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+	BufferedHDF2DArray<uint16_t> xyArray;
+	xyArray.Initialize(hdfFile, "PulseData/BaseCalls/ZMW/HoleXY");
+	int curX = 0;
+	xyArray.Read(curX, curX + 1, 0, 2, holeXY);
+
+	or, to read a row:
+	xyArray.Read(curX, curX+1, holeXY);
+
+ */
+
+UInt GetDatasetNDim(H5::CommonFG &parentGroup, std::string datasetName) {
+    HDFData tmpDataset;
+    tmpDataset.InitializeDataset(parentGroup, datasetName);
+    H5::DataSpace dataspace = tmpDataset.dataset.getSpace();
+    UInt nDims = dataspace.getSimpleExtentNdims();
+    dataspace.close();
+    tmpDataset.dataset.close();
+    return nDims;
+}
+
+#define DEFINE_TYPED_WRITE_ROW(T, Pred) template<>\
+void BufferedHDF2DArray<T>::TypedWriteRow(const T *data, const H5::DataSpace &memorySpace, const H5::DataSpace &fileSpace) {\
+	dataset.write(data, Pred, memorySpace, fileSpace);\
+}
+
+DEFINE_TYPED_WRITE_ROW(int, H5::PredType::NATIVE_INT)
+DEFINE_TYPED_WRITE_ROW(unsigned int, H5::PredType::NATIVE_UINT)
+DEFINE_TYPED_WRITE_ROW(unsigned char, H5::PredType::NATIVE_UINT8)
+DEFINE_TYPED_WRITE_ROW(uint16_t, H5::PredType::NATIVE_UINT16)
+DEFINE_TYPED_WRITE_ROW(int16_t, H5::PredType::NATIVE_INT16)
+DEFINE_TYPED_WRITE_ROW(float, H5::PredType::NATIVE_FLOAT)
+
+
+#define DEFINE_TYPED_READ_ROW(T, Pred) template<>\
+void BufferedHDF2DArray<T>::Read(int startX, int endX, int startY, int endY, T* dest) {\
+	Read(startX, endX, startY, endY, Pred, dest);\
+}
+
+DEFINE_TYPED_READ_ROW(int, H5::PredType::NATIVE_INT)
+DEFINE_TYPED_READ_ROW(unsigned int, H5::PredType::NATIVE_UINT)
+DEFINE_TYPED_READ_ROW(char, H5::PredType::NATIVE_INT8)
+DEFINE_TYPED_READ_ROW(unsigned char, H5::PredType::NATIVE_UINT8)
+DEFINE_TYPED_READ_ROW(uint16_t, H5::PredType::NATIVE_UINT16)
+DEFINE_TYPED_READ_ROW(int16_t, H5::PredType::NATIVE_INT16)
+DEFINE_TYPED_READ_ROW(float, H5::PredType::NATIVE_FLOAT)
+
+#define DEFINE_TYPED_CREATE_ROW(T, Pred) template<>\
+void BufferedHDF2DArray<T>::TypedCreate(H5::DataSpace &fileSpace, H5::DSetCreatPropList &cparms) {\
+	dataset = container->createDataSet(datasetName.c_str(), Pred, fileSpace, cparms);\
+}
+
+DEFINE_TYPED_CREATE_ROW(int, H5::PredType::NATIVE_INT)
+DEFINE_TYPED_CREATE_ROW(unsigned int, H5::PredType::NATIVE_UINT)
+DEFINE_TYPED_CREATE_ROW(char, H5::PredType::NATIVE_INT8)
+DEFINE_TYPED_CREATE_ROW(unsigned char, H5::PredType::NATIVE_UINT8)
+DEFINE_TYPED_CREATE_ROW(uint16_t, H5::PredType::NATIVE_UINT16)
+DEFINE_TYPED_CREATE_ROW(int16_t, H5::PredType::NATIVE_INT16)
+DEFINE_TYPED_CREATE_ROW(float, H5::PredType::NATIVE_FLOAT)
+
diff --git a/libcpp/hdf/BufferedHDF2DArray.hpp b/libcpp/hdf/BufferedHDF2DArray.hpp
new file mode 100644
index 0000000..36a4a33
--- /dev/null
+++ b/libcpp/hdf/BufferedHDF2DArray.hpp
@@ -0,0 +1,158 @@
+#ifndef _BLASR_HDF_BUFFERED_HDF_2D_ARRAY_HPP_
+#define _BLASR_HDF_BUFFERED_HDF_2D_ARRAY_HPP_
+
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+#include "H5Cpp.h"
+
+#include "Types.h"
+#include "HDFConfig.hpp"
+#include "HDFData.hpp"
+#include "HDFGroup.hpp"
+#include "HDFWriteBuffer.hpp"
+
+/*
+ *
+ * Implementation of a 2-D array for IO from an HDF array.
+ * This is templated, but specialized for a few data types, so that 
+ * the HDF data types do not need to be specified by somebody when reading.
+ *
+ * Currently no support exists for reading non-contiguous blocks of data, and
+ * the main intended use is to read in increments of rows.
+
+ int main(int argc, char* argv[]) {
+	if (argc < 1) {
+		cout << "usage: testHDFReading hdfFile" << endl;
+		exit(0);
+	}
+
+	std::string hdfFileName = argv[1];
+	
+	H5File hdfFile;
+	hdfFile.openFile(hdfFileName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+	BufferedHDF2DArray<uint16_t> xyArray;
+	xyArray.Initialize(hdfFile, "PulseData/BaseCalls/ZMW/HoleXY");
+	int curX = 0;
+	xyArray.Read(curX, curX + 1, 0, 2, holeXY);
+
+	or, to read a row:
+	xyArray.Read(curX, curX+1, holeXY);
+
+ *
+ */
+template<typename T>
+class BufferedHDF2DArray : public HDFData, public HDFWriteBuffer<T> {
+
+private:
+    hsize_t   nDims;
+    hsize_t   *dimSize;
+    int       maxDims;
+    int       rowLength, colLength;
+
+public:
+
+    BufferedHDF2DArray(H5::CommonFG *_container, std::string _datasetName); 
+
+    BufferedHDF2DArray();
+
+    unsigned int GetNRows();
+
+    unsigned int GetNCols(); 
+
+    void Close(); 
+
+    ~BufferedHDF2DArray(); 
+
+    int InitializeForReading(HDFGroup &group, std::string datasetName);
+
+    /*
+     * Initialize HDF2D for reading.  No write buffer initialization is
+     * required.  The assumption is that the dataspace is in two
+     * dimensions, and this exits without grace if it is not. 
+     */
+    int Initialize(HDFGroup &group, std::string datasetName, unsigned int _rowLength=0, 
+        int _bufferSize=0, bool createIfMissing=true); 
+
+    int size(); 
+
+    /*
+     * Read rows in the range (startX, endX] in to dest.
+     */
+
+    void Read(int startX, int endX, H5::DataType typeID, T*dest); 
+
+    void Read(int startX, int endX, T*dest); 
+
+    /*
+     * This is the non-specialized definition.  Since this should only
+     * operate on specialized types, report an error and bail.
+     */
+    void Read(int startX, int endX, int startY, int endY, T* dest); 
+
+    void Read(int startX, int endX, int startY, int endY, H5::DataType typeID, 
+        T *dest); 
+
+    void Create(H5::CommonFG *_container, std::string _datasetName, unsigned int _rowLength); 
+
+    void TypedCreate(H5::DataSpace &fileSpace, H5::DSetCreatPropList &cparms); 
+    
+    // Append
+    void TypedWriteRow(const T*, const H5::DataSpace &memoryDataSpace, 
+        const H5::DataSpace &fileDataSpace); 
+
+    /*
+     * This code is copied directly form BufferedHDFArray.  I'm not sure
+     * how to set up the objects nicely to share the code between the
+     * two since the Flush() function is different.  There probably is a
+     * design pattern or simply better way to engineer this, but for now
+     * it's 15 lines of code.
+     */
+    void WriteRow(const T *data, int dataLength, int destRow=-1); 
+
+    void Flush(int destRow = -1); 
+};
+
+UInt GetDatasetNDim(H5::CommonFG &parentGroup, std::string datasetName);
+
+#define DECLARE_TYPED_WRITE_ROW(T, Pred) template<>\
+void BufferedHDF2DArray<T>::TypedWriteRow(const T *data, \
+    const H5::DataSpace &memorySpace, const H5::DataSpace &fileSpace) ;
+
+
+DECLARE_TYPED_WRITE_ROW(int, H5::PredType::NATIVE_INT)
+DECLARE_TYPED_WRITE_ROW(unsigned int, H5::PredType::NATIVE_UINT)
+DECLARE_TYPED_WRITE_ROW(unsigned char, H5::PredType::NATIVE_UINT8)
+DECLARE_TYPED_WRITE_ROW(uint16_t, H5::PredType::NATIVE_UINT16)
+DECLARE_TYPED_WRITE_ROW(int16_t, H5::PredType::NATIVE_INT16)
+DECLARE_TYPED_WRITE_ROW(float, H5::PredType::NATIVE_FLOAT)
+
+
+#define DECLARE_TYPED_READ_ROW(T, Pred) template<>\
+void BufferedHDF2DArray<T>::Read(int startX, int endX, int startY, int endY, T* dest);
+
+
+DECLARE_TYPED_READ_ROW(int, H5::PredType::NATIVE_INT)
+DECLARE_TYPED_READ_ROW(unsigned int, H5::PredType::NATIVE_UINT)
+DECLARE_TYPED_READ_ROW(char, H5::PredType::NATIVE_INT8)
+DECLARE_TYPED_READ_ROW(unsigned char, H5::PredType::NATIVE_UINT8)
+DECLARE_TYPED_READ_ROW(uint16_t, H5::PredType::NATIVE_UINT16)
+DECLARE_TYPED_READ_ROW(int16_t, H5::PredType::NATIVE_INT16)
+DECLARE_TYPED_READ_ROW(float, H5::PredType::NATIVE_FLOAT)
+
+#define DECLARE_TYPED_CREATE_ROW(T, Pred)template<>\
+void BufferedHDF2DArray<T>::TypedCreate(H5::DataSpace &fileSpace, \
+    H5::DSetCreatPropList &cparms) ;
+
+DECLARE_TYPED_CREATE_ROW(int, H5::PredType::NATIVE_INT)
+DECLARE_TYPED_CREATE_ROW(unsigned int, H5::PredType::NATIVE_UINT)
+DECLARE_TYPED_CREATE_ROW(char, H5::PredType::NATIVE_INT8)
+DECLARE_TYPED_CREATE_ROW(unsigned char, H5::PredType::NATIVE_UINT8)
+DECLARE_TYPED_CREATE_ROW(uint16_t, H5::PredType::NATIVE_UINT16)
+DECLARE_TYPED_CREATE_ROW(int16_t, H5::PredType::NATIVE_INT16)
+DECLARE_TYPED_CREATE_ROW(float, H5::PredType::NATIVE_FLOAT)
+
+#include "BufferedHDF2DArrayImpl.hpp"
+
+#endif
diff --git a/libcpp/hdf/BufferedHDF2DArrayImpl.hpp b/libcpp/hdf/BufferedHDF2DArrayImpl.hpp
new file mode 100644
index 0000000..49336ef
--- /dev/null
+++ b/libcpp/hdf/BufferedHDF2DArrayImpl.hpp
@@ -0,0 +1,379 @@
+#ifndef _BLASR_HDF_BUFFERED_HDF_2D_ARRAY_IMPL_HPP_
+#define _BLASR_HDF_BUFFERED_HDF_2D_ARRAY_IMPL_HPP_
+
+#include <cstring>
+#include <cassert>
+
+template<typename T>
+BufferedHDF2DArray<T>::BufferedHDF2DArray(H5::CommonFG *_container, 
+    std::string _datasetName) : HDFData(_container, _datasetName) {}
+
+template<typename T>
+BufferedHDF2DArray<T>::BufferedHDF2DArray() : HDFData() {
+    maxDims = 0;
+    nDims = 2;
+    dimSize =NULL;
+    rowLength = -1;
+    colLength = -1;
+}
+
+template<typename T>
+unsigned int BufferedHDF2DArray<T>::GetNRows() {
+    return rowLength;
+}
+
+template<typename T>
+unsigned int BufferedHDF2DArray<T>::GetNCols() {
+    return colLength;
+}
+
+template<typename T>
+void BufferedHDF2DArray<T>::Close() {
+
+    //
+    // Clean up the write buffer.
+    //
+    //		Flush();
+    if (dimSize != NULL) {
+        delete[] dimSize;
+        dimSize = NULL;
+    }
+    this->HDFWriteBuffer<T>::Free();
+}
+
+template<typename T>
+BufferedHDF2DArray<T>::~BufferedHDF2DArray() {
+    Close();
+}
+
+template<typename T>
+int BufferedHDF2DArray<T>::InitializeForReading(HDFGroup& group, std::string datasetName)
+{
+    return Initialize(group, datasetName, 0, 0, false);
+}
+
+/*
+ * Initialize HDF2D for reading.  No write buffer initialization is
+ * required.  The assumption is that the dataspace is in two
+ * dimensions, and this exits without grace if it is not. 
+ */
+template<typename T>
+int BufferedHDF2DArray<T>::Initialize(HDFGroup &group, std::string datasetName,
+    unsigned int _rowLength, int _bufferSize, bool createIfMissing) {
+
+    bool groupContainsDataset = group.ContainsObject(datasetName);
+    if (groupContainsDataset == false) {
+        //
+        // Do some error checking.
+        //
+        if (createIfMissing == false) {
+            std::cout << "ERROR! Could not open dataset " << datasetName << std::endl;
+            exit(1);
+        }
+        if (_rowLength == 0) {
+            std::cout << "ERROR!  Improper usage of BufferedHDF2DArray::Initialize.  The 2D Array "<<std::endl
+                << "is being created but is given a number of columns of 0." << std::endl;
+            exit(1);
+        }
+        Create(&group.group, datasetName, _rowLength);
+    }
+    else {
+        InitializeDataset(group.group, datasetName);
+        try {
+            dataspace = dataset.getSpace();
+        }
+        catch(H5::DataSetIException &e) { 
+            std::cout << e.getDetailMsg() << std::endl;
+            exit(1);
+        }
+
+        maxDims   = MAX_DIMS;
+        try {
+            nDims     = dataspace.getSimpleExtentNdims();
+            /*
+             * Prevent abuse of this class for multidimensional IO.
+             */
+            if (nDims != 2) {
+                std::cout << "ERROR in HDF format: dataset: " << datasetName << " should be 1-D, but it is not." << std::endl;
+                exit(1);
+            }
+
+            /*
+             * Load in the size of this dataset, and make a map to the whole thing.
+             */
+            if (dimSize) {
+                delete [] dimSize;
+            }
+            dimSize = new hsize_t[nDims];
+            dataspace.getSimpleExtentDims(dimSize);
+            rowLength = dimSize[0];
+            colLength = dimSize[1];
+            if (rowLength == 0) {
+                dataspace.close();
+                return 1;
+            }
+            fullSourceSpace = H5::DataSpace(2, dimSize);
+            dataspace.close();
+        }
+        catch(H5::Exception &e) {
+            std::cout << e.getDetailMsg() << std::endl;
+            exit(1);
+        }
+    }
+    return 1;
+}
+
+template<typename T>
+int BufferedHDF2DArray<T>::size() {
+    // Why assert nDims == 1 for 2D Array?
+    assert(nDims == 1);
+    dataspace.getSimpleExtentDims(dimSize);
+    return dimSize[0];
+}
+
+/*
+ * Read rows in the range (startX, endX] in to dest.
+ */
+template<typename T>
+void BufferedHDF2DArray<T>::Read(int startX, int endX, H5::DataType typeID, T*dest) {
+    Read(startX, endX, 0, dimSize[1], typeID, dest);
+}
+
+template<typename T>
+void BufferedHDF2DArray<T>::Read(int startX, int endX, T*dest) {
+    Read(startX, endX, 0, dimSize[1], dest);
+}
+/*
+ * This is the non-specialized definition.  Since this should only
+ * operate on specialized types, report an error and bail.
+ */
+template<typename T>
+void BufferedHDF2DArray<T>::Read(int startX, int endX, int startY, int endY, T* dest) {
+    assert("ERROR, calling Read with an unsupported type. Use Read(startx,endx, starty,endy,datatype, dest) instead." == 0);
+    exit(1);
+}
+
+template<typename T>
+void BufferedHDF2DArray<T>::Read(int startX, int endX, int startY, int endY, H5::DataType typeID, T *dest) {
+    hsize_t memSpaceSize[2] = {0, 0};
+    memSpaceSize[0] = endX - startX;
+    memSpaceSize[1] = endY - startY;
+    hsize_t sourceSpaceOffset[2] = {0, 0};
+    sourceSpaceOffset[0] = startX;
+    sourceSpaceOffset[1] = startY;
+
+    H5::DataSpace destSpace(2, memSpaceSize);		
+    fullSourceSpace.selectHyperslab(H5S_SELECT_SET, memSpaceSize, sourceSpaceOffset);
+    dataset.read(dest, typeID, destSpace, fullSourceSpace);
+    destSpace.close();
+}
+
+template<typename T>
+void BufferedHDF2DArray<T>::Create(H5::CommonFG *_container, string _datasetName, unsigned int _rowLength) {
+    container   = _container;
+    datasetName = _datasetName;
+    rowLength   = (unsigned int)_rowLength;
+    //
+    // Make life easy if the buffer is too small to fit a row --
+    // resize it so that rows may be copied and written out in an
+    // atomic unit.
+    //
+    if (this->bufferSize < rowLength) {
+        // When the buffer size is greater than 0, the write buffer
+        // should exist.
+        if (this->bufferSize > 0) {
+            assert(this->writeBuffer != NULL);
+            delete[] this->writeBuffer;
+        }
+        this->writeBuffer = new T[rowLength];
+        this->bufferSize = rowLength;
+    }
+
+    hsize_t dataSize[2]    = {0, hsize_t(rowLength)};
+    hsize_t maxDataSize[2] = {H5S_UNLIMITED, hsize_t(rowLength)};
+    H5::DataSpace fileSpace(2, dataSize, maxDataSize);
+    H5::DSetCreatPropList cparms;
+
+    /*
+     * For some reason, chunking must be enabled when creating a dataset
+     * that  has an unlimited dimension.  Of course, this is not
+     * mentioned in the hdf5 c++ documentation, because that
+     * docuemntation was written for people who enjoy learning how to
+     * use an API by reading comments in source code.
+     */
+    hsize_t chunkDims[2] = {16384, hsize_t(rowLength)};
+    cparms.setChunk( 2, chunkDims );
+    TypedCreate(fileSpace, cparms);
+    fileSpace.close();
+
+    //
+    // Set some flags that indicate this dataset is ready for writing.
+    //
+    fileDataSpaceInitialized = true;
+    isInitialized = true;
+}
+
+template<typename T>
+void BufferedHDF2DArray<T>::TypedCreate(H5::DataSpace &fileSpace, 
+    H5::DSetCreatPropList &cparms) {
+
+    assert("Error, calling HDF2DArray<T>::TypedCreate on an unsupported type.  A specialization must be written in HDF2DArray.h" == 0);
+}
+
+// Append
+template<typename T>
+void TypedWriteRow(const T*, const H5::DataSpace &memoryDataSpace, 
+    const H5::DataSpace &fileDataSpace) {
+
+    assert("Error, calling HDF2DArray<T>::TypedWriteRow on an unsupported type.  A specialization must be written in HDF2DArray.h" == 0);
+}
+
+
+/*
+ * This code is copied directly form BufferedHDFArray.  I'm not sure
+ * how to set up the objects nicely to share the code between the
+ * two since the Flush() function is different.  There probably is a
+ * design pattern or simply better way to engineer this, but for now
+ * it's 15 lines of code.
+ */
+
+template<typename T>
+void BufferedHDF2DArray<T>::WriteRow(const T *data, int dataLength, int destRow) {
+    // Fill the buffer with data. When there is overflow, write
+    // that out to disk.
+    //
+    int dataIndex = 0;
+    int bufferCapacity;
+    int bufferFillSize = 0;
+    bool flushBuffer;
+    while(dataIndex < dataLength) {
+        //
+        // Compute the capacity of this buffer to fit an integral number
+        // of rows into it.
+        //
+        bufferCapacity = (this->bufferSize / rowLength)*rowLength - this->bufferIndex;
+        flushBuffer = false;
+        if (bufferCapacity  > dataLength - dataIndex) {
+            bufferFillSize = dataLength - dataIndex;
+        }
+        else {
+            bufferFillSize = bufferCapacity;
+            flushBuffer = true;
+        }
+        memcpy((void*) &this->writeBuffer[this->bufferIndex], (void*) &data[dataIndex], sizeof(T)*bufferFillSize);
+        dataIndex   += bufferFillSize;
+        this->bufferIndex += bufferFillSize;
+        if (flushBuffer) {
+            Flush(destRow);
+        }
+        //
+        //  When not appending, increment the position of where the data
+        //  is to be written.
+        //
+        if (destRow != -1) {
+            destRow += this->bufferIndex / rowLength;
+        }
+    }
+}
+
+template<typename T>
+void BufferedHDF2DArray<T>::Flush(int destRow) {
+
+    //
+    // A default writeRow of -1 implies append
+    //
+    int numRowsToCreate; // FIXME(yli): why is numRowsToCreate assigned but not used?
+    int numDataRows;
+    //
+    // this->bufferIndex points after the end of the last data in the
+    // buffer (full rows), so this->bufferIndex / rowLength is the
+    // number of number of rows to create.
+    //
+    numDataRows = this->bufferIndex / rowLength;
+
+    if (destRow < 0) {
+        numRowsToCreate = this->bufferIndex / rowLength;  
+    }
+    else {
+        numRowsToCreate = this->bufferIndex / rowLength + destRow;
+    }
+    if (numDataRows > 0) {
+        assert(fileDataSpaceInitialized);
+
+        H5::DataSpace fileSpace;
+        fileSpace = dataset.getSpace();
+
+        //
+        // Load the current size of the array on disk.
+        //
+        hsize_t fileArraySize[2], fileArrayMaxSize[2], blockStart[2];
+        fileSpace.getSimpleExtentDims(fileArraySize, fileArrayMaxSize);
+
+        // Save this for later to determine the offsets
+        blockStart[0] = fileArraySize[0];
+        blockStart[1] = fileArraySize[1];
+
+        //
+        // Calculate the number of rows to create.  This is dependent
+        // on the current file size, the destination of where the data
+        // will go, and how much to write.
+        //
+
+        if (destRow == -1) {
+            fileArraySize[0] += numDataRows;
+        }
+        else {
+            // If the data cannot fit in the current file size, extend
+            // it,  otherwise, do not toch the file array size.
+            if (destRow + numDataRows > fileArraySize[0]) {
+                fileArraySize[0] = destRow + numDataRows;
+            }
+        }
+
+        //
+        // Make room in the file for the array.
+        //
+        dataset.extend(fileArraySize);
+
+        H5::DataSpace extendedSpace = dataset.getSpace();
+        //
+        // Store the newly dimensioned dataspaces.
+        //
+        fileSpace.getSimpleExtentDims(fileArraySize, fileArrayMaxSize);			
+        //int extendedSize = extendedSpace.getSimpleExtentNpoints(); // FIXME(yli): should this be used??
+        //
+        // Configure the proper addressing to append to the array.
+        //
+        hsize_t dataSize[2];
+        dataSize[0] = numDataRows;
+        dataSize[1] = rowLength;
+        hsize_t offset[2];
+        //
+        // Determine which row to write to.
+        //
+        if (destRow == -1) {
+            offset[0] = blockStart[0];
+        }
+        else {
+            offset[0] = destRow;
+        }
+        offset[1] = 0;
+        extendedSpace.selectHyperslab(H5S_SELECT_SET, dataSize, offset);
+        H5::DataSpace memorySpace(2, dataSize);
+
+        //
+        // Finally, write out the data.  
+        // This uses a generic function which is specialized with
+        // templates later on to t
+        // memorySpace addresses the entire array in linear format
+        // fileSpace addresses the last dataLength blocks of dataset.
+        //
+        TypedWriteRow(this->writeBuffer, memorySpace, extendedSpace);
+        memorySpace.close();
+        extendedSpace.close();
+        fileSpace.close();
+    }
+    this->ResetWriteBuffer();
+}
+
+#endif // _BLASR_HDF_BUFFERED_HDF_2D_ARRAY_IMPL_HPP_
diff --git a/libcpp/hdf/BufferedHDFArray.cpp b/libcpp/hdf/BufferedHDFArray.cpp
new file mode 100644
index 0000000..a23f6f8
--- /dev/null
+++ b/libcpp/hdf/BufferedHDFArray.cpp
@@ -0,0 +1,92 @@
+#include "BufferedHDFArray.hpp"
+
+/*
+ *
+ * Implementation of a 1-D array for IO from an HDF array.
+ * This is templated, but specialized for a few data types, so that 
+ * the HDF data types do not need to be specified by anybody.
+ *
+ *  Two examples of the usage of this class follow:
+ *
+ *	HDFArray<int> nElemArray;
+ * 	nElemArray.Initialize(hdfFile, "PulseData/BaseCalls/ZMW/NumEvent");
+ *  nElemArray.Read(i, i+1, &nElem);
+ *
+ * 	HDFArray<unsigned char> qualArray;
+ *	qualArray.Initialize(hdfFile, "PulseData/BaseCalls/QualityValue");
+ *  qualArray.Read(cur, cur + nElem, qual);
+ *
+ */
+
+//
+// Type specializations for some standard types. Use the macro for
+// vanilla specializations (that only require the HDF type ID to be
+// specified). 
+//
+#define DEFINE_TYPED_READ_ARRAY(T, Pred) template<>  \
+   	void BufferedHDFArray<T>::Read(UInt start, UInt end, T* dest) { \
+   	Read(start,end, Pred, dest); \
+	}
+
+DEFINE_TYPED_READ_ARRAY(int, H5::PredType::NATIVE_INT)
+DEFINE_TYPED_READ_ARRAY(char, H5::PredType::NATIVE_INT8)
+DEFINE_TYPED_READ_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
+DEFINE_TYPED_READ_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
+DEFINE_TYPED_READ_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)
+DEFINE_TYPED_READ_ARRAY(float, H5::PredType::NATIVE_FLOAT)
+DEFINE_TYPED_READ_ARRAY(char*, H5::PredType::C_S1)
+
+
+#define DEFINE_TYPED_READ_DATASET(T, Pred) template<> \
+	void BufferedHDFArray<T>::ReadDataset(std::vector<T> &dest) { \
+	dest.resize(arrayLength); \
+  Read(0, arrayLength, Pred, &dest[0]); \
+}
+
+DEFINE_TYPED_READ_DATASET(int, H5::PredType::NATIVE_INT)
+DEFINE_TYPED_READ_DATASET(char, H5::PredType::NATIVE_INT8)
+DEFINE_TYPED_READ_DATASET(unsigned char, H5::PredType::NATIVE_UINT8)
+DEFINE_TYPED_READ_DATASET(unsigned int, H5::PredType::NATIVE_UINT)
+DEFINE_TYPED_READ_DATASET(uint16_t, H5::PredType::NATIVE_UINT16)
+DEFINE_TYPED_READ_DATASET(float, H5::PredType::NATIVE_FLOAT)
+DEFINE_TYPED_READ_DATASET(char*, H5::PredType::C_S1)
+
+
+#define DEFINE_TYPED_CREATE_ARRAY(T, Pred) template<> \
+	void BufferedHDFArray<T>::TypedCreate(H5::DataSpace &fileSpace, H5::DSetCreatPropList &cparms) { \
+	T zero; zero = 0;\
+	cparms.setFillValue(Pred, &zero);\
+	dataset = container->createDataSet(datasetName.c_str(), Pred, fileSpace, cparms); \
+}
+
+DEFINE_TYPED_CREATE_ARRAY(int, H5::PredType::NATIVE_INT)
+DEFINE_TYPED_CREATE_ARRAY(char, H5::PredType::NATIVE_INT8)
+DEFINE_TYPED_CREATE_ARRAY(char*, H5::StrType(0,H5T_VARIABLE))
+DEFINE_TYPED_CREATE_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
+DEFINE_TYPED_CREATE_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
+DEFINE_TYPED_CREATE_ARRAY(float, H5::PredType::NATIVE_FLOAT)
+DEFINE_TYPED_CREATE_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)
+
+template<>
+void BufferedHDFArray<string>::TypedCreate(H5::DataSpace &space, H5::DSetCreatPropList &cparms) {
+    H5::StrType varStrType(0,H5T_VARIABLE);
+    dataset = container->createDataSet(datasetName.c_str(), varStrType, space, cparms);
+}
+
+
+#define DEFINE_TYPED_WRITE_ARRAY(T, Pred) template<> \
+void BufferedHDFArray<T>::TypedWrite(const T *data, \
+    const H5::DataSpace &memorySpace, const H5::DataSpace &fileSpace) { \
+    dataset.write(data, Pred, memorySpace, fileSpace); \
+}
+
+DEFINE_TYPED_WRITE_ARRAY(int, H5::PredType::NATIVE_INT)
+DEFINE_TYPED_WRITE_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
+DEFINE_TYPED_WRITE_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
+DEFINE_TYPED_WRITE_ARRAY(char, H5::PredType::NATIVE_INT8)
+DEFINE_TYPED_WRITE_ARRAY(float, H5::PredType::NATIVE_FLOAT)
+DEFINE_TYPED_WRITE_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)
+DEFINE_TYPED_WRITE_ARRAY(char*, H5::StrType(0,H5T_VARIABLE))
+DEFINE_TYPED_WRITE_ARRAY(std::string, H5::StrType(0,H5T_VARIABLE))
+
+
diff --git a/libcpp/hdf/BufferedHDFArray.hpp b/libcpp/hdf/BufferedHDFArray.hpp
new file mode 100644
index 0000000..cb1037e
--- /dev/null
+++ b/libcpp/hdf/BufferedHDFArray.hpp
@@ -0,0 +1,207 @@
+#ifndef _BLASR_BUFFERED_HDF_ARRAY_HPP_
+#define _BLASR_BUFFERED_HDF_ARRAY_HPP_
+
+#include <cassert>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+// HDF5 library includes
+#include "hdf5.h"
+#include "H5Cpp.h"
+
+#include "Types.h"
+#include "HDFConfig.hpp"
+#include "HDFData.hpp"
+#include "HDFGroup.hpp"
+#include "HDFWriteBuffer.hpp"
+#include "HDFFile.hpp"
+#include "DNASequence.hpp"
+#include "FASTQSequence.hpp"
+
+/*
+ *
+ * Implementation of a 1-D array for IO from an HDF array.
+ * This is templated, but specialized for a few data types, so that 
+ * the HDF data types do not need to be specified by anybody.
+ *
+ *  Two examples of the usage of this class follow:
+ *
+ *  HDFArray<int> nElemArray;
+ *  nElemArray.Initialize(hdfFile, "PulseData/BaseCalls/ZMW/NumEvent");
+ *  nElemArray.Read(i, i+1, &nElem);
+ *
+ *  HDFArray<unsigned char> qualArray;
+ *  qualArray.Initialize(hdfFile, "PulseData/BaseCalls/QualityValue");
+ *  qualArray.Read(cur, cur + nElem, qual);
+ *
+ */
+
+template<typename T>
+class BufferedHDFArray : public HDFData, public HDFWriteBuffer<T> {
+public:
+    hsize_t   nDims;
+    hsize_t   *dimSize;
+    int       maxDims;
+    UInt      arrayLength;
+
+    /*
+     * Constructor meant to be used for data that will be written.  
+     * This allocates the write buffer.
+     */
+    BufferedHDFArray(int pBufferSize=1024);
+
+    BufferedHDFArray(H5::CommonFG* _container, std::string _datasetName);
+
+    ~BufferedHDFArray(); 
+
+    void SetBufferSize(int _bufferSize); 
+
+    void Write(const T *data, UInt dataLength, bool append=true, 
+        UInt writePos = 0);
+
+    void Flush(bool append=true, UInt writePos = 0); 
+
+    void TypedWrite(const char **data, const H5::DataSpace &memorySpace, 
+        const H5::DataSpace &extendedSpace); 
+
+    void TypedWrite(const T*data, const H5::DataSpace &memorySpace, 
+        const H5::DataSpace &extendedSpace); 
+
+    void TypedCreate(H5::DataSpace &fileSpace, H5::DSetCreatPropList &cparms); 
+
+    void Create(HDFGroup &parentGroup, std::string _datasetName); 
+
+    void Create(H5::CommonFG* _container, std::string _datasetName); 
+
+    /*
+     * Initialize for reading.
+     *
+     * Open a dataset in an hdf file. Only call this on datasets that
+     * exist, since this currently handles errors with opening datasets
+     * by ungracefully exiting the program. 
+     */
+
+    int InitializeForReading(HDFGroup &parentGroup, 
+        const std::string datasetName); 
+
+    int Initialize(HDFGroup &parentGroup, const std::string &datasetName); 
+
+    int Initialize(HDFGroup &parentGroup, const std::string &datasetName,
+        bool createIfMissing, UInt newArrayLength=0); 
+
+    int UpdateH5Dataspace(); 
+
+    int Resize(UInt newArrayLength); 
+
+    void Close(); 
+
+    UInt size(); 
+
+    /*
+     * Unspecialized form of read.
+     * Read cannot be called on a type T* that does not have a
+     * specialized template definition.  This is all determined at
+     * compile time.  To ensure this, the following
+     * default definition is provided that gives a nasty warning and
+     * exits the code.
+     */
+
+    virtual void Read(UInt start, UInt end, T* dest); 
+
+    /*
+     * Read in type T from the opened dataset from the interval (start,
+     * end].
+     */
+    void ReadDataset(std::vector<T> &dest); 
+
+    void Read(UInt start, UInt end, H5::DataType typeID, T* dest); 
+
+    void ReadCharArray(UInt start, UInt end, std::string* dest); 
+};
+
+/*
+ * Type specializations for some standard types. Use the macro for
+ * vanilla specializations (that only require the HDF type ID to be
+ * specified). 
+ */
+#define DECLARE_TYPED_READ_ARRAY(T, Pred) template<>  \
+void BufferedHDFArray<T>::Read(UInt start, UInt end, T* dest);
+
+DECLARE_TYPED_READ_ARRAY(int, H5::PredType::NATIVE_INT)
+DECLARE_TYPED_READ_ARRAY(char, H5::PredType::NATIVE_INT8)
+DECLARE_TYPED_READ_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
+DECLARE_TYPED_READ_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
+DECLARE_TYPED_READ_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)
+DECLARE_TYPED_READ_ARRAY(float, H5::PredType::NATIVE_FLOAT)
+DECLARE_TYPED_READ_ARRAY(char*, H5::PredType::C_S1)
+
+
+#define DECLARE_TYPED_READ_DATASET(T, Pred) template<>  \
+void BufferedHDFArray<T>::ReadDataset(vector<T>  &dest);
+
+DECLARE_TYPED_READ_DATASET(int, H5::PredType::NATIVE_INT)
+DECLARE_TYPED_READ_DATASET(char, H5::PredType::NATIVE_INT8)
+DECLARE_TYPED_READ_DATASET(unsigned char, H5::PredType::NATIVE_UINT8)
+DECLARE_TYPED_READ_DATASET(unsigned int, H5::PredType::NATIVE_UINT)
+DECLARE_TYPED_READ_DATASET(uint16_t, H5::PredType::NATIVE_UINT16)
+DECLARE_TYPED_READ_DATASET(float, H5::PredType::NATIVE_FLOAT)
+DECLARE_TYPED_READ_DATASET(char*, H5::PredType::C_S1)
+
+
+#define DECLARE_TYPED_CREATE_ARRAY(T, Pred) template <> \
+void BufferedHDFArray<T>::TypedCreate(H5::DataSpace &fileSpace,  \
+    H5::DSetCreatPropList &cparms);
+
+DECLARE_TYPED_CREATE_ARRAY(int, H5::PredType::NATIVE_INT)
+DECLARE_TYPED_CREATE_ARRAY(char, H5::PredType::NATIVE_INT8)
+DECLARE_TYPED_CREATE_ARRAY(char*, H5::StrType(0,H5T_VARIABLE))
+DECLARE_TYPED_CREATE_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
+DECLARE_TYPED_CREATE_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
+DECLARE_TYPED_CREATE_ARRAY(float, H5::PredType::NATIVE_FLOAT)
+DECLARE_TYPED_CREATE_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)
+
+template<>
+void BufferedHDFArray<std::string>::TypedCreate(H5::DataSpace &space, H5::DSetCreatPropList &cparms);
+
+#define DECLARE_TYPED_WRITE_ARRAY(T, Pred) template <> \
+void BufferedHDFArray<T>::TypedWrite(const T *data, \
+    const H5::DataSpace &memorySpace, const H5::DataSpace &fileSpace);
+
+DECLARE_TYPED_WRITE_ARRAY(int, H5::PredType::NATIVE_INT)
+DECLARE_TYPED_WRITE_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
+DECLARE_TYPED_WRITE_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
+DECLARE_TYPED_WRITE_ARRAY(char, H5::PredType::NATIVE_INT8)
+DECLARE_TYPED_WRITE_ARRAY(float, H5::PredType::NATIVE_FLOAT)
+DECLARE_TYPED_WRITE_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)
+DECLARE_TYPED_WRITE_ARRAY(char*, H5::StrType(0,H5T_VARIABLE))
+DECLARE_TYPED_WRITE_ARRAY(std::string, H5::StrType(0,H5T_VARIABLE))
+
+//
+// This is a nonstandard definition because it requires the creation
+// of a special datatype for variable length string type.
+//
+//
+// Use this as the base class for other lists.
+//
+typedef BufferedHDFArray<void> BaseHDFArray;
+
+#define DEFINE_TYPED_CLASS(CLASS_NAME, TEMPLATE_TYPE) \
+class CLASS_NAME : public BufferedHDFArray< TEMPLATE_TYPE  > { \
+public: \
+    void Read(UInt start, UInt end, TEMPLATE_TYPE *dest) { \
+        BufferedHDFArray<TEMPLATE_TYPE>::Read(start, end, dest); \
+    } \
+}; 
+
+DEFINE_TYPED_CLASS(HDFIntArray, int)
+DEFINE_TYPED_CLASS(HDFUIntArray, unsigned int)
+DEFINE_TYPED_CLASS(HDFUCharArray, unsigned char)
+DEFINE_TYPED_CLASS(HDFCharArray, char)
+DEFINE_TYPED_CLASS(HDFUShortArray, uint16_t )
+//DEFINE_TYPED_CLASS(HDFStringArray, std::string)
+DEFINE_TYPED_CLASS(HDFFloatArray, float)
+
+#include "BufferedHDFArrayImpl.hpp"
+
+#endif
diff --git a/libcpp/hdf/BufferedHDFArrayImpl.hpp b/libcpp/hdf/BufferedHDFArrayImpl.hpp
new file mode 100644
index 0000000..9f890ca
--- /dev/null
+++ b/libcpp/hdf/BufferedHDFArrayImpl.hpp
@@ -0,0 +1,435 @@
+#ifndef _BLASR_HDF_BUFFERED_HDF_ARRAY_IMPL_HPP_
+#define _BLASR_HDF_BUFFERED_HDF_ARRAY_IMPL_HPP_
+
+#include <cstdlib>
+#include <iostream>
+#include <cstring>
+#include "BufferedHDFArray.hpp"
+
+template<typename T>
+BufferedHDFArray<T>::BufferedHDFArray(int pBufferSize) : HDFData() {
+    nDims = 0;
+    maxDims = 0;
+    arrayLength = 0;
+    dimSize = NULL;
+    this->bufferIndex = 0;
+    this->InitializeBuffer(pBufferSize);
+}
+
+template<typename T>
+BufferedHDFArray<T>::BufferedHDFArray(H5::CommonFG* _container, 
+    std::string _datasetName) : HDFData(_container, _datasetName) {
+    // no-op
+}
+
+template<typename T>
+BufferedHDFArray<T>::~BufferedHDFArray() {
+    //
+    // Clean up the write buffer.
+    //
+    if (dimSize != NULL) {
+        delete[] dimSize;
+        dimSize = NULL;
+    }
+    this->Free();
+}
+
+template<typename T>
+void BufferedHDFArray<T>::SetBufferSize(int _bufferSize) {
+    this->InitializeBuffer(_bufferSize);
+}
+
+template<typename T>
+void BufferedHDFArray<T>::Write(const T *data, UInt dataLength, bool append, 
+    UInt writePos) {
+
+    // Fill the buffer with data. When there is overflow, write
+    // that out to disk.
+    //
+    UInt dataIndex = 0;
+    int bufferCapacity;
+    int bufferFillSize = 0;
+    bool flushBuffer;
+    while(dataIndex < dataLength) {
+        bufferCapacity = this->bufferSize - this->bufferIndex;
+        flushBuffer = false;
+        if (bufferCapacity  > dataLength - dataIndex) {
+            bufferFillSize = dataLength - dataIndex;
+        }
+        else {
+            bufferFillSize = bufferCapacity;
+            flushBuffer = true;
+        }
+        memcpy((void*) &this->writeBuffer[this->bufferIndex], (void*) &data[dataIndex], sizeof(T)*bufferFillSize);
+        dataIndex   += bufferFillSize;
+        this->bufferIndex += bufferFillSize;
+        if (flushBuffer) {
+            Flush(append, writePos);
+        }
+    }
+}
+
+template<typename T>
+void BufferedHDFArray<T>::Flush(bool append, UInt writePos) {
+    //
+    // Flush contents of current buffer to the file.
+    //
+    if (this->WriteBufferEmpty()) {
+        // 
+        // There is no data in the buffer, so nothing can be written.
+        // HDF does not support empty arrays (as far as I can tell), so
+        // don't even bother trying to create the dataspace.
+        // 
+        return;
+    }
+
+    // fetch the current size of the dataspace
+    if (fileDataSpaceInitialized == false) {
+        std::cout << "ERROR, trying to flush a dataset that has not been ";
+        std::cout << "created or initialized" << std::endl;
+        exit(1);
+        fileDataSpaceInitialized = true;
+    }
+
+    H5::DataSpace fileSpace;
+    fileSpace = dataset.getSpace();
+
+    //
+    // Load the current size of the array on disk.
+    //
+    hsize_t fileArraySize[1], blockStart;
+    fileArraySize[0] = fileSpace.getSimpleExtentNpoints();
+    if (append) {
+        blockStart = fileSpace.getSimpleExtentNpoints();
+        fileArraySize[0] += this->bufferIndex;
+        //
+        // Make room in the file for the array.
+        //
+        dataset.extend(fileArraySize);
+    }
+    else {
+        blockStart = writePos;
+        if (blockStart + this->bufferIndex > fileArraySize[0]) {
+            fileArraySize[0] = blockStart + this->bufferIndex;
+            dataset.extend(fileArraySize);
+        }
+    }
+
+    H5::DataSpace extendedSpace = dataset.getSpace();
+    //int extendedSize        = extendedSpace.getSimpleExtentNpoints(); // FIXME(yli): why isn't this used?
+    //
+    // Configure the proper addressing to append to the array.
+    //
+    hsize_t dataSize[1];
+    hsize_t offset[1];
+    dataSize[0] = this->bufferIndex;
+    offset[0]   = blockStart;
+    extendedSpace.selectHyperslab(H5S_SELECT_SET, dataSize, offset);
+    H5::DataSpace memorySpace(1, dataSize);
+
+    //
+    // Finally, write out the data.  
+    // This uses a generic function which is specialized with
+    // templates later on to t
+    // memorySpace addresses the entire array in linear format
+    // fileSpace addresses the last dataLength blocks of dataset.
+    //
+    try {
+        TypedWrite(this->writeBuffer, memorySpace, extendedSpace);
+    }
+    catch(H5::DataSetIException e) {
+        std::cout <<"ERROR! Could not write HDF5 data." << std::endl;
+        e.printError();
+        exit(1);
+    }
+    memorySpace.close();
+    extendedSpace.close();
+    fileSpace.close();
+
+    // Clear the buffer.
+    this->ResetWriteBuffer();
+}
+
+template<typename T>
+void BufferedHDFArray<T>::TypedWrite(const char **data, const H5::DataSpace &memorySpace, 
+    const H5::DataSpace &extendedSpace) {
+
+    H5::StrType varStrType(0,H5T_VARIABLE);
+    dataset.write(data, varStrType, memorySpace, extendedSpace);
+}
+
+template<typename T>
+void BufferedHDFArray<T>::TypedWrite(const T* data, const H5::DataSpace &memorySpace, 
+    const H5::DataSpace &extendedSpace) {
+
+    assert("Calling TypedWrite on an unsupported type" == 0);
+}
+
+template<typename T>
+void BufferedHDFArray<T>::TypedCreate(H5::DataSpace &fileSpace, 
+    H5::DSetCreatPropList &cparms) {
+
+    std::cout << "DEFAULT typed create " << std::endl;
+}
+
+
+template<typename T>
+void BufferedHDFArray<T>::Create(HDFGroup &parentGroup, std::string _datasetName) {
+    return Create(&parentGroup.group, _datasetName);
+}
+
+
+template<typename T>
+void BufferedHDFArray<T>::Create(H5::CommonFG* _container, std::string _datasetName) {
+    //
+    // Initialize where the dataset will go.
+    container   = _container;
+    datasetName = _datasetName;
+
+    hsize_t dataSize[]    = {0};
+    hsize_t maxDataSize[] = {H5S_UNLIMITED};
+    H5::DataSpace fileSpace(1, dataSize, maxDataSize);
+    H5::DSetCreatPropList cparms;
+
+    /*
+     * For some reason, chunking must be enabled when creating a dataset
+     * that  has an unlimited dimension.  Of course, this is not
+     * mentioned in the hdf5 c++ documentation, because that
+     * docuemntation was written for people who enjoy learning how to
+     * use an API by reading comments in source code.
+     */
+    hsize_t      chunk_dims[1] = { 16384 };
+    cparms.setChunk( 1, chunk_dims );
+    TypedCreate(fileSpace, cparms);
+
+    //
+    // Since TypedCreate created an assigned a dataset, this array is
+    // now initialized.  Do the bookkeeping here.
+    //
+
+    isInitialized = true;
+    fileDataSpaceInitialized = true;
+    fileSpace.close();
+}
+
+
+
+/*
+ * Initialize for reading.
+ *
+ * Open a dataset in an hdf file. Only call this on datasets that
+ * exist, since this currently handles errors with opening datasets
+ * by ungracefully exiting the program. 
+ */
+
+template<typename T>
+int BufferedHDFArray<T>::InitializeForReading(HDFGroup &parentGroup, 
+    const std::string datasetName) {
+
+    return Initialize(parentGroup, datasetName, false);
+}
+
+template<typename T>
+int BufferedHDFArray<T>::Initialize(HDFGroup &parentGroup, 
+    const std::string &datasetName) {
+
+    return Initialize(parentGroup, datasetName, true);
+}
+
+template<typename T>
+int BufferedHDFArray<T>::Initialize(HDFGroup &parentGroup, 
+    const std::string &datasetName, bool createIfMissing, UInt newArrayLength) {
+    //
+    // For writing to this dataset, start at the first position in the
+    // write buffer.
+    //
+    this->bufferIndex = 0;
+    //
+    // It's possible that the group may be asked to initialize this
+    // dataset when the dataset does not exist.  Check that here.
+    //
+    bool parentHasObject = parentGroup.ContainsObject(datasetName);
+    if ( parentHasObject and InitializeDataset(parentGroup, datasetName) == 0) {
+        // 
+        // The parent group already contains this dataset.  Try to
+        // initialize this dataset and if it does not exist, flag fail.
+        //
+        return 0;
+    }
+
+    //
+    // This is a hack to create in read/write mode.  If the parent
+    // does not have the object, try and create it.  The problem with
+    // trying to open a dataset in append mode is it will fail if the
+    // dataset does not exist.
+    //
+    if (parentHasObject == false) {
+        if (createIfMissing) {
+            Create(parentGroup, datasetName);
+        }
+        else {
+            //
+            // Trying to open a dataset to read only, but it does not
+            // exist.  Bail.
+            //
+            return 0;
+        }
+    }
+    int ret = UpdateH5Dataspace();
+    if (newArrayLength > 0) {
+        ret *= Resize(newArrayLength);
+    }
+    return ret;
+}
+
+template<typename T>
+int BufferedHDFArray<T>::UpdateH5Dataspace() {
+    try {
+        dataspace = dataset.getSpace();
+    }
+    catch(H5::DataSetIException &e) { 
+        e.printError();
+        return 0;
+    }
+    maxDims = MAX_DIMS;
+    try {
+        nDims = dataspace.getSimpleExtentNdims();
+        /*
+         * Prevent abuse of this class for multidimensional IO.
+         */
+        if (nDims != 1) {
+            std::cout << "ERROR in HDF format: dataset: ";
+            std::cout << datasetName << " should be 1-D, but it is not."; 
+            std::cout << std::endl;
+            exit(1);
+        }
+
+        /*
+         * Load in the size of this dataset, and make a map to the whole thing.
+         */
+        if (dimSize != NULL) {
+            delete [] dimSize;
+            dimSize = NULL;
+        }
+        dimSize = new hsize_t[nDims];
+
+        dataspace.getSimpleExtentDims(dimSize);
+        arrayLength = dimSize[0];
+        if (dimSize[0] == 0) {
+            // DONT create a real dataspace if the size is 0
+            // cout << "WARNING, trying to open a zero sized dataspace." << endl;
+            dataspace.close();
+            return 1;
+        }
+        fullSourceSpace = H5::DataSpace(1, dimSize);
+        dataspace.close();
+    }
+    catch(H5::Exception& e) {
+        e.printError();
+        return 0;
+    }
+    return 1;
+}
+
+template<typename T>
+int BufferedHDFArray<T>::Resize(UInt newArrayLength) {
+    //
+    // Resize this dataset. May or may not allocate space in file.
+    // May or may not write fill value.
+    //
+    try{
+        H5::DataSpace fileSpace;
+        fileSpace = dataset.getSpace();
+
+        hsize_t fileArraySize[1];
+        fileArraySize[0] = newArrayLength;
+        arrayLength = newArrayLength;
+        dataset.extend(fileArraySize);
+        fileSpace.close();
+    } catch(H5::DataSetIException &e) { 
+        e.printError();
+        return 0;
+    }
+    return 1;
+}
+
+
+template<typename T>
+void BufferedHDFArray<T>::Close() {
+    if (dimSize != NULL) {
+        delete[] dimSize;
+        dimSize = NULL;
+        HDFData::Close();
+    }
+}
+
+template<typename T>
+UInt BufferedHDFArray<T>::size() {
+    dataspace = dataset.getSpace();
+    hsize_t dimSizeArray[1];
+    dataspace.getSimpleExtentDims(dimSizeArray);
+    dataspace.close();
+    return dimSizeArray[0];
+}
+
+/*
+ * Unspecialized form of read.
+ * Read cannot be called on a type T* that does not have a
+ * specialized template definition.  This is all determined at
+ * compile time.  To ensure this, the following
+ * default definition is provided that gives a nasty warning and
+ * exits the code.
+ */
+
+template<typename T>
+void BufferedHDFArray<T>::Read(UInt start, UInt end, T* dest) {
+    assert("ERROR, calling Read with an unsupported type. Use Read(start,end,datatype, dest) instead." == 0);
+    exit(1); // this is in case the assert statement is removed.
+}
+
+/*
+ * Read in type T from the opened dataset from the interval (start,
+ * end].
+ */
+
+template<typename T>
+void BufferedHDFArray<T>::ReadDataset(std::vector<T> &dest) {
+    assert("ERROR, calling ReadDataset with an unsupported type.");
+    exit(1); // this is in case the assert statement is removed.
+}
+
+template<typename T>
+void BufferedHDFArray<T>::Read(UInt start, UInt end, H5::DataType typeID, T *dest) {
+    if (end - start == 0) {
+        return;
+    }
+    hsize_t memSpaceSize[] = {0};
+    memSpaceSize[0] = end - start;
+    hsize_t sourceSpaceOffset[] = {0};
+    sourceSpaceOffset[0] = start;
+    H5::DataSpace destSpace(1, memSpaceSize);
+    fullSourceSpace.selectHyperslab(H5S_SELECT_SET, memSpaceSize, sourceSpaceOffset);
+    dataset.read(dest, typeID, destSpace, fullSourceSpace);
+    destSpace.close();
+}
+
+template<typename T>
+void BufferedHDFArray<T>::ReadCharArray(UInt start, UInt end, std::string* dest) {
+    hsize_t memSpaceSize[] = {0};
+    memSpaceSize[0] = end - start;
+    hsize_t sourceSpaceOffset[] = {0};
+    sourceSpaceOffset[0] = start;
+    H5::DataSpace destSpace(1, memSpaceSize);
+    H5::StrType strType(0, H5T_VARIABLE);
+    fullSourceSpace.selectHyperslab(H5S_SELECT_SET, memSpaceSize, sourceSpaceOffset);
+    std::vector<char*> tmpStringArray;
+    tmpStringArray.resize(end-start);
+    dataset.read(&tmpStringArray[0], strType, destSpace, fullSourceSpace);
+    UInt i;
+    for (i = 0; i < tmpStringArray.size(); i++) {
+        dest[i] = tmpStringArray[i];
+    }
+    destSpace.close();
+}
+
+#endif // _BLASR_HDF_BUFFERED_HDF_ARRAY_IMPL_HPP_
diff --git a/libcpp/hdf/DatasetCollection.cpp b/libcpp/hdf/DatasetCollection.cpp
new file mode 100644
index 0000000..3184e49
--- /dev/null
+++ b/libcpp/hdf/DatasetCollection.cpp
@@ -0,0 +1,61 @@
+#include "DatasetCollection.hpp"
+
+void DatasetCollection::MakeFieldRequired(std::string &fieldName) {
+    includedFields[fieldName] = true;
+    requiredFields[fieldName] = true;
+}
+
+void DatasetCollection::MakeFieldOptional(std::string &fieldName) {
+    includedFields[fieldName] = true;
+    requiredFields[fieldName] = false;
+}
+
+void DatasetCollection::InitializeAllFields(bool value) {
+    size_t f;
+    for (f = 0; f < fieldNames.size(); f++ ) {
+        includedFields[fieldNames[f]] = value;
+    }
+}
+
+void DatasetCollection::InitializeFields(std::vector<std::string> &fieldList) {
+    size_t i;
+    for (i = 0; i < fieldList.size(); i++) {
+        includedFields[fieldList[i]] = true;
+    }
+}
+
+void DatasetCollection::InitializeFields(std::vector<char*> &fieldList) {
+    size_t i;
+    InitializeAllFields(false);
+    for (i = 0; i < fieldList.size(); i++) {
+        includedFields[fieldList[i]] = true;
+    }
+}
+
+int DatasetCollection::IncludeField(std::string fieldName) {
+    if (includedFields.find(fieldName) == includedFields.end()) {
+        return 0;
+    }	
+    else {
+        includedFields[fieldName] = true;
+    }
+    return 1;
+}
+
+bool DatasetCollection::FieldIsIncluded(std::string fieldName) {
+    if (includedFields.find(fieldName) == includedFields.end()) {
+        return false;
+    }
+    else {
+        return includedFields[fieldName];
+    }
+}
+
+bool DatasetCollection::ContainsField(std::string fieldName) {
+    size_t f;
+    for (f = 0; f < fieldNames.size(); f++) {
+        if (fieldNames[f] == fieldName) return true;
+    }
+    return false;
+}
+
diff --git a/libcpp/hdf/DatasetCollection.hpp b/libcpp/hdf/DatasetCollection.hpp
new file mode 100644
index 0000000..b3305f7
--- /dev/null
+++ b/libcpp/hdf/DatasetCollection.hpp
@@ -0,0 +1,41 @@
+#ifndef _BLASR_DATASET_COLLECTION_HPP_
+#define _BLASR_DATASET_COLLECTION_HPP_
+
+#include <map>
+#include <vector>
+#include <string>
+#include <iostream>
+#include "HDFGroup.hpp"
+#include "HDFData.hpp"
+
+
+class DatasetCollection {
+public:
+    std::vector<std::string> fieldNames;
+    std::map<std::string,bool> includedFields;
+    std::map<std::string,bool> requiredFields;
+
+    void MakeFieldRequired(std::string &fieldName); 
+
+    void MakeFieldOptional(string &fieldName); 
+
+    void InitializeAllFields(bool value); 
+
+    void InitializeFields(std::vector<std::string> &fieldList); 
+
+    void InitializeFields(std::vector<char*> &fieldList); 
+
+    int IncludeField(std::string fieldName); 
+
+    bool FieldIsIncluded(std::string fieldName); 
+
+    bool ContainsField(std::string fieldName); 
+
+    template <typename T_Dataset>
+    bool InitializeDataset(HDFGroup &group, T_Dataset &dataset, std::string datasetName); 
+
+};
+
+#include "DatasetCollectionImpl.hpp"
+
+#endif
diff --git a/libcpp/hdf/DatasetCollectionImpl.hpp b/libcpp/hdf/DatasetCollectionImpl.hpp
new file mode 100644
index 0000000..7344e9f
--- /dev/null
+++ b/libcpp/hdf/DatasetCollectionImpl.hpp
@@ -0,0 +1,29 @@
+#ifndef _BLASR_DATASET_COLLECTION_IMPL_HPP_
+#define _BLASR_DATASET_COLLECTION_IMPL_HPP_
+
+template <typename T_Dataset>
+bool DatasetCollection::InitializeDataset(HDFGroup &group, 
+    T_Dataset &dataset, std::string datasetName) {
+
+    //
+    // Perform initialization of the dataset in a way that keep track
+    // of which datasets in the collection are present.
+    //
+    if (includedFields[datasetName]) {
+        if (dataset.Initialize(group, datasetName) == false) {
+            if (requiredFields[datasetName]) {
+                return false;
+            }
+            else {
+                //
+                // This field was supposed to be included but it either does
+                // not exist or there was a problem otherwise in creating
+                // it.  Don't try and read from it later on.
+                //
+                includedFields[datasetName] = false;
+            }
+        }
+    }
+    return true;
+}
+#endif
diff --git a/libcpp/hdf/HDF2DArray.hpp b/libcpp/hdf/HDF2DArray.hpp
new file mode 100644
index 0000000..1e76e6e
--- /dev/null
+++ b/libcpp/hdf/HDF2DArray.hpp
@@ -0,0 +1,25 @@
+#ifndef _BLASR_HDF_2DARRAY_HPP_
+#define _BLASR_HDF_2DARRAY_HPP_
+
+#include "BufferedHDF2DArray.hpp"
+
+template<typename T>
+class HDF2DArray : public BufferedHDF2DArray<T> {
+public:
+
+    void WriteRow(const T*data, int dataLength, int destRow=-1) {
+        this->writeBuffer = (T*) data;
+        this->bufferIndex = dataLength;
+        this->bufferSize  = dataLength;
+        this->Flush(destRow);
+        //
+        // Reset status of buffer so that no methods are tricked into
+        // thinking this is a valid pointer.
+        //
+        this->writeBuffer = NULL;
+        this->bufferIndex = 0;
+        this->bufferSize  = 0;
+    }
+};
+
+#endif
diff --git a/libcpp/hdf/HDFAlnGroup.hpp b/libcpp/hdf/HDFAlnGroup.hpp
new file mode 100644
index 0000000..ebdc05e
--- /dev/null
+++ b/libcpp/hdf/HDFAlnGroup.hpp
@@ -0,0 +1,50 @@
+#ifndef _BLASR_HDF_ALN_GROUP_HPP_
+#define _BLASR_HDF_ALN_GROUP_HPP_
+
+#include "HDFArray.h"
+#include "HDFGroup.h"
+
+class HDFAlnGroup {
+ public:
+  HDFGroup alnGroup;
+  HDFArray<unsigned int> idArray;
+  HDFStringArray pathArray;
+
+  void Initialize(HDFGroup &parent) {
+    alnGroup.Initialize(parent.group, "AlnGroup");
+    idArray.Initialize(alnGroup.group, "ID");
+  }
+  
+  void Read(AlnGroup &aln) {
+    // Seem to write data in this HDFAlnGroup obj to AlnGroup & aln
+    int idNElem = idArray.arrayLength;
+    int pathNElem = pathArray.arrayLength;
+    if (idNElem > 0) {
+
+      aln.id.resize(idNElem);
+      idArray.Read(0, idNElem);
+
+      aln.path.resize(pathNElem);
+      unsigned int i;
+      for (i = 0; i < pathNElem; i++) {
+        pathArray.Read(i, i+1, &aln.path[i]);
+      }
+    }
+  }
+
+  int AddPath(string &path) {
+    int id;
+    pathArray.Write(&path, 1);
+    id = pathArray.size();
+    idArray.Write(&id, 1);
+    return id;
+  }
+
+  ~HDFAlnGroup() {
+    alnGroup.Close();
+  }
+
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFAlnGroupGroup.cpp b/libcpp/hdf/HDFAlnGroupGroup.cpp
new file mode 100644
index 0000000..959098e
--- /dev/null
+++ b/libcpp/hdf/HDFAlnGroupGroup.cpp
@@ -0,0 +1,52 @@
+#include "HDFAlnGroupGroup.hpp"
+
+using namespace std;
+
+bool HDFAlnGroupGroup::Create(HDFGroup &parent) {
+    parent.AddGroup("AlnGroup");
+    if (alnGroup.Initialize(parent.group, "AlnGroup") == 0) { return 0; }
+    idArray.Create(alnGroup, "ID");
+    pathArray.Create(alnGroup, "Path");
+    return true;
+}
+
+int HDFAlnGroupGroup::AddPath(string path) {
+    pathArray.Write(&path, 1);
+    unsigned int id = pathArray.size();
+    idArray.Write(&id, 1);
+    int size = pathArray.size();
+    return size;
+}
+
+int HDFAlnGroupGroup::Initialize(HDFGroup &parent) {
+    if (alnGroup.Initialize(parent.group, "AlnGroup") == 0) { 
+        cout << "ERROR, could not open /AlnGroup group." << endl;
+        exit(1); 
+    }
+    if (idArray.Initialize(alnGroup, "ID") == 0) {
+        cout << "ERROR, could not open /AlnGroup/ID." << endl;
+        exit(1); 
+    }
+    if (pathArray.Initialize(alnGroup, "Path") == 0) {
+        cout << "ERROR, could not open /AlnGroup/Path." << endl;
+        exit(1); 
+    }
+    return 1;
+}
+
+void HDFAlnGroupGroup::Read(AlnGroup &aln) {
+    UInt nRow = idArray.size();
+    if (nRow > 0) {
+        aln.id.resize(nRow);
+        idArray.Read(0, nRow, &aln.id[0]);
+        aln.path.resize(nRow);
+        unsigned int i;
+        for (i = 0; i < nRow; i++) {
+            pathArray.Read(i, i+1, &aln.path[i]);
+        }
+    }
+}
+
+HDFAlnGroupGroup::~HDFAlnGroupGroup() {
+    alnGroup.Close();
+}
diff --git a/libcpp/hdf/HDFAlnGroupGroup.hpp b/libcpp/hdf/HDFAlnGroupGroup.hpp
new file mode 100644
index 0000000..8045e48
--- /dev/null
+++ b/libcpp/hdf/HDFAlnGroupGroup.hpp
@@ -0,0 +1,27 @@
+#ifndef _BLASR_HDF_ALN_GROUP_HPP_
+#define _BLASR_HDF_ALN_GROUP_HPP_
+
+#include <string>
+#include "HDFArray.hpp"
+#include "HDFGroup.hpp"
+#include "saf/AlnGroup.hpp"
+
+class HDFAlnGroupGroup {
+public:
+    HDFGroup alnGroup;
+    HDFArray<unsigned int> idArray;
+    HDFStringArray pathArray;
+
+    bool Create(HDFGroup &parent); 
+
+    int AddPath(std::string path); 
+
+    int Initialize(HDFGroup &parent); 
+
+    void Read(AlnGroup &aln); 
+
+    ~HDFAlnGroupGroup(); 
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFAlnInfoGroup.cpp b/libcpp/hdf/HDFAlnInfoGroup.cpp
new file mode 100644
index 0000000..4beba5f
--- /dev/null
+++ b/libcpp/hdf/HDFAlnInfoGroup.cpp
@@ -0,0 +1,102 @@
+#include "HDFAlnInfoGroup.hpp"
+
+using namespace std;
+
+int HDFAlnInfoGroup::InitializeNumPasses() {
+    numPasses.Initialize(alnInfoGroup, "NumPasses");
+    return 1;
+}
+
+void HDFAlnInfoGroup::InitializeDefaultColumnNames(vector<string> &defaultColumnNames) {
+    defaultColumnNames.push_back("AlnID");
+    defaultColumnNames.push_back("AlnGroupID");
+    defaultColumnNames.push_back("MovieID");
+    defaultColumnNames.push_back("RefGroupID");
+    defaultColumnNames.push_back("tStart");
+    defaultColumnNames.push_back("tEnd");
+    defaultColumnNames.push_back("RCRefStrand");
+    defaultColumnNames.push_back("HoleNumber");
+    defaultColumnNames.push_back("SetNumber");
+    defaultColumnNames.push_back("StrobeNumber");
+    defaultColumnNames.push_back("MoleculeID");
+    defaultColumnNames.push_back("rStart");
+    defaultColumnNames.push_back("rEnd");
+    defaultColumnNames.push_back("MapQV");
+    defaultColumnNames.push_back("nM");
+    defaultColumnNames.push_back("nMM");
+    defaultColumnNames.push_back("nIns");
+    defaultColumnNames.push_back("nDel");
+    defaultColumnNames.push_back("Offset_begin");
+    defaultColumnNames.push_back("Offset_end");
+    defaultColumnNames.push_back("nBackRead");
+    defaultColumnNames.push_back("nReadOverlap");
+}
+
+bool HDFAlnInfoGroup::Create(HDFGroup &parent) {
+    parent.AddGroup("AlnInfo");
+    // Make sure it was created, and intialize this group to reference the newly created one.
+    if (alnInfoGroup.Initialize(parent.group, "AlnInfo") == 0) { return 0; }
+    vector<string> defaultColumnNames;
+    InitializeDefaultColumnNames(defaultColumnNames);
+    columnNames.Create(alnInfoGroup.group, "ColumnNames", defaultColumnNames);
+
+    alnIndexArray.Create(&alnInfoGroup.group, "AlnIndex", defaultColumnNames.size());
+    return true;
+}
+
+int HDFAlnInfoGroup::Initialize(HDFGroup &rootGroup) {
+    if (alnInfoGroup.Initialize(rootGroup.group, "AlnInfo") == 0) { return 0; }
+    if (alnIndexArray.Initialize(alnInfoGroup, "AlnIndex") == 0) { return 0; }
+    /*
+     * This functionality should go into the python.
+     if (!alnIndexArray.ContainsAttribute("ColumnNames")) {
+     try {
+     vector<string> defaultColumnNames;
+     InitializeDefaultColumnNames(defaultColumnNames);
+     columnNames.Create(alnIndexArray.dataset, "ColumnNames", defaultColumnNames);
+     }
+     catch(Execption e) {
+    //
+    // If the dataset is not writable
+    }
+    }
+    */
+    return 1;
+}
+
+HDFAlnInfoGroup::~HDFAlnInfoGroup() {
+    alnInfoGroup.Close();
+}
+
+// Return size of /AlnInfo/AlnIndex in KB
+UInt HDFAlnInfoGroup::GetAlnIndexSize() {
+    return alnIndexArray.GetNRows() / 1024 * sizeof (unsigned int) * NCols;
+}
+
+void HDFAlnInfoGroup::Read(AlnInfo &alnInfo) {
+
+    UInt nAlignments = alnIndexArray.GetNRows();
+    alnInfo.alignments.resize(nAlignments);
+    UInt alignmentIndex;
+    UInt alignmentRow[NCols];
+    for (alignmentIndex = 0; alignmentIndex < nAlignments; alignmentIndex++) {
+        // Input the values.
+        alnIndexArray.Read(alignmentIndex, alignmentIndex + 1, alignmentRow);
+        alnInfo.alignments[alignmentIndex].StoreAlignmentIndex(alignmentRow, NCols);
+    }
+}
+
+int HDFAlnInfoGroup::GetNAlignments() {
+    return alnIndexArray.GetNRows();
+}
+
+unsigned int HDFAlnInfoGroup::WriteAlnIndex(vector<unsigned int> &aln) {
+    alnIndexArray.WriteRow(&aln[0], aln.size());
+    return alnIndexArray.GetNRows();
+}
+
+void HDFAlnInfoGroup::ReadCmpAlignment(UInt alignmentIndex, CmpAlignment &cmpAlignment) {
+    UInt alignmentRow[NCols];
+    alnIndexArray.Read(alignmentIndex, alignmentIndex + 1, alignmentRow);
+    cmpAlignment.StoreAlignmentIndex(alignmentRow, NCols);
+}
diff --git a/libcpp/hdf/HDFAlnInfoGroup.hpp b/libcpp/hdf/HDFAlnInfoGroup.hpp
new file mode 100644
index 0000000..4941b1b
--- /dev/null
+++ b/libcpp/hdf/HDFAlnInfoGroup.hpp
@@ -0,0 +1,46 @@
+#ifndef _BLASR_HDF_ALN_INFO_GROUP_HPP_
+#define _BLASR_HDF_ALN_INFO_GROUP_HPP_
+
+#include <cinttypes>
+#include <vector>
+#include <string>
+#include "HDFGroup.hpp"
+#include "HDFAtom.hpp"
+#include "HDFArray.hpp"
+#include "HDF2DArray.hpp"
+#include "saf/AlnInfo.hpp"
+#include "alignment/CmpAlignment.hpp"
+
+class HDFAlnInfoGroup {
+public:
+    HDFGroup alnInfoGroup;
+    HDF2DArray<unsigned int> alnIndexArray;
+    HDFArray<float> startTime;
+    static const int NCols=22;
+    HDFArray<unsigned int> numPasses;
+    HDFAtom<vector<string> > columnNames;
+    HDFAtom<int> frameRate;
+
+    int Initialize(HDFGroup &rootGroup); 
+
+    int InitializeNumPasses(); 
+
+    void InitializeDefaultColumnNames(std::vector<std::string> &defaultColumnNames); 
+
+    bool Create(HDFGroup &parent); 
+
+    ~HDFAlnInfoGroup(); 
+
+    // Return size of /AlnInfo/AlnIndex in KB
+    UInt GetAlnIndexSize(); 
+
+    void Read(AlnInfo &alnInfo); 
+
+    int GetNAlignments(); 
+
+    unsigned int WriteAlnIndex(std::vector<unsigned int> &aln); 
+
+    void ReadCmpAlignment(UInt alignmentIndex, CmpAlignment &cmpAlignment); 
+};
+
+#endif
diff --git a/libcpp/hdf/HDFArray.hpp b/libcpp/hdf/HDFArray.hpp
new file mode 100644
index 0000000..af4c66a
--- /dev/null
+++ b/libcpp/hdf/HDFArray.hpp
@@ -0,0 +1,85 @@
+#ifndef _BLASR_HDF_ARRAY_HPP_
+#define _BLASR_HDF_ARRAY_HPP_
+
+#include <assert.h>
+#include <iostream>
+
+#include "H5Cpp.h"
+
+#include "HDFConfig.hpp"
+#include "HDFData.hpp"
+#include "BufferedHDFArray.hpp"
+#include "DNASequence.hpp"
+#include "FASTQSequence.hpp"
+
+/*
+ *
+ * Implementation of a 1-D array for IO from an HDF array.
+ * This is templated, but specialized for a few data types, so that 
+ * the HDF data types do not need to be specified by anybody.
+ *
+ *  Two examples of the usage of this class follow:
+ *
+ *	HDFArray<int> nElemArray;
+ * 	nElemArray.Initialize(hdfFile, "PulseData/BaseCalls/ZMW/NumEvent");
+ *  nElemArray.Read(i, i+1, &nElem);
+ *
+ * 	HDFArray<unsigned char> qualArray;
+ *	qualArray.Initialize(hdfFile, "PulseData/BaseCalls/QualityValue");
+ *  qualArray.Read(cur, cur + nElem, qual);
+ *
+ */
+
+template<typename T>
+class HDFArray : public BufferedHDFArray<T> {
+public:
+
+    HDFArray() : BufferedHDFArray<T>() {}
+    HDFArray(H5::CommonFG* _container, std::string _datasetName) : 
+        BufferedHDFArray<T>(_container, _datasetName) {}
+
+    /*
+     *  An unbuffered write is simply a write immediately followed by a flush. 
+     */
+    void WriteToPos(const T*data, int dataLength, UInt writePos) {
+        this->writeBuffer = (T*) data;
+        this->bufferIndex = dataLength;
+        this->bufferSize  = dataLength;
+        this->Flush(false, writePos);
+        ResetBuffer();
+    }
+
+    void ResetBuffer() {
+        this->writeBuffer = NULL;
+        this->bufferIndex = 0;
+        this->bufferSize  = 0;
+    }
+
+    void Write(const T *data, int dataLength) {
+        this->writeBuffer = (T*) data;
+        this->bufferIndex = dataLength;
+        this->bufferSize  = dataLength;
+        this->Flush();
+        //
+        // Reset status of buffer so that no methods are tricked into
+        // thinking this is a valid pointer.
+        //
+        ResetBuffer();
+    }
+
+    ~HDFArray() {} 
+};
+
+
+class HDFStringArray: public HDFArray<std::string> {
+public:
+    void Read(UInt start, UInt end, std::string* dest) {
+        std::vector<char*> tmpDestCharPtrs;
+        if (end == start) return;
+        assert(end > start);
+        tmpDestCharPtrs.resize(end-start);
+        //  ReadCharArray(start, end, (char**) &tmpDestCharPtrs[0]);
+        ReadCharArray(start, end, dest);
+    }
+};
+#endif
diff --git a/libcpp/hdf/HDFAtom.cpp b/libcpp/hdf/HDFAtom.cpp
new file mode 100644
index 0000000..ef23749
--- /dev/null
+++ b/libcpp/hdf/HDFAtom.cpp
@@ -0,0 +1,159 @@
+#include "HDFAtom.hpp"
+
+template<>
+void HDFAtom<std::string>::Create(H5::H5Location &object, std::string atomName) {
+    H5::StrType strType(0, H5T_VARIABLE);
+    hsize_t defaultDims[] = {1};
+    H5::DataSpace defaultDataSpace(1, defaultDims);
+    attribute = object.createAttribute(atomName.c_str(), strType, H5::DataSpace(H5S_SCALAR));
+    initialized= true;
+}
+
+
+#define DEFINE_TYPED_CREATE_ATOM(T, predtype) template<> \
+	void HDFAtom<T>::TypedCreate(H5::H5Location &object, std::string &atomName, H5::DataSpace &defaultDataSpace) {				\
+  attribute = object.createAttribute(atomName.c_str(), (predtype), defaultDataSpace );	\
+}
+
+
+DEFINE_TYPED_CREATE_ATOM(int, H5::PredType::NATIVE_INT)
+DEFINE_TYPED_CREATE_ATOM(unsigned int, H5::PredType::NATIVE_UINT)
+DEFINE_TYPED_CREATE_ATOM(unsigned char, H5::PredType::NATIVE_UINT8)
+DEFINE_TYPED_CREATE_ATOM(char, H5::PredType::NATIVE_INT8)
+DEFINE_TYPED_CREATE_ATOM(float, H5::PredType::NATIVE_FLOAT)
+DEFINE_TYPED_CREATE_ATOM(uint64_t, H5::PredType::STD_I64LE)
+
+
+template<>
+void HDFAtom<std::vector<int> >::Write(const std::vector<int> vect) {
+  hsize_t  length = vect.size();
+  H5::DataType baseType = H5::PredType::NATIVE_INT;
+  H5::ArrayType arrayDataType(baseType, 1, &length);
+  attribute.write(arrayDataType, &((vect)[0]));
+}
+
+
+template<>
+void HDFAtom<std::string>::Write(std::string value) {
+  //	H5::StrType strType(0, value.size());
+	H5::StrType strType(0, H5T_VARIABLE);
+	attribute.write(strType, std::string(value.c_str()));
+}
+
+template<>
+void HDFAtom<uint64_t>::Write(uint64_t value) {
+	attribute.write( H5::PredType::STD_I64LE, &value);
+}
+
+template<>
+void HDFAtom<int>::Write(int value) {
+	attribute.write( H5::PredType::NATIVE_INT, &value);
+}
+
+template<>
+void HDFAtom<unsigned int>::Write(unsigned int value) {
+	attribute.write( H5::PredType::NATIVE_INT, &value);
+}
+
+template<>
+void HDFAtom<unsigned char>::Write(unsigned char value) {
+	attribute.write( H5::PredType::NATIVE_UINT8, &value);
+}
+
+template<>
+void HDFAtom<char>::Write(char value) {
+	attribute.write( H5::PredType::NATIVE_INT8, &value);
+}
+
+template<>
+void HDFAtom<float>::Write(float value) {
+	attribute.write( H5::PredType::NATIVE_FLOAT, &value);
+}
+
+template<>
+void HDFAtom<std::string>::Read(std::string &value) {
+	/*
+	 * Read in a std::string that has been stored either as an array or a
+	 * variable length std::string.  To decide which, query the
+	 * isVariableStr() option.
+	 */
+	H5::StrType stringType = attribute.getStrType();
+	bool stringIsVariableLength = stringType.isVariableStr();
+	if (stringIsVariableLength) 
+		attribute.read(stringType, value);
+	else {
+		hsize_t stsize = attribute.getStorageSize();
+		value.resize(stsize);
+		//		char *valueStr = new char[stsize+1];
+		attribute.read(stringType, &value[0]);
+		if (stsize > 0 and value[stsize-1] == '\0') {
+			value.resize(stsize-1);
+		}
+	}
+}
+
+template<>
+void HDFAtom<int>::Read(int &value) {
+	H5::DataType intType(H5::PredType::NATIVE_INT);
+	attribute.read(intType, &value);
+}
+
+template<>
+void HDFAtom<uint64_t>::Read(uint64_t &value) {
+	H5::DataType intType(H5::PredType::STD_I64LE);
+	attribute.read(intType, &value);
+}
+
+template<>
+void HDFAtom<unsigned int>::Read(unsigned int &value) {
+	H5::DataType uintType(H5::PredType::NATIVE_UINT);
+	attribute.read(uintType, &value);
+}
+
+template<>
+void HDFAtom<float>::Read(float &value) {
+	H5::DataType type(H5::PredType::NATIVE_FLOAT);
+	attribute.read(type, &value);
+}
+
+template<>
+void HDFAtom<std::vector<std::string> >::Read(std::vector<std::string> &values) {
+	std::string value;
+	/*
+	 * This attribute is an array of std::strings. They are read in by
+	 * storing pointers to std::strings in memory controlled by HDF.  To read
+	 * the std::strings, read the pointers into a temporary array, then copy
+	 * those std::strings to the values array. This way when the values array
+	 * is destroyed, it will not try and get rid of space that is under
+	 * HDF control.
+	 */
+    H5::DataSpace attributeSpace = attribute.getSpace();
+	hsize_t nPoints;
+	nPoints = attributeSpace.getSelectNpoints();
+	H5::DataType attrType = attribute.getDataType(); // necessary for attr.read()
+
+	// Declare and initialize std::vector of pointers to std::string attribute list.
+	std::vector<char*> ptrsToHDFControlledMemory;
+	ptrsToHDFControlledMemory.resize(nPoints);
+	// Copy the pointers.
+	attribute.read(attrType, &ptrsToHDFControlledMemory[0]);
+	// Copy the std::strings into memory the main program has control over.
+	unsigned int i;
+	for (i = 0; i < ptrsToHDFControlledMemory.size(); i++ ){
+		values.push_back(ptrsToHDFControlledMemory[i]);
+		free(ptrsToHDFControlledMemory[i]);
+	}
+}
+
+// Explict instantiate classes
+template class HDFAtom<int>;
+template class HDFAtom<unsigned int>;
+template class HDFAtom<char>;
+template class HDFAtom<unsigned char>;
+template class HDFAtom<uint64_t>;
+template class HDFAtom<float>;
+template class HDFAtom< std::string >;
+template class HDFAtom< std::vector <int> >;
+template class HDFAtom< std::vector <unsigned int> >;
+template class HDFAtom< std::vector <string> >;
+
diff --git a/libcpp/hdf/HDFAtom.hpp b/libcpp/hdf/HDFAtom.hpp
new file mode 100644
index 0000000..f8934df
--- /dev/null
+++ b/libcpp/hdf/HDFAtom.hpp
@@ -0,0 +1,176 @@
+#ifndef _BLASR_HDF_ATOM_HPP_
+#define _BLASR_HDF_ATOM_HPP_
+
+#include <cassert>
+#include <string>
+#include <vector>
+#include <cstdint>
+#include "H5Cpp.h"
+
+#include "HDFConfig.hpp"
+#include "HDFGroup.hpp"
+#include "HDFData.hpp"
+
+template<typename T>
+class HDFAtom : public HDFData {
+public:
+    H5::Attribute attribute;
+
+    bool initialized;
+    HDFAtom() {
+        initialized = false;
+    }
+    ~HDFAtom() {
+        if (initialized) {
+            attribute.close();
+        }
+    }
+
+    H5::H5Location *GetObject() {
+        return NULL;
+    }
+
+    int Initialize(H5::H5Location &object, std::string attributeName, bool createIfMissing=false) {
+        attribute = object.openAttribute(attributeName.c_str());
+        initialized = true;
+        return 1;
+    }
+
+    int Initialize(HDFGroup &group, std::string attributeName, bool createIfMissing=false) {
+        return Initialize(group.group, attributeName);
+    }
+
+    int Initialize(HDFData &data, std::string attributeName, bool createIfMissing=false) {
+        return Initialize(data.dataset, attributeName);
+    }
+
+    int Initialize(H5::Group &object, std::string attributeName, bool createIfMissing=false) {
+        try {
+            attribute = object.openAttribute(attributeName.c_str());
+        }
+        catch (H5::Exception e) {
+            cout << "ERROR. Could not open attribute " << attributeName << endl;
+            exit(1);
+        }
+        initialized  = true;
+        return 1;
+    }
+
+    int Initialize(H5::H5File &hdfFile, std::string groupName, std::string attributeName) {
+        HDFGroup group;
+        group.Initialize(hdfFile, groupName);
+        attribute = group.group.openAttribute(attributeName.c_str());
+        initialized = true;
+        return 1;
+    }
+
+    //
+    // This handles creation of all non-std::string types.  A specialization
+    // for std::strings is provided below.
+    //
+    void Create(H5::H5Location &object, std::string atomName) {
+        hsize_t defaultDims[] = {1};
+        H5::DataSpace defaultDataSpace(1, defaultDims);
+        TypedCreate(object, atomName, defaultDataSpace);
+    }
+
+
+    void Create(H5::H5Location &object, std::string name, std::string value) {
+        H5::StrType strType(0, value.size());
+        attribute = object.createAttribute(name.c_str(), strType, H5::DataSpace(0,NULL));
+        initialized = true;
+        attribute.write(strType, value.c_str());
+    }
+
+    void Create(H5::H5Location &object, std::string name, std::vector<int> &vect) {
+        hsize_t length = vect.size();
+        H5::ArrayType arrayDataType(H5::PredType::NATIVE_INT, 1, &length);
+        attribute = object.createAttribute(name.c_str(), H5::PredType::NATIVE_INT, H5::DataSpace(1, &length));
+        attribute.write(H5::PredType::NATIVE_INT, &((vect)[0]));    
+    }
+
+    void Create(H5::H5Location &object, std::string name, std::vector<std::string> &vect) {
+        hsize_t length = vect.size();
+        H5::StrType strType(0,H5T_VARIABLE);
+        H5::ArrayType arrayDataType(strType, 1, &length);
+        attribute = object.createAttribute(name.c_str(), strType, H5::DataSpace(1, &length));
+        attribute.write(strType, &((vect)[0]));    
+    }
+
+    void TypedCreate(H5::H5Location &object, std::string &atomName, H5::DataSpace &dataSpace) {
+        assert("Calling HDFAtom<T>::typedCreate on an unsupported type" == 0);
+    }
+
+    void Write(T value) {
+        assert("Calling HDFAtom<T>::Write on an unsupported type" == 0);
+    }
+
+    void Read(T& value) {
+        assert("Calling read on an unsupported type!" == 0);
+    }
+
+};
+
+//
+// Special create for std::strings.  Since this uses a H5::StrType for the
+// typename rather than specifying a H5::PredType, it mertis its own
+// function.
+//
+
+template<>
+void HDFAtom<std::string>::Create(H5::H5Location &object, std::string atomName);
+
+#define DECLARE_TYPED_CREATE_ATOM(T, predtype) template<> \
+	void HDFAtom<T>::TypedCreate(H5::H5Location &object, std::string &atomName, H5::DataSpace &defaultDataSpace);
+
+DECLARE_TYPED_CREATE_ATOM(int, H5::PredType::NATIVE_INT)
+DECLARE_TYPED_CREATE_ATOM(unsigned int, H5::PredType::NATIVE_UINT)
+DECLARE_TYPED_CREATE_ATOM(unsigned char, H5::PredType::NATIVE_UINT8)
+DECLARE_TYPED_CREATE_ATOM(char, H5::PredType::NATIVE_INT8)
+DECLARE_TYPED_CREATE_ATOM(float, H5::PredType::NATIVE_FLOAT)
+DECLARE_TYPED_CREATE_ATOM(uint64_t, H5::PredType::STD_I64LE)
+
+
+template<>
+void HDFAtom<std::vector<int> >::Write(const std::vector<int> vect);
+
+template<>
+void HDFAtom<std::string>::Write(std::string value);
+
+template<>
+void HDFAtom<uint64_t>::Write(uint64_t value);
+
+template<>
+void HDFAtom<int>::Write(int value);
+
+template<>
+void HDFAtom<unsigned int>::Write(unsigned int value);
+
+template<>
+void HDFAtom<unsigned char>::Write(unsigned char value);
+
+template<>
+void HDFAtom<char>::Write(char value);
+
+template<>
+void HDFAtom<float>::Write(float value);
+
+template<>
+void HDFAtom<std::string>::Read(std::string &value);
+
+template<>
+void HDFAtom<int>::Read(int &value);
+
+template<>
+void HDFAtom<uint64_t>::Read(uint64_t &value);
+
+template<>
+void HDFAtom<unsigned int>::Read(unsigned int &value);
+
+template<>
+void HDFAtom<float>::Read(float &value);
+
+template<>
+void HDFAtom<std::vector<std::string> >::Read(std::vector<std::string> &values);
+
+#endif
diff --git a/libcpp/hdf/HDFAttributable.cpp b/libcpp/hdf/HDFAttributable.cpp
new file mode 100644
index 0000000..da57d08
--- /dev/null
+++ b/libcpp/hdf/HDFAttributable.cpp
@@ -0,0 +1,41 @@
+#include <cassert>
+#include "HDFAttributable.hpp"
+
+using namespace std;
+using namespace H5;
+
+void CallStoreAttributeName(H5Location &obj, string attrName, void *attrList){ 
+    ((vector<string>*)attrList)->push_back(attrName);
+}
+
+void HDFAttributable::StoreAttributeNames(H5Location &thisobject, 
+    std::vector<std::string> &attributeNames) {
+    int nAttr = thisobject.getNumAttrs();
+    unsigned int bounds[2];
+    bounds[0] = 0;
+    bounds[1] = nAttr;
+    attributeNameList.clear();
+    thisobject.iterateAttrs(&CallStoreAttributeName, 
+            bounds, (void*) &attributeNames);
+}
+
+H5Location* HDFAttributable::GetObject() {
+    return NULL;
+}
+
+int HDFAttributable::ContainsAttribute(string attributeName) {
+    size_t i;
+    std::vector<std::string> tmpAttributeNames;
+    try{
+        H5Location *obj = GetObject();
+        assert(obj != NULL);
+        StoreAttributeNames(*obj, tmpAttributeNames);
+        for (i = 0; i < tmpAttributeNames.size(); i++) {
+            if (tmpAttributeNames[i] == attributeName) return true;
+        }
+    } catch (H5::Exception e) {
+        //Failed to read attribute // e.printError();
+    }
+    return false;
+}
+
diff --git a/libcpp/hdf/HDFAttributable.hpp b/libcpp/hdf/HDFAttributable.hpp
new file mode 100644
index 0000000..4b223c7
--- /dev/null
+++ b/libcpp/hdf/HDFAttributable.hpp
@@ -0,0 +1,23 @@
+#ifndef _BLASR_HDF_ATTRIBUTABLE_HPP_
+#define _BLASR_HDF_ATTRIBUTABLE_HPP_
+
+#include <string>
+#include <vector>
+#include "H5Cpp.h"
+
+void CallStoreAttributeName(H5::H5Location &obj, std::string attrName, void *attrListPtr);
+
+class HDFAttributable {
+public:
+    std::vector<std::string> attributeNameList;
+
+    void StoreAttributeNames(H5::H5Location &thisobject, 
+        std::vector<std::string> &attributeNames); 
+
+    virtual H5::H5Location* GetObject(); 
+
+    int ContainsAttribute(std::string attributeName); 
+
+};
+
+#endif
diff --git a/libcpp/hdf/HDFBasReader.cpp b/libcpp/hdf/HDFBasReader.cpp
new file mode 100644
index 0000000..48e375d
--- /dev/null
+++ b/libcpp/hdf/HDFBasReader.cpp
@@ -0,0 +1,46 @@
+#include "HDFBasReader.hpp"
+
+//
+// Below is sample code for using the bas reader to read in sequences
+// from a .bas.h5 or .pls.h5 file.  
+// One may select which quality value fields to read.  By default,
+// none are read in.  To read in the rich quality values (insertionQV,
+// deletionQV, substitutionQV, mergeQV, substitutionTag, deletionTag),
+// call InitializeDefaultIncludedFields() BEFORE initializing the
+// reader on the file name.
+//
+//#include "data/hdf/HDFBasReader.h"
+//#include "SMRTSequence.h"
+//#include <string>
+//
+//int main(int argc, char* argv[]) {
+//	
+//	string basFile = argv[1];
+//
+//	HDFBasReader reader;
+//  reader.InitializeDefaultIncludedFields();
+//	reader.Initialize(basFile);
+//
+//	SMRTSequence read;
+//
+//	while(reader.GetNext(read)) {
+//		read.PrintQualSeq(cout);
+//	}
+//
+//
+//	return 0;
+//}
+//
+// * If you wanted to read only fasta sequences and not fastq, use:
+// 
+// FASTASequence read;
+// while (reader.GetNext(read) {
+//   read.PritnSeq(cout);
+// }
+//
+
+int HDFSmrtReader::Advance(int nSteps) {
+	int retVal;
+	retVal = ((T_HDFBasReader<FASTQSequence>*)this)->Advance(nSteps);
+	return retVal;
+}
diff --git a/libcpp/hdf/HDFBasReader.hpp b/libcpp/hdf/HDFBasReader.hpp
new file mode 100644
index 0000000..23fe235
--- /dev/null
+++ b/libcpp/hdf/HDFBasReader.hpp
@@ -0,0 +1,1178 @@
+#ifndef _BLASR_HDF_BAS_READER_HPP_
+#define _BLASR_HDF_BAS_READER_HPP_
+
+#include <cstdlib>
+#include <sstream>
+#include <vector>
+#include <string>
+#include <cstdint>
+
+#include "Enumerations.h"
+#include "FASTQSequence.hpp"
+#include "SMRTSequence.hpp"
+#include "VectorUtils.hpp"
+#include "ChangeListID.hpp"
+#include "reads/BaseFile.hpp"
+
+#include "HDFArray.hpp"
+#include "HDF2DArray.hpp"
+#include "HDFAtom.hpp"
+#include "HDFGroup.hpp"
+#include "HDFZMWReader.hpp"
+#include "HDFScanDataReader.hpp"
+#include "HDFPulseDataFile.hpp"
+#include "DatasetCollection.hpp"
+
+//
+// Below is sample code for using the bas reader to read in sequences
+// from a .bas.h5 or .pls.h5 file.  
+// One may select which quality value fields to read.  By default,
+// none are read in.  To read in the rich quality values (insertionQV,
+// deletionQV, substitutionQV, mergeQV, substitutionTag, deletionTag),
+// call InitializeDefaultIncludedFields() BEFORE initializing the
+// reader on the file name.
+//
+//#include "data/hdf/HDFBasReader.h"
+//#include "SMRTSequence.h"
+//#include <string>
+//
+//int main(int argc, char* argv[]) {
+//	
+//	string basFile = argv[1];
+//
+//	HDFBasReader reader;
+//  reader.InitializeDefaultIncludedFields();
+//	reader.Initialize(basFile);
+//
+//	SMRTSequence read;
+//
+//	while(reader.GetNext(read)) {
+//		read.PrintQualSeq(cout);
+//	}
+//
+//
+//	return 0;
+//}
+//
+// * If you wanted to read only fasta sequences and not fastq, use:
+// 
+// FASTASequence read;
+// while (reader.GetNext(read) {
+//   read.PritnSeq(cout);
+// }
+//
+
+template<typename T_Sequence>
+class T_HDFBasReader : public DatasetCollection, public HDFPulseDataFile {
+public:
+    DNALength curBasePos;
+    int curRead;
+    unsigned int nBases;
+
+
+    //bool readPulseInformation;
+    bool hasRegionTable;
+
+    HDFArray<int> zmwXCoordArray;
+    HDFArray<int> zmwYCoordArray;
+    HDFArray<unsigned char> baseArray;
+    HDFArray<unsigned char> deletionQVArray;
+    HDFArray<unsigned char> deletionTagArray;
+    HDFArray<unsigned char> insertionQVArray;
+    HDFArray<unsigned char> substitutionTagArray;
+    HDFArray<unsigned char> substitutionQVArray;
+    HDFArray<unsigned char> mergeQVArray;
+    HDFArray<unsigned char> qualArray;
+    HDFArray<unsigned int> simulatedCoordinateArray;
+    HDFArray<unsigned int> simulatedSequenceIndexArray;
+    HDFArray<uint16_t> basWidthInFramesArray;
+    HDFArray<uint16_t> preBaseFramesArray;
+    HDFArray<int> pulseIndexArray;
+    HDFArray<int> holeIndexArray;
+ 
+    // useful ZMWMetrics data
+    HDF2DArray<float> hqRegionSNRMatrix;
+    HDFArray<float> readScoreArray;
+
+    HDFGroup baseCallsGroup;
+    HDFGroup zmwMetricsGroup;
+    HDFGroup zmwGroup;
+    //	HDFArray<HalfWord> pulseWidthArray; This is deprecated
+    HDFAtom<std::string> changeListIDAtom;
+
+    //bool useWidthInFrames,  usePulseIndex, 
+    bool useZmwReader;
+    //    bool usePulseWidth; This is deprecated
+
+    std::string baseCallsGroupName;
+    std::string zmwMetricsGroupName;
+    bool qualityFieldsAreCritical;
+
+    //bool useHoleNumbers, useHoleStatus;
+    //bool usePreBaseFrames;
+    bool useBasHoleXY;
+    //bool useBasecall;
+    //bool useQuality;
+    bool readBasesFromCCS;
+    ChangeListID changeList;
+    QVScale qvScale;
+
+    PlatformId GetPlatform() {
+        return scanDataReader.platformId;
+    }
+
+    std::string GetMovieName() {
+        return scanDataReader.GetMovieName();
+    }
+
+    int GetReadAt(int index, SMRTSequence &read) {
+        //
+        // The first time this is called there may be no table of read
+        // offset positions.  Check for that and build if it does not
+        // exist. 
+        //
+        if (preparedForRandomAccess == false) {
+            PrepareForRandomAccess();
+        }
+        curRead = index;
+        curBasePos = eventOffset[index];
+        zmwReader.curZMW = index;
+        return GetNext(read);
+    }
+
+    std::string GetRunCode() {
+        return scanDataReader.GetRunCode();
+    }
+
+    T_HDFBasReader() {
+        curRead      = 0;
+        curBasePos   = 0;
+        nBases       = 0;
+        preparedForRandomAccess = false;
+        readBasesFromCCS = false;
+        baseCallsGroupName = "BaseCalls";
+        zmwMetricsGroupName = "ZMWMetrics";
+        qualityFieldsAreCritical = true;
+        useZmwReader = false;
+        useBasHoleXY = true;
+        hasRegionTable = false;
+        qvScale = POverOneMinusP; //default 0 = POverOneMinusP
+        fieldNames.push_back("Basecall");
+        fieldNames.push_back("DeletionQV");
+        fieldNames.push_back("DeletionTag");
+        fieldNames.push_back("InsertionQV");
+        fieldNames.push_back("SubstitutionTag");
+        fieldNames.push_back("SubstitutionQV");
+        fieldNames.push_back("QualityValue");
+        fieldNames.push_back("WidthInFrames");
+        fieldNames.push_back("PulseIndex");
+        fieldNames.push_back("PreBaseFrames");
+        fieldNames.push_back("MergeQV");
+        fieldNames.push_back("SimulatedCoordinate");
+        fieldNames.push_back("SimulatedSequenceIndex");
+        // Useful ZMWMetrics fields
+        fieldNames.push_back("HQRegionSNR");
+        fieldNames.push_back("ReadScore");
+        // Start out with no fields being read.
+        InitializeAllFields(false);
+        // Then by default always read bases.
+        IncludeField("Basecall");
+    }
+
+
+    void InitializeDefaultCCSIncludeFields() {
+        InitializeAllFields(false);
+        IncludeField("Basecall");
+        IncludeField("DeletionQV");
+        IncludeField("DeletionTag");
+        IncludeField("InsertionQV");
+        IncludeField("SubstitutionQV");
+        IncludeField("SubstitutionTag");
+        IncludeField("QualityValue");
+    }
+
+    void InitializeDefaultRawBasIncludeFields() {
+        IncludeField("Basecall");
+        IncludeField("QualityValue");
+        IncludeField("InsertionQV");
+        IncludeField("DeletionQV");
+        IncludeField("MergeQV");
+        IncludeField("SubstitutionQV");
+        IncludeField("DeletionTag");
+        IncludeField("SubstitutionTag"); // used in IDSScoreFunction
+        // FIXME: The following QVs are not really used by downstream
+        // analysis such as Quiver, make them optional to include.
+        IncludeField("WidthInFrames");
+        IncludeField("PulseIndex");
+        IncludeField("PreBaseFrames");
+        IncludeField("HQRegionSNR");
+        IncludeField("ReadScore");
+    }
+    void InitializeDefaultIncludedFields() {
+        if (readBasesFromCCS == false) {
+            InitializeDefaultRawBasIncludeFields();
+        }
+        else { 
+            InitializeDefaultCCSIncludeFields();
+        }
+    }
+
+    void InitializeDefaultRequiredFields() {
+        requiredFields["Basecall"] = true;
+    }
+
+    bool HasRegionTable() {
+        return hasRegionTable;
+    }
+
+
+    bool HasSimulatedCoordinatesStored() {
+        if (baseCallsGroup.ContainsObject("SimulatedCoordinate") and
+                baseCallsGroup.ContainsObject("SimulatedSequenceIndex")) {
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    void SetReadBasesFromCCS() {
+        InitializeDefaultCCSIncludeFields();
+        readBasesFromCCS = true;
+    }
+
+    void GetChangeListID(std::string &changeListID) {
+        if (changeListIDAtom.initialized) {
+            changeListIDAtom.Read(changeListID);
+        }
+        else {
+            changeListID = "0";
+        }
+    }
+ 
+    /// Get BindingKit, SequencingKit and Base Caller Version.
+    void GetChemistryTriple(std::string & bindingKit,
+                            std::string & sequencingKit, 
+                            std::string & baseCallerVersion) {
+        scanDataReader.ReadBindingKit(bindingKit);
+        scanDataReader.ReadSequencingKit(sequencingKit);
+        baseCallerVersion = changeList.GetVersion();
+    }
+
+    int InitializeForReadingBases() {
+
+        //
+        // Initialize root group + scan data information.
+        //
+        if (HDFPulseDataFile::Initialize(rootGroupPtr) == 0) return 0;
+
+        //
+        // Open the base group, this contains all the required information.  
+        //
+
+        if (readBasesFromCCS) {
+            baseCallsGroupName = "ConsensusBaseCalls";
+        }
+        if (pulseDataGroup.ContainsObject(baseCallsGroupName) == 0 or
+                baseCallsGroup.Initialize(pulseDataGroup.group, baseCallsGroupName) == 0) {
+            return 0;
+        }
+        if (baseCallsGroup.ContainsAttribute("ChangeListID")) {
+            changeListIDAtom.Initialize(baseCallsGroup.group, "ChangeListID");
+            std::string changeListIdString;
+            GetChangeListID(changeListIdString);
+            changeList = ChangeListID(changeListIdString);
+            qvScale = changeList.DetermineQVScaleFromChangeListID();
+        }
+        if (pulseDataGroup.ContainsObject("Regions")) {
+            hasRegionTable = true;
+        }
+        else {
+            hasRegionTable = false;
+        }
+
+        //
+        // Initialize read and quality arrays for reading.
+        //
+        if (this->InitializeSequenceFields(baseCallsGroup) == 0) {
+            return 0;
+        }
+
+        //
+        // Initialize simulated coordinate fields if they exist.  They are
+        // automatically opened and read from when they are in the bas.h5
+        // file since they are used for debugging.
+        //
+
+        if (baseCallsGroup.ContainsObject("SimulatedCoordinate")) {
+            includedFields["SimulatedCoordinate"] = true;
+            InitializeDataset(baseCallsGroup, simulatedCoordinateArray, "SimulatedCoordinate");
+        }
+        else {
+            includedFields["SimulatedCoordinate"] = false;
+        }
+
+        if (baseCallsGroup.ContainsObject("SimulatedSequenceIndex")) {
+            includedFields["SimulatedSequenceIndex"] = true;
+            InitializeDataset(baseCallsGroup, simulatedSequenceIndexArray, "SimulatedSequenceIndex");
+        }
+        else {
+            includedFields["SimulatedSequenceIndex"] = false;
+        }
+        nBases = baseArray.arrayLength;
+
+        return 1;
+    }
+
+
+    int InitializeCommon() {
+
+        //
+        // Initialize the smallest set of fields required to import bases.
+        //
+        if (InitializeForReadingBases() == 0) {
+            return 0;
+        }
+
+
+        return 1;
+    }
+
+    template<typename T_Dataset>
+        void InitializeRequiredField(HDFGroup &group, std::string arrayName, T_Dataset &field) {
+            if (group.ContainsObject(arrayName)) {
+                if (field.Initialize(group, arrayName) != 0) {
+                    return;
+                }
+            }
+            cout << "ERROR. Could not initialize dataset " << arrayName << endl;
+            exit(1);
+        }
+
+    template<typename T>
+        int InitializeField(HDFGroup &rootGroup, std::string arrayName,
+                T &field, bool &initialized) {
+            initialized = false;
+            if (rootGroup.ContainsObject(arrayName)) {
+                if (field.Initialize(rootGroup, arrayName) != 0) {
+                    initialized = true;
+                    return true;
+                }
+            }
+            return false;
+        }
+
+    template<typename T>
+        int InitializeAttribute(HDFGroup &rootGroup, std::string arrayName,
+                T &field, bool &initialized,
+                bool fieldIsCritical = true) {
+            int success = 1;
+            initialized = false;
+            if (rootGroup.ContainsAttribute(arrayName)) {
+                if (field.Initialize(rootGroup, arrayName) == 0) {
+                    success = 0;
+                }
+                else {
+                    initialized = true;
+                }
+            }
+            else {
+                // the field does not exist
+                success = 0;
+            }
+            if (fieldIsCritical) {
+                return success;
+            }
+            else {
+                return 1;
+            }
+        }
+
+    int InitializeSequenceFields(HDFGroup &baseCallsGroup) {
+        //
+        // The only field that is absoultely required is Basecall
+        if (baseArray.InitializeForReading(baseCallsGroup, "Basecall")        == false) return 0;
+        if (includedFields["QualityValue"] and qualArray.InitializeForReading(baseCallsGroup, "QualityValue")    == false) return 0;
+        if (includedFields["InsertionQV"] and insertionQVArray.InitializeForReading(baseCallsGroup, "InsertionQV")     == false) return 0;
+        if (includedFields["DeletionQV"] and deletionQVArray.InitializeForReading(baseCallsGroup, "DeletionQV")      == false) return 0;
+        if (includedFields["DeletionTag"] and deletionTagArray.InitializeForReading(baseCallsGroup, "DeletionTag")     == false) return 0;
+        if (includedFields["SubstitutionQV"] and substitutionQVArray.InitializeForReading(baseCallsGroup, "SubstitutionQV")  == false) return 0;
+        if (includedFields["SubstitutionTag"] and substitutionTagArray.InitializeForReading(baseCallsGroup, "SubstitutionTag") == false) return 0;
+        // if (includedFields["PreBaseFrames"] and preBaseFramesArray.InitializeForReading(baseCallsGroup, "PreBaseFrames")   == false) return 0;
+
+        if (baseCallsGroup.ContainsObject("PreBaseFrames")) {
+            if (preBaseFramesArray.InitializeForReading(baseCallsGroup, "PreBaseFrames") == false) return 0;
+        } else {
+            includedFields["PreBaseFrames"] = false;
+        }
+
+        //
+        // These fields are not always present in bas.h5 files.
+        //
+        if (baseCallsGroup.ContainsObject("PulseIndex")) {
+            if (pulseIndexArray.InitializeForReading(baseCallsGroup,        "PulseIndex")      == false) return 0;
+        }
+        else {
+            includedFields["PulseIndex"] = false;
+        }
+
+        if (baseCallsGroup.ContainsObject("WidthInFrames")) {    
+            if (basWidthInFramesArray.InitializeForReading(baseCallsGroup,  "WidthInFrames")   == false) return 0;
+        }
+        else {
+            includedFields["WidthInFrames"] = false;
+        }
+
+        if (baseCallsGroup.ContainsObject("MergeQV")) {
+            if (includedFields["MergeQV"] and mergeQVArray.InitializeForReading(baseCallsGroup, "MergeQV") == false) return false;
+        }
+        else {
+            includedFields["MergeQV"] = false;
+        }
+
+        if ((includedFields["HQRegionSNR"] or includedFields["ReadScore"]) and
+                (baseCallsGroup.ContainsObject(zmwMetricsGroupName) == 0 or
+                zmwMetricsGroup.Initialize(baseCallsGroup.group, zmwMetricsGroupName) == 0)) {
+            includedFields["HQRegionSNR"] = false;
+            includedFields["ReadScore"] = false;
+        }
+        if (includedFields["HQRegionSNR"] and (zmwMetricsGroup.ContainsObject("HQRegionSNR") == 0 or
+                GetDatasetNDim(zmwMetricsGroup.group, "HQRegionSNR") != 2 or
+                hqRegionSNRMatrix.InitializeForReading(zmwMetricsGroup, "HQRegionSNR") == false or
+                hqRegionSNRMatrix.GetNCols() != 4)) {
+            includedFields["HQRegionSNR"] = false;
+        }
+        if (includedFields["ReadScore"] and (zmwMetricsGroup.ContainsObject("ReadScore") == 0 or
+                readScoreArray.InitializeForReading(zmwMetricsGroup, "ReadScore")) == false) {
+            includedFields["ReadScore"] = false;
+        }
+
+        return 1;
+    }
+
+    int InitializeAstro() {
+        useBasHoleXY = true;
+        return 1;
+    }
+
+    int InitializeSpringfield() {
+        //
+        // For now, no special initialization is required.
+        //
+        return 1;
+    }
+
+    int Initialize(HDFGroup *rootGroupP) {
+        rootGroupPtr= rootGroupP;
+        return Initialize();
+    }
+
+
+    int Initialize() {
+
+        // Return 0 if any of the array inializations do not work.
+        if (InitializeCommon() == 0) {
+            return 0;
+        }
+
+        // Must have zmw information.
+        if (zmwReader.Initialize(&baseCallsGroup) == 0) {
+            return 0;
+        }
+        else {
+            useZmwReader = true;
+        }
+        //
+        // Get information about the chip - how many zmw's, the hole
+        // number indices to keep track of reads, etc..
+        //
+        nReads = zmwReader.numEventArray.arrayLength;
+
+
+
+        if (scanDataReader.platformId == Astro) {
+            if (InitializeAstro() == 0) {
+                return 0;
+            }
+        }
+        else if (scanDataReader.platformId == Springfield) {
+            if (InitializeSpringfield() == 0) {
+                return 0;
+            }
+        }
+
+        /*
+         * Initialize state variables.
+         */
+
+        curBasePos = 0;
+        curRead    = 0;
+
+        /*
+         * All ok, return that.
+         */
+        return 1;
+    }
+
+    int InitializeHDFFile(std::string hdfBasFileName, 
+            const H5::FileAccPropList & fileAccPropList = H5::FileAccPropList::DEFAULT) { 
+        /*
+         * Initialize access to the HDF file.  For reading bas files, this
+         * involves:
+         *   - Opening the file, and initializing both base and zmw grops.
+         */
+        if (OpenHDFFile(hdfBasFileName, fileAccPropList) == 0) {
+            return 0;
+        }
+
+        if (rootGroup.Initialize(hdfBasFile, "/") == 0) {
+            return 0;
+        }
+        rootGroupPtr = &rootGroup;
+        return 1;
+    }
+
+    int Initialize(std::string hdfBasFileName,
+            const H5::FileAccPropList & fileAccPropList = H5::FileAccPropList::DEFAULT) {
+        int init = InitializeHDFFile(hdfBasFileName, fileAccPropList);
+        if (init == 0) return 0;
+        return Initialize();
+    }
+
+    int GetNumReads() {
+        return nReads;
+    }
+
+    void BuildReadTitle(std::string movieTitle, unsigned int holeNumber, std::string &readTitle, unsigned int simIndex=0, unsigned int simCoordinate=0) {
+        std::stringstream readTitleStrm;
+        readTitleStrm << movieTitle << "/" << holeNumber;
+        readTitle = readTitleStrm.str();
+    }
+
+    int GetNext(FASTASequence &seq) {
+        if (curRead == nReads) {
+            return 0;
+        }
+
+        int seqLength;
+        try {
+            seqLength = GetNextWithoutPosAdvance(seq);
+        } catch(H5::DataSetIException e) {
+            cout << "ERROR, could not read base calls for FASTA Sequence "
+                << seq.GetName() << endl;
+            exit(1);
+        }
+        curBasePos += seqLength;
+        seq.StorePlatformId(scanDataReader.platformId);
+        return 1;
+    }
+
+
+    int GetNext(FASTQSequence &seq) {
+        try {
+            if (curRead == nReads) {
+                return 0;
+            }
+            int seqLength = GetNextWithoutPosAdvance(seq);
+            seq.length = seqLength;
+
+            if (seqLength > 0 ) {
+                if (includedFields["QualityValue"]) {
+                    seq.AllocateQualitySpace(seqLength);
+                    qualArray.Read((int)curBasePos, (int) curBasePos + seqLength, (unsigned char*) seq.qual.data);
+                }
+            }
+
+            if (includedFields["DeletionQV"]) {
+                GetNextDeletionQV(seq);
+            }
+            if (includedFields["DeletionTag"]) {
+                GetNextDeletionTag(seq);
+            }
+            if (includedFields["InsertionQV"]) {
+                GetNextInsertionQV(seq);
+            }
+            if (includedFields["SubstitutionQV"]) {
+                GetNextSubstitutionQV(seq);
+            }
+            if (includedFields["SubstitutionTag"]) {
+                GetNextSubstitutionTag(seq);
+            }
+            if (includedFields["MergeQV"]) {
+                GetNextMergeQV(seq);
+            }
+            seq.SetQVScale(qvScale);
+            curBasePos += seqLength;
+        } catch(H5::DataSetIException e) {
+            cout << "ERROR, could not read quality metrics for FASTQ Sequence " 
+                << seq.GetName() << endl;
+            exit(1);
+        }
+        return 1;
+    }
+
+    //
+    // Read a SMRTSequence, but only the basecalls and maybe the QVs. This
+    // makes pls2fasta more efficient.
+    //
+    int GetNextBases(SMRTSequence &seq, bool readQVs) {
+        try {
+            if (curRead == nReads) {
+                return 0;
+            }
+
+            // must be done before GetNextWithoutPosAdvance (which increments curRead)
+            // get ZMWMetrics fields
+            if (includedFields["HQRegionSNR"]) {
+                GetNextHQRegionSNR(seq);
+            }
+            if (includedFields["ReadScore"]) {
+                GetNextReadScore(seq);
+            }
+
+            int seqLength = GetNextWithoutPosAdvance(seq);
+            seq.length = seqLength;
+            if(readQVs) {
+                if (seqLength > 0 ) {
+                    if (includedFields["QualityValue"]) {
+                        seq.AllocateQualitySpace(seqLength);
+                        qualArray.Read((int)curBasePos, 
+                                       (int) curBasePos + seqLength, 
+                                       (unsigned char*) seq.qual.data);
+                    }
+                }
+            }
+
+            seq.SetQVScale(qvScale);
+            curBasePos += seqLength;
+
+            seq.subreadStart = 0;
+            seq.subreadEnd   = seq.length;
+            zmwReader.GetNext(seq.zmwData);
+            seq.xy[0] = seq.zmwData.x;
+            seq.xy[1] = seq.zmwData.y;
+        } catch (H5::DataSetIException e) {
+            cout << "ERROR, could not read bases or QVs for SMRTSequence "
+                << seq.GetName() << endl;
+            exit(1);
+        }
+        return 1;
+    }
+
+    //
+    // Reading of SMRT Sequences reads both the sequence fields, and the
+    // fields with ZMW information for identification of this read.
+    //
+
+    int GetNext(SMRTSequence &seq) {
+        //
+        // Read in quality values.
+        //
+        int retVal;
+
+        DNALength  curBasPosCopy = curBasePos;
+        //
+        // Getting next advances the curBasPos to the end of 
+        // the current sequence. 
+        //
+        try {
+            // must check before looking at HQRegionSNR/ReadScore!!
+            if (curRead == nReads) {
+                return 0;
+            }
+
+            // get ZMWMetrics fields, must be done before GetNext
+            // (which calls GetNextWithoutAdvancePos, which increments curRead)
+            if (includedFields["HQRegionSNR"]) {
+                GetNextHQRegionSNR(seq);
+            }
+            if (includedFields["ReadScore"]) {
+                GetNextReadScore(seq);
+            }
+
+        //
+        // Bail now if the file is already done
+        //
+        if ((retVal = this->GetNext((FASTQSequence&)seq)) == 0) {
+            return 0;
+        }
+
+            DNALength nextBasePos = curBasePos;
+            curBasePos = curBasPosCopy;
+
+            if (includedFields["WidthInFrames"] ) {
+                assert(nextBasePos <= basWidthInFramesArray.arrayLength);
+                GetNextWidthInFrames(seq);
+            }
+            if (includedFields["PreBaseFrames"]) { 
+                GetNextPreBaseFrames(seq);
+            }
+            if (includedFields["PulseIndex"]) { 
+                GetNextPulseIndex(seq);
+            }
+            curBasePos = nextBasePos;
+
+            //
+            // By default, the subread of a read without subread information is
+            // the whole read.
+            //
+            seq.subreadStart = 0;
+            seq.subreadEnd   = seq.length;
+            zmwReader.GetNext(seq.zmwData);
+            seq.xy[0] = seq.zmwData.x;
+            seq.xy[1] = seq.zmwData.y;
+        } catch(H5::DataSetIException e) {
+            cout << "ERROR, could not read pulse metrics for SMRTSequence " 
+                << seq.GetName() << endl;
+            exit(1);
+        }
+        return retVal;
+    }
+    /*
+       int16_t xy[2];
+       if (zmwReader.readHoleXY) {
+       zmwReader.xyArray.Read(curRead, curRead+1, 0, 2, xy);
+       }
+       else {
+       xy[0] = xy[1] = 0;
+       }
+       seq.StoreXY(xy);
+       */
+    void GetAllPulseIndex(std::vector<int> &pulseIndex) {
+        CheckMemoryAllocation(pulseIndexArray.arrayLength, maxAllocNElements, "PulseIndex");
+        pulseIndex.resize(pulseIndexArray.arrayLength);
+        pulseIndexArray.Read(0, pulseIndexArray.arrayLength, &pulseIndex[0]);
+    }
+
+    void GetAllPreBaseFrames(std::vector<uint16_t> &preBaseFrames) {
+        CheckMemoryAllocation(preBaseFramesArray.arrayLength, maxAllocNElements, "PreBaseFrames");
+        preBaseFrames.resize(nBases);
+        preBaseFramesArray.Read(0, nBases, &preBaseFrames[0]);
+    }
+
+    void GetAllWidthInFrames(std::vector<uint16_t> &widthInFrames) { 
+        CheckMemoryAllocation(basWidthInFramesArray.arrayLength, maxAllocNElements, "WidthInFrames");
+        widthInFrames.resize(nBases);
+        basWidthInFramesArray.Read(0, nBases, &widthInFrames[0]);
+    }
+
+    int GetAllHoleStatus(std::vector<unsigned char> &holeStatus) {
+        CheckMemoryAllocation(zmwReader.holeStatusArray.arrayLength, maxAllocNElements, "HoleStatus (base)");
+        holeStatus.resize(nReads);
+        zmwReader.holeStatusArray.Read(0,nReads, (unsigned char*)&holeStatus[0]);
+        return holeStatus.size();
+    }
+
+    int GetAllReadLengths(std::vector<int> &readLengths) {
+        readLengths.resize(nReads);
+        zmwReader.numEventArray.ReadDataset(readLengths);
+        return readLengths.size();
+    }
+
+    int Advance(int nSeq) {
+        int i;
+        // cannot advance past the end of this file
+        if (curRead + nSeq >= nReads) { return 0; }
+        for (i = curRead; i < curRead + nSeq && i < nReads; i++ ) {
+            int seqLength;
+            zmwReader.numEventArray.Read(i, i+1, &seqLength);
+            curBasePos += seqLength;
+        }
+        curRead += nSeq;
+        zmwReader.Advance(nSeq);
+        return curRead;
+    }
+
+    int GetNextWithoutPosAdvance(FASTASequence &seq) {
+        int seqLength;
+
+        zmwReader.numEventArray.Read(curRead, curRead+1, &seqLength);
+        seq.length = 0;
+        seq.seq = NULL;
+
+        if (includedFields["Basecall"]) {
+            if (seqLength > 0) {
+                ResizeSequence(seq, seqLength);
+                baseArray.Read(curBasePos, curBasePos + seqLength, (unsigned char*) seq.seq);
+            }
+        }
+
+        std::string readTitle;
+        unsigned int holeNumber;
+        unsigned char holeStatus;
+        zmwReader.holeNumberArray.Read(curRead, curRead+1, &holeNumber);
+        seq.StoreHoleNumber(holeNumber);
+
+        zmwReader.holeStatusArray.Read(curRead, curRead+1, &holeStatus);
+        seq.StoreHoleStatus(holeStatus);
+
+        DNALength simIndex=0, simCoordinate=0;
+
+        if (includedFields["SimulatedSequenceIndex"] == true) {
+            simulatedSequenceIndexArray.Read(curRead,curRead+1,&simIndex);
+        }
+        if (includedFields["SimulatedCoordinate"] == true) {
+            simulatedCoordinateArray.Read(curRead, curRead+1, &simCoordinate);
+        }
+
+        BuildReadTitle(scanDataReader.GetMovieName(), holeNumber, readTitle, simIndex, simCoordinate);
+
+        seq.CopyTitle(readTitle);
+        curRead++;
+        return seqLength;
+    }
+
+    int GetNextDeletionQV(FASTQSequence &seq) {
+        if (seq.length == 0) return 0;
+        seq.AllocateDeletionQVSpace(seq.length);
+        deletionQVArray.Read((int)curBasePos, (int) curBasePos + seq.length, (unsigned char*) seq.deletionQV.data);
+        return seq.length;
+    }
+
+    int GetNextMergeQV(FASTQSequence &seq) {
+        if (seq.length == 0) return 0;
+        seq.AllocateMergeQVSpace(seq.length);
+        mergeQVArray.Read((int)curBasePos, (int) curBasePos + seq.length, (unsigned char*) seq.mergeQV.data);
+        return seq.length;
+    }
+
+    int GetNextDeletionTag(FASTQSequence &seq) {
+        if (seq.length == 0) return 0;
+        seq.AllocateDeletionTagSpace(seq.length);
+        deletionTagArray.Read((int)curBasePos, (int) curBasePos + seq.length, (unsigned char*) seq.deletionTag);
+        return seq.length;
+    }
+
+    int GetNextInsertionQV(FASTQSequence &seq) {
+        if (seq.length == 0) return 0;
+        seq.AllocateInsertionQVSpace(seq.length);
+        insertionQVArray.Read((int)curBasePos, (int) curBasePos + seq.length, (unsigned char*) seq.insertionQV.data);
+        return seq.length;
+    }
+
+    int GetNextWidthInFrames(SMRTSequence &seq) {
+        if (seq.length == 0) return 0;
+        if (seq.widthInFrames) {
+            delete [] seq.widthInFrames;
+            seq.widthInFrames = NULL;
+        }
+        seq.widthInFrames = new HalfWord[seq.length];
+        basWidthInFramesArray.Read((int)curBasePos, (int) curBasePos + seq.length, (HalfWord*) seq.widthInFrames);
+        return seq.length;
+    }
+
+    int GetNextPreBaseFrames(SMRTSequence &seq) {
+        if (seq.length == 0) return 0;
+        if (seq.preBaseFrames) {
+            delete [] seq.preBaseFrames;
+            seq.preBaseFrames = NULL;
+        }
+        seq.preBaseFrames = new HalfWord[seq.length];
+        preBaseFramesArray.Read((int)curBasePos, (int) curBasePos + seq.length, (HalfWord*) seq.preBaseFrames);
+        return seq.length;
+    }
+    int GetNextPulseIndex(SMRTSequence &seq) {
+        if (seq.length == 0) return 0;
+        if (seq.pulseIndex) {
+            delete [] seq.pulseIndex;
+            seq.pulseIndex = NULL;
+        }
+        seq.pulseIndex = new int[seq.length];
+        pulseIndexArray.Read((int)curBasePos, (int) curBasePos + seq.length, (int*) seq.pulseIndex);
+        return seq.length;
+    }
+    int GetNextHQRegionSNR(SMRTSequence &seq) {
+        hqRegionSNRMatrix.Read(curRead, curRead + 1, seq.hqRegionSnr);
+        return 4;
+    }
+    int GetNextReadScore(SMRTSequence &seq) {
+        readScoreArray.Read(curRead, curRead + 1, &seq.readScore);
+        return 1;
+    }
+    int GetNextSubstitutionQV(FASTQSequence &seq) {
+        if (seq.length == 0) return 0;
+        seq.AllocateSubstitutionQVSpace(seq.length);
+        substitutionQVArray.Read((int)curBasePos, (int) curBasePos + seq.length, (unsigned char*) seq.substitutionQV.data);
+        return seq.length;
+    }
+
+    int GetNextSubstitutionTag(FASTQSequence &seq) {
+        if (seq.length == 0) return 0;
+        seq.AllocateSubstitutionTagSpace(seq.length);
+        substitutionTagArray.Read((int)curBasePos, (int) curBasePos + seq.length, (unsigned char*) seq.substitutionTag);		
+        return seq.length;
+    }
+
+    void Close() {
+
+        baseCallsGroup.Close();
+        zmwXCoordArray.Close();
+        zmwYCoordArray.Close();
+        baseArray.Close();
+        qualArray.Close();
+        if (useZmwReader) {
+            zmwReader.Close();
+        }
+
+        if (includedFields["DeletionQV"]) {
+            deletionQVArray.Close();
+        }
+        if (includedFields["DeletionTag"]) {
+            deletionTagArray.Close();
+        }
+        if (includedFields["MergeQV"]) {
+            mergeQVArray.Close();
+        }
+        if (includedFields["InsertionQV"]) {
+            insertionQVArray.Close();
+        }
+        if (includedFields["SubstitutionTag"]) {
+            substitutionTagArray.Close();
+        }
+        if (includedFields["SubstitutionQV"]) {
+            substitutionQVArray.Close();
+        }
+        if (includedFields["WidthInFrames"]) {
+            basWidthInFramesArray.Close();
+        }
+        if (includedFields["PreBaseFrames"]) {
+            preBaseFramesArray.Close();
+        }
+        if (includedFields["PulseIndex"]) {
+            pulseIndexArray.Close();
+        }
+
+        // ZMWMetrics fields
+        if (includedFields["HQRegionSNR"]) {
+            hqRegionSNRMatrix.Close();
+        }
+        if (includedFields["ReadScore"]) {
+            readScoreArray.Close();
+        }
+
+        HDFPulseDataFile::Close();
+    }
+
+    void ReadAllHoleXY(BaseFile &baseFile) {
+        baseFile.holeXY.resize(nReads);
+        int i;
+        for (i = 0; i < nReads; i++) {
+            zmwReader.xyArray.Read(i,i+1, baseFile.holeXY[i].xy);
+        }
+    }
+
+    //
+    // Return size of an entire field.
+    //
+    UInt GetFieldSize(const std::string & field) {
+        if (not includedFields[field]) {
+            cout << "ERROR, field [" << field << "] is not included in the base file." << endl;
+            exit(1);
+        }
+        if (field == "Basecall") {
+            return baseArray.arrayLength / 1024 * sizeof(unsigned char);
+        } else if (field == "QualityValue") {
+            return qualArray.arrayLength / 1024 * sizeof(unsigned char);
+        } else if (field == "DeletionQV") {
+            return deletionQVArray.arrayLength / 1024 * sizeof(unsigned char);
+        } else if (field == "DeletionTag")  {
+            return deletionTagArray.arrayLength / 1024 * sizeof(unsigned char);
+        } else if (field == "MergeQV") {
+            return mergeQVArray.arrayLength / 1024 * sizeof(unsigned char);
+        } else if (field == "InsertionQV") { 
+            return insertionQVArray.arrayLength / 1024 * sizeof(unsigned char);
+        } else if (field == "SubstitutionQV") {
+            return substitutionQVArray.arrayLength / 1024 * sizeof(unsigned char);
+        } else if (field == "SubstitutionTag") {
+            return substitutionTagArray.arrayLength / 1024 * sizeof(unsigned char);
+        } else if (field == "WidthInFrames") {
+            return basWidthInFramesArray.arrayLength / 1024 * sizeof(uint16_t);
+        } else if (field == "PreBaseFrames") {
+            return preBaseFramesArray.arrayLength / 1024 * sizeof(uint16_t);
+        } else if (field == "PulseIndex") {
+            return pulseIndexArray.arrayLength / 1024 * sizeof(int);
+        } else {
+            cout << "ERROR, field [" << field << "] is not supported. " << endl ;
+            exit(1);
+        }
+    }
+
+    //
+    // Read an entire field.
+    //
+    void ReadField(BaseFile & baseFile, const std::string & field) {
+        if (not includedFields[field]) {
+            cout << "ERROR, field [" << field << "] is not included in the base file." << endl;
+            exit(1);
+        }
+        if (field == "Basecall") {
+            assert(nBases == baseArray.arrayLength);
+            baseArray.ReadDataset(baseFile.baseCalls); 
+        } else if (field == "QualityValue") {
+            qualArray.ReadDataset(baseFile.qualityValues);
+        } else if (field == "DeletionQV") {
+            deletionQVArray.ReadDataset(baseFile.deletionQV);
+        } else if (field == "DeletionTag")  {
+            deletionTagArray.ReadDataset(baseFile.deletionTag);
+        } else if (field == "MergeQV") {
+            mergeQVArray.ReadDataset(baseFile.mergeQV);
+        } else if (field == "InsertionQV") { 
+            insertionQVArray.ReadDataset(baseFile.insertionQV);
+        } else if (field == "SubstitutionQV") {
+            substitutionQVArray.ReadDataset(baseFile.substitutionQV);			
+        } else if (field == "SubstitutionTag") {
+            substitutionTagArray.ReadDataset(baseFile.substitutionTag);
+        } else if (field == "WidthInFrames") {
+            basWidthInFramesArray.ReadDataset(baseFile.basWidthInFrames);
+        } else if (field == "PreBaseFrames") {
+            preBaseFramesArray.ReadDataset(baseFile.preBaseFrames);
+        } else if (field == "PulseIndex") {
+            pulseIndexArray.ReadDataset(baseFile.pulseIndex);
+        } else {
+            cout << "ERROR, field [" << field << "] is not supported. " << endl ;
+            exit(1);
+        }
+    }
+
+    //
+    // Clear memory allocated for a field
+    //
+    void ClearField(BaseFile & baseFile, const std::string & field) {
+        if (not includedFields[field]) {
+            cout << "ERROR, field [" << field << "] is not included in the base file." << endl;
+            exit(1);
+        }
+        if (field == "Basecall") {
+            ClearMemory(baseFile.baseCalls);
+        } else if (field == "QualityValue") {
+            ClearMemory(baseFile.qualityValues);
+        } else if (field == "DeletionQV") {
+            ClearMemory(baseFile.deletionQV);
+        } else if (field == "DeletionTag")  {
+            ClearMemory(baseFile.deletionTag);
+        } else if (field == "MergeQV") {
+            ClearMemory(baseFile.mergeQV); 
+        } else if (field == "InsertionQV") { 
+            ClearMemory(baseFile.insertionQV);
+        } else if (field == "SubstitutionQV") {
+            ClearMemory(baseFile.substitutionQV);
+        } else if (field == "SubstitutionTag") {
+            ClearMemory(baseFile.substitutionTag);
+        } else if (field == "WidthInFrames") {
+            ClearMemory(baseFile.basWidthInFrames);
+        } else if (field == "PreBaseFrames") {
+            ClearMemory(baseFile.preBaseFrames); 
+        } else if (field == "PulseIndex") {
+            ClearMemory(baseFile.pulseIndex);
+        } else {
+            cout << "ERROR, field [" << field << "] is supported. " << endl ;
+            exit(1);
+        }
+    }
+
+    //
+    // Initialization for reading a base file.  
+    //
+    void ReadBaseFileInit(BaseFile & baseFile) {
+        if (scanDataReader.fileHasScanData) {
+            scanDataReader.Read(baseFile.scanData);
+        }
+
+        baseFile.nReads = nReads;
+
+        if (useBasHoleXY) {
+            ReadAllHoleXY(baseFile);
+        }
+        GetAllHoleNumbers(baseFile.holeNumbers);
+        GetAllHoleStatus(baseFile.holeStatus);
+        zmwReader.numEventArray.ReadDataset(baseFile.readLengths);
+
+        //
+        // Cache the start positions of all reads.
+        //
+        assert(baseFile.nReads == baseFile.readLengths.size());
+        baseFile.readStartPositions.resize(baseFile.readLengths.size()+1);
+
+        if ( baseFile.readLengths.size() > 0 ) {
+            int i;
+            baseFile.readStartPositions[0] = 0;
+            for (i = 1; i < baseFile.readLengths.size()+1; i++) {
+                baseFile.readStartPositions[i] = 
+                    (baseFile.readStartPositions[i-1] +
+                     baseFile.readLengths[i-1]);
+            }
+        }
+    }
+
+    //
+    // Read a base file.
+    //
+    void ReadBaseFile(BaseFile &baseFile) {
+        ReadBaseFileInit(baseFile);
+
+        if (includedFields["Basecall"]) {
+            baseFile.baseCalls.resize(nBases);
+            baseArray.Read(0,nBases, &baseFile.baseCalls[0]);
+        }
+
+        /*
+         * This can probably be fixed eventually with an object factory or
+         * collection of some sorts.
+         */
+        if (includedFields["WidthInFrames"]) {
+            basWidthInFramesArray.ReadDataset(baseFile.basWidthInFrames);
+        }
+        if (includedFields["PreBaseFrames"]) {
+            preBaseFramesArray.ReadDataset(baseFile.preBaseFrames);
+        }
+        if (includedFields["PulseIndex"]) {
+            pulseIndexArray.ReadDataset(baseFile.pulseIndex);
+        }
+        if (includedFields["QualityValue"]) {
+            qualArray.ReadDataset(baseFile.qualityValues);
+        }
+        if (includedFields["InsertionQV"]) {
+            insertionQVArray.ReadDataset(baseFile.insertionQV);
+        }
+        if (includedFields["SubstitutionTag"]) {
+            substitutionTagArray.ReadDataset(baseFile.substitutionTag);
+        }
+        if (includedFields["SubstitutionQV"]) {
+            substitutionQVArray.ReadDataset(baseFile.substitutionQV);			
+        }
+        if (includedFields["MergeQV"]) {
+            mergeQVArray.ReadDataset(baseFile.mergeQV);			
+        }
+        if (includedFields["DeletionQV"]) {
+            deletionQVArray.ReadDataset(baseFile.deletionQV);
+        }
+        if (includedFields["DeletionTag"]) {
+            deletionTagArray.ReadDataset(baseFile.deletionTag);
+        }
+
+        baseFile.nBases = nBases;
+        baseFile.scanData.platformId = scanDataReader.platformId;
+    }
+    
+    void GetMinMaxHoleNumber(UInt &minHole, UInt &maxHole) {
+        assert(nReads >= 0);
+        // Assume that hole numbers are ascendingly sorted in ZMW/HoleNumber.
+        if (not zmwReader.GetHoleNumberAt(0, minHole) or 
+            not zmwReader.GetHoleNumberAt(nReads - 1, maxHole)) {
+            cout << "ERROR, could not get the minimum and maximum hole numbers "
+                    << "from ZMW HoleNumbers." << endl;
+            exit(1);
+        }
+    }
+};
+
+class HDFSmrtReader: public T_HDFBasReader<SMRTSequence> {
+public:
+    int Advance(int nSteps);
+};
+
+typedef T_HDFBasReader<FASTASequence> HDFBasReader;
+typedef T_HDFBasReader<FASTQSequence> HDFQualReader;
+
+
+#endif
diff --git a/libcpp/hdf/HDFBasWriter.hpp b/libcpp/hdf/HDFBasWriter.hpp
new file mode 100644
index 0000000..dc4bac9
--- /dev/null
+++ b/libcpp/hdf/HDFBasWriter.hpp
@@ -0,0 +1,390 @@
+#ifndef _BLASR_HDF_BAS_WRITER_HPP_
+#define _BLASR_HDF_BAS_WRITER_HPP_
+
+#include <sstream>
+#include "Types.h"
+#include "Enumerations.h"
+#include "utils/SMRTReadUtils.hpp"
+#include "SMRTSequence.hpp"
+#include "HDFAtom.hpp"
+#include "HDFFile.hpp"
+#include "DatasetCollection.hpp"
+#include "HDFArray.hpp"
+#include "HDFScanDataWriter.hpp"
+#include "HDF2DArray.hpp"
+
+using namespace H5;
+using namespace std;
+
+class HDFBasWriter : public DatasetCollection {
+	HDFFile outFile;
+	string hdfFileName;
+	static const int bufferSize = 16;
+	
+	string changeListID;
+	HDFAtom<string> changeListIDAtom;
+
+	BufferedHDFArray<int> nElemArray;
+	BufferedHDFArray<int> zmwXCoordArray;
+	BufferedHDFArray<int> zmwYCoordArray;
+	BufferedHDFArray<unsigned char> baseArray;
+	BufferedHDFArray<unsigned char> qualArray;
+	BufferedHDFArray<unsigned int> simulatedCoordinateArray;
+	BufferedHDFArray<unsigned int> simulatedSequenceIndexArray;
+
+
+	//
+	// Astro specific arrays.
+	//
+	BufferedHDF2DArray<int16_t> holeXY2D;
+
+	//
+	// Springfield specific arrays.
+	//
+	BufferedHDFArray<unsigned int> holeNumberArray;
+	BufferedHDFArray<unsigned char> holeStatusArray;
+	
+	//
+	// Define arrays for rich quality values.
+	// 
+	BufferedHDFArray<unsigned char> deletionQVArray;
+	BufferedHDFArray<unsigned char> deletionTagArray;
+	BufferedHDFArray<unsigned char> insertionQVArray;
+	BufferedHDFArray<unsigned char> substitutionTagArray;
+	BufferedHDFArray<unsigned char> substitutionQVArray;
+	BufferedHDFArray<unsigned char> mergeQVArray;
+	BufferedHDFArray<HalfWord> preBaseFramesArray;
+	BufferedHDFArray<HalfWord> widthInFramesArray;
+	BufferedHDFArray<int> pulseIndexArray;
+	BufferedHDF2DArray<unsigned char> preBaseDeletionQVArray;
+	HDFGroup rootGroup;
+
+	HDFGroup baseCallGroup;
+	HDFGroup zmwGroup;
+	HDFGroup plsZMWGroup;
+
+	PlatformId platformId;
+    ScanData sd;
+public:
+	HDFGroup pulseDataGroup;
+	~HDFBasWriter() { 
+		//
+		// Assume that flushing out and closing the hdf file must be one
+		// manually and not in a destructor.
+		//
+	}
+	void InitializeDefaultIncludedFields() {
+		IncludeField("Basecall");
+		IncludeField("DeletionQV");
+		IncludeField("DeletionTag");
+		IncludeField("InsertionQV");
+		IncludeField("SubstitutionTag");
+		IncludeField("SubstitutionQV");
+		IncludeField("QualityValue");
+		IncludeField("WidthInFrames");
+		IncludeField("PulseIndex");
+		IncludeField("PreBaseFrames");
+		IncludeField("HoleNumber");    
+    IncludeField("HoleStatus");
+    IncludeField("MergeQV");
+	}
+	
+
+	void Flush() {
+		nElemArray.Flush();
+
+		if (includedFields["zmwXCoord"])
+		    zmwXCoordArray.Flush();
+		if (includedFields["zmwYCoord"])
+			zmwYCoordArray.Flush();
+		if (includedFields["Basecall"])
+			baseArray.Flush();
+		if (includedFields["QualityValue"])
+			qualArray.Flush();
+		if (includedFields["DeletionQV"])
+			deletionQVArray.Flush();
+		if (includedFields["DeletionTag"])
+			deletionTagArray.Flush();
+		if (includedFields["InsertionQV"])
+			insertionQVArray.Flush();
+		if (includedFields["SubstitutionTag"])
+			substitutionTagArray.Flush();
+		if (includedFields["SubstitutionQV"])
+			substitutionQVArray.Flush();
+		if (includedFields["HoleNumber"])
+			holeNumberArray.Flush();
+		if (includedFields["HoleStatus"])
+			holeStatusArray.Flush();
+		if (includedFields["PreBaseFrames"])
+			preBaseFramesArray.Flush();
+    if (includedFields["PulseIndex"]) 
+      pulseIndexArray.Flush();
+		if (includedFields["WidthInFrames"])
+			widthInFramesArray.Flush();
+		if (includedFields["HoleXY"])
+			holeXY2D.Flush();
+    if (includedFields["MergeQV"]) 
+      mergeQVArray.Flush();
+		if (includedFields["SimulatedCoordinate"])
+			simulatedCoordinateArray.Flush();
+		if (includedFields["SimulatedSequenceIndex"]) 
+	    	simulatedSequenceIndexArray.Flush();
+	}
+
+	HDFBasWriter() {
+		/*
+		 * Default to astro for now.  This may need to change to a NO_ID
+		 * platform, in which case it must be set with Initialize().
+		 */
+		fieldNames.push_back("zmwXCoord");
+		fieldNames.push_back("zmwYCoord");
+		fieldNames.push_back("QualityValue");
+		fieldNames.push_back("Basecall");
+		fieldNames.push_back("DeletionQV");
+		fieldNames.push_back("DeletionTag");
+		fieldNames.push_back("InsertionQV");
+		fieldNames.push_back("SubstitutionQV");
+		fieldNames.push_back("SubstitutionTag");
+		fieldNames.push_back("MergeQV");
+		fieldNames.push_back("WidthInFrames");
+		fieldNames.push_back("HoleNumber");
+		fieldNames.push_back("HoleStatus");
+		fieldNames.push_back("HoleXY");
+		fieldNames.push_back("PreBaseFrames");
+		fieldNames.push_back("PulseIndex");
+		fieldNames.push_back("SimulatedCoordinate");
+		fieldNames.push_back("SimulatedSequenceIndex");
+		InitializeAllFields(false);
+		sd.platformId = Springfield;
+	}
+
+	void Close() {
+		Flush();
+		outFile.Close();
+	}
+
+	void SetPlatform(PlatformId _platform) {
+        sd.platformId = platformId = _platform;
+	}
+	void SetMovieName(string _movieName) {
+        sd.movieName = _movieName;
+	}
+	void SetRunCode(string _runCode) {
+        sd.runCode = _runCode;
+	}
+	void SetChangeListID(string _changeListID) {
+		changeListID = _changeListID;
+	}
+
+	
+	/*
+	 * Initialization without a runCode is implicitly a springfield
+	 * platform.  You can change it if you really want.
+	 */
+	void Initialize(string _hdfFileName, string movieName, string _changeListID) {
+        SetChangeListID(_changeListID);
+        SetPlatform(Springfield);
+        SetMovieName(movieName);
+		Initialize(_hdfFileName);
+	}
+
+	void Initialize(string _hdfFileName, string movieName, PlatformId _platform = Springfield) {
+        SetMovieName(movieName);
+        SetPlatform(Springfield);
+		Initialize(_hdfFileName);
+	}
+
+	void Initialize(string _hdfFileName, string movieName, string runCode, string _changeListID ) {
+        SetChangeListID(_changeListID);
+        SetMovieName(movieName);
+        SetRunCode(runCode);
+		Initialize(_hdfFileName);
+	}
+
+
+	void WriteSimulatedCoordinate(unsigned int coord) {
+		simulatedCoordinateArray.Write(&coord,1);
+	}
+
+	void WriteSimulatedSequenceIndex(unsigned int index) {
+		simulatedSequenceIndexArray.Write(&index,1);
+	}
+
+	void Initialize(string _hdfFileName, const H5::FileAccPropList & 
+                    fileAccPropList = H5::FileAccPropList::DEFAULT) {
+		hdfFileName = _hdfFileName;
+		outFile.Open(hdfFileName, H5F_ACC_TRUNC, fileAccPropList);
+		outFile.rootGroup.AddGroup("PulseData"); 
+
+        if (pulseDataGroup.Initialize(outFile.rootGroup, "PulseData") == 0) {
+            cout << "ERROR, could not create file " << hdfFileName 
+                 << ".  Error creating group /PulseData." << endl;
+            exit(1);
+        }
+
+        pulseDataGroup.AddGroup("BaseCalls"); 
+        if (baseCallGroup.Initialize(pulseDataGroup, "BaseCalls") == 0) {
+            cout << "ERROR, could not create file " << hdfFileName 
+                 << ".  Error creating group /PulseData/BaseCall." << endl;
+            exit(1);
+        }
+
+        baseCallGroup.AddGroup("ZMW"); 
+        if (zmwGroup.Initialize(baseCallGroup, "ZMW") == 0) {
+            cout << "ERROR, could not create file " << hdfFileName 
+                 << ".  Error creating group /PulseData/BaseCall/ZMW." << endl;
+            exit(1);
+        }
+
+        HDFScanDataWriter sdWriter(outFile);
+        // 
+        // Reset ScanData attributes if neccessary.
+        //
+        sdWriter.Write(sd);
+
+		if (changeListID != "") {
+			changeListIDAtom.Create(baseCallGroup.group, "ChangeListID", changeListID);
+		}
+
+		nElemArray.Initialize(zmwGroup, "NumEvent");
+		if (includedFields["Basecall"])
+			baseArray.Initialize(baseCallGroup, "Basecall");
+		if (includedFields["QualityValue"])
+			qualArray.Initialize(baseCallGroup, "QualityValue");
+		if (includedFields["DeletionQV"])
+			deletionQVArray.Initialize(baseCallGroup, "DeletionQV");
+		if (includedFields["DeletionTag"])
+			deletionTagArray.Initialize(baseCallGroup, "DeletionTag");
+		if (includedFields["InsertionQV"])
+			insertionQVArray.Initialize(baseCallGroup, "InsertionQV");
+		if (includedFields["MergeQV"])
+			mergeQVArray.Initialize(baseCallGroup, "MergeQV");
+		if (includedFields["PreBaseDeletionQV"])
+			preBaseDeletionQVArray.Initialize(baseCallGroup, "PreBaseDeletionQV", 4);
+		if (includedFields["SubstitutionTag"])
+			substitutionTagArray.Initialize(baseCallGroup,   "SubstitutionTag");
+		if (includedFields["SubstitutionQV"])
+			substitutionQVArray.Initialize(baseCallGroup,    "SubstitutionQV");
+		if (includedFields["WidthInFrames"])
+			widthInFramesArray.Initialize(baseCallGroup, "WidthInFrames");
+		if (includedFields["PreBaseFrames"])
+			preBaseFramesArray.Initialize(baseCallGroup, "PreBaseFrames");
+        
+		if (includedFields["SimulatedCoordinate"]) {
+			simulatedCoordinateArray.Initialize(baseCallGroup, "SimulatedCoordinate");
+		}
+		if (includedFields["SimulatedSequenceIndex"]) {
+			simulatedSequenceIndexArray.Initialize(baseCallGroup, "SimulatedSequenceIndex");
+		}
+        if (includedFields["PulseIndex"]) {
+            pulseIndexArray.Initialize(baseCallGroup, "PulseIndex");
+        }
+
+        if (platformId == Astro or includedFields["HoleXY"]) {
+            holeXY2D.Initialize(zmwGroup, "HoleXY", 2);
+        }
+        includedFields["HoleNumber"] = true;
+        holeNumberArray.Initialize(zmwGroup, "HoleNumber");
+        includedFields["HoleStatus"] = true;
+        holeStatusArray.Initialize(zmwGroup, "HoleStatus");
+    }
+
+	int WriteHoleXY(int x=0, int y=0) {
+		int16_t xy[2] = {static_cast<int16_t>(x), static_cast<int16_t>(y)};
+		holeXY2D.WriteRow(xy, 2);
+	}		
+
+	int WriteIdentifiers(UInt holeNumber, unsigned char holeStatus, int x=0, int y=0 ) {
+		//
+		// Write hole number regardless of platform type.
+		//
+        holeNumberArray.Write(&holeNumber, 1);
+        holeStatusArray.Write(&holeStatus, 1);
+        if (platformId == Astro or includedFields["HoleXY"]) {
+            WriteHoleXY(x,y);
+        }
+        return 1;
+	}
+	
+
+	int WriteQualities(FASTQSequence &seq) {
+		qualArray.Write(seq.qual.data, seq.length);
+
+		if (includedFields["DeletionQV"] and seq.deletionQV.Empty() == false) {
+			deletionQVArray.Write(seq.deletionQV.data, seq.length);
+		}
+		if (includedFields["PreBaseDeletionQV"] and seq.preBaseDeletionQV.Empty() == false) {
+			DNALength readPos;
+			for (readPos = 0; readPos < seq.length; readPos++) {
+				preBaseDeletionQVArray.WriteRow(&seq.preBaseDeletionQV[readPos*4], 4);
+			}
+		}
+		if (includedFields["DeletionTag"] and seq.deletionTag != NULL) {
+			deletionTagArray.Write(seq.deletionTag, seq.length);
+		}
+		if (includedFields["InsertionQV"] and seq.insertionQV.Empty() == false) {
+			insertionQVArray.Write(seq.insertionQV.data, seq.length);
+		}
+		if (includedFields["SubstitutionQV"] and seq.substitutionQV.Empty() == false) {
+			substitutionQVArray.Write(seq.substitutionQV.data, seq.length);
+		}
+		if (includedFields["SubstitutionTag"] and seq.substitutionTag != NULL) {
+			substitutionTagArray.Write(seq.substitutionTag, seq.length);
+		}
+		if (includedFields["MergeQV"] and seq.mergeQV.Empty() == false) {
+			mergeQVArray.Write(seq.mergeQV.data, seq.length);
+		}
+
+	}
+
+	int WriteBases(FASTASequence &seq ) {
+		int lenArray[1] = {static_cast<int>(seq.length)};
+		nElemArray.Write(lenArray, 1);
+		baseArray.Write((const unsigned char*) seq.seq, seq.length);
+		return 1;
+	}
+
+	int Write(SMRTSequence &seq) {
+		WriteBases(seq);
+		WriteQualities(seq);
+
+		if (includedFields["PreBaseFrames"] and seq.preBaseFrames != NULL) {
+			preBaseFramesArray.Write(seq.preBaseFrames, seq.length);
+		}
+		if (includedFields["WidthInFrames"] and seq.widthInFrames != NULL) {
+			widthInFramesArray.Write(seq.widthInFrames, seq.length);
+		}
+        if (includedFields["PulseIndex"] and seq.pulseIndex != NULL) {
+            pulseIndexArray.Write(seq.pulseIndex, seq.length);
+        }
+		WriteIdentifiers(seq.zmwData.holeNumber, seq.zmwData.holeStatus,  seq.xy[0], seq.xy[1]);
+
+		return 1;
+	}
+
+	int Write(FASTQSequence &seq) {
+        int x, y;
+        UInt holeNumber;
+        unsigned char holeStatus;
+
+        WriteBases(seq);
+        WriteQualities(seq);
+
+        if (platformId == Astro) {
+            //
+            // now extract the x an y coordinates.
+            GetSMRTReadCoordinates(seq, x, y);
+            holeStatus = 0;
+            seq.GetHoleNumber((int&) holeNumber);
+        }
+        if (platformId == Springfield){ 
+            GetSpringfieldHoleNumberFromTitle(seq, holeNumber);
+        }
+
+        WriteIdentifiers(holeNumber,holeStatus,x,y);
+
+        return 1;
+	}
+};
+
+#endif
diff --git a/libcpp/hdf/HDFCCSReader.hpp b/libcpp/hdf/HDFCCSReader.hpp
new file mode 100644
index 0000000..c93be14
--- /dev/null
+++ b/libcpp/hdf/HDFCCSReader.hpp
@@ -0,0 +1,257 @@
+#ifndef _BLASR_HDF_CCS_READER_HPP_
+#define _BLASR_HDF_CCS_READER_HPP_
+
+#include "HDFBasReader.hpp"
+
+template<typename T_Sequence>
+class HDFCCSReader : public T_HDFBasReader<T_Sequence> {
+ public:
+	HDFGroup ccsGroup, passesGroup;
+
+	HDFArray<Byte> baseCallArray;
+	HDFArray<UInt> passStartPulseArray, passNumPulsesArray, passStartBaseArray,
+		passNumBasesArray, numPassesArray;
+	HDFArray<Byte> passDirectionArray, adapterHitAfterArray, adapterHitBeforeArray;
+	
+	HDFZMWReader zmwReader;
+	T_HDFBasReader<SMRTSequence> ccsBasReader;
+	int curPassPos;
+
+  HDFCCSReader() : T_HDFBasReader<T_Sequence>() {
+		curPassPos = 0;
+		this->fieldNames.push_back("AdapterHitAfter");
+		this->fieldNames.push_back("AdapterHitBefore");
+		this->fieldNames.push_back("NumPasses");
+		this->fieldNames.push_back("PassDirection");
+		this->fieldNames.push_back("PassNumPase");
+		this->fieldNames.push_back("PassStartBase");
+		this->fieldNames.push_back("PassStartPulse");
+		this->fieldNames.push_back("PassNumPulses");
+		InitializeAllCCSFields(true);
+	}
+
+	void InitializeAllCCSFields(bool value) {
+		this->includedFields["AdapterHitAfter"]  = value;
+		this->includedFields["AdapterHitBefore"] = value;
+		this->includedFields["NumPasses"]        = value;
+		this->includedFields["PassDirection"]    = value;
+		this->includedFields["PassNumPase"]      = value;
+		this->includedFields["PassStartBase"]    = value;
+		this->includedFields["PassStartPulse"]   = value;
+		this->includedFields["PassNumPulses"]    = value;
+	}
+
+	bool BasFileHasCCS(string ccsBasFileName) {
+		try {
+      H5::Exception::dontPrint();
+			this->hdfBasFile.openFile(ccsBasFileName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+		}
+		catch (H5::Exception &e) {
+			cout << "ERROR, could not open hdf file " << ccsBasFileName << " Stopping." << endl;
+			exit(1);
+		}
+
+		HDFGroup ccsBasecallsGroup;
+		bool fileContainsCCS = false;
+		HDFGroup pulseDataGroup;
+		if (pulseDataGroup.Initialize(this->hdfBasFile, "PulseData") == 0) {
+      cout << "ERROR, ccs base file " << ccsBasFileName 
+           << " does not have a PulseData field." << endl;
+      exit(1);
+    }
+		if (pulseDataGroup.ContainsObject("ConsensusBaseCalls")) {
+			fileContainsCCS = true;
+		}
+
+		this->hdfBasFile.close();
+		return fileContainsCCS;
+	}
+
+	int Advance(int nSteps) {
+		cout << "ERROR! Advance is not yet implemented for ccs reader" << endl;
+		assert(0);
+		return 0;
+	}
+
+	int Initialize(string ccsBasFileName,
+            const H5::FileAccPropList & fileAccPropList = H5::FileAccPropList::DEFAULT) {
+		//
+		// Open the file and initialize for reading reads.
+		//
+
+		// 
+		// First, initialize for reading the unrolled bases from this
+		// file.
+		//
+	  if (this->T_HDFBasReader<T_Sequence>::Initialize(ccsBasFileName, fileAccPropList) == 0) {
+        cout << "ERROR, Could not initialize ccs file " << ccsBasFileName << endl;
+        exit(1);
+      }
+
+		if (this->pulseDataGroup.ContainsObject("ConsensusBaseCalls") and
+				ccsGroup.Initialize(this->hdfBasFile, "PulseData/ConsensusBaseCalls") == 0) {
+			cout << "ERROR, attempting to read cicular consensus data from '" << ccsBasFileName 
+					 << "', which does not contain a ConsensusBaseCalls field." << endl;
+			cout << "Check HDF file structure." << endl;
+			exit(1);
+		}
+		curPassPos = 0;
+		int passesSuccess = 1;
+		if (ccsGroup.ContainsObject("Passes") == 0) { 
+			passesSuccess = 0;
+		}
+		else {
+			if (passesGroup.Initialize(ccsGroup.group,"Passes") == 0) {
+				passesSuccess = 0;
+			}
+		}
+
+		if (passesSuccess == 0) {
+			cout <<"ERROR, attempting to read circular consensus group Passes but it does not exist. " << endl;
+			cout <<"Check HDF file structure."<<endl;
+			exit(1);
+		}
+		
+		//
+		// Initialize the bas reader to read ccs reads as normal bas reads.
+		//
+		
+		// Next, the location of the bases is in a non-standard group.
+		ccsBasReader.baseCallsGroupName = "ConsensusBaseCalls";
+
+
+		//
+		// Read in the CCS fields that are the same as the base fields,
+		// but in a different group.
+		//
+
+		//		ccsBasReader.OpenHDFFile(ccsBasFileName);
+		
+		//
+		// Initialize the fields that are read.
+		//
+		ccsBasReader.IncludeField("Basecall");
+		ccsBasReader.IncludeField("InsertionQV");
+		ccsBasReader.IncludeField("DeletionQV");
+		ccsBasReader.IncludeField("DeletionTag");
+		ccsBasReader.IncludeField("SubstitutionQV");
+		ccsBasReader.IncludeField("SubstitutionTag");
+		ccsBasReader.IncludeField("QualityValue");
+		//
+		// Initialize this without opening a file.
+		//
+		ccsBasReader.Initialize(&this->rootGroup);
+		//ccsBasReader.InitializeForReadingPulseInformation();
+		//ccsBasReader.LoadRunInfo();
+		/*
+		 * Initialize pass information for reading.
+		 */
+		if (this->InitializeField(passesGroup, "AdapterHitAfter", adapterHitAfterArray, this->includedFields["AdapterHitAfter"]) == 0) return 0;
+		if (this->InitializeField(passesGroup, "AdapterHitBefore", adapterHitBeforeArray, this->includedFields["AdapterHitBefore"]) == 0) return 0;
+		if (this->InitializeField(passesGroup, "NumPasses", numPassesArray, this->includedFields["NumPasses"]) == 0) return 0;
+		if (this->InitializeField(passesGroup, "PassDirection", passDirectionArray, this->includedFields["PassDirection"]) == 0) return 0;
+		if (this->InitializeField(passesGroup, "PassNumBases", passNumBasesArray, this->includedFields["PassNumBases"]) == 0) return 0;
+		if (this->InitializeField(passesGroup, "PassStartBase", passStartBaseArray, this->includedFields["PassStartBase"]) == 0) return 0;
+		//
+		// The following two fields are not critical.
+		//
+		this->InitializeField(passesGroup, "PassStartPulse", passStartPulseArray, this->includedFields["PassStartPulse"]);
+		this->InitializeField(passesGroup, "PassNumPulses", passNumPulsesArray, this->includedFields["PassNumPulses"]);
+
+		//
+		// The zmw reader contains the group that hols all pass information
+		//
+		zmwReader.Initialize(&ccsBasReader.baseCallsGroup);
+			
+		return 1;
+	}
+
+  unsigned int GetNumPasses(int readIndex) {
+    unsigned int numPasses;
+		numPassesArray.Read(readIndex, readIndex+1, &numPasses);
+    return numPasses;
+  }
+
+	int GetNext(T_Sequence &ccsSequence) {
+		//
+		// Read in all ccs pass data.
+		//
+
+		ccsSequence.Free();
+		int retVal = 0;
+		if (this->curRead == ccsBasReader.nReads) {
+			return 0;
+		}
+		if (this->curBasePos == ccsBasReader.nBases) {
+			return 0;
+		}
+        try {
+        UInt numPasses;
+		numPassesArray.Read(this->curRead, this->curRead+1, &numPasses);
+		if (numPasses > 0) {
+			// Read in the ccs bases
+			if ((retVal = ccsBasReader.GetNext((SMRTSequence&)ccsSequence)) == 0)
+                return 0;
+
+            ccsSequence.numPasses = numPasses;
+
+			if (this->includedFields["AdapterHitAfter"]) {
+				ccsSequence.adapterHitAfter.resize(ccsSequence.numPasses);
+				adapterHitAfterArray.Read(curPassPos,  curPassPos + ccsSequence.numPasses, &ccsSequence.adapterHitAfter[0]);
+			}
+			if (this->includedFields["AdapterHitBefore"]) {
+				ccsSequence.adapterHitBefore.resize(ccsSequence.numPasses);
+				adapterHitBeforeArray.Read(curPassPos, curPassPos + ccsSequence.numPasses, &ccsSequence.adapterHitBefore[0]);
+			}
+			if (this->includedFields["PassDirection"]) {
+				ccsSequence.passDirection.resize(ccsSequence.numPasses);
+				passDirectionArray.Read(curPassPos,    curPassPos + ccsSequence.numPasses, &ccsSequence.passDirection[0]);
+			}
+			if (this->includedFields["PassNumBases"]) {
+				ccsSequence.passNumBases.resize(ccsSequence.numPasses);
+				passNumBasesArray.Read(curPassPos,     curPassPos + ccsSequence.numPasses, &ccsSequence.passNumBases[0]);
+			}
+			if (this->includedFields["PassStartBase"]) {
+				ccsSequence.passStartBase.resize(ccsSequence.numPasses);
+				passStartBaseArray.Read(curPassPos,    curPassPos + ccsSequence.numPasses, &ccsSequence.passStartBase[0]);
+			}
+			if (this->includedFields["PassStartPulse"]) {
+				ccsSequence.passStartPulse.resize(ccsSequence.numPasses);
+				passStartPulseArray.Read(curPassPos,   curPassPos + ccsSequence.numPasses, &ccsSequence.passStartPulse[0]);
+			}
+			if (this->includedFields["PassNumPulses"]) { 
+				ccsSequence.passNumPulses.resize(ccsSequence.numPasses);
+				passNumPulsesArray.Read(curPassPos,    curPassPos + ccsSequence.numPasses, &ccsSequence.passNumPulses[0]);			
+			}
+			curPassPos += ccsSequence.numPasses;
+		}
+		else {
+			// advance a read in the ccs sequence without advancing positions.
+			ccsBasReader.curRead++;
+		}
+		//
+		// Regardless whether or not a ccs read was called, read the next
+		// unrolled read, since an unrolled read is called for each zmw.
+		//
+		retVal = ((T_HDFBasReader<SMRTSequence>*)this)->GetNext(ccsSequence.unrolledRead);
+        ccsSequence.zmwData = ccsSequence.unrolledRead.zmwData;
+		ccsSequence.CopyTitle(ccsSequence.unrolledRead.title);
+    string newTitle = string(ccsSequence.title) + string("/ccs");
+    ccsSequence.CopyTitle(newTitle.c_str());
+        } catch (H5::DataSetIException e) {
+            cout << "ERROR, could not read ccs data for CCS Sequence " 
+                 << ccsSequence.unrolledRead.title << endl; 
+            exit(1);
+        }
+		//		cout << "title: " << ccsSequence.title << endl;
+		if (retVal == 0) {
+			return 0;
+		}
+		else {
+			return 1;
+		}
+	}
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFCmpData.hpp b/libcpp/hdf/HDFCmpData.hpp
new file mode 100644
index 0000000..dd9e54e
--- /dev/null
+++ b/libcpp/hdf/HDFCmpData.hpp
@@ -0,0 +1,36 @@
+#ifndef _BLASR_HDF_CMP_DATA_HPP_
+#define _BLASR_HDF_CMP_DATA_HPP_
+
+#include "HDFAtom.hpp"
+#include "HDFCmpRefAlignmentGroup.hpp"
+
+class HDFCmpData {
+public:
+    HDFAtom<std::string> commandLine;
+    H5::H5File hdfCmpFile;
+    HDFArray<int> movieNameIdArray;
+    HDFStringArray movieNameArray;
+
+    HDFStringArray readGroupPathArray;
+    HDFArray<int>    readGroupPathIdArray;
+
+    HDFArray<int>    refSeqNameIdArray;
+    HDFStringArray refSeqNameArray;
+    static const int NCols=22;
+    vector<HDFAtom<std::string> >  colNameAtoms;
+    vector<HDFCmpRefAlignmentGroup*> refAlignGroups;
+    map<std::string, int> nameToAlignmentGroupIndex;
+    static const char *colNameIds[];
+
+    void Close() {
+        hdfCmpFile.close();
+    }
+};
+
+const char * HDFCmpData::colNameIds[] = {
+    "00", "01", "02", "03", "04", "05", "06", "07", "08", "09",
+    "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
+    "20", "21"};
+
+
+#endif
diff --git a/libcpp/hdf/HDFCmpExperimentGroup.cpp b/libcpp/hdf/HDFCmpExperimentGroup.cpp
new file mode 100644
index 0000000..6f6459c
--- /dev/null
+++ b/libcpp/hdf/HDFCmpExperimentGroup.cpp
@@ -0,0 +1,193 @@
+#include <iostream>
+#include "HDFCmpExperimentGroup.hpp"
+
+using namespace std;
+
+bool HDFCmpExperimentGroup::Create(HDFGroup &parent, 
+    string experimentGroupName) {
+
+    parent.AddGroup(experimentGroupName);
+    if (experimentGroup.Initialize(parent.group, experimentGroupName) == 0) { return 0; }
+    alignmentArray.Create(experimentGroup, "AlnArray");
+    return true;
+}
+
+
+void HDFCmpExperimentGroup::AddAlignment(std::vector<unsigned char> &alignment, 
+    unsigned int &offsetBegin, unsigned int &offsetEnd) {
+
+    offsetBegin = offsetEnd = 0;
+    if (alignment.size() == 0 ) {
+        // 
+        // Do not increment anything.
+        //
+        return;
+    }
+
+    // Make a copy of alignment.
+    vector<unsigned char> paddedAlignment = alignment;
+    // Pad '0' to the end of the alignment.
+    paddedAlignment.push_back(0);
+
+    offsetBegin = alignmentArray.size(); // 0 based, inclusive
+    offsetEnd   = offsetBegin + alignment.size(); // 0 based, exclusive
+    // alignmentArray[offsetEnd] is not a part of the real alignment, it is the padded 0.
+    alignmentArray.Write(&paddedAlignment[0], paddedAlignment.size());
+}
+
+//template<typename T>
+//void HDFCmpExperimentGroup::AddQualityValues(const std::vector<T> &qualityValues,
+//                                             const std::string &fieldName,
+//                                             unsigned int *offsetBegin,
+//                                             unsigned int *offsetEnd) {
+//
+//  std::vector<T> paddedQualityValues = qualityValues;
+//  paddedQualityValues.push_back(0);
+//  HDFArray<T> *arrayPtr = NULL;
+//  
+//  // This seems to be how we do it 
+//  if (fieldName == "DeletionQV") {
+//      arrayPtr = &deletionQV;
+//  } else if (fieldName == "InsertionQV") {
+//      arrayPtr = &insertionQV;
+//  } else if (fieldName == "MergeQV") {
+//      arrayPtr = &mergeQV;
+//  } else if (fieldName == "SubstitutionQV") {
+//      arrayPtr = &substitutionQV;
+//  } else if (fieldName == "DeletionTag") {
+//      arrayPtr = &deletionTag;
+//  } else if (fieldName == "SubstitutionTag") {
+//      arrayPtr = &substitutionTag;
+//  } else {
+//      assert(false);
+//  }
+//
+//  *offsetBegin = arrayPtr->size();
+//  *offsetEnd = arrayPtr->size() + qualityValues.size();
+//  
+//  arrayPtr->Write(&paddedQualityValues[0], paddedQualityValues.size());
+//}
+//
+//// One for tags, one for QVs
+//template void HDFCmpExperimentGroup::AddQualityValues<char>(
+//        const std::vector<char>&, const std::string&,
+//        unsigned int*, unsigned int*);
+//
+//template void HDFCmpExperimentGroup::AddQualityValues<UChar>(
+//        const std::vector<UChar>&, const std::string&,
+//        unsigned int*, unsigned int*);
+//
+int HDFCmpExperimentGroup::Initialize(HDFGroup &refGroup, 
+    string experimentGroupName, set<string> &fieldNames) {
+    //
+    // Normal initialization that prepares for reading alignments
+    //
+    Initialize(refGroup, experimentGroupName);
+
+    //
+    // Field initialization for reading in pulse/quality information.
+    //
+    set<string>::iterator fieldNameIt, fieldEnd;
+    fieldEnd = fieldNames.end();
+    for (fieldNameIt = fieldNames.begin(); fieldNameIt != fieldEnd; ++fieldNameIt) {
+        if (supportedFields.find(*fieldNameIt) != supportedFields.end() and
+                experimentGroup.ContainsObject(*fieldNameIt)) {
+            fields[*fieldNameIt]->Initialize(experimentGroup, *fieldNameIt);
+        }
+        else {
+            cout << "Unable to initialize requested field " << *fieldNameIt << " in experiment group " << experimentGroupName << endl;
+        }
+    }
+    return 1;
+}
+
+int HDFCmpExperimentGroup::Initialize(HDFGroup &refGroup, string experimentGroupName) {
+
+    if (experimentGroup.Initialize(refGroup.group, experimentGroupName) == 0) { return 0; }
+    if (alignmentArray.Initialize(experimentGroup, "AlnArray") == 0) { return 0; }
+    return 1;
+}
+
+
+HDFCmpExperimentGroup::HDFCmpExperimentGroup() {
+    fields["StartTimeOffset"] = &this->startTimeOffset;
+    fields["QualityValue"] = &this->qualityValue;
+    fields["IPD"] = &this->ipd;
+    fields["PreBaseFrames"] = &this->preBaseFrames;
+    fields["DeletionQV"] = &this->deletionQV;
+    fields["InsertionQV"] = &this->insertionQV;
+    fields["ClassifierQV"] = &this->classifierQV;
+    fields["SubstitutionQV"] = &this->substitutionQV;
+    fields["Light"] = &this->light;
+    fields["WidthInFrames"] = &this->widthInFrames;
+    fields["PulseWidth"] = &this->pulseWidth;
+    fields["StartFrame"] = &this->startTime;
+    // StartFrame computed from Pulse metrics and Base metrics
+    fields["StartFramePulse"] = &this->startTimePulse;
+    fields["StartFrameBase"] = &this->startTimeBase;
+
+    fields["pkmid"] = &this->pkmid;
+    fields["pkmax"] = &this->pkmax;
+    fields["pkmean"] = &this->pkmean;
+    fields["DeletionTag"] = &this->deletionTag;
+    fields["SubstitutionTag"] = &this->substitutionTag;
+    fields["PulseIndex"] = &this->pulseIndex;
+    fields["MergeQV"] = &this->mergeQV;
+}
+
+// Return reference alignment AlnArray size in KB.
+UInt HDFCmpExperimentGroup::GetAlnArraySize() {
+    return alignmentArray.arrayLength / 1024 * sizeof (unsigned char);
+}
+
+void HDFCmpExperimentGroup::AddQVs(const std::vector<UChar> &qualityValues,
+                                   const std::string &fieldName,
+                                   unsigned int *offsetBegin,
+                                   unsigned int *offsetEnd) {
+    std::vector<UChar> paddedQualityValues = qualityValues;
+    paddedQualityValues.push_back(0);
+    HDFArray<UChar> *arrayPtr = NULL;
+    
+    // This seems to be how we do it 
+    if (fieldName == "DeletionQV") {
+        arrayPtr = &deletionQV;
+    } else if (fieldName == "InsertionQV") {
+        arrayPtr = &insertionQV;
+    } else if (fieldName == "MergeQV") {
+        arrayPtr = &mergeQV;
+    } else if (fieldName == "SubstitutionQV") {
+        arrayPtr = &substitutionQV;
+    } else {
+        assert(false);
+    }
+    
+    if (!arrayPtr->isInitialized) arrayPtr->Initialize(experimentGroup, fieldName);
+    *offsetBegin = arrayPtr->size();
+    *offsetEnd = arrayPtr->size() + qualityValues.size();
+    
+    arrayPtr->Write(&paddedQualityValues[0], paddedQualityValues.size());
+}
+
+void HDFCmpExperimentGroup::AddTags(const std::vector<char> &qualityValues,
+                                    const std::string &fieldName,
+                                    unsigned int *offsetBegin,
+                                    unsigned int *offsetEnd) {
+    std::vector<char> paddedQualityValues = qualityValues;
+    paddedQualityValues.push_back(0);
+    HDFArray<char> *arrayPtr = NULL;
+    
+    if (fieldName == "DeletionTag") {
+        arrayPtr = &deletionTag;
+    } else if (fieldName == "SubstitutionTag") {
+        arrayPtr = &substitutionTag;
+    } else {
+        assert(false);
+    }
+
+    if (!arrayPtr->isInitialized) arrayPtr->Initialize(experimentGroup, fieldName);
+    *offsetBegin = arrayPtr->size();
+    *offsetEnd = arrayPtr->size() + qualityValues.size();
+    
+    arrayPtr->Write(&paddedQualityValues[0], paddedQualityValues.size());
+}
+
diff --git a/libcpp/hdf/HDFCmpExperimentGroup.hpp b/libcpp/hdf/HDFCmpExperimentGroup.hpp
new file mode 100644
index 0000000..05d5cfb
--- /dev/null
+++ b/libcpp/hdf/HDFCmpExperimentGroup.hpp
@@ -0,0 +1,70 @@
+#ifndef _BLASR_HDF_CMP_EXPERIMENT_GROUP_HPP_
+#define _BLASR_HDF_CMP_EXPERIMENT_GROUP_HPP_
+
+#include <map>
+#include <vector>
+#include <set>
+#include <cstdint>
+#include "Types.h"
+#include "HDFGroup.hpp"
+#include "HDFArray.hpp"
+#include "HDFCmpSupportedFields.hpp"
+
+class HDFCmpExperimentGroup {
+public:
+    HDFCmpSupportedFields supportedFields;
+    HDFArray<unsigned int> startTimeOffset;
+    HDFArray<HalfWord> ipd;
+    HDFArray<HalfWord> preBaseFrames;
+    HDFArray<char>  deletionTag;
+    HDFArray<char>  substitutionTag;
+    HDFArray<UChar> qualityValue;
+    HDFArray<UChar> deletionQV;
+    HDFArray<UChar> insertionQV;
+    HDFArray<float> classifierQV; 
+    // ClassifierQV date type is float in cmp.h5
+    HDFArray<UChar> substitutionQV;
+    HDFArray<UChar> mergeQV;
+    HDFArray<HalfWord> light;
+    HDFArray<HalfWord> widthInFrames;
+    HDFArray<HalfWord> pulseWidth;
+    HDFArray<unsigned int> startTime;
+    // StartFrame computed from Pulse metrics and Base metric
+    HDFArray<unsigned int> startTimeBase;
+    HDFArray<unsigned int> startTimePulse;
+    HDFArray<float> pkmid;
+    HDFArray<float> pkmax;
+    HDFArray<float> pkmean;
+    HDFArray<uint32_t>   numPasses;
+    HDFArray<uint32_t> pulseIndex;
+    std::map<std::string, HDFData*> fields;
+    HDFGroup experimentGroup;
+    HDFArray<unsigned char> alignmentArray;
+
+    bool Create(HDFGroup &parent, string experimentGroupName); 
+
+    void AddAlignment(std::vector<unsigned char> &alignment, 
+        unsigned int &offsetBegin, unsigned int &offsetEnd); 
+    
+    // AddQVs and AddTags are like AddAlignment, but for QVs and Tags,
+    // respectively. They are responsible for initializing and writing to the
+    // correct member HDFArray, given a vector of values to write and the name
+    // of the QV or Tag 
+    void AddQVs(const std::vector<UChar> &qualityValues, const std::string &fieldName,
+                unsigned int *offsetBegin, unsigned int *offsetEnd);
+    void AddTags(const std::vector<char> &qualityValues, const std::string &fieldName,
+                 unsigned int *offsetBegin, unsigned int *offsetEnd);
+                           
+    int Initialize(HDFGroup &refGroup, std::string experimentGroupName, 
+        std::set<string> &fieldNames); 
+
+    int Initialize(HDFGroup &refGroup, std::string experimentGroupName); 
+
+    void Read();
+
+    HDFCmpExperimentGroup(); 
+
+    // Return reference alignment AlnArray size in KB.
+    UInt GetAlnArraySize(); 
+};
+#endif
diff --git a/libcpp/hdf/HDFCmpFile.hpp b/libcpp/hdf/HDFCmpFile.hpp
new file mode 100644
index 0000000..d4d6984
--- /dev/null
+++ b/libcpp/hdf/HDFCmpFile.hpp
@@ -0,0 +1,844 @@
+#ifndef _BLASR_HDF_CMP_FILE_HPP_
+#define _BLASR_HDF_CMP_FILE_HPP_
+
+#include <iostream>
+#include <assert.h>
+#include <sstream>
+#include <map>
+
+#include "H5Cpp.h"
+
+#include "HDFAtom.hpp"
+#include "HDFArray.hpp"
+#include "HDF2DArray.hpp"
+#include "HDFCmpData.hpp"
+#include "HDFCmpRefAlignmentGroup.hpp"
+#include "HDFCmpExperimentGroup.hpp"
+#include "HDFAlnGroupGroup.hpp"
+#include "HDFAlnInfoGroup.hpp"
+
+#include "HDFRefGroupGroup.hpp"
+#include "HDFRefInfoGroup.hpp"
+#include "HDFMovieInfoGroup.hpp"
+#include "HDFCmpRootGroup.hpp"
+#include "HDFCmpSupportedFields.hpp"
+#include "HDFFileLogGroup.hpp"
+
+#include "SMRTSequence.hpp"
+
+#include "datastructures/alignment/CmpFile.hpp"
+#include "datastructures/alignment/Alignment.hpp"
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "alignment/CmpAlignment.hpp"
+#include "datastructures/alignment/CmpReadGroupTable.h"
+#include "datastructures/alignment/CmpRefSeqTable.h"
+#include "datastructures/alignment/ByteAlignment.h"
+#include "saf/RefInfo.hpp"
+
+using namespace H5;
+using namespace std;
+
+template<typename T_Alignment>
+class HDFCmpFile : public HDFCmpData {
+public:
+    map<int,int>  movieNameIdToArrayIndex,  readGroupPathIdToArrayIndex, refGroupIdToArrayIndex;
+    map<string, int> refNameToArrayIndex;
+    //  map<string,string> readGroupPathToReadGroup;
+    map<int, string> alnGroupIdToReadGroupName;
+
+    HDFAlnGroupGroup alnGroupGroup;
+    HDFAlnInfoGroup alnInfoGroup;
+    HDFMovieInfoGroup movieInfoGroup;
+    HDFRefGroupGroup refGroupGroup;
+    HDFRefInfoGroup refInfoGroup;
+    HDFCmpRootGroup<T_Alignment> rootGroup;
+    set<string> includedFields;
+    HDFCmpSupportedFields supportedFields;
+    HDFAtom<string> readTypeAtom;
+    HDFFileLogGroup fileLogGroup;
+
+    void AstroInitializeColumnNameMap() {
+        CmpAlignmentBase::columnNameToIndex["AlignmentId"] = 0;
+        CmpAlignmentBase::columnNameToIndex["ReadGroupId"] = 1;
+        CmpAlignmentBase::columnNameToIndex["MovieId"] = 2;
+        CmpAlignmentBase::columnNameToIndex["RefSeqId"] = 3;
+        CmpAlignmentBase::columnNameToIndex["tStart"] = 4;
+        CmpAlignmentBase::columnNameToIndex["tEnd"] = 5;
+        CmpAlignmentBase::columnNameToIndex["AlignedStrand"] = 6;
+        CmpAlignmentBase::columnNameToIndex["ExpId"] = 7;
+        CmpAlignmentBase::columnNameToIndex["RunId"] = 8;
+        CmpAlignmentBase::columnNameToIndex["Panel"] = 9;
+        CmpAlignmentBase::columnNameToIndex["x"] = 10;
+        CmpAlignmentBase::columnNameToIndex["y"] = 11;
+        CmpAlignmentBase::columnNameToIndex["SubreadId"] = 12;
+        CmpAlignmentBase::columnNameToIndex["rStart"] = 13;
+        CmpAlignmentBase::columnNameToIndex["rEnd"] = 14;
+        CmpAlignmentBase::columnNameToIndex["Z"] = 15;
+        CmpAlignmentBase::columnNameToIndex["nM"] = 16;
+        CmpAlignmentBase::columnNameToIndex["nMM"] = 17;
+        CmpAlignmentBase::columnNameToIndex["nIns"] = 18;
+        CmpAlignmentBase::columnNameToIndex["nDel"] = 19;
+        CmpAlignmentBase::columnNameToIndex["offset_begin"] = 20;
+        CmpAlignmentBase::columnNameToIndex["offset_end"] = 21;
+    }
+
+    void SpringfieldInitializeColumnNameMap() {
+        CmpAlignmentBase::columnNameToIndex["AlignmentId"] = 0;
+        CmpAlignmentBase::columnNameToIndex["ReadGroupId"] = 1;
+        CmpAlignmentBase::columnNameToIndex["AlnGroupID"] = 1;
+        CmpAlignmentBase::columnNameToIndex["AlnGroupId"] = 1;
+        CmpAlignmentBase::columnNameToIndex["MovieId"] = 2;
+        CmpAlignmentBase::columnNameToIndex["RefSeqId"] = 3;
+        CmpAlignmentBase::columnNameToIndex["tStart"] = 4;
+        CmpAlignmentBase::columnNameToIndex["tEnd"] = 5;
+        CmpAlignmentBase::columnNameToIndex["RCRefStrand"] = 6;
+        CmpAlignmentBase::columnNameToIndex["HoleNumber"] = 7;
+        CmpAlignmentBase::columnNameToIndex["SetNumber"] = 8;
+        CmpAlignmentBase::columnNameToIndex["StrobeNumber"] = 9;
+        CmpAlignmentBase::columnNameToIndex["SubreadId"] = 10;
+        CmpAlignmentBase::columnNameToIndex["rStart"] = 11;
+        CmpAlignmentBase::columnNameToIndex["rEnd"] = 12;
+        CmpAlignmentBase::columnNameToIndex["MapQV"] = 13;
+        CmpAlignmentBase::columnNameToIndex["nM"] = 14;
+        CmpAlignmentBase::columnNameToIndex["nMM"] = 15;
+        CmpAlignmentBase::columnNameToIndex["nIns"] = 16;
+        CmpAlignmentBase::columnNameToIndex["nDel"] = 17;
+        CmpAlignmentBase::columnNameToIndex["offset_begin"] = 18;
+        CmpAlignmentBase::columnNameToIndex["offset_end"] = 19;
+        CmpAlignmentBase::columnNameToIndex["nBackRead"] = 20;
+        CmpAlignmentBase::columnNameToIndex["nReadOverlap"] = 21;
+
+        // All synonyms, the code requiring these should be refactored so
+        // that it no synonyms are needed.
+        //
+        CmpAlignmentBase::columnNameToIndex["AlnID"] = 0;
+        CmpAlignmentBase::columnNameToIndex["AlnGroupID"] = 1;
+        CmpAlignmentBase::columnNameToIndex["MovieID"] = 2;
+        CmpAlignmentBase::columnNameToIndex["RefGroupID"] = 3;
+        CmpAlignmentBase::columnNameToIndex["RefGroupId"] = 3;
+        CmpAlignmentBase::columnNameToIndex["MoleculeID"] = 10;
+        CmpAlignmentBase::columnNameToIndex["Offset_begin"] = 18;
+        CmpAlignmentBase::columnNameToIndex["Offset_end"] = 19;
+
+    }
+
+
+    int Initialize(string &hdfCmpFileName, set<string> includedFieldsP, unsigned int flags=H5F_ACC_RDONLY, const H5::FileAccPropList & fileAccPropList = H5::FileAccPropList::DEFAULT) {
+        Initialize(hdfCmpFileName, flags, fileAccPropList);
+        includedFields = includedFieldsP;
+    }
+
+    void Create(string &hdfCmpFileName) {
+        H5File newFile(hdfCmpFileName.c_str(), H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, FileAccPropList::DEFAULT);  
+        hdfCmpFile.openFile(hdfCmpFileName.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);    
+        rootGroup.Initialize(hdfCmpFile);
+        refGroupGroup.Create(rootGroup.rootGroup);
+        alnGroupGroup.Create(rootGroup.rootGroup);
+        refInfoGroup.Create(rootGroup.rootGroup);
+        movieInfoGroup.Create(rootGroup.rootGroup);
+        alnInfoGroup.Create(rootGroup.rootGroup);
+        fileLogGroup.Create(rootGroup.rootGroup);
+
+        //
+        // Add atom data
+        //
+        readTypeAtom.Create(rootGroup.rootGroup.group, "ReadType");
+        readTypeAtom.Write("standard");
+
+        // Add some proxy data for now.
+        HDFAtom<string> primaryVersionAtom, versionAtom;
+        primaryVersionAtom.Create(rootGroup.rootGroup.group, "PrimaryVersion");
+        primaryVersionAtom.Write("2.0.0.135558");
+        versionAtom.Create(rootGroup.rootGroup.group, "Version");
+        versionAtom.Write("2.0.0");
+    }
+
+    void SetReadType(string readType) {
+        readTypeAtom.Write(readType.c_str());
+    }
+
+    void GenerateNextRefGroupName(string &name) { 
+        stringstream nameStrm;
+        nameStrm << "ref";
+        nameStrm.width(6);
+        nameStrm.fill('0');
+        nameStrm << right << refGroupIdToArrayIndex.size() + 1;
+        name = nameStrm.str();
+    }
+
+
+    int AddReference(string refName, unsigned int length, string md5, string &refGroupName) {
+        //
+        // Adding a reference requires:
+        //
+        // 1. Creating a new refgroup name. 
+        // 2. Create the new reference group to add alignments to.
+        // 3. Adding this new name to the set of paths of ref groups.
+        // 4. Adding information for this ref group.
+        //
+
+        // 1.
+        this->GenerateNextRefGroupName(refGroupName);
+
+        // 2.
+        HDFCmpRefAlignmentGroup *newGroup = new HDFCmpRefAlignmentGroup;
+        newGroup->Create(rootGroup.rootGroup, refGroupName);
+        refAlignGroups.push_back(newGroup);
+        unsigned int id = refAlignGroups.size();
+
+        // 3.
+        refGroupGroup.AddPath("/" + refGroupName, id);
+        refGroupIdToArrayIndex[id] = id - 1;
+        refNameToArrayIndex[refName] = id - 1;
+        // 4.
+        refInfoGroup.AddRefInfo(refName, id, length, md5);
+        return id;
+    }
+
+    int StoreAlnArray(vector<unsigned char> &alnArray, string refName, string &experimentName,
+            unsigned int &offsetBegin,
+            unsigned int &offsetEnd) {
+        //
+        // First find the reference group.
+        //
+        assert(refNameToArrayIndex.find(refName) != refNameToArrayIndex.end());
+        int refIndex = refNameToArrayIndex[refName];
+        assert(refIndex < refAlignGroups.size());
+        HDFCmpExperimentGroup *expGroup;
+        expGroup = refAlignGroups[refIndex]->GetExperimentGroup(experimentName);
+        expGroup->AddAlignment(alnArray, offsetBegin, offsetEnd);
+    }
+    
+    // Write a vector of quality values to the appropriate experiment group.
+    // This is similar to StoreAlignment, but for QVs 
+    int StoreQVs(const vector<UChar> &qvArray, const string &refName, const string &fieldName,
+                 const string &experimentName, unsigned int *offsetBegin,
+                 unsigned int *offsetEnd) {
+        assert(refNameToArrayIndex.find(refName) != refNameToArrayIndex.end());
+        int refIndex = refNameToArrayIndex[refName];
+        assert(refIndex < refAlignGroups.size());
+        HDFCmpExperimentGroup *expGroup;
+        expGroup = refAlignGroups[refIndex]->GetExperimentGroup(experimentName);
+        expGroup->AddQVs(qvArray, fieldName, offsetBegin, offsetEnd);
+    }
+
+    // Write a vector of tag to the appropriate experiment group.
+    // This is similar to StoreAlignment, but for DeletionTag and
+    // SubstitutionTag.
+    int StoreTags(const vector<char> &qvArray, const string &refName, const string &fieldName,
+                  const string &experimentName, unsigned int *offsetBegin,
+                  unsigned int *offsetEnd) {
+        assert(refNameToArrayIndex.find(refName) != refNameToArrayIndex.end());
+        int refIndex = refNameToArrayIndex[refName];
+        assert(refIndex < refAlignGroups.size());
+        HDFCmpExperimentGroup *expGroup;
+        expGroup = refAlignGroups[refIndex]->GetExperimentGroup(experimentName);
+        expGroup->AddTags(qvArray, fieldName, offsetBegin, offsetEnd);
+    }
+
+    int Initialize(string &hdfCmpFileName, 
+            unsigned int flags=H5F_ACC_RDONLY,
+            const H5::FileAccPropList fileAccPropList=H5::FileAccPropList::DEFAULT) {
+        /*
+         * Initialize access to the HDF file.
+         */
+        try {
+            hdfCmpFile.openFile(hdfCmpFileName.c_str(), flags, fileAccPropList);
+        }
+        catch (Exception &e) {
+            cout << e.getDetailMsg() << endl;
+            return 0;
+        }
+
+        rootGroup.Initialize(hdfCmpFile);
+        readTypeAtom.Initialize(rootGroup.rootGroup, "ReadType");
+
+        if (alnGroupGroup.Initialize(rootGroup.rootGroup) == 0)  {
+            cout << "ERROR, could not read AlnGroup of the cmp file." << endl;
+            exit(1);
+        }
+        if (refInfoGroup.Initialize(rootGroup.rootGroup) == 0)   {
+            cout << "ERROR, could not read RefInfo of the cmp file." << endl;
+            exit(1);
+        }
+        if (refGroupGroup.Initialize(rootGroup.rootGroup) == 0)  {
+            cout << "ERROR, could not read RefGroup of the cmp file." << endl;
+            exit(1);
+        }
+        if (movieInfoGroup.Initialize(rootGroup.rootGroup) == 0) {
+            cout << "ERROR, could not read MovieInfo of the cmp file." << endl;
+            exit(1);
+        }
+        if (alnInfoGroup.Initialize(rootGroup.rootGroup) == 0)   {
+            cout << "ERROR, could not read AlnInfo of the cmp file." << endl;
+            exit(1);
+        }
+        if (fileLogGroup.Initialize(rootGroup.rootGroup)   == 0) { 
+            cout << "ERROR, could not read FileLog of the cmp file." << endl;
+            exit(1);
+        }
+
+        SpringfieldInitializeColumnNameMap();    
+
+        return 1;
+    }
+
+    bool HasNoAlignments() {
+    // return true if there is no alignment in the cmp file.
+        if (alnInfoGroup.alnIndexArray.GetNRows()==0) {
+            return true;
+        }
+        return false;
+    }
+
+    unsigned int GetAlignmentIndexSize() {
+        if (alnInfoGroup.alnInfoGroup.groupIsInitialized == false) {
+            cout << "ERROR, getting the size of an index before initializing the cmp.h5 file." << endl;
+            exit(1);
+        }
+        return alnInfoGroup.alnIndexArray.GetNRows();
+    }
+
+    // Add synonym 
+    unsigned int GetNAlignments() {
+        return GetAlignmentIndexSize();
+    }
+
+    static void ParseReadGroupPath(string &path, string &refName, string &readGroupName){ 
+        int delimPos;
+        delimPos = path.find_last_of('/');
+        if (delimPos != path.npos) {
+            refName = path.substr(0, delimPos);
+            //
+            // Check the ref name to see if it has a preceeding '/'
+            //
+            readGroupName = path.substr(delimPos+1, path.size());
+        } 
+        else {
+            refName ="";
+            readGroupName = "";
+        }
+    }
+
+    void StorePlatformId(CmpFile &cmpFile) {
+        //
+        // For now, hard wire as a springfield.  Later if the fields
+        // change per platform, this may be updated.
+        //
+        cmpFile.platformId = Springfield;
+    }
+
+    void ReadAlignmentDescriptions(CmpFile &cmpFile) {
+
+        //
+        // Gather run information.
+        //
+        rootGroup.ReadAttributes(cmpFile);
+
+        string readTypeString;
+        readTypeAtom.Read(readTypeString);
+        cmpFile.StoreReadType(readTypeString);
+        //
+        // Read in the groups that describe what alignments are present.
+        //
+
+        alnGroupGroup.Read(cmpFile.alnGroup);
+        alnInfoGroup.Read(cmpFile.alnInfo);
+        refGroupGroup.Read(cmpFile.refGroup);
+        movieInfoGroup.Read(cmpFile.movieInfo);
+        refInfoGroup.Read(cmpFile.refInfo);
+        StorePlatformId(cmpFile);
+
+    }
+
+    void ReadStructure(CmpFile &cmpFile) {
+        //
+        // Now for every reference group in the cmp file, create a group.
+        //
+        map<string,int> refNameToArrayIndex;
+
+        unsigned int refSeqIndex;
+
+        for (refSeqIndex = 0; refSeqIndex < cmpFile.refGroup.path.size(); refSeqIndex++) {
+            HDFCmpRefAlignmentGroup* refAlignGroup;
+            refAlignGroup = new HDFCmpRefAlignmentGroup;
+            refAlignGroup->Initialize(rootGroup.rootGroup.group, cmpFile.refGroup.path[refSeqIndex]);
+            int refAlignGroupIndex = refAlignGroups.size();
+            refAlignGroups.push_back(refAlignGroup);
+            //
+            // Allow one to index directly into this group given a string
+            // representing the reference name.
+            //
+            refNameToArrayIndex[cmpFile.refGroup.path[refSeqIndex]] = refAlignGroupIndex;
+            refGroupIdToArrayIndex[cmpFile.refGroup.id[refSeqIndex]] = refAlignGroupIndex;
+        }
+
+        // 
+        // Now that all ref groups are created, add read groups that
+        // are aligned to the ref groups.
+        //
+        // Note that groups are not necessarily named by movie, especially in 
+        // a deep-sorted cmp.h5, read groups may look like:
+        // /ref00001/rg8953-0
+        // /ref00001/rg2453-1
+        //
+        unsigned int alnGroupIndex;
+        for (alnGroupIndex = 0; alnGroupIndex < cmpFile.alnGroup.path.size(); alnGroupIndex++) {
+            string refName, readGroupName;
+            ParseReadGroupPath(cmpFile.alnGroup.path[alnGroupIndex], refName, readGroupName);
+
+            //
+            // Create an index that maps alnGroupId (/AlnGroup/Id) to readGroupName
+            //
+            alnGroupIdToReadGroupName[cmpFile.alnGroup.id[alnGroupIndex]] = readGroupName;
+
+            //
+            // Look up the group where this alignment should be found.
+            //
+            unsigned int refGroupArrayIndex;
+            if (refNameToArrayIndex.find(refName) != refNameToArrayIndex.end()) {
+                refGroupArrayIndex = refNameToArrayIndex[refName];
+            }
+            else {
+                cout << "ERROR! The reference name '" << refName << "' does not have an entry though it is "
+                    << " specified in the path for " << cmpFile.readGroupTable.names[alnGroupIndex] 
+                    << endl;
+                assert(0);
+            }
+
+            HDFCmpExperimentGroup *alnGroupPtr;
+            alnGroupPtr = refAlignGroups[refGroupArrayIndex]->InitializeExperimentGroup(readGroupName, includedFields);
+            // experimentNameToIndex should have been set in InitializeExperimentGroup();
+            assert( refAlignGroups[refGroupArrayIndex]->experimentNameToIndex[readGroupName] 
+                    == refAlignGroups[refGroupArrayIndex]->readGroups.size()-1);
+            refAlignGroups[refGroupArrayIndex]->experimentNameToIndex[readGroupName] = refAlignGroups[refGroupArrayIndex]->readGroups.size()-1;
+        }
+    }
+
+    void Read(CmpFile &cmpFile, bool readAllAlignments = true) {
+
+        ReadAlignmentDescriptions(cmpFile);
+        ReadStructure(cmpFile);
+
+        if (!readAllAlignments)
+            return;
+
+        /*
+         * Now that the alignment indices are all read in, read the base-by-base alignments.
+         */
+
+        unsigned int alignmentIndex;
+
+        for (alignmentIndex = 0; alignmentIndex < cmpFile.alnInfo.alignments.size(); alignmentIndex++) {
+            unsigned int alnGroupId = cmpFile.alnInfo.alignments[alignmentIndex].GetAlnGroupId();
+            unsigned int refGroupId = cmpFile.alnInfo.alignments[alignmentIndex].GetRefGroupId();
+            string refSeqName;
+
+            //
+            // Make sure the refGroupId specified in the alignment index exists in the alignment groups.
+            //
+            int refGroupArrayIndex;
+            if (refGroupIdToArrayIndex.find(refGroupId) == refGroupIdToArrayIndex.end()) {
+                cout << "ERROR! Alignment " << cmpFile.alnInfo.alignments[alignmentIndex].GetAlignmentId()
+                    << " has ref seq id " << refGroupId << " that does not exist in the HDF file." << endl;
+                assert(0);
+            }
+            else {
+                refGroupArrayIndex = refGroupIdToArrayIndex[refGroupId];
+            }
+
+            //
+            // Point to the refGroup that this alignment is part of.
+            //
+            HDFCmpRefAlignmentGroup* refAlignGroup = refAlignGroups[refGroupArrayIndex];
+
+            //
+            // Now locate the read group that is part of this ref align group.
+            //
+            string readGroupName = alnGroupIdToReadGroupName[alnGroupId]; 
+
+            if (refAlignGroup->experimentNameToIndex.find(readGroupName) ==
+                    refAlignGroup->experimentNameToIndex.end()) {
+                cout << "Internal ERROR! The read group name " << readGroupName << " is specified as part of "
+                    << " the path in alignment " << cmpFile.alnInfo.alignments[alignmentIndex].GetAlignmentId() 
+                    << " though it does not exist in the ref align group specified for this alignment." << endl;
+                assert(0);
+            }
+
+            int experimentIndex;
+            experimentIndex = refAlignGroup->experimentNameToIndex[readGroupName];
+
+            unsigned int alignmentLength = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetEnd() - 
+            cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin();
+
+            vector<unsigned char> alignmentArray;
+            vector<UChar> fieldArray;
+
+            if (alignmentArray.size() < alignmentLength) {
+                alignmentArray.resize(alignmentLength);
+            }
+
+            /* 
+             * Read in the base by base alignment.
+             */
+
+            refAlignGroup->readGroups[experimentIndex]->alignmentArray.Read(cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin(),
+                    cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetEnd(),
+                    &alignmentArray[0]);
+
+            cmpFile.alnInfo.alignments[alignmentIndex].StoreAlignmentArray(&alignmentArray[0], alignmentLength);
+
+            /*
+             * Read in all additional fields such as quality values, etc..
+             */
+            set<string>::iterator fieldIt, fieldEnd;
+            fieldEnd = includedFields.end();
+
+            for (fieldIt = includedFields.begin(); fieldIt != fieldEnd; ++fieldIt) {
+                if (fieldArray.size() < alignmentLength) {
+                    fieldArray.resize(alignmentLength);
+                }
+                HDFArray<UChar>* fieldArrayPtr = dynamic_cast<HDFArray<UChar>* >(refAlignGroup->readGroups[experimentIndex]->fields[*fieldIt]);
+
+                int ob = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin();
+                int oe = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetEnd();
+                fieldArrayPtr->Read(ob, oe, &fieldArray[0]);
+
+                cmpFile.alnInfo.alignments[alignmentIndex].StoreField(*fieldIt, &fieldArray[0], alignmentLength);
+            }
+        }
+    }
+
+    void IncludeField(string fieldName) {
+        if (supportedFields.find(fieldName) == supportedFields.end()) {
+            cout << "ERROR, attempting to include field " << fieldName << " that is not supported." << endl;
+            exit(1);
+        }
+        includedFields.insert(fieldName);
+    }
+
+    template<typename T_Value, typename T_QV>
+        void StoreQualityValueFromAlignment(vector<T_Value> &fieldValues,
+                vector<int> &baseToAlignmentMap,
+                T_QV *qv) {
+            int i;
+            for (i = 0; i < baseToAlignmentMap.size();i++) {
+                qv[i] = fieldValues[baseToAlignmentMap[i]];
+            }
+        }
+    /*
+       void ReadAlignment(int alignmentIndex, CmpAlignment &cmpAlignment) {
+       alnInfoGroup.ReadCmpAlignment(alignmentIndex, cmpAlignment);
+       ReadAlignmentArray(alignmentIndex, cmpAlignment.alignmentArray);
+       }
+       */
+    void ReadAlignment(int alignmentIndex, T_Alignment &alignment) {
+        CmpAlignment cmpAln;
+        ReadAlignment(alignmentIndex, cmpAln);
+
+        string   refSequence;
+        string   readSequence;
+        readSequence.resize(cmpAln.alignmentArray.size());
+        refSequence.resize(cmpAln.alignmentArray.size());
+
+        ByteAlignmentToQueryString(&cmpAln.alignmentArray[0], cmpAln.alignmentArray.size(), &readSequence[0]);
+        ByteAlignmentToRefString(&cmpAln.alignmentArray[0], cmpAln.alignmentArray.size(), &refSequence[0]);         
+        string ungappedRead, ungappedRef;    
+        RemoveGaps(readSequence, ungappedRead);
+        RemoveGaps(refSequence, ungappedRef);
+
+        GappedStringsToAlignment(readSequence, refSequence, alignment);
+        FASTASequence qAlignedSeq, rAlignedSeq;
+        qAlignedSeq.seq = (Nucleotide*) &ungappedRead[0];
+        qAlignedSeq.length = ungappedRead.size();
+        rAlignedSeq.seq = (Nucleotide*) &ungappedRef[0];
+        rAlignedSeq.length = ungappedRef.size();
+
+        alignment.tAlignedSeq.Copy(rAlignedSeq);
+        alignment.qAlignedSeq.Copy(qAlignedSeq);
+
+        unsigned int qStart = cmpAln.GetQueryStart();
+        unsigned int tStart = cmpAln.GetRefStart();
+
+        alignment.tPos = cmpAln.GetRefStart();
+        alignment.qPos = cmpAln.GetQueryStart();
+        alignment.nIns   = cmpAln.GetNInsertions();
+        alignment.nDel   = cmpAln.GetNDeletions();
+        alignment.nMatch = cmpAln.GetNMatch();
+        alignment.nMismatch=cmpAln.GetNMismatch();
+        alignment.qStrand= 0;
+        alignment.tStrand = cmpAln.GetTStrand();
+        alignment.pctSimilarity = ((float)alignment.nMatch) / (alignment.nMatch + alignment.nMismatch + alignment.nIns + alignment.nDel);
+        alignment.mapQV  = cmpAln.GetMapQV();
+    }
+
+    void ReadAlignmentArray(int alignmentIndex, ByteAlignment &alignmentArray) {
+        CmpAlignment cmpAlignment;
+        alnInfoGroup.ReadCmpAlignment(alignmentIndex, cmpAlignment);
+
+        //
+        // Cache some stats about the read, and where it was aligned to.
+        //
+        int queryStart = cmpAlignment.GetQueryStart();
+        int queryEnd   = cmpAlignment.GetQueryEnd();
+        int refGroupId = cmpAlignment.GetRefGroupId();
+        int alnGroupId = cmpAlignment.GetAlnGroupId();
+
+        int refGroupIndex    = refGroupIdToArrayIndex[refGroupId];
+        if (alnGroupIdToReadGroupName.find(alnGroupId) == 
+                alnGroupIdToReadGroupName.end()) {
+            cout << "INTERNAL ERROR! Could not find read group name for alignment "
+                << "group with Id " << alnGroupId << "." << endl;
+            assert(0);
+        }
+        string readGroupName = alnGroupIdToReadGroupName[alnGroupId]; 
+        if (refAlignGroups[refGroupIndex]->experimentNameToIndex.find(readGroupName) ==
+                refAlignGroups[refGroupIndex]->experimentNameToIndex.end()) {
+            cout << "Internal ERROR! The read group name " << readGroupName << " is specified as part of "
+                << " the path in alignment " << alignmentIndex
+                << " though it does not exist in the ref align group specified for this alignment." << endl;
+            assert(0);
+        }
+        int readGroupIndex   = refAlignGroups[refGroupIndex]->experimentNameToIndex[readGroupName];
+
+        HDFCmpExperimentGroup* expGroup = refAlignGroups[refGroupIndex]->readGroups[readGroupIndex];
+
+        int offsetBegin = cmpAlignment.GetOffsetBegin();
+        int offsetEnd   = cmpAlignment.GetOffsetEnd();
+
+        int alignedSequenceLength = offsetEnd - offsetBegin;
+
+        if (alignedSequenceLength >= 0) {
+            alignmentArray.resize(alignedSequenceLength);
+        }
+        else {
+            return;
+        }
+        //
+        // Read the alignment string.  All alignments 
+        //
+        refAlignGroups[refGroupIndex]->readGroups[readGroupIndex]->alignmentArray.Read(offsetBegin, 
+                offsetEnd, 
+                &alignmentArray[0]);
+    }
+
+    void ImportReadFromCmpH5(int alignmentIndex, CmpAlignment &cmpAlignment, SMRTSequence &read) {
+        alnInfoGroup.ReadCmpAlignment(alignmentIndex, cmpAlignment);
+
+        //
+        // Cache some stats about the read, and where it was aligned to.
+        //
+        int queryStart = cmpAlignment.GetQueryStart();
+        int queryEnd   = cmpAlignment.GetQueryEnd();
+        read.holeNumber = cmpAlignment.GetHoleNumber();
+        int refGroupId = cmpAlignment.GetRefGroupId();
+        int alnGroupId = cmpAlignment.GetAlnGroupId();
+        int refGroupIndex  = refGroupIdToArrayIndex[refGroupId];
+        if (alnGroupIdToReadGroupName.find(alnGroupId) == alnGroupIdToReadGroupName.end()) {
+            cout << "INTERNAL ERROR! Could not find read group name for alignment "
+                << "group with Id " << alnGroupId << "." << endl;
+            assert(0);
+        }
+        string readGroupName = alnGroupIdToReadGroupName[alnGroupId];
+
+        if (refAlignGroups[refGroupIndex]->experimentNameToIndex.find(readGroupName) ==
+                refAlignGroups[refGroupIndex]->experimentNameToIndex.end()) {
+            cout << "Internal ERROR! The read group name " << readGroupName << " is specified as part of "
+                << " the path in alignment " << alignmentIndex
+                << " though it does not exist in the ref align group specified for this alignment." << endl;
+            assert(0);
+        }
+
+        int readGroupIndex = refAlignGroups[refGroupIndex]->experimentNameToIndex[readGroupName];
+        HDFCmpExperimentGroup* expGroup = refAlignGroups[refGroupIndex]->readGroups[readGroupIndex];
+
+        int offsetBegin = cmpAlignment.GetOffsetBegin();
+        int offsetEnd   = cmpAlignment.GetOffsetEnd();
+
+        int alignedSequenceLength = offsetEnd - offsetBegin;
+        string   alignedSequence;
+        string   readSequence;
+        vector<unsigned char> byteAlignment;
+
+        if (alignedSequenceLength >= 0) {
+            alignedSequence.resize(alignedSequenceLength);
+            byteAlignment.resize(alignedSequenceLength);
+        }
+
+        //
+        // Read the alignment string.  All alignments 
+        //
+        refAlignGroups[refGroupIndex]->readGroups[readGroupIndex]->alignmentArray.Read(offsetBegin, 
+                offsetEnd, 
+                &byteAlignment[0]);
+
+        //
+        // Convert to something we can compare easily.
+        //
+        ByteAlignmentToQueryString(&byteAlignment[0], byteAlignment.size(), &alignedSequence[0]);
+
+
+        // 
+        // Initialize the sequence of the read.
+        //
+        RemoveGaps(alignedSequence, readSequence);
+
+        //
+        // Make space for the sequence and all fields.
+        //
+        read.length = readSequence.size();
+        read.Allocate(read.length);
+        memcpy(read.seq, readSequence.c_str(), readSequence.size() * sizeof(char));
+
+        vector<int> baseToAlignmentMap;
+        CreateSequenceToAlignmentMap(byteAlignment, baseToAlignmentMap);
+
+        //
+        // Read in the quality values
+        //
+
+
+        vector<unsigned char> storedQVArray;
+
+        vector<UChar> qvValues;
+        vector<HalfWord> frameValues;
+        int length = offsetEnd - offsetBegin;
+        qvValues.resize(length);
+        frameValues.resize(length);
+        int i;
+
+
+        if (expGroup->experimentGroup.ContainsObject("QualityValue")) {
+            expGroup->qualityValue.Read(offsetBegin, offsetEnd, &qvValues[0]);
+            StoreQualityValueFromAlignment(qvValues, baseToAlignmentMap, &read.qual.data[0]);
+            int i;
+            for (i= 0; i < read.length; i++) {
+                assert(read.qual[i] < 100);
+            }
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("InsertionQV")) {
+            expGroup->insertionQV.Read(offsetBegin, offsetEnd, &qvValues[0]);
+            StoreQualityValueFromAlignment(qvValues, baseToAlignmentMap, &read.insertionQV.data[0]);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("SubstitutionQV")) {
+            expGroup->substitutionQV.Read(offsetBegin, offsetEnd, &qvValues[0]);
+            StoreQualityValueFromAlignment(qvValues, baseToAlignmentMap, &read.substitutionQV.data[0]);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("DeletionQV")) {
+            expGroup->deletionQV.Read(offsetBegin, offsetEnd, &qvValues[0]);
+            StoreQualityValueFromAlignment(qvValues, baseToAlignmentMap, &read.deletionQV.data[0]);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("DeletionTag")) {
+            vector<char> deletionTagValues;
+            deletionTagValues.resize(offsetEnd-offsetBegin);
+            expGroup->deletionTag.Read(offsetBegin, offsetEnd, &deletionTagValues[0]);
+            StoreQualityValueFromAlignment(deletionTagValues, baseToAlignmentMap, read.deletionTag);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("SubstitutionTag")) {
+            vector<char> substitutionTagValues;
+            substitutionTagValues.resize(offsetEnd-offsetBegin);
+            expGroup->substitutionTag.Read(offsetBegin, offsetEnd, &substitutionTagValues[0]);
+            StoreQualityValueFromAlignment(substitutionTagValues, baseToAlignmentMap, read.substitutionTag);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("PulseIndex")) {
+            vector<uint32_t> pulseIndexValues;
+            pulseIndexValues.resize(offsetEnd-offsetBegin);
+            expGroup->pulseIndex.Read(offsetBegin, offsetEnd, &pulseIndexValues[0]);
+            StoreQualityValueFromAlignment(pulseIndexValues, baseToAlignmentMap, read.pulseIndex);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("PreBaseFrames")) {
+            expGroup->preBaseFrames.Read(offsetBegin, offsetEnd, &frameValues[0]);
+            StoreQualityValueFromAlignment(frameValues, baseToAlignmentMap, read.preBaseFrames);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("WidthInFrames")) {
+            expGroup->widthInFrames.Read(offsetBegin, offsetEnd, &frameValues[0]);
+            StoreQualityValueFromAlignment(frameValues, baseToAlignmentMap, read.widthInFrames);
+        }
+
+    }
+
+    void ReadReadGroupPathTable(CmpIndexedStringTable &readGroupPathTable) {
+        UInt numElem = readGroupPathTable.ids.size();
+        readGroupPathTable.resize(numElem); // resizes all tables
+        readGroupPathIdArray.Read(0, numElem, &readGroupPathTable.ids[0]);
+        readGroupPathArray.Read(0, numElem, &readGroupPathTable.names[0]);
+        readGroupPathTable.StoreArrayIndexMap();
+    }
+
+    void ReadRefSeqTable(CmpIndexedStringTable &refSeqTable) {
+        UInt numElem = refSeqTable.ids.size();
+        refSeqTable.resize(numElem);
+        refSeqNameIdArray.Read(0, numElem, &refSeqTable.ids[0]);
+        refSeqNameArray.Read(0, numElem, &refSeqTable.names[0]);
+        refSeqTable.StoreArrayIndexMap();
+    }
+
+    void ReadMovieNameTable(CmpIndexedStringTable &movieTable) {
+        UInt numElem = movieTable.ids.size();
+        movieTable.resize(numElem);
+        movieNameIdArray.Read(0, numElem, &movieTable.ids[0]);
+        movieNameArray.Read(0,   numElem, &movieTable.names[0]);
+        movieTable.StoreArrayIndexMap();
+    }
+
+    // Store reference FullName, ID, Length and MD5 to /RefInfo 
+    unsigned int AddRefInfo(string refName, unsigned int length, string md5) {
+        return refInfoGroup.AddRefInfo(refName, length, md5);
+    }
+    
+    unsigned int AddRefGroup(string refName, unsigned int refInfoId,
+        string & refGroupName) {
+        if (refInfoId > 999999) {
+            // ref000001 ~ ref999999
+            cout << "ERROR. Could not store more than 999999 references in " 
+                 << " a cmp.h5 file." << endl;
+            exit(1);
+        } 
+
+        // Adding a new refGroup requires:
+        // 1. Creating a new refgroup name, e.g., /ref000001.
+        // 2. Create the new reference group to add alignments to.
+        // 3. Adding this new name to the set of paths of ref groups.
+        // 4. Adding information for this ref group.
+ 
+        // 1.
+        GenerateRefGroupName(refInfoId, refGroupName);
+        
+        // 2.
+        HDFCmpRefAlignmentGroup *newGroup = new HDFCmpRefAlignmentGroup;
+        newGroup->Create(rootGroup.rootGroup, refGroupName);
+        refAlignGroups.push_back(newGroup);
+
+        // 3.
+        unsigned int refGroupId = refGroupGroup.AddPath("/" + refGroupName, refInfoId);
+
+        // 4.
+        refGroupIdToArrayIndex[refGroupId] = refGroupId - 1;
+        refNameToArrayIndex[refName] = refGroupId - 1;
+
+        return refGroupId;
+    }
+
+    void GenerateRefGroupName(unsigned int refInfoId, string & name) { 
+        // In order to mimic the behaviour of compareSequences, 
+        // refGroupName should equal to ref00000x, where x is refInfoId.
+        // (x used to be refGroupIdToArrayIndex.size() + 1)
+        stringstream nameStrm;
+        nameStrm << "ref";
+        nameStrm.width(6);
+        nameStrm.fill('0');
+        nameStrm << right << refInfoId;
+        name = nameStrm.str();
+    }
+
+};
+
+#endif
diff --git a/libcpp/hdf/HDFCmpReader.hpp b/libcpp/hdf/HDFCmpReader.hpp
new file mode 100644
index 0000000..f12d2e6
--- /dev/null
+++ b/libcpp/hdf/HDFCmpReader.hpp
@@ -0,0 +1,663 @@
+#ifndef _BLASR_HDF_CMP_READER_HPP_
+#define _BLASR_HDF_CMP_READER_HPP_
+
+#include "H5Cpp.h"
+#include <iostream>
+#include <assert.h>
+#include "datastructures/alignment/CmpFile.h"
+#include "datastructures/alignment/Alignment.h"
+#include "datastructures/alignment/AlignmentCandidate.h"
+#include "datastructures/alignment/CmpAlignment.h"
+#include "datastructures/alignment/CmpReadGroupTable.h"
+#include "datastructures/alignment/CmpRefSeqTable.h"
+#include "datastructures/alignment/ByteAlignment.h"
+#include "data/hdf/HDFAtom.h"
+#include "data/hdf/HDFArray.h"
+#include "data/hdf/HDF2DArray.h"
+#include "data/hdf/HDFCmpData.h"
+#include "data/hdf/HDFCmpRefAlignmentGroup.h"
+#include "data/hdf/HDFCmpExperimentGroup.h"
+#include "HDFAlnGroupGroup.h"
+#include "HDFAlnInfoGroup.h"
+#include "HDFRefGroupGroup.h"
+#include "HDFRefInfoGroup.h"
+#include "HDFMovieInfoGroup.h"
+#include "HDFCmpRootGroup.h"
+#include "HDFCmpSupportedFields.h"
+#include "SMRTSequence.h"
+#include <sstream>
+#include <map>
+
+using namespace H5;
+using namespace std;
+
+template <typename T_Alignment>
+class HDFCmpReader : public HDFCmpData {
+public:
+    map<int,int>  movieNameIdToArrayIndex,  readGroupPathIdToArrayIndex, refGroupIdToArrayIndex;
+    map<string,string> readGroupPathToReadGroup;
+    HDFAlnGroupGroup alnGroupGroup;
+    HDFAlnInfoGroup alnInfoGroup;
+    HDFMovieInfoGroup movieInfoGroup;
+    HDFRefGroupGroup refGroupGroup;
+    HDFRefInfoGroup refInfoGroup;
+    HDFCmpRootGroup<T_Alignment> rootGroup;
+    set<string> includedFields;
+    HDFCmpSupportedFields supportedFields;
+    HDFAtom<string> readTypeAtom;
+
+    void AstroInitializeColumnNameMap() {
+        CmpAlignmentBase::columnNameToIndex["AlignmentId"] = 0;
+        CmpAlignmentBase::columnNameToIndex["ReadGroupId"] = 1;
+        CmpAlignmentBase::columnNameToIndex["MovieId"] = 2;
+        CmpAlignmentBase::columnNameToIndex["RefSeqId"] = 3;
+        CmpAlignmentBase::columnNameToIndex["tStart"] = 4;
+        CmpAlignmentBase::columnNameToIndex["tEnd"] = 5;
+        CmpAlignmentBase::columnNameToIndex["AlignedStrand"] = 6;
+        CmpAlignmentBase::columnNameToIndex["ExpId"] = 7;
+        CmpAlignmentBase::columnNameToIndex["RunId"] = 8;
+        CmpAlignmentBase::columnNameToIndex["Panel"] = 9;
+        CmpAlignmentBase::columnNameToIndex["x"] = 10;
+        CmpAlignmentBase::columnNameToIndex["y"] = 11;
+        CmpAlignmentBase::columnNameToIndex["SubreadId"] = 12;
+        CmpAlignmentBase::columnNameToIndex["rStart"] = 13;
+        CmpAlignmentBase::columnNameToIndex["rEnd"] = 14;
+        CmpAlignmentBase::columnNameToIndex["Z"] = 15;
+        CmpAlignmentBase::columnNameToIndex["nM"] = 16;
+        CmpAlignmentBase::columnNameToIndex["nMM"] = 17;
+        CmpAlignmentBase::columnNameToIndex["nIns"] = 18;
+        CmpAlignmentBase::columnNameToIndex["nDel"] = 19;
+        CmpAlignmentBase::columnNameToIndex["offset_begin"] = 20;
+        CmpAlignmentBase::columnNameToIndex["offset_end"] = 21;
+    }
+
+    void SpringfieldInitializeColumnNameMap() {
+        CmpAlignmentBase::columnNameToIndex["AlignmentId"] = 0;
+        CmpAlignmentBase::columnNameToIndex["ReadGroupId"] = 1;
+        CmpAlignmentBase::columnNameToIndex["AlnGroupID"] = 1;
+        CmpAlignmentBase::columnNameToIndex["AlnGroupId"] = 1;
+        CmpAlignmentBase::columnNameToIndex["MovieId"] = 2;
+        CmpAlignmentBase::columnNameToIndex["RefSeqId"] = 3;
+        CmpAlignmentBase::columnNameToIndex["tStart"] = 4;
+        CmpAlignmentBase::columnNameToIndex["tEnd"] = 5;
+        CmpAlignmentBase::columnNameToIndex["RCRefStrand"] = 6;
+        CmpAlignmentBase::columnNameToIndex["HoleNumber"] = 7;
+        CmpAlignmentBase::columnNameToIndex["SetNumber"] = 8;
+        CmpAlignmentBase::columnNameToIndex["StrobeNumber"] = 9;
+        CmpAlignmentBase::columnNameToIndex["SubreadId"] = 10;
+        CmpAlignmentBase::columnNameToIndex["rStart"] = 11;
+        CmpAlignmentBase::columnNameToIndex["rEnd"] = 12;
+        CmpAlignmentBase::columnNameToIndex["MapQV"] = 13;
+        CmpAlignmentBase::columnNameToIndex["nM"] = 14;
+        CmpAlignmentBase::columnNameToIndex["nMM"] = 15;
+        CmpAlignmentBase::columnNameToIndex["nIns"] = 16;
+        CmpAlignmentBase::columnNameToIndex["nDel"] = 17;
+        CmpAlignmentBase::columnNameToIndex["offset_begin"] = 18;
+        CmpAlignmentBase::columnNameToIndex["offset_end"] = 19;
+        CmpAlignmentBase::columnNameToIndex["nBackRead"] = 20;
+        CmpAlignmentBase::columnNameToIndex["nReadOverlap"] = 21;
+
+        // All synonyms, the code requiring these should be refactored so
+        // that it no synonyms are needed.
+        //
+        CmpAlignmentBase::columnNameToIndex["AlnID"] = 0;
+        CmpAlignmentBase::columnNameToIndex["AlnGroupID"] = 1;
+        CmpAlignmentBase::columnNameToIndex["MovieID"] = 2;
+        CmpAlignmentBase::columnNameToIndex["RefGroupID"] = 3;
+        CmpAlignmentBase::columnNameToIndex["RefGroupId"] = 3;
+        CmpAlignmentBase::columnNameToIndex["MoleculeID"] = 10;
+        CmpAlignmentBase::columnNameToIndex["Offset_begin"] = 18;
+        CmpAlignmentBase::columnNameToIndex["Offset_end"] = 19;
+
+    }
+
+
+    int Initialize(string &hdfCmpFileName, set<string> includedFieldsP, unsigned int flags=H5F_ACC_RDONLY, const H5::FileAccPropList & fileAccPropList=H5::FileAccPropList::DEFAULT) {
+        Initialize(hdfCmpFileName, flags, fileAccPropList);
+        includedFields = includedFieldsP;
+    }
+
+    int Initialize(string &hdfCmpFileName, unsigned int flags=H5F_ACC_RDONLY, const H5::FileAccPropList & fileAccPropList=H5::FileAccPropList::DEFAULT) {
+        /*
+         * Initialize access to the HDF file.
+         */
+        try {
+            hdfCmpFile.openFile(hdfCmpFileName.c_str(), flags, fileAccPropList);
+        }
+        catch (Exception &e) {
+            cout << e.getDetailMsg() << endl;
+            return 0;
+        }
+
+        rootGroup.Initialize(hdfCmpFile);
+        readTypeAtom.Initialize(rootGroup.rootGroup, "ReadType");
+
+        if (alnGroupGroup.Initialize(rootGroup.rootGroup) == 0)  {
+            cout << "ERROR, could not read AlnGroup of the cmp file." << endl;
+            exit(1);
+        }
+        if (refInfoGroup.Initialize(rootGroup.rootGroup) == 0)   {
+            cout << "ERROR, could not read RefInfo of the cmp file." << endl;
+            exit(1);
+        }
+        if (refGroupGroup.Initialize(rootGroup.rootGroup) == 0)  {
+            cout << "ERROR, could not read RefGroup of the cmp file." << endl;
+            exit(1);
+        }
+        if (movieInfoGroup.Initialize(rootGroup.rootGroup) == 0) {
+            cout << "ERROR, could not read MovieInfo of the cmp file." << endl;
+            exit(1);
+        }
+        if (alnInfoGroup.Initialize(rootGroup.rootGroup) == 0)   {
+            cout << "ERROR, could not read AlnInfo of the cmp file." << endl;
+            exit(1);
+        }
+        if (fileLogGroup.Initialize(rootGroup.rootGroup)   == 0) { 
+            cout << "ERROR, could not read FileLog of the cmp file." << endl;
+            exit(1);
+        }
+
+        SpringfieldInitializeColumnNameMap();    
+
+        return 1;
+    }
+
+    unsigned int GetAlignmentIndexSize() {
+        if (alnInfoGroup.alnInfoGroup.groupIsInitialized == false) {
+            cout << "ERROR, getting the size of an index before initializing the cmp.h5 file." << endl;
+            exit(1);
+        }
+        return alnInfoGroup.alnIndexArray.GetNRows();
+    }
+
+    // Add synonym 
+    unsigned int GetNAlignments() {
+        return GetAlignmentIndexSize();
+    }
+
+    static void ParseReadGroupPath(string &path, string &refName, string &readGroupName){ 
+        int delimPos;
+        delimPos = path.find_last_of('/');
+        if (delimPos != path.npos) {
+            refName = path.substr(0, delimPos);
+            //
+            // Check the ref name to see if it has a preceeding '/'
+            //
+            readGroupName = path.substr(delimPos+1, path.size());
+        } 
+        else {
+            refName ="";
+            readGroupName = "";
+        }
+    }
+
+    void StorePlatformId(CmpFile &cmpFile) {
+        //
+        // For now, hard wire as a springfield.  Later if the fields
+        // change per platform, this may be updated.
+        //
+        cmpFile.platformId = Springfield;
+    }
+
+    void ReadAlignmentDescriptions(CmpFile &cmpFile) {
+
+        //
+        // Gather run information.
+        //
+        rootGroup.ReadAttributes(cmpFile);
+
+        string readTypeString;
+        readTypeAtom.Read(readTypeString);
+        cmpFile.StoreReadType(readTypeString);
+        //
+        // Read in the groups that describe what alignments are present.
+        //
+
+        alnGroupGroup.Read(cmpFile.alnGroup);
+        alnInfoGroup.Read(cmpFile.alnInfo);
+        refGroupGroup.Read(cmpFile.refGroup);
+        movieInfoGroup.Read(cmpFile.movieInfo);
+        refInfoGroup.Read(cmpFile.refInfo);
+        StorePlatformId(cmpFile);
+
+    }
+
+    void ReadStructure(CmpFile &cmpFile) {
+        //
+        // Now for every reference group in the cmp file, create a group.
+        //
+        map<string,int> refNameToArrayIndex;
+
+        unsigned int refSeqIndex;
+
+        for (refSeqIndex = 0; refSeqIndex < cmpFile.refGroup.path.size(); refSeqIndex++) {
+            HDFCmpRefAlignmentGroup* refAlignGroup;
+            refAlignGroup = new HDFCmpRefAlignmentGroup;
+            refAlignGroup->Initialize(rootGroup.rootGroup.group, cmpFile.refGroup.path[refSeqIndex]);
+            int refAlignGroupIndex = refAlignGroups.size();
+            refAlignGroups.push_back(refAlignGroup);
+            //
+            // Allow one to index directly into this group given a string
+            // representing the reference name.
+            //
+            refNameToArrayIndex[cmpFile.refGroup.path[refSeqIndex]] = refAlignGroupIndex;
+            refGroupIdToArrayIndex[cmpFile.refGroup.id[refSeqIndex]] = refAlignGroupIndex;
+        }
+
+        // 
+        // Now that all ref groups are created, add read groups that
+        // are aligned to the ref groups.
+        //
+        // Note that groups are not necessarily named by movie, especially in 
+        // a deep-sorted cmp.h5, read groups may look like:
+        // /ref00001/rg8953-0
+        // /ref00001/rg2453-1
+        //
+        unsigned int alnGroupIndex;
+        for (alnGroupIndex = 0; alnGroupIndex < cmpFile.alnGroup.path.size(); alnGroupIndex++) {
+            string refName, readGroupName;
+            ParseReadGroupPath(cmpFile.alnGroup.path[alnGroupIndex], refName, readGroupName);
+
+            //
+            // Create an index that maps alnGroupId (/AlnGroup/Id) to readGroupName
+            //
+            alnGroupIdToReadGroupName[cmpFile.alnGroup.id[alnGroupIndex]] = readGroupName;
+
+            //
+            // Look up the group where this alignment should be found.
+            //
+            unsigned int refGroupArrayIndex;
+            if (refNameToArrayIndex.find(refName) != refNameToArrayIndex.end()) {
+                refGroupArrayIndex = refNameToArrayIndex[refName];
+            }
+            else {
+                cout << "ERROR! The reference name '" << refName << "' does not have an entry though it is "
+                    << " specified in the path for " << cmpFile.readGroupTable.names[alnGroupIndex] 
+                    << endl;
+                assert(0);
+            }
+
+            HDFCmpExperimentGroup *alnGroupPtr;
+            alnGroupPtr = refAlignGroups[refGroupArrayIndex]->InitializeExperimentGroup(readGroupName, includedFields);
+            // experimentNameToIndex should have been set in InitializeExperimentGroup();
+            assert( refAlignGroups[refGroupArrayIndex]->experimentNameToIndex[readGroupName] 
+                    == refAlignGroups[refGroupArrayIndex]->readGroups.size()-1);
+            refAlignGroups[refGroupArrayIndex]->experimentNameToIndex[readGroupName] = refAlignGroups[refGroupArrayIndex]->readGroups.size()-1;
+        }
+    }
+
+    void Read(CmpFile &cmpFile) {
+
+        ReadAlignmentDescriptions(cmpFile);
+        ReadStructure(cmpFile);
+
+        /*
+         * Now that the alignment indices are all read in, read the base-by-base alignments.
+         */
+
+        unsigned int alignmentIndex;
+
+        for (alignmentIndex = 0; alignmentIndex < cmpFile.alnInfo.alignments.size(); alignmentIndex++) {
+            unsigned int alnGroupId = cmpFile.alnInfo.alignments[alignmentIndex].GetAlnGroupId();
+            unsigned int refGroupId = cmpFile.alnInfo.alignments[alignmentIndex].GetRefGroupId();
+            string refSeqName;
+
+            //
+            // Make sure the refGroupId specified in the alignment index exists in the alignment groups.
+            //
+            int refGroupArrayIndex;
+            if (refGroupIdToArrayIndex.find(refGroupId) == refGroupIdToArrayIndex.end()) {
+                cout << "ERROR! Alignment " << cmpFile.alnInfo.alignments[alignmentIndex].GetAlignmentId()
+                    << " has ref seq id " << refGroupId << " that does not exist in the HDF file." << endl;
+                assert(0);
+            }
+            else {
+                refGroupArrayIndex = refGroupIdToArrayIndex[refGroupId];
+            }
+
+            //
+            // Point to the refGroup that this alignment is part of.
+            //
+            HDFCmpRefAlignmentGroup* refAlignGroup = refAlignGroups[refGroupArrayIndex];
+
+            //
+            // Now locate the read group that is part of this ref align group.
+            //
+            string readGroupName = alnGroupIdToReadGroupName[alnGroupId]; 
+
+            if (refAlignGroup->experimentNameToIndex.find(readGroupName) ==
+                    refAlignGroup->experimentNameToIndex.end()) {
+                cout << "Internal ERROR! The read group name " << readGroupName << " is specified as part of "
+                    << " the path in alignment " << cmpFile.alnInfo.alignments[alignmentIndex].GetAlignmentId() 
+                    << " though it does not exist in the ref align group specified for this alignment." << endl;
+                assert(0);
+            }
+
+            int experimentIndex;
+            experimentIndex = refAlignGroup->experimentNameToIndex[readGroupName];
+
+            unsigned int alignmentLength = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetEnd() - 
+            cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin();
+
+            vector<unsigned char> alignmentArray;
+            vector<float> fieldArray;
+
+            if (alignmentArray.size() < alignmentLength) {
+                alignmentArray.resize(alignmentLength);
+            }
+
+            /* 
+             * Read in the base by base alignment.
+             */
+
+            refAlignGroup->readGroups[experimentIndex]->alignmentArray.Read(cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin(),
+                    cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetEnd(),
+                    &alignmentArray[0]);
+
+            cmpFile.alnInfo.alignments[alignmentIndex].StoreAlignmentArray(&alignmentArray[0], alignmentLength);
+
+            /*
+             * Read in all additional fields such as quality values, etc..
+             */
+            set<string>::iterator fieldIt, fieldEnd;
+            fieldEnd = includedFields.end();
+
+            for (fieldIt = includedFields.begin(); fieldIt != fieldEnd; ++fieldIt) {
+                if (fieldArray.size() < alignmentLength) {
+                    fieldArray.resize(alignmentLength);
+                }
+                HDFArray<float>* fieldArrayPtr = dynamic_cast<HDFArray<float>* >(refAlignGroup->readGroups[experimentIndex]->fields[*fieldIt]);
+
+                int ob = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin();
+                int oe = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetEnd();
+                fieldArrayPtr->Read(ob, oe, &fieldArray[0]);
+
+                cmpFile.alnInfo.alignments[alignmentIndex].StoreFloatField(*fieldIt, &fieldArray[0], alignmentLength);
+            }
+        }
+    }
+
+    void IncludeField(string fieldName) {
+        if (supportedFields.find(fieldName) == supportedFields.end()) {
+            cout << "ERROR, attempting to include field " << fieldName << " that is not supported." << endl;
+            exit(1);
+        }
+        includedFields.insert(fieldName);
+    }
+
+    template<typename T_Value, typename T_QV>
+        void StoreQualityValueFromAlignment(vector<T_Value> &fieldValues,
+                vector<int> &baseToAlignmentMap,
+                T_QV *qv) {
+            int i;
+            for (i = 0; i < baseToAlignmentMap.size();i++) {
+                qv[i] = fieldValues[baseToAlignmentMap[i]];
+            }
+        }
+
+    void ReadAlignment(int alignmentIndex, CmpAlignment &cmpAlignment) {
+        alnInfoGroup.ReadCmpAlignment(alignmentIndex, cmpAlignment);
+        ReadAlignmentArray(alignmentIndex, cmpAlignment.alignmentArray);
+    }
+
+    void ReadAlignment(int alignmentIndex, AlignmentCandidate<FASTASequence, FASTASequence> &alignment) {
+        CmpAlignment cmpAln;
+        ReadAlignment(alignmentIndex, cmpAln);
+
+        string   refSequence;
+        string   readSequence;
+        readSequence.resize(cmpAln.alignmentArray.size());
+        refSequence.resize(cmpAln.alignmentArray.size());
+
+        ByteAlignmentToQueryString(&cmpAln.alignmentArray[0], cmpAln.alignmentArray.size(), &readSequence[0]);
+        ByteAlignmentToRefString(&cmpAln.alignmentArray[0], cmpAln.alignmentArray.size(), &refSequence[0]);				
+        string ungappedRead, ungappedRef;    
+        RemoveGaps(readSequence, ungappedRead);
+        RemoveGaps(refSequence, ungappedRef);
+
+        GappedStringsToAlignment(readSequence, refSequence, alignment);
+        FASTASequence qAlignedSeq, rAlignedSeq;
+        qAlignedSeq.seq = (Nucleotide*) &ungappedRead[0];
+        qAlignedSeq.length = ungappedRead.size();
+        rAlignedSeq.seq = (Nucleotide*) &ungappedRef[0];
+        rAlignedSeq.length = ungappedRef.size();
+
+        alignment.tAlignedSeq.Copy(rAlignedSeq);
+        alignment.qAlignedSeq.Copy(qAlignedSeq);
+
+        unsigned int qStart = cmpAln.GetQueryStart();
+        unsigned int tStart = cmpAln.GetRefStart();
+
+        alignment.tPos = cmpAln.GetRefStart();
+        alignment.qPos = cmpAln.GetQueryStart();
+        alignment.nIns   = cmpAln.GetNInsertions();
+        alignment.nDel   = cmpAln.GetNDeletions();
+        alignment.nMatch = cmpAln.GetNMatch();
+        alignment.nMismatch=cmpAln.GetNMismatch();
+        alignment.qStrand= 0;
+        alignment.tStrand = cmpAln.GetTStrand();
+        alignment.pctSimilarity = ((float)alignment.nMatch) / (alignment.nMatch + alignment.nMismatch + alignment.nIns + alignment.nDel);
+        alignment.mapQV  = cmpAln.GetMapQV();
+    }
+
+    void ReadAlignmentArray(int alignmentIndex, ByteAlignment &alignmentArray) {
+        CmpAlignment cmpAlignment;
+        alnInfoGroup.ReadCmpAlignment(alignmentIndex, cmpAlignment);
+
+        //
+        // Cache some stats about the read, and where it was aligned to.
+        //
+        int queryStart = cmpAlignment.GetQueryStart();
+        int queryEnd   = cmpAlignment.GetQueryEnd();
+        int refGroupId = cmpAlignment.GetRefGroupId();
+        int alnGroupId = cmpAlignment.GetAlnGroupId();
+
+        int refGroupIndex    = refGroupIdToArrayIndex[refGroupId];
+        if (alnGroupIdToReadGroupName.find(alnGroupId) == 
+                alnGroupIdToReadGroupName.end()) {
+            cout << "INTERNAL ERROR! Could not find read group name for alignment "
+                << "group with Id " << alnGroupId << "." << endl;
+            assert(0);
+        }
+        string readGroupName = alnGroupIdToReadGroupName[alnGroupId]; 
+        if (refAlignGroups[refGroupIndex]->experimentNameToIndex.find(readGroupName) ==
+                refAlignGroups[refGroupIndex]->experimentNameToIndex.end()) {
+            cout << "Internal ERROR! The read group name " << readGroupName << " is specified as part of "
+                << " the path in alignment " << alignmentIndex
+                << " though it does not exist in the ref align group specified for this alignment." << endl;
+            assert(0);
+        }
+        int readGroupIndex   = refAlignGroups[refGroupIndex]->experimentNameToIndex[readGroupName];
+
+        HDFCmpExperimentGroup* expGroup = refAlignGroups[refGroupIndex]->readGroups[readGroupIndex];
+
+        int offsetBegin = cmpAlignment.GetOffsetBegin();
+        int offsetEnd   = cmpAlignment.GetOffsetEnd();
+
+        int alignedSequenceLength = offsetEnd - offsetBegin;
+
+        if (alignedSequenceLength >= 0) {
+            alignmentArray.resize(alignedSequenceLength);
+        }
+        else {
+            return;
+        }
+        //
+        // Read the alignment string.  All alignments 
+        //
+        refAlignGroups[refGroupIndex]->readGroups[readGroupIndex]->alignmentArray.Read(offsetBegin, 
+                offsetEnd, 
+                &alignmentArray[0]);
+    }
+
+    void ImportReadFromCmpH5(int alignmentIndex, SMRTSequence &read) {
+        CmpAlignment cmpAlignment;
+        alnInfoGroup.ReadCmpAlignment(alignmentIndex, cmpAlignment);
+
+        //
+        // Cache some stats about the read, and where it was aligned to.
+        //
+        int queryStart = cmpAlignment.GetQueryStart();
+        int queryEnd   = cmpAlignment.GetQueryEnd();
+        read.holeNumber = cmpAlignment.GetHoleNumber();
+        int refGroupId = cmpAlignment.GetRefGroupId();
+        int alnGroupId = cmpAlignment.GetAlnGroupId();
+        int refGroupIndex  = refGroupIdToArrayIndex[refGroupId];
+        if (alnGroupIdToReadGroupName.find(alnGroupId) == alnGroupIdToReadGroupName.end()) {
+            cout << "INTERNAL ERROR! Could not find read group name for alignment "
+                << "group with Id " << alnGroupId << "." << endl;
+            assert(0);
+        }
+        string readGroupName = alnGroupIdToReadGroupName[alnGroupId];
+
+        if (refAlignGroups[refGroupIndex]->experimentNameToIndex.find(readGroupName) ==
+                refAlignGroups[refGroupIndex]->experimentNameToIndex.end()) {
+            cout << "Internal ERROR! The read group name " << readGroupName << " is specified as part of "
+                << " the path in alignment " << alignmentIndex
+                << " though it does not exist in the ref align group specified for this alignment." << endl;
+            assert(0);
+        }
+
+        int readGroupIndex = refAlignGroups[refGroupIndex]->experimentNameToIndex[readGroupName];
+        HDFCmpExperimentGroup* expGroup = refAlignGroups[refGroupIndex]->readGroups[readGroupIndex];
+
+        int offsetBegin = cmpAlignment.GetOffsetBegin();
+        int offsetEnd   = cmpAlignment.GetOffsetEnd();
+
+        int alignedSequenceLength = offsetEnd - offsetBegin;
+        string   alignedSequence;
+        string   readSequence;
+        vector<unsigned char> byteAlignment;
+
+        if (alignedSequenceLength >= 0) {
+            alignedSequence.resize(alignedSequenceLength);
+            byteAlignment.resize(alignedSequenceLength);
+        }
+
+        //
+        // Read the alignment string.  All alignments 
+        //
+        refAlignGroups[refGroupIndex]->readGroups[readGroupIndex]->alignmentArray.Read(offsetBegin, 
+                offsetEnd, 
+                &byteAlignment[0]);
+
+        //
+        // Convert to something we can compare easily.
+        //
+        ByteAlignmentToQueryString(&byteAlignment[0], byteAlignment.size(), &alignedSequence[0]);
+
+
+        // 
+        // Initialize the sequence of the read.
+        //
+        RemoveGaps(alignedSequence, readSequence);
+
+        //
+        // Make space for the sequence and all fields.
+        //
+        read.length = readSequence.size();
+        read.Allocate(read.length);
+        memcpy(read.seq, readSequence.c_str(), readSequence.size() * sizeof(char));
+
+        vector<int> baseToAlignmentMap;
+        CreateSequenceToAlignmentMap(byteAlignment, baseToAlignmentMap);
+
+        //
+        // Read in the quality values
+        //
+
+
+        vector<unsigned char> storedQVArray;
+
+        vector<UChar> qvValues;
+        vector<HalfWord> frameValues;
+        int length = offsetEnd - offsetBegin;
+        qvValues.resize(length);
+        frameValues.resize(length);
+        int i;
+
+
+        if (expGroup->experimentGroup.ContainsObject("QualityValue")) {
+            expGroup->qualityValue.Read(offsetBegin, offsetEnd, &qvValues[0]);
+            StoreQualityValueFromAlignment(qvValues, baseToAlignmentMap, &read.qual.data[0]);
+            int i;
+            for (i= 0; i < read.length; i++) {
+                assert(read.qual[i] < 100);
+            }
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("InsertionQV")) {
+            expGroup->insertionQV.Read(offsetBegin, offsetEnd, &qvValues[0]);
+            StoreQualityValueFromAlignment(qvValues, baseToAlignmentMap, &read.insertionQV.data[0]);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("SubstitutionQV")) {
+            expGroup->substitutionQV.Read(offsetBegin, offsetEnd, &qvValues[0]);
+            StoreQualityValueFromAlignment(qvValues, baseToAlignmentMap, &read.substitutionQV.data[0]);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("DeletionQV")) {
+            expGroup->deletionQV.Read(offsetBegin, offsetEnd, &qvValues[0]);
+            StoreQualityValueFromAlignment(qvValues, baseToAlignmentMap, &read.deletionQV.data[0]);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("DeletionTag")) {
+            vector<char> deletionTagValues;
+            deletionTagValues.resize(offsetEnd-offsetBegin);
+            expGroup->deletionTag.Read(offsetBegin, offsetEnd, &deletionTagValues[0]);
+            StoreQualityValueFromAlignment(deletionTagValues, baseToAlignmentMap, read.deletionTag);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("SubstitutionTag")) {
+            vector<char> substitutionTagValues;
+            substitutionTagValues.resize(offsetEnd-offsetBegin);
+            expGroup->substitutionTag.Read(offsetBegin, offsetEnd, &substitutionTagValues[0]);
+            StoreQualityValueFromAlignment(substitutionTagValues, baseToAlignmentMap, read.substitutionTag);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("PulseIndex")) {
+            vector<uint32_t> pulseIndexValues;
+            pulseIndexValues.resize(offsetEnd-offsetBegin);
+            expGroup->pulseIndex.Read(offsetBegin, offsetEnd, &pulseIndexValues[0]);
+            StoreQualityValueFromAlignment(pulseIndexValues, baseToAlignmentMap, read.pulseIndex);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("PreBaseFrames")) {
+            expGroup->preBaseFrames.Read(offsetBegin, offsetEnd, &frameValues[0]);
+            StoreQualityValueFromAlignment(frameValues, baseToAlignmentMap, read.preBaseFrames);
+        }
+
+        if (expGroup->experimentGroup.ContainsObject("WidthInFrames")) {
+            expGroup->widthInFrames.Read(offsetBegin, offsetEnd, &frameValues[0]);
+            StoreQualityValueFromAlignment(frameValues, baseToAlignmentMap, read.widthInFrames);
+        }
+
+    }
+
+    void ReadReadGroupPathTable(CmpIndexedStringTable &readGroupPathTable) {
+        UInt numElem = readGroupPathTable.ids.size();
+        readGroupPathTable.resize(numElem); // resizes all tables
+        readGroupPathIdArray.Read(0, numElem, &readGroupPathTable.ids[0]);
+        readGroupPathArray.Read(0, numElem, &readGroupPathTable.names[0]);
+        readGroupPathTable.StoreArrayIndexMap();
+    }
+
+    void ReadRefSeqTable(CmpIndexedStringTable &refSeqTable) {
+        UInt numElem = refSeqTable.ids.size();
+        refSeqTable.resize(numElem);
+        refSeqNameIdArray.Read(0, numElem, &refSeqTable.ids[0]);
+        refSeqNameArray.Read(0, numElem, &refSeqTable.names[0]);
+        refSeqTable.StoreArrayIndexMap();
+    }
+
+    void ReadMovieNameTable(CmpIndexedStringTable &movieTable) {
+        UInt numElem = movieTable.ids.size();
+        movieTable.resize(numElem);
+        movieNameIdArray.Read(0, numElem, &movieTable.ids[0]);
+        movieNameArray.Read(0,   numElem, &movieTable.names[0]);
+        movieTable.StoreArrayIndexMap();
+    }
+
+};
+
+#endif
diff --git a/libcpp/hdf/HDFCmpRefAlignmentGroup.hpp b/libcpp/hdf/HDFCmpRefAlignmentGroup.hpp
new file mode 100644
index 0000000..69650ec
--- /dev/null
+++ b/libcpp/hdf/HDFCmpRefAlignmentGroup.hpp
@@ -0,0 +1,102 @@
+#ifndef _BLASR_HDF_CMP_REF_ALIGNMENT_GROUP_HPP_
+#define _BLASR_HDF_CMP_REF_ALIGNMENT_GROUP_HPP_
+
+#include <map>
+#include <string>
+#include "H5Cpp.h"
+#include "HDFData.hpp"
+#include "HDFGroup.hpp"
+#include "HDFCmpExperimentGroup.hpp"
+
+using namespace std;
+
+class HDFCmpRefAlignmentGroup {
+ public:
+	HDFGroup  refGroup;
+	string refGroupName;
+	vector<HDFCmpExperimentGroup*> readGroups;
+	HDFAtom<string> annotationStringAtom;
+	map<string,int> experimentNameToIndex;
+    // A RefAlignmentGroup may contain one or more 
+    // ExperimentGroups. The following shows a 
+    // RefAlignmentGroup containing two ExperimentGroups.
+    // /ref00001/m121219_103658_42194_c000447032559900001500000112311426_s1_p0
+    // /ref00001/m121219_103658_42194_c000447032559900001500000112311426_s2_p0
+    //
+    // But these ExperimentGroups are not necessarily
+    // grouped by movie. For example, the following groups
+    // can be seen in deep-sorted cmp.h5
+    // /ref00001/rg8953-0
+    // /ref00001/rg2453-1
+
+	int Initialize(H5::CommonFG &group, string _refGroupName) {
+		refGroupName = _refGroupName;
+		refGroup.Initialize(group, _refGroupName);
+		//		annotationStringAtom.Initialize(refGroup.group, "annotationString");
+	}
+
+  void Create(HDFGroup parent, string refGroupNameP) {
+    refGroupName = refGroupNameP;
+    parent.AddGroup(refGroupName);
+    refGroup.Initialize(parent, refGroupName);
+  }
+
+  HDFCmpExperimentGroup *GetExperimentGroup(string readGroupName) {
+    //
+    // In contrast to initialization, only create one group.
+    //
+    map<string,int>::iterator it = experimentNameToIndex.find(readGroupName);
+		if (it != experimentNameToIndex.end()) {
+      assert(it->second < readGroups.size());
+      return readGroups[it->second];
+    }
+
+    //
+    // Allocate the new group structure
+    //
+    int newReadGroupIndex = readGroups.size();
+    HDFCmpExperimentGroup* readGroupPtr = new HDFCmpExperimentGroup;
+    readGroups.push_back(readGroupPtr);
+    experimentNameToIndex[readGroupName] = newReadGroupIndex;
+
+    //
+    // Now add it to the cmp.h5 file.
+    //
+    if (readGroupPtr->Create(refGroup, readGroupName) == 0) {
+      delete readGroupPtr;
+      experimentNameToIndex[readGroupName] = -1;
+      return NULL;
+    }
+    return readGroupPtr;
+  }
+
+  bool ContainsExperimentGroup(string readGroupName) {
+    return experimentNameToIndex.find(readGroupName) != experimentNameToIndex.end();
+  }
+
+	HDFCmpExperimentGroup* InitializeExperimentGroup(string experimentGroupName, set<string> &includedFields) {
+		if (refGroup.ContainsObject(experimentGroupName)) {
+			HDFCmpExperimentGroup* newGroup = new HDFCmpExperimentGroup;
+
+			if (newGroup->Initialize(refGroup, experimentGroupName, includedFields) == 0) {
+				cout << "ERROR, could not initialize the exp group." << endl;
+				exit(1);
+			}
+			experimentNameToIndex[experimentGroupName] = readGroups.size();
+			readGroups.push_back(newGroup);
+			return newGroup;
+		}
+		else {
+			return NULL;
+		}
+	}
+
+  
+	HDFCmpExperimentGroup* InitializeExperimentGroup(string experimentGroupName) {
+    set<string> EMPTYIncludedFields;
+    return InitializeExperimentGroup(experimentGroupName, EMPTYIncludedFields);
+	}
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFCmpRootGroup.hpp b/libcpp/hdf/HDFCmpRootGroup.hpp
new file mode 100644
index 0000000..d84084f
--- /dev/null
+++ b/libcpp/hdf/HDFCmpRootGroup.hpp
@@ -0,0 +1,66 @@
+#ifndef _BLASR_HDF_CMP_ROOT_GROUP_HPP_
+#define _BLASR_HDF_CMP_ROOT_GROUP_HPP_
+
+#include "HDFAtom.hpp"
+#include "HDF2DArray.hpp"
+#include "datastructures/alignment/CmpFile.hpp"
+template <typename T_Alignment>
+class HDFCmpRootGroup {
+ public:
+	HDFGroup rootGroup;
+	HDFAtom<string> version;
+	HDFAtom<string> index;
+	HDFAtom<string> readType;
+	HDFAtom<string> commandLine;
+	HDF2DArray<string> fileLog;
+
+	~HDFCmpRootGroup() {
+		rootGroup.Close();
+	}
+
+	int Initialize(H5::H5File &cmpFile) {
+		if (rootGroup.Initialize(cmpFile, "/") == 0) { return 0; }
+		if (rootGroup.ContainsObject("Version")) {
+			if (version.Initialize(rootGroup.group, "Version") == 0) { return 0; }		
+		}
+		if (rootGroup.ContainsObject("Index")) {
+			if (index.Initialize(rootGroup.group, "Index") == 0) { return 0; }
+		}
+		if (rootGroup.ContainsObject("ReadType")) {
+			if (readType.Initialize(rootGroup.group, "ReadType") == 0) { return 0; }
+		}
+		if (rootGroup.ContainsObject("CommandLine")) {
+			if (commandLine.Initialize(rootGroup.group, "CommandLine") == 0) { return 0; }
+		}
+		
+		//
+		// For now, disable file log initialization until
+		// hdf2darray<string> is tested more thoroughly 
+		//
+		// if (fileLog.Initialize(rootGroup.group, "FileLog") == 0) {
+		// return 0;}
+		//
+		return 1;
+	}
+	
+	void ReadAttributes(CmpFile &cmpFile) {
+		if (rootGroup.ContainsObject("Version")) {
+		version.Read(cmpFile.version);
+		}
+		if (rootGroup.ContainsObject("Index")) {
+			index.Read(cmpFile.index);
+		}
+		if (rootGroup.ContainsObject("ReadType")) {
+      string readTypeString;
+      readType.Read(readTypeString);
+      cmpFile.StoreReadType(readTypeString);
+		}
+		if (rootGroup.ContainsObject("CommandLine")) {
+		commandLine.Read(cmpFile.commandLine);
+		}
+	}
+};
+ 
+	
+
+#endif
diff --git a/libcpp/hdf/HDFCmpSupportedFields.cpp b/libcpp/hdf/HDFCmpSupportedFields.cpp
new file mode 100644
index 0000000..b240d39
--- /dev/null
+++ b/libcpp/hdf/HDFCmpSupportedFields.cpp
@@ -0,0 +1,25 @@
+#include "HDFCmpSupportedFields.hpp"
+
+HDFCmpSupportedFields::HDFCmpSupportedFields() {
+    this->insert("StartTimeOffset");
+    this->insert("QualityValue");
+    this->insert("IPD");
+    this->insert("PreBaseFrames");
+    this->insert("DeletionQV");
+    this->insert("InsertionQV");
+    this->insert("ClassifierQV");
+    this->insert("SubstitutionQV");
+    this->insert("MergeQV");
+    this->insert("Light");
+    this->insert("WidthInFrames");
+    this->insert("PulseWidth");
+    this->insert("StartTime");
+    this->insert("pkmid");
+    this->insert("pkmax");
+    this->insert("pkmean");
+    this->insert("pkmean");
+    this->insert("SubstitutionTag");
+    this->insert("DeletionTag");
+    this->insert("PulseIndex");
+
+}
diff --git a/libcpp/hdf/HDFCmpSupportedFields.hpp b/libcpp/hdf/HDFCmpSupportedFields.hpp
new file mode 100644
index 0000000..8ac0e87
--- /dev/null
+++ b/libcpp/hdf/HDFCmpSupportedFields.hpp
@@ -0,0 +1,13 @@
+#ifndef _BLASR_CMP_SUPPORTED_FIELDS_HPP_
+#define _BLASR_CMP_SUPPORTED_FIELDS_HPP_
+
+#include <string>
+#include <set>
+
+class HDFCmpSupportedFields : public std::set<std::string> {
+public:
+    HDFCmpSupportedFields(); 
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFCommonFG.hpp b/libcpp/hdf/HDFCommonFG.hpp
new file mode 100644
index 0000000..2b859eb
--- /dev/null
+++ b/libcpp/hdf/HDFCommonFG.hpp
@@ -0,0 +1,13 @@
+#ifndef _BLASR_HDF_COMMON_FG_HPP_
+#define _BLASR_HDF_COMMON_FG_HPP_
+
+
+
+using namespace std;
+using namespace H5;
+
+class HDFCommonFG {
+ public:
+
+};
+#endif
diff --git a/libcpp/hdf/HDFConfig.hpp b/libcpp/hdf/HDFConfig.hpp
new file mode 100644
index 0000000..6dbd24a
--- /dev/null
+++ b/libcpp/hdf/HDFConfig.hpp
@@ -0,0 +1,7 @@
+#ifndef _BLASR_HDF_CONFIG_HPP_
+#define _BLASR_HDF_CONFIG_HPP_
+
+#define MAX_DIMS 10
+
+
+#endif
diff --git a/libcpp/hdf/HDFData.cpp b/libcpp/hdf/HDFData.cpp
new file mode 100644
index 0000000..0283992
--- /dev/null
+++ b/libcpp/hdf/HDFData.cpp
@@ -0,0 +1,74 @@
+#include "HDFData.hpp"
+
+using namespace std;
+using namespace H5;
+
+H5Location* HDFData::GetObject() {
+    return &dataset;
+}
+
+HDFData::HDFData(CommonFG* _container, string _datasetName) {
+    container   = _container;
+    datasetName = _datasetName;
+    fileDataSpaceInitialized = false;
+    isInitialized = false;
+}
+
+HDFData::HDFData() {
+    container = NULL;
+    fileDataSpaceInitialized = false;
+    isInitialized = false;
+}
+
+bool HDFData::IsInitialized() {
+    return isInitialized;
+}
+
+//
+// Allow derived classes to be initialized generically.
+//
+int HDFData::Initialize(HDFGroup &parentGroup, const string &datasetName) { 
+    cout << "ERROR! Only a subclass should call this." << endl;
+    exit(1);
+}
+
+int HDFData::BaseInitializeDataset(CommonFG &hdfFile, string _datasetName) {
+    dataset   = hdfFile.openDataSet(_datasetName.c_str());
+    isInitialized = true;
+    fileDataSpaceInitialized = true;
+    return 1;
+}
+
+int HDFData::InitializeDataset(HDFGroup &group, string _datasetName) {
+    return InitializeDataset(group.group, _datasetName);
+}
+
+int HDFData::InitializeDataset(CommonFG &hdfFile, string _datasetName) {
+    try {
+        datasetName = _datasetName;
+        dataset   = hdfFile.openDataSet(_datasetName.c_str());
+        isInitialized = true;
+        fileDataSpaceInitialized = true;
+    }
+    catch(FileIException &e) {
+        cerr << e.getDetailMsg() <<endl;
+        return 0;
+    }
+    catch(GroupIException &e) {
+        cerr << e.getDetailMsg() << endl;
+        return 0;
+    }
+    catch(H5::Exception &e) {
+        cerr << e.getDetailMsg() << endl;
+        return 0;
+    }
+    return 1;
+}
+
+void HDFData::Close() {
+    if (isInitialized) {
+        dataspace.close();
+        dataset.close();
+        isInitialized = false;
+    }
+}
diff --git a/libcpp/hdf/HDFData.hpp b/libcpp/hdf/HDFData.hpp
new file mode 100644
index 0000000..5ca1455
--- /dev/null
+++ b/libcpp/hdf/HDFData.hpp
@@ -0,0 +1,52 @@
+#ifndef _BLASR_HDF_DATA_HPP_
+#define _BLASR_HDF_DATA_HPP_
+
+#include <string>
+#include "H5Cpp.h"
+#include "HDFConfig.hpp"
+#include "HDFGroup.hpp"
+#include "HDFAttributable.hpp"
+
+class HDFData : public HDFAttributable {
+public:
+    H5::DataSet   dataset;
+    H5::DataSpace dataspace;
+    H5::DataSpace sourceSpace, destSpace;
+    H5::DataSpace fullSourceSpace;
+    bool      fileDataSpaceInitialized;
+    H5::CommonFG  *container;
+    std::string    datasetName;
+    bool      isInitialized;
+
+    H5::H5Location* GetObject(); 
+
+    HDFData(H5::CommonFG* _container, std::string _datasetName); 
+
+    HDFData(); 
+
+    bool IsInitialized(); 
+
+    //
+    // Allow derived classes to be initialized generically.
+    //
+    // FIXME(yli): This method and the Initialize methods in
+    // subclasses cause compilation warnings under clang.  For
+    // example, see the discussion here:
+    //
+    // http://stackoverflow.com/questions/18515183/c-overloaded-virtual-function-warning-by-clang
+    //
+    // To fix the problem here may require rethinking the initialize
+    // method more carefully.
+    //
+    virtual int Initialize(HDFGroup &parentGroup, const std::string &datasetName);
+
+    int BaseInitializeDataset(H5::CommonFG &hdfFile, std::string _datasetName); 
+
+    int InitializeDataset(HDFGroup &group, std::string _datasetName); 
+
+    int InitializeDataset(H5::CommonFG &hdfFile, std::string _datasetName); 
+
+    void Close(); 
+};
+
+#endif
diff --git a/libcpp/hdf/HDFFile.cpp b/libcpp/hdf/HDFFile.cpp
new file mode 100644
index 0000000..285b8f6
--- /dev/null
+++ b/libcpp/hdf/HDFFile.cpp
@@ -0,0 +1,53 @@
+#include "HDFFile.hpp"
+
+using namespace H5;
+using namespace std;
+
+HDFFile::HDFFile() {
+}
+
+//
+//  Open a file.  By default, if the file already exists, open it in
+//  read/write mode.  The only other flag that is allowed is
+//  H5F_ACC_TRUNC, which will truncate the file to zero size.
+//
+void HDFFile::Open(string fileName, unsigned int flags, 
+    const FileAccPropList& fileAccPropList) {
+
+    assert (flags == H5F_ACC_RDWR || flags == H5F_ACC_TRUNC || flags == H5F_ACC_RDONLY);
+    ifstream testIn(fileName.c_str());
+    bool fileExists = static_cast<bool>(testIn);
+    bool flagsIsNotTrunc = flags != H5F_ACC_TRUNC;
+
+    if (fileExists and H5File::isHdf5(fileName.c_str()) and flagsIsNotTrunc) {
+        try {
+            hdfFile.openFile(fileName.c_str(), flags, fileAccPropList);
+        }
+        catch (FileIException e) {
+            cout << "Error opening file " << fileName << endl;
+            exit(1);
+        }
+    }
+    else {
+        try {
+            //
+            // Open a new file with TRUNC permissions, always read/write.
+            //
+            FileCreatPropList filePropList;
+            filePropList.setUserblock(512);
+            hdfFile = H5File(fileName.c_str(), H5F_ACC_TRUNC, filePropList);
+        }
+        catch (FileIException fileException) {
+            cout << "Error creating file " << fileName << endl;
+            exit(1);
+        }
+    }
+    if (rootGroup.Initialize(hdfFile, "/") != 1) {
+        cout << "Error initializing the root group for file " << fileName << endl;
+        exit(1);
+    }
+}
+
+void HDFFile::Close() {
+    hdfFile.close();
+}
diff --git a/libcpp/hdf/HDFFile.hpp b/libcpp/hdf/HDFFile.hpp
new file mode 100644
index 0000000..ae67c3e
--- /dev/null
+++ b/libcpp/hdf/HDFFile.hpp
@@ -0,0 +1,32 @@
+#ifndef _BLASR_HDF_FILE_HPP_
+#define _BLASR_HDF_FILE_HPP_
+
+#include <iostream>
+#include <string>
+#include <vector>
+#include "H5Cpp.h"
+#include "HDFConfig.hpp"
+#include "HDFGroup.hpp"
+
+class HDFFile {
+public:
+    // Make this public for easy access.
+    H5::H5File hdfFile;	
+    HDFGroup rootGroup;
+
+    HDFFile(); 
+
+    //
+    //  Open a file.  By default, if the file already exists, open it in
+    //  read/write mode.  The only other flag that is allowed is
+    //  H5F_ACC_TRUNC, which will truncate the file to zero size.
+    //
+    void Open(string fileName, unsigned int flags=H5F_ACC_RDWR, 
+        const H5::FileAccPropList& fileAccPropList=H5::FileAccPropList::DEFAULT); 
+
+    void Close(); 
+
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFFileLogGroup.hpp b/libcpp/hdf/HDFFileLogGroup.hpp
new file mode 100644
index 0000000..caaca07
--- /dev/null
+++ b/libcpp/hdf/HDFFileLogGroup.hpp
@@ -0,0 +1,55 @@
+#ifndef HDF_FILE_LOG_GROUP_H_
+#define HDF_FILE_LOG_GROUP_H_
+#include "HDFGroup.hpp"
+#include "HDFArray.hpp"
+
+class HDFFileLogGroup {
+ public:
+  HDFGroup group;
+  HDFStringArray commandLineArray;
+  HDFStringArray versionArray;
+  HDFStringArray timestampArray;
+  HDFArray<unsigned int> idArray;
+  HDFStringArray logArray;
+  HDFStringArray programArray;
+
+  int Initialize(HDFGroup &parentGroup) {
+    if (group.Initialize(parentGroup.group, "FileLog") == 0) { return 0; }
+    int ret = 1;
+    ret *= commandLineArray.Initialize(group, "CommandLine");
+    ret *= versionArray.Initialize(group, "Version");
+    ret *= timestampArray.Initialize(group, "Timestamp");
+    ret *= idArray.Initialize(group, "ID");
+    ret *= logArray.Initialize(group, "Log");
+    ret *= programArray.Initialize(group, "Program");
+    return ret;
+  }
+
+  
+  void AddEntry(string command, string log, string program, string timestamp, string version) {
+    commandLineArray.Write(&command, 1);
+    versionArray.Write(&version, 1);
+    timestampArray.Write(&timestamp, 1);
+    programArray.Write(&program, 1);
+    logArray.Write(&log, 1);
+    
+    unsigned int id = idArray.size();
+    id = id + 1;
+    idArray.Write(&id, 1);
+    
+  }
+
+  bool Create(HDFGroup &parent) {
+    parent.AddGroup("FileLog");
+    if (group.Initialize(parent.group, "FileLog") == 0) { return 0; }
+    commandLineArray.Create(group, "CommandLine");
+    versionArray.Create(group, "Version");
+    timestampArray.Create(group, "Timestamp");
+    programArray.Create(group, "Program");
+    logArray.Create(group, "Log");
+    idArray.Create(group, "ID");
+  }    
+
+};
+
+#endif
diff --git a/libcpp/hdf/HDFGroup.cpp b/libcpp/hdf/HDFGroup.cpp
new file mode 100644
index 0000000..396943b
--- /dev/null
+++ b/libcpp/hdf/HDFGroup.cpp
@@ -0,0 +1,58 @@
+#include "HDFGroup.hpp"
+
+using namespace H5;
+using namespace std;
+
+HDFGroup::HDFGroup() : HDFAttributable() {
+    groupIsInitialized = false;
+}
+
+void HDFGroup::AddGroup(string groupName) {
+    group.createGroup(groupName);
+    return;
+}
+
+H5Location* HDFGroup::GetObject() {
+    return &group;
+}
+
+int HDFGroup::Initialize(CommonFG &fg, string groupName){ 
+    try {
+        group   = fg.openGroup(groupName.c_str());
+        groupIsInitialized = true;
+        return 1;
+    }
+    catch(FileIException &e) {
+        return 0;
+    }
+    catch(GroupIException &e) {
+        return 0;
+    }
+    catch(Exception &e ) {
+        return 0;
+    }
+    return 1;
+}
+
+int HDFGroup::Initialize(HDFGroup & parentGroup, string groupName) {
+    return Initialize(parentGroup.group, groupName);
+}
+
+bool HDFGroup::ContainsObject(string queryObjectName) {
+    hsize_t objIdx;
+    hsize_t numGroupObjs = group.getNumObjs();
+    for (objIdx = 0; objIdx < numGroupObjs; objIdx++) {
+        H5std_string groupObjectName;
+        groupObjectName = group.getObjnameByIdx(objIdx);
+        if (groupObjectName == queryObjectName) {
+            return true;
+        }
+    }
+    return false;
+}
+
+void HDFGroup::Close() {
+    if (groupIsInitialized) {
+        group.close();
+    }
+}
diff --git a/libcpp/hdf/HDFGroup.hpp b/libcpp/hdf/HDFGroup.hpp
new file mode 100644
index 0000000..e9f806c
--- /dev/null
+++ b/libcpp/hdf/HDFGroup.hpp
@@ -0,0 +1,36 @@
+#ifndef _BLASR_HDF_GROUP_HPP_
+#define _BLASR_HDF_GROUP_HPP_
+
+#include <vector>
+#include <iostream>
+#include <string>
+#include <stdlib.h>
+#include "H5Cpp.h"
+#include "HDFAttributable.hpp"
+#include "StringUtils.hpp"
+
+
+class HDFGroup : public HDFAttributable {
+public:
+    std::vector<std::string> objectNames;
+    std::string objectName;
+    H5::Group group;
+    bool  groupIsInitialized;
+
+    HDFGroup();
+
+    void AddGroup(std::string groupName); 
+
+    H5::H5Location* GetObject(); 
+
+    int Initialize(H5::CommonFG& fg, std::string groupName);
+
+    int Initialize(HDFGroup& parentGroup, std::string groupName); 
+
+    bool ContainsObject(std::string queryObjectName); 
+
+    void Close(); 
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFMovieInfoGroup.hpp b/libcpp/hdf/HDFMovieInfoGroup.hpp
new file mode 100644
index 0000000..988bc95
--- /dev/null
+++ b/libcpp/hdf/HDFMovieInfoGroup.hpp
@@ -0,0 +1,79 @@
+#ifndef HDF_MOVIE_INFO_GROUP_H_
+#define HDF_MOVIE_INFO_GROUP_H_
+
+#include "HDFGroup.hpp"
+#include "HDFArray.hpp"
+#include "saf/MovieInfo.hpp"
+
+class HDFMovieInfoGroup {
+ public:
+	
+	HDFGroup movieInfoGroup;
+	HDFArray<UInt> idArray;
+	HDFStringArray  nameArray;
+	
+	HDFStringArray whenStartedArray;
+	HDFArray<float> frameRateArray;
+
+	~HDFMovieInfoGroup() {
+		movieInfoGroup.Close();
+	}
+
+  bool Create(HDFGroup &parentGroup) {
+    parentGroup.AddGroup("MovieInfo");
+		if (movieInfoGroup.Initialize(parentGroup.group, "MovieInfo") == 0) { return 0; }
+    idArray.Create(movieInfoGroup, "ID");
+    nameArray.Create(movieInfoGroup, "Name");
+    return true;
+  }
+
+	int Initialize(HDFGroup &parentGroup) {
+		if (movieInfoGroup.Initialize(parentGroup.group, "MovieInfo") == 0) { return 0; }
+		if (idArray.Initialize(movieInfoGroup, "ID") == 0) { return 0; }
+		if (nameArray.Initialize(movieInfoGroup, "Name") == 0) { return 0; }
+		return 1;
+	}
+	
+	void Read(MovieInfo &movieInfo) {
+		int nId = idArray.arrayLength;
+		movieInfo.id.resize(nId);
+		idArray.Read(0, nId, &movieInfo.id[0]);
+		
+		int nName = nameArray.arrayLength;
+		movieInfo.name.resize(nName);
+		int i;
+		for (i = 0; i < nName; i++ ){
+			nameArray.Read(i,i+1,&movieInfo.name[i]);
+		}
+	}
+
+  int AddMovie(string &movieName) {
+    nameArray.Write(&movieName, 1);
+    unsigned int id = nameArray.size();
+    idArray.Write(&id, 1);
+    return id;
+  }
+
+  void StoreFrameRate(int movieIndex, float frameRate) {
+    if (movieIndex < 0) {
+      cout << "ERROR. Invalid movie index " << movieIndex << endl;
+      exit(1);
+    }
+
+    if (!frameRateArray.IsInitialized()) {
+      if (!movieInfoGroup.ContainsObject("FrameRate")) {
+        frameRateArray.Create(movieInfoGroup, "FrameRate");
+      }
+      else {
+        frameRateArray.Initialize(movieInfoGroup, "FrameRate");
+      }
+    }
+    frameRateArray.WriteToPos(&frameRate, 1, movieIndex);
+  }
+  
+};
+			
+			
+			
+				
+#endif
diff --git a/libcpp/hdf/HDFNewBasReader.cpp b/libcpp/hdf/HDFNewBasReader.cpp
new file mode 100644
index 0000000..14ddc3a
--- /dev/null
+++ b/libcpp/hdf/HDFNewBasReader.cpp
@@ -0,0 +1,72 @@
+#include "HDFNewBasReader.hpp"
+
+int 
+HDFNewBasReader::Initialize (const std::string & hdfBasFileName) {
+    //
+    // Initialize access to the HDF file.  For reading bas files, this
+    // involves:
+    //   - Opening the h5 file, and initializing the rootGroup. 
+    //
+    try {
+        H5::Exception::dontPrint();
+        hdfBasFile.openFile(hdfBasFileName.c_str(), 
+                            H5F_ACC_RDONLY);
+    } catch (H5::Exception &e) {
+        std::cout << "ERROR, could not open bas.h5 file" << hdfBasFileName 
+                  << ", exiting." << std::endl;
+        return 0;
+    }
+
+    if (rootGroup.Initialize(hdfBasFile, "/") == 0) {
+        return 0;
+    }
+    // If /MultiPart/Parts exists, initialize and return 1; 
+    // otherwise, return 0
+    if (rootGroup.ContainsObject("MultiPart") and 
+        multiPartGroup.Initialize(rootGroup.group, "MultiPart") != 0) {
+        if (multiPartGroup.ContainsObject("Parts") and 
+            partsArray.InitializeForReading(multiPartGroup, "Parts") != 0) {
+            basFileName = hdfBasFileName;
+            return 1; // Success
+        }
+    }
+    return 0; // Fail 
+}
+
+std::vector<std::string> 
+HDFNewBasReader::GetBaxMovieNames() {
+    // Read bax.h5 names from /MultiPart/Parts, not including path prefix.
+    // e.g., m...._s1_p0.1.bax.h5
+    std::vector<std::string> baxNames;
+    baxNames.resize(BAXPERBAS); // 3 bax files per bas file.
+    for (int i = 0;  i < BAXPERBAS;  i++) {
+        partsArray.Read(i, i+1, &baxNames[i]);
+    }
+    return baxNames;
+}
+
+std::vector<std::string> 
+HDFNewBasReader::GetBaxFileNames() {
+    // Get full paths to bax.h5 files,
+    // e.g., /mnt/data3/vol53/2450598/0001/Analysis_Results/m..._s1_p0.1.bax.h5
+    // Assumption: bax.h5 files are in the same directory as bas.h5.
+    std::string prefix = "";
+    size_t slashPos = basFileName.rfind("/");
+    if (slashPos != std::string::npos) {
+        prefix = basFileName.substr(0, slashPos + 1);
+    }
+    std::vector<std::string> baxNames = GetBaxMovieNames();
+    for (int i = 0; i < int(baxNames.size()); i++) {
+        baxNames[i] = prefix + baxNames[i];
+    }
+    return baxNames;
+}
+
+void
+HDFNewBasReader::Close() {
+    partsArray.Close();
+    multiPartGroup.Close();
+    rootGroup.Close();
+    hdfBasFile.close();
+    basFileName = "";
+}
diff --git a/libcpp/hdf/HDFNewBasReader.hpp b/libcpp/hdf/HDFNewBasReader.hpp
new file mode 100644
index 0000000..4992cff
--- /dev/null
+++ b/libcpp/hdf/HDFNewBasReader.hpp
@@ -0,0 +1,39 @@
+#ifndef _BLASR_HDF_NEW_BAS_READER_HPP_
+#define _BLASR_HDF_NEW_BAS_READER_HPP_
+
+#include <stdlib.h>
+#include <sstream>
+#include <vector>
+
+#include "HDFArray.hpp"
+#include "HDFGroup.hpp"
+
+const int BAXPERBAS = 3; // Number of bax files per base file.
+
+class HDFNewBasReader {
+// The new bas.h5 file contains:
+// /MultiPart group, 
+// /MultiPart/HoleLookup Dataset (which is ignored), and
+// /MultiPart/Parts Dataset.
+public:
+    H5::H5File hdfBasFile;
+	HDFGroup rootGroup;
+	HDFGroup multiPartGroup; 
+	//HDFArray<std::string> partsArray;
+    HDFStringArray partsArray;
+    std::string basFileName;
+
+	HDFNewBasReader() {
+        basFileName = "";
+    }
+
+    int Initialize (const std::string & hdfBasFileName);
+   
+    std::vector<std::string> GetBaxMovieNames();
+
+    std::vector<std::string> GetBaxFileNames();
+
+    void Close();
+};
+
+#endif
diff --git a/libcpp/hdf/HDFPlsReader.hpp b/libcpp/hdf/HDFPlsReader.hpp
new file mode 100644
index 0000000..750be08
--- /dev/null
+++ b/libcpp/hdf/HDFPlsReader.hpp
@@ -0,0 +1,542 @@
+#ifndef _BLASR_HDF_PLS_READER_HPP_
+#define _BLASR_HDF_PLS_READER_HPP_
+
+#include "HDFArray.hpp"
+#include "HDF2DArray.hpp"
+#include "HDFAtom.hpp"
+#include "HDFGroup.hpp"
+#include "HDFBasReader.hpp"
+#include "HDFPulseDataFile.hpp"
+#include "DatasetCollection.hpp"
+#include "HDFZMWReader.hpp"
+#include "reads/PulseFile.hpp"
+#include "HDFScanDataReader.hpp"
+#include "FASTQSequence.hpp"
+#include "VectorUtils.hpp"
+#include <sstream>
+#include <vector>
+#include <set>
+using namespace H5;
+using namespace std;
+/*
+ * Interface for reading pulse information from a .pls.h5 file.
+ * To read both pls and bas information, use the HDFBasReader.
+ */
+
+class HDFPlsReader : public DatasetCollection, public HDFPulseDataFile  {
+	DNALength curPos;
+	int curRead;
+
+	HDFGroup pulseCallsGroup;
+
+  int meanSignalNDims, midSignalNDims, maxSignalNDims;
+  
+	HDF2DArray<uint16_t>   meanSignalMatrix;
+	HDF2DArray<uint16_t>   midSignalMatrix;
+	HDF2DArray<uint16_t>   maxSignalMatrix;
+	HDFArray<uint16_t>     meanSignalArray;
+	HDFArray<uint16_t>     midSignalArray;
+	HDFArray<uint16_t>     maxSignalArray;
+	HDFArray<uint16_t>     plsWidthInFramesArray;
+	HDFArray<unsigned int> startFrameArray;
+	HDFArray<float>        classifierQVArray;
+
+
+ public:
+ HDFPlsReader() : HDFPulseDataFile(), DatasetCollection() {
+		fieldNames.push_back("MeanSignal");
+		fieldNames.push_back("MidSignal");
+		fieldNames.push_back("MaxSignal");
+		fieldNames.push_back("StartFrame");
+		fieldNames.push_back("ClassifierQV");
+		fieldNames.push_back("WidthInFrames");
+		fieldNames.push_back("FrameRate");
+		fieldNames.push_back("WhenStarted");
+		fieldNames.push_back("NumEvent"); // this is read from the zmw, but control it here.
+		InitializeAllFields(false);
+	}
+
+	int InitializeCommon() {
+		return 1;
+	}
+
+	int Initialize(string hdfPlsFileName, const H5::FileAccPropList & fileAccPropList=H5::FileAccPropList::DEFAULT) {
+		/*
+		 * Initialize access to the HDF file.
+		 */
+
+		if (HDFPulseDataFile::Initialize(hdfPlsFileName, fileAccPropList) == 0) {
+			return 0;
+		}
+
+		if (pulseDataGroup.ContainsObject("PulseCalls") == 0 or
+				pulseCallsGroup.Initialize(pulseDataGroup.group, "PulseCalls") == 0) {
+			return 0;
+		}
+		zmwReader.Initialize(&pulseCallsGroup);
+
+
+		//
+		// Initialize arrays for reading.  This has been preconfigured to 
+		//
+		if (!InitializePulseGroup()) return 0;
+
+    if ( (meanSignalNDims = GetDatasetNDim(pulseCallsGroup.group, "MeanSignal")) == 1) {
+      if (!meanSignalArray.Initialize(pulseCallsGroup, "MeanSignal"))    return 0;
+    }
+    else if (meanSignalNDims == 2) {
+      if (!meanSignalMatrix.Initialize(pulseCallsGroup, "MeanSignal"))    return 0;
+    }
+    
+    if ((midSignalNDims = GetDatasetNDim(pulseCallsGroup.group, "MidSignal")) == 1) {
+      if (!midSignalArray.Initialize(pulseCallsGroup, "MidSignal"))     return 0;
+    }
+    else if (midSignalNDims == 2) {
+      if (!midSignalMatrix.Initialize(pulseCallsGroup, "MidSignal"))     return 0;
+    }
+
+    if ((maxSignalNDims = GetDatasetNDim(pulseCallsGroup.group, "MaxSignal")) == 1) {
+      if (!maxSignalArray.Initialize(pulseCallsGroup, "MaxSignal")) return 0;
+    }
+    else if (maxSignalNDims == 2) {
+      if (!maxSignalMatrix.Initialize(pulseCallsGroup, "MaxSignal"))     return 0;
+    }
+    
+    //
+    // Astro pulse files may not have the ClassifierQV dataset, check
+    // to see if it exists, and then try and initialize it.
+    //
+    if (pulseCallsGroup.ContainsObject("ClassifierQV")) {
+      if (!classifierQVArray.Initialize(pulseCallsGroup, "ClassifierQV"))  return 0;
+    } else {
+        includedFields["ClassifierQV"] = false;
+    }
+
+    //
+    // These are all required fields.
+    //
+		if (!startFrameArray.Initialize(pulseCallsGroup, "StartFrame"))    return 0;
+		if (!plsWidthInFramesArray.Initialize(pulseCallsGroup, "WidthInFrames")) return 0;
+
+        curRead = 0;
+        nReads  = zmwReader.numEventArray.arrayLength;
+		return 1;
+	}
+
+    UInt GetStartFrameSize() {
+        return startFrameArray.arrayLength;
+    }
+
+	void GetAllMeanSignal(vector<uint16_t> &meanSignal) {
+    if (meanSignalNDims == 1) {
+      CheckMemoryAllocation(meanSignalArray.arrayLength, maxAllocNElements, "MeanSignal");
+      meanSignal.resize(meanSignalArray.arrayLength);
+      meanSignalArray.Read(0, meanSignalArray.arrayLength, &meanSignal[0]);
+    }   
+    else if (meanSignalNDims == 2) {
+      CheckMemoryAllocation(meanSignalMatrix.GetNCols() * meanSignalMatrix.GetNRows(), maxAllocNElements, "MeanSignal");
+      meanSignal.resize(meanSignalMatrix.GetNCols() * meanSignalMatrix.GetNRows());
+      meanSignalMatrix.Read(0, meanSignalMatrix.GetNRows(), &meanSignal[0]);
+    } 
+	}
+
+	void GetAllMidSignal(vector<uint16_t> &midSignal) {
+    if (midSignalNDims == 1) {
+      CheckMemoryAllocation(midSignalArray.arrayLength, maxAllocNElements, "MidSignal");
+      midSignal.resize(midSignalArray.arrayLength);
+      midSignalArray.Read(0, midSignalArray.arrayLength, &midSignal[0]);
+    }
+    else if (midSignalNDims == 2) {
+      CheckMemoryAllocation(midSignalMatrix.GetNCols() * midSignalMatrix.GetNRows(), maxAllocNElements, "MidSignal");
+      midSignal.resize(midSignalMatrix.GetNCols() * midSignalMatrix.GetNRows());
+      midSignalMatrix.Read(0, midSignalMatrix.GetNRows(), &midSignal[0]);
+    }
+	}
+
+	void GetAllMaxSignal(vector<uint16_t> &maxSignal) {
+    if (maxSignalNDims == 1) {
+      CheckMemoryAllocation(maxSignalArray.arrayLength, maxAllocNElements, "MaxSignal");
+      maxSignal.resize(maxSignalArray.arrayLength);
+      maxSignalArray.Read(0, maxSignalArray.arrayLength, &maxSignal[0]);
+    }
+    else if (maxSignalNDims == 2) {
+      CheckMemoryAllocation(maxSignalMatrix.GetNCols() * maxSignalMatrix.GetNRows(), maxAllocNElements, "MaxSignal");
+      maxSignal.resize(maxSignalMatrix.GetNCols() * maxSignalMatrix.GetNRows());
+      maxSignalMatrix.Read(0, maxSignalMatrix.GetNRows(), &maxSignal[0]);
+    }
+	}
+
+	void GetAllStartFrames(vector<UInt> &startFrame) {
+		CheckMemoryAllocation(startFrameArray.arrayLength, maxAllocNElements, "StartFrame");
+		startFrame.resize(startFrameArray.arrayLength);
+		startFrameArray.Read(0,startFrameArray.arrayLength, &startFrame[0]);
+	}
+
+	void GetAllPlsWidthInFrames(vector<uint16_t> &widthInFrames) {
+		CheckMemoryAllocation(plsWidthInFramesArray.arrayLength, maxAllocNElements, "WidthInFrames (pulse)");
+		widthInFrames.resize(plsWidthInFramesArray.arrayLength);
+		plsWidthInFramesArray.Read(0,plsWidthInFramesArray.arrayLength, &widthInFrames[0]);
+	}
+	
+	void GetAllClassifierQV(vector<float> &classifierQV) {
+		CheckMemoryAllocation(classifierQVArray.arrayLength, maxAllocNElements, "ClassifierQV (pulse)");
+		classifierQV.resize(classifierQVArray.arrayLength);
+		classifierQVArray.Read(0, classifierQVArray.arrayLength, &classifierQV[0]);
+	}
+
+	void GetAllNumEvent(vector<int> &numEvent) {
+		CheckMemoryAllocation(zmwReader.numEventArray.arrayLength, maxAllocNElements, "NumEvent (pulse)");
+		numEvent.resize(zmwReader.numEventArray.arrayLength);
+		zmwReader.numEventArray.Read(0, zmwReader.numEventArray.arrayLength, &numEvent[0]);
+	}
+
+    // Always call ReadPulseFileInit before calling ReadPulseFile()
+    // or ReadField()
+    void ReadPulseFileInit(PulseFile & pulseFile) {
+        if (scanDataReader.fileHasScanData) {
+            scanDataReader.Read(pulseFile.scanData);
+        }
+        // Get hole numbers in PulseCalls/ZMW/HoleNumber. Note that
+        // PulseCalls/ZMW/HoleNumber and BaseCalls/ZMW/HoleNumber are
+        // not always identical.
+        GetAllHoleNumbers(pulseFile.holeNumbers);
+
+        // By default, always get the num event.  This is used
+        // later to copy reads from the pls file.
+        GetAllNumEvent(pulseFile.numEvent);
+        assert(pulseFile.holeNumbers.size() == pulseFile.numEvent.size());
+        if (pulseFile.numEvent.size() > 0) {
+            pulseFile.pulseStartPositions.resize(pulseFile.numEvent.size());
+            pulseFile.pulseStartPositions[0] = 0;
+            for (int i = 1; i < pulseFile.numEvent.size(); i++) {
+                pulseFile.pulseStartPositions[i] = pulseFile.pulseStartPositions[i-1] +
+                                                   pulseFile.numEvent[i-1];
+            }
+        }
+    }
+	
+    void ReadPulseFile(PulseFile &pulseFile) {
+        ReadPulseFileInit(pulseFile);
+
+		if (includedFields["StartFrame"]) {
+			GetAllStartFrames(pulseFile.startFrame);
+		}
+		if (includedFields["WidthInFrames"]) {
+			GetAllPlsWidthInFrames(pulseFile.plsWidthInFrames);
+		}
+		if (includedFields["MeanSignal"]) {
+			GetAllMeanSignal(pulseFile.meanSignal);
+      pulseFile.meanSignalNDims = meanSignalNDims;
+		}
+		if (includedFields["MidSignal"]) {
+			GetAllMidSignal(pulseFile.midSignal);
+      pulseFile.midSignalNDims = midSignalNDims;
+		}
+		if (includedFields["MaxSignal"]) {
+			GetAllMaxSignal(pulseFile.maxSignal);
+      pulseFile.maxSignalNDims = maxSignalNDims;
+		}
+
+		if (includedFields["ClassifierQV"]) {
+			GetAllClassifierQV(pulseFile.classifierQV);
+		}
+	}
+
+    //
+    // Return size of the entire field in KB.
+    //
+    UInt GetFieldSize(const string & field) {
+        if (not includedFields[field]) {
+            cout << "ERROR, field " << field << " is not included in the pulse file. " << endl;
+            exit(1); 
+        }
+        if (field == "StartFrame") {
+            return startFrameArray.arrayLength / 1024 * sizeof(unsigned int);
+        } else if (field == "WidthInFrames") {
+            return plsWidthInFramesArray.arrayLength / 1024 * sizeof (uint16_t);
+        } else if (field == "MeanSignal") {
+            return meanSignalArray.arrayLength / 1024 * sizeof(uint16_t);
+        } else if (field == "MidSignal") {
+            return midSignalArray.arrayLength / 1024 * sizeof(uint16_t);
+        } else if (field == "MaxSignal") {
+            return maxSignalArray.arrayLength / 1024 * sizeof(uint16_t);
+        } else if (field == "NumEvent") {
+            return  zmwReader.numEventArray.arrayLength / 1024 * sizeof (int);
+        } else if (field == "ClassifierQV") {
+            return classifierQVArray.arrayLength /1024 * sizeof(float);
+        } else {
+            cout << "ERROR, field [" << field << "] is not supported. " << endl ;
+            exit(1);
+        }
+    }
+
+    //
+    // Read the entire field to memory
+    // 
+    void ReadField(PulseFile & pulseFile, const string & field) {
+        if (not includedFields[field]) {
+            cout << "ERROR, field " << field << " is not included in the pulse file. " << endl;
+            exit(1); 
+        }
+        if (field == "StartFrame") {
+            GetAllStartFrames(pulseFile.startFrame);
+        } else if (field == "WidthInFrames") {
+			GetAllPlsWidthInFrames(pulseFile.plsWidthInFrames);
+        } else if (field == "MeanSignal") {
+			GetAllMeanSignal(pulseFile.meanSignal);
+            pulseFile.meanSignalNDims = meanSignalNDims;
+        } else if (field == "MidSignal") {
+            GetAllMidSignal(pulseFile.midSignal);
+            pulseFile.midSignalNDims = midSignalNDims;
+        } else if (field == "MaxSignal") {
+            GetAllMaxSignal(pulseFile.maxSignal);
+            pulseFile.maxSignalNDims = maxSignalNDims;
+        } else if (field == "NumEvent") {
+            GetAllNumEvent(pulseFile.numEvent);
+        } else if (field == "ClassifierQV") {
+            // GetAllClassifierQV(pulseFile.classifierQV) is equivalent to 
+            // classifierQVArray.ReadDataset(pulseFile.classifierQV) with 
+            // memory check 
+			GetAllClassifierQV(pulseFile.classifierQV);
+        } else {
+            cout << "ERROR, field [" << field << "] is not supported. " << endl ;
+            exit(1);
+        }
+    } 
+    
+    // Copy a field for a hole
+    void CopyFieldAt(PulseFile & pulseFile, const string & field, 
+            int holeIndex, int * basToPlsIndex, 
+            void * dest, int destLength, const string & destSequence="") {
+
+        Nucleotide * destSeqCopy = NULL;
+        if (destSequence != "") {
+            destSeqCopy = new Nucleotide[destSequence.size()];
+            for(int i = 0 ; i < destSequence.size(); i++) {
+                destSeqCopy[i] = (Nucleotide)destSequence[i];
+            }
+        }
+
+        if (not includedFields[field]) {
+            cout << "ERROR, field " << field << " is not included in the pulse file. " << endl;
+            exit(1);
+        }
+        UInt pulseStartPos= pulseFile.pulseStartPositions[holeIndex];
+
+        if (field == "StartFrame") {
+            assert(pulseFile.startFrame.size() > 0 and 
+                   pulseFile.startFrame.size() > pulseStartPos);
+            StoreField(pulseFile.startFrame, basToPlsIndex, ((UInt*)dest), destLength);
+        } else if (field == "WidthInFrames") {
+            assert(pulseFile.plsWidthInFrames.size() > 0 and 
+                   pulseFile.plsWidthInFrames.size() > pulseStartPos);
+            StoreField(pulseFile.plsWidthInFrames, basToPlsIndex, (uint16_t*)dest, destLength);
+
+        } else if (field == "MeanSignal") {
+            assert(pulseFile.meanSignal.size() > 0 and 
+                   pulseFile.meanSignal.size() >  pulseStartPos);
+            assert(destLength ==  destSequence.size());
+
+            pulseFile.CopySignal((HalfWord*)(&pulseFile.meanSignal[0]), 
+                    meanSignalNDims, 
+                    0, //basToPlsIndex maps bases to abs pulse positions
+                    basToPlsIndex,
+                    destSeqCopy, destLength,
+                    (HalfWord*)dest);
+
+        } else if (field == "MidSignal") {
+            assert(pulseFile.midSignal.size() > 0 and 
+                   pulseFile.midSignal.size() > pulseStartPos);
+            assert(destLength ==  destSequence.size());
+
+            pulseFile.CopySignal((HalfWord*)(&pulseFile.midSignal[0]), 
+                    midSignalNDims, 
+                    0, //basToPlsIndex maps bases to abs pulse positions
+                    basToPlsIndex,
+                    destSeqCopy, destLength,
+                    (HalfWord*)dest);
+
+        } else if (field == "MaxSignal") {
+            assert(pulseFile.maxSignal.size() > 0 and 
+                   pulseFile.maxSignal.size() > pulseStartPos);
+            assert(destLength ==  destSequence.size());
+            pulseFile.CopySignal((HalfWord*)(&pulseFile.maxSignal[0]), 
+                    maxSignalNDims, 
+                    0, //basToPlsIndex maps bases to abs pulse positions
+                    basToPlsIndex,
+                    destSeqCopy, destLength,
+                    (HalfWord*)dest);
+
+        } else if (field == "ClassifierQV") {
+            assert(pulseFile.classifierQV.size() > 0 and 
+                   pulseFile.classifierQV.size() > pulseStartPos);
+            StoreField(pulseFile.classifierQV, basToPlsIndex, (float*)dest, destLength);
+
+        } else if (field == "NumEvent") {
+            cout << "ERROR, control of copying numEvent should not go here." << endl;
+            exit(1);
+        } else {
+            cout << "ERROR, field [" << field << "] is not supported. " << endl ;
+            exit(1);
+        }
+
+        if (destSeqCopy != NULL) {
+            delete [] destSeqCopy;
+        }
+    }
+
+    // Clear memory allocated for the specified field
+    void ClearField(PulseFile & pulseFile, const string & field) {
+        if (not includedFields[field]) {
+            cout << "ERROR, field " << field << " is not included in the pulse file. " << endl;
+            exit(1); 
+        }
+        if (field == "StartFrame") {
+            ClearMemory(pulseFile.startFrame);
+        } else if (field == "WidthInFrames") {
+            ClearMemory(pulseFile.plsWidthInFrames);
+        } else if (field == "MeanSignal") {
+            ClearMemory(pulseFile.meanSignal);
+            pulseFile.meanSignalNDims = -1;
+        } else if (field == "MidSignal") {
+            ClearMemory(pulseFile.midSignal);
+            pulseFile.midSignalNDims = -1;
+        } else if (field == "MaxSignal") {
+            ClearMemory(pulseFile.maxSignal);
+            pulseFile.maxSignalNDims = -1; 
+        } else if (field == "NumEvent") {
+            ClearMemory(pulseFile.numEvent);
+        } else if (field == "ClassifierQV") {
+			ClearMemory(pulseFile.classifierQV);
+        } else {
+            cout << "ERROR, field [" << field << "] is not supported. " << endl ;
+            exit(1);
+        }
+    }
+
+
+  int GetReadAt(int holeNumber, int* &basToPlsIndex, SMRTSequence &read) {
+    if (preparedForRandomAccess == false) {
+      PrepareForRandomAccess();
+    }
+    curRead = holeNumber;
+    curPos  = eventOffset[holeNumber];
+    zmwReader.curZMW = holeNumber;
+    return GetNextFlattenedToBase(read, basToPlsIndex);
+  }
+
+  template<typename T_FieldType>
+  void StoreField(vector<T_FieldType> &source, int *basToPlsIndex, T_FieldType *dest, int destLength) {
+    int i;
+    for (i = 0 ; i < destLength; i++) {
+      dest[i] = source[basToPlsIndex[i]];
+    }
+  }
+  
+  void ReadSignal(string fieldName,
+                  HDFArray<HalfWord> &signalArray, 	HDF2DArray<HalfWord> &signalMatrix, 
+                  int plsSeqLength, int nDims, 
+                  Nucleotide *basSeq, int basSeqLength,
+                  int *basToPlsIndex, HalfWord* dest) {
+
+		if (includedFields[fieldName]) {
+      vector<HalfWord> signal;
+      if (nDims == 2) {
+        signal.resize(plsSeqLength * 4);
+        signalMatrix.Read(curPos, curPos + plsSeqLength, &signal[0]); // read off one row.
+        int i;
+        for (i = 0; i < basSeqLength; i++) {
+          dest[i] = signal[basToPlsIndex[i]*4 + scanDataReader.baseMap[basSeq[i]]];
+        }
+      }
+      else {
+        signal.resize(plsSeqLength);
+        signalArray.Read(curPos, curPos + plsSeqLength, &signal[0]);
+        int i;
+        for (i = 0; i < basSeqLength; i++) {
+          dest[i] = signal[basToPlsIndex[i]];
+        }
+      }
+    }
+  }
+
+	int GetNextFlattenedToBase(SMRTSequence &read, int* basToPlsIndex) {
+
+    /*
+     * Get the pulse values, but only store values that correspond to called bases. 
+     * This requires that the read has the read.seq field assigned.
+     */
+    assert(read.seq != NULL);
+    int seqLength;
+    
+    try{
+    //
+    // Find out how many pulses are called for this read.
+		zmwReader.numEventArray.Read(curRead, curRead+1, &seqLength);
+    
+    if (includedFields["StartFrame"]) {
+      vector<unsigned int> pulseStartFrame;
+      pulseStartFrame.resize(seqLength);
+      startFrameArray.Read(curPos, curPos + seqLength, &pulseStartFrame[0]);
+      if (read.startFrame) {delete [] read.startFrame; read.startFrame = NULL;}
+      read.startFrame = new unsigned int[read.length];
+      StoreField(pulseStartFrame, basToPlsIndex, read.startFrame, read.length);
+    }
+
+    if (includedFields["WidthInFrames"]) {
+      vector<HalfWord> pulseWidthInFrames;
+      pulseWidthInFrames.resize(seqLength);
+      plsWidthInFramesArray.Read(curPos, curPos + seqLength, &pulseWidthInFrames[0]);
+      if (read.widthInFrames) {delete [] read.widthInFrames; read.widthInFrames = NULL;}
+      read.widthInFrames = new HalfWord[read.length];
+      StoreField(pulseWidthInFrames, basToPlsIndex, read.widthInFrames, read.length);
+    }
+    
+		if (includedFields["MidSignal"]) {
+            if (read.midSignal) {delete [] read.midSignal; read.midSignal = NULL;}
+      read.midSignal = new HalfWord[read.length];
+      ReadSignal("MidSignal", midSignalArray, midSignalMatrix, seqLength, midSignalNDims, 
+                 read.seq, read.length, basToPlsIndex, read.midSignal);
+    }
+    
+		if (includedFields["MaxSignal"]) {
+        if (read.maxSignal) {delete [] read.maxSignal; read.maxSignal = NULL;}
+      read.maxSignal = new HalfWord[read.length];
+      ReadSignal("MaxSignal", maxSignalArray, maxSignalMatrix, seqLength, maxSignalNDims, 
+                 read.seq, read.length, basToPlsIndex, read.maxSignal);
+		}
+
+		if (includedFields["MeanSignal"]) {
+            if (read.meanSignal) {delete [] read.meanSignal; read.meanSignal = NULL;}
+      read.meanSignal = new HalfWord[read.length];
+      ReadSignal("MeanSignal", meanSignalArray, meanSignalMatrix, seqLength, meanSignalNDims, 
+                 read.seq, read.length, basToPlsIndex, read.meanSignal);
+		}
+
+		if (includedFields["ClassifierQV"]) {
+      vector<float> pulseClassifierQV;
+      pulseClassifierQV.resize(seqLength);
+      classifierQVArray.Read(curPos, curPos + seqLength, &pulseClassifierQV[0]);
+      if (read.classifierQV) {delete [] read.classifierQV; read.classifierQV = NULL;}
+      read.classifierQV = new float[read.length];
+      StoreField(pulseClassifierQV, basToPlsIndex, read.classifierQV, read.length);
+		}
+    
+    curRead++;
+    curPos += seqLength;
+    } catch (DataSetIException e) {
+        cout << "ERROR, could not read pulse metrics for SMRTSequence "
+             << read.GetName() << endl;
+        exit(1);
+    }
+    return 1;
+	}
+	
+
+	void Close() {
+		
+	}
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFPlsWriter.hpp b/libcpp/hdf/HDFPlsWriter.hpp
new file mode 100644
index 0000000..9efc92b
--- /dev/null
+++ b/libcpp/hdf/HDFPlsWriter.hpp
@@ -0,0 +1,195 @@
+#ifndef _BLASR_HDF_PLS_WRITER_HPP_
+#define _BLASR_HDF_PLS_WRITER_HPP_
+
+#include "data/hdf/HDFArray.h"
+#include "data/hdf/BufferedHDFArray.h"
+#include "data/hdf/HDF2DArray.h"
+#include "data/hdf/BufferedHDF2DArray.h"
+#include "data/hdf/HDFAtom.h"
+#include "data/hdf/HDFFile.h"
+#include "data/hdf/PlatformId.h"
+#include "utils/SMRTReadUtils.h"
+#include "FASTQSequence.h"
+#include <sstream>
+
+using namespace H5;
+using namespace std;
+
+class HDFPlsWriter {
+	HDFFile outFile;
+	string hdfFileName;
+	string movieName, runCode;
+	PlatformId platformId;
+	static const int bufferSize = 16;
+	
+	BufferedHDFArray<int> nElemArray;
+	BufferedHDFArray<int> zmwXCoordArray;
+	BufferedHDFArray<int> zmwYCoordArray;
+	BufferedHDFArray<char> baseArray;
+	BufferedHDFArray<unsigned char> qualArray;
+
+	/*
+	HDFArray<int> nElemArray;
+	HDFArray<int> zmwXCoordArray;
+	HDFArray<int> zmwYCoordArray;
+	HDFArray<char> baseArray;
+	HDFArray<unsigned char> qualArray;
+	*/
+	HDFAtom<string> movieNameAtom, runCodeAtom;
+
+	//
+	// Astro specific arrays.
+	//
+	BufferedHDF2DArray<uint16_t> holeXY2D;
+
+	//
+	// Springfield specific arrays.
+	//
+	BufferedHDFArray<unsigned int> holeNumberArray;
+	
+	//
+	// Define arrays for rich quality values.
+	// 
+
+	BufferedHDFArray<unsigned char> deletionQVArray;
+	BufferedHDFArray<unsigned char> deletionTagArray;
+	BufferedHDFArray<unsigned char> insertionQVArray;
+	BufferedHDFArray<unsigned char> substitutionTagArray;
+	BufferedHDFArray<unsigned char> substitutionQVArray;
+
+
+	BufferedHDF2DArray<unsigned char> preBaseDeletionQVArray;
+	HDFGroup rootGroup;
+	Group runInfoGroup;
+	Group baseCallGroup;
+	Group zmwGroup;
+ public:
+	~HDFPlsWriter() { 
+		nElemArray.Flush();
+		zmwXCoordArray.Flush();
+		zmwYCoordArray.Flush();
+		baseArray.Flush();
+		qualArray.Flush();
+		deletionQVArray.Flush();
+		deletionTagArray.Flush();
+		insertionQVArray.Flush();
+		substitutionTagArray.Flush();
+		substitutionQVArray.Flush();
+		holeNumberArray.Flush();
+	}
+	
+	HDFPlsWriter() {
+		/*
+		 * Default to astro for now.  This may need to change to a NO_ID
+		 * platform, in which case it must be set with Initialize().
+		 */
+		platformId = Astro;
+	}
+	void AddMovieName(string movieName) {
+		movieNameAtom.Create(runInfoGroup, "MovieName",movieName);
+	}
+	/*
+	 * Initialization without a runCode is implicitly a springfield
+	 * platform.  You can change it if you really want.
+	 */
+	void Initialize(string _hdfFileName, string movieName, PlatformId _platformId = SpringfieldPlatform) {
+		Initialize(_hdfFileName, _platformId);
+		AddMovieName(movieName);
+	}
+	void Initialize(string _hdfFileName, string movieName, string runCode, PlatformId _platformId = Astro) {
+		Initialize(_hdfFileName, _platformId);
+		if (movieName != "" and runCode != "")
+			AddRunInfo(movieName, runCode);
+	}
+
+	void AddRunInfo(string movieName, string runCode) {
+		AddMovieName(movieName);
+		runCodeAtom.Create(runInfoGroup, "RunCode", runCode);
+	}
+
+	void Initialize(string _hdfFileName, PlatformId _platformId) {
+		hdfFileName = _hdfFileName;
+		platformId  = _platformId;
+		outFile.Create(hdfFileName);
+		rootGroup.Initialize(*outFile.hdfFile, "/");
+		rootGroup.AddGruop("PulseData");
+		rootGroup.AddGroup("PulseData/BaesCalls");
+		rootGroup.AddGroup("PulseData/BaseCalls/ZMW"); 
+		rootGroup.AddGroup("ScanData/RunInfo"); 
+		outFile.OpenGroup("ScanData/RunInfo", runInfoGroup);
+		outFile.OpenGroup("PulseData/BaseCalls", baseCallGroup);
+		outFile.OpenGroup("PulseData/BaseCalls/ZMW", zmwGroup);
+
+		nElemArray.Initialize(&zmwGroup, "NumEvent", bufferSize);
+		baseArray.Initialize(&baseCallGroup, "Basecall", bufferSize);
+		qualArray.Initialize(&baseCallGroup, "QualityValue", bufferSize);
+
+		deletionQVArray.Initialize(&baseCallGroup, "DeletionQV", bufferSize);
+		deletionTagArray.Initialize(&baseCallGroup, "DeletionTag", bufferSize);
+		insertionQVArray.Initialize(&baseCallGroup, "InsertionQV", bufferSize);
+		preBaseDeletionQVArray.Initialize(&baseCallGroup, "PreBaseDeletionQV", 4, bufferSize);
+		substitutionTagArray.Initialize(&baseCallGroup, "SubstitutionTag", bufferSize);
+		substitutionQVArray.Initialize(&baseCallGroup, "SubstitutionQV", bufferSize);
+
+		if (platformId == Astro) {
+			holeXY2D.Initialize(&zmwGroup, "HoleXY", 2, bufferSize);
+		}
+		else if (platformId == SpringfieldPlatform) {
+			holeNumberArray.Initialize(&zmwGroup, "HoleNumber", bufferSize);
+		}
+	}
+
+	int Write(FASTQSequence &seq) {
+		int lenArray[1] = {seq.length};
+		nElemArray.Write(lenArray, 1);
+		qualArray.Write(seq.qual, seq.length);
+		baseArray.Write((const char*) seq.seq, seq.length);
+
+		if (seq.deletionQV != NULL) {
+			deletionQVArray.Write(seq.deletionQV, seq.length);
+		}
+		if (seq.preBaseDeletionQV != NULL) {
+			DNALength readPos;
+			for (readPos = 0; readPos < seq.length; readPos++) {
+				preBaseDeletionQVArray.WriteRow(&seq.preBaseDeletionQV[readPos*4], 4);
+			}
+		}
+		if (seq.deletionTag != NULL) {
+			deletionTagArray.Write(seq.deletionTag, seq.length);
+		}
+		if (seq.insertionQV != NULL) {
+			insertionQVArray.Write(seq.insertionQV, seq.length);
+		}
+		if (seq.substitutionQV != NULL) {
+			substitutionQVArray.Write(seq.substitutionQV, seq.length);
+		}
+		if (seq.substitutionTag != NULL) {
+			substitutionTagArray.Write(seq.substitutionTag, seq.length);
+		}
+
+		if (platformId == Astro) {
+			// now extract the x an y coordinates.
+			int x, y;
+			GetSMRTReadCoordinates(seq, x, y);
+			uint16_t xy[2] = {(uint16_t) x, (uint16_t) y};
+			holeXY2D.WriteRow(xy, 2);
+			int holeNumber = 0;
+			seq.GetHoleNumber(holeNumber);
+			holeNumberArray.Write(&holeNumber, 1);			
+		}
+		else if( platformId == SpringfieldPlatform){ 
+			unsigned int holeNumber;
+			GetSpringfieldHoleNumberFromTitle(seq, holeNumber);
+			holeNumberArray.Write(&holeNumber, 1);
+		}
+		// For now say this always works. HDF will choke if a problem
+		// happens.
+		return 1;
+	}
+};
+
+
+
+
+
+#endif
diff --git a/libcpp/hdf/HDFPulseDataFile.cpp b/libcpp/hdf/HDFPulseDataFile.cpp
new file mode 100644
index 0000000..cd88874
--- /dev/null
+++ b/libcpp/hdf/HDFPulseDataFile.cpp
@@ -0,0 +1,151 @@
+#include "HDFPulseDataFile.hpp"
+
+using namespace std;
+
+int HDFPulseDataFile::GetAllReadLengths(vector<DNALength> &readLengths) {
+    nReads = zmwReader.numEventArray.arrayLength;
+    readLengths.resize(nReads);
+    zmwReader.numEventArray.Read(0,nReads, (int*) &readLengths[0]);
+    return readLengths.size();
+}
+
+void HDFPulseDataFile::CheckMemoryAllocation(long allocSize, long allocLimit, const char *fieldName) {
+    if (allocSize > allocLimit) {
+        if (fieldName == NULL) {
+            cout << "Allocating too large of memory" << endl;
+        }
+        else {
+            cout << "Allocate size " << allocSize << " > allocate limit " << allocLimit << endl;
+            cout << "ERROR! Reading the dataset " << fieldName << " will use too much memory." << endl;
+            cout << "The pls/bas file is too large, exiting." << endl;
+        }
+        exit(1);
+    }
+}
+
+HDFPulseDataFile::HDFPulseDataFile() {
+    pulseDataGroupName = "PulseData";
+    nReads             = 0;
+    useScanData        = false;
+    closeFileOnExit    = false;
+    maxAllocNElements  = INT_MAX;
+    preparedForRandomAccess = false;
+    rootGroupPtr       = NULL;
+}
+
+void HDFPulseDataFile::PrepareForRandomAccess() {
+    GetAllReadLengths(eventOffset);
+    size_t i;
+    int curOffset = 0;
+    for (i = 0; i < eventOffset.size(); i++) {
+        int curLength = eventOffset[i];
+        eventOffset[i] = curOffset;
+        curOffset = curOffset + curLength;
+    }
+    nReads = eventOffset.size();
+    preparedForRandomAccess = true;
+}
+
+
+int HDFPulseDataFile::OpenHDFFile(string fileName, 
+    const H5::FileAccPropList & fileAccPropList) {
+
+    try {
+        H5::FileAccPropList propList = fileAccPropList;
+        H5::Exception::dontPrint();
+        hdfBasFile.openFile(fileName.c_str(), H5F_ACC_RDONLY, propList);	
+    }
+    catch (H5::Exception &e) {
+        cout << "ERROR, could not open hdf file" << fileName << ", exiting." << endl;
+        exit(1);
+    }
+    closeFileOnExit = true;
+    return 1;
+}
+
+//
+// All pulse data files contain the "PulseData" group name.
+// 
+//
+int HDFPulseDataFile::InitializePulseDataFile(string fileName, 
+    const H5::FileAccPropList & fileAccPropList) {
+
+    if (OpenHDFFile(fileName, fileAccPropList) == 0) return 0;
+    return 1;
+}
+
+int HDFPulseDataFile::Initialize(string fileName, 
+    const H5::FileAccPropList & fileAccPropList) {
+
+    if (InitializePulseDataFile(fileName, fileAccPropList) == 0) {
+        return 0;
+    }
+    //
+    // The pulse group is contained directly below the root group.
+    //
+    if (rootGroup.Initialize(hdfBasFile, "/") == 0) {
+        return 0;
+    }
+    rootGroupPtr = &rootGroup;
+    return Initialize();
+}
+
+//
+// Initialize inside another open group.
+//
+int HDFPulseDataFile::Initialize(HDFGroup *rootGroupP) {
+    rootGroupPtr = rootGroupP;
+    return Initialize();
+}
+
+//
+// Initialize all fields 
+//
+int HDFPulseDataFile::Initialize() {
+    preparedForRandomAccess = false;		
+    if (InitializePulseGroup() == 0) return 0;
+    if (rootGroupPtr->ContainsObject("ScanData")) {
+        if (scanDataReader.Initialize(rootGroupPtr) == 0) {
+            return 0;
+        }
+        else {
+            useScanData = true;
+        }
+    }
+    return 1;
+}
+
+int HDFPulseDataFile::InitializePulseGroup() {
+    if (pulseDataGroup.Initialize(rootGroupPtr->group, pulseDataGroupName) == 0) return 0;
+    return 1;
+}
+
+int HDFPulseDataFile::GetAllHoleNumbers(vector<unsigned int> &holeNumbers) {
+    CheckMemoryAllocation(zmwReader.holeNumberArray.arrayLength, maxAllocNElements, "HoleNumbers (base)");
+    holeNumbers.resize(nReads);
+    zmwReader.holeNumberArray.Read(0,nReads, (unsigned int*)&holeNumbers[0]);
+    return holeNumbers.size();
+}	
+
+void HDFPulseDataFile::Close() {
+    if (useScanData) {
+        scanDataReader.Close();
+    }
+
+    pulseDataGroup.Close();
+    if (rootGroupPtr == &rootGroup) {
+        rootGroup.Close();
+    }
+    /*
+       cout << "there are " <<  hdfBasFile.getObjCount(H5F_OBJ_FILE) << " open files upon closing." <<endl;
+       cout << "there are " <<  hdfBasFile.getObjCount(H5F_OBJ_DATASET) << " open datasets upon closing." <<endl;
+       cout << "there are " <<  hdfBasFile.getObjCount(H5F_OBJ_GROUP) << " open groups upon closing." <<endl;
+       cout << "there are " <<  hdfBasFile.getObjCount(H5F_OBJ_DATATYPE) << " open datatypes upon closing." <<endl;
+       cout << "there are " <<  hdfBasFile.getObjCount(H5F_OBJ_ATTR) << " open attributes upon closing." <<endl;
+       */
+    if (closeFileOnExit) {
+        hdfBasFile.close();
+    }
+
+
+}
diff --git a/libcpp/hdf/HDFPulseDataFile.hpp b/libcpp/hdf/HDFPulseDataFile.hpp
new file mode 100644
index 0000000..0cec337
--- /dev/null
+++ b/libcpp/hdf/HDFPulseDataFile.hpp
@@ -0,0 +1,67 @@
+#ifndef _BLASR_HDF_PULSE_DATA_FILE_HPP_
+#define _BLASR_HDF_PULSE_DATA_FILE_HPP_
+
+#include <string>
+#include <vector>
+#include "H5Cpp.h"
+#include "HDFGroup.hpp"
+#include "HDFZMWReader.hpp"
+#include "HDFScanDataReader.hpp"
+
+class HDFPulseDataFile {
+public:
+    H5::H5File hdfBasFile;
+    HDFGroup pulseDataGroup;
+    HDFGroup rootGroup;
+    HDFGroup *rootGroupPtr;
+    string pulseDataGroupName;
+    HDFScanDataReader scanDataReader;
+    bool useScanData;
+    bool closeFileOnExit;
+    int  maxAllocNElements;
+    HDFZMWReader zmwReader;
+    std::vector<unsigned int> eventOffset;
+    int nReads;
+    bool preparedForRandomAccess;
+
+    int GetAllReadLengths(std::vector<DNALength> &readLengths); 
+
+    void CheckMemoryAllocation(long allocSize, long allocLimit, 
+        const char *fieldName = NULL); 
+
+    HDFPulseDataFile(); 
+
+    void PrepareForRandomAccess(); 
+
+    int OpenHDFFile(std::string fileName, 
+        const H5::FileAccPropList & fileAccPropList=H5::FileAccPropList::DEFAULT); 
+
+    //
+    // All pulse data files contain the "PulseData" group name.
+    // 
+    //
+    int InitializePulseDataFile(std::string fileName, 
+        const H5::FileAccPropList & fileAccPropList=H5::FileAccPropList::DEFAULT); 
+
+    int Initialize(std::string fileName, 
+        const H5::FileAccPropList & fileAccPropList=H5::FileAccPropList::DEFAULT); 
+
+    //
+    // Initialize inside another open group.
+    //
+    int Initialize(HDFGroup *rootGroupP); 
+
+    //
+    // Initialize all fields 
+    //
+    int Initialize(); 
+
+    int InitializePulseGroup(); 
+
+    int GetAllHoleNumbers(std::vector<unsigned int> &holeNumbers); 
+
+    void Close(); 
+
+};
+
+#endif
diff --git a/libcpp/hdf/HDFRefGroupGroup.hpp b/libcpp/hdf/HDFRefGroupGroup.hpp
new file mode 100644
index 0000000..727b311
--- /dev/null
+++ b/libcpp/hdf/HDFRefGroupGroup.hpp
@@ -0,0 +1,65 @@
+#ifndef HDF_REF_GROUP_H_
+#define HDF_REF_GROUP_H_
+
+#include "HDFAtom.hpp"
+#include "HDFArray.hpp"
+#include "HDFGroup.hpp"
+#include "saf/RefGroup.hpp"
+
+class HDFRefGroupGroup {
+ public:
+	HDFGroup refGroup;
+	HDFArray<uint32_t>  idArray;
+	HDFStringArray pathArray;
+
+	HDFArray<uint32_t> refInfoIdArray;
+
+	~HDFRefGroupGroup() {
+		refGroup.Close();
+	}
+	
+  bool Create(HDFGroup &parent) {
+    parent.AddGroup("RefGroup");
+		if (refGroup.Initialize(parent.group, "RefGroup") == 0) {
+      return 0;
+    }
+    idArray.Create(refGroup, "ID");
+    pathArray.Create(refGroup, "Path");
+    refInfoIdArray.Create(refGroup, "RefInfoID");
+    return true;
+  }
+
+  int AddPath(string path, unsigned int refInfoId) {
+    pathArray.Write(&path, 1);
+    unsigned int numPath = pathArray.size();
+    idArray.Write(&numPath, 1);
+    refInfoIdArray.Write(&refInfoId, 1);
+    return numPath;
+  }
+
+	int Initialize(HDFGroup &rootGroup) {
+		refGroup.Initialize(rootGroup.group, "RefGroup");
+		
+		if (idArray.Initialize(refGroup, "ID") == 0) { return 0; }
+		if (pathArray.Initialize(refGroup, "Path") == 0) { return 0; }
+		if (refInfoIdArray.Initialize(refGroup, "RefInfoID") == 0) { return 0; }
+		
+		return 1;
+	}
+
+	void Read(RefGroup &refGroup) {
+        int pathArrayNElem = pathArray.arrayLength;
+        refGroup.path.resize(pathArrayNElem);
+        pathArray.Read(0, pathArrayNElem, &refGroup.path[0]);
+
+		int idArrayNElem = idArray.arrayLength;
+		refGroup.id.resize(idArrayNElem);
+		idArray.Read(0, idArrayNElem, &refGroup.id[0]);
+
+		int refIDNElem = refInfoIdArray.arrayLength;
+		refGroup.refInfoId.resize(refIDNElem);
+		refInfoIdArray.Read(0, refIDNElem, &refGroup.refInfoId[0]);
+	}
+};
+
+#endif
diff --git a/libcpp/hdf/HDFRefInfoGroup.hpp b/libcpp/hdf/HDFRefInfoGroup.hpp
new file mode 100644
index 0000000..72a85fe
--- /dev/null
+++ b/libcpp/hdf/HDFRefInfoGroup.hpp
@@ -0,0 +1,84 @@
+#ifndef _BLASR_HDF_REF_INFO_HPP_
+#define _BLASR_HDF_REF_INFO_HPP_
+
+#include "saf/RefInfo.hpp"
+
+class HDFRefInfoGroup {
+ public:
+  HDFGroup refInfoGroup;
+  HDFStringArray fullNameArray;
+  HDFArray<uint32_t> idArray;
+  HDFArray<uint32_t> lengthArray;
+  HDFStringArray md5Array;
+
+  bool Create(HDFGroup &parent) {
+    parent.AddGroup("RefInfo");
+    if (refInfoGroup.Initialize(parent.group, "RefInfo") == 0) { return 0; }
+    
+    fullNameArray.Create(refInfoGroup, "FullName");
+    idArray.Create(refInfoGroup, "ID");
+    lengthArray.Create(refInfoGroup, "Length");
+    md5Array.Create(refInfoGroup, "MD5");
+    return true;
+  }
+
+  void AddRefInfo(string &fullName, unsigned int id, unsigned int length, string md5) {
+    fullNameArray.Write(&fullName, 1);
+    idArray.Write(&id, 1);
+    lengthArray.Write(&length, 1);
+    md5Array.Write(&md5, 1);
+  }
+  
+  
+  unsigned int AddRefInfo(string &fullName, unsigned int length, string md5) {
+    unsigned int numRefs = fullNameArray.size();
+    unsigned int id = numRefs + 1; // refInfo Id is 1 based
+    assert(numRefs == idArray.size() &&
+           numRefs == lengthArray.size() &&
+           numRefs == md5Array.size());
+    AddRefInfo(fullName, id, length, md5);
+    return id;
+  }
+  
+  int Initialize(HDFGroup &parentGroup) {
+    if (refInfoGroup.Initialize(parentGroup.group, "RefInfo") == 0) { return 0; }
+    if (fullNameArray.Initialize(refInfoGroup, "FullName") == 0) { return 0;}
+    if (idArray.Initialize(refInfoGroup,"ID") == 0) { return 0;}
+    if (lengthArray.Initialize(refInfoGroup, "Length") == 0) { return 0;}
+    if (md5Array.Initialize(refInfoGroup, "MD5") == 0) { return 0;}
+    return 1;
+  }
+
+  ~HDFRefInfoGroup() {
+    refInfoGroup.Close();
+  }
+
+  void Read(RefInfo &refInfo) {
+    UInt nRow = fullNameArray.size();
+    refInfo.fullName.resize(nRow);
+    refInfo.id.resize(nRow);
+    refInfo.length.resize(nRow);
+    refInfo.md5.resize(nRow);
+    /*
+    if (refInfo.fullName.size() != refInfo.id.size() or
+        refInfo.id.size() != refInfo.length.size() or
+        refInfo.length.size() != refInfo.md5.size()) {
+      cout << "Error with the RefInfo group in a cmp.h5 file.  The datasets " << endl
+           << "are of different lengths but should be the same." << endl;
+      exit(1);
+    }
+    */
+    int i;
+    for (i = 0; i < refInfo.fullName.size();i++) {
+      fullNameArray.Read(i,i+1,&refInfo.fullName[i]);
+    }
+    for (i = 0; i < refInfo.md5.size(); i++) {
+      md5Array.Read(i, i+1, &refInfo.md5[i]);
+    }
+    lengthArray.Read(0, refInfo.length.size(), &refInfo.length[0]);
+    idArray.Read(0, refInfo.id.size(), &refInfo.id[0]);
+  }
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFRegionTableReader.cpp b/libcpp/hdf/HDFRegionTableReader.cpp
new file mode 100644
index 0000000..80bc2db
--- /dev/null
+++ b/libcpp/hdf/HDFRegionTableReader.cpp
@@ -0,0 +1,149 @@
+#include "HDFRegionTableReader.hpp"
+
+using namespace std;
+
+int HDFRegionTableReader::Initialize(string &regionTableFileName, 
+        const H5::FileAccPropList & fileAccPropList) {
+    /*
+     * Initialize access to the HDF file.
+     */
+    try {
+        regionTableFile.Open(regionTableFileName.c_str(), H5F_ACC_RDONLY, fileAccPropList);
+    }
+    catch (H5::Exception &e) {
+        cout << e.getDetailMsg() << endl;
+        return 0;
+    }
+    if (pulseDataGroup.Initialize(regionTableFile.rootGroup, "PulseData") == 0) {
+        return 0;
+    }
+    if (pulseDataGroup.ContainsObject("Regions") == 0) {
+        fileContainsRegionTable = false;
+        return 0;
+    }
+    else {
+        fileContainsRegionTable = true;
+    }
+
+    if (regions.Initialize(pulseDataGroup, "Regions") == 0) {
+        return 0;
+    }
+
+    nRows = regions.GetNRows();
+
+    if (columnNames.Initialize(regions.dataset, "ColumnNames") == 0) {
+        return 0;
+    }
+    if (regionTypes.Initialize(regions.dataset, "RegionTypes") == 0) {
+        return 0;
+    }
+    if (regionDescriptions.Initialize(regions.dataset, "RegionDescriptions") == 0) {
+        return 0;
+    }
+    if (regionSources.Initialize(regions.dataset,  "RegionSources") == 0) {
+        return 0;
+    }
+
+    curRow = 0;
+    return 1;
+}
+
+int HDFRegionTableReader::GetNext(RegionAnnotation &annotation) {
+    //
+    // Bail with no-op if this is the last row.
+    //
+
+    if (fileContainsRegionTable == false) {
+        return 0;
+    }
+
+    if (curRow == nRows) {
+        return 0;
+    }
+
+    regions.Read(curRow, curRow+1, annotation.row);
+    ++curRow;
+    return 1;
+}	
+
+void HDFRegionTableReader::RegionTypesToMap(RegionTable &table) {
+    size_t i;
+    table.regionTypeEnums.resize(table.regionTypes.size());
+    for (i = 0;i < table.regionTypes.size(); i++) {
+        if (table.regionTypes[i] == "GlobalAccuracy") {
+            table.regionTypeEnums[i] = GlobalAccuracy;
+        }
+        else if (table.regionTypes[i] == "HQRegion") {
+            table.regionTypeEnums[i] = HQRegion;
+        }
+        else if (table.regionTypes[i] == "Adapter") {
+            table.regionTypeEnums[i] = Adapter;
+        }
+        else if (table.regionTypes[i] == "Insert") {
+            table.regionTypeEnums[i] = Insert;
+        }
+        else if (table.regionTypes[i] == "Accuracy") {
+            table.regionTypeEnums[i] = Insert;
+        }
+        else if (table.regionTypes[i] == "ArtifactRegion") {
+            table.regionTypeEnums[i] = ArtifactRegion;
+        }
+        else {
+            cout << "ERROR! Region Type " << table.regionTypes[i] << " is not supported.  Check Enumerations.h" << endl;
+            assert(0);
+        }
+    }
+}
+
+int HDFRegionTableReader::ReadTableAttributes(RegionTable &table) {
+    if (fileContainsRegionTable == false) {
+        return 0;
+    }
+    columnNames.Read(table.columnNames);
+    regionTypes.Read(table.regionTypes);
+    RegionTypesToMap(table);
+    regionDescriptions.Read(table.regionDescriptions);
+    regionSources.Read(table.regionSources);
+    // All ok.
+    return 1;
+}
+
+void HDFRegionTableReader::Close() {
+    pulseDataGroup.Close();
+    regions.Close();
+    regionTableFile.Close();
+}
+
+void HDFRegionTableReader::ReadTable(RegionTable &table) {
+    if (fileContainsRegionTable == false) {
+        return;
+    }
+    ReadTableAttributes(table);
+    table.table.resize(nRows);
+    int i = 0;
+    while(GetNext(table.table[curRow])) {
+        i++;
+    }
+}
+
+
+void HDFRegionTableReader::GetMinMaxHoleNumber(UInt &minHole,
+                                               UInt &maxHole) {
+    // Hole numbers may not be sorted ascendingly, so do not
+    // return the first and last hole numbers as the min and max.
+    UInt saveCurRow = curRow;
+    curRow = 0;
+    bool init = false;
+    RegionAnnotation annotation;
+    while (GetNext(annotation) == 1) {
+        UInt curHole = annotation.GetHoleNumber();
+        if (not init) {
+            minHole = maxHole = curHole;
+            init = true;
+        } else {
+            minHole = (minHole > curHole)?(curHole):(minHole);
+            maxHole = (maxHole < curHole)?(curHole):(maxHole);
+        }
+    }
+    curRow = saveCurRow;
+}
diff --git a/libcpp/hdf/HDFRegionTableReader.hpp b/libcpp/hdf/HDFRegionTableReader.hpp
new file mode 100644
index 0000000..470cddf
--- /dev/null
+++ b/libcpp/hdf/HDFRegionTableReader.hpp
@@ -0,0 +1,47 @@
+#ifndef _BLASR_HDF_REGION_TABLE_READER_HPP_
+#define _BLASR_HDF_REGION_TABLE_READER_HPP_
+
+#include <string>
+#include <vector>
+
+#include "H5Cpp.h"
+
+#include "reads/RegionTable.hpp"
+#include "HDFFile.hpp"
+#include "HDFArray.hpp"
+#include "HDF2DArray.hpp"
+#include "HDFAtom.hpp"
+
+
+class HDFRegionTableReader {
+public:
+    HDFFile regionTableFile;
+    HDFGroup pulseDataGroup;
+    HDF2DArray<int> regions;
+
+    HDFAtom<std::vector<std::string> > regionTypes;
+    HDFAtom<std::vector<std::string> > regionDescriptions;
+    HDFAtom<std::vector<std::string> > regionSources;
+    HDFAtom<std::vector<std::string> > columnNames;
+    int curRow;
+    int nRows;
+    bool fileContainsRegionTable;
+
+    int Initialize(std::string &regionTableFileName, 
+            const H5::FileAccPropList & fileAccPropList = H5::FileAccPropList::DEFAULT); 
+
+    int GetNext(RegionAnnotation &annotation); 
+
+    void RegionTypesToMap(RegionTable &table); 
+
+    int ReadTableAttributes(RegionTable &table); 
+
+    void Close(); 
+
+    void ReadTable(RegionTable &table); 
+    
+    void GetMinMaxHoleNumber(UInt &minHole, UInt &maxHole);
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFRegionTableWriter.hpp b/libcpp/hdf/HDFRegionTableWriter.hpp
new file mode 100644
index 0000000..f1c38b9
--- /dev/null
+++ b/libcpp/hdf/HDFRegionTableWriter.hpp
@@ -0,0 +1,140 @@
+#ifndef _BLASR_HDF_REGION_TABLE_WRITER_HPP_
+#define _BLASR_HDF_REGION_TABLE_WRITER_HPP_
+
+#include <string>
+
+#include "Enumerations.h"
+#include "reads/RegionTable.hpp"
+#include "HDFFile.hpp"
+#include "HDFArray.hpp"
+#include "HDF2DArray.hpp"
+#include "HDFAtom.hpp"
+
+
+using namespace H5;
+using namespace std;
+
+
+class HDFRegionTableWriter {
+public:
+	HDFFile regionTableFile;
+
+	HDF2DArray<int> regions;
+	HDFAtom<vector<string> > regionTypes;
+	HDFAtom<vector<string> > regionDescriptions;
+	HDFAtom<vector<string> > regionSources;
+	HDFAtom<vector<string> > columnNames;
+	int curRow;
+	int nRows;
+	HDFGroup *parentGroupPtr, pulseDataGroup;
+
+    void CreateGroupStructure() {
+
+        regionTableFile.rootGroup.AddGroup("PulseData");
+        if (pulseDataGroup.Initialize(regionTableFile.rootGroup, "PulseData") == 0) {
+            cout << "Could not create group PulseData. This is a bug." << endl;
+            exit(1);
+        }
+        parentGroupPtr = &pulseDataGroup;
+        regions.Initialize(pulseDataGroup, "Regions", RegionAnnotation::NCOLS);
+
+    }
+
+    int Create(string fileName) {
+        H5File newFile(fileName.c_str(), H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, FileAccPropList::DEFAULT);  
+        regionTableFile.hdfFile.openFile(fileName.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);    
+        regionTableFile.rootGroup.Initialize(regionTableFile.hdfFile, "/");
+        CreateGroupStructure();
+    }
+
+    HDFRegionTableWriter() {
+        curRow = 0;
+        nRows  = 0;
+        parentGroupPtr = NULL;
+    }
+
+    int Initialize(HDFGroup &parentGroupP) {
+        /*
+         * Initialize in an existing file.
+         */
+        parentGroupPtr = &parentGroupP;
+        return Initialize();
+    }
+
+    int Initialize(string &regionTableFileName, 
+            const H5::FileAccPropList & fileAccPropList = H5::FileAccPropList::DEFAULT) {
+        /*
+         * Initialize access to the HDF file.
+         */
+        try {
+            regionTableFile.Open(regionTableFileName, H5F_ACC_TRUNC, fileAccPropList);
+        }
+        catch (Exception &e) {
+            cout << e.getDetailMsg() << endl;
+            return 0;
+        }
+        CreateGroupStructure();
+        return 1;
+    }
+
+    int Initialize() {
+
+        if (regions.Initialize(*parentGroupPtr, "Regions", RegionAnnotation::NCOLS) == 0) {
+            return 0;
+        }
+        nRows = regions.GetNRows();
+
+
+        curRow = 0;
+        return 1;
+    }
+
+    void Finalize(vector<string> &columnNamesVect, 
+            vector<string> &regionTypesVect,
+            vector<string> &regionDescriptionsVect,
+            vector<string> &regionSourcesVect) {
+        //
+        // Make sure data has been written to the dataset.  If not, the
+        // dataset will not exist and creating the attributes will fail.
+        //
+        if (curRow > 0) {
+            regionTypes.Create(regions.dataset, "RegionTypes", regionTypesVect);
+            columnNames.Create(regions.dataset, "ColumnNames", columnNamesVect);
+            regionDescriptions.Create(regions.dataset, "RegionDescriptions", regionDescriptionsVect);
+            regionSources.Create(regions.dataset,  "RegionSources", regionSourcesVect);
+        }
+    }
+
+    void WriteRows(vector<RegionAnnotation> &annotations) {
+        int i;
+        for (i = 0; i < annotations.size(); i++) {
+            Write(annotations[i]);
+        }
+    }
+
+    int Write(RegionAnnotation &annotation, int at=-1) {
+        if (at == -1) {
+            regions.WriteRow(annotation.row, annotation.NCOLS);
+            ++curRow;
+        }
+        else {
+
+        }
+        return 1;
+    }	
+
+    void Close() {
+        regions.Close();
+        //
+        // Check to see if this is external
+        //
+        if (parentGroupPtr == &pulseDataGroup) {
+            pulseDataGroup.Close();
+        }
+        regionTableFile.rootGroup.Close();
+    }
+
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFSMRTSequenceReader.hpp b/libcpp/hdf/HDFSMRTSequenceReader.hpp
new file mode 100644
index 0000000..737f19e
--- /dev/null
+++ b/libcpp/hdf/HDFSMRTSequenceReader.hpp
@@ -0,0 +1,71 @@
+#ifndef _BLASR_HDF_SMRT_SEQUENCE_READER_HPP_
+#define _BLASR_HDF_SMRT_SEQUENCE_READER_HPP_
+
+#include "data/hdf/HDFBasReader.h"
+#include "data/hdf/HDFZMWReader.h"
+#include "SMRTSequence.h"
+
+template<typename T_SMRT_Sequence>
+class HDFSMRTSequenceReader : public HDFBasReader {
+ public:
+	HDFZMWReader zmwReader;
+	bool readQuality;
+	int Initialize(string hdfBasFileName, bool _readQuality=true, const H5::FileAccPropList & fileAccProplist=H5::FileAccPropList::DEFAULT) {
+		HDFBasReader::Initialize(hdfBasFileName, fileAccPropList);
+		zmwReader.Initialize(hdfBasFile);
+		readQuality = _readQuality;
+		if (baseCallsGroup.ContainsObject("WidthInFrames")) {
+			useWidthInFrames = InitializeField(baseCallsGroup, "WidthInFrames");
+		}
+		if (baseCallsGroup.ContainsObject("PreBaseFrames")) {
+			usePreBaseFrames = InitializeField(baseCallsGroup, "PreBaseFrames");
+		}
+		if (baseCallsGroup.ContainsObject("PulseIndex")) {
+			usePulseIndex = InitializeField(baseCallsGroup, "PulseIndex");
+		}
+		
+	}
+
+
+	int GetNext(T_SMRT_Sequence &seq) {
+		int retVal;
+		//
+		// Copy the curBasePos from the bas reader since it gets advanced
+		// in the GetNext function.
+		//
+		DNALength curBasePosCopy = curBasePos;
+		retVal = HDFBasReader::GetNext(seq);
+		//
+		// Bail now if the file is already done
+		if (retVal == 0) {
+			return retVal;
+		}
+		zmwReader.GetNext(seq.zmwData);
+		return retVal;
+	}
+	int Advance(int nSteps) {
+		int retVal;
+		retVal = HDFBasReader::Advance(nSteps);
+		zmwReader.Advance(nSteps);
+		return retVal;
+	}
+
+
+};
+
+template<>
+int HDFSMRTSequenceReader<FASTASequence>::GetNext(FASTASequence &seq) {
+		int retVal;
+		if (readQuality) {
+			retVal = HDFBasReader::GetNext(seq);
+		}
+		//
+		// Bail now if the file is already done
+		if (retVal == 0) {
+			return retVal;
+		}
+		zmwReader.GetNext(seq.zmwData);
+		return retVal;
+	}
+
+#endif
diff --git a/libcpp/hdf/HDFScanDataReader.cpp b/libcpp/hdf/HDFScanDataReader.cpp
new file mode 100644
index 0000000..daed4b2
--- /dev/null
+++ b/libcpp/hdf/HDFScanDataReader.cpp
@@ -0,0 +1,262 @@
+#include "HDFScanDataReader.hpp"
+
+using namespace std;
+
+HDFScanDataReader::HDFScanDataReader() {
+    //
+    // Assume the file is written without a movie name.  This is
+    // flipped when a movie name is found.
+    //
+    Reset();
+}
+
+void HDFScanDataReader::Reset() {
+    useMovieName    = false;
+    useRunCode      = false;
+    useWhenStarted  = false;
+    fileHasScanData = false;
+    movieName = "";
+    runCode   = "";
+    platformId      = NoPlatform;
+    initializedAcqParamsGroup = initializedRunInfoGroup = false;
+}
+
+int HDFScanDataReader::InitializeAcqParamsAtoms() {
+    if (frameRateAtom.Initialize(acqParamsGroup.group, "FrameRate") == 0) { return 0; }
+    if (numFramesAtom.Initialize(acqParamsGroup.group, "NumFrames") == 0) { return 0; }
+    if (acqParamsGroup.ContainsAttribute("WhenStarted")) {
+        if (whenStartedAtom.Initialize(acqParamsGroup.group, "WhenStarted") == 0) { return 0; }
+        useWhenStarted = true;
+    }
+    return 1;
+}
+
+//
+// This is created on top of a file that is already opened, so
+// instead of initializing by opening a file, it is initialized by
+// passing the root group that should contain the ScanData group.  
+// When shutting down, no file handle needs to be closed.
+//
+int HDFScanDataReader::Initialize(HDFGroup *pulseDataGroup) {
+
+    //
+    // Initiailze groups for reading data.
+    //
+
+    initializedAcqParamsGroup = false;
+    initializedRunInfoGroup   = false;
+    if (pulseDataGroup->ContainsObject("ScanData") == 0 or 
+            scanDataGroup.Initialize(pulseDataGroup->group, "ScanData") == 0) {
+        return 0;
+    }
+    fileHasScanData = true;
+
+    if (scanDataGroup.ContainsObject("DyeSet") == 0 or
+            dyeSetGroup.Initialize(scanDataGroup.group, "DyeSet") == 0) {
+        return 0;
+    }
+
+    if (scanDataGroup.ContainsObject("AcqParams") == 0 or
+            acqParamsGroup.Initialize(scanDataGroup.group, "AcqParams") == 0) {
+        return 0;
+    }
+    initializedAcqParamsGroup = true;
+
+    if (scanDataGroup.ContainsObject("RunInfo") == 0 or
+            runInfoGroup.Initialize(scanDataGroup.group, "RunInfo") == 0) {
+        return 0;
+    }
+    initializedRunInfoGroup = true;
+    if (InitializeAcqParamsAtoms() == 0) {
+        return 0;
+    }
+
+    //
+    // Read in the data that will be used later on either per read or
+    // when the entire bas/pls file is read.
+    //
+
+    if (ReadPlatformId(platformId) == 0) {
+        return 0;
+    }
+
+    if (runInfoGroup.ContainsAttribute("RunCode") and
+            runCodeAtom.Initialize(runInfoGroup, "RunCode")) {
+        useRunCode = true;
+    }
+
+    //
+    // Load baseMap which maps bases (ATGC) to channel orders.
+    // This should always be present.
+    //
+    if (LoadBaseMap(baseMap) == 0)
+        return 0;
+
+    //
+    // Attempt to load the movie name.  This is not always present.
+    //
+    LoadMovieName(movieName);
+
+    return 1;
+}
+
+string HDFScanDataReader::GetMovieName() {
+    // If this object is correctly initialized, movieName
+    // is guaranteed to be loaded if it exists, no need to reload.
+    return movieName;
+}
+
+string HDFScanDataReader::GetRunCode() {
+    return runCode;
+}
+
+int HDFScanDataReader::Read(ScanData &scanData) {
+    // All parameters below are required.
+    if (ReadPlatformId(scanData.platformId) == 0) return 0;
+    LoadMovieName(scanData.movieName);
+    LoadBaseMap(scanData.baseMap);
+
+    if (useRunCode) {
+        runCodeAtom.Read(scanData.runCode);
+    }
+    frameRateAtom.Read(scanData.frameRate);
+    numFramesAtom.Read(scanData.numFrames);
+
+    if (useWhenStarted) {
+        whenStartedAtom.Read(scanData.whenStarted);
+    }
+
+    return 1;
+}
+
+void HDFScanDataReader::ReadWhenStarted(string &whenStarted) {
+    whenStartedAtom.Read(whenStarted);
+}
+
+PlatformId HDFScanDataReader::GetPlatformId() {
+    return platformId;
+}
+
+int HDFScanDataReader::ReadPlatformId(PlatformId &pid) {
+    if (runInfoGroup.ContainsAttribute("PlatformId")) {
+        if (platformIdAtom.Initialize(runInfoGroup, "PlatformId") == 0) {
+            return 0;
+        }
+        platformIdAtom.Read((unsigned int&)pid);
+    }
+    else {
+        pid = Astro;
+    }
+    return 1;
+}
+
+int HDFScanDataReader::ReadStringAttribute(std::string & attributeValue,
+        const std::string & attributeName, HDFGroup & group,
+        HDFAtom<std::string> & atom) {
+
+    if (group.ContainsAttribute(attributeName) and
+        (atom.isInitialized or atom.Initialize(group, attributeName))) {
+        atom.Read(attributeValue);
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+int HDFScanDataReader::ReadBindingKit(std::string &bindingKit)
+{
+    return ReadStringAttribute(bindingKit, "BindingKit", runInfoGroup, bindingKitAtom);
+}
+
+int HDFScanDataReader::ReadSequencingKit(std::string &sequencingKit)
+{
+    return ReadStringAttribute(sequencingKit, "SequencingKit", runInfoGroup, sequencingKitAtom);
+}
+
+int HDFScanDataReader::LoadMovieName(string &movieNameP) {
+    // Groups for building read names
+    if (ReadStringAttribute(movieNameP, "MovieName", runInfoGroup, movieNameAtom) == 0) {
+        // Internal analysis may manually edit the movie name and set STRSIZE to a value
+        // which != movie name length. Handle this case. 
+        movieNameP = string(movieNameP.c_str()); 
+        return 0;
+    } else {
+        useMovieName = true;
+        int e = movieNameP.size() - 1;
+        while (e > 0 and movieNameP[e] == ' ') e--;
+        movieNameP = movieNameP.substr(0, e+1);
+        movieNameP = string(movieNameP.c_str());
+        return 1;
+    }
+}
+
+int HDFScanDataReader::LoadBaseMap(map<char, int> & baseMap) {
+    // Map bases to channel order in hdf pls file.
+    if (dyeSetGroup.ContainsAttribute("BaseMap") and
+            baseMapAtom.Initialize(dyeSetGroup, "BaseMap")) {
+        string baseMapStr;
+        baseMapAtom.Read(baseMapStr);
+        if (baseMapStr.size() != 4) {
+            cout << "ERROR, there are more than four types of bases "
+                << "according to /ScanData/DyeSet/BaseMap." << endl;
+            exit(1);
+        }
+        baseMap.clear();
+        for(size_t i = 0; i < baseMapStr.size(); i++) {
+            baseMap[toupper(baseMapStr[i])] = i;
+            baseMap[tolower(baseMapStr[i])] = i;
+        }
+        return 1;
+    }
+    return 0;
+}
+
+void HDFScanDataReader::Close() {
+    if (useMovieName) {
+        movieNameAtom.dataspace.close();
+    }
+    if (useRunCode) {
+        runCodeAtom.dataspace.close();
+    }
+    if (useWhenStarted) {
+        whenStartedAtom.dataspace.close();
+    }
+    baseMapAtom.dataspace.close();
+    platformIdAtom.dataspace.close();
+    frameRateAtom.dataspace.close();
+    numFramesAtom.dataspace.close();
+    sequencingKitAtom.dataspace.close();
+    bindingKitAtom.dataspace.close();
+
+    scanDataGroup.Close();
+    dyeSetGroup.Close();
+    acqParamsGroup.Close();
+    runInfoGroup.Close();
+    Reset();
+}
+
+
+std::string HDFScanDataReader::GetMovieName_and_Close(std::string & fileName) {
+    HDFFile file;
+    file.Open(fileName, H5F_ACC_RDONLY);
+
+    fileHasScanData = false;
+    if (file.rootGroup.ContainsObject("ScanData") == 0 or 
+        scanDataGroup.Initialize(file.rootGroup, "ScanData") == 0) {
+        return ""; 
+    }
+    fileHasScanData = true;
+
+    initializedRunInfoGroup = false;
+    if (scanDataGroup.ContainsObject("RunInfo") == 0 or
+        runInfoGroup.Initialize(scanDataGroup.group, "RunInfo") == 0) {
+        return "";
+    }
+    initializedRunInfoGroup = true;
+    
+    string movieName;
+    LoadMovieName(movieName);
+    Close();
+    file.Close();
+    return movieName;
+}
diff --git a/libcpp/hdf/HDFScanDataReader.hpp b/libcpp/hdf/HDFScanDataReader.hpp
new file mode 100644
index 0000000..7da6649
--- /dev/null
+++ b/libcpp/hdf/HDFScanDataReader.hpp
@@ -0,0 +1,101 @@
+#ifndef _BLASR_HDF_SCAN_DATA_READER_HPP_
+#define _BLASR_HDF_SCAN_DATA_READER_HPP_
+
+#include <map>
+#include <string>
+#include "Enumerations.h"
+#include "reads/ScanData.hpp"
+#include "HDFGroup.hpp"
+#include "HDFFile.hpp"
+#include "HDFAtom.hpp"
+
+//
+// The SanDataReader cannot live outside 
+
+class HDFScanDataReader {
+public:
+    bool fileHasScanData, useRunCode;
+    HDFGroup scanDataGroup;
+    HDFGroup dyeSetGroup;
+    HDFGroup acqParamsGroup;
+    HDFGroup runInfoGroup;
+    bool initializedAcqParamsGroup, initializedRunInfoGroup;
+    bool useWhenStarted;
+    HDFAtom<std::string> whenStartedAtom;
+    HDFAtom<unsigned int> platformIdAtom;
+    HDFAtom<float> frameRateAtom;
+    HDFAtom<unsigned int> numFramesAtom;
+    HDFAtom<std::string> movieNameAtom;
+    HDFAtom<std::string> runCodeAtom;
+    HDFAtom<std::string> baseMapAtom;
+    HDFAtom<std::string> bindingKitAtom;
+    HDFAtom<std::string> sequencingKitAtom;
+
+    //
+    // It is useful to cache the movie name in the reader since this is
+    // loaded once upon initialization, and may be fetched when loading
+    // reads one at a time.
+    //
+    bool   useMovieName;
+    std::string movieName, runCode;
+    std::map<char, int> baseMap;
+    PlatformId platformId;
+
+    HDFScanDataReader(); 
+
+    void Reset();
+
+    int InitializeAcqParamsAtoms(); 
+
+    //
+    // This is created on top of a file that is already opened, so
+    // instead of initializing by opening a file, it is initialized by
+    // passing the root group that should contain the ScanData group.  
+    // When shutting down, no file handle needs to be closed.
+    //
+    int Initialize(HDFGroup *pulseDataGroup); 
+
+    std::string GetMovieName(); 
+    
+    // Given a PacBio (pls/plx/bas/bax/ccs/rgn).h5 file, which contains its movie 
+    // name in group /ScanData/RunInfo attribute MovieName, open the file, return
+    // its movie name and finally close the file. Return "" if the movie name 
+    // does not exist. This is a short path to get movie name.
+    std::string GetMovieName_and_Close(std::string & fileName);
+
+    std::string GetRunCode(); 
+
+    int Read(ScanData &scanData); 
+
+    void ReadWhenStarted(std::string &whenStarted); 
+
+    PlatformId GetPlatformId(); 
+
+    int ReadPlatformId(PlatformId &pid); 
+
+    /// Reads value of Attribute /ScanData/RunInfo/BindingKit
+    int ReadBindingKit(std::string &bindingKit);
+
+    /// Reads value of Attribute /ScanData/RunInfo/SequencingKit
+    int ReadSequencingKit(std::string &sequencingKit);
+
+    int LoadMovieName(std::string &movieName); 
+
+    int LoadBaseMap(map<char, int> & baseMap); 
+
+    void Close(); 
+
+private:
+    /// Reads value of a string attribute within a HDFGroup.
+    /// \returns 1 if succesfully read value of the string attribute, 0 otherwise.
+    /// \param[out] attributeValue, value of a string attribute.
+    /// \param[in] attributeName, name of the string attribute.
+    /// \param[in] group, HDFGroup of the string attribute .
+    /// \param[in] atom, initialized HDFAtom obj for reading attribute .
+    int ReadStringAttribute(std::string & attributeValue, 
+                            const std::string & attributeName, 
+                            HDFGroup & group, HDFAtom<std::string> & atom); 
+
+};
+
+#endif
diff --git a/libcpp/hdf/HDFScanDataWriter.cpp b/libcpp/hdf/HDFScanDataWriter.cpp
new file mode 100644
index 0000000..874aba0
--- /dev/null
+++ b/libcpp/hdf/HDFScanDataWriter.cpp
@@ -0,0 +1,164 @@
+#include "HDFScanDataWriter.hpp"
+
+void HDFScanDataWriter::CreateAcqParamsGroup() {
+    if (acqParamsGroup.Initialize(scanDataGroup, "AcqParams") == 0) {
+        std::cout << "ERROR could not create /ScanData/AcqParams." << std::endl;
+        exit(1);
+    }
+    frameRateAtom.Create(acqParamsGroup.group, "FrameRate");
+    numFramesAtom.Create(acqParamsGroup.group, "NumFrames");
+    whenStartedAtom.Create(acqParamsGroup.group, "WhenStarted");
+}
+
+void HDFScanDataWriter::CreateDyeSetGroup(){
+    if (dyeSetGroup.Initialize(scanDataGroup, "DyeSet") == 0) {
+        std::cout << "ERROR could not create /ScanData/DyeSet." << std::endl;
+        exit(1);
+    }
+    baseMapAtom.Create(dyeSetGroup.group, "BaseMap");
+    numAnalogAtom.Create(dyeSetGroup.group, "NumAnalog");
+}
+
+void HDFScanDataWriter::CreateRunInfoGroup(){
+    if (runInfoGroup.Initialize(scanDataGroup, "RunInfo") == 0) {
+        std::cout << "ERROR, could not create /ScanDta/RunInfo." << std::endl;
+        exit(1);
+    }
+    movieNameAtom.Create(runInfoGroup.group, "MovieName");
+    platformIdAtom.Create(runInfoGroup.group, "PlatformId");
+    platformNameAtom.Create(runInfoGroup.group, "PlatformName");
+    runCodeAtom.Create(runInfoGroup.group, "RunCode");
+}
+
+HDFScanDataWriter::HDFScanDataWriter(HDFFile & _outFile) {
+    Initialize(_outFile.rootGroup);
+}
+
+HDFScanDataWriter::HDFScanDataWriter(HDFGroup & _rootGroup) {
+    Initialize(_rootGroup);
+}
+
+HDFScanDataWriter::~HDFScanDataWriter() { 
+    // Assume that closing the hdf file must be done
+    // manually and not in a destructor.
+}
+
+int HDFScanDataWriter::Initialize(HDFGroup & _rootGroup) {
+    rootGroupPtr = &(_rootGroup);
+    rootGroupPtr->AddGroup("ScanData"); 
+    if (scanDataGroup.Initialize(*(rootGroupPtr), "ScanData") == 0) {
+        std::cout << "ERROR, could not create /ScanData group." << std::endl;
+        exit(1);
+    }
+    scanDataGroup.AddGroup("AcqParams");
+    scanDataGroup.AddGroup("DyeSet");
+    scanDataGroup.AddGroup("RunInfo");
+
+    CreateAcqParamsGroup();
+    CreateDyeSetGroup();
+    CreateRunInfoGroup();
+
+    return 1;
+}
+
+void HDFScanDataWriter::Write(ScanData & scanData) {
+    WriteFrameRate((scanData.frameRate==0)?
+            (75):(scanData.frameRate));
+    WriteNumFrames((scanData.numFrames==0)?
+            (1000000):(scanData.numFrames));
+    WriteWhenStarted((scanData.whenStarted.empty())?
+            ("2013-01-01T01:01:01"):(scanData.whenStarted));
+    std::string baseMapStr = BaseMapToStr(scanData.baseMap);
+    WriteBaseMap((baseMapStr == "")?("TGAC"):baseMapStr);
+    WriteNumAnalog(4);
+
+    WriteMovieName((scanData.movieName.empty()?
+                ("simulated_movie"):scanData.movieName));
+    WriteRunCode((scanData.runCode.empty())?
+            "simulated_runcode":(scanData.runCode));
+    WritePlatformId((scanData.platformId==NoPlatform)?
+            (Springfield):(scanData.platformId));
+}
+
+void HDFScanDataWriter::WriteFrameRate(float frameRate) {
+    // Write /ScanData/AcqParams/FrameRate attribute.
+    frameRateAtom.Write(frameRate);
+}
+
+void HDFScanDataWriter::WriteNumFrames(unsigned int numFrames) {
+    // Write /ScanData/AcqParams/NumFrames attribute.
+    numFramesAtom.Write(numFrames);
+}
+
+void HDFScanDataWriter::WriteWhenStarted(const std::string whenStarted) {
+    // Write /ScanData/AcqParams/WhenStarted attribute.
+    whenStartedAtom.Write(whenStarted);
+}
+
+std::string HDFScanDataWriter::BaseMapToStr(std::map<char, int> & baseMap) {
+    std::string baseMapStr = ""; //4 dye channels.
+    if (not baseMap.empty()) {
+        baseMapStr = "    ";
+        map<char, int>::iterator it;
+        for (it = baseMap.begin(); it != baseMap.end(); ++it){
+            if (it->second > 4 or it->second < 0) {
+                std::cout << "ERROR, there are more than four dye channels."
+                          << std::endl;
+                exit(1);
+            }
+            baseMapStr[it->second]= it->first;
+        }
+    }
+    return baseMapStr;
+}
+
+void HDFScanDataWriter::WriteBaseMap(const std::string baseMapStr) {
+    //Write /ScanData/DyeSet/BaseMap attribute.
+    baseMapAtom.Write(baseMapStr);
+}
+
+void HDFScanDataWriter::WriteNumAnalog(const unsigned int numAnalog) {
+    //Write /ScanData/DyeSet/NumAnalog attribute.
+    numAnalogAtom.Write(numAnalog);
+}
+
+void HDFScanDataWriter::WritePlatformId(const PlatformId id) {
+    //Write /ScanData/RunInfo/Flatform attribute.
+    platformIdAtom.Write(id);
+    std::string name = (id == Springfield)?"Springfield":"Astro";
+    platformNameAtom.Write(name);
+}
+
+void HDFScanDataWriter::WriteMovieName(const std::string movieName) {
+    //Write /ScanData/RunInfo/MovieName attribute.
+    movieNameAtom.Write(movieName);
+}
+
+void HDFScanDataWriter::WriteRunCode(const std::string runCode) {
+    //Write /ScanData/RunInfo/MovieName attribute.
+    runCodeAtom.Write(runCode);
+}
+
+void HDFScanDataWriter::Close() {
+    // Close /ScanData/AcqParams attributes.
+    whenStartedAtom.dataspace.close();
+    frameRateAtom.dataspace.close();
+    numFramesAtom.dataspace.close();
+
+    // Close /ScanData/DyeSet attributes.
+    baseMapAtom.dataspace.close();
+
+    // Close /ScanData/RunInfo attributes.
+    movieNameAtom.dataspace.close();
+    runCodeAtom.dataspace.close();
+    platformIdAtom.dataspace.close();
+    platformNameAtom.dataspace.close();
+
+    // Close /ScanData/AcqParams|DyeSet|RunInfo.
+    acqParamsGroup.Close();
+    dyeSetGroup.Close();
+    runInfoGroup.Close();
+
+    // Close /ScanData
+    scanDataGroup.Close();
+}
diff --git a/libcpp/hdf/HDFScanDataWriter.hpp b/libcpp/hdf/HDFScanDataWriter.hpp
new file mode 100644
index 0000000..f92d8e6
--- /dev/null
+++ b/libcpp/hdf/HDFScanDataWriter.hpp
@@ -0,0 +1,71 @@
+#ifndef DATA_HDF_HDF_SCAN_DATA_WRITER_H_
+#define DATA_HDF_HDF_SCAN_DATA_WRITER_H_
+
+#include <string>
+#include <iostream>
+#include "HDFFile.hpp"
+#include "HDFGroup.hpp"
+#include "HDFAtom.hpp"
+#include "Enumerations.h"
+#include "reads/ScanData.hpp"
+
+class HDFScanDataWriter {
+private:
+    HDFGroup * rootGroupPtr;
+	HDFGroup scanDataGroup;
+	HDFGroup acqParamsGroup;
+    HDFGroup dyeSetGroup;
+	HDFGroup runInfoGroup;
+
+	HDFAtom<std::string> whenStartedAtom;
+	HDFAtom<float> frameRateAtom;
+	HDFAtom<unsigned int> numFramesAtom;
+
+    HDFAtom<std::string> baseMapAtom;
+    HDFAtom<unsigned int> numAnalogAtom;
+
+	HDFAtom<std::string> movieNameAtom;
+	HDFAtom<std::string> runCodeAtom;
+
+	HDFAtom<unsigned int> platformIdAtom;
+	HDFAtom<std::string> platformNameAtom;
+
+    void CreateAcqParamsGroup();
+
+    void CreateDyeSetGroup();
+
+    void CreateRunInfoGroup();
+
+public:
+	HDFScanDataWriter(HDFFile & _outFile);
+
+    HDFScanDataWriter(HDFGroup & _rootGroup);
+
+    ~HDFScanDataWriter();
+    
+    int Initialize(HDFGroup & _rootGroup);
+      
+    void Write(ScanData & scanData);
+   
+	void WriteFrameRate(float frameRate);
+
+    void WriteNumFrames(unsigned int numFrames);
+
+    void WriteWhenStarted(const std::string whenStarted);
+
+    std::string BaseMapToStr(std::map<char, int> & baseMap);
+   
+    void WriteBaseMap(const std::string baseMapStr);
+   
+    void WriteNumAnalog(const unsigned int numAnalog);
+
+    void WritePlatformId(const PlatformId id);
+   
+    void WriteMovieName(const std::string movieName);
+
+    void WriteRunCode(const std::string runCode);
+
+	void Close();
+};
+
+#endif
diff --git a/libcpp/hdf/HDFSentinalFile.hpp b/libcpp/hdf/HDFSentinalFile.hpp
new file mode 100644
index 0000000..71f7de8
--- /dev/null
+++ b/libcpp/hdf/HDFSentinalFile.hpp
@@ -0,0 +1,21 @@
+#ifndef _BLASR_SENTINAL_FILE_HPP_
+#define _BLASR_SENTINAL_FILE_HPP_
+
+#include "HDFArray.h"
+#include "HDF2DArray.h"
+
+class HDFSentinal {
+ public:
+  HDFStringArray parts;
+  HDF2DArray<unsigned int> holeLookup;
+  HDFGroup multiPartGroup;
+
+  void Initialize(HDFGroup &rootGroup) {
+    multiPartGroup.Initialize(rootGroup, "MultiPart");
+    parts.Initialize(multiPartGroup, "Parts");
+    holeLookup.Initialize(multiPartGroup, "HoleLookup");
+  }
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFUtils.cpp b/libcpp/hdf/HDFUtils.cpp
new file mode 100644
index 0000000..ad0739b
--- /dev/null
+++ b/libcpp/hdf/HDFUtils.cpp
@@ -0,0 +1,82 @@
+#include "HDFUtils.hpp"
+
+std::string GetH5MovieName(std::string fileName) {
+    HDFScanDataReader reader;
+    return reader.GetMovieName_and_Close(fileName);
+}
+
+std::vector<std::string> GetH5MovieNames(const std::vector<std::string> & fileNames) {
+    std::vector<std::string> ret;
+    for (size_t i = 0 ; i < fileNames.size(); i++) {
+        ret.push_back(GetH5MovieName(fileNames[i]));
+    }
+    return ret;
+}
+
+std::vector< std::pair<UInt, UInt> > GetMinMaxHoleNumbers(
+    const std::vector<std::string> & fileNames, bool isRGN) {
+    std::vector< std::pair<UInt, UInt> > ret;
+    for (size_t i = 0 ; i < fileNames.size(); i++) {
+        ret.push_back(GetMinMaxHoleNumber(fileNames[i], isRGN));
+    }
+    return ret;
+}
+
+std::pair<UInt, UInt> GetMinMaxHoleNumber(
+        std::string fileName, bool isRGN) {
+    UInt minHole, maxHole;
+
+    if (isRGN) { // is region table
+        HDFRegionTableReader rgnReader;
+        rgnReader.Initialize(fileName);
+        rgnReader.GetMinMaxHoleNumber(minHole, maxHole);
+        rgnReader.Close();
+    } else { // is bas/bax/pls/plx/ccs.h5
+        HDFBasReader basReader;
+        basReader.Initialize(fileName);
+        vector<UInt> holes;
+        basReader.GetMinMaxHoleNumber(minHole, maxHole);
+        basReader.Close();
+    }
+    return std::make_pair(minHole, maxHole);
+}
+
+std::vector<int> MapPls2Rgn(const std::vector<std::string> & plsFNs,
+        const std::vector<std::string> & rgnFNs) {
+    if (plsFNs.size() != rgnFNs.size() && rgnFNs.size() != 0) {
+        std::cout << "ERROR, the number of plx/bax.h5 files and the number of "
+            << "region tables are not the same." << std::endl;
+        exit(1);
+    }
+
+    // Movie names of pulse files in P.
+    std::vector<std::string> plsMovies = GetH5MovieNames(plsFNs);
+    // Movie names of region tables in R.
+    std::vector<std::string> rgnMovies = GetH5MovieNames(rgnFNs);
+
+    // The first and last hole numbers of pulse files in P.
+    std::vector< std::pair<UInt, UInt> > plsHoles = GetMinMaxHoleNumbers(plsFNs, false);
+    // The first and last hole numbers of region tables in R.
+    std::vector< std::pair<UInt, UInt> > rgnHoles = GetMinMaxHoleNumbers(rgnFNs, true);
+
+    std::vector<int> ret;
+    for (size_t i = 0; i < plsFNs.size(); i++) {
+        size_t j = 0;
+        for (; j < rgnFNs.size(); j++) {
+            if (plsMovies[i] == rgnMovies[j] and
+                plsHoles[i].first <= rgnHoles[j].first and
+                plsHoles[i].second >= rgnHoles[j].second) {
+                break;
+            }
+        }
+        if (j >= rgnFNs.size()) {
+            std::cout << "ERROR, could not find any region table for file "
+                 << plsFNs[i] << " [" << plsHoles[i].first << ", " << plsHoles[i].second 
+                 <<"." << std::endl;
+            exit(1);
+        }
+        ret.push_back(j);
+    }
+    return ret;
+}
+
diff --git a/libcpp/hdf/HDFUtils.hpp b/libcpp/hdf/HDFUtils.hpp
new file mode 100644
index 0000000..ee9409e
--- /dev/null
+++ b/libcpp/hdf/HDFUtils.hpp
@@ -0,0 +1,44 @@
+#ifndef _BLASR_HDF_UTILS_HPP_
+#define _BLASR_HDF_UTILS_HPP_
+
+#include <vector>
+#include <string>
+
+#include "HDFFile.hpp"
+#include "HDFScanDataReader.hpp"
+#include "HDFBasReader.hpp"
+#include "HDFRegionTableReader.hpp"
+#include "reads/RegionTable.hpp"
+
+
+// Given a PacBio (pls/plx/bas/bax/ccs/rgn).h5 file, which contains its movie 
+// name in group /ScanData/RunInfo attribute MovieName, return its' movie name
+std::string GetH5MovieName(std::string fileName);
+
+// Given a vector of h5 files, return their movie names.
+std::vector<std::string> GetH5MovieNames(const std::vector<std::string> & fileNames);
+
+// Given a PacBio rgn.h5 file, return the smallest and largest holeNumber in
+// group /PulseData/Regions.
+std::pair<UInt, UInt> GetMinMaxHoleNumber(std::string fileName, 
+                                          bool isRGN=false);
+
+std::vector<std::pair<UInt, UInt> > GetMinMaxHoleNumbers(
+    std::string fileName, bool isRGN=false);
+
+// Pulse files in input.fofn and regions tables in rgn.fofn may not
+// match, return mapping from plsFNs indices to rgnFNs indices.
+//
+// Input : plsFNs - pulse file names in input.fofn, e.g.,
+//                  P=(p_0, ..., p_{n-1})
+//         rgnFNs - region table file names in rgn.fofn, e.g.,
+//                  R=(r_0, ..., p_{n-1})
+// Output: mapping from plsFNs indices to rgnFNs indices, e.g.,
+//                  M=(m_0, ..., m_{n-1})
+//         so that for all i from 0 to n-1,
+//                  r_{m_{i}} matches p_i
+//
+std::vector<int> MapPls2Rgn(const std::vector<std::string> & plsFNs,
+                            const std::vector<std::string> & rgnFNs);
+
+#endif
diff --git a/libcpp/hdf/HDFWriteBuffer.hpp b/libcpp/hdf/HDFWriteBuffer.hpp
new file mode 100644
index 0000000..3600c5a
--- /dev/null
+++ b/libcpp/hdf/HDFWriteBuffer.hpp
@@ -0,0 +1,52 @@
+#ifndef _BLASR_HDF_WRITE_BUFFER_HPP_
+#define _BLASR_HDF_WRITE_BUFFER_HPP_
+
+#include <cstddef>
+
+template<typename T>
+class HDFWriteBuffer {
+public:
+    T         *writeBuffer;
+    int       bufferIndex;
+    int       bufferSize;
+
+    HDFWriteBuffer() {
+        writeBuffer = NULL;
+        bufferIndex = 0;
+        bufferSize  = 0;
+    }
+
+    void InitializeBuffer(int pBufferSize) {
+        Free(); // Free before reusing the buffer.
+        bufferSize = pBufferSize;
+        if (bufferSize > 0) {
+            writeBuffer = new T[bufferSize];
+        }
+        else {
+            writeBuffer = NULL;
+        }
+    }		
+
+    void Free() {
+        if (writeBuffer) {
+            delete[] writeBuffer;
+            writeBuffer = NULL;
+        }
+    }
+
+    ~HDFWriteBuffer() {
+        Free();
+    }
+
+    void ResetWriteBuffer() {
+        bufferIndex = 0;
+    }
+
+    bool WriteBufferEmpty() {
+        return (bufferIndex == 0);
+    }
+
+};
+
+
+#endif
diff --git a/libcpp/hdf/HDFZMWReader.cpp b/libcpp/hdf/HDFZMWReader.cpp
new file mode 100644
index 0000000..a79107e
--- /dev/null
+++ b/libcpp/hdf/HDFZMWReader.cpp
@@ -0,0 +1,136 @@
+#include "Types.h"
+#include "HDFZMWReader.hpp"
+
+HDFZMWReader::HDFZMWReader() {
+    closeFileOnExit = false;
+    readHoleNumber  = false;
+    readHoleXY      = false;
+    readNumEvent    = false;
+    readHoleStatus  = false;
+    nZMWEntries = curZMW = 0;
+    parentGroupPtr = NULL;
+}
+
+int HDFZMWReader::Initialize(HDFGroup *parentGroupP) {
+    parentGroupPtr = parentGroupP;
+    closeFileOnExit = false;
+    return Initialize();
+}
+
+int HDFZMWReader::Initialize() {
+
+    //
+    // Make sure we can open the component containing the zmw information.
+    //
+    if (parentGroupPtr->ContainsObject("ZMW") == 0 or
+            zmwGroup.Initialize(parentGroupPtr->group, "ZMW") == 0) {
+        return 0;
+    }
+
+    //
+    // Now open all the important datasets in the zmw group.  Some of
+    // these are optional, so flags must be set if they do not exist.
+    //
+    if (zmwGroup.ContainsObject("HoleNumber")) {
+        if (holeNumberArray.Initialize(zmwGroup, "HoleNumber") == 0) {
+            return 0;
+        }
+        readHoleNumber = true;
+    }
+    else {
+        readHoleNumber = false;
+    }
+
+    if (zmwGroup.ContainsObject("HoleStatus")) {
+        if (holeStatusArray.Initialize(zmwGroup, "HoleStatus") == 0) {
+            return 0;
+        }
+        readHoleStatus = true;
+    }
+    else {
+        readHoleStatus = false;
+    }
+
+
+    if (zmwGroup.ContainsObject("HoleXY")) {
+        if (xyArray.Initialize(zmwGroup, "HoleXY") == 0) {
+            return 0;
+        }
+        readHoleXY = true;
+    }
+    else {
+        readHoleXY = false;
+    }
+    if (numEventArray.Initialize(zmwGroup, "NumEvent") == 0) {
+        return 0;
+    }
+    nZMWEntries = numEventArray.arrayLength;
+    readNumEvent = true;
+    curZMW      = 0;
+    return 1;
+}
+
+int HDFZMWReader::Advance(int nSteps) {
+    if (curZMW >= nZMWEntries) {
+        return 0;
+    }
+    else {
+        curZMW += nSteps;
+        return 1;
+    }
+}
+
+bool HDFZMWReader::GetNext(ZMWGroupEntry &groupEntry) {
+    if (curZMW == nZMWEntries) {
+        return false;
+    }
+    if (readHoleNumber) {
+        holeNumberArray.Read(curZMW, curZMW+1, &groupEntry.holeNumber);
+    }
+    if (readHoleStatus) {
+        holeStatusArray.Read(curZMW, curZMW+1, &groupEntry.holeStatus);
+    }
+    if (readHoleXY){ 
+        int16_t holeXY[2];
+        xyArray.Read(curZMW, curZMW+1, holeXY);
+        groupEntry.x = holeXY[0];
+        groupEntry.y = holeXY[1];
+    }
+    numEventArray.Read(curZMW, curZMW+1, &groupEntry.numEvents);
+    curZMW++;
+    return true;
+}
+
+void HDFZMWReader::Close() {
+    if (readHoleNumber) {
+        holeNumberArray.Close();
+    }
+    if (readHoleStatus) {
+        holeStatusArray.Close();
+    }
+    if (readHoleXY) {
+        xyArray.Close();
+    }
+    if (readNumEvent) {
+        numEventArray.Close();
+    }
+
+    if (closeFileOnExit == true) {
+        //
+        // This instance is owner of it's reader.  Close the reader file.
+        //
+        hdfPlsFile.close();
+    }
+    zmwGroup.Close();
+
+}
+
+bool HDFZMWReader::GetHoleNumberAt(UInt index, UInt &holeNumber) {
+    if (index >= nZMWEntries) { return false; }
+    holeNumberArray.Read(index, index + 1, (UInt *)&holeNumber); 
+    return true;
+}
+
+HDFZMWReader::~HDFZMWReader() {
+    Close();
+}
diff --git a/libcpp/hdf/HDFZMWReader.hpp b/libcpp/hdf/HDFZMWReader.hpp
new file mode 100644
index 0000000..8cd7d2d
--- /dev/null
+++ b/libcpp/hdf/HDFZMWReader.hpp
@@ -0,0 +1,45 @@
+#ifndef _BLASR_HDF_ZMW_READER_HPP_
+#define _BLASR_HDF_ZMW_READER_HPP_
+
+#include <cstdint>
+#include "H5Cpp.h"
+#include "reads/ZMWGroupEntry.hpp"
+#include "HDFArray.hpp"
+#include "HDF2DArray.hpp"
+#include "HDFGroup.hpp"
+
+class HDFZMWReader {
+public:
+    HDFGroup *parentGroupPtr;
+    HDFGroup zmwGroup;
+    HDFArray<unsigned int> holeNumberArray;
+    HDFArray<unsigned char> holeStatusArray;
+    HDF2DArray<int16_t> xyArray;
+    HDFArray<int> numEventArray;
+    bool readHoleNumber, readHoleStatus;
+    bool readHoleXY;
+    bool readNumEvent;
+    UInt curZMW;
+    UInt nZMWEntries;
+    bool  closeFileOnExit;
+    H5::H5File hdfPlsFile;
+
+    HDFZMWReader(); 
+
+    int Initialize(HDFGroup *parentGroupP); 
+
+    int Initialize(); 
+
+    int Advance(int nSteps); 
+
+    bool GetNext(ZMWGroupEntry &groupEntry); 
+
+    void Close(); 
+    
+    // Return true if get hole number at ZMW/HoleNumber[index].
+    bool GetHoleNumberAt(UInt index, UInt & holeNumber);
+
+    ~HDFZMWReader(); 
+};
+
+#endif
diff --git a/libcpp/hdf/build.mk b/libcpp/hdf/build.mk
new file mode 120000
index 0000000..2247f36
--- /dev/null
+++ b/libcpp/hdf/build.mk
@@ -0,0 +1 @@
+makefile
\ No newline at end of file
diff --git a/libcpp/hdf/makefile b/libcpp/hdf/makefile
new file mode 100644
index 0000000..c92a229
--- /dev/null
+++ b/libcpp/hdf/makefile
@@ -0,0 +1,28 @@
+all:
+
+include ../rules.mk
+include ../defines.mk
+
+CXXOPTS  += -std=c++11 -pedantic -MMD -MP
+INCLUDES += ${LIBPBDATA_INCLUDE} ${HDF5_INCLUDE} ${PBBAM_INCLUDE} ${HTSLIB_INCLUDE} ${BOOST_INCLUDE}
+DEP_LIBS += ${LIBPBDATA_LIB} ${HDF5_LIB} ${PBBAM_LIB} ${HTSLIB_LIB} ${ZLIB_LIB}
+LDFLAGS  += $(patsubst %,$(dirname %),${DEP_LIBS})
+
+all: libpbihdf.a libpbihdf.so
+
+sources := $(wildcard *.cpp)
+objects := $(sources:.cpp=.o)
+shared_objects := $(sources:.cpp=.shared.o)
+dependencies := $(objects:.o=.d) $(shared_objects:.o=.d)
+
+libpbihdf.a: $(objects)
+	$(AR) $(ARFLAGS) $@ $^
+
+libpbihdf.so: $(shared_objects) $(DEP_LIBS)
+	$(CXX) $(LD_SHAREDFLAGS) -o $@ -Wl,-soname,$@ $^
+
+clean: 
+	@rm -f libpbihdf.a libpbihdf.so
+	@rm -f $(objects) $(shared_objects) $(dependencies)
+
+-include $(dependencies)
diff --git a/libcpp/hdf/old.Makefile b/libcpp/hdf/old.Makefile
new file mode 100644
index 0000000..1998195
--- /dev/null
+++ b/libcpp/hdf/old.Makefile
@@ -0,0 +1,94 @@
+
+include ../common.mk
+
+# To enable building a shared library, invoke as "make SHARED_LIB=true ..."
+ifneq ($(SHARED_LIB),)
+    # Generating shared library
+    CXX_SHAREDFLAGS := -fPIC
+    LD_SHAREDFLAGS  := -shared -fPIC
+    TARGET_LIB      := libpbihdf.so
+    # Developers should set these to appropriate defaults (other systems 
+    # will override these on the command line):
+    HDF5_LIB        := ../../../../prebuilt.out/prebuilt.out/hdf5/hdf5-1.8.12/centos-5/lib/libhdf5.so
+    ZLIB_LIB        := ../../../../prebuilt.tmpsrc/zlib/zlib_1.2.8/_output/install/lib/libz.so
+    HTSLIB_LIB      := ../../../staging/PostPrimary/pbbam/_output/install-build/lib/libpbbam.so
+    PBBAM_LIB       := ../../../staging/PostPrimary/pbbam/third-party/htslib/_output/install-build/lib/libhts.so
+    LIBPBDATA_LIB   := ../../../staging/PostPrimary/pbbam/third-party/htslib/_output/install-build/lib/libhts.so
+else
+    # Generating shared library
+    CXX_SHAREDFLAGS :=
+    LD_SHAREDFLAGS  :=
+    TARGET_LIB      := libpbihdf.a
+    HDF5_LIB        :=
+    ZLIB_LIB        :=
+    HTSLIB_LIB      :=
+    PBBAM_LIB       :=
+    LIBPBDATA_LIB   :=
+endif
+
+DEP_LIBS := $(HDF5_LIB) $(ZLIB_LIB) $(HTSLIB_LIB) $(PBBAM_LIB) $(PBDATA_LIB)
+
+# FIXME: remove PBDATA_INCLUDE and assign directly to LIBPBDATA_INCLUDE.
+#        Use only LIBPBDATA_INCLUDE to be consistent with the libblasr Makefile
+PBDATA_INCLUDE := ../pbdata
+LIBPBDATA_INCLUDE := $(PBDATA_INCLUDE)
+PBBAM_INCLUDE := $(PBBAM)/include
+HTSLIB_INCLUDE ?= $(HTSLIB)
+
+INCLUDES = -I$(LIBPBDATA_INCLUDE)
+
+
+ifeq ($(origin nopbbam), undefined)
+    INCLUDES += -I$(PBBAM_INCLUDE) -I$(HTSLIB_INCLUDE) -I$(BOOST_INCLUDE)
+endif
+
+ifneq ($(ZLIB_ROOT), notfound)
+	INCLUDES += -I$(ZLIB_ROOT)/include
+endif
+
+CXXOPTS := -std=c++11 -pedantic -MMD -MP
+sources := $(wildcard *.cpp)
+objects := $(sources:.cpp=.o)
+shared_objects := $(sources:.cpp=.shared.o)
+dependencies := $(objects:.o=.d) $(shared_objects:.o=.d)
+
+ifneq ($(HDF5_INC),)
+HDF_HEADERS :=
+INCLUDES += -I$(HDF5_INC)
+else
+HDF_HEADERS := hdf5-1.8.12-headers
+INCLUDES += -I./$(HDF_HEADERS)/src -I./$(HDF_HEADERS)/c++/src
+endif
+
+all : CXXFLAGS ?= -O3
+
+debug : CXXFLAGS ?= -g -ggdb -fno-inline
+
+profile : CXXFLAGS ?= -Os -pg
+
+g : CXXFLAGS ?= -g -ggdb -fno-inline -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fno-omit-frame-pointer 
+
+all debug profile g: $(HDF_HEADERS) $(TARGET_LIB)
+
+libpbihdf.a: $(objects)
+	$(AR_pp) $(ARFLAGS) $@ $^
+
+libpbihdf.so: $(shared_objects) $(DEP_LIBS)
+	$(CXX) $(LD_SHAREDFLAGS) -o $@ $^
+
+%.o: %.cpp
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCLUDES) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o) $(@:%.o=%.d)" -c $< -o $@
+
+%.shared.o: %.cpp
+	$(CXX) $(CXX_SHAREDFLAGS) $(CXXOPTS) $(CXXFLAGS) $(INCLUDES) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o) $(@:%.o=%.d)" -c $< -o $@
+
+$(HDF_HEADERS): 
+	curl -k -L https://www.dropbox.com/s/8971bcyy5o42rxb/hdf5-1.8.12-headers.tar.bz2\?dl\=0 | tar xjf - 
+
+# .INTERMEDIATE: $(objects)
+
+clean: 
+	@rm -f libpbihdf.a libpbihdf.so
+	@rm -f $(objects) $(shared_objects) $(dependencies)
+
+-include $(dependencies)
diff --git a/libcpp/makefile b/libcpp/makefile
new file mode 100644
index 0000000..64a113b
--- /dev/null
+++ b/libcpp/makefile
@@ -0,0 +1,32 @@
+SHELL=/bin/bash
+
+.PHONY: all debug profile gtest clean cleanall
+
+# $Change: 140182 $ 
+
+all:
+	${MAKE} -C pbdata all
+	${MAKE} -C hdf all
+	${MAKE} -C alignment all
+
+debug:
+	${MAKE} subs
+
+profile:
+	${MAKE} subs
+
+g:
+	${MAKE} subs
+
+gtest:
+	${MAKE} -C unittest -f normal.Makefile gtest
+
+clean:
+	${MAKE} -C pbdata clean
+	${MAKE} -C hdf clean
+	${MAKE} -C alignment clean
+	#@${MAKE} -C unittest clean
+
+cleanall: clean
+
+# Note: hdf/ will not build if nohdf=1 is configured.
diff --git a/libcpp/old.Makefile b/libcpp/old.Makefile
new file mode 100644
index 0000000..1e52e1d
--- /dev/null
+++ b/libcpp/old.Makefile
@@ -0,0 +1,28 @@
+SHELL=/bin/bash
+
+.PHONY: all debug profile gtest clean cleanall
+
+subs:
+	${MAKE} -C pbdata all
+	${MAKE} -C hdf all
+	${MAKE} -C alignment all
+
+debug:
+	${MAKE} subs
+
+profile:
+	${MAKE} subs
+
+g:
+	${MAKE} subs
+
+gtest:
+	${MAKE} -C unittest gtest
+
+clean:
+	@${MAKE} -C pbdata clean
+	@${MAKE} -C hdf clean
+	@${MAKE} -C alignment clean
+	@${MAKE} -C unittest clean
+
+cleanall: clean
diff --git a/libcpp/pbdata/.gitignore b/libcpp/pbdata/.gitignore
new file mode 100644
index 0000000..4c3cf0b
--- /dev/null
+++ b/libcpp/pbdata/.gitignore
@@ -0,0 +1,2 @@
+/libconfig.h
+/defines.mk
diff --git a/libcpp/pbdata/CCSSequence.cpp b/libcpp/pbdata/CCSSequence.cpp
new file mode 100644
index 0000000..1f8e5b9
--- /dev/null
+++ b/libcpp/pbdata/CCSSequence.cpp
@@ -0,0 +1,35 @@
+#include "CCSSequence.hpp"
+
+void CCSSequence::Free() {
+    numPasses = 0;
+    numConsensusBases = 0;
+    SMRTSequence::Free();
+    unrolledRead.Free();
+    /*
+    ClearMemory(passStartPulse);
+    ClearMemory(passNumPulses);
+    ClearMemory(passStartBase);
+    ClearMemory(passNumBases);
+    ClearMemory(passDirection);
+    ClearMemory(adapterHitBefore);
+    ClearMemory(adapterHitAfter);
+    ClearMemory(adapterHitConfidence);
+    */
+}
+
+int CCSSequence::GetStorageSize() {
+    return SMRTSequence::GetStorageSize() + unrolledRead.GetStorageSize();
+}
+
+//
+// In the first iteration, Explode simply pulls the subreads out
+// that are used in the ccs.   Eventually, it will pull out all
+// high-quality subreads.
+// 
+void CCSSequence::Explode(std::vector<SMRTSequence> &subreads) {
+    subreads.resize(numPasses);
+    int subreadIndex;
+    for (subreadIndex = 0; subreadIndex < numPasses; subreadIndex++) {
+        subreads[subreadIndex].ReferenceSubstring(this->unrolledRead, passStartBase[subreadIndex], passNumBases[subreadIndex]);
+    }
+}
diff --git a/libcpp/pbdata/CCSSequence.hpp b/libcpp/pbdata/CCSSequence.hpp
new file mode 100644
index 0000000..15e89d6
--- /dev/null
+++ b/libcpp/pbdata/CCSSequence.hpp
@@ -0,0 +1,43 @@
+#ifndef _BLASR_CCS_SEQUENCE_HPP_
+#define _BLASR_CCS_SEQUENCE_HPP_
+
+#include "Enumerations.h"
+#include "SMRTSequence.hpp"
+#include "VectorUtils.hpp"
+
+//
+// A CCS Sequence is both a SMRTSequence itself, and contains a list of SMRTSequences.
+//
+class CCSSequence : public SMRTSequence {
+ public:
+	UInt numPasses;
+	UInt numConsensusBases;
+	std::vector<DNALength> passStartPulse, passNumPulses, passStartBase, passNumBases;
+	std::vector<Byte> passDirection;
+	std::vector<Byte>      adapterHitBefore, adapterHitAfter, adapterHitConfidence;
+	//
+	// The CCS Sequence originates from a full length read.  That read
+	// is stored here for reference later on.  The ccs read is stored in
+	// the inherited fields from SMRTSequence so that it may be worked
+	// with as if it were a normal non-ccs sequence.
+	//
+	SMRTSequence      unrolledRead;
+
+    inline ~CCSSequence();
+	void Free(); 
+
+	int GetStorageSize(); 
+	//
+	//
+	// In the first iteration, Explode simply pulls the subreads out
+	// that are used in the ccs.   Eventually, it will pull out all
+	// high-quality subreads.
+	// 
+	void Explode(std::vector<SMRTSequence> &subreads); 
+};
+
+inline CCSSequence::~CCSSequence() {
+    CCSSequence::Free();
+}
+
+#endif // _BLASR_CCS_SEQUENCE_HPP_
diff --git a/libcpp/pbdata/ChangeListID.cpp b/libcpp/pbdata/ChangeListID.cpp
new file mode 100644
index 0000000..2b99c42
--- /dev/null
+++ b/libcpp/pbdata/ChangeListID.cpp
@@ -0,0 +1,64 @@
+#include <sstream>
+#include "ChangeListID.hpp"
+
+using namespace std;
+
+ChangeListID::ChangeListID() {}
+ChangeListID::ChangeListID(string &idStringP) {
+    StoreString(idStringP);
+}
+
+void ChangeListID::StoreString(string &idStringP) {
+    idString = idStringP;
+    stringstream ss(idString);
+    string part;
+    intVer.clear();
+    while(getline(ss, part, '.')) {
+        intVer.push_back(atoi(part.c_str()));
+    }
+}
+
+int ChangeListID::LessThan(ChangeListID &rhs, int depth) {
+    if (depth == 0) {
+        depth = min(intVer.size(), rhs.intVer.size());
+    }
+    int i;
+    for (i = 0; i < depth; i++) {
+        if (intVer[i] != rhs.intVer[i]) {
+            return intVer[i] < rhs.intVer[i];
+        }
+    }
+    return 0; // making it here they are equal
+}
+
+
+QVScale ChangeListID::DetermineQVScaleFromChangeListID() {
+    ChangeListID phredCL;
+    phredCL.intVer.resize(3);
+    phredCL.intVer[0] = 1; phredCL.intVer[1] = 2; phredCL.intVer[2] = 2;
+    if (LessThan(phredCL)) {
+        return POverOneMinusP;
+    }
+    else {
+        return PHRED;
+    }
+}
+
+// utility method
+void AppendPerforceChangelist(string perforceVersionString, string &version) {
+    if (perforceVersionString.size() > 12) {
+        version.insert(version.size(), ".");
+        version.insert(version.size(), perforceVersionString, 9, perforceVersionString.size() - 11);
+    }
+}
+
+std::string ChangeListID::GetVersion() {
+    stringstream ss;
+    if (intVer.size() == 1) {
+        ss << intVer[0];
+    } else if(intVer.size() >= 2) {
+        ss << intVer[0] << "." << intVer[1];
+    }
+    return ss.str();
+}
+
diff --git a/libcpp/pbdata/ChangeListID.hpp b/libcpp/pbdata/ChangeListID.hpp
new file mode 100644
index 0000000..eda525e
--- /dev/null
+++ b/libcpp/pbdata/ChangeListID.hpp
@@ -0,0 +1,38 @@
+#ifndef UTILS_CHANGELIST_ID_H_
+#define UTILS_CHANGELIST_ID_H_
+
+#include <string>
+#include <vector>
+#include <stdlib.h>
+#include <sstream>
+
+#ifndef _QVScale_
+#define _QVScale_
+enum QVScale {POverOneMinusP, // popularized by Illumina
+              PHRED};
+#endif
+
+class ChangeListID {
+public:
+    std::string idString;
+    std::vector<std::string> strVer;
+    std::vector<int> intVer;
+    ChangeListID();
+    ChangeListID(std::string &idStringP); 
+
+    void StoreString(std::string &idStringP); 
+
+    int LessThan(ChangeListID &rhs, int depth = 0); 
+
+    QVScale DetermineQVScaleFromChangeListID();
+
+    /// Get version string from ChangeListID.
+    /// changeListID "2.3.0.144058" --> Version "2.3".
+    /// \returns version string
+    std::string GetVersion();
+
+};
+
+void AppendPerforceChangelist(std::string perforceVersionString, std::string &version); 
+
+#endif
diff --git a/libcpp/pbdata/CommandLineParser.cpp b/libcpp/pbdata/CommandLineParser.cpp
new file mode 100644
index 0000000..2f1c92e
--- /dev/null
+++ b/libcpp/pbdata/CommandLineParser.cpp
@@ -0,0 +1,846 @@
+#include "CommandLineParser.hpp"
+
+CommandLineParser::
+CommandLineParser() {
+    lineLength = 80;
+    numUnnamedOptions = 0;
+    specialVersionFlag = false;
+}
+
+void CommandLineParser::
+SetProgramSummary(std::string summaryp) {
+    programSummary = summaryp;
+}
+	
+void CommandLineParser::
+SetHelp(std::string _help) {
+    helpString = _help;
+}
+
+void CommandLineParser::
+SetConciseHelp(std::string _conciseHelp) {
+    conciseHelp = _conciseHelp;
+}
+
+void CommandLineParser::
+SetProgramName(std::string namep) {
+    programName = namep;
+}
+
+void CommandLineParser::
+SetVersion(std::string versionp) {
+    specialVersionFlag = true;
+    version = versionp;
+}
+	
+void CommandLineParser::
+SetVerboseHelp(std::string helpp) {
+    verboseHelp = helpp;
+}
+
+void CommandLineParser::
+SetExamples(std::string examplesp) {
+    examples = examplesp;
+}
+
+void CommandLineParser::
+RegisterPreviousFlagsAsHidden() {
+    VectorIndex i;
+    for (i = 0; i < named.size(); i++ ){ 
+        named[i] = false;
+    }
+    numUnnamedOptions = named.size();
+}
+
+void CommandLineParser::
+RegisterVersionFlag(bool *value) {
+    specialVersionFlag = true;
+    RegisterFlagOption("version", value, "Print version number.");
+}
+
+
+void CommandLineParser::
+RegisterFlagOption(std::string option, bool *value, 
+    std::string description, bool required) {
+
+    named.push_back(true);
+    optionList.push_back(option);
+    optionTypeList.push_back(Flag);
+    optionValueIndexList.push_back(boolValues.size());
+    boolValues.push_back(value);
+    descriptions.push_back(description);
+    optionRequired.push_back(required);
+    optionUsed.push_back(false);
+}
+
+void CommandLineParser::
+RegisterIntOption(std::string option, int *value, 
+    std::string description, OptionType type, bool required, bool hidden) {
+
+    named.push_back(true);
+    optionList.push_back(option);
+    optionTypeList.push_back(type);
+    optionValueIndexList.push_back(intValues.size());
+    intValues.push_back(value);
+    descriptions.push_back(description);
+    optionRequired.push_back(required);
+    optionUsed.push_back(false);
+}
+
+void CommandLineParser::
+RegisterFloatOption(std::string option, float *value, 
+    std::string description, OptionType type, bool required) {
+
+    named.push_back(true);
+    optionList.push_back(option);
+    optionTypeList.push_back(type);
+    optionValueIndexList.push_back(floatValues.size());
+    floatValues.push_back(value);
+    descriptions.push_back(description);
+    optionRequired.push_back(required);
+    optionUsed.push_back(false);
+}
+
+void CommandLineParser::
+RegisterStringOption(std::string option, std::string *value,
+    std::string description, bool required) {
+
+    named.push_back(true);
+    optionList.push_back(option);
+    optionTypeList.push_back(String);
+    optionValueIndexList.push_back(stringValues.size());
+    stringValues.push_back(value);
+    descriptions.push_back(description);
+    optionRequired.push_back(required);
+    optionUsed.push_back(false);
+}
+
+void CommandLineParser::
+RegisterStringListOption(std::string option, 
+    std::vector<std::string> *value, std::string description, 
+    bool required) {
+
+    named.push_back(true);
+    optionList.push_back(option);
+    optionTypeList.push_back(StringList);
+    optionValueIndexList.push_back(stringListValues.size());
+    stringListValues.push_back(value);
+    descriptions.push_back(description);
+    optionRequired.push_back(required);
+    optionUsed.push_back(false);
+}
+
+
+void CommandLineParser::
+RegisterIntListOption(std::string option, std::vector<int> *value, 
+    std::string description, bool required) {
+
+    named.push_back(true);
+    optionList.push_back(option);
+    optionTypeList.push_back(IntegerList);
+    optionValueIndexList.push_back(intListValues.size());
+    intListValues.push_back(value);
+    descriptions.push_back(description);
+    optionRequired.push_back(required);
+    optionUsed.push_back(false);
+}
+
+
+int CommandLineParser::
+IsOption(char *str) {
+    int len = strlen(str);
+    if (len == 0) {
+        return 0;
+    }
+    else {
+        return str[0] == '-';
+    }
+}
+
+int CommandLineParser::
+IsInteger(char *str) {
+    int len = strlen(str);
+    int i;
+    if (len == 0)
+        return 0;
+    if (!(str[0] == '-' or (str[0] >= '0' and str[0] <= '9')))
+        return 0;
+    for (i = 1; i < len; i++) {
+        if (!isdigit(str[i]))
+            return 0;
+    }
+    return 1;
+}
+
+int CommandLineParser::
+IsFloat(char *str) {
+    int len = strlen(str);
+    int i;
+    if (len == 0) {
+        return 0;
+    }
+    int nDot = 0;
+    int nDigit = 0;
+    for (i = 0; i < len; i++) {
+        if (isdigit(str[i])) nDigit++;
+        if (str[i] == '.') nDot++;
+    }
+    if (nDot > 1)
+        return 0;
+    if (nDigit == 0)
+        return 0;
+    if (!isdigit(str[0]) and str[0] != '-' and str[0] != '.')
+        return 0;
+    //
+    // passed all checks, ok!
+    //
+    return 1;
+}
+
+int CommandLineParser::
+FindOption(char *option) {
+    VectorIndex i;
+    for (i = 0; i < optionList.size(); i++ ){ 
+        if (optionList[i].compare(option) == 0) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+void CommandLineParser::
+CommandLineToString(int argc, char* argv[], 
+    std::string& commandLine) {
+
+    std::stringstream outstrm;
+    int i;
+    for (i = 0; i< argc; i++) {
+        outstrm << argv[i] << " ";
+    }
+    commandLine = outstrm.str();
+}
+
+
+int CommandLineParser::
+ParseCommandLine(int argc, char* argv[], bool isProgramNameOnlyAllowed) {
+    std::vector<std::string> ufv;
+    return ParseCommandLine(argc, argv, ufv, isProgramNameOnlyAllowed);
+}
+
+int CommandLineParser::
+ParseCommandLine(int argc, char* argv[], 
+    std::vector<std::string> &unflaggedValues, bool isProgramNameOnlyAllowed) {
+
+    VectorIndex argi = 1;
+    int curUnnamedOption = 0;
+    ErrorValue ev; 
+    //
+    // Check for a help flag.
+    //
+    int i;
+    for (i = 1; i < argc; i++) {
+        if (strcmp(argv[i], "-h") == 0 or
+            (strcmp(argv[i], "--help") == 0 and 
+            // Check to see if there is non default argument for help
+            IsOption(argv[i]) and !FindOption(&argv[i][1]))) {
+            PrintUsage();
+            exit(0);
+        }
+        else if (strcmp(argv[i], "-version") == 0 and specialVersionFlag) {
+            //
+            // Using -version is an early exit since programs will print the 
+            // version and then return.
+            //
+            assert(IsOption(argv[i]) and FindOption(&argv[argi][1]));
+            PrintVersion();
+            exit(0);
+        }
+    }
+
+    if ( !isProgramNameOnlyAllowed ) {
+        if ( argc == 1 || argc < numUnnamedOptions) {
+            if (conciseHelp != "") {
+                std::cout << conciseHelp;
+            }
+            else {
+                PrintUsage();
+            }
+            exit(0);
+        }
+    }
+
+    // 
+    // Now parse the (probably optional) options.
+    //
+    while (argi < (VectorIndex) argc){
+        if (IsOption(argv[argi])) {
+            // 
+            // Find which option is specified.
+            //
+            int optionIndex = FindOption(&argv[argi][1]);
+            if (optionIndex == -1) {
+                ev = CLBadOption;
+            }
+            else {
+                argi++;
+
+                //
+                // Record that this option has been specified.
+                //
+                optionUsed[optionIndex] = true;
+                ev = ParseOption(optionIndex, argi, argc, argv);
+            }
+            if (ev != CLGood) {
+                PrintUsage();
+                PrintErrorMessage(ev, &argv[argi][1]);
+                exit(1);
+            }
+        }
+        else {
+            unflaggedValues.push_back(argv[argi]);
+            if (curUnnamedOption < numUnnamedOptions) {
+                ev = ParseOption(curUnnamedOption, argi, argc, argv);
+                optionUsed[curUnnamedOption] = true;
+                curUnnamedOption++;
+            }
+            else {
+                ++argi;
+            }
+        }
+    }
+
+    ev = PrintErrorOnMissingOptions();
+    if (ev != CLGood) {
+        PrintUsage();
+        PrintErrorMessage(ev, &argv[argi][1]);
+        exit(1);
+    }
+    return 1;
+}
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseOption(VectorIndex optionIndex, VectorIndex &argi, 
+    int argc, char *argv[]) {
+
+    ErrorValue ev;
+    // 
+    // Extract the value type of this option.
+    //
+    int optionValueIndex = optionValueIndexList[optionIndex];
+    OptionType optionType = optionTypeList[optionIndex];
+
+    switch(optionType) {
+        case(Flag):
+            ev = ParseFlag(optionValueIndex, argi, argc, argv);
+            break;
+        case(Integer):
+            ev = ParseInteger(optionValueIndex, argi, argc, argv);
+            break;
+        case(PositiveInteger):
+            ev = ParsePositiveInteger(optionValueIndex, argi, argc, argv);
+            break;
+        case(NonNegativeInteger):
+            ev = ParseNonNegativeInteger(optionValueIndex, argi, argc, argv);
+            break;
+        case(Float):
+            ev = ParseFloat(optionValueIndex, argi, argc, argv);
+            break;
+        case( PositiveFloat):
+            ev = ParsePositiveFloat(optionValueIndex, argi, argc, argv);
+            break;
+        case(NonNegativeFloat):
+            ev = ParseNonNegativeFloat(optionValueIndex, argi, argc, argv);
+            break;
+        case(String):
+            ev = ParseString(optionValueIndex, argi, argc, argv);
+            break;
+        case(StringList):
+            ev = ParseStringList(optionValueIndex, argi, argc, argv);
+            break;
+        case(IntegerList):
+            ev = ParseIntList(optionValueIndex, argi, argc, argv);
+            break;
+    };
+    if (ev == CLGood) {
+        optionUsed[optionValueIndex] = true;
+    }
+    return ev;
+}
+
+void CommandLineParser::
+PrintErrorMessage(ErrorValue ev, char *option) {
+    switch(ev) {
+        case(CLBadOption):
+            std::cout << "ERROR: " << option 
+                      << " is not a valid option." << std::endl;
+            break;
+        case(CLMissingValue):
+            std::cout << "ERROR: " << option 
+                      << " requires a value." << std::endl;
+            break;
+        case(CLInvalidInteger):
+            std::cout << "ERROR: " << option  << " requires an "
+                      << "integer value (...,-2,-1,0,1,2,...)" 
+                      << std::endl;
+            break;
+        case(CLInvalidPositiveInteger):
+            std::cout << "ERROR: " << option 
+                      << " requires an integer greater than 0."
+                      << std::endl;
+            break;
+        case(CLInvalidNonNegativeInteger):
+            std::cout << "ERROR: " << option 
+                      << " requires an interger greater " 
+                      << "than or equal to 0." << std::endl;
+            break;
+        case(CLInvalidFloat):
+            std::cout << "ERROR: " << option 
+                      << " requires a number as input." << std::endl;
+            break;
+        case(CLInvalidPositiveFloat):
+            std::cout << "ERROR: " << option 
+                      << " must be greater than 0 (eg. .0001)." 
+                      << std::endl;
+            break;
+        case (CLInvalidNonNegativeFloat):
+            std::cout << "ERROR: " << option 
+                      << " must be greater than or equal to 0."
+                      << std::endl;
+            break;
+        default:
+            break;
+    };
+}
+
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseFlag(VectorIndex optionValueIndex, VectorIndex &argi, 
+    int argc, char *argv[]) {
+
+    *boolValues[optionValueIndex] = !(*boolValues[optionValueIndex]);
+    return CLGood;
+}
+
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseInteger(VectorIndex optionValueIndex, VectorIndex &argi, 
+    int argc, char *argv[]) {
+
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    if (IsInteger(argv[argi])) {
+        *intValues[optionValueIndex] = atoi(argv[argi]);
+        ++argi;
+        return CLGood;
+    }
+    else {
+        // reset argi to the flag that was broken.
+        --argi;
+        return CLInvalidInteger;
+    }
+}
+
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParsePositiveInteger(VectorIndex optionValueIndex, 
+    VectorIndex &argi, int argc, char *argv[]) {
+
+    int value;
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    if (IsInteger(argv[argi])) {
+        value =  atoi(argv[argi]);
+        if (value > 0) {
+            *intValues[optionValueIndex] = value;
+            ++argi;
+            return CLGood;
+        }
+    }
+    // reset argi to the flag that was broken.
+    --argi;
+    return CLInvalidPositiveInteger;
+}
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseNonNegativeInteger(VectorIndex optionValueIndex,
+    VectorIndex &argi, int argc, char *argv[]) {
+
+    int value;
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    if (IsInteger(argv[argi])) {
+        value =  atoi(argv[argi]);
+        if (value >= 0) {
+            *intValues[optionValueIndex] = value;
+            ++argi;
+            return CLGood;
+        }
+    }
+    // reset argi to the flag that was broken.
+    --argi;
+    return CLInvalidNonNegativeInteger;
+}
+
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseFloat(VectorIndex optionValueIndex, 
+    VectorIndex &argi, int argc, char *argv[]) {
+
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    if (IsFloat(argv[argi])) {
+        *floatValues[optionValueIndex] = atof(argv[argi]);
+        ++argi;
+        return CLGood;
+    }
+    else {
+        // reset argi to the flag that was broken.
+        --argi;
+        return CLInvalidFloat;
+    }
+}
+
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParsePositiveFloat(VectorIndex optionValueIndex, 
+    VectorIndex &argi, int argc, char *argv[]) {
+
+    float value;
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    if (IsFloat(argv[argi])) {
+        value = atof(argv[argi]);
+        if (value > 0) {
+            *floatValues[optionValueIndex] = value;
+            ++argi;
+            return CLGood;
+        }
+    }
+    // reset argi pointer to bad flag
+    --argi;
+    return CLInvalidPositiveFloat;
+}
+
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseNonNegativeFloat(VectorIndex optionValueIndex, 
+    VectorIndex &argi, int argc, char *argv[]) {
+
+    float value;
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    if (IsFloat(argv[argi])) {
+        value = atof(argv[argi]);
+        if (value >= 0) {
+            *floatValues[optionValueIndex] = value;
+            ++argi;
+            return CLGood;
+        }
+    }			
+    // reset argi to the flag that was broken.
+    --argi;
+    return CLInvalidNonNegativeFloat;
+}
+
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseString(VectorIndex optionValueIndex, 
+    VectorIndex &argi, int argc, char *argv[]) {
+
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    if (argi < (unsigned int) argc) {
+        *stringValues[optionValueIndex] = argv[argi];
+        ++argi;
+        return CLGood;
+    }
+    else {
+        // reset argi to the flag that was broken.
+        --argi;
+        return CLMissingValue;
+    }
+}
+
+bool CommandLineParser::
+IsValuedOption(OptionType optType) {
+    if (optType == Integer or 
+            optType == PositiveInteger or
+            optType == NonNegativeInteger or
+            optType == Float or 
+            optType == PositiveFloat or 
+            optType == NonNegativeFloat or
+            optType == String or
+            optType == StringList) {
+        return true;
+    }
+    else {
+        return false;
+    }
+}
+
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseIntList(VectorIndex optionValueIndex, 
+    VectorIndex &argi, int argc, char *argv[]) {
+    
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    ErrorValue ev;
+    ev = CLMissingValue;
+    while (argi < (unsigned int) argc and !IsOption(argv[argi])) {
+        if (IsInteger(argv[argi])) {
+            intListValues[optionValueIndex]->push_back(atoi(argv[argi]));
+            ++argi;
+            ev = CLGood;
+        }
+        else {
+            ev = CLInvalidInteger;
+            --argi;
+            break;
+        }
+    }
+    if (ev == CLMissingValue) {
+        // reset argi to the flag that was broken.
+        --argi;
+    }
+    return ev;
+}
+
+CommandLineParser::ErrorValue CommandLineParser::
+ParseStringList(VectorIndex optionValueIndex, 
+    VectorIndex &argi, int argc, char *argv[]) {
+
+    if (argi >= argc) {
+        --argi;
+        return CLMissingValue;
+    }
+    ErrorValue ev;
+    ev = CLMissingValue;
+    while (argi < (unsigned int) argc and !IsOption(argv[argi])) {
+        stringListValues[optionValueIndex]->push_back(argv[argi]);
+        ++argi;
+        ev = CLGood;
+    }
+    if (ev == CLMissingValue) {
+        // reset argi to the flag that was broken.
+        --argi;
+    }
+    return ev;
+}
+
+
+void CommandLineParser::
+PrintVersion() {
+    std::cout << programName << "\t" << version << std::endl;
+}
+
+
+void CommandLineParser::
+PrintUsage() {
+    std::ios::fmtflags f = std::cout.flags();
+    if (helpString != "") {
+        std::cout << helpString << std::endl;
+        return;
+    }
+    else {
+        if (programSummary.size() > 0) {
+            std::cout << programName << " ";
+
+            PrintIndentedText(std::cout, programSummary, 
+                programName.size(), lineLength);
+
+            std::cout << std::endl;
+        }
+        std::cout << std::endl << "usage: " << programName;
+        VectorIndex i = 0;
+        int maxOptionLength = GetMaxOptionLength();
+        while (i < optionList.size() and named[i] == false) {
+            std::cout << " ";
+            if (optionRequired[i] == false) {
+                std::cout << "[";
+            }
+            std::cout << optionList[i];
+            if (optionRequired[i] == false) {
+                std::cout << "]";
+            }
+            i++;
+        }
+        if (i < optionList.size()) {
+            std::cout << " [options] ";
+        }
+        std::cout << std::endl << std::endl;
+        i = 0;
+        while (i < optionList.size() and named[i] == false) { 
+            if (!named[i]) {
+                std::cout << "   " << std::setw(maxOptionLength) 
+                          << std::left << optionList[i] << std::endl;
+
+                PrintIndentedText(cout, descriptions[i], 15, 
+                    (int)lineLength, 15);
+
+                std::cout << std::endl;
+            }
+            i++;
+        }
+        for (; i < optionList.size(); i++) {
+            std::string wholeName = "-";
+            wholeName += optionList[i];
+            if (IsValuedOption(optionTypeList[i])) {
+                wholeName += " value ";
+            }
+            std::cout << "  "   << std::setw(maxOptionLength) 
+                      << std::left <<  wholeName << std::endl;
+
+            PrintIndentedText(cout, descriptions[i], 15, 
+                (int)lineLength, 15);
+            
+            std::cout << std::endl;
+        }
+    }
+    if (examples.size() > 0) {
+        std::cout << std::endl << std::endl;
+        PrintIndentedText(cout, examples, 5, (int) lineLength, 5);
+        std::cout << std::endl;
+    }
+    std::cout.flags(f);
+}
+
+int CommandLineParser::
+GetNextWordLength(std::string &text, int pos) {
+    int startPos = pos;
+    int textLength = text.size();
+    while (pos < textLength and (!IsWhitespace(text[pos]))) {
+        pos++;
+    }
+    return pos - startPos;
+}
+
+void CommandLineParser::
+PrintIndentedText(std::ostream &out, std::string &text, 
+    int allLineIndent, int lineLength, int firstLineIndent) {
+
+    int textPos = 0;
+    std::vector<std::string> words;
+    ToWords(text, words);
+    int w = 0;
+    int wordsOnLine;
+    int curLineLength;
+    int curLineIndent = 0;
+    int i;
+    if (firstLineIndent == 0) {
+        curLineIndent = 0;
+        curLineLength = allLineIndent;
+    }
+    else {
+        for (i = 0; i < firstLineIndent; i++) {
+            out << " ";
+        }
+        curLineIndent = allLineIndent;
+        curLineLength = allLineIndent;
+    }
+    std::string indentation;
+    indentation.insert(0, allLineIndent, ' ');
+    int textLength = text.size();
+    while (textPos < textLength) {
+        // Print some whitespace
+        while (textPos < textLength and 
+               curLineLength < lineLength and 
+               IsWhitespace(text[textPos])) {
+            out << text[textPos];
+            // Some extra logic in case 
+            if (text[textPos] == '\n') {
+                // an extra line was printed, so skip to the next line.
+                curLineLength = lineLength + 1; 
+                // done printing this line.
+                curLineLength = 0;
+                if (textPos < textLength) {
+                    out << indentation;
+                    curLineLength = allLineIndent;
+                }
+            }
+            else {
+                curLineLength++;
+                if (curLineLength == lineLength) {
+                    std::cout << std::endl;
+                    curLineLength = 0;
+                    if (textPos < textLength) {
+                        out << indentation;
+                        curLineLength = allLineIndent;
+                    }
+                }
+            }
+            textPos++;
+        }
+        // Possibly print a word.
+        if (!IsWhitespace(text[textPos])) {
+            int nextWordLength = GetNextWordLength(text, textPos);
+            if (nextWordLength + curLineLength >= lineLength) {
+                //
+                // The next word runs past the end of this line, 
+                // print it on a newline, or print part of it on 
+                // this line if the whole word wraps.
+                //
+                if (nextWordLength > lineLength) {
+                    // This word will never fit on a line, print part of it.
+                    int substringLength = lineLength - curLineLength;
+                    for (; curLineLength < lineLength; 
+                         curLineLength++, textPos++) {
+                        out << text[textPos];
+                    }
+                }
+                out << std::endl;
+                out << indentation;
+                curLineLength = allLineIndent;
+            }
+            else {
+                int i;
+                for (i = 0; i < nextWordLength; 
+                     i++, textPos++, curLineLength++) {
+                    out << text[textPos];
+                }
+            }
+        }
+    }
+}
+
+unsigned int  CommandLineParser::
+GetMaxOptionLength() {
+    VectorIndex i;
+    VectorIndex maxLength = 0;
+    for (i = 0; i < optionList.size(); i++ ){
+        if (optionList[i].size() > maxLength)
+            maxLength = optionList[i].size();
+    }
+    return maxLength;
+}
+
+
+CommandLineParser::ErrorValue  CommandLineParser::
+PrintErrorOnMissingOptions() {
+    VectorIndex i;
+    ErrorValue ev = CLGood;
+    for (i = 0; i < optionList.size(); i++ ){ 
+        if (optionRequired[i] and !optionUsed[i]) {
+            std::cout << "ERROR, the option " << optionList[i]
+                      << " must be specified." << std::endl;
+            ev = CLMissingOption;
+        }
+    }
+    return ev;
+}
diff --git a/libcpp/pbdata/CommandLineParser.hpp b/libcpp/pbdata/CommandLineParser.hpp
new file mode 100644
index 0000000..8cc7a8e
--- /dev/null
+++ b/libcpp/pbdata/CommandLineParser.hpp
@@ -0,0 +1,175 @@
+#ifndef _BLASR_COMMAND_LINE_PARSER_HPP_
+#define _BLASR_COMMAND_LINE_PARSER_HPP_
+
+#include <vector>
+#include <cstring>
+#include <iostream>
+#include <iomanip>
+#include <stdlib.h>
+#include <assert.h>
+#include "Types.h"
+#include <sstream>
+#include "StringUtils.hpp"
+
+class CommandLineParser {
+public:
+    enum ErrorValue {
+        CLGood,
+        CLBadOption,
+        CLMissingOption,
+        CLMissingValue,
+        CLInvalidInteger,
+        CLInvalidPositiveInteger,
+        CLInvalidNonNegativeInteger,
+        CLInvalidFloat,
+        CLInvalidPositiveFloat,
+        CLInvalidNonNegativeFloat };
+
+
+    enum OptionType {
+        Flag,
+        Integer,
+        PositiveInteger, // > 0
+        NonNegativeInteger, // >= 0
+        IntegerList,
+        Float,
+        PositiveFloat,  // > 0
+        NonNegativeFloat, // >= 0
+        String,
+        StringList };
+
+    std::vector<bool*> boolValues;
+    std::vector<int*> intValues;
+    std::vector<float*> floatValues;
+    std::vector<std::string*> stringValues;
+    std::vector<std::vector<std::string> *>stringListValues;
+    std::vector<std::vector<int> *> intListValues;
+    std::vector<int*> flagList;
+    std::vector<std::string> optionList;
+    std::vector<OptionType>    optionTypeList;
+    std::vector<int>    optionValueIndexList;
+    std::vector<std::string> descriptions;
+    std::vector<char>   optionRequired;
+    std::vector<char>   optionUsed;
+    std::vector<char>   named;
+
+    std::string programName;
+    std::string programSummary;
+    std::string conciseHelp;
+    std::string verboseHelp;
+    std::string helpString;
+    std::string examples;
+    std::string version;
+
+    int lineLength;
+    int numUnnamedOptions;
+    bool specialVersionFlag;
+
+    CommandLineParser();
+
+    void SetProgramSummary(std::string summaryp);
+
+    void SetHelp(std::string _help);
+
+    void SetConciseHelp(std::string _conciseHelp) ;
+
+    void SetProgramName(std::string namep);
+
+    void SetVersion(std::string versionp);
+
+    void SetVerboseHelp(std::string helpp);
+
+    void SetExamples(std::string examplesp);
+
+    void RegisterPreviousFlagsAsHidden();
+
+    void RegisterVersionFlag(bool *value);
+
+    void RegisterFlagOption(std::string option, bool *value, 
+        std::string description, bool required=false);
+
+    void RegisterIntOption(std::string option, int *value, 
+        std::string description, OptionType type, 
+        bool required=false, bool hidden=false);
+
+    void RegisterFloatOption(std::string option, float *value, 
+        std::string description, OptionType type, bool required=false);
+
+    void RegisterStringOption(std::string option, std::string *value, 
+        std::string description, bool required=false);
+
+    void RegisterStringListOption(std::string option, 
+        std::vector<std::string> *value, std::string description, 
+        bool required=false);
+
+    void RegisterIntListOption(std::string option, std::vector<int> *value, 
+        std::string description, bool required=false);
+
+    int IsOption(char *str);
+
+    int IsInteger(char *str);
+
+    int IsFloat(char *str);
+
+    int FindOption(char *option);
+
+    static void CommandLineToString(int argc, char* argv[], 
+        std::string& commandLine);
+
+    int ParseCommandLine(int argc, char* argv[], bool isProgramNameOnlyAllowed=false);
+
+    int ParseCommandLine(int argc, char* argv[], 
+        std::vector<std::string> &unflaggedValues, bool isProgramNameOnlyAllowed=false);
+
+    ErrorValue ParseOption(VectorIndex optionIndex,
+        VectorIndex &argi, int argc, char *argv[]);
+
+    void PrintErrorMessage(ErrorValue ev, char *option);
+
+    ErrorValue ParseFlag(VectorIndex optionValueIndex, 
+        VectorIndex &argi, int argc, char *argv[]);
+
+    ErrorValue ParseInteger(VectorIndex optionValueIndex, 
+        VectorIndex &argi, int argc, char *argv[]);
+
+    ErrorValue ParsePositiveInteger(VectorIndex optionValueIndex, 
+        VectorIndex &argi, int argc, char *argv[]);
+
+    ErrorValue ParseNonNegativeInteger(VectorIndex optionValueIndex, 
+        VectorIndex &argi, int argc, char *argv[]);
+
+    ErrorValue ParseFloat(VectorIndex optionValueIndex, 
+        VectorIndex &argi, int argc, char *argv[]);
+
+    ErrorValue ParsePositiveFloat(VectorIndex optionValueIndex, 
+        VectorIndex &argi, int argc, char *argv[]);
+
+    ErrorValue ParseNonNegativeFloat(VectorIndex optionValueIndex, 
+        VectorIndex &argi, int argc, char *argv[]);
+
+    ErrorValue ParseString(VectorIndex optionValueIndex, VectorIndex &argi, 
+        int argc, char *argv[]);
+
+    bool IsValuedOption(OptionType optType);
+
+    ErrorValue ParseIntList(VectorIndex optionValueIndex, VectorIndex &argi, 
+        int argc, char *argv[]);
+
+    ErrorValue ParseStringList(VectorIndex optionValueIndex, VectorIndex &argi, 
+        int argc, char *argv[]);
+
+    void PrintVersion();
+
+    void PrintUsage();
+
+    int GetNextWordLength(std::string &text, int pos);
+
+    void PrintIndentedText(std::ostream &out, std::string &text, 
+        int allLineIndent, int lineLength = 80, int firstLineIndent=0);
+
+    unsigned int GetMaxOptionLength();
+
+    ErrorValue PrintErrorOnMissingOptions();
+};
+
+#endif
diff --git a/libcpp/pbdata/Compare4BitCompressed.hpp b/libcpp/pbdata/Compare4BitCompressed.hpp
new file mode 100644
index 0000000..f94f37f
--- /dev/null
+++ b/libcpp/pbdata/Compare4BitCompressed.hpp
@@ -0,0 +1,98 @@
+/*
+ * ============================================================================
+ *
+ *       Filename:  Compare4BitCompressed.h
+ *
+ *    Description:  Imported from BLASR algorithm/compare
+ *
+ *        Version:  1.0
+ *        Created:  12/19/2013 05:22:46 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+#ifndef _BLASR_COMPARE_4BIT_COMPRESSED_HPP_
+#define _BLASR_COMPARE_4BIT_COMPRESSED_HPP_
+
+#include "defs.h"
+
+template<typename TNuc>
+class Compare4BitCompressed {
+  public:
+	const static unsigned char MaskCount = 0xf;
+
+	static int Compare(TNuc *lhs, TNuc *rhs) {
+		return ThreeBit[*lhs & MaskCount] - ThreeBit[*rhs & MaskCount];
+	}
+
+	static int Compare(TNuc *lhs, TNuc *rhs, int length) {
+		int i;
+		int res;
+		i = 0;
+		TNuc *lhsptr;
+		TNuc *rhsptr;
+		lhsptr = lhs;
+		rhsptr = rhs;
+		char *lhsend = lhs + length;
+		res = 0;
+		while (lhsptr != lhsend and res == 0) {
+			res = ThreeBit[*lhsptr & MaskCount] - ThreeBit[*rhsptr & MaskCount];
+			++lhsptr;
+			++rhsptr;
+		}
+		return res;
+	}
+
+	static int Equal(TNuc a, TNuc b) {
+		return (a & MaskCount) == (b & MaskCount);
+	}
+
+	static int LessThan(TNuc *a, int aLen, TNuc *b, int bLen) {
+		int minabLen = MIN(aLen, bLen);
+		if (minabLen <= 0)
+			return 0;
+		//		int cmpRes;
+
+		int cmpRes = Compare(a, b, minabLen);
+		if (cmpRes < 0) {
+			return 1;
+		}
+		else {
+			return 0;
+		}
+	}
+
+	static int LessThanEqual(TNuc *a, int aLen, TNuc *b, int bLen) {
+		int minabLen = MIN(aLen, bLen);
+		if (minabLen <= 0)
+			return 1;
+		int cmpRes = Compare(a, b, minabLen);
+		if (cmpRes <= 0) {
+			return 1;
+		}
+		else {
+			return 0;
+		}
+	}
+
+	static int Equals(TNuc *a, int aLen, TNuc *b, int bLen) {
+		int minabLen = MIN(aLen, bLen);
+		if (minabLen < 0)
+			return 0;
+		if (minabLen == 0)
+			return 1;
+		
+		int cmpRes = Compare(a, b, minabLen);
+		if (cmpRes == 0 and aLen <= bLen) {
+			return 1;
+		}
+		else {
+			return 0;
+		}
+	}
+};
+#endif
diff --git a/libcpp/pbdata/CompressedDNASequence.hpp b/libcpp/pbdata/CompressedDNASequence.hpp
new file mode 100644
index 0000000..a3fa6d1
--- /dev/null
+++ b/libcpp/pbdata/CompressedDNASequence.hpp
@@ -0,0 +1,89 @@
+#ifndef _BLASR_COMPRESSED_DNA_SEQUENCE_HPP_
+#define _BLASR_COMPRESSED_DNA_SEQUENCE_HPP_
+
+#include "DNASequence.hpp"
+#include "FASTASequence.hpp"
+#include "defs.h"
+#include <string.h>
+#include "qvs/QualityValue.hpp"
+#include "Compare4BitCompressed.hpp"
+
+typedef unsigned char CompressedNucleotide;
+
+class CompressedDNASequence: public DNASequence {
+	static const unsigned char MaskCount = 0xf;
+	static const unsigned char MaskNuc   = 0xf0;
+	static const unsigned char ShiftCount = 4;
+
+ public:
+	char *title;
+	int titleLength;
+	//
+	// This is just a placeholder for now.  
+	// No extra data here, just the ability to decompress.  Right now 
+	// the utilities for the compressed dna sequences
+	// are in CompressedSeqUtils.h, which could move here later.
+	//
+	QualityValue *qual;
+
+	CompressedDNASequence() {
+		const char t[] = "Compressed sequence\0";
+		titleLength = strlen(t);
+		title = new char[titleLength+1];
+		strcpy(title, t);
+		title[titleLength] = '\0';
+	}
+		
+	void MakeRC(CompressedDNASequence &rc) {
+		rc.Allocate(length);
+		DNALength i;
+		for (i = 0; i < length; i++) {
+			rc.seq[length - i - 1] = ReverseComplementNuc[ThreeBit[seq[i] & MaskCount]];
+			rc.seq[length - i - 1] += (seq[i] & MaskNuc); 
+		}
+		memcpy(rc.title, title, titleLength);
+		rc.titleLength = titleLength;
+	}
+	
+	Nucleotide operator[](DNALength i) {
+		return GetNuc(i);
+	}
+
+	Nucleotide GetNuc(DNALength i) {
+		return (seq[i] & MaskCount);
+	}
+
+	unsigned char GetCount(DNALength i) {
+		return seq[i] >> ShiftCount;
+	}
+
+	char *GetName() {
+		return (char*) title;
+	}
+	
+	void Copy(FASTASequence &rhs) {
+		seq = new CompressedNucleotide[rhs.length];
+		memcpy(seq, rhs.seq, rhs.length);
+		length = rhs.length;
+		if (title != NULL) {
+			delete[] title;
+		}
+		title = new char[rhs.titleLength+1];
+		memcpy(title, rhs.title, rhs.titleLength);
+		titleLength = rhs.titleLength;
+		title[titleLength] = '\0';
+	}
+	float GetAverageQuality() {
+		return 0.0;
+	}
+
+	void SortHomopolymerQualities() {
+		cout << "qualities are not implemented for compressed sequences." << endl;
+		assert(0);
+	}
+};
+
+	
+
+
+#endif
diff --git a/libcpp/pbdata/CompressedSequence.hpp b/libcpp/pbdata/CompressedSequence.hpp
new file mode 100644
index 0000000..45b3aaa
--- /dev/null
+++ b/libcpp/pbdata/CompressedSequence.hpp
@@ -0,0 +1,100 @@
+#ifndef _BLASR_COMPRESSED_SEQUENCE_HPP_
+#define _BLASR_COMPRESSED_SEQUENCE_HPP_
+#include <cassert>
+#include <stdint.h>
+#include <iostream>
+#include <fstream>
+#include <ostream>
+#include <cstring>
+#include "utils.hpp"
+#include "Types.h"
+#include "Enumerations.h"
+#include "NucConversion.hpp"
+#include "DNASequence.hpp"
+#include "qvs/QualityValue.hpp"
+#include "reads/ZMWGroupEntry.hpp"
+#include "FASTASequence.hpp"
+#include "ReverseCompressIndex.hpp"
+
+typedef unsigned char CompressedNucleotide;
+
+template<typename T_Sequence>
+class CompressedSequence : public FASTASequence {
+private:
+    int hasIndex;
+    int hasTitle;
+    ReverseCompressIndex index;
+
+    static const unsigned char MaskCount = 0xf;
+    static const unsigned char MaskNuc   = 0xf0;
+    static const unsigned char ShiftCount = 4;
+
+public:
+    //
+    // This is just a placeholder for now.  
+    // No extra data here, just the ability to decompress.  Right now 
+    // the utilities for the compressed dna sequences
+    // are in CompressedSeqUtils.h, which could move here later.
+    //
+    QualityValue *qual;
+
+    void CopyConfiguration(CompressedSequence<T_Sequence> &rhs); 
+
+    void ShallowCopy(CompressedSequence<T_Sequence> &rhs); 
+
+    void MakeRC(CompressedSequence &rc); 
+
+    Nucleotide operator[](DNALength i); 
+
+    Nucleotide GetNuc(DNALength i); 
+
+    unsigned char GetCount(DNALength i); 
+
+    char *GetName();
+
+    void Copy(FASTASequence &rhs); 
+
+    float GetAverageQuality(); 
+
+    void SortHomopolymerQualities(); 
+
+    CompressedSequence(); 
+    ~CompressedSequence(); 
+
+    void Free(); 
+
+    void SetHasTitle(); 
+
+    void SetHasIndex(); 
+
+    void Write(std::string outFileName); 
+
+    void Read(std::string inFileName); 
+
+    int BuildFourBitReverseIndex(int binSize); 
+
+    int BuildReverseIndex(int maxRun, int binSize); 
+
+    long Lookup4BitCompressedSequencePos(int cpPos); 
+
+    int LookupSequencePos(int cpPos); 
+
+    char GetCount(unsigned char ch); 
+
+    DNALength FourBitCompressHomopolymers(); 
+
+    static int Only4BitACTG(CompressedNucleotide *seq, int seqLength); 
+
+    int Only4BitACTG(); 
+
+    void RemoveCompressionCounts(); 
+
+    DNALength FourBitDecompressHomopolymers(int start, int end,
+            T_Sequence &decompSeq); 
+
+    DNALength CondenseHomopolymers();
+};
+
+#include "CompressedSequenceImpl.hpp"
+
+#endif // _BLASR_COMPRESSED_SEQUENCE_HPP_
diff --git a/libcpp/pbdata/CompressedSequenceImpl.hpp b/libcpp/pbdata/CompressedSequenceImpl.hpp
new file mode 100644
index 0000000..7759541
--- /dev/null
+++ b/libcpp/pbdata/CompressedSequenceImpl.hpp
@@ -0,0 +1,343 @@
+#ifndef _BLASR_COMPRESSED_SEQUENCES_IMPL_HPP_
+#define _BLASR_COMPRESSED_SEQUENCES_IMPL_HPP_
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::CopyConfiguration(CompressedSequence<T_Sequence> &rhs) {
+    hasIndex = rhs.hasIndex;
+    hasTitle = rhs.hasTitle;
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::ShallowCopy(CompressedSequence<T_Sequence> &rhs) {
+    //
+    // Copy over non sequence information
+    index.ShallowCopy(rhs.index);
+    CopyConfiguration(rhs);
+
+    // Copy sequence information
+    ((FASTASequence*)this)->ShallowCopy((FASTASequence&)rhs);
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::MakeRC(CompressedSequence &rc) {
+    rc.Free(); //Free rc.seq and rc.title before allocate.
+
+    rc.Allocate(length);
+    DNALength i;
+    for (i = 0; i < length; i++) {
+        rc.seq[length - i - 1] = ReverseComplementNuc[ThreeBit[seq[i] & MaskCount]];
+        rc.seq[length - i - 1] += (seq[i] & MaskNuc); 
+    }
+
+    rc.CopyTitle(title, titleLength);
+}
+
+template<typename T_Sequence>
+Nucleotide CompressedSequence<T_Sequence>::operator[](DNALength i) {
+    return GetNuc(i);
+}
+
+template<typename T_Sequence>
+Nucleotide CompressedSequence<T_Sequence>::GetNuc(DNALength i) {
+    return (seq[i] & MaskCount);
+}
+
+template<typename T_Sequence>
+unsigned char CompressedSequence<T_Sequence>::GetCount(DNALength i) {
+    return seq[i] >> ShiftCount;
+}
+
+template<typename T_Sequence>
+char* CompressedSequence<T_Sequence>::GetName() {
+    return (char*) title;
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::Copy(FASTASequence &rhs) {
+    seq = new CompressedNucleotide[rhs.length];
+    memcpy(seq, rhs.seq, rhs.length);
+    length = rhs.length;
+    if (title != NULL) {
+        delete[] title;
+    }
+    title = new char[rhs.titleLength+1];
+    memcpy(title, rhs.title, rhs.titleLength);
+    titleLength = rhs.titleLength;
+    title[titleLength] = '\0';
+}
+
+template<typename T_Sequence>
+float CompressedSequence<T_Sequence>::GetAverageQuality() {
+    return 0.0;
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::SortHomopolymerQualities() {
+    std::cout << "qualities are not implemented for compressed sequences." 
+    << std::endl;
+}
+
+template<typename T_Sequence>
+CompressedSequence<T_Sequence>::CompressedSequence() {
+    hasIndex = 0;
+    hasTitle = 0;
+    qual = NULL;
+    FASTASequence();
+}
+
+template<typename T_Sequence>
+CompressedSequence<T_Sequence>::~CompressedSequence() {
+    CompressedSequence::Free();
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::Free() {
+    if (hasIndex) {
+        index.Free();
+    }
+    if(qual) {delete [] qual; qual = NULL;}
+    FASTASequence::Free();
+    hasIndex = 0;
+    hasTitle = 0;
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::SetHasTitle() {
+    hasTitle = 1;
+}
+template<typename T_Sequence>
+
+void CompressedSequence<T_Sequence>::SetHasIndex() {
+    hasIndex = 1;
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::Write(std::string outFileName) {
+    std::ofstream out;
+    CrucialOpen(outFileName,out, std::ios::binary | std::ios::in);
+    out.write((char*) &hasTitle, sizeof(int));
+    out.write((char*) &hasIndex, sizeof(int));
+    if (hasTitle) {
+        out.write((char*)&titleLength, sizeof(int));
+        out.write((char*)title, titleLength);
+    }
+    out.write((char*) &length, sizeof(int));
+    out.write((char*) seq, sizeof(char) * length);
+    if (hasIndex) {
+        index.Write(out);
+    }
+    out.close();
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::Read(std::string inFileName) {
+    Free(); //Free before reusing this object.
+    std::ifstream in;
+    CrucialOpen(inFileName, in, std::ios::binary | std::ios::in);
+    // step 1, read in the options.
+    in.read((char*) &hasTitle, sizeof(int));
+    in.read((char*) &hasIndex, sizeof(int));
+    if (hasTitle) {
+        int inTitleLength;
+        in.read((char*) &inTitleLength, sizeof(int));
+        char * inTitle = new char[inTitleLength+1];
+        in.read((char*) inTitle, inTitleLength);
+        inTitle[titleLength] = '\0';
+        CopyTitle(inTitle, inTitleLength);
+        delete [] inTitle;
+    }
+    in.read((char*) &length, sizeof(DNALength));
+    seq = new Nucleotide[length];
+    in.read((char*) seq, length * sizeof(Nucleotide));
+    if (hasIndex) {
+        index.Read(in);
+    }
+    deleteOnExit = true;
+}
+
+template<typename T_Sequence>
+int CompressedSequence<T_Sequence>::BuildFourBitReverseIndex(int binSize) {
+    BuildReverseIndex(15, binSize);
+}
+
+template<typename T_Sequence>
+int CompressedSequence<T_Sequence>::BuildReverseIndex(int maxRun, int binSize) {
+    hasIndex = 1;
+
+    DNALength i;
+    DNALength hpi;
+
+    // 
+    // Phase 1. Count the number of nucleotide transitions-1
+    //
+
+    hpi = 0;
+    for (i = 0; i < length; i++) { 
+        //		if (hpi % binSize == 0 ){
+        //			index.push_back(i);
+        //		}
+        int run = 1;
+        while (i < length - 1 
+                and ThreeBit[seq[i]] == ThreeBit[seq[i+1]] and
+                (run == 0 or 
+                 run < maxRun)) {i++, run++;};
+        hpi++;
+    }
+
+
+    //
+    // Phase 2. Store the index.
+    //
+    index.Free();
+    index.indexLength = hpi/index.binSize + 1;
+    index.index = new int[index.indexLength];
+    hpi = 0;
+    int ii = 0;
+    for (i = 0; i < length; i++) { 
+        if (hpi % index.binSize == 0 ) {
+            assert(ii < index.indexLength);
+            index.index[ii] = i;
+            ++ii;
+        }
+        int run = 1;
+        while (i < length - 1 
+                and ThreeBit[seq[i]] == ThreeBit[seq[i+1]] and
+                (run == 0 or 
+                 run < maxRun)) {i++, run++;};
+        hpi++;
+    }
+
+    return index.size();
+}
+
+template<typename T_Sequence>
+long CompressedSequence<T_Sequence>::Lookup4BitCompressedSequencePos(int cpPos) {
+    int      bin = cpPos / index.binSize;
+    int  origPos = index.index[bin];
+    int cpBinPos = bin * index.binSize;
+    int cp;
+    for (cp = cpBinPos; cp < cpPos; cp++ ){
+        origPos += GetCount(seq[cp]);
+    }
+    return origPos;
+}
+
+
+template<typename T_Sequence>
+int CompressedSequence<T_Sequence>::LookupSequencePos(int hpPos) {
+    int origPos = index.index[hpPos % index.binSize];
+    int hpi;
+    for (hpi = (hpPos / index.binSize) * index.binSize; hpi < hpPos; hpi++, origPos++ ) {
+        // 
+        // advance orig across all homopolymer stretches.
+        //
+        while (origPos < length - 1 and
+                seq[origPos] == seq[origPos+1])
+            ++origPos;
+    }
+    return origPos;
+}
+
+template<typename T_Sequence>
+char CompressedSequence<T_Sequence>::GetCount(unsigned char ch) {
+    return (ch >> 4);
+}
+
+template<typename T_Sequence>
+DNALength CompressedSequence<T_Sequence>::FourBitCompressHomopolymers() {
+    VectorIndex i, c;
+    unsigned char count = 0;
+    for (i =0, c = 0; i < length; c++, i++) {
+        count = 1;
+        while (count < 15 and 
+                i < length - 1 
+                and ThreeBit[seq[i]] == ThreeBit[seq[i+1]]) {
+            i++; count++;
+        }
+        // store nuc into the lower 4 bits
+        seq[c] = ThreeBit[seq[i]];
+
+        // store count into the upper 4 bits.
+        count = count << 4;
+        seq[c] = seq[c] | count;
+
+    }
+    length = c;	
+    return length;
+}
+
+template<typename T_Sequence>
+int CompressedSequence<T_Sequence>::Only4BitACTG(CompressedNucleotide *seq, int seqLength) {
+    int i;
+    for (i = 0; i < seqLength; i++ ){
+        if (ThreeBit[seq[i] & MaskCount] > 3) {
+            return 0;
+        }
+    }
+    return 1;
+}
+
+template<typename T_Sequence>
+int CompressedSequence<T_Sequence>::Only4BitACTG() {
+    return Only4BitACTG(seq, length);
+}
+
+template<typename T_Sequence>
+void CompressedSequence<T_Sequence>::RemoveCompressionCounts() {
+    DNALength i;
+    unsigned char mask =0xf;
+    for (i = 0; i< length; i++) {
+        seq[i] = seq[i] & mask;
+    }
+}
+
+template<typename T_Sequence>
+DNALength CompressedSequence<T_Sequence>::FourBitDecompressHomopolymers(int start, int end, 
+        T_Sequence &decompSeq) {
+    decompSeq.Free(); // Free before decomp;
+
+    //
+    // first compute the length of the decoded 
+    //
+    DNALength i;
+    decompSeq.length = 0;
+    for (i = start; i < end; i++ ){ 
+        unsigned char count;
+        count = (unsigned char) seq[i];
+        count >>= 4;
+        decompSeq.length += count;
+    }
+    decompSeq.seq = new Nucleotide[decompSeq.length];
+
+    //
+    // Now store the actual decompressed seq.
+    //
+    int d = 0;
+    unsigned char mask = 0xf;
+    for (i = start; i < end; i++ ){ 
+        unsigned char count;
+        count = (unsigned char) seq[i];
+        count >>= 4;
+        int j;
+        for (j = 0; j < count; j++ ){ 
+            decompSeq.seq[d] = FourBitToAscii[(seq[i] & mask)];
+            d++;
+        }
+    }
+    decompSeq.bitsPerNuc = 4;
+    decompSeq.deleteOnExit = true;
+    return decompSeq.length;
+}
+
+template<typename T_Sequence>
+DNALength CompressedSequence<T_Sequence>::CondenseHomopolymers() {
+    VectorIndex i, c;
+    for (i =0, c = 0; i < length; c++, i++) {
+        while (i < length - 1 and ThreeBit[seq[i]] == ThreeBit[seq[i+1]]) i++;
+        seq[c] = seq[i];
+    }
+    length = c;
+    return length;
+}
+
+#endif
diff --git a/libcpp/pbdata/DNASequence.cpp b/libcpp/pbdata/DNASequence.cpp
new file mode 100644
index 0000000..cec3fab
--- /dev/null
+++ b/libcpp/pbdata/DNASequence.cpp
@@ -0,0 +1,402 @@
+#include <cassert>
+#include <cstring>
+#include "Types.h"
+#include "DNASequence.hpp"
+
+DNALength DNASequence::size() {
+    return length;
+}
+
+void DNASequence::TakeOwnership(DNASequence &rhs) {
+    CheckBeforeCopyOrReference(rhs);
+    // Free this DNASequence before take owner ship from rhs.
+    DNASequence::Free();
+
+    seq = rhs.seq;
+    length = rhs.length;
+    deleteOnExit = rhs.deleteOnExit;
+
+    rhs.deleteOnExit = false;
+}
+
+void DNASequence::Append(const DNASequence &rhs, DNALength appendPos) {
+    assert(deleteOnExit); // must have control over seq.
+    //
+    // Simply append rhs to this seuqence, unless appendPos is nonzero
+    // in which case rhs is inserted at attendPos, overwriting this
+    // sequence from appendPos to the end.
+    //
+    Nucleotide *newSeq;
+    //
+    // Handle the two cases (appendPos == 0 and appendPos > 0)
+    // separately in order to handle memory deallocation correctly.
+    //
+    if (appendPos == 0) {
+        DNALength  newSeqLength = length + rhs.length;
+        newSeq = new Nucleotide[newSeqLength];
+        memcpy(newSeq, seq, length);
+        memcpy(&newSeq[length], rhs.seq, rhs.length);
+
+        if (length != 0) {
+            delete[] seq;
+        }
+        seq = newSeq;
+        length = newSeqLength;
+    }
+    else {
+        if (appendPos + rhs.length < length) {
+            memcpy(&seq[appendPos], rhs.seq, rhs.length);
+            length = appendPos + rhs.length;
+        }
+        else {
+            DNALength lengthCopy = length;
+            length = appendPos;
+            DNALength newSeqLength;
+            newSeqLength = length + rhs.length;
+            newSeq = new Nucleotide[newSeqLength];
+            memcpy(newSeq, seq, length);
+            memcpy(&newSeq[length], rhs.seq, rhs.length);
+            if (deleteOnExit and lengthCopy != 0) {
+                delete[] seq;
+            }
+            seq = newSeq;
+            length = newSeqLength;
+        }
+    }
+    deleteOnExit = true;
+}
+
+// Copy FROM rhs to this DNASequence. 
+DNASequence& DNASequence::Copy(const DNASequence &rhs, DNALength rhsPos, DNALength rhsLength) {
+    CheckBeforeCopyOrReference(rhs);
+    // Free this DNASequence before copying from rhs
+    DNASequence::Free();
+
+    //
+    // When initializing a vector of DNASequence's, the copy
+    // constructor will initialze a list and call this
+    // function with a zero-length DNASequence as the rhs to
+    // initialize every element in the vector   The check
+    // below will fail on zero-length sequences, so add a boundary
+    // condition check before that to allow the copy-constructor to
+    // work.
+    //
+    if (rhs.length == 0) {
+        seq = NULL;
+        length = 0;
+        deleteOnExit = true;
+        return *this;
+    }
+
+    //
+    // Silently ignoring this case could lead to problems later on,
+    // catastrophically assert here if the input is not valid.
+    // In case rhsLength + rhsPos > ULONG_MAX (4294967295), check 
+    // both rhsLength and rhsPos, fix bug 21794
+    //
+    if (not (rhsLength <= rhs.length     && 
+             rhsPos    <= rhs.length + 1 &&
+             rhsLength + rhsPos <= rhs.length + 2 )) {
+        std::cout << "ERROR.  The subsequence to copy is out of bounds." 
+            << std::endl
+            << "        Failed to copy a subsequence starting at " << rhsPos 
+            << std::endl
+            << "        with length "<< rhsLength 
+            << " from a sequence of length " << rhs.length << "." 
+            << std::endl;
+        exit(1);
+    }
+
+    if (rhsLength == 0) {
+        rhsLength = rhs.length - rhsPos;
+    }
+    if (rhsLength == 0) {
+        seq = NULL;
+    }
+    else {
+        seq = new Nucleotide [rhsLength];
+        memcpy(seq, &rhs.seq[rhsPos], rhsLength);
+    }
+    length = rhsLength;
+    deleteOnExit = true;
+    return *this;
+}
+
+DNASequence& DNASequence::Copy(const std::string &rhsSeq) {
+    // Free this DNASequence before copying from rhs
+    DNASequence::Allocate(static_cast<DNALength>(rhsSeq.size()));
+    memcpy(seq, rhsSeq.c_str(), length);
+    return *this;
+}
+
+DNASequence & DNASequence::operator=(const std::string & rhsSeq) {
+    return DNASequence::Copy(rhsSeq);
+}
+
+void DNASequence::ShallowCopy(const DNASequence &rhs) {
+    seq = rhs.seq;
+    length = rhs.length;
+    deleteOnExit = false;
+}
+
+int DNASequence::GetStorageSize() {
+    return (length * sizeof(Nucleotide));
+}
+
+DNASequence &DNASequence::operator=(const DNASequence &rhs){ 
+    DNASequence::Copy(rhs);
+    return *this;
+}
+
+//
+// synonym for printseq
+//
+void DNASequence::Print(std::ostream &out, int lineLength) {
+    PrintSeq(out, lineLength);
+}
+
+void DNASequence::PrintSeq(std::ostream &out, int lineLength) {
+    if (lineLength == 0) {
+        std::string line;
+        line.assign((char*)seq, length);
+        out << line;
+    }
+    else {
+        //
+        // Make sure this isn't 
+        assert(lineLength > 0);
+        DNALength curPos = 0;
+        int curLineLength = lineLength;
+        while (curPos < length) {
+            if (curPos + curLineLength > length) {
+                curLineLength = length - curPos;
+            }
+            std::string line;
+            line.assign((char*) &seq[curPos], curLineLength);
+            out << line << std::endl;
+            curPos += curLineLength;
+        }
+    }
+}
+
+void DNASequence::Allocate(DNALength plength) {
+    DNASequence::Free();
+
+    seq = new Nucleotide [plength];
+    length = plength;
+    deleteOnExit = true;
+}
+
+void DNASequence::ReferenceSubstring(const DNASequence &rhs, DNALength pos, DNALength substrLength) {
+    CheckBeforeCopyOrReference(rhs); 
+
+    // Free this DNASequence before referencing rhs.
+    DNASequence::Free();
+
+    //
+    // This makes a reference therefore it should not be deleted.
+    //
+    assert(pos >= 0 && pos <= rhs.length &&
+           substrLength >= 0 && substrLength <= rhs.length);
+    if (substrLength == 0) {
+        substrLength = rhs.length - pos;
+    }
+    assert(pos + substrLength <= rhs.length);
+    seq = &rhs.seq[pos];
+    length = substrLength;
+    deleteOnExit = false;
+}
+
+DNALength DNASequence::MakeRCCoordinate(DNALength forPos ) {
+    return length - forPos - 1;
+}
+
+// Create a reverse complement DNAsequence of this DNASequence and assign to rc.
+void DNASequence::MakeRC(DNASequence &rc, DNALength pos, DNALength rcLength) {
+    if (rcLength == 0) {
+        rcLength = length - pos;
+    }
+
+    ((DNASequence&)rc).Allocate(rcLength);
+    DNALength i;
+    for (i = 0; i < rcLength; i++) {
+        rc.seq[rcLength - i - 1] = ReverseComplementNuc[seq[i+pos]];
+    }
+    rc.length = rcLength;
+    rc.deleteOnExit = true;
+}
+
+void DNASequence::ToTwoBit() {
+    DNALength i;
+    for (i = 0; i < length; i++) {
+        seq[i] = TwoBit[seq[i]];
+    }
+    bitsPerNuc = 2;
+}
+
+void DNASequence::ToFourBit() {
+    DNALength i;
+    if (bitsPerNuc != 4) 
+        for (i = 0; i < length; i++) { seq[i] = FourBit[seq[i]]; }
+    bitsPerNuc = 4;
+}
+
+void DNASequence::ConvertThreeBitToAscii() {
+    DNALength i;
+    for (i = 0; i < length; i++ ){
+        seq[i] = ThreeBitToAscii[seq[i]];
+    }
+}
+
+void DNASequence::ToAscii() {
+    DNALength i;
+    if (bitsPerNuc != 8) {
+        for (i = 0; i < length; i++ ){ 
+            seq[i] = FourBitToAscii[seq[i]];
+        }
+        bitsPerNuc = 8;
+    }
+}
+
+// Copy rhs[start:start+plength] to this DNASequence.
+void DNASequence::Assign(DNASequence &ref, DNALength start, DNALength plength) {
+    CheckBeforeCopyOrReference(ref);
+    // Free this DNASequence before assigning anything
+    DNASequence::Free();
+    
+    if (plength) {
+        length = plength;
+        seq = new Nucleotide[length];
+        memcpy(seq, &ref.seq[start], length);
+    }
+    else if (start) {
+        length = ref.length - start;
+        seq = new Nucleotide[length];
+        memcpy(seq, &ref.seq[start], length);
+    }
+    else {
+        ((DNASequence*)this)->Copy(ref);
+    }
+    deleteOnExit = true;
+}
+
+void DNASequence::ToLower() {
+    DNALength i;
+    for (i = 0; i < length; i++) {
+        seq[i] = AllToLower[seq[i]];
+    }
+}
+
+void DNASequence::ToUpper() {
+    DNALength i;
+    for (i = 0; i < length; i++) {
+        seq[i] = AllToUpper[seq[i]];
+    }
+}
+
+void DNASequence::Concatenate(const Nucleotide *moreSeq, DNALength moreSeqLength) {
+    DNALength prevLength = length;
+    length += moreSeqLength;
+    Nucleotide *prev = seq;
+    seq = new Nucleotide[length];
+    if (prev != NULL) {
+        memcpy(seq, prev, prevLength);
+        delete[] prev;
+    }
+    memcpy((Nucleotide*) &seq[prevLength], moreSeq, moreSeqLength);
+    deleteOnExit = true;
+}
+
+std::string DNASequence::GetTitle() const {
+    return std::string("");
+}
+
+void DNASequence::Concatenate(const Nucleotide* moreSeq) {
+    DNALength moreSeqLength = strlen((char*) moreSeq);
+    Concatenate(moreSeq, moreSeqLength);
+}
+
+void DNASequence::Concatenate(DNASequence &seq) {
+    Concatenate(seq.seq, seq.length);
+}
+
+int DNASequence::Compare(DNALength pos, DNASequence &rhs, DNALength rhsPos, DNALength length) {
+    return memcmp(&seq[pos], &rhs.seq[rhsPos], length);
+}
+
+int DNASequence::LessThanEqual(DNALength pos, DNASequence &rhs, DNALength rhsPos, DNALength length) {
+    int res = Compare(pos, rhs, rhsPos, length);
+    if (res <= 0) 
+        return 1;
+    else
+        return 0;
+}
+
+int DNASequence::Equals(DNASequence &rhs, DNALength rhsPos, DNALength length, DNALength pos) {
+    int res = Compare(pos, rhs, rhsPos, length);
+    return res == 0;
+}
+
+int DNASequence::LessThan(DNALength pos,  DNASequence &rhs, DNALength rhsPos, DNALength length) {
+    int res=  Compare(pos, rhs, rhsPos, length);
+    return (res < 0);
+}
+
+void DNASequence::CleanupASCII() {
+    DNALength i;
+    for (i = 0; i < length; i++ ){
+        if (ThreeBit[seq[i]] == 255) {
+            seq[i] = 'N';
+        }
+    }
+}
+
+Nucleotide DNASequence::GetNuc(DNALength i) {
+    return seq[i];
+}
+
+DNALength DNASequence::GetRepeatContent() {
+    DNALength i;
+    DNALength nRepeat = 0;
+    for (i =0 ; i < length;i++) {
+        if (tolower(seq[i]) == seq[i]) { nRepeat++;}
+    }
+    return nRepeat;
+}
+
+void DNASequence::CleanupOnFree() {
+    deleteOnExit = true;
+}
+
+void DNASequence::Free() {
+    if (deleteOnExit == true) {
+        // if has control, delete seq 
+        // Otherwise, seq in memory is controlled by another object, 
+        // and will be deleted later.
+        if (seq != NULL) {
+            delete[] seq;
+        }
+    } 
+    // Reset seq, length and deleteOnExit
+    seq = NULL;
+    length = 0;
+    deleteOnExit = false;
+}
+
+void DNASequence::Resize(DNALength newLength) {
+    DNASequence::Free();
+    seq = new Nucleotide[newLength];
+    length = newLength;
+    deleteOnExit = true;
+}
+
+DNALength DNASequence::GetSeqStorage() {
+    return length;
+}
+
+#ifdef USE_PBBAM
+DNASequence & DNASequence::Copy(const PacBio::BAM::BamRecord & record) {
+    return DNASequence::Copy(record.Sequence());
+}
+#endif
+
diff --git a/libcpp/pbdata/DNASequence.hpp b/libcpp/pbdata/DNASequence.hpp
new file mode 100644
index 0000000..286e7d8
--- /dev/null
+++ b/libcpp/pbdata/DNASequence.hpp
@@ -0,0 +1,183 @@
+#ifndef  _BLASR_DNA_SEQUENCE_HPP_
+#define  _BLASR_DNA_SEQUENCE_HPP_
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <iostream>
+#include <string>
+#include <cassert>
+#include "Types.h"
+#include "NucConversion.hpp"
+#include "libconfig.h"
+
+#ifdef USE_PBBAM
+#include "pbbam/BamRecord.h"
+#endif
+
+
+class DNASequence {
+public:
+    DNALength length;
+    Nucleotide *seq;
+    int bitsPerNuc;
+    bool deleteOnExit;
+
+    inline DNASequence();
+    inline ~DNASequence();
+
+    //--- functions ---//
+    
+    DNALength size();
+
+    inline void CheckBeforeCopyOrReference(const DNASequence & rhs, std::string seqType = "DNASequence"); 
+
+    void TakeOwnership(DNASequence &rhs);
+
+    void Append(const DNASequence &rhs, DNALength appendPos=0);
+
+    DNASequence &Copy(const DNASequence &rhs, DNALength rhsPos=0, DNALength rhsLength=0);
+
+    void ShallowCopy(const DNASequence &rhs);
+
+    DNASequence & Copy(const std::string & rhs);
+
+    int GetStorageSize();
+
+    DNASequence &operator=(const DNASequence &rhs);
+
+    DNASequence &operator=(const std::string &rhs);
+
+    void Print(std::ostream &out, int lineLength = 50);
+
+    void PrintSeq(std::ostream &out, int lineLength = 50);
+
+    void Allocate(DNALength plength);
+
+    void ReferenceSubstring(const DNASequence &rhs, DNALength pos=0, DNALength substrLength=0); 
+
+    DNALength MakeRCCoordinate(DNALength forPos );
+
+    inline void CopyAsRC(DNASequence &rc, DNALength pos=0, DNALength rcLength =0);
+
+    void MakeRC(DNASequence &rc, DNALength pos=0, DNALength rcLength=0);
+
+    void ToTwoBit();
+
+    inline void ToThreeBit();
+
+    void ToFourBit();
+
+    void ConvertThreeBitToAscii();
+
+    void ToAscii();
+
+    void Assign(DNASequence &ref, DNALength start=0, DNALength plength=0);
+
+    void ToLower();
+
+    void ToUpper(); 
+
+    void Concatenate(const Nucleotide *moreSeq, DNALength moreSeqLength); 
+
+    std::string GetTitle() const; 
+
+    void Concatenate(const Nucleotide* moreSeq);
+
+    void Concatenate(DNASequence &seq); 
+
+    int Compare(DNALength pos, DNASequence &rhs, DNALength rhsPos, DNALength length); 
+
+    int LessThanEqual(DNALength pos, DNASequence &rhs, DNALength rhsPos, DNALength length); 
+
+    int Equals(DNASequence &rhs, DNALength rhsPos, DNALength length, DNALength pos=0 ); 
+
+    int LessThan(DNALength pos,  DNASequence &rhs, DNALength rhsPos, DNALength length); 
+
+    void CleanupASCII(); 
+
+    Nucleotide operator[](int i) {
+        return seq[i];
+    }
+
+    Nucleotide GetNuc(DNALength i); 
+
+    DNALength GetRepeatContent(); 
+
+    void CleanupOnFree();
+
+    virtual void Free(); 
+
+    void Resize(DNALength newLength);
+
+    DNALength GetSeqStorage();
+
+#ifdef USE_PBBAM
+    /// Copies a BamRecord as a DNASequence.
+    DNASequence & Copy(const PacBio::BAM::BamRecord & record);
+#endif 
+};
+
+inline DNASequence::DNASequence() {
+    seq = NULL;
+    length = 0;
+    bitsPerNuc = 8;
+    deleteOnExit = false;
+}
+
+inline DNASequence::~DNASequence() {
+    DNASequence::Free();
+}
+
+
+// Sanity check:
+// If this DNASequence and rhs are pointing to the same seq 
+// in memory, make sure this DNASequence's deleteOnExit is false.
+// (otherwise, seq in memory will be deleted before being copied)
+inline void DNASequence::CheckBeforeCopyOrReference(const DNASequence & rhs, std::string seqType) {
+
+    if (seq == rhs.seq and seq != NULL and deleteOnExit) {
+        std::cout << "ERROR, trying to copying a " << seqType << " to itself." << std::endl;
+        exit(1);
+    }
+}
+
+inline void DNASequence::ToThreeBit() {
+    DNALength i;
+    if (bitsPerNuc != 3) 
+        for (i = 0; i < length; i++) { seq[i] = ThreeBit[seq[i]]; }
+    bitsPerNuc = 3;
+}
+
+inline void DNASequence::CopyAsRC(DNASequence &rc, DNALength pos, DNALength rcLength) {
+    // Free rc before copying any data to rc.
+    ((DNASequence&)rc).Free();
+    //
+    // Different way of accounting for position. The position is on
+    // the rc strand, not the forward strand.
+    //
+    if (rcLength == 0) {
+        rcLength = length - pos;
+    }
+    DNALength rcStart = length - (pos + rcLength);
+    ((DNASequence&)rc).Resize(rcLength);
+    DNALength i;
+    for (i = 0; i < rcLength; i++) {
+        rc.seq[i] = ReverseComplementNuc[seq[rcStart - 1 + (rcLength - i)]];
+    }
+
+    // The reverse complement controls its own memory now.
+    rc.deleteOnExit = true;
+}
+
+
+template<typename T>
+DNALength ResizeSequence(T &dnaseq, DNALength newLength) {
+    assert(newLength > 0);
+    ((T&)dnaseq).Free();
+    dnaseq.seq = new Nucleotide[newLength];
+    dnaseq.length = newLength;
+    dnaseq.deleteOnExit = true;
+    return newLength;
+}
+
+#endif // _BLASR_DNA_SEQUENCE_HPP_
diff --git a/libcpp/pbdata/Enumerations.h b/libcpp/pbdata/Enumerations.h
new file mode 100644
index 0000000..b51575b
--- /dev/null
+++ b/libcpp/pbdata/Enumerations.h
@@ -0,0 +1,39 @@
+#ifndef _BLASR_ENUMERATIONS_HPP_
+#define _BLASR_ENUMERATIONS_HPP_
+
+typedef enum T_FileType {Fasta,
+    Fastq,
+    HDFPulse,
+    Fourbit,
+    HDFBase,
+    HDFCCS,
+    HDFCCSONLY,
+    PBBAM,
+    None
+} FileType;
+
+typedef enum T_Strand {Forward, Reverse} Strand;
+
+typedef enum T_PlatformType {
+    Springfield,
+    Astro,
+    NoPlatform
+} PlatformId;
+
+typedef enum T_RegionType {
+    GlobalAccuracy,
+    HQRegion,
+    Adapter,
+    Insert, 
+    ArtifactRegion
+} RegionType;
+
+typedef enum T_PulseMetricType {
+    QualityValueMetric,ClassifierQVMetric,StartTimeMetric,PulseWidthMetric,WidthInFramesMetric,
+    pkmidMetric,IPDMetric,LightMetric, PreBaseFramesMetric
+} PulseMetricType;
+
+
+typedef enum T_AlignMode { NoAlignMode, Fullread, Subread, CCSDeNovo, CCSFullPass, CCSAllPass, ZmwSubreads } AlignMode;
+
+#endif
diff --git a/libcpp/pbdata/FASTAReader.cpp b/libcpp/pbdata/FASTAReader.cpp
new file mode 100644
index 0000000..6477fc0
--- /dev/null
+++ b/libcpp/pbdata/FASTAReader.cpp
@@ -0,0 +1,420 @@
+#include <stdlib.h>
+#include <string>
+#include <iostream>
+#include <vector>
+#include <limits.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "sys/mman.h"
+#include "sys/fcntl.h"
+
+#include "Enumerations.h"
+#include "NucConversion.hpp"
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+
+using namespace std;
+
+void FASTAReader::SetFileSize() {
+    //
+    // Seek operation returns the amount seeked forwared in bytes.
+    // This is the size used to map (which is rounded up by the 
+    // system).
+    //
+    fileSize = lseek(fileDes, 0, SEEK_END);
+    lseek(fileDes, 0, SEEK_SET);
+}
+
+void FASTAReader::Init() {
+    padding = 0;
+    fileDes = -1;
+    fileSize = 0;
+    endOfReadDelim = '>';
+    readStartDelim = '>';
+    doToUpper = false;
+    convMat = PreserveCase;
+    computeMD5 = false;
+    filePtr = NULL;
+    curPos = 0;
+}
+
+FASTAReader::FASTAReader() {
+    Init();
+}
+
+FASTAReader::FASTAReader(string &fileName) {
+    Init(); // initialze defaults.
+    Init(fileName); // open file.
+    padding = 0;
+    endOfReadDelim = '>';
+    readStartDelim = '>';
+}
+
+void FASTAReader::SetSpacePadding(int _padding) {
+    assert(_padding >= 0);
+    padding = _padding;
+}
+
+void FASTAReader::SetToUpper() {
+    doToUpper = true;
+    convMat   = AllToUpper;
+}
+
+//
+// Synonym for Init() for consistency.
+//
+int FASTAReader::Initialize(string &seqInName) {
+    return Init(seqInName);
+}
+
+int FASTAReader::Init(string &seqInName, int passive) {
+    fileDes = open(seqInName.c_str(), O_RDONLY);
+    padding = 0;
+    if (fileDes == -1) {
+        if (passive) {
+            return 0;
+        }
+        else {
+            cout << "Could not open FASTA file " << seqInName << endl;
+            exit(1);
+        }
+    }
+    SetFileSize();
+    filePtr = (char*) mmap(0, fileSize, PROT_READ, MAP_PRIVATE, fileDes, 0);
+    if (filePtr == NULL) {
+        cout << "ERROR, Fail to load FASTA file " << seqInName 
+             << " to virtual memory." << endl;
+        exit(1);
+    }
+    curPos = 0;
+    return 1;
+}
+
+void FASTAReader::AdvanceToTitleStart(long &p, char delim) {
+    while (p < fileSize and 
+            filePtr[p] != delim) { 
+        p++;
+    }
+}
+
+
+void FASTAReader::CheckValidTitleStart(long &p, char delim) {
+    if (p >= fileSize or filePtr[p] != delim) {
+        cout << "ERROR, FASTA entry must begin with \"" << delim << "\"" << endl;
+        exit(1);
+    }
+}
+
+long FASTAReader::ReadAllSequencesIntoOne(FASTASequence &seq, SequenceIndexDatabase<FASTASequence> *seqDBPtr) {
+    seq.Free();
+    long p = curPos;
+    AdvanceToTitleStart(p);
+    CheckValidTitleStart(p);
+    ReadTitle(p, seq); 
+     
+    if (seq.title == NULL) {
+        cout << "ERROR, sequence must have a nonempty title." << endl;
+        exit(1);
+    }
+    if (seqDBPtr != NULL) {
+        seqDBPtr->growableName.push_back(seq.title);
+    }
+    long seqLength;
+    seqLength = fileSize - p;
+    long memorySize = seqLength+padding+1;
+
+    long a = memorySize;
+    if (memorySize > UINT_MAX) {
+        cout << "ERROR! Reading fasta files greater than 4Gbytes is not supported." << endl;
+        exit(1);
+    }
+    seq.Resize(memorySize);
+    long i;
+    i = 0L;
+    for (; p < fileSize; p++, i++ ) {
+        seq.seq[i] = filePtr[p];
+    }
+    i = p = 0;
+    while (p < seqLength) {
+        //
+        // If this is the beginning of another read, add an 'N' 
+        // to delineate spaces between reads.
+        //
+
+        while (p < seqLength and
+                (seq.seq[p] == ' ' or
+                 seq.seq[p] == '\n' or 
+                 seq.seq[p] == '\t' or
+                 seq.seq[p] == '\r')) {
+            p++;
+        }
+        if (p < seqLength and seq.seq[p] == '>') {
+            seq.seq[i] = 'N';
+
+            long titleStartPos = p+1;
+            i++;
+            while (p < seqLength and seq.seq[p] != '\n') p++;
+            if (seqDBPtr != NULL and p < seqLength) {
+                string title;
+                long tp;
+                for (tp = titleStartPos; tp < p; tp++) {
+                    title.push_back(seq.seq[tp]);
+                }
+
+                seqDBPtr->growableName.push_back(title);
+                seqDBPtr->growableSeqStartPos.push_back(i);
+                int nSeq = seqDBPtr->growableSeqStartPos.size();
+                if (nSeq > 1 and computeMD5) {
+                    string md5Str;
+                    MakeMD5((const char*) &seq.seq[seqDBPtr->growableSeqStartPos[nSeq-2]],
+                            seqDBPtr->growableSeqStartPos[nSeq-1] - seqDBPtr->growableSeqStartPos[nSeq-2] - 1,
+                            md5Str);
+                    seqDBPtr->md5.push_back(md5Str);
+                }
+            }
+        }
+        else if (p < seqLength)  {
+            // Otherwise, p may be at whitespace
+            // advance past that as well.
+            seq.seq[i] = convMat[seq.seq[p]];
+            i++;
+            p++;
+        }
+    }
+    if (i > UINT_MAX) {
+        cout << "ERROR! Sequences greater than 4Gbase are not supported." << endl;
+        exit(1);
+    }
+    //
+    // Append an 'N' at the end of the last sequence for consistency
+    // between different orderings of reference input. 
+    //
+    seq.seq[i] = 'N';
+    i++;
+    seq.length = i;
+    // fill padding.
+    for (; i < memorySize; i++ ){
+        seq.seq[i] = 0;
+    }
+    seq.deleteOnExit = true;
+    if (seqDBPtr != NULL) {
+        seqDBPtr->growableSeqStartPos.push_back(seq.length);
+        int nSeq = seqDBPtr->growableSeqStartPos.size();
+        if (nSeq > 1 and computeMD5) {
+            string md5Str;
+            MakeMD5((const char*) &seq.seq[seqDBPtr->growableSeqStartPos[nSeq-2]],
+                    seqDBPtr->growableSeqStartPos[nSeq-1] - seqDBPtr->growableSeqStartPos[nSeq-2] - 1,
+                    md5Str);
+            seqDBPtr->md5.push_back(md5Str);
+        }
+        seqDBPtr->Finalize();
+    }
+    return seq.length;
+}
+
+void FASTAReader::ReadTitle(long &p, FASTASequence & seq) {
+    char * seqTitle = NULL;
+    int seqTitleLen; 
+    ReadTitle(p, seqTitle, seqTitleLen);
+    seq.CopyTitle(seqTitle, seqTitleLen);
+    if (seqTitle) {delete seqTitle;}
+}
+
+void FASTAReader::ReadTitle(long &p, char *&title, int &titleLength) {
+    // 
+    // Extract the title.  The length of the title does not include the newline.
+    //
+    p++; // Move past '>'
+    curPos = p;
+    while (p < fileSize and
+            filePtr[p] != '\n') { 
+        p++;
+    }
+    titleLength = p - curPos;
+    if (titleLength > 0) {
+        if (title) {delete [] title; title = NULL;}
+        title = new char[titleLength+1];
+        int t = 0;
+        for (p = curPos; p < curPos + titleLength; p++, t++) {
+            title[t] = filePtr[p];
+        }
+        title[titleLength] = '\0';
+    }
+    else {
+        title = NULL;
+        titleLength = 0;
+    }
+}
+
+int FASTAReader::GetNext(FASTASequence &seq) {
+    if (curPos == fileSize) {
+        return 0;
+    }
+
+    seq.Free(); //Free seq before read
+
+    // 
+    // Extract the title of the current record.
+    //
+    long p = curPos;
+
+    AdvanceToTitleStart(p);
+
+    // 
+    // Make sure there is a '>'
+    //
+    CheckValidTitleStart(p);
+
+    ReadTitle(p, seq); 
+
+    //
+    // Read in the next sequence.
+    //
+
+    // Count the length of the sequence.
+
+    long seqLength = 0;
+    curPos = p;
+    char c;
+    while (p < fileSize and
+            (c = filePtr[p]) != endOfReadDelim) {
+        if (c != ' ' and
+                c != '\t' and
+                c != '\n' and
+                c != '\r') {
+            seqLength++;
+        }
+        p++;
+    }
+    if (seqLength > UINT_MAX) {
+        cout << "ERROR! Reading sequences stored in more than 4Gbytes of space is not supported." << endl;
+        exit(1);
+    }
+
+    seq.length = 0;
+    if (seqLength > 0) {
+        seq.length = seqLength;
+        seq.seq = new Nucleotide[seqLength+padding+1];
+        p = curPos;
+        seq.deleteOnExit = true;
+        long s = 0;
+        while (p < fileSize and
+                (c = filePtr[p]) != endOfReadDelim) {
+            if (c != ' ' and
+                    c != '\t' and
+                    c != '\n' and
+                    c != '\r') {
+                seq.seq[s] = convMat[filePtr[p]];
+                s++;
+            }
+            p++;
+        }
+        seq.seq[seqLength] = 0;
+    }
+    curPos = p;
+
+    if (computeMD5) {
+        MakeMD5((const char*) &seq.seq, seq.length, curReadMD5);
+    }
+    return 1;
+}
+/*
+   Advance to the read nSeq forward.
+
+input: nSeq, the number of sequences to skip.
+output: 
+returns 1 if after advancing nSeq sequences, the file pointer is pointing to 
+a new sequence.
+0 otherwise. 
+A return value of 0 will signal that the file is done being processed if it is 
+iterting over reads.
+*/
+int FASTAReader::Advance(int nSeq) {
+
+    int nAdvanced = 0;
+    long p = curPos;
+    // base case -- it's always ok to advance 0
+    if (nSeq == 0) { return 1; }
+
+    // Make sure the advance starts at 
+    // the beginning of a sequence.
+    while(p < fileSize and filePtr[p] != endOfReadDelim) p++;
+    // No sequence was found, coudln't advance.
+    if (p >= fileSize) { return 0; }
+
+    p++;
+    nAdvanced = 1;
+    while (nAdvanced <= nSeq and p < fileSize) {
+        if (filePtr[p] == endOfReadDelim) {
+            if (nAdvanced == nSeq) {
+                //
+                // Want to end with the reader on a '>', so return before
+                // hitting the rest of the loop.
+                //
+                curPos = p;
+                return 1;
+            }
+            else {
+                nAdvanced++; 
+            }
+        }
+        p++;
+    }
+    curPos = p;
+    return 0;
+}
+
+int FASTAReader::CriticalGetNext(FASTASequence &seq) {
+    if (!GetNext(seq)) {
+        cout << "Could not read a sequence." << endl;
+        exit(1);
+    }
+    return 1;
+}
+
+int FASTAReader::ConcatenateNext(FASTASequence &cur) {
+    FASTASequence next;
+    int retVal;	
+    if ((retVal = GetNext(next))) {
+        next.CleanupASCII();
+        cur.Concatenate((Nucleotide*) "N");
+        cur.Concatenate(next);	
+    }
+    next.Free();
+    return retVal;
+}
+
+void FASTAReader::Close() {
+    if (fileDes == -1) {
+        cout << "ERROR, calling close on an uninitialized fasta reader" << endl;
+        exit(1);
+    }
+    else {
+        munmap(filePtr, fileSize);
+        close(fileDes);
+        fileDes = -1;
+    }
+}
+
+void FASTAReader::ReadAllSequences(vector<FASTASequence> &sequences) {
+    //
+    // Step 1, compute the number of reads in the file.
+    // 
+
+    long p;
+    p = 0;
+    int nSeq = 0;
+    while (p < fileSize) { 
+        if (filePtr[p] == '>') {
+            ++nSeq;
+        }
+        p++;
+    }
+
+    p = 0;
+    sequences.resize(nSeq);
+    int curSeq = 0;
+    while(GetNext(sequences[curSeq])) {
+        ++curSeq;
+    }
+}
diff --git a/libcpp/pbdata/FASTAReader.hpp b/libcpp/pbdata/FASTAReader.hpp
new file mode 100644
index 0000000..6cc5ca9
--- /dev/null
+++ b/libcpp/pbdata/FASTAReader.hpp
@@ -0,0 +1,80 @@
+#ifndef _BLASR_FASTA_READER_HPP_
+#define _BLASR_FASTA_READER_HPP_
+#include <stdint.h>
+#include <string>
+#include "FASTASequence.hpp"
+#include "metagenome/SequenceIndexDatabase.hpp"
+
+class FASTAReader {
+protected:
+    long fileSize;
+    int fileDes;
+    char* filePtr;
+    long curPos;
+    int padding;
+    char endOfReadDelim;
+    char readStartDelim;
+    bool doToUpper;
+    unsigned char *convMat;
+    //
+    // Quick check to see how much to read.
+    //
+    void SetFileSize(); 
+
+    void ReadTitle(long &p, char *&title, int &titleLength); 
+
+public:
+    bool computeMD5;
+    std::string curReadMD5;
+
+    void Init(); 
+
+    FASTAReader(); 
+
+    FASTAReader(std::string &fileName); 
+
+    void SetSpacePadding(int _padding); 
+
+    void SetToUpper(); 
+    
+    //
+    // Synonym for Init() for consistency.
+    //
+    int Initialize(std::string &seqInName); 
+
+    int Init(std::string &seqInName, int passive=0); 
+
+    void AdvanceToTitleStart(long &p, char delim='>'); 
+
+    void CheckValidTitleStart(long &p, char delim='>'); 
+
+    long ReadAllSequencesIntoOne(FASTASequence &seq, SequenceIndexDatabase<FASTASequence> *seqDBPtr=NULL); 
+
+    void ReadTitle(long &p, FASTASequence & seq);
+
+    int GetNext(FASTASequence &seq); 
+    /*
+       Advance to the read nSeq forward.
+
+input: nSeq, the number of sequences to skip.
+output: 
+returns 1 if after advancing nSeq sequences, the file pointer is pointing to 
+a new sequence.
+0 otherwise. 
+A return value of 0 will signal that the file is done being processed if it is 
+iterting over reads.
+*/
+    int Advance(int nSeq); 
+
+    int CriticalGetNext(FASTASequence &seq); 
+    
+    int ConcatenateNext(FASTASequence &cur); 
+
+    void Close(); 
+
+    void ReadAllSequences(vector<FASTASequence> &sequences); 
+
+}; 
+
+
+#endif // _BLASR_FASTA_READER_HPP_
diff --git a/libcpp/pbdata/FASTASequence.cpp b/libcpp/pbdata/FASTASequence.cpp
new file mode 100644
index 0000000..4b579cc
--- /dev/null
+++ b/libcpp/pbdata/FASTASequence.cpp
@@ -0,0 +1,246 @@
+#include <stdlib.h>
+#include "FASTASequence.hpp"
+
+using namespace std;
+
+FASTASequence::FASTASequence() : DNASequence() {
+    title = NULL;
+    titleLength = 0;
+    deleteTitleOnExit = false; 
+    // If deleteTitleOnExist is false, whether to delete title
+    // or not should depend on deleteOnExit; otherwise, delete title
+    // regardless of deleteOnExit.
+}
+
+void FASTASequence::PrintSeq(ostream &out, int lineLength, char delim) {
+    out << delim;
+    if (title) out << title;
+    out << endl;
+    static_cast<DNASequence*>(this)->PrintSeq(out, lineLength); 
+}
+
+int FASTASequence::GetStorageSize() {
+    if (!title) 
+        return DNASequence::GetStorageSize();
+    return strlen(title) + DNASequence::GetStorageSize();
+}
+
+string FASTASequence::GetName() const {
+    string name;
+    int i;
+    for (i = 0; i < titleLength; i++) {
+        if (title[i] != ' ' and
+                title[i] != '\t' and
+                title[i] != '\n' and
+                title[i] != '\r') {
+            name.push_back(title[i]);
+        }
+        else {
+            break;
+        }
+    }
+    return name;
+}
+
+//
+// Define  some no-ops to satisfy instantiating templates that
+// expect these to exist.
+//
+bool FASTASequence::StoreHoleNumber(int holeNumber) {return false;}
+bool FASTASequence::StoreHoleStatus(unsigned char holeStatus) {return false;}
+bool FASTASequence::StorePlatformId(PlatformId platformId) { return false;}
+bool FASTASequence::StoreZMWData(ZMWGroupEntry &data) { return false;}
+bool GetHoleNumber (int &holeNumberP) {
+    //
+    // There is no notion of a hole number for a fasta sequence.
+    //
+    return false;
+}
+
+bool FASTASequence::StoreXY(int16_t xy[]) {return false;}
+
+bool FASTASequence::GetXY(int xyP[]) {
+    //
+    // Although the xyP is stored in the fasta title for astro reads
+    // this class is more general than an astro read, so do not assume 
+    // that it may be found in the title.
+    //
+    // So, this function is effectively a noop.
+    //
+    xyP[0] = xyP[1] = 0;
+    return false;
+}
+
+
+void FASTASequence::ShallowCopy(const FASTASequence &rhs) {
+    CheckBeforeCopyOrReference(rhs, "FASTASequence");
+    FASTASequence::Free();
+
+    static_cast<DNASequence*>(this)->ShallowCopy(rhs);
+
+    title = rhs.title;
+    titleLength = rhs.titleLength;
+    deleteTitleOnExit = false;
+}
+
+string FASTASequence::GetTitle() const {
+    return string(title);
+}
+
+// Delete title if this FASTASequence is under control or 
+// only title is under control.
+void FASTASequence::DeleteTitle() {
+    if (deleteOnExit or deleteTitleOnExit) {
+        if (title != NULL) {
+            delete[] title;
+        }
+    } // otherwise, title is controlled by another obj
+    title = NULL;
+    titleLength = 0;
+    deleteTitleOnExit = false;
+}
+
+void FASTASequence::CopyTitle(const char* str, int strlen) {
+    FASTASequence::DeleteTitle();
+
+    // No segfault when str is NULL;
+    if (str == NULL) {
+        title = NULL;
+        titleLength = 0;
+    } else {
+        title = new char[strlen+1];
+        memcpy(title, str, strlen);
+        titleLength = strlen;
+        title[titleLength] = '\0';
+    }
+
+    // In some cases, (e.g., when ReferenceSubstring and CopyTitle
+    // are called together), this Sequence may only have control over
+    // title but not seq.
+    deleteTitleOnExit = true;
+}
+
+void FASTASequence::CopyTitle(string str) {
+    FASTASequence::CopyTitle(str.c_str(), str.size());
+}
+
+void FASTASequence::GetFASTATitle(string& fastaTitle) {
+    // look for the first space, and return the string until there.
+    int i;
+    for (i = 0; i < titleLength; i++ ){
+        if (title[i] == ' ' or
+                title[i] == '\t') {
+            break;
+        }
+    }
+    fastaTitle.assign(title, i);
+}
+
+// Copy rhs.seq[readStart:readEnd] to this Sequence.
+void FASTASequence::CopySubsequence(FASTASequence &rhs, int readStart, int readEnd) {
+    CheckBeforeCopyOrReference(rhs, "FASTASequence");
+    
+    // Free before copying anything 
+    FASTASequence::Free();
+
+    if (readEnd == -1) {
+        readEnd = rhs.length;
+    }
+
+    if (readEnd > readStart) {
+        length = readEnd - readStart;
+        DNASequence::Copy(rhs, readStart, length);
+    }
+    else {
+        seq = NULL;
+        length = 0;
+        deleteOnExit = true;
+    }
+    FASTASequence::CopyTitle(rhs.title);
+}
+
+void FASTASequence::AppendToTitle(string str) {
+    int newLength = titleLength + str.size() + 1;
+    if (newLength == 0) {
+        DeleteTitle();
+        return;
+    }
+
+    char *tmpTitle = new char[newLength];
+    memcpy(tmpTitle, title, titleLength);
+    memcpy(&tmpTitle[titleLength], str.c_str(), str.size());
+    tmpTitle[newLength-1] = '\0';
+    delete[] title;
+    title = tmpTitle;
+    titleLength = newLength;
+    deleteTitleOnExit = true;
+}
+
+void FASTASequence::Assign(FASTASequence &rhs) {
+    *this = (FASTASequence&)rhs;
+}
+
+// Create a reverse complement FASTASequence of *this and assign to rhs.
+void FASTASequence::MakeRC(FASTASequence &rhs, DNALength rhsPos, DNALength rhsLength) {
+    rhs.Free();
+    DNASequence::MakeRC((DNASequence&) rhs, rhsPos, rhsLength);
+    if (title != NULL) {
+        (static_cast<FASTASequence*>(&rhs))->CopyTitle(title);
+    }
+}
+
+void FASTASequence::ReverseComplementSelf() {
+    DNALength i;
+    for (i = 0; i < length/2 + length % 2; i++) {
+        char c = seq[i];
+        seq[i] = ReverseComplementNuc[seq[length - i - 1]];
+        seq[length - i - 1] = ReverseComplementNuc[static_cast<int>(c)];
+    }
+}
+
+void FASTASequence::operator=(const FASTASequence &rhs) {
+    CheckBeforeCopyOrReference(rhs, "FASTASequence");
+
+    // Free before copying anything 
+    FASTASequence::Free();
+
+    // Copy seq from rhs
+    ((DNASequence*)this)->Copy((DNASequence&)rhs);
+
+    assert(deleteOnExit);
+
+    // Copy title from rhs
+    FASTASequence::CopyTitle(rhs.title, rhs.titleLength);
+
+    assert(deleteOnExit);
+}
+
+void FASTASequence::Copy(const std::string & rhsTitle, const std::string & rhsSeq) {
+    this->Copy(rhsSeq);
+    this->CopyTitle(rhsTitle);
+}
+
+void FASTASequence::Copy(const std::string & rhsSeq) {
+    (static_cast<DNASequence*>(this))->Copy(rhsSeq);
+}
+
+void FASTASequence::Copy(const FASTASequence &rhs) {
+    *this = (FASTASequence&)rhs;
+}
+
+#ifdef USE_PBBAM
+void FASTASequence::Copy(const PacBio::BAM::BamRecord & record) {
+    FASTASequence::Copy(record.Impl().Name(), record.Sequence());
+}
+#endif
+
+void FASTASequence::Free() {
+    // Delete title if title is under control, reset deleteTitleOnExit.
+    FASTASequence::DeleteTitle();
+
+    // Delete seq if under control, reset deleteOnExit.
+    // Don't call Free() before calling DeleteTitle().
+    DNASequence::Free();
+}
+
+template DNALength ResizeSequence<FASTASequence>(FASTASequence &, DNALength);
diff --git a/libcpp/pbdata/FASTASequence.hpp b/libcpp/pbdata/FASTASequence.hpp
new file mode 100644
index 0000000..bfadb58
--- /dev/null
+++ b/libcpp/pbdata/FASTASequence.hpp
@@ -0,0 +1,91 @@
+#ifndef _BLASR_FASTA_SEQUENCE_HPP_
+#define _BLASR_FASTA_SEQUENCE_HPP_
+
+#include <string>
+#include <iostream>
+#include <stdint.h>
+#include <string>
+#include <cstring>
+#include <ostream>
+#include "Types.h"
+#include "NucConversion.hpp"
+#include "Enumerations.h"
+#include "DNASequence.hpp"
+#include "reads/ZMWGroupEntry.hpp"
+
+//
+// NO proteins for now.
+class FASTASequence : public DNASequence {
+private:
+    // Whether or not to delete title in Free() 
+    // regardless of deleteOnExit (to prevent memory leak
+    // when ReferenceSubstring and CopyTitle are called together).
+    bool deleteTitleOnExit; 
+
+public:
+    char *title;
+    int titleLength;
+
+    FASTASequence();
+    inline ~FASTASequence();
+
+    void PrintSeq(std::ostream &out, int lineLength = 50, char delim='>');
+
+    int GetStorageSize();
+
+    std::string GetName() const;
+
+    virtual bool StoreHoleNumber(int holeNumber);
+    virtual bool StoreHoleStatus(unsigned char holeStatus);
+    virtual bool StorePlatformId(PlatformId platformId);
+    virtual bool StoreZMWData(ZMWGroupEntry &data);
+    virtual bool StoreXY(int16_t xy[]);
+
+    bool GetHoleNumber (int &holeNumberP); 
+
+    bool GetXY(int xyP[]); 
+
+    void ShallowCopy(const FASTASequence &rhs); 
+
+    std::string GetTitle() const; 
+
+    void DeleteTitle();
+
+    void CopyTitle(const char* str, int strlen); 
+
+    void CopyTitle(std::string str);
+
+    void GetFASTATitle(std::string& fastaTitle); 
+
+    void CopySubsequence(FASTASequence &rhs, int readStart, int readEnd=-1); 
+
+    void AppendToTitle(std::string str); 
+
+    void Assign(FASTASequence &rhs); 
+
+    void MakeRC(FASTASequence &rhs, DNALength rhsPos=0, DNALength rhsLength=0); 
+
+    void ReverseComplementSelf(); 
+
+    void operator=(const FASTASequence &rhs); 
+
+    void Copy(const FASTASequence &rhs); 
+
+    void Copy(const std::string & rhsTitle, const std::string & rhsSeq);
+
+    void Copy(const std::string & rhsSeq);
+
+#ifdef USE_PBBAM
+    /// Copies a BamRecord as a FASTASequence.
+    void Copy(const PacBio::BAM::BamRecord & record);
+#endif
+
+    void Free(); 
+};
+
+
+inline FASTASequence::~FASTASequence(){
+    FASTASequence::Free();
+}
+
+#endif
diff --git a/libcpp/pbdata/FASTQReader.cpp b/libcpp/pbdata/FASTQReader.cpp
new file mode 100644
index 0000000..324d57a
--- /dev/null
+++ b/libcpp/pbdata/FASTQReader.cpp
@@ -0,0 +1,89 @@
+#include <cstdio>
+#include <climits>
+#include <cmath>
+#include "FASTQReader.hpp"
+
+FASTQReader::FASTQReader() : FASTAReader() {
+    endOfReadDelim = '\n';
+}
+
+long FASTQReader::GetNext(FASTASequence &seq) {
+    return ((FASTAReader*)this)->GetNext(seq);
+}
+
+unsigned char FASTQReader::phredQVtoPacbioQV(unsigned char phredQV){
+    int qual = floor(100.0 * log10(pow(10.0, phredQV/10.0) - 1.0) + 0.5); 
+    qual = qual > 250 ? 250 : qual;
+    qual = qual < 1   ? 1   : qual;
+    return (unsigned char) qual;
+}
+
+int FASTQReader::GetNext(FASTQSequence &seq) {
+    seq.Free(); // Free seq before being reused. 
+    char c;
+    while( curPos < fileSize and ( (c = filePtr[curPos]) == ' ' or c == '\t' or c == '\n' or c == '\r') ) {
+        curPos++;
+    }
+
+    if (curPos >= fileSize) {
+        return false;
+    }
+    long p = curPos;
+    AdvanceToTitleStart(p, '@');
+    CheckValidTitleStart(p,'@');
+    ReadTitle(p, seq);
+    // Title ends on '\n', consume that;
+    p++;
+    long p2;
+    p2 = p;
+    while(p2 < fileSize and filePtr[p2] != '\n') { p2++;}
+    if (p2 - p > UINT_MAX) {
+        cout << "ERROR! Reading sequences stored in more than 4Gbytes of space is not supported." << endl;
+        exit(1);
+    }
+
+    seq.length = p2 - p;
+    long seqPos;
+    if (seq.length > 0) {
+        seq.seq = new Nucleotide[seq.length];
+        p2 = p;
+        seqPos = 0;
+        while(p2 < fileSize and filePtr[p2] != '\n') { seq.seq[seqPos] = filePtr[p2]; p2++; seqPos++;}
+    }
+    else {
+        seq.seq = 0;
+    }
+    p = p2;
+
+    AdvanceToTitleStart(p,'+');
+    CheckValidTitleStart(p,'+');
+    while(p < fileSize and filePtr[p] != '\n') { p++;}
+    p++; // skip '\n'
+    p2 = p;
+    while(p2 < fileSize and filePtr[p2] != '\n') { p2++;}
+    seq.length = p2 - p;
+    if (seq.length > 0) {
+        seq.qual.Allocate(seq.length);
+        p2 = p;
+        long seqPos = 0;
+        while(p2 < fileSize and filePtr[p2] != '\n') { 
+            seq.qual[seqPos] = filePtr[p2] - FASTQSequence::charToQuality;
+            p2++; seqPos++;
+        }
+    }
+    else {
+        seq.qual.data = NULL;
+    }
+    curPos = p2;
+    seq.deleteOnExit = true;
+    return true;
+}
+
+
+
+int FASTQReader::Advance(int nSteps) {
+    // An advance of a FASTQ file is simply twice the number of
+    // advances of FASTA, since each nucleotide sequence has a quality
+    // sequence. 
+    return ((FASTAReader*)this)->Advance(nSteps*2);
+}
diff --git a/libcpp/pbdata/FASTQReader.hpp b/libcpp/pbdata/FASTQReader.hpp
new file mode 100644
index 0000000..4caeab3
--- /dev/null
+++ b/libcpp/pbdata/FASTQReader.hpp
@@ -0,0 +1,24 @@
+#ifndef _BLASR_FASTQ_READER_HPP_
+#define _BLASR_FASTQ_READER_HPP_
+
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+#include "FASTQSequence.hpp"
+#include "qvs/QualityValue.hpp"
+
+class FASTQReader : public FASTAReader {
+public:
+
+    FASTQReader();
+
+    long GetNext(FASTASequence &seq); 
+
+    unsigned char phredQVtoPacbioQV(unsigned char phredQV);
+
+    int GetNext(FASTQSequence &seq); 
+
+    int Advance(int nSteps); 
+};
+
+
+#endif // _BLASR_FASTQ_READER_HPP_
diff --git a/libcpp/pbdata/FASTQSequence.cpp b/libcpp/pbdata/FASTQSequence.cpp
new file mode 100644
index 0000000..26789ac
--- /dev/null
+++ b/libcpp/pbdata/FASTQSequence.cpp
@@ -0,0 +1,651 @@
+#include <cassert>
+#include <vector>
+#include <cstring>
+#include <iostream>
+#include <iomanip>
+#include <algorithm>
+#include <stdint.h>
+#include "Types.h"
+#include "NucConversion.hpp"
+#include "DNASequence.hpp"
+#include "Enumerations.h"
+#include "FASTQSequence.hpp"
+
+using namespace std;
+
+//
+// Initialize a read with quality probabilities from one with quality values.
+//
+int FASTQSequence::charToQuality = FASTQ_CHAR_TO_QUALITY;
+
+QVScale FASTQSequence::GetQVScale() {
+    return qvScale;
+}
+
+void FASTQSequence::SetQVScale(QVScale qvScaleP) {
+    qvScale                   = qvScaleP;
+    qual.qvScale              = qvScale;
+    deletionQV.qvScale        = qvScale;
+    preBaseDeletionQV.qvScale = qvScale;
+    insertionQV.qvScale       = qvScale;
+    substitutionQV.qvScale    = qvScale;
+    mergeQV.qvScale           = qvScale;
+}
+
+QualityValueVector<QualityValue>* 
+FASTQSequence::GetQVPointerByIndex(int index) {
+    if (index == 0) { return &qual; }
+    if (index == 1) { return &insertionQV; }
+    if (index == 2) { return &deletionQV; }
+    if (index == 3) { return &substitutionQV; }
+    if (index == 4) { return &mergeQV; }
+    return NULL;
+}
+
+int FASTQSequence::GetStorageSize() {
+    int total = 0;
+    int nQV = 0;
+    int nTag =0;
+    if (!qual.Empty()) {
+        nQV++;
+    }
+    if (!deletionQV.Empty()) { 
+        nQV++;
+    }
+    if (!preBaseDeletionQV.Empty()) {
+        nQV+=4;
+    }
+    if (!insertionQV.Empty()) {
+        nQV++;
+    }
+    if (!substitutionQV.Empty()) {
+        nQV++;
+    }
+    if (!mergeQV.Empty()) {
+        nQV++;
+    }
+    if (deletionTag != NULL) {
+        nTag++;
+    }
+    if (substitutionTag !=NULL) {
+        nTag++;
+    }
+    total = nQV*sizeof(QualityValue)*length + nTag*sizeof(Nucleotide)*length;
+    return total + FASTASequence::GetStorageSize();
+}
+
+FASTQSequence::FASTQSequence() : FASTASequence() {
+    deletionTag       = NULL;
+    substitutionTag   = NULL;
+
+    //
+    // For now assume a prior distribution to be the variation of the human genome.
+    // FIXME: these were set to 0.001, which ends up being 0 because these priors are integer types
+    //        I'm setting these explicitly to 0 to silence the warning and maintain behavior,
+    //        but mkinsella recommends revisiting these for potential removal
+    //
+    deletionQVPrior = 0;
+    insertionQVPrior = 0;
+    substitutionQVPrior = 0;
+    preBaseDeletionQVPrior = 0;
+
+    subreadStart = subreadEnd = 0;
+    qvScale = PHRED;
+}
+
+QualityValue FASTQSequence::GetDeletionQV(DNALength pos) {
+    assert(pos < ((unsigned int)-1));
+    assert(pos < length);
+    if (deletionQV.Empty()) {
+        return deletionQVPrior;
+    }
+    else {
+        return deletionQV[pos];
+    }
+}
+
+QualityValue FASTQSequence::GetMergeQV(DNALength pos) {
+    assert(pos < ((unsigned int)-1));
+    assert(pos < length);
+    if (mergeQV.Empty()) {
+        return 0;
+    }
+    else {
+        return mergeQV[pos];
+    }
+}
+
+Nucleotide FASTQSequence::GetSubstitutionTag(DNALength pos) {
+    if (substitutionTag == NULL) {
+        return 'N';
+    }
+    assert(pos < ((unsigned int)-1));
+    assert(pos < length);
+    return substitutionTag[pos];
+}
+
+Nucleotide FASTQSequence::GetDeletionTag(DNALength pos) {
+    if (deletionTag == NULL) {
+        return 'N';
+    }
+    assert(pos < ((unsigned int)-1));
+    assert(pos < length);
+    return deletionTag[pos];
+}
+
+QualityValue FASTQSequence::GetInsertionQV(DNALength pos) {
+    if (insertionQV.Empty()) {
+        return insertionQVPrior;
+    }
+    assert(pos < ((unsigned int)-1));
+    assert(pos < length);
+    return insertionQV[pos];
+}
+
+QualityValue FASTQSequence::GetSubstitutionQV(DNALength pos) {
+    if (substitutionQV.Empty()) {
+        return substitutionQVPrior;
+    }
+    assert(pos < ((unsigned int)-1));
+    assert(pos < length);
+    return substitutionQV[pos];
+}
+
+QualityValue FASTQSequence::GetPreBaseDeletionQV(DNALength pos, Nucleotide nuc) {
+    if (preBaseDeletionQV.Empty()) {
+        return preBaseDeletionQVPrior;
+    }
+    assert(pos < ((unsigned int)-1));
+    assert(pos < length);
+    return preBaseDeletionQV[pos*4 + TwoBit[nuc]];
+}
+
+void FASTQSequence::ShallowCopy(const FASTQSequence &rhs) {
+    CheckBeforeCopyOrReference(rhs, "FASTQSequence");
+    FASTQSequence::Free();
+
+    qual.ShallowCopy(rhs.qual, 0, length);
+    FASTASequence::ShallowCopy(rhs);
+}
+
+void FASTQSequence::ReferenceSubstring(const FASTQSequence &rhs) {
+    FASTQSequence::ReferenceSubstring(rhs, 0, rhs.length);
+}
+
+void FASTQSequence::ReferenceSubstring(const FASTQSequence &rhs, DNALength pos) {
+    FASTQSequence::ReferenceSubstring(rhs, pos, rhs.length - pos);
+}
+
+void FASTQSequence::ReferenceSubstring(const FASTQSequence &rhs, DNALength pos, DNALength substrLength) {
+    // Sanity check.
+    CheckBeforeCopyOrReference(rhs, "FASTQSequence");
+
+    // Free this FASTQSequence before referencing rhs.
+    FASTQSequence::Free();
+
+    SetQVScale(rhs.qvScale);
+    if (substrLength == 0) {
+        substrLength = rhs.length - pos;
+    }
+    FASTASequence::ReferenceSubstring(rhs,pos,substrLength);
+    if (rhs.qual.Empty() == false) {
+        qual.ShallowCopy(rhs.qual, pos, substrLength);
+    }
+    if (rhs.deletionQV.Empty() == false) {
+        deletionQV.ShallowCopy(rhs.deletionQV, pos, substrLength);
+    }
+    if (rhs.mergeQV.Empty() == false) {
+        mergeQV.ShallowCopy(rhs.mergeQV, pos, substrLength);
+    }
+    if (rhs.insertionQV.Empty() == false) {
+        insertionQV.ShallowCopy(rhs.insertionQV, pos, substrLength);
+    }
+    if (rhs.preBaseDeletionQV.Empty() == false ){
+        preBaseDeletionQV.ShallowCopy(rhs.preBaseDeletionQV, pos, substrLength);
+    }
+    if (rhs.deletionTag != NULL) {
+        deletionTag = &rhs.deletionTag[pos];
+    }
+    if (rhs.substitutionTag != NULL) {
+        substitutionTag = &rhs.substitutionTag[pos];
+    }
+    if (rhs.substitutionQV.Empty() == false) {
+        substitutionQV.ShallowCopy(rhs.substitutionQV, pos, substrLength);
+    }
+    deletionQVPrior = rhs.deletionQVPrior;
+    insertionQVPrior = rhs.insertionQVPrior;
+    substitutionQVPrior = rhs.substitutionQVPrior;
+    preBaseDeletionQVPrior = rhs.preBaseDeletionQVPrior;
+}
+
+void FASTQSequence::ClearAndNull(QualityValue *value) {
+    if (value != NULL) {
+        delete[] value;
+    }
+    value = NULL;
+}
+
+void FASTQSequence::CopyQualityValues(const FASTQSequence &rhs) {
+    // Make sure QVs and seq are all under control, if seq is referenced
+    // while QVs are copied, memory leak can happen. 
+    assert(deleteOnExit);
+
+    SetQVScale(rhs.qvScale);
+    qual.Copy(rhs.qual, rhs.length);
+    deletionQV.Copy(rhs.deletionQV, rhs.length);
+    insertionQV.Copy(rhs.insertionQV, rhs.length);
+    substitutionQV.Copy(rhs.substitutionQV, rhs.length);
+    mergeQV.Copy(rhs.mergeQV, rhs.length);
+    //
+    // Handle the tags separtely (and verbosely)
+    //
+    if (rhs.deletionTag) {
+        AllocateDeletionTagSpace(rhs.length);
+        memcpy(deletionTag, rhs.deletionTag, sizeof(Nucleotide)*rhs.length);
+    }
+    else { 
+        ClearAndNull(deletionTag);
+    }
+
+    if (rhs.substitutionTag) {
+        AllocateSubstitutionTagSpace(rhs.length);
+        memcpy(substitutionTag, rhs.substitutionTag, sizeof(Nucleotide)*rhs.length);
+    }
+    else {
+        ClearAndNull(substitutionTag);
+    }
+}
+
+void FASTQSequence::AllocateQualitySpace(DNALength qualLength) {
+    qual.Allocate(qualLength);
+}
+
+void FASTQSequence::AllocateDeletionQVSpace(DNALength qualLength) {
+    deletionQV.Allocate(qualLength);
+}
+
+void FASTQSequence::AllocateMergeQVSpace(DNALength len) {
+    mergeQV.Allocate(len);
+}
+
+void FASTQSequence::AllocateDeletionTagSpace(DNALength qualLength) {
+    if (deletionTag != NULL) delete[] deletionTag;
+    deletionTag = new Nucleotide[qualLength];
+}
+
+void FASTQSequence::AllocatePreBaseDeletionQVSpace(DNALength qualLength) {
+    preBaseDeletionQV.Allocate(qualLength);
+}
+
+void FASTQSequence::AllocateInsertionQVSpace(DNALength qualLength) {
+    insertionQV.Allocate(qualLength);
+}
+
+void FASTQSequence::AllocateSubstitutionQVSpace(DNALength qualLength ){ 
+    substitutionQV.Allocate(qualLength);
+}
+
+void FASTQSequence::AllocateSubstitutionTagSpace(DNALength qualLength ){ 
+    if (substitutionTag != NULL) delete[] substitutionTag;
+    substitutionTag = new Nucleotide[qualLength];
+}
+
+void FASTQSequence::AllocateRichQualityValues(DNALength qualLength) {
+    AllocateDeletionQVSpace(qualLength);
+    AllocateDeletionTagSpace(qualLength);
+    AllocatePreBaseDeletionQVSpace(qualLength);
+    AllocateInsertionQVSpace(qualLength);
+    AllocateSubstitutionQVSpace(qualLength);
+    AllocateSubstitutionTagSpace(qualLength);
+    AllocateMergeQVSpace(qualLength);
+}
+
+void FASTQSequence::Copy(const FASTQSequence &rhs) {
+    CheckBeforeCopyOrReference(rhs, "FASTQSequence");
+
+    // Free *this before copying anything.
+    FASTQSequence::Free();
+
+    // Copy FASTASequence from rhs, including seq and title
+    FASTASequence::Copy(rhs); 
+
+    assert(deleteOnExit);
+
+    // Copy Quality values from rhs.
+    FASTQSequence::CopyQualityValues(rhs);
+}
+
+FASTQSequence& FASTQSequence::operator=(const FASTQSequence &rhs) {
+    ((FASTQSequence*)this)->Copy(rhs);
+    return *this;
+}
+
+FASTQSequence::FASTQSequence(const FASTQSequence &rhs) {
+    ((FASTQSequence*)this)->Copy(rhs);
+}
+
+// Copy rhs to this, including seq, title and QVs.
+void FASTQSequence::Assign(FASTQSequence &rhs) {
+    CheckBeforeCopyOrReference(rhs);
+    FASTQSequence::Free();
+
+    // copy the nucleotide part
+    FASTASequence::Assign(rhs);
+    // copy the qual part, qual scal is set in CopyQualityValues
+    FASTQSequence::CopyQualityValues(rhs);
+}
+
+void FASTQSequence::PrintFastq(ostream &out, int lineLength) {
+    PrintSeq(out, lineLength, '@');
+    if (lineLength == 0) { 
+        out << endl;
+    }
+    PrintFastqQuality(out, lineLength);
+    if (lineLength == 0) {
+        out << endl;
+    }
+}
+
+void FASTQSequence::PrintFastqQuality(ostream &out, int lineLength) {
+    out << "+" << endl;
+    PrintAsciiQual(out, lineLength);
+}
+
+bool FASTQSequence::GetQVs(const QVIndex & qvIndex, std::vector<uint8_t> & qvs, bool reverse) {
+    qvs.clear();
+    uint8_t *  qualPtr;
+    int charOffset = charToQuality;
+    if (qvIndex == I_QualityValue) {
+        qualPtr = qual.data;
+    } else if (qvIndex == I_InsertionQV) {
+        qualPtr = insertionQV.data;
+    } else if (qvIndex == I_DeletionQV) {
+        qualPtr = deletionQV.data;
+    } else if (qvIndex == I_SubstitutionQV) {
+        qualPtr = substitutionQV.data;
+    } else if (qvIndex == I_MergeQV) {
+        qualPtr = mergeQV.data;
+    } else if (qvIndex == I_SubstitutionTag) {
+        qualPtr = (uint8_t*)(substitutionTag);
+        charOffset = 0;
+    } else if (qvIndex == I_DeletionTag) {
+        qualPtr = (uint8_t*)(deletionTag);
+        charOffset = 0;
+    }
+    if (qualPtr == NULL) {
+        return false;
+    }
+
+    qvs.resize(length);
+    for (DNALength i = 0; i < length; i++) {
+        if (not reverse) { // The same orientation
+            qvs[i] = static_cast<uint8_t>(qualPtr[i] + charOffset);
+        } else if (qvIndex != I_SubstitutionTag and qvIndex != I_DeletionTag) {
+            // Reverse orientation, reverse QVs, except SubstitutionTag and DeletionTag
+            qvs[i] = static_cast<uint8_t>(qualPtr[length - i - 1] + charOffset);
+        } else { // Reverse and complement SubstitutionTag and DeletionTag
+            qvs[i] = static_cast<uint8_t>(ReverseComplementNuc[qualPtr[length - i - 1] + charOffset]);
+        }
+        //assert(qvs[i] > 32 and qvs[i] < 127);
+    }
+    return true;
+}
+
+QVIndex FASTQSequence::GetQVIndex(const std::string & qvName) {
+    if (qvName == "QualityValue") {
+        return I_QualityValue;
+    } else if (qvName == "InsertionQV") {
+        return I_InsertionQV;
+    } else if (qvName == "DeletionQV") {
+        return I_DeletionQV;
+    } else if (qvName == "SubstitutionQV") {
+        return I_SubstitutionQV;
+    } else if (qvName == "MergeQV") {
+        return I_MergeQV;
+    } else if (qvName == "SubstitutionTag") {
+        return  I_SubstitutionTag;
+    } else if (qvName == "DeletionTag"){
+        return I_DeletionTag;
+    } else {
+        std::cout << "ERROR: unknown Quality Value " << qvName << std::endl;
+        assert(false);
+    }
+}
+
+bool FASTQSequence::GetQVs(const std::string & qvName, std::vector<uint8_t> & qvs, bool reverse){
+    return GetQVs(GetQVIndex(qvName), qvs, reverse);
+}
+
+bool FASTQSequence::GetQVs(const std::string & qvName, std::string & qvsStr, bool reverse) {
+    std::vector<uint8_t> qvs;
+    bool OK = GetQVs(qvName, qvs, reverse);
+    qvsStr = string(qvs.begin(), qvs.end());
+    return OK;
+}
+
+void FASTQSequence::PrintAsciiRichQuality(ostream &out, 
+        int whichQuality, int lineLength) {
+    vector<uint8_t> qvs;
+    bool OK = GetQVs(static_cast<QVIndex>(whichQuality), qvs);
+    
+    DNALength i;
+    if (lineLength == 0) {
+        for (i = 0; i < length; i++) {
+            if (OK) {
+                out << static_cast<char>(qvs[i]);
+            }
+            else {
+                // Fake bad quality
+                out << "5";
+            }
+        }
+    }
+    else {
+        for (i = 0; i < length; i++) {
+            if (OK) {
+                out << static_cast<char>(qvs[i]);
+            }
+            else {
+                // Fake pretty bad quality.
+                out << "5";
+            }
+            assert(lineLength != 0);
+            if (i > 0 and (i+1) % lineLength==0) {
+                out << endl;
+            }
+        }
+        if (i == 0 or i % lineLength != 0) {
+            out << endl;
+        }
+    }
+}
+
+void FASTQSequence::PrintAsciiQual(ostream &out, int lineLength) {
+    PrintAsciiRichQuality(out, 0, lineLength);
+}
+
+void FASTQSequence::PrintQual(ostream &out, int lineLength) {
+    out << ">" << this->title << endl;
+    DNALength i;
+    for (i = 0; i < length; i++ ){
+        out << (int) qual[i];
+        if (i > 0 and (i+1) % lineLength == 0)
+            out << endl;
+        else 
+            out << " ";
+    }
+    if (i == 0 or i % lineLength != 0) {
+        out << endl;
+    }
+}
+
+void FASTQSequence::PrintQualSeq(ostream &out, int lineLength) {
+    FASTASequence::PrintSeq(out, lineLength);
+    lineLength /= 4;
+    PrintQual(out, lineLength);
+}
+
+// Create a reverse complement FASTQSequence of *this and assign to rhs.
+void FASTQSequence::MakeRC(FASTQSequence &rc) {
+    rc.Free();
+    FASTASequence::MakeRC(rc);
+    rc.SetQVScale(qvScale);
+
+    if (not qual.Empty()) {
+        // QVs are independent of one another. A FASTQSequence can have
+        // insertionQV without having QualityValue.
+        (static_cast<FASTQSequence*>(&rc))->AllocateQualitySpace(length);
+        for (DNALength pos = 0; pos < length; pos++ ){
+            rc.qual.data[length - pos - 1] = qual[pos];
+        }
+    }
+
+    //
+    // The read contains rich quality values. Reverse them here.
+    //
+    if (deletionQV.Empty() == false) {
+        (static_cast<FASTQSequence*>(&rc))->AllocateDeletionQVSpace(length);
+        for (DNALength pos = 0; pos < length; pos++) {
+            rc.deletionQV[length - pos - 1] = deletionQV[pos];
+        }
+    }
+
+    if (insertionQV.Empty() == false) {
+        (static_cast<FASTQSequence*>(&rc))->AllocateInsertionQVSpace(length);
+        for (DNALength pos = 0; pos < length; pos++) {
+            rc.insertionQV[length - pos - 1] = insertionQV[pos];
+        }
+    }
+
+    if (substitutionQV.Empty() == false) {
+        (static_cast<FASTQSequence*>(&rc))->AllocateSubstitutionQVSpace(length);
+        for (DNALength pos = 0; pos < length; pos++) {
+            rc.substitutionQV[length - pos - 1] = substitutionQV[pos];
+        }
+    }
+
+    if (mergeQV.Empty() == false) {
+        (static_cast<FASTQSequence*>(&rc))->AllocateMergeQVSpace(length);
+        for (DNALength pos = 0; pos < length; pos++) {
+            rc.mergeQV[length - pos - 1] = mergeQV[pos];
+        }
+    }
+
+    if (substitutionTag != NULL) {
+        (static_cast<FASTQSequence*>(&rc))->AllocateSubstitutionTagSpace(length);
+        for (DNALength pos = 0; pos < length; pos++) {
+            rc.substitutionTag[length - pos - 1] = ReverseComplementNuc[substitutionTag[pos]];
+        }
+    }
+
+    if (deletionTag != NULL) {
+        (static_cast<FASTQSequence*>(&rc))->AllocateDeletionTagSpace(length);
+        for (DNALength pos = 0; pos < length; pos++) {
+            rc.deletionTag[length - pos - 1] = ReverseComplementNuc[deletionTag[pos]];
+        }
+    }
+
+    if (preBaseDeletionQV.Empty() == false) {
+        (static_cast<FASTQSequence*>(&rc))->AllocatePreBaseDeletionQVSpace(length);
+        for (DNALength pos = 0; pos < length; pos++) {
+            rc.preBaseDeletionQV[length - pos - 1] = preBaseDeletionQV[pos];
+        }
+    }
+
+    deletionQVPrior = rc.deletionQVPrior;
+    insertionQVPrior = rc.insertionQVPrior;
+    substitutionQVPrior = rc.substitutionQVPrior;
+    preBaseDeletionQVPrior = rc.preBaseDeletionQVPrior;
+}
+
+void FASTQSequence::Free() {
+    if (deleteOnExit == true) { // Free Quality Values if under control
+        qual.Free();
+        deletionQV.Free();
+        preBaseDeletionQV.Free();
+        insertionQV.Free();
+        substitutionQV.Free();
+        mergeQV.Free();
+        if (deletionTag != NULL) {
+            delete[] deletionTag;
+        }
+        if (substitutionTag != NULL) {
+            delete[] substitutionTag;
+        }
+    }
+    //Reset deletionTag and substitionTag anyway
+    deletionTag = NULL;
+    substitutionTag = NULL;
+
+    // Free seq and title, reset deleteOnExit. 
+    // Don't call FASTASequence::Free before freeing QVs.
+    FASTASequence::Free();
+}
+
+void FASTQSequence::LowerCaseMask(int qThreshold) {
+    int i;
+    if (qual.Empty() == true) return;
+
+   for (i = 0; i < length; i++ ){
+        if (qual[i] < qThreshold) {
+            seq[i] = tolower(seq[i]);
+        }
+    }
+}
+
+float FASTQSequence::GetAverageQuality() {
+    DNALength p;
+    float totalQ;
+    if (qual.Empty() == true) { return 0.0; }
+    assert(qual.Empty() == false);
+    assert(length > 0);
+    for (p = 0, totalQ = 0.0; p < length; p++) {
+        totalQ += qual[p];
+    }
+    return totalQ / length;
+}
+
+#ifdef USE_PBBAM
+void FASTQSequence::Copy(const PacBio::BAM::BamRecord & record) {
+    FASTQSequence::Free();
+
+    // Copy title and sequence.
+    static_cast<FASTASequence*>(this)->Copy(record);
+
+    // Copy QVs.
+    qual.Copy(record.Qualities().Fastq());
+
+    // iq
+    if (record.HasInsertionQV()) {
+        insertionQV.Copy(record.InsertionQV().Fastq());
+    }
+    // dq
+    if (record.HasDeletionQV()) {
+        deletionQV.Copy(record.DeletionQV().Fastq());
+    }
+    // sq
+    if (record.HasSubstitutionQV()) {
+        substitutionQV.Copy(record.SubstitutionQV().Fastq());
+    }
+    // mq
+    if (record.HasMergeQV()) {
+        mergeQV.Copy(record.MergeQV().Fastq());
+    }
+    // st
+    if (record.HasSubstitutionTag()) {
+        std::string qvs = record.SubstitutionTag();
+        AllocateSubstitutionTagSpace(static_cast<DNALength>(qvs.size()));
+        std::memcpy(substitutionTag, qvs.c_str(), qvs.size() * sizeof(char));
+    }
+    // dt
+    if (record.HasDeletionTag()) {
+        std::string qvs = record.DeletionTag();
+        AllocateDeletionTagSpace(static_cast<DNALength>(qvs.size()));
+        std::memcpy(deletionTag, qvs.c_str(), qvs.size() * sizeof(char));
+    }
+    // preBaseQVs are not included in BamRecord, and will not be copied.
+    
+    subreadStart = static_cast<int>(record.QueryStart());
+    subreadEnd = static_cast<int>(record.QueryEnd());
+}
+#endif
diff --git a/libcpp/pbdata/FASTQSequence.hpp b/libcpp/pbdata/FASTQSequence.hpp
new file mode 100644
index 0000000..f94b2b0
--- /dev/null
+++ b/libcpp/pbdata/FASTQSequence.hpp
@@ -0,0 +1,146 @@
+#ifndef _BLASR_FASTQ_SEQUENCE_HPP_
+#define _BLASR_FASTQ_SEQUENCE_HPP_
+
+#include "DNASequence.hpp"
+#include "FASTASequence.hpp"
+#include "qvs/QualityValue.hpp"
+#include "qvs/QualityValueVector.hpp"
+#include "matrix/Matrix.hpp"
+#include "reads/ZMWGroupEntry.hpp"
+
+enum QVList {InsertionQV=0x1, DeletionQV=0x2, SubstitutionQV=0x4, MergeQV=0x8, SubstitutionTag=0x10, DeletionTag=0x20};
+enum QVIndex {I_QualityValue=0, I_InsertionQV=1,I_DeletionQV=2,I_SubstitutionQV=3,I_MergeQV=4, I_SubstitutionTag=5,I_DeletionTag=6};
+
+class FASTQSequence : public FASTASequence {
+public:
+    static int charToQuality;
+    QualityValueVector<QualityValue> qual;
+    QualityValueVector<QualityValue> deletionQV;
+    QualityValueVector<QualityValue> preBaseDeletionQV;
+    QualityValueVector<QualityValue> insertionQV;
+    QualityValueVector<QualityValue> substitutionQV;
+    QualityValueVector<QualityValue> mergeQV;
+    Nucleotide *deletionTag;
+    Nucleotide *substitutionTag;
+    int subreadStart, subreadEnd;
+    QualityValue deletionQVPrior, insertionQVPrior, substitutionQVPrior, preBaseDeletionQVPrior;
+
+    QVScale qvScale;
+
+    QVScale GetQVScale(); 
+
+    void SetQVScale(QVScale qvScaleP); 
+
+    QualityValueVector<QualityValue>* GetQVPointerByIndex(int index);
+
+    int GetStorageSize(); 
+
+    FASTQSequence();
+    inline ~FASTQSequence();
+
+    QualityValue GetDeletionQV(DNALength pos); 
+
+    QualityValue GetMergeQV(DNALength pos); 
+
+    Nucleotide GetSubstitutionTag(DNALength pos); 
+
+    Nucleotide GetDeletionTag(DNALength pos); 
+
+    QualityValue GetInsertionQV(DNALength pos); 
+
+    QualityValue GetSubstitutionQV(DNALength pos); 
+
+    QualityValue GetPreBaseDeletionQV(DNALength pos, Nucleotide nuc); 
+
+    void ShallowCopy(const FASTQSequence &rhs); 
+
+    void ReferenceSubstring(const FASTQSequence &rhs); 
+
+    void ReferenceSubstring(const FASTQSequence &rhs, DNALength pos);
+
+    void ReferenceSubstring(const FASTQSequence &rhs, DNALength pos, DNALength substrLength); 
+
+    void ClearAndNull(QualityValue *value); 
+
+    void CopyQualityValues(const FASTQSequence &rhs);
+
+    void AllocateQualitySpace(DNALength qualLength); 
+
+    void AllocateDeletionQVSpace(DNALength qualLength); 
+
+    void AllocateMergeQVSpace(DNALength len);
+
+    void AllocateDeletionTagSpace(DNALength qualLength); 
+
+    void AllocatePreBaseDeletionQVSpace(DNALength qualLength); 
+
+    void AllocateInsertionQVSpace(DNALength qualLength); 
+
+    void AllocateSubstitutionQVSpace(DNALength qualLength );
+
+    void AllocateSubstitutionTagSpace(DNALength qualLength );
+
+    void AllocateRichQualityValues(DNALength qualLength); 
+
+    void Copy(const FASTQSequence &rhs); 
+
+    FASTQSequence& operator=(const FASTQSequence &rhs); 
+
+    FASTQSequence(const FASTQSequence &rhs); 
+
+    void Assign(FASTQSequence &rhs); 
+
+    void PrintFastq(std::ostream &out, int lineLength=50); 
+
+    void PrintFastqQuality(std::ostream &out, int lineLength=50); 
+
+    QVIndex GetQVIndex(const std::string & qvName);
+
+    /// Get QVs in vector<uint8_t> associated with the given QVIndex.
+    /// \returns true if qvs are available, false otherwise
+    /// \param [in] qvIndex - enum QVIndex
+    /// \param [out] qvs - obtained QVs.
+    /// \param [in] reverse - reverse orders of QVs or not
+    bool GetQVs(const QVIndex & qvIndex, std::vector<uint8_t> & qvs, bool reverse=false);
+
+    /// Get QVs in vector<uint8_t>, given with QV Name.
+    /// \returns true if qvs are available, false, otherwise
+    /// \param [in] qvName - InsertionQV, DeletionQV, SubstitionQV, MergeQV, SubstitutionTag, DeletionTag
+    /// \param [out] qvs - obtians QVs.
+    /// \param [in] reverse - reverse orders of QVs or not.
+    bool GetQVs(const std::string & qvName, std::vector<uint8_t> & qvs, bool reverse=false);
+
+    /// Get QVs in string, given with QV Name.
+    /// \returns true if qvs are available, false, otherwise
+    /// \param [in] qvName - InsertionQV, DeletionQV, SubstitionQV, MergeQV, SubstitutionTag, DeletionTag
+    /// \param [out] qvs - obtians QVs.
+    /// \param [in] reverse - reverse order of QVs or not
+    bool GetQVs(const std::string & qvName, std::string & qvs, bool reverse=false);
+
+    void PrintAsciiRichQuality(std::ostream &out, int whichQuality, int lineLength=50);
+
+    void PrintAsciiQual(std::ostream &out, int lineLength=50) ;
+
+    void PrintQual(std::ostream &out, int lineLength = 50); 
+
+    void PrintQualSeq(std::ostream &out, int lineLength = 50);
+
+    void MakeRC(FASTQSequence &rc); 
+
+    void Free(); 
+
+    void LowerCaseMask(int qThreshold); 
+
+    float GetAverageQuality(); 
+
+#ifdef USE_PBBAM
+    /// Copy name, sequence, and QVs from BamRecord.
+    void Copy(const PacBio::BAM::BamRecord & record);
+#endif 
+};
+
+inline FASTQSequence::~FASTQSequence() {
+    FASTQSequence::Free();
+}
+
+#endif // _BLASR_FASTQ_SEQUENCE_HPP_
diff --git a/libcpp/pbdata/GFFFile.cpp b/libcpp/pbdata/GFFFile.cpp
new file mode 100644
index 0000000..d9f36e1
--- /dev/null
+++ b/libcpp/pbdata/GFFFile.cpp
@@ -0,0 +1,39 @@
+#include "GFFFile.hpp"
+
+GFFEntry::GFFEntry(std::string & _name, std::string & _source,
+                  std::string & _type, UInt & _start, UInt & _end,
+                  float & _score, char & _strand,
+                  std::string & _frame, std::string _attributes) {
+    name = _name; 
+    source = _source;
+    type = _type;
+    start = _start;
+    end = _end;
+    score = _score;
+    strand = _strand;
+    frame = _frame;
+}
+
+void GFFFile::ReadAll(std::string & gffFileName) {
+  std::fstream gffIn;
+  CrucialOpen(gffFileName, gffIn, std::ios::in);
+  while(gffIn) {
+    std::string line;
+    getline(gffIn, line);
+    std::stringstream linestrm(line);
+    std::string name, source, type;
+    UInt start, end;
+    char strand;
+    float score;
+    std::string frame, attributes;
+    // A sample record in adapterGffFile:
+    // ref000001   .   adapter 10955   10999   0.00    +   .   xxxx
+    linestrm >> name >> source >> type 
+             >> start >> end >> score 
+             >> strand >> frame >> attributes;
+    entries.push_back(GFFEntry(
+      name, source, type, start, end, 
+      score, strand, frame, attributes));
+    }
+    gffIn.close();
+}
diff --git a/libcpp/pbdata/GFFFile.hpp b/libcpp/pbdata/GFFFile.hpp
new file mode 100644
index 0000000..2e410ec
--- /dev/null
+++ b/libcpp/pbdata/GFFFile.hpp
@@ -0,0 +1,33 @@
+#ifndef _BLASR_GFF_FILE_HPP_
+#define _BLASR_GFF_FILE_HPP_
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "utils.hpp"
+#include "Types.h"
+
+class GFFEntry {
+public:
+    std::string name, type, source;
+    UInt start, end;
+    char strand;
+    float score;
+    std::string frame;
+    std::string attributes;
+    GFFEntry(std::string & _name, std::string & _source,
+             std::string & _type, UInt & _start, UInt & _end,
+             float & _score, char & _strand,
+             std::string & _frame, std::string _attributes);
+};
+
+class GFFFile {
+public:
+    std::vector<GFFEntry> entries;
+    void ReadAll(std::string & gffFileName);
+};
+
+#endif
diff --git a/libcpp/pbdata/MD5Utils.cpp b/libcpp/pbdata/MD5Utils.cpp
new file mode 100644
index 0000000..dd1f45a
--- /dev/null
+++ b/libcpp/pbdata/MD5Utils.cpp
@@ -0,0 +1,464 @@
+
+// MD5.CC - source code for the C++/object oriented translation and 
+//          modification of MD5.
+
+// Translation and modification (c) 1995 by Mordechai T. Abzug 
+
+// This translation/ modification is provided "as is," without express or 
+// implied warranty of any kind.
+
+// The translator/ modifier does not claim (1) that MD5 will do what you think 
+// it does; (2) that this translation/ modification is accurate; or (3) that 
+// this software is "merchantible."  (Language for this disclaimer partially 
+// copied from the disclaimer below).
+
+/* based on:
+
+   MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+   MDDRIVER.C - test driver for MD2, MD4 and MD5
+
+
+   Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+rights reserved.
+
+License to copy and use this software is granted provided that it
+is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+Algorithm" in all material mentioning or referencing this software
+or this function.
+
+License is also granted to make and use derivative works provided
+that such works are identified as "derived from the RSA Data
+Security, Inc. MD5 Message-Digest Algorithm" in all material
+mentioning or referencing the derived work.
+
+RSA Data Security, Inc. makes no representations concerning either
+the merchantability of this software or the suitability of this
+software for any particular purpose. It is provided "as is"
+without express or implied warranty of any kind.
+
+These notices must be retained in any copies of any part of this
+documentation and/or software.
+
+ */
+
+#include <assert.h>
+#include <strings.h>
+#include <iostream>
+#include "MD5Utils.hpp"
+
+using namespace std;
+
+// MD5 simple initialization method
+
+MD5::MD5(){
+
+  init();
+
+}
+
+// MD5 block update operation. Continues an MD5 message-digest
+// operation, processing another message block, and updating the
+// context.
+
+void MD5::update (uint1 *input, uint4 input_length) {
+
+  uint4 input_index, buffer_index;
+  uint4 buffer_space;                // how much space is left in buffer
+
+  if (finalized){  // so we can't update!
+    cerr << "MD5::update:  Can't update a finalized digest!" << endl;
+    return;
+  }
+
+  // Compute number of bytes mod 64
+  buffer_index = (unsigned int)((count[0] >> 3) & 0x3F);
+
+  // Update number of bits
+  if (  (count[0] += ((uint4) input_length << 3))<((uint4) input_length << 3) )
+    count[1]++;
+
+  count[1] += ((uint4)input_length >> 29);
+
+
+  buffer_space = 64 - buffer_index;  // how much space is left in buffer
+
+  // Transform as many times as possible.
+  if (input_length >= buffer_space) { // ie. we have enough to fill the buffer
+    // fill the rest of the buffer and transform
+    memcpy (buffer + buffer_index, input, buffer_space);
+    transform (buffer);
+
+    // now, transform each 64-byte piece of the input, bypassing the buffer
+    for (input_index = buffer_space; input_index + 63 < input_length; 
+	 input_index += 64)
+      transform (input+input_index);
+
+    buffer_index = 0;  // so we can buffer remaining
+  }
+  else
+    input_index=0;     // so we can buffer the whole input
+
+
+  // and here we do the buffering:
+  memcpy(buffer+buffer_index, input+input_index, input_length-input_index);
+}
+
+
+// MD5 update for files.
+// Like above, except that it works on files (and uses above as a primitive.)
+
+void MD5::update(FILE *file){
+
+    unsigned char buffer[1024];
+    int len = 0;
+
+    while ( (len=fread(buffer, 1, 1024, file) and len != 0))
+        update(buffer, len);
+
+    fclose (file);
+}
+
+
+// MD5 update for istreams.
+// Like update for files; see above.
+
+void MD5::update(istream& stream){
+
+  unsigned char buffer[1024];
+  int len;
+
+  while (stream.good()){
+    stream.read((char*) buffer, 1024); // note that return value of read is unusable.
+    len=stream.gcount();
+    update(buffer, len);
+  }
+
+}
+
+
+
+
+
+
+// MD5 update for ifstreams.
+// Like update for files; see above.
+
+void MD5::update(ifstream& stream){
+
+  unsigned char buffer[1024];
+  int len;
+
+  while (stream.good()){
+    stream.read((char*)buffer, 1024); // note that return value of read is unusable.
+    len=stream.gcount();
+    update(buffer, len);
+  }
+
+}
+
+
+
+
+
+
+// MD5 finalization. Ends an MD5 message-digest operation, writing the
+// the message digest and zeroizing the context.
+
+
+void MD5::finalize (){
+
+  unsigned char bits[8];
+  unsigned int index, padLen;
+  static uint1 PADDING[64]={
+    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    };
+
+  if (finalized){
+    cerr << "MD5::finalize:  Already finalized this digest!" << endl;
+    return;
+  }
+
+  // Save number of bits
+  encode (bits, count, 8);
+
+  // Pad out to 56 mod 64.
+  index = (uint4) ((count[0] >> 3) & 0x3f);
+  padLen = (index < 56) ? (56 - index) : (120 - index);
+  update (PADDING, padLen);
+
+  // Append length (before padding)
+  update (bits, 8);
+
+  // Store state in digest
+  encode (digest, state, 16);
+
+  // Zeroize sensitive information
+  memset (buffer, 0, sizeof(*buffer));
+
+  finalized=1;
+
+}
+
+
+
+
+MD5::MD5(FILE *file){
+
+  init();  // must be called be all constructors
+  update(file);
+  finalize ();
+}
+
+
+
+
+MD5::MD5(istream& stream){
+
+  init();  // must called by all constructors
+  update (stream);
+  finalize();
+}
+
+
+
+MD5::MD5(ifstream& stream){
+
+  init();  // must called by all constructors
+  update (stream);
+  finalize();
+}
+
+
+
+unsigned char *MD5::raw_digest(){
+
+  uint1 *s = new uint1[16];
+
+  if (!finalized){
+    cerr << "MD5::raw_digest:  Can't get digest if you haven't "<<
+      "finalized the digest!" <<endl;
+    //return ( (unsigned char*) "");
+    delete [] s;
+    return NULL;
+  }
+
+  memcpy(s, digest, 16);
+  return s;
+}
+
+
+
+char *MD5::hex_digest(){
+
+  int i;
+  char *s= new char[33];
+
+  if (!finalized){
+    cerr << "MD5::hex_digest:  Can't get digest if you haven't "<<
+      "finalized the digest!" <<endl;
+    delete [] s;
+    return NULL;
+  }
+
+  for (i=0; i<16; i++)
+    sprintf(s+i*2, "%02x", digest[i]);
+
+  s[32]='\0';
+
+  return s;
+}
+
+
+
+
+
+
+
+// PRIVATE METHODS:
+
+
+
+void MD5::init(){
+  finalized=0;  // we just started!
+
+  // Nothing counted, so count=0
+  count[0] = 0;
+  count[1] = 0;
+
+  // Load magic initialization constants.
+  state[0] = 0x67452301;
+  state[1] = 0xefcdab89;
+  state[2] = 0x98badcfe;
+  state[3] = 0x10325476;
+}
+
+
+
+// Constants for MD5Transform routine.
+// Although we could use C++ style constants, defines are actually better,
+// since they let us easily evade scope clashes.
+
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+
+
+
+// MD5 basic transformation. Transforms state based on block.
+void MD5::transform (uint1 block[64]){
+
+  uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+  decode (x, block, 64);
+
+  assert(!finalized);  // not just a user error, since the method is private
+
+  /* Round 1 */
+  FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
+  FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
+  FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
+  FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
+  FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
+  FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
+  FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
+  FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
+  FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
+  FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
+  FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+  FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+  FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+  FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+  FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+  FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+  GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
+  GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
+  GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+  GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
+  GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
+  GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
+  GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+  GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
+  GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
+  GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+  GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
+  GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
+  GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+  GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
+  GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
+  GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+  /* Round 3 */
+  HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
+  HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
+  HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+  HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+  HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
+  HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
+  HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
+  HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+  HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+  HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
+  HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
+  HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
+  HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
+  HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+  HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+  HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
+
+  /* Round 4 */
+  II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
+  II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
+  II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+  II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
+  II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+  II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
+  II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+  II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
+  II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
+  II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+  II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
+  II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+  II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
+  II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+  II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
+  II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
+
+  state[0] += a;
+  state[1] += b;
+  state[2] += c;
+  state[3] += d;
+
+  // Zeroize sensitive information.
+  memset ( (uint1 *) x, 0, sizeof(x));
+
+}
+
+// Encodes input (UINT4) into output (unsigned char). Assumes len is
+// a multiple of 4.
+void MD5::encode (uint1 *output, uint4 *input, uint4 len) {
+
+  unsigned int i, j;
+
+  for (i = 0, j = 0; j < len; i++, j += 4) {
+    output[j]   = (uint1)  (input[i] & 0xff);
+    output[j+1] = (uint1) ((input[i] >> 8) & 0xff);
+    output[j+2] = (uint1) ((input[i] >> 16) & 0xff);
+    output[j+3] = (uint1) ((input[i] >> 24) & 0xff);
+  }
+}
+
+
+
+
+// Decodes input (unsigned char) into output (UINT4). Assumes len is
+// a multiple of 4.
+void MD5::decode (uint4 *output, uint1 *input, uint4 len){
+
+  unsigned int i, j;
+
+  for (i = 0, j = 0; j < len; i++, j += 4)
+    output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |
+      (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);
+}
+
+
+
+
+
+// Note: Replace "for loop" with standard memcpy if possible.
+void MD5::memcpy (uint1 *output, uint1 *input, uint4 len){
+
+  unsigned int i;
+
+  for (i = 0; i < len; i++)
+    output[i] = input[i];
+}
+
+
+
+// Note: Replace "for loop" with standard memset if possible.
+void MD5::memset (uint1 *output, uint1 value, uint4 len){
+
+  unsigned int i;
+
+  for (i = 0; i < len; i++)
+    output[i] = value;
+}
diff --git a/libcpp/pbdata/MD5Utils.hpp b/libcpp/pbdata/MD5Utils.hpp
new file mode 100644
index 0000000..8957933
--- /dev/null
+++ b/libcpp/pbdata/MD5Utils.hpp
@@ -0,0 +1,113 @@
+#ifndef _BLASR_UTILS_M5UTILS_HPP_
+#define _BLASR_UTILS_M5UTILS_HPP_
+
+// MD5.CC - source code for the C++/object oriented translation and 
+//          modification of MD5.
+
+// Translation and modification (c) 1995 by Mordechai T. Abzug 
+
+// This translation/ modification is provided "as is," without express or 
+// implied warranty of any kind.
+
+// The translator/ modifier does not claim (1) that MD5 will do what you think 
+// it does; (2) that this translation/ modification is accurate; or (3) that 
+// this software is "merchantible."  (Language for this disclaimer partially 
+// copied from the disclaimer below).
+
+/* based on:
+
+   MD5.H - header file for MD5C.C
+   MDDRIVER.C - test driver for MD2, MD4 and MD5
+
+   Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+   rights reserved.
+
+   License to copy and use this software is granted provided that it
+   is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+   Algorithm" in all material mentioning or referencing this software
+   or this function.
+
+   License is also granted to make and use derivative works provided
+   that such works are identified as "derived from the RSA Data
+   Security, Inc. MD5 Message-Digest Algorithm" in all material
+   mentioning or referencing the derived work.
+
+   RSA Data Security, Inc. makes no representations concerning either
+   the merchantability of this software or the suitability of this
+   software for any particular purpose. It is provided "as is"
+   without express or implied warranty of any kind.
+
+   These notices must be retained in any copies of any part of this
+   documentation and/or software.
+
+*/
+
+#include <stdio.h>
+#include <fstream>
+#include <iostream>
+
+class MD5 {
+
+public:
+    // methods for controlled operation:
+    MD5              ();  // simple initializer
+    void  update     (unsigned char *input, unsigned int input_length);
+    void  update     (std::istream& stream);
+    void  update     (FILE *file);
+    void  update     (std::ifstream& stream);
+    void  finalize   ();
+
+    // constructors for special circumstances.  All these constructors finalize
+    // the MD5 context.
+    MD5              (unsigned char *string); // digest string, finalize
+    MD5              (std::istream& stream);       // digest stream, finalize
+    MD5              (FILE *file);            // digest file, close, finalize
+    MD5              (std::ifstream& stream);      // digest stream, close, finalize
+
+    // methods to acquire finalized result
+    unsigned char    *raw_digest ();  // digest as a 16-byte binary array
+    char *            hex_digest ();  // digest as a 33-byte ascii-hex string
+    friend std::ostream&   operator<< (std::ostream&, MD5 context);
+
+private:
+
+    // first, some types:
+    typedef unsigned       int uint4; // assumes integer is 4 words long
+    typedef unsigned short int uint2; // assumes short integer is 2 words long
+    typedef unsigned      char uint1; // assumes char is 1 word long
+
+    // next, the private data:
+    uint4 state[4];
+    uint4 count[2];     // number of *bits*, mod 2^64
+    uint1 buffer[64];   // input buffer
+    uint1 digest[16];
+    uint1 finalized;
+
+    // last, the private methods, mostly static:
+    void init             ();               // called by all constructors
+    void transform        (uint1 *buffer);  // does the real update work.  Note 
+    // that length is implied to be 64.
+
+    static void encode    (uint1 *dest, uint4 *src, uint4 length);
+    static void decode    (uint4 *dest, uint1 *src, uint4 length);
+    static void memcpy    (uint1 *dest, uint1 *src, uint4 length);
+    static void memset    (uint1 *start, uint1 val, uint4 length);
+
+    static inline uint4  rotate_left (uint4 x, uint4 n);
+    static inline uint4  F           (uint4 x, uint4 y, uint4 z);
+    static inline uint4  G           (uint4 x, uint4 y, uint4 z);
+    static inline uint4  H           (uint4 x, uint4 y, uint4 z);
+    static inline uint4  I           (uint4 x, uint4 y, uint4 z);
+    static inline void   FF  (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, 
+            uint4 s, uint4 ac);
+    static inline void   GG  (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, 
+            uint4 s, uint4 ac);
+    static inline void   HH  (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, 
+            uint4 s, uint4 ac);
+    static inline void   II  (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, 
+            uint4 s, uint4 ac);
+};
+
+#include "MD5UtilsImpl.hpp"
+
+#endif // _BLASR_UTILS_M5UTILS_HPP_
diff --git a/libcpp/pbdata/MD5UtilsImpl.hpp b/libcpp/pbdata/MD5UtilsImpl.hpp
new file mode 100644
index 0000000..3e8f78e
--- /dev/null
+++ b/libcpp/pbdata/MD5UtilsImpl.hpp
@@ -0,0 +1,57 @@
+#ifndef _BLASR_MD5_UTILS_IMPL_HPP_
+#define _BLASR_MD5_UTILS_IMPL_HPP_
+// ROTATE_LEFT rotates x left n bits.
+
+inline unsigned int MD5::rotate_left  (uint4 x, uint4 n){
+  return (x << n) | (x >> (32-n))  ;
+}
+
+// F, G, H and I are basic MD5 functions.
+
+inline unsigned int MD5::F            (uint4 x, uint4 y, uint4 z){
+  return (x & y) | (~x & z);
+}
+
+inline unsigned int MD5::G            (uint4 x, uint4 y, uint4 z){
+  return (x & z) | (y & ~z);
+}
+
+inline unsigned int MD5::H            (uint4 x, uint4 y, uint4 z){
+  return x ^ y ^ z;
+}
+
+inline unsigned int MD5::I            (uint4 x, uint4 y, uint4 z){
+  return y ^ (x | ~z);
+}
+
+
+
+// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+// Rotation is separate from addition to prevent recomputation.
+
+
+inline void MD5::FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, 
+		    uint4  s, uint4 ac){
+ a += F(b, c, d) + x + ac;
+ a = rotate_left (a, s) +b;
+}
+
+inline void MD5::GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, 
+		    uint4 s, uint4 ac){
+ a += G(b, c, d) + x + ac;
+ a = rotate_left (a, s) +b;
+}
+
+inline void MD5::HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, 
+		    uint4 s, uint4 ac){
+ a += H(b, c, d) + x + ac;
+ a = rotate_left (a, s) +b;
+}
+
+inline void MD5::II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, 
+			     uint4 s, uint4 ac){
+ a += I(b, c, d) + x + ac;
+ a = rotate_left (a, s) +b;
+}
+
+#endif
diff --git a/libcpp/pbdata/NucConversion.cpp b/libcpp/pbdata/NucConversion.cpp
new file mode 100644
index 0000000..ba46f6b
--- /dev/null
+++ b/libcpp/pbdata/NucConversion.cpp
@@ -0,0 +1,409 @@
+#include "NucConversion.hpp"
+
+int TwoBit[] = {
+  	0,  1,  2,  3,  0,  1,  2,  3,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,  0,255,  1,255,255,255,  2,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,  3,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,  0,255,  1,255,255,255,  2,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,  3,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255
+};
+
+
+//
+// Map from charcter to 3 bit.  Treat all non ACGT IUPAC as N
+// IPUAC: ACGT U M R W S Y K V H D N
+// 
+
+int ThreeBit[] = {
+  	0,  1,  2,  3,    4,255,255,255, // 0..3 are native nucletides, 4
+																		 // is an 'N', which is
+																		 // represented just fine in the 3
+																		 // bit mode.
+		255,255,255,255,255,255,255,255, // 8
+		255,255,255,255,255,255,255,255, // 16
+		255,255,255,255,255,255,255,255, // 24
+		255,255,255,255,  5,255,255,255, // 32  define '$' for bwt.
+		255,255,255,255,255,255,255,255, // 40
+		255,255,255,255,255,255,255,255, // 48
+		255,255,255,255,255,255,255,255, // 56
+		255,  0,  4,  1,  4,255,255,  2, // 64
+		  4,255,255,  4,255,  4,  4,255, // 72
+		255,255,  4,  4,  3,  4,  4,  4, // 80
+		255,  4,255,255,255,255,255,  4, // 88
+		255,  0,  4,  1,  4,255,255,  2, // 96
+		  4,255,255,  4,255,  4,  4,255, // 104
+		255,255,  4,  4,  3,  4,  4,  4, // 112
+		  4,  4,255,255,255,255,255,255, // 120
+		255,255,255,255,255,255,255,255, // 128
+		255,255,255,255,255,255,255,255, // 136
+		255,255,255,255,255,255,255,255, // 144
+		255,255,255,255,255,255,255,255, // 152
+		255,255,255,255,255,255,255,255, // 160
+		255,255,255,255,255,255,255,255, // 168
+		255,255,255,255,255,255,255,255, // 176
+		255,255,255,255,255,255,255,255, // 184
+		255,255,255,255,255,255,255,255, // 192
+		255,255,255,255,255,255,255,255, // 200
+		255,255,255,255,255,255,255,255, // 208
+		255,255,255,255,255,255,255,255, // 216
+		255,255,255,255,255,255,255,255, // 224
+		255,255,255,255,255,255,255,255, // 232
+		255,255,255,255,255,255,255,255, // 240
+		255,255,255,255,255,255,255,255  // 248
+};
+
+int IsACTG[] = {
+   	1,  1,  1,  1,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  1,  0,  1,  0,  0,  0,  1,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  1,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  1,  0,  1,  0,  0,  0,  1,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  1,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0
+};
+
+int IsLowerCase[] = {
+   	0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  1,  0,  1,  0,  0,  0,  1,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  1,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0
+};
+
+
+int FourBit[] = {
+   	0,  1,  2,  3,  4,  5,  6,  7,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,  0,255,  1,255,255,255,  2,
+  255,255,255,255,255,255,  8,255,
+  255,255,255,255,  3,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,  4,255,  5,255,255,255,  6,
+  255,255,255,255,255,255,  8,255,
+  255,255,255,255,  7,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255
+};
+
+int FourBitToAscii[]  = {'A', 'C', 'G', 'T', 'a', 'c', 'g', 't', 'N', 'X'};
+int ThreeBitToAscii[] = {'A', 'C', 'G', 'T', 'N', '$'};
+
+int MaskedFourBit[] = {
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,0,9,1,9,9,9,2,
+  9,9,9,9,9,9,8,9,
+  9,9,9,9,3,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,4,9,5,9,9,9,6,
+  9,9,9,9,9,9,8,9,
+  9,9,9,9,7,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9,
+  9,9,9,9,9,9,9,9
+};
+
+unsigned char AllToUpper[] = {
+	'A','C','G','T','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','A','N','C','N','N','N','G',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','T','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','A','N','C','N','N','N','G',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','T','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N'
+};
+char AllToLower[] = {
+	'a','c','g','t','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','a','N','c','N','N','N','g',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','t','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','a','N','c','N','N','N','g',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','t','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N',
+  'N','N','N','N','N','N','N','N'
+};
+
+unsigned char PreserveCase[] = {
+0,1,2,3,4,5,6,7,
+8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,
+24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,
+40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,
+56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,
+72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,
+88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,
+104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,
+120,121,122,123,124,125,126,127,
+128,129,130,131,132,133,134,135,
+136,137,138,139,140,141,142,143,
+144,145,146,147,148,149,150,151,
+152,153,154,155,156,157,158,159,
+160,161,162,163,164,165,166,167,
+168,169,170,171,172,173,174,175,
+176,177,178,179,180,181,182,183,
+184,185,186,187,188,189,190,191,
+192,193,194,195,196,197,198,199,
+200,201,202,203,204,205,206,207,
+208,209,210,211,212,213,214,215,
+216,217,218,219,220,221,222,223,
+224,225,226,227,228,229,230,231,
+232,233,234,235,236,237,238,239,
+240,241,242,243,244,245,246,247,
+248,249,250,251,252,253,254,255};
+
+
+char TwoBitToAscii[] = {'A', 'C', 'G', 'T'};
+
+
+unsigned char ReverseComplementNuc[] = {
+    3,  2,  1,  0,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,'T',127,'G',127,127,127,'C',
+	127,127,127,127,127,127,'N',127,
+  127,127,127,127,'A',127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,'t',127,'g',127,127,127,'c',
+  127,127,127,127,127,127,'n',127,
+  127,127,127,127,'a',127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127
+};
+
+//
+// HDF Column Orders: GTAC
+// A - column 2; C - column 3;
+// G - column 0; T - column 1;
+// Ascii code:
+// A=65, C=67, G=71,  T=84
+// a=97, c=99, g=116, t=103
+//
+int NucToHdfColumnOrder[] = {
+  	2,  3,  1,  0,  2,  3,  1,  0,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,  2,255,  3,255,255,255,  1,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,  0,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,  2,255,  3,255,255,255,  1,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,  0,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255,
+  255,255,255,255,255,255,255,255
+};
diff --git a/libcpp/pbdata/NucConversion.hpp b/libcpp/pbdata/NucConversion.hpp
new file mode 100644
index 0000000..892dd07
--- /dev/null
+++ b/libcpp/pbdata/NucConversion.hpp
@@ -0,0 +1,50 @@
+#ifndef _BLASR_NUC_CONVERSION_HPP_
+#define _BLASR_NUC_CONVERSION_HPP_
+
+//
+// Map from ascii to 2 bit representation.
+//
+extern int TwoBit[256];
+
+//
+// Map from charcter to 3 bit.  Treat all non ACGT IUPAC as N
+// IPUAC: ACGT U M R W S Y K V H D N
+// 
+extern int ThreeBit[256]; 
+
+extern int IsACTG[256];
+
+extern int IsLowerCase[256]; 
+
+extern int FourBit[256];
+
+extern int FourBitToAscii[10];
+
+extern int ThreeBitToAscii[6];
+
+extern int MaskedFourBit[256];
+
+extern unsigned char AllToUpper[256];
+
+extern char AllToLower[256];
+
+extern unsigned char PreserveCase[256];
+
+extern char TwoBitToAscii[4];
+
+extern unsigned char ReverseComplementNuc[256];
+
+//
+// HDF Column Orders: GTAC
+// A - column 2; C - column 3;
+// G - column 0; T - column 1;
+// Ascii code:
+// A=65, C=67, G=71,  T=84
+// a=97, c=99, g=116, t=103
+//
+extern int NucToHdfColumnOrder[256];
+
+// Convert a FASTQ character to Quality.
+const unsigned int FASTQ_CHAR_TO_QUALITY = 33; 
+
+#endif // _BLASR_NUC_CONVERSION_HPP_
diff --git a/libcpp/pbdata/PackedDNASequence.cpp b/libcpp/pbdata/PackedDNASequence.cpp
new file mode 100644
index 0000000..957839b
--- /dev/null
+++ b/libcpp/pbdata/PackedDNASequence.cpp
@@ -0,0 +1,233 @@
+#include "utils.hpp"
+#include "PackedDNASequence.hpp"
+
+const PackedDNAWord PackedDNASequence::NucPosMask[] = {7, 56, 448, 
+    3584, 28672, 229376, 
+    1835008, 14680064, 117440512, 
+    939524096};
+
+const PackedDNAWord PackedDNASequence::NegMask[] = { 4294967288,// 11111111 11111111 11111111 11111000
+    4294967239,// 11111111 11111111 11111111 11000111
+    4294966847, /// and so on...
+    4294963711, 4294938623, 4294737919, 
+    4293132287, 4280287231, 4177526783, 
+    3355443199};
+
+// Masks from the rightmost pos 'R' all to the end of the left side of
+// the word.
+const PackedDNAWord PackedDNASequence::MaskRL[] = {1073741823, 1073741816, 1073741760, 
+    1073741312, 1073737728, 1073709056,
+    1073479680, 1071644672, 1056964608, 
+    939524096};
+
+// Masks from starting position 'L' to the rightmost 'R'
+const PackedDNAWord PackedDNASequence::MaskLR[] = {7, 63, 511, 4095, 32767, 262143, 2097151, 16777215, 134217727, 1073741823};
+
+/*
+ * Count nucleotides by Xor'ing with the complement of the bit pattern. 
+ */
+const PackedDNAWord PackedDNASequence::xorMask[] = {
+    1073741823, // mask A=000 by 111111111111111111111111111111
+    920350134,  // mask C=001 by 110110110110110110110110110110
+    766958445,  // mask G=010 by 101101101101101101101101101101 
+    613566756,  // mask T=011 by 100100100100100100100100100100
+    460175067,  // mask N=100 by 011011011011011011011011011011
+    153391689,  // mask 001001001001001001001001001001 *unused*, can mask X=110
+    306783378,  // mask 010010010010010010010010010010 *unused*, can mask X'=101
+    0};         // mask 000000000000000000000000000000 *unused*, mask X''=111
+
+
+
+Nucleotide PackedDNASequence::Get(DNALength pos) {
+    PackedDNAWord offset = pos% NucsPerWord;
+    return (seq[pos/NucsPerWord] >> (3*offset)) & NucMask ;
+}
+
+Nucleotide PackedDNASequence::operator[](DNALength pos){
+    return Get(pos);
+}
+
+PackedDNASequence::PackedDNASequence() {
+    nCountInWord = 0;
+    nCountNuc = 0;
+    length = arrayLength = 0;
+    seq = NULL;
+}
+
+PackedDNASequence::~PackedDNASequence() {
+    nCountInWord = 0;
+    nCountNuc = 0;
+    length = arrayLength = 0;
+    if (seq) {
+        delete [] seq; 
+        seq = NULL;
+    }
+}
+
+void PackedDNASequence::Allocate(DNALength numberOfNucleotides) {
+    arrayLength = CeilOfFraction(numberOfNucleotides, NucsPerWord);
+    length = numberOfNucleotides;
+    if (seq) {delete [] seq; seq = NULL;}
+    if (arrayLength > 0) {
+        seq = new PackedDNAWord[arrayLength];
+        std::fill(seq, seq + arrayLength, 0);
+    }
+}
+
+void PackedDNASequence::CreateFromDNASequence(DNASequence &dnaSeq) {
+    arrayLength = CeilOfFraction(dnaSeq.length, NucsPerWord);
+    length = dnaSeq.length;
+    if (seq) {delete [] seq; seq = NULL;}
+    if (arrayLength > 0) {
+        seq = new PackedDNAWord[arrayLength];
+        DNALength pos;
+        for (pos = 0; pos < dnaSeq.length; pos++) {
+            Set(pos, ThreeBit[dnaSeq[pos]]);
+        }
+    }
+}
+
+void PackedDNASequence::Set(DNALength pos, Nucleotide threeBitValue) {
+    DNALength wordPos = pos/NucsPerWord;
+    DNALength wordOffset = pos%NucsPerWord;
+    //
+    // Pull the value to update out of memory.
+    //
+    PackedDNAWord word     = seq[wordPos];
+
+    //
+    // Expand the 3 bit value into a whole word.
+    //
+    PackedDNAWord nuc      = threeBitValue;
+
+    word = word & NegMask[wordOffset];
+    nuc  = nuc << (3*(pos%NucsPerWord));
+    word = word + nuc;
+    //
+    // Write back the whole word.
+    //
+    seq[wordPos] = word;
+}
+
+
+DNALength PackedDNASequence::CountInWord(PackedDNAWord word, PackedDNAWord wordMask, Nucleotide nuc) {
+
+    /*
+     * Count the number of times a nucleotide (3-mer) appears in a word.
+     * This is done by a series of masking and ands.
+     * The packed format is a triplet of bits (b2,b1,b0), where N is a
+     * mask bit, and n1n0 specifies the nucleotide.  
+     *
+     * The sequence CCGN appears as
+     * 001001010100
+     * 
+     * To count C's: perform xor mask with a complement mask that will
+     * produce a triplet of 111 on every position where there is a C,
+     * followed by an and with a stride-isolation mask.
+     *
+     *     b0              b1            b2            
+     *     001001010100	   001001010100  001001010100  
+     * xor 110110110110	   110110110110  110110110110
+     *     ------------	   ------------  ------------  
+     *     111111100100	   111111100100  111111100100
+
+     * and 001001001001	   010010010010  100100100100  
+     *     ------------	   ------------  ------------  
+     *     001001000000	   010010000010  000000000100  
+     *
+     * Shift b1 by 1 to get parity with b0.
+     * 010010000010 -> 001001000001
+     *                          001001000001
+     * And with b0 pattern      001001000000
+     * to count masked nucs.    ------------
+     *               nuc_count= 001001000000 
+     * Shift the b2 by 2 to set up the and-gate.
+     * 000000000100 -> 000000000001
+     * and ~MASK with nuc_count to get rid of masked columns if the
+     * whole word is not being calculated.
+     * 111111111110 & 001001000000 = 001001000000 
+     * Finally, use 64-bit multiplication bit-hack to count the number
+     * of set-bits:
+     * CountInWord(001001000000) = 2
+     *
+     */
+    PackedDNAWord w0,w1,w2, w;
+    PackedDNAWord w01, w12; 
+    Nucleotide tbn = ThreeBit[nuc];
+    PackedDNAWord xorMaskNuc = xorMask[tbn];
+    w0 = w1 = w2 = (word ^ xorMaskNuc);
+    w0 = (w0)  & Mask0All;
+    w1 = ((w1) & Mask1All) >> 1;
+    w2 = ((w2) & Mask2All) >> 2;
+    // Ideally the architecture will parallelize all these
+    // Do a cascaded.
+    //		w01 = (w0 & w1);
+    //		w12 = (w1 & w2);
+    //		w = w01 & w12;
+    w = ((w0 & w1) & w2) & wordMask;
+    //		++nCountInWord;
+    return CountBits(w);
+}
+
+DNALength PackedDNASequence::CountNuc(DNALength start, DNALength end, Nucleotide nuc) {
+    DNALength startWordIndex, endWordIndex, wordIndex;
+    DNALength startInWord, endInWord;
+    Nucleotide tbn = ThreeBit[nuc];
+    endInWord = NucsPerWord;
+    startInWord = start % NucsPerWord;
+    startWordIndex = start / NucsPerWord; 
+    endWordIndex   = end   / NucsPerWord;
+
+    // 
+    // Process all whole words.
+    //
+    DNALength nNuc = 0;
+    for (wordIndex = startWordIndex; wordIndex < endWordIndex; wordIndex++) {
+        endInWord = NucsPerWord;
+        nNuc += CountInWord(seq[wordIndex] & MaskRL[startInWord], MaskRL[startInWord], nuc);
+        startInWord = 0;
+    }
+    /* 
+     * Look to see if there is extra sequence to process when the seq
+     * does not end on a word boundary.
+     */
+    if (end % NucsPerWord != 0) {
+        endInWord = end % NucsPerWord;
+        nNuc += CountInWord(seq[wordIndex] & MaskRL[startInWord] & MaskLR[endInWord-1], 
+                MaskRL[startInWord] & MaskLR[endInWord-1], 
+                nuc);
+    }
+    //		++nCountNuc;
+    return nNuc;
+}
+
+void PackedDNASequence::Write(std::ostream &out) {
+    out.write((char*)&arrayLength, sizeof(arrayLength));
+    out.write((char*)&length, sizeof(length));
+    if (arrayLength > 0) {
+        out.write((char*)seq, sizeof(PackedDNAWord)*arrayLength);
+    }
+}
+
+void PackedDNASequence::Read(std::istream &in) {
+    in.read((char*)&arrayLength, sizeof(arrayLength));
+    in.read((char*)&length, sizeof(length));
+    if (seq) {delete [] seq; seq = NULL;}
+    if (arrayLength > 0) {
+        seq = new PackedDNAWord[arrayLength];
+        in.read((char*)seq, sizeof(PackedDNAWord)*arrayLength);
+    }
+}
+
+void PackedDNASequence::PrintUnpacked(std::ostream &out, int lineLength) {
+    DNALength p;
+    for (p = 0; p < length; p++) {
+        out << (char) ThreeBitToAscii[Get(p)];
+        if (p % lineLength == lineLength-1) {
+            out << std::endl;
+        }
+    }
+    if (p % lineLength != 0) {
+        out << std::endl;
+    }
+}
diff --git a/libcpp/pbdata/PackedDNASequence.hpp b/libcpp/pbdata/PackedDNASequence.hpp
new file mode 100644
index 0000000..d780c0e
--- /dev/null
+++ b/libcpp/pbdata/PackedDNASequence.hpp
@@ -0,0 +1,60 @@
+#ifndef _BLASR_PACKED_DNA_SEQUENCE_HPP_
+#define _BLASR_PACKED_DNA_SEQUENCE_HPP_
+
+#include <fstream>
+#include "DNASequence.hpp"
+#include "NucConversion.hpp"
+#include "utils/BitUtils.hpp"
+
+/* 
+ * Implement a structure to maintain DNA as 3 bits per nucleotide.
+ * The extra bit is required for N's in the sequence.  A key is that
+ * this structure is read-only through the operator[].  It may be set
+ * with the PackedDNASequence::Set(pos,value) command.
+ */
+
+typedef unsigned int PackedDNAWord;
+
+class PackedDNASequence {
+public:
+    static const PackedDNAWord Mask2All = 613566756; //100100100...
+    static const PackedDNAWord Mask1All = 306783378; //010010010...
+    static const PackedDNAWord Mask0All = 153391689; //001001001...
+    static const PackedDNAWord xorMask[];
+    static const PackedDNAWord NucPosMask[];
+    static const PackedDNAWord NegMask[];
+    static const PackedDNAWord MaskRL[];
+    static const PackedDNAWord MaskLR[];
+    static const PackedDNAWord NucMask = 7;
+    static const DNALength NucsPerWord = 10;
+    PackedDNAWord *seq;
+    int nCountInWord;
+    int nCountNuc;
+    DNALength length;
+    DNALength arrayLength;
+
+    Nucleotide Get(DNALength pos); 
+
+    Nucleotide operator[](DNALength pos);
+
+    PackedDNASequence(); 
+    ~PackedDNASequence(); 
+
+    void Allocate(DNALength numberOfNucleotides); 
+
+    void CreateFromDNASequence(DNASequence &dnaSeq); 
+
+    void Set(DNALength pos, Nucleotide threeBitValue); 
+
+    DNALength CountInWord(PackedDNAWord word, PackedDNAWord wordMask, Nucleotide nuc); 
+
+    DNALength CountNuc(DNALength start, DNALength end, Nucleotide nuc); 
+
+    void Write(std::ostream &out); 
+
+    void Read(std::istream &in); 
+
+    void PrintUnpacked(std::ostream &out, int lineLength = 50); 
+};
+
+#endif // _BLASR_PACKED_DNA_SEQUENCE_HPP_
diff --git a/libcpp/pbdata/ReverseCompressIndex.cpp b/libcpp/pbdata/ReverseCompressIndex.cpp
new file mode 100644
index 0000000..5179735
--- /dev/null
+++ b/libcpp/pbdata/ReverseCompressIndex.cpp
@@ -0,0 +1,40 @@
+#include <iostream>
+#include <fstream>
+#include "ReverseCompressIndex.hpp"
+
+ReverseCompressIndex::ReverseCompressIndex() {
+    index = NULL;
+    indexLength = binSize = maxRun = 0;
+}
+
+ReverseCompressIndex::~ReverseCompressIndex() {
+    ReverseCompressIndex::Free();
+}
+
+void ReverseCompressIndex::Free() {
+    if (index) {delete [] index; index = NULL;}
+    indexLength = binSize = maxRun = 0;
+}
+
+void ReverseCompressIndex::Write(std::ofstream &out) {
+    out.write((char*) &indexLength, sizeof(int));
+    out.write((char*) &binSize, sizeof(int));
+    out.write((char*) &maxRun, sizeof(int));
+    out.write((char*) index, sizeof(int) * indexLength);
+}
+
+void ReverseCompressIndex::Read(std::ifstream &in) {
+    in.read((char*) &indexLength, sizeof(int));
+    in.read((char*) &binSize, sizeof(int));
+    in.read((char*) &maxRun, sizeof(int));
+    index = new int[indexLength];
+    in.read((char*) index, sizeof(int) *indexLength);
+} 
+
+void ReverseCompressIndex::ShallowCopy(ReverseCompressIndex &rhs) {
+    ReverseCompressIndex::Free(); // Free before shallow copy.
+    index = rhs.index;
+    indexLength = rhs.indexLength;
+    binSize = rhs.binSize;
+    maxRun  = rhs.maxRun;
+}
diff --git a/libcpp/pbdata/ReverseCompressIndex.hpp b/libcpp/pbdata/ReverseCompressIndex.hpp
new file mode 100644
index 0000000..bfa2601
--- /dev/null
+++ b/libcpp/pbdata/ReverseCompressIndex.hpp
@@ -0,0 +1,25 @@
+#ifndef _BLASR_REVERSE_COMPRESS_INDEX_HPP_
+#define _BLASR_REVERSE_COMPRESS_INDEX_HPP_
+
+class ReverseCompressIndex {
+public:
+    int *index;
+    int indexLength;
+    int binSize;
+    int maxRun;
+    int size() { return indexLength;}
+
+    ReverseCompressIndex(); 
+    ~ReverseCompressIndex(); 
+
+    void Write(std::ofstream &out); 
+
+    void Read(std::ifstream &in); 
+
+    void ShallowCopy(ReverseCompressIndex &rhs);
+
+    void Free();
+};
+
+
+#endif // _BLASR_REVERSE_COMPRESS_INDEX_HPP_
diff --git a/libcpp/pbdata/SMRTSequence.cpp b/libcpp/pbdata/SMRTSequence.cpp
new file mode 100644
index 0000000..baabf57
--- /dev/null
+++ b/libcpp/pbdata/SMRTSequence.cpp
@@ -0,0 +1,283 @@
+#include <stdlib.h> 
+#include "SMRTSequence.hpp"
+
+using namespace std;
+
+void SMRTSequence::SetNull() {
+    pulseIndex    = NULL;
+    preBaseFrames = NULL;
+    widthInFrames = NULL;
+    xy[0] = 0; xy[1] = 0;
+    // These are not allocted by default.
+    meanSignal = maxSignal = midSignal = NULL;
+    classifierQV = NULL;
+    startFrame   = NULL;
+    platform     = NoPlatform;
+    // By default, allow the entire read.
+    lowQualityPrefix = lowQualitySuffix = 0;
+    highQualityRegionScore = 0;
+    // ZMWMetrics
+    for (size_t i = 0; i < 4; i++) {
+        hqRegionSnr[i] = -1;
+    }
+    readScore = -1;
+    holeNumber = static_cast<UInt>(-1);
+    readGroupId = "";
+    copiedFromBam = false;
+#ifdef USE_PBBAM
+    bamRecord = PacBio::BAM::BamRecord();
+#endif
+}
+
+SMRTSequence::SMRTSequence() : FASTQSequence() {
+    SetNull();
+}
+
+void SMRTSequence::Allocate(DNALength length) {
+    // Assert *this has no allocated space.
+    if (not (seq == NULL && preBaseFrames == NULL &&
+             widthInFrames == NULL and pulseIndex == NULL)) {
+        cout << "ERROR, trying to double-allocate memory for a SMRTSequence." << endl;
+        exit(1);
+    }
+
+    FASTQSequence::AllocateRichQualityValues(length);
+    seq           = new Nucleotide[length];
+    qual.Allocate(length);
+    preBaseFrames = new HalfWord[length];
+    widthInFrames = new HalfWord[length];
+    pulseIndex    = new int[length];
+    subreadEnd    = length;
+    deleteOnExit  = true;
+}
+
+void SMRTSequence::SetSubreadTitle(SMRTSequence &subread, DNALength subreadStart, DNALength subreadEnd) {
+    stringstream titleStream;
+    titleStream << title << "/"<< subreadStart << "_" << subreadEnd;
+    subread.CopyTitle(titleStream.str());
+}    
+
+void SMRTSequence::SetSubreadBoundaries(SMRTSequence &subread, DNALength subreadStart, DNALength subreadEnd) {
+    if (subreadEnd == -1) {
+        subreadEnd = length;
+    }
+    assert(subreadEnd - subreadStart <= length);
+    subread.subreadStart= subreadStart;
+    subread.subreadEnd  = subreadEnd;
+    SetSubreadTitle(subread, subreadStart, subreadEnd);
+}
+
+void SMRTSequence::MakeSubreadAsMasked(SMRTSequence &subread, 
+    DNALength subreadStart, int subreadEnd) {
+    subread.Free();
+    //
+    // This creates the entire subread, but masks out the portions
+    // that do not correspond to this insert.
+    //
+    static_cast<SMRTSequence*>(&subread)->Copy(*this);
+    SetSubreadBoundaries(subread, subreadStart, subreadEnd);
+    DNALength pos;
+    for (pos = 0; pos < subreadStart; pos++) { subread.seq[pos] = 'N'; }
+    for (pos = subreadEnd; pos < length; pos++) { subread.seq[pos] = 'N'; }
+    // This is newly allocated memory, free it on exit.
+    assert(subread.deleteOnExit);
+}
+
+void SMRTSequence::MakeSubreadAsReference(SMRTSequence &subread, 
+    DNALength subreadStart, int subreadEnd) {
+    subread.Free();
+    //
+    // Just create a reference to a substring of this read.  
+    //
+    static_cast<FASTQSequence*>(&subread)->ReferenceSubstring(*this, subreadStart, subreadEnd - subreadStart);
+    SetSubreadBoundaries(subread, subreadStart, subreadEnd);
+    // The subread references this read, protect the memory.
+    assert(not subread.deleteOnExit);
+}
+
+void SMRTSequence::Copy(const SMRTSequence &rhs) {
+    SMRTSequence::Copy(rhs, 0, rhs.length);
+}
+
+void SMRTSequence::Copy(const SMRTSequence &rhs, int rhsPos, int rhsLength) {
+    // Sanity check
+    CheckBeforeCopyOrReference(rhs, "SMRTSequence");
+    
+    // Free this SMRTSequence before copying anything from rhs.
+    SMRTSequence::Free();
+
+    FASTQSequence subseq; 
+    // subseq.seq is referenced, while seq.title is not, we need to call 
+    // subseq.Free() to prevent memory leak.
+    static_cast<FASTQSequence*>(&subseq)->ReferenceSubstring(rhs, rhsPos, rhsLength);
+    static_cast<FASTQSequence*>(&subseq)->CopyTitle(rhs.title, rhs.titleLength); 
+
+    if (rhs.length == 0) {
+        static_cast<FASTQSequence*>(this)->Copy(subseq);
+        //
+        // Make sure that no values of length 0 are allocated by returning here.
+        //
+    }
+    else {
+        assert(rhs.seq != seq);
+        assert(rhsLength <= rhs.length);
+        assert(rhsPos < rhs.length);
+
+        // Copy seq, title and FASTQ QVs from subseq
+        static_cast<FASTQSequence*>(this)->Copy(subseq); 
+
+        // Copy SMRT QVs
+        if (rhs.preBaseFrames != NULL) {
+            preBaseFrames = new HalfWord[length];
+            memcpy(preBaseFrames, rhs.preBaseFrames, length*sizeof(HalfWord));
+        }
+        if (rhs.widthInFrames != NULL) {
+            widthInFrames = new HalfWord[length];
+            memcpy(widthInFrames, rhs.widthInFrames, length*sizeof(HalfWord));
+        }
+        if (rhs.pulseIndex != NULL) {
+            pulseIndex = new int[length];
+            memcpy(pulseIndex, rhs.pulseIndex, sizeof(int) * length);
+        }
+    }
+
+    // Copy other member variables from rhs
+    subreadStart = rhs.subreadStart;
+    subreadEnd   = rhs.subreadEnd;
+    lowQualityPrefix = rhs.lowQualityPrefix;
+    lowQualitySuffix = rhs.lowQualitySuffix;
+    highQualityRegionScore = rhs.highQualityRegionScore;
+    zmwData = rhs.zmwData;
+
+    assert(deleteOnExit); // should have control over seq and all QVs
+
+    subseq.Free();
+    copiedFromBam = rhs.copiedFromBam;
+#ifdef USE_PBBAM
+    bamRecord = rhs.bamRecord;
+#endif
+}
+
+void SMRTSequence::Print(ostream &out) {
+    out << "SMRTSequence for zmw " << zmwData.holeNumber
+        << ", [" << subreadStart << ", " << subreadEnd << ")" << endl;
+    DNASequence::Print(out);
+}
+
+SMRTSequence& SMRTSequence::operator=(const SMRTSequence &rhs) {
+    SMRTSequence::Copy(rhs);
+    return *this;
+}
+
+void SMRTSequence::Free() {
+    if (deleteOnExit == true) {
+        if (preBaseFrames)  {
+            delete[] preBaseFrames;
+        }
+        if (widthInFrames) {
+            delete[] widthInFrames;
+        }
+        if (pulseIndex) {
+            delete[] pulseIndex;
+        }
+        if (startFrame) {
+            delete[] startFrame;
+        }
+        // meanSignal, maxSignal, midSignal and classifierQV
+        // need to be handled separatedly.
+    }
+
+    // Reset SMRT QV pointers anyway
+    preBaseFrames = NULL;
+    widthInFrames = NULL;
+    pulseIndex = NULL;
+    startFrame = NULL;
+
+    // Reset member variables
+    xy[0] = 0; xy[1] = 0;
+    lowQualityPrefix = lowQualitySuffix = 0;
+    highQualityRegionScore = 0;
+    holeNumber = static_cast<UInt>(-1);
+    readGroupId = "";
+    copiedFromBam = false;
+#ifdef USE_PBBAM
+    bamRecord = PacBio::BAM::BamRecord();
+#endif 
+
+    // Free seq, title and FASTQ QVs, also reset deleteOnExit.
+    // Don't call FASTQSequence::Free() before freeing SMRT QVs.
+    FASTQSequence::Free();
+}
+
+bool SMRTSequence::StoreXY(int16_t xyP[]) {
+    xy[0] = xyP[0];
+    xy[1] = xyP[1];
+    return true;
+}
+
+bool SMRTSequence::StorePlatformId(PlatformId pid) {
+    platform = pid;
+    return true;
+}
+
+bool SMRTSequence::StoreHoleNumber(UInt holeNumberP){ 
+    zmwData.holeNumber = holeNumber = holeNumberP;
+    return true;
+}
+
+bool SMRTSequence::StoreHoleStatus(unsigned char s) {
+    zmwData.holeStatus = s;
+    return true;
+}
+
+bool SMRTSequence::StoreZMWData(ZMWGroupEntry &data) {
+    zmwData = data;
+    return true;
+}
+
+bool SMRTSequence::GetXY(int xyP[]) {
+    xyP[0] = xy[0];
+    xyP[1] = xy[1];
+    return true;
+}
+
+bool SMRTSequence::GetHoleNumber(UInt & holeNumberP) {
+    holeNumberP = holeNumber;
+    return true;
+}
+
+std::string SMRTSequence::GetReadGroupId() {
+    return readGroupId;
+}
+
+void SMRTSequence::SetReadGroupId(const std::string & rid) {
+    readGroupId = rid;
+}
+
+#ifdef USE_PBBAM
+void SMRTSequence::Copy(const PacBio::BAM::BamRecord & record) {
+    Free();
+
+    copiedFromBam = true;
+
+    bamRecord = PacBio::BAM::BamRecord(record);
+    
+    // Only copy insertionQV, deletionQV, substitutionQV, mergeQV, 
+    // deletionTag and substitutionTag from BamRecord to SMRTSequence.
+    // Do NOT copy other SMRTQVs such as startFrame, meanSignal...
+    (static_cast<FASTQSequence*>(this))->Copy(record);
+
+    // Copy read group id from BamRecord.
+    SetReadGroupId(record.ReadGroupId());
+
+    // PacBio bam for secondary analysis does NOT carry zmw
+    // info other than holeNumber, including holeStatus, holeX,
+    // holeY, numEvents. 
+    zmwData.holeNumber = static_cast<UInt> (record.HoleNumber()); 
+
+    // Set hq region read score
+    if (record.Impl().HasTag("rq"))
+        highQualityRegionScore = record.Impl().TagValue("rq").ToInt32();
+
+}
+#endif
diff --git a/libcpp/pbdata/SMRTSequence.hpp b/libcpp/pbdata/SMRTSequence.hpp
new file mode 100644
index 0000000..f7cff1c
--- /dev/null
+++ b/libcpp/pbdata/SMRTSequence.hpp
@@ -0,0 +1,115 @@
+#ifndef _BLASR_SMRT_SEQUENCE_HPP_
+#define _BLASR_SMRT_SEQUENCE_HPP_
+
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+#include "Types.h"
+#include "Enumerations.h"
+#include "NucConversion.hpp"
+#include "FASTQSequence.hpp"
+#include "reads/RegionTable.hpp"
+#include "reads/ZMWGroupEntry.hpp"
+
+class SMRTSequence : public FASTQSequence {
+public:
+    int16_t xy[2];
+    UInt holeNumber;
+    float hqRegionSnr[4];
+    float readScore;
+    ZMWGroupEntry zmwData;
+    PlatformId platform;
+    HalfWord *preBaseFrames;
+    HalfWord *widthInFrames;
+    //
+    // The following are fields that are read in from the pulse file.
+    // Because they are not standard in bas.h5 files, these fields
+    // should not be preallocated when resizing a SMRTSequence, and
+    // memory should be managed separately.  For now, these fields all
+    // have the same length as the number of bases, but this could
+    // change so that all pulse values are stored in a SMRTSequence.
+    //
+    HalfWord *meanSignal, *maxSignal, *midSignal;
+    float *classifierQV;
+    unsigned int *startFrame;
+    int *pulseIndex;
+    DNALength lowQualityPrefix, lowQualitySuffix;
+    int highQualityRegionScore; // High quality region score in region table.
+
+protected:
+    // read group id associated with each SMRTSequence
+    std::string readGroupId; 
+
+public:
+    // Whether or not this is originally copied from a BamRecord.
+    bool copiedFromBam;
+
+    void SetNull(); 
+
+    SMRTSequence();
+    inline ~SMRTSequence();
+
+    void Allocate(DNALength length); 
+
+    void SetSubreadTitle(SMRTSequence &subread, DNALength subreadStart, 
+        DNALength subreadEnd); 
+
+    void SetSubreadBoundaries(SMRTSequence &subread, DNALength subreadStart, 
+        DNALength subreadEnd); 
+
+    void MakeSubreadAsMasked(SMRTSequence &subread, DNALength subreadStart = 0, 
+        int subreadEnd = -1); 
+
+    void MakeSubreadAsReference(SMRTSequence &subread, DNALength subreadStart = 0, 
+        int subreadEnd = -1); 
+
+    void Copy(const SMRTSequence &rhs); 
+
+    void Copy(const SMRTSequence &rhs, int rhsPos, int rhsLength); 
+
+    void Print(std::ostream &out); 
+
+    SMRTSequence& operator=(const SMRTSequence &rhs); 
+
+    void Free(); 
+
+    bool StoreXY(int16_t xyP[]); 
+
+    bool StorePlatformId(PlatformId pid); 
+
+    bool StoreHoleNumber(UInt holeNumberP);
+
+    bool StoreHoleStatus(unsigned char s); 
+
+    bool StoreZMWData(ZMWGroupEntry &data); 
+
+    bool GetXY(int xyP[]); 
+
+    bool GetHoleNumber(UInt & holeNumberP);   
+
+    // Get read group id for this sequence.
+    std::string GetReadGroupId();
+
+    // Set readGroup Id for this sequence.
+    void SetReadGroupId(const std::string & rid);
+    
+#ifdef USE_PBBAM
+public:
+    // Copy read sequence, title, holeNumber, readGroupId, and QVs
+    // (iq, dq, sq, mq, st, dt) from BamRecord to this SMRTSequence.
+    void Copy(const PacBio::BAM::BamRecord & record);
+
+    // Keep track of BamRecord from which this SMRTSequence is 
+    // originally copied. However, one should NOT assume
+    // that this SMRTSequence has the same sequence, title, QVs as 
+    // the BamRecord, because this SMRTSequence may be created by
+    // MakeSubreadAsMasked(...) or MakeRC(...).
+    PacBio::BAM::BamRecord bamRecord;
+#endif 
+};
+
+inline SMRTSequence::~SMRTSequence(){
+    SMRTSequence::Free();
+}
+#endif  // _BLASR_SMRT_SEQUENCE_HPP_
diff --git a/libcpp/pbdata/SeqUtils.hpp b/libcpp/pbdata/SeqUtils.hpp
new file mode 100644
index 0000000..8e0b087
--- /dev/null
+++ b/libcpp/pbdata/SeqUtils.hpp
@@ -0,0 +1,17 @@
+#ifndef _BLASR_SEQ_UTILS_HPP_
+#define _BLASR_SEQ_UTILS_HPP_
+
+#include "DNASequence.hpp"
+
+template< typename T_Sequence>
+int OnlyACTG(T_Sequence &seq); 
+
+template< typename T_Sequence>
+DNALength CountMasked(T_Sequence &seq); 
+
+template< typename T_Sequence>
+int CountNotMasked(T_Sequence &seq); 
+
+#include "SeqUtilsImpl.hpp"
+
+#endif // _BLASR_SEQ_UTILS_HPP_
diff --git a/libcpp/pbdata/SeqUtilsImpl.hpp b/libcpp/pbdata/SeqUtilsImpl.hpp
new file mode 100644
index 0000000..35754d9
--- /dev/null
+++ b/libcpp/pbdata/SeqUtilsImpl.hpp
@@ -0,0 +1,47 @@
+#include <vector>
+#include <iostream>
+#include <stdint.h>
+#include "utils.hpp"
+#include "DNASequence.hpp"
+#include "NucConversion.hpp"
+#include "SeqUtils.hpp"
+
+template< typename T_Sequence>
+int OnlyACTG(T_Sequence &seq) {
+    DNALength p;
+    for (p = 0; p < seq.length; p++) { 
+        if (ThreeBit[seq.seq[p]] > 3)
+            return 0;
+    }
+    return 1;
+}
+
+template< typename T_Sequence>
+DNALength CountMasked(T_Sequence &seq) {
+    DNALength p;
+    DNALength nMasked = 0;
+    for (p = 0; p < seq.length; p++) {
+        if ((seq.seq[p] >= 'a' and
+                    seq.seq[p] <= 'z') or
+                seq.seq[p] == 'N')	{
+            nMasked++;
+        }
+    }
+    return nMasked;
+}
+
+template< typename T_Sequence>
+int CountNotMasked(T_Sequence &seq) {
+    int p;
+    int nUnmasked = 0;
+    for (p = 0; p < seq.length; p++ ) {
+        if (seq.seq[p] == 'A' or
+                seq.seq[p] == 'C' or
+                seq.seq[p] == 'G' or
+                seq.seq[p] == 'T') {
+            nUnmasked++;
+        }
+    }
+
+    return nUnmasked;
+}
diff --git a/libcpp/pbdata/StringUtils.cpp b/libcpp/pbdata/StringUtils.cpp
new file mode 100644
index 0000000..2b008d4
--- /dev/null
+++ b/libcpp/pbdata/StringUtils.cpp
@@ -0,0 +1,133 @@
+#include <string>
+#include <stdint.h>
+#include <vector>
+#include <sstream>
+#include "Types.h"
+#include "MD5Utils.hpp"
+#include "StringUtils.hpp"
+
+int ExactPatternMatch(string orig, string pattern) {
+    string::size_type pos = orig.find(pattern);
+    if (pos == orig.npos) {
+        return 0;
+    }
+    else {
+        return 1;
+    }
+}
+
+void MakeMD5(const char *data, unsigned int dataLength, string &md5Str, int nChars) {
+
+    MD5 md5engine;
+    md5engine.update((unsigned char*) data, dataLength);
+    md5engine.finalize();
+
+    char *md5c_str = md5engine.hex_digest();
+    assert(md5c_str != NULL);
+    if (nChars == 0) {
+        nChars = 32;
+    }
+    md5Str.assign(md5c_str, nChars);
+    delete[] md5c_str;
+}
+
+
+void MakeMD5(string &data, string &md5Str, int nChars) {
+    MakeMD5(data.c_str(), data.size(), md5Str, nChars);
+}
+
+
+int IsWhitespace(char c) {
+    return (c == ' ' or c == '\t' or c == '\n' or c == '\r' or c == '\0');
+}
+
+int IsSpace(char c) {
+    return (c == ' ' or c == '\t');
+}
+
+int ToWords(string &orig, vector<string> &words) {
+    int curWordStart, curWordEnd;
+    curWordStart = 0;
+    while(curWordStart < orig.size()) {
+        while (curWordStart < orig.size() and IsSpace(orig[curWordStart])) { curWordStart++; }
+        curWordEnd = curWordStart;
+        while (curWordEnd < orig.size() and !IsSpace(orig[curWordEnd])) { curWordEnd++; }
+        string word;
+        if (curWordEnd != curWordStart) {
+            word.assign(orig, curWordStart, curWordEnd - curWordStart);
+            words.push_back(word);
+        }
+        curWordStart = curWordEnd;
+    }
+    return words.size();
+}
+
+// Splice a string by pattern and save to a vector of token strings.
+int Splice(const string & orig, const string & pattern, vector<string> & tokens) {
+    assert(pattern.size() > 0);
+
+    tokens.clear();
+    size_t search_start = 0;
+    size_t find_pos = orig.find(pattern, search_start);
+    while(find_pos != string::npos) {
+        string x = orig.substr(search_start, find_pos - search_start);
+        tokens.push_back(x);
+        search_start = find_pos + pattern.size();
+        find_pos = orig.find(pattern, search_start);
+    }
+    tokens.push_back(orig.substr(search_start));
+    return tokens.size();
+}
+
+void ParseSeparatedList(const string &csl, vector<string> &values, char delim) {
+    stringstream cslStrm(csl);
+    string valString;
+    string next;
+    do {
+        if (getline(cslStrm, valString, delim)) {
+            if (valString.size() > 0) {
+                values.push_back(valString);
+            }
+        }
+    }
+    while (cslStrm);
+}
+
+int AssignUntilFirstSpace(char *orig, int origLength, string &result) {
+    int i;
+    for (i = 0; i < origLength; i++ ){ 
+        if (orig[i] == ' ' or orig[i] == '\t' or orig[i] == '\n' or orig[i] == '\r' or orig[i] == '\0') {
+            break;
+        }
+    }
+    result.assign(orig, i);
+    return i;
+}
+
+string RStrip(string & fileName) {
+    // Remove right-ended spaces
+    int i = fileName.size();
+    if (i == 0) {
+        return "";
+    }
+    while (i >= 1) {
+        i--;
+        if (not IsWhitespace(fileName[i])) {
+            break;
+        }
+    }
+    return fileName.substr(0, i + 1);
+}
+
+string MakeReadGroupId(const string & movieName, const ReadType::ReadTypeEnum & readType) {
+    // PBBAM spec 3.0b5:
+    // Read Group Id is computed as MD5(${movieName}//${readType})[0:8], where
+    // movieName is PacBio platform unit id, e.g., (m140905_042...77_s1_X0),
+    // readtype is SUBREAD, CCS or UNKNOWN, 
+    // CCS reads for a movie named "movie32" would have 
+    // RGID STRING = "f5b4ffb6"
+    string seed = movieName + "//" + ReadType::ToString(readType);
+    string readGroupId;
+    MakeMD5(seed, readGroupId, 8);
+    return readGroupId;
+}
diff --git a/libcpp/pbdata/StringUtils.hpp b/libcpp/pbdata/StringUtils.hpp
new file mode 100644
index 0000000..ea895a2
--- /dev/null
+++ b/libcpp/pbdata/StringUtils.hpp
@@ -0,0 +1,71 @@
+#ifndef UTILS_STRING_UTILS_H_
+#define UTILS_STRING_UTILS_H_
+
+#include <cassert>
+#include <string>
+#include <vector>
+#include <sstream>
+#include "Types.h"
+#include "MD5Utils.hpp"
+#include "reads/ReadType.hpp"
+
+using namespace std;
+
+int ExactPatternMatch(string orig, string pattern); 
+
+void MakeMD5(const char *data, unsigned int dataLength, string &md5Str, int nChars = 0); 
+
+void MakeMD5(string &data, string &md5Str, int nChars=0); 
+
+int IsWhitespace(char c); 
+
+int IsSpace(char c); 
+
+int ToWords(string &orig, vector<string> &words); 
+
+int Splice(const string & orig, const string & pattern, vector<string> &tokens); 
+
+void ParseSeparatedList(const string &csl, vector<string> &values, char delim=','); 
+
+int AssignUntilFirstSpace(char *orig, int origLength, string &result); 
+
+template<typename T_Value>
+void ParseSeparatedList(const string &csl, vector<T_Value> &values, char delim, int maxVals) {
+  //Parse up to 'maxVals' lines of lists.
+  stringstream cslStrm(csl);
+  T_Value val;
+  string valString;
+  string next;
+  int valIndex = 0;
+  do {
+    if (maxVals == 0 or valIndex < maxVals - 1 ) {
+      getline(cslStrm, valString, delim);
+    }
+    else {
+      // If on last value, get the rest of the line.
+      getline(cslStrm, valString);
+    }
+    if (cslStrm and valString.size() > 0) {
+      stringstream valStrm(valString);
+      if (! (valStrm  >> val) ) {
+        cout << "Error, value " << valString << " is malformatted." << endl;
+      }
+      else {
+        values.push_back(val);
+      }
+    }
+    valIndex++;
+  }
+  while (cslStrm);
+}
+
+template<typename T_Value>
+void ParseSeparatedList(const string &csl, vector<T_Value> &values, char delim=',') {
+	ParseSeparatedList(csl, values, delim, 0);
+}
+
+string RStrip(string & fileName);
+
+/// \returns Read Group Id, given movieName and readType.
+string MakeReadGroupId(const string & movieName, const ReadType::ReadTypeEnum & readType);
+#endif
diff --git a/libcpp/pbdata/Types.h b/libcpp/pbdata/Types.h
new file mode 100644
index 0000000..54fb856
--- /dev/null
+++ b/libcpp/pbdata/Types.h
@@ -0,0 +1,21 @@
+#ifndef _BLASR_TYPES_H_
+#define _BLASR_TYPES_H_
+
+#include <stdint.h>
+
+typedef unsigned long ULong;
+
+// Move DNA sequence related definitions.
+typedef uint32_t DNALength;
+typedef unsigned char Nucleotide;
+
+//
+// Add definitions to handle 64/32 bit computing environments
+//
+typedef uint32_t VectorIndex;
+typedef uint32_t UInt;
+typedef uint8_t  Byte;
+typedef uint8_t  UChar;
+typedef uint16_t HalfWord;
+typedef float MatchWeight;
+#endif // _BLASR_TYPES_H_
diff --git a/libcpp/pbdata/VectorUtils.hpp b/libcpp/pbdata/VectorUtils.hpp
new file mode 100644
index 0000000..c654c9d
--- /dev/null
+++ b/libcpp/pbdata/VectorUtils.hpp
@@ -0,0 +1,17 @@
+#ifndef _BLASR_VECTOR_UTILS_HPP_
+#define _BLASR_VECTOR_UTILS_HPP_
+
+#include <vector>
+
+// Clear all memory allocated by this vector
+template <typename T>
+void ClearMemory(std::vector<T> & vt) {
+    // Create an empty vector
+    std::vector<T> emptyVector;
+    // First clear the content
+    vt.clear();
+    // Then swap vt with the empty vector 
+    vt.swap(emptyVector);
+}
+
+#endif // _BLASR_VECTOR_UTILS_HPP_
diff --git a/libcpp/pbdata/alignment/CmpAlignment.cpp b/libcpp/pbdata/alignment/CmpAlignment.cpp
new file mode 100644
index 0000000..d3569d4
--- /dev/null
+++ b/libcpp/pbdata/alignment/CmpAlignment.cpp
@@ -0,0 +1,219 @@
+#include "CmpAlignment.hpp"
+
+std::map<std::string,int> CmpAlignmentBase::columnNameToIndex;
+
+unsigned int* CmpAlignmentBase::GetAlignmentIndex() {
+    return &alignmentIndex[0];
+}
+int CmpAlignmentBase::GetAlignmentIndexSize() {
+    return alignmentIndex.size();
+}
+unsigned int CmpAlignmentBase::GetAlignedStrand() {
+    return LookupColumnValue("AlignedStrand");
+}
+
+unsigned int CmpAlignmentBase::GetRCRefStrand() {
+    return LookupColumnValue("RCRefStrand");
+}
+
+// synonym 
+unsigned int CmpAlignmentBase::GetTStrand() {
+    return GetRCRefStrand();
+}
+
+bool CmpAlignmentBase::GetX(int &xp) {
+    if (alignmentIndex.size() > 0) {
+        xp = alignmentIndex[columnNameToIndex["x"]];
+        return true;
+    }
+    else {
+        xp = -1;
+        return false;
+    }
+}
+
+unsigned int CmpAlignmentBase::GetAlignmentId() {
+    return LookupColumnValue("AlnID");
+}
+
+unsigned int CmpAlignmentBase::GetX() {
+    return LookupColumnValue("x");
+}
+
+unsigned int CmpAlignmentBase::GetY() {
+    return LookupColumnValue("y");
+}
+
+unsigned int CmpAlignmentBase::GetMovieId() {
+    return LookupColumnValue("MovieId");
+}
+
+unsigned int CmpAlignmentBase::GetAlnGroupId() {
+    return LookupColumnValue("AlnGroupId");
+}
+
+unsigned int CmpAlignmentBase::GetReadGroupId() {
+    return LookupColumnValue("ReadGroupId");
+}
+
+
+unsigned int CmpAlignmentBase::LookupColumnValue(const char * columnName) {
+    if (columnNameToIndex.find(columnName) != columnNameToIndex.end()) {
+        int columnIndex = columnNameToIndex[columnName];
+        return alignmentIndex[columnIndex];
+    }
+    else {
+        std::cout << "ERROR, For now cmp files must contain a column " << columnName << std::endl;
+        std::cout << "size of columnNameToIndex: " << columnNameToIndex.size() << std::endl;
+        assert(0);
+    }
+}		
+
+
+void CmpAlignmentBase::InitializeColumnNameToIndex(std::vector<std::string> &columnNames) {
+    int i;
+    for (i = 0; i < columnNames.size(); i++ ){
+        columnNameToIndex[columnNames[i]] = i;
+    }
+}
+
+
+unsigned int CmpAlignmentBase::GetHoleNumber() {
+    return LookupColumnValue("HoleNumber");
+}
+
+unsigned int CmpAlignmentBase::GetRefGroupId() {
+    return LookupColumnValue("RefGroupId");
+}
+
+unsigned int CmpAlignmentBase::GetRefSeqId() {
+    return LookupColumnValue("RefSeqId");
+}
+
+unsigned int CmpAlignmentBase::GetOffsetBegin() {
+    return LookupColumnValue("offset_begin");
+}
+
+unsigned int CmpAlignmentBase::GetOffsetEnd() {
+    return LookupColumnValue("offset_end");
+}
+
+unsigned int CmpAlignmentBase::GetQueryStart() {
+    return LookupColumnValue("rStart");
+}
+
+unsigned int CmpAlignmentBase::GetQueryEnd() {
+    return LookupColumnValue("rEnd");
+}
+
+unsigned int CmpAlignmentBase::GetRefStart() {
+    return LookupColumnValue("tStart");
+}
+
+unsigned int CmpAlignmentBase::GetRefEnd() {
+    return LookupColumnValue("tEnd");
+}
+
+unsigned int CmpAlignmentBase::GetNMatch() {
+    return LookupColumnValue("nM");
+}
+
+unsigned int CmpAlignmentBase::GetNMismatch() {
+    return LookupColumnValue("nMM");
+}
+
+unsigned int CmpAlignmentBase::GetNInsertions() {
+    return LookupColumnValue("nIns");
+}
+
+unsigned int CmpAlignmentBase::GetNDeletions() {
+    return LookupColumnValue("nDel");
+}
+
+unsigned int CmpAlignmentBase::GetMapQV() {
+    return LookupColumnValue("MapQV");
+}
+
+unsigned int CmpAlignmentBase::GetSubreadId() {
+    return LookupColumnValue("SubreadId");
+}
+
+unsigned int CmpAlignmentBase::GetStrobeNumber() {
+    return LookupColumnValue("StrobeNumber");
+}
+
+unsigned int CmpAlignmentBase::GetSetNumber() {
+    return LookupColumnValue("SetNumber");
+}
+
+CmpAlignmentBase::CmpAlignmentBase(PlatformId platformIdP) {
+    platformId = platformIdP;
+}
+
+void CmpAlignmentBase::SetPlatformId(PlatformId platformIdP) {
+    platformId = platformIdP;
+}
+
+// CmpAlignment
+
+CmpAlignment::CmpAlignment(PlatformId pid) : CmpAlignmentBase(pid) {
+}
+
+void CmpAlignment::StoreAlignmentIndex(unsigned int *alignmentIndexPtr, 
+    int alignmentIndexLength) {
+
+    alignmentIndex.clear();
+    alignmentIndex.insert(alignmentIndex.begin(), &alignmentIndexPtr[0], 
+        &alignmentIndexPtr[alignmentIndexLength]);
+}
+
+void CmpAlignment::StoreAlignmentArray(unsigned char* alignmentArrayPtr, 
+    int alignmentArrayLength) {
+
+    alignmentArray.resize(alignmentArrayLength);
+    unsigned int a;
+    for (a = 0; a < alignmentArrayLength; a++ ){
+        alignmentArray[a] = alignmentArrayPtr[a];
+    }
+}
+
+CmpAlignment &CmpAlignment::operator=(const CmpAlignment &rhs) {
+    // deep copy the alignment index
+    alignmentIndex.resize(rhs.alignmentIndex.size());
+    copy(rhs.alignmentIndex.begin(), rhs.alignmentIndex.end(), alignmentIndex.begin());
+    // deep copy the alignment array
+    alignmentArray.resize(rhs.alignmentIndex.size());
+    copy(rhs.alignmentArray.begin(), rhs.alignmentArray.end(), alignmentArray.begin());
+    // copy fields
+    Z = rhs.Z;
+    index = rhs.index; readGroupId = rhs.readGroupId; movieId = rhs.movieId;
+    refSeqId = rhs.refSeqId;
+    expId = rhs.expId; runId = rhs.runId; panel = rhs.panel;
+    x = rhs.x; y = rhs.y;
+    rcRefStrand = rhs.rcRefStrand;
+    holeNumber = rhs.holeNumber;
+    offsetBegin = rhs.offsetBegin; offsetEnd = rhs.offsetEnd;
+    setNumber = rhs.setNumber, strobeNumber = rhs.strobeNumber, mapQV = rhs.mapQV, nBackRead = rhs.nBackRead, nReadOverlap = rhs.nReadOverlap;
+    subreadId = rhs.subreadId;
+    nMatch = rhs.nMatch, nMismatch = rhs.nMismatch, nIns = rhs.nIns, nDel = rhs.nDel;
+    return *this;
+}
+
+int CmpAlignment::operator<(const CmpAlignment &rhs) const {
+    if (alignmentArray[1] == rhs.alignmentArray[1]) {
+        if (alignmentArray[2] == rhs.alignmentArray[2]) {
+            if (alignmentArray[10] == rhs.alignmentArray[10]) {
+                return (alignmentArray[4] < rhs.alignmentArray[4]);
+            }
+            else {
+                return alignmentArray[10] < rhs.alignmentArray[10];
+            }
+        }
+        else {
+            return alignmentArray[2] < rhs.alignmentArray[2];
+        }
+    }
+    else {
+        return alignmentArray[1] < rhs.alignmentArray[1];
+    }
+}
diff --git a/libcpp/pbdata/alignment/CmpAlignment.hpp b/libcpp/pbdata/alignment/CmpAlignment.hpp
new file mode 100644
index 0000000..484bfa1
--- /dev/null
+++ b/libcpp/pbdata/alignment/CmpAlignment.hpp
@@ -0,0 +1,126 @@
+#ifndef DATASTRUCTURES_ALIGNMENT_CMP_ALIGNMENT_H_
+#define DATASTRUCTURES_ALIGNMENT_CMP_ALIGNMENT_H_
+#include <map>
+#include <vector>
+#include <string>
+#include <iostream>
+#include <assert.h>
+#include <algorithm>
+
+#include "Types.h"
+#include "Enumerations.h"
+
+class CmpAlignmentBase  {
+public:
+    //
+    // For use in referencing alignment sets. TODO: subclass.
+    //
+    PlatformId platformId;
+    int Z;
+    unsigned int index, readGroupId, movieId, refSeqId; 
+    unsigned int expId, runId, panel;
+    unsigned int x, y;
+    unsigned int rcRefStrand;
+    unsigned int holeNumber;
+    unsigned int offsetBegin, offsetEnd;
+    unsigned int setNumber, strobeNumber, mapQV, nBackRead, nReadOverlap;
+    unsigned int subreadId;
+    unsigned int nMatch, nMismatch, nIns, nDel;
+    std::vector<unsigned char> alignmentArray;
+    std::vector<unsigned int> alignmentIndex;
+    static std::map<std::string,int> columnNameToIndex;
+    static bool initializedColumnNameToIndex;
+    std::map<std::string, std::vector<UChar> > fields;
+
+    unsigned int *GetAlignmentIndex(); 
+
+    int GetAlignmentIndexSize(); 
+
+    unsigned int GetAlignedStrand(); 
+
+    unsigned int GetRCRefStrand(); 
+
+    // synonym 
+    unsigned int GetTStrand(); 
+
+    bool GetX(int &xp); 
+
+    unsigned int GetAlignmentId(); 
+
+    unsigned int GetX(); 
+
+    unsigned int GetY(); 
+
+    unsigned int GetMovieId(); 
+
+    unsigned int GetAlnGroupId(); 
+
+    unsigned int GetReadGroupId(); 
+
+    unsigned int LookupColumnValue(const char * columnName); 
+
+    void InitializeColumnNameToIndex(std::vector<std::string> &columnNames); 
+
+    unsigned int GetHoleNumber(); 
+
+    unsigned int GetRefGroupId(); 
+
+    unsigned int GetRefSeqId(); 
+
+    unsigned int GetOffsetBegin(); 
+
+    unsigned int GetOffsetEnd(); 
+
+    unsigned int GetQueryStart();
+
+    unsigned int GetQueryEnd(); 
+
+    unsigned int GetRefStart(); 
+
+    unsigned int GetRefEnd();
+
+    unsigned int GetNMatch(); 
+
+    unsigned int GetNMismatch();
+
+    unsigned int GetNInsertions();
+
+    unsigned int GetNDeletions(); 
+
+    unsigned int GetMapQV(); 
+
+    unsigned int GetSubreadId(); 
+
+    unsigned int GetStrobeNumber(); 
+
+    unsigned int GetSetNumber(); 
+
+    CmpAlignmentBase(PlatformId platformIdP=Springfield); 
+
+    void SetPlatformId(PlatformId platformIdP); 
+};
+
+class CmpAlignment : public CmpAlignmentBase {
+public:
+    int qStrand, tStrand;
+    int qStart, qLength;
+    int tStart, tLength;
+    //
+    // Default constructor just calls the base constructor to initialize platoformType
+    CmpAlignment(PlatformId pid=Springfield);
+
+    void StoreAlignmentIndex(unsigned int *alignmentIndexPtr, int alignmentIndexLength);
+
+    void StoreAlignmentArray(unsigned char* alignmentArrayPtr, int alignmentArrayLength); 
+
+    template<typename T_Field>
+    void StoreField(std::string fieldName, T_Field* fieldValues, int length); 
+
+    CmpAlignment &operator=(const CmpAlignment &rhs); 
+
+    int operator<(const CmpAlignment &rhs) const; 
+
+};
+
+#include "CmpAlignmentImpl.hpp"
+#endif
diff --git a/libcpp/pbdata/alignment/CmpAlignmentImpl.hpp b/libcpp/pbdata/alignment/CmpAlignmentImpl.hpp
new file mode 100644
index 0000000..e8b9a5f
--- /dev/null
+++ b/libcpp/pbdata/alignment/CmpAlignmentImpl.hpp
@@ -0,0 +1,6 @@
+
+template<typename T_Field>
+void CmpAlignment::StoreField(std::string fieldName, T_Field* fieldValues, int length) {
+    fields[fieldName].resize(length);
+    memcpy(&fields[fieldName][0], fieldValues, length * sizeof(T_Field));
+}    
diff --git a/libcpp/pbdata/amos/AfgBasWriter.cpp b/libcpp/pbdata/amos/AfgBasWriter.cpp
new file mode 100644
index 0000000..2817bce
--- /dev/null
+++ b/libcpp/pbdata/amos/AfgBasWriter.cpp
@@ -0,0 +1,102 @@
+#include "AfgBasWriter.hpp"
+
+unsigned char AfgBasWriter::pacbioQVtoPhredQV(unsigned char pacbio){
+    return (unsigned char) floor( 10.0 * log10( 1.0 + pow(10.0, pacbio / 100.0) ) + 0.5 );
+}
+
+AfgBasWriter::AfgBasWriter() {
+    firstRecord = true;
+    recordCount = 1;
+    defaultQuality = 5;
+}
+
+AfgBasWriter::~AfgBasWriter() {
+    firstRecord = true;
+    recordCount = 1;
+    defaultQuality = 5;
+}
+
+void AfgBasWriter::Initialize(std::string _afgFileName){
+    afgFileName = _afgFileName;
+    CrucialOpen(afgFileName, afgOut);
+}
+
+void AfgBasWriter::Close() {
+    afgOut.close();
+}
+
+void AfgBasWriter::SetDefaultQuality(int _defaultQuality){
+    defaultQuality = _defaultQuality;
+}
+
+int AfgBasWriter::Write(SMRTSequence &seq) {
+    if (firstRecord){
+        WriteHeader();
+        firstRecord = false;
+    }
+    WriteOpen(seq);
+    WriteIdentifier(seq);
+    WriteBases(seq);
+    WriteQualities(seq);
+    WriteClose();
+    return 1;
+}
+
+void AfgBasWriter::WriteHeader() {
+    afgOut << "{UNV" << std::endl;
+    afgOut << "iid:1" << std::endl;
+    afgOut << "com:" << std::endl;
+    afgOut << "generated by AfgBasWriter" << std::endl;
+    afgOut << "Mon Jun 28 14:43:52 2010" << std::endl; // TODO put in real date
+    afgOut << "." << std::endl << "}" << std::endl;
+    afgOut << "{LIB" << std::endl << "iid:1" << std::endl;
+    afgOut << "{DST" << std::endl << "mea:0" << std::endl << "std:0" << std::endl << "}" << std::endl << "}" << std::endl;
+}
+
+void AfgBasWriter::WriteOpen(SMRTSequence &seq) {
+    afgOut << "{RED" << std::endl;
+    afgOut << "frg:" << recordCount + 1 << std::endl;
+    afgOut << "iid:" << recordCount << std::endl;
+}
+
+void AfgBasWriter::WriteIdentifier(SMRTSequence &seq) {
+    afgOut << "clr:0," << seq.length << std::endl;
+
+    afgOut << "eid:";
+    std::string fastaTitle;
+    seq.GetFASTATitle(fastaTitle);
+    afgOut << fastaTitle << std::endl;
+}
+
+void AfgBasWriter::WriteClose() {
+    recordCount++;
+    afgOut << "}" << std::endl;
+    afgOut << "{FRG" << std::endl;
+    afgOut << "iid:" << recordCount << std::endl;
+    afgOut << "lib:1" << std::endl << "typ:I" << std::endl << "}" << std::endl;
+    recordCount++;
+}
+
+void AfgBasWriter::WriteBases(SMRTSequence &seq) {
+    afgOut << "seq:" << std::endl;
+    (static_cast<DNASequence*>(&seq))->PrintSeq( afgOut, lineLength );
+    afgOut << "." << std::endl;
+}
+
+void AfgBasWriter::WriteQualities(SMRTSequence &seq) {
+    afgOut << "qlt:" << std::endl;
+    int i;
+    for (i = 0; i < seq.length; i++ ){
+        unsigned char quality =  seq.qual.data ?  seq.qual[i] : defaultQuality;
+        quality = quality + charToQuality;
+        quality = quality > maxAfgQuality ? maxAfgQuality : quality;
+        quality = quality < minAfgQuality ? minAfgQuality : quality;
+        afgOut << quality;
+        if (i > 0 and (i+1) % lineLength == 0)
+            afgOut << std::endl;
+    }
+    if (i == 0 or i % lineLength != 0) {
+        afgOut << std::endl;
+    }
+    afgOut << "." << std::endl;
+}
diff --git a/libcpp/pbdata/amos/AfgBasWriter.hpp b/libcpp/pbdata/amos/AfgBasWriter.hpp
new file mode 100644
index 0000000..c945f88
--- /dev/null
+++ b/libcpp/pbdata/amos/AfgBasWriter.hpp
@@ -0,0 +1,59 @@
+#ifndef _BLASR_AMOS_AFG_BAS_WRITER_HPP_
+#define _BLASR_AMOS_AFG_BAS_WRITER_HPP_
+
+#include <cmath>
+#include <fstream>
+#include <sstream>
+#include "SMRTSequence.hpp"
+#include "qvs/QualityValueVector.hpp"
+
+class AfgBasWriter {
+    // TODO correct file type? outFile
+    // TODO change SMRTSequence to FASTQ sequence? then maybe fasta2afg would be 
+    // easier to write
+    std::string afgFileName;
+    std::ofstream afgOut;
+    bool firstRecord;
+    int recordCount;
+    int defaultQuality;
+    // Use 122 = '{' - 1 because '{' and '}' are the message delimiters in AMOS.
+    static const unsigned char maxAfgQuality = 122; 
+    static const unsigned char charToQuality = 48;
+    static const unsigned char minAfgQuality = charToQuality + 1; 
+    static const int lineLength = 80;
+
+  private:
+
+    unsigned char pacbioQVtoPhredQV(unsigned char pacbio);
+    
+  public:
+    // Assume that closing the afg file must be done
+    // manually and not in a destructor.
+    ~AfgBasWriter();
+
+    AfgBasWriter();
+
+    void Initialize(std::string _afgFileName);
+
+    void Close();
+
+    int Write(SMRTSequence &seq);
+
+    void SetDefaultQuality(int _defaultQuality);
+
+  private:
+
+    void WriteHeader();
+
+    void WriteOpen(SMRTSequence &seq);
+
+    void WriteIdentifier(SMRTSequence &seq);
+
+    void WriteClose();
+
+    void WriteBases(SMRTSequence &seq);
+
+    void WriteQualities(SMRTSequence &seq);
+};
+
+#endif
diff --git a/libcpp/pbdata/build.mk b/libcpp/pbdata/build.mk
new file mode 120000
index 0000000..2247f36
--- /dev/null
+++ b/libcpp/pbdata/build.mk
@@ -0,0 +1 @@
+makefile
\ No newline at end of file
diff --git a/libcpp/pbdata/defs.h b/libcpp/pbdata/defs.h
new file mode 100644
index 0000000..c01d625
--- /dev/null
+++ b/libcpp/pbdata/defs.h
@@ -0,0 +1,19 @@
+#ifndef DEFS_H_
+#define DEFS_H_
+
+#ifndef MIN
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+
+#ifndef MAX
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+
+#define SWAP(a, b) (((a) == (b)) ? 0 : ((a) ^= (b), (b) ^= (a), (a) ^= (b)))
+
+#ifndef INF_INT
+#define INF_INT INT_MAX
+#endif
+
+#endif
diff --git a/libcpp/pbdata/loadpulses/MetricField.cpp b/libcpp/pbdata/loadpulses/MetricField.cpp
new file mode 100644
index 0000000..1e95a46
--- /dev/null
+++ b/libcpp/pbdata/loadpulses/MetricField.cpp
@@ -0,0 +1,87 @@
+#include "MetricField.hpp"
+
+Field::Field(std::string n, FieldType t) {
+    name = n;
+    type = t;
+}
+
+bool Field::operator==(const Field &another) const {
+    return (name == another.name && 
+            type == another.type);
+}
+
+FieldsRequirement::FieldsRequirement(const std::string & m) {
+    metric = m;
+    if (metric == "QualityValue"   ||  metric == "InsertionQV"     ||
+        metric == "MergeQV"        ||  metric == "DeletionQV"      ||
+        metric == "DeletionTag"    ||  metric == "SubstitutionTag" ||
+        metric == "SubstitutionQV" ||  metric == "PreBaseFrames"   ||
+        metric == "PulseIndex"     ||  metric == "Basecall") {
+        fieldsUseBasFile.push_back(Field (metric         , BasField));
+
+    } else if (metric == "ClassifierQV") {
+        fieldsUsePlsFile.push_back(Field (metric         , PlsField));
+        fieldsUsePlsFile.push_back(Field ("NumEvent"     , PlsField));
+        fieldsUsePlsFile.push_back(Field ("PulseIndex"   , BasField));
+
+    } else if (metric == "StartTimeOffset") {
+        fieldsUsePlsFile.push_back(Field ("StartFrame"   , PlsField));
+        fieldsUsePlsFile.push_back(Field ("NumEvent"     , PlsField));
+        fieldsUsePlsFile.push_back(Field ("PulseIndex"   , BasField));
+
+    } else if (metric == "StartFramePulse") {// Compute StartFrame from PulseCalls only
+        fieldsUsePlsFile.push_back(Field ("StartFrame"   , PlsField));
+        fieldsUsePlsFile.push_back(Field ("NumEvent"     , PlsField));
+        fieldsUsePlsFile.push_back(Field ("PulseIndex"   , BasField));
+
+    } else if (metric == "StartFrameBase") {// Compute StartFrame from BaseCalls only
+        fieldsUseBasFile.push_back(Field ("PreBaseFrames", BasField));
+        fieldsUseBasFile.push_back(Field ("WidthInFrames", BasField));
+
+    } else if (metric == "WhenStarted") {
+        // WhenStarted does not require any field because it only requires an attribute
+    
+    } else if (metric == "pkmid") {
+        fieldsUsePlsFile.push_back(Field ("MidSignal"    , PlsField));
+        fieldsUsePlsFile.push_back(Field ("NumEvent"     , PlsField));
+        fieldsUsePlsFile.push_back(Field ("PulseIndex"   , BasField));
+
+    } else if (metric == "Light") {
+        fieldsUsePlsFile.push_back(Field ("WidthInFrames", PlsField));
+        fieldsUsePlsFile.push_back(Field ("MeanSignal"   , PlsField));
+        fieldsUsePlsFile.push_back(Field ("NumEvent"     , PlsField));
+        fieldsUsePlsFile.push_back(Field ("PulseIndex"   , BasField));
+
+    } else if (metric == "PulseWidth"     ||  metric == "WidthInFrames") {
+        // Both metrics require a field "WidthInFrames", which can be read from 
+        // either bas.h5 or pls.h5.
+        fieldsUseBasFile.push_back(Field ("WidthInFrames", BasField));
+
+        fieldsUsePlsFile.push_back(Field ("WidthInFrames", PlsField));
+        fieldsUsePlsFile.push_back(Field ("NumEvent"     , PlsField));
+        fieldsUsePlsFile.push_back(Field ("PulseIndex"   , BasField));
+
+    } else if (metric == "StartFrame") { 
+        // Compute StartFrame from either PulseCalls or BaseCalls
+        fieldsUseBasFile.push_back(Field ("PreBaseFrames", BasField));
+        fieldsUseBasFile.push_back(Field ("WidthInFrames", BasField));
+
+        fieldsUsePlsFile.push_back(Field ("StartFrame"   , PlsField));
+        fieldsUsePlsFile.push_back(Field ("NumEvent"     , PlsField));
+        fieldsUsePlsFile.push_back(Field ("PulseIndex"   , BasField));
+    } else if (metric == "IPD") {
+        // IPD can be obtained from basFile.PreBaseFrames or computed from 
+        // plsFile.WidthInFrames and plsFile.StartFrame. Use the second method if possible
+        fieldsUseBasFile.push_back(Field ("PreBaseFrames", BasField));
+
+        fieldsUsePlsFile.push_back(Field ("StartFrame"   , PlsField));
+        fieldsUsePlsFile.push_back(Field ("WidthInFrames", PlsField));
+        fieldsUsePlsFile.push_back(Field ("NumEvent"     , PlsField));
+        fieldsUsePlsFile.push_back(Field ("PulseIndex"   , BasField));
+    } else if (metric == "") {
+        // No metric, no required fields.
+    } else {
+        std::cout << "ERROR, metric [" << metric << "] is not supported." << std::endl;
+        exit(1);
+    }
+}
diff --git a/libcpp/pbdata/loadpulses/MetricField.hpp b/libcpp/pbdata/loadpulses/MetricField.hpp
new file mode 100644
index 0000000..a930017
--- /dev/null
+++ b/libcpp/pbdata/loadpulses/MetricField.hpp
@@ -0,0 +1,115 @@
+#ifndef _LOADPULSES_METRICFIELD_HPP_
+#define _LOADPULSES_METRICFIELD_HPP_
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include <stdlib.h>
+
+#include "Types.h"
+
+enum FieldType {BasField, PlsField};
+
+class Field {
+public:
+    std::string name;
+    FieldType type;
+    Field(std::string n, FieldType t);
+    bool operator == (const Field &another) const;
+};
+
+class FieldsRequirement {
+public:
+    std::string metric;
+    std::vector<Field> fieldsUseBasFile;
+    std::vector<Field> fieldsUsePlsFile;
+
+    // Return fields that are required for computing this metric. 
+    // Eighteen metrics are supported in total.
+    // [1/18] metric requires only an attribute (not a field):
+    //     WhenStarted 
+    //
+    // [9/18] metrics require exactly one BaseCall field
+    //     QualityValue InsertionQV     MergeQV           DeletionQV
+    //     DeletionTag  SubstitutionTag SubstitutionQV    PreBaseFrames 
+    //     PulseIndex
+    //       
+    // [4/18] metrics require more than one field and can be computed using 
+    // only one method:
+    //                         BaseCall         PulseCall
+    //     ----------------------------------------------------
+    //     ClassifierQV        PulseIndex       NumEvent
+    //                                          ClassifierQV
+    //     ----------------------------------------------------
+    //     pkmid               PulseIndex       NumEvent
+    //                                          MidSignal
+    //     ----------------------------------------------------
+    //     Light               PulseIndex       NumEvent
+    //                                          WidthInFrames
+    //                                          MeanSignal
+    //     ----------------------------------------------------
+    //     StartTimeOffset     PulseIndex       NumEvent
+    //                                          StartFrame
+    //     ----------------------------------------------------
+    // [4/18] metrics can be computed from both BaseCalls and PulseCalls. 
+    // But sometimes the value computed from BaseCalls can be wrong, 
+    // because the value of BaseCalls/PreBaseFrames may exceed 2^16-1.
+    //                Method   BaseCall         PulseCall
+    //     ----------------------------------------------------
+    //     PulseWidth  (1)     WidthInFrames    
+    //                  =======================================
+    //                 (2)     PulseIndex       NumEvent
+    //                                          WidthInFrames    
+    //     ----------------------------------------------------
+    //     WidthInFrames  : The same as PulseWidth
+    //     ----------------------------------------------------
+    //     StartFrame  (1)     PreBaseFrames 
+    //                         WidthInFrames
+    //                  =======================================
+    //                 (2)     PulseIndex       NumEvent
+    //                                          StartFrame
+    //     ----------------------------------------------------
+    //     IPD         (1)     PreBaseFrames    
+    //                  =======================================
+    //                 (2)     PulseIndex       NumEvent
+    //                                          StartFrame
+    //                                          WidthInFrames
+    //     ----------------------------------------------------
+    // Note: PulseWidth and WidthInFrames have the same meaning and are 
+    // computed in the same way.
+    //
+    // Note: StartFrame can be loaded for both bas.h5 and pls.h5 files
+    //       for bas.h5, StartFrame is computed from PreBaseFrames and WidthInFrames
+    //           Let x = PreBaseFrames for bases 0 ... n-1, where x[0] is 0 and 
+    //                   x[i] is the inter-pulse distance between start of pulse 
+    //                   for base i and end of pulse for base i-1
+    //           Let y = WidthInFrames for bases 0 ... n-1, where y[i] is the 
+    //                   number of pulses within base i
+    //       Then, 
+    //           StartFrame[0] = x[0]
+    //           StartFrame[i] = sum(x[0] ... x[i]) + sum(y[0] ... y[i-1]) 
+    //                           for i in [1 ... n-1]
+    //       for pls.h5, StartFrame can be directly read from dataset
+    //       /PulseData/PulseCalls/StartFrame
+    //
+    // Note: StartTimeOffset is the StartFrame for the very first base of a read, it 
+    //       can only be computed from PulseCalls
+    //
+    // Note: IPD has the same meaning as PreBaseFrames:
+    //           = the inter-pulse distance between this base and end of last base,
+    //           = the number of Frames between the ending pulse of the last base and 
+    //           the starting pulse of this base.
+    //       However, PreBaseFrames can only be read directly from BaseCalls, while
+    //       IPD can also be computed from PulseCalls
+    //           If use BaseCalls, 
+    //               IPD[i] = PreBaseFrames[i]        for i in [0 ... n-1]
+    //           If use PulseCalls,
+    //               IPD[0] = 0
+    //               IPD[i] = StartFrame[i] - StartFrame[i-1] - WidthInFrames[i-1]
+    //                                                for i in [1 ... n-1]
+    //
+    //void GetRequiredFieldsForMetric(const string & metric, FieldType & field){
+    FieldsRequirement(const std::string & m);
+};
+
+#endif
diff --git a/libcpp/pbdata/loadpulses/MovieAlnIndexLookupTable.cpp b/libcpp/pbdata/loadpulses/MovieAlnIndexLookupTable.cpp
new file mode 100644
index 0000000..51140d3
--- /dev/null
+++ b/libcpp/pbdata/loadpulses/MovieAlnIndexLookupTable.cpp
@@ -0,0 +1,54 @@
+#include "MovieAlnIndexLookupTable.hpp"
+
+
+MovieAlnIndexLookupTable::MovieAlnIndexLookupTable() {
+    skip = true;
+    //skip this alignment unless we can find all the information
+}
+
+void MovieAlnIndexLookupTable::SetValue(
+                const bool & skipP,            
+                const int  & movieAlignmentIndexP,
+                const UInt & alignmentIndexP,  
+                const int  & refGroupIndexP,   
+                const int  & readGroupIndexP,  
+                const UInt & holeNumberP,
+                const UInt & offsetBeginP,     
+                const UInt & offsetEndP,
+                const int  & queryStartP,      
+                const int  & queryEndP,
+                const int  & readIndexP,
+                const int  & readStartP,       
+                const int  & readLengthP,
+                const int  & plsReadIndexP) {
+    skip = skipP; 
+    movieAlignmentIndex = movieAlignmentIndexP;
+    alignmentIndex      = alignmentIndexP;
+    refGroupIndex       = refGroupIndexP;
+    readGroupIndex      = readGroupIndexP;
+    holeNumber          = holeNumberP;
+    offsetBegin         = offsetBeginP;
+    offsetEnd           = offsetEndP;
+    queryStart          = queryStartP;
+    queryEnd            = queryEndP;
+    readIndex           = readIndexP;
+    readStart           = readStartP;
+    readLength          = readLengthP;
+    plsReadIndex        = plsReadIndexP;
+}
+
+
+void MovieAlnIndexLookupTable::print() {
+    // Print this lookup table for debugging . 
+    if (skip) 
+        std::cout << "skip = True, ";
+    else 
+        std::cout << "skip = False, ";
+    std::cout << "movieAlnIndex    = " << alignmentIndex << ", refGroupIndex = " << refGroupIndex
+            << ", readGroupIndex = " << readGroupIndex << ", holeNumber    = " << holeNumber
+            << ", offsetBegin    = " << offsetBegin    << ", offsetEnd     = " << offsetEnd
+            << ", queryStart     = " << queryStart     << ", queryEnd      = " << queryEnd
+            << ", readIndex      = " << readIndex      << ", readStart     = " << readStart
+            << ", readLength     = " << readLength     << ", plsReadIndex  = " << plsReadIndex
+            << std::endl;
+}
diff --git a/libcpp/pbdata/loadpulses/MovieAlnIndexLookupTable.hpp b/libcpp/pbdata/loadpulses/MovieAlnIndexLookupTable.hpp
new file mode 100644
index 0000000..f69811c
--- /dev/null
+++ b/libcpp/pbdata/loadpulses/MovieAlnIndexLookupTable.hpp
@@ -0,0 +1,117 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  MovieAlnIndexLookupTable.h
+ *
+ *    Description:  For cpp/pbihdfutils/LoadPulses.cpp use only.
+ *                  Cache all the information required for loading metric from pls/bas
+ *                  to cmp file.
+ *                  mapping movieAlignmentIndex in movieIndexSets[movieIndex] to:
+ *                  alignmentIndex: index of this alignment in cmpFile.alnInfo.alignments
+ *                  refGroupIndex : index of this alignment in cmpReader.refAlignGroups
+ *                  readGroupIndex: index of this alignment in cmpReader.refAlignGroups\
+ *                                  [refGroupIndex]->readGroupds[readGroupIndex]
+ *                  offsetBegin   : offset begin for this alignment in cmpFile 
+ *                                  dataset /ref/movie/AlnArray
+ *                  offsetEnd     : offset enda
+ *                  queryStart    : start position of query of this alignment 
+ *                  queryEnd      : end position of query of this alignment 
+ *                  readIndex     : index of this alignment in baseFile.readStartPositions
+ *                  readStart     : start position of this alignment in baseFile
+ *                  readLength    : read length of this alignment in baseFile
+ *                  plsReadIndex  : index of this alignment in pulseFile.pulseStartPositions
+ *                  alignedSequence
+ *                                : aligned sequence of this alignment
+ *                  
+ *        Version:  1.0
+ *        Created:  12/19/2012 03:50:21 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#ifndef _LOADPULSES_MovieAlnIndexLookupTable_HPP_
+#define _LOADPULSES_MovieAlnIndexLookupTable_HPP_
+#include <iostream>
+#include <string>
+
+#include "Types.h"
+
+class MovieAlnIndexLookupTable {
+public: 
+    bool  skip;                   
+    // as movies may split into multiple parts, skip=true if 
+    // this alignment is not found in the movie
+     
+    int   movieAlignmentIndex;    
+    // movieIndexSets[movieIndex][toFrom[movieAlignmentIndex]] 
+    
+    UInt  alignmentIndex;         
+    // cmpFile.alnInfo.alignments[alignmentIndex]
+    
+    UInt  holeNumber;
+    // holeNumber corresponding to this alignment in baseFile
+    
+    int   refGroupIndex;          
+    // cmpReader.refAlignGroups[refGroupIndex]
+    
+    int   readGroupIndex;         
+    // cmpReader.refAlignGroups[refGroupIndex]->readGroups[readGroupIndex]
+    
+    UInt  offsetBegin, offsetEnd; 
+    // offset begin and end for this alignment in /ref/movie/AlnArray
+    // = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin/End()
+    
+    int   queryStart,  queryEnd;  
+    // start/end for this read = cmpFile.alnInfo.
+    // alignments[alignmentIndex].GetQueryStart/End()
+
+    int   readIndex;              
+    // index of this alignment in baseFile.readStartPositions
+    // = index of this hole number in BaseCalls/ZMW/HoleNumber
+    // baseFile.LookupReadIndexByHoleNumber(holeNumber, out=readIndex)
+    
+    int   readStart;              
+    // start pos of this alignment in baseFile
+    // = baseFile.readStartPositions[readIndex]
+
+    int   readLength;             
+    // read length of this alignment in baseFile
+    // = baseFile.readStartPositions[readIndex+1] - readStart 
+
+    int   plsReadIndex;
+    // index of this alignment in pulseFile.pulseStartPositions
+    // = index of this hole number in PulseCalls/ZMW/HoleNumbers
+    // = pulseFile.LookupReadIndexByHoleNumber(holeNumber, out=plsReadIndex)
+
+    // vector<int> baseToAlignmentMap; 
+    // keep all the baseToAlignmentMap in memory for now
+    // Note that baseToAlignmentMap is not initialized when 
+    // BuildLookupTable is called.
+   
+    std::string alignedSequence;
+
+    MovieAlnIndexLookupTable();
+
+    void SetValue(const bool & skipP,            
+                  const int  & movieAlignmentIndexP,
+                  const UInt & alignmentIndexP,  
+                  const int  & refGroupIndexP,   
+                  const int  & readGroupIndexP,  
+                  const UInt & holeNumberP,
+                  const UInt & offsetBeginP,     
+                  const UInt & offsetEndP,
+                  const int  & queryStartP,      
+                  const int  & queryEndP,
+                  const int  & readIndexP,
+                  const int  & readStartP,       
+                  const int  & readLengthP,
+                  const int  & plsReadIndexP);
+
+    void print();
+};
+#endif
diff --git a/libcpp/pbdata/makefile b/libcpp/pbdata/makefile
new file mode 100644
index 0000000..fd4a65c
--- /dev/null
+++ b/libcpp/pbdata/makefile
@@ -0,0 +1,40 @@
+all:
+
+include ../rules.mk
+include ../defines.mk
+
+CXXOPTS  += -std=c++11 -pedantic -MMD -MP
+CPPFLAGS += -I. -Imatrix -Ireads -Iqvs -Imetagenome -Isaf -Iutils -Ialignment
+INCLUDES += ${PBBAM_INCLUDE} ${HTSLIB_INCLUDE} ${BOOST_INCLUDE}
+DEP_LIBS += ${PBBAM_LIB} ${HTSLIB_LIB}
+LDFLAGS  += $(patsubst %,$(dirname %),${DEP_LIBS})
+
+all: libpbdata.a libpbdata.so
+
+sources := $(wildcard *.cpp) \
+	       $(wildcard matrix/*.cpp) \
+	       $(wildcard reads/*.cpp) \
+	       $(wildcard metagenome/*.cpp) \
+	       $(wildcard qvs/*.cpp) \
+	       $(wildcard saf/*.cpp) \
+	       $(wildcard utils/*.cpp) \
+	       $(wildcard loadpulses/*.cpp) \
+	       $(wildcard alignment/*.cpp) \
+	       $(wildcard amos/*.cpp) \
+	       $(wildcard sam/*.cpp) 
+
+objects := $(sources:.cpp=.o)
+shared_objects := $(sources:.cpp=.shared.o)
+dependencies := $(objects:.o=.d) $(shared_objects:.o=.d)
+
+libpbdata.a: $(objects)
+	$(AR) $(ARFLAGS) $@ $^
+
+libpbdata.so: $(shared_objects) $(DEP_LIBS)
+	$(CXX) $(LD_SHAREDFLAGS) -o $@ -Wl,-soname,$@ $^
+
+clean: 
+	@rm -f libpbdata.a  libpbdata.so
+	@rm -f $(objects) $(shared_objects) $(dependencies)
+
+-include $(dependencies)
diff --git a/libcpp/pbdata/matrix/FlatMatrix.hpp b/libcpp/pbdata/matrix/FlatMatrix.hpp
new file mode 100644
index 0000000..1664f9e
--- /dev/null
+++ b/libcpp/pbdata/matrix/FlatMatrix.hpp
@@ -0,0 +1,98 @@
+#ifndef _BLASR_FLAT_MATRIX_HPP_
+#define _BLASR_FLAT_MATRIX_HPP_
+
+#define rc2index(r, c, rowSize) ( (r) * (rowSize) + c)
+
+template<typename T>
+void CreateFlatMatrix(int rows, int cols, std::vector<T> &matrix); 
+
+template<typename T>
+void PrintFlatMatrix(std::vector<T> &matrix, int rows, int cols, std::ostream &out, int width=6); 
+
+template<typename T>
+void PrintFlatMatrix(const T* matrix, int rows, int cols, std::ostream &out, int width=6); 
+
+template<typename T>
+class FlatMatrix2D {
+ public:
+	T* matrix;
+	int nRows, nCols;
+	int totalSize;
+	int RC2Index(int row, int col); 
+
+	FlatMatrix2D();
+
+    ~FlatMatrix2D();
+
+	T* operator[](int row); 
+
+	T operator()(int row, int col); 
+
+	unsigned int Size(); 
+
+    void Fill(T value) {
+        fill(matrix, &matrix[totalSize], value);
+    }
+
+	void Resize(int _nRows, int _nCols) {
+        Grow(_nRows, _nCols);
+    }
+
+	void Resize(unsigned int totalSize);
+
+	FlatMatrix2D(int _nRows, int _nCols); 
+
+    void Clear() {
+        if (matrix) {delete[] matrix;}
+        matrix = NULL;
+        nRows = nCols = 0;
+        totalSize = 0;
+    }
+
+
+	void Grow(int _nRows, int _nCols); 
+
+	T Get(int r, int c); 
+
+	T Set(int r, int c, T v); 
+	
+	int Index(int r, int c); 
+	
+	void Print(std::ostream &out); 
+
+	void Allocate(UInt _nRows, UInt _nCols); 
+
+	void Initialize(T value); 
+};
+
+
+template<typename T>
+class FlatMatrix3D {
+ public:
+	T* matrix;
+	// 
+	// For some reason it makes sense to go from rows,cols to x,y,z 
+	// for referencing coordinates.
+	//
+	int nx, ny, nz;
+	int xy;
+	int totalSize;
+
+	FlatMatrix3D(); 
+
+	FlatMatrix3D(int _nx, int _ny, int _nz); 
+
+	void Grow(int _nx, int _ny, int _nz); 
+
+	int Index(int x, int y, int z); 
+	
+	T Get(int x, int y, int z); 
+	
+	T Set(int x, int y, int z, T v);
+	
+    ~FlatMatrix3D();
+};
+		
+#include "FlatMatrixImpl.hpp"
+	
+#endif // _BLASR_FLAT_MATRIX_HPP_
diff --git a/libcpp/pbdata/matrix/FlatMatrixImpl.hpp b/libcpp/pbdata/matrix/FlatMatrixImpl.hpp
new file mode 100644
index 0000000..5536cb7
--- /dev/null
+++ b/libcpp/pbdata/matrix/FlatMatrixImpl.hpp
@@ -0,0 +1,192 @@
+#include <stdint.h>
+#include <vector>
+#include <iostream>
+#include <assert.h>
+#include "Types.h"
+#include "FlatMatrix.hpp"
+
+template<typename T>
+void CreateFlatMatrix(int rows, int cols, std::vector<T> &matrix) {
+	matrix.resize(rows*cols);
+}
+
+template<typename T>
+void PrintFlatMatrix(std::vector<T> &matrix, int rows, int cols, std::ostream &out, int width) {
+	PrintFlatMatrix((const T*) &matrix[0], rows, cols, out, width);
+}
+
+template<typename T>
+void PrintFlatMatrix(const T* matrix, int rows, int cols, std::ostream &out, int width) { 
+	int r, c, i;
+	i = 0;
+	for (r = 0; r < rows; r++ ) {
+		for (c = 0; c < cols; c++ ) {
+			out.width(width);
+			out << matrix[i] << " ";
+			i++;
+		}
+		out << std::endl;
+	}
+}
+
+template<typename T>
+int FlatMatrix2D<T>::RC2Index(int row, int col) {
+    return row * nCols + col;
+}
+
+template<typename T>
+T* FlatMatrix2D<T>::operator[](int row) {
+    return &matrix[row*nCols];
+}
+
+template<typename T>
+T FlatMatrix2D<T>::operator()(int row, int col) {
+    int index = RC2Index(row,col);
+    return matrix[index];
+}
+
+template<typename T>
+FlatMatrix2D<T>::FlatMatrix2D() {
+    matrix = NULL;
+    nRows = nCols = totalSize = 0;
+}
+
+template<typename T>
+unsigned int FlatMatrix2D<T>::Size() {
+    return nRows * nCols;
+}
+
+template<typename T>
+void FlatMatrix2D<T>::Resize(unsigned int _totalSize) {
+    if (matrix != NULL) {
+        delete[] matrix;
+    }
+    matrix = new T[_totalSize];
+    totalSize = _totalSize;
+}
+
+template<typename T>
+FlatMatrix2D<T>::FlatMatrix2D(int _nRows, int _nCols) {
+    totalSize = 0;
+    matrix = NULL;
+    //		assert(_nRows > 0);
+    //		assert(_nCols > 0);
+    if (_nRows == 0 or _nCols == 0) {
+        nRows = _nRows; nCols = _nCols;
+        return;
+    }
+    else {
+        Grow(_nRows, _nCols);
+    }
+}
+template<typename T>
+void FlatMatrix2D<T>::Grow(int _nRows, int _nCols) {
+    nRows = _nRows;
+    nCols = _nCols;
+    if (nRows * nCols > totalSize) {
+        if (totalSize != 0 && matrix)
+            delete[] matrix;
+        totalSize = nRows * nCols;
+        matrix = new T[totalSize];
+    }
+}
+
+template<typename T>
+T FlatMatrix2D<T>::Get(int r, int c) {
+    return matrix[r * nCols + c];
+}
+
+template<typename T>
+T FlatMatrix2D<T>::Set(int r, int c, T v) {
+    return matrix[r*nCols+c] = v;
+}
+
+template<typename T>
+int FlatMatrix2D<T>::Index(int r, int c) {
+    return r*nCols + c;
+}
+
+template<typename T>
+void FlatMatrix2D<T>::Print(std::ostream &out) {
+    PrintFlatMatrix(matrix, nRows, nCols, out);
+}
+
+template<typename T>
+void FlatMatrix2D<T>::Allocate(UInt _nRows, UInt _nCols) {
+    nRows = _nRows;
+    nCols = _nCols;
+    matrix = new T[nRows * nCols];
+}
+
+template<typename T>
+void FlatMatrix2D<T>::Initialize(T value) {
+    T* matPtr, *matEnd;
+    matEnd = &matrix[nRows*nCols];
+    for (matPtr = &matrix[0]; matPtr != matEnd; ++matPtr) {
+        *matPtr = value;
+    }
+}
+
+template<typename T>
+FlatMatrix2D<T>::~FlatMatrix2D(){
+    if (matrix != NULL) {
+        delete [] matrix;
+        matrix = NULL;
+    }
+}
+
+template<typename T>
+FlatMatrix3D<T>::FlatMatrix3D() {
+    nx = 0, ny = 0, nz = 0;
+    xy = 0;
+    totalSize = 0;
+    matrix = NULL;
+}
+
+template<typename T>
+FlatMatrix3D<T>::FlatMatrix3D(int _nx, int _ny, int _nz) {
+    totalSize = 0;
+    matrix =NULL;
+    assert(_nx > 0);
+    assert(_ny > 0);
+    assert(_nz > 0);
+    Grow(_nx, _ny, _nz);
+}
+
+template<typename T>
+void FlatMatrix3D<T>::Grow(int _nx, int _ny, int _nz) {
+    nx = _nx;
+    ny = _ny;
+    nz = _nz;
+    if (nx * ny * nz > totalSize) {
+        if (matrix != NULL) {
+            delete[] matrix;
+        }
+        totalSize = nx*ny*nz;
+        matrix = new T[totalSize];
+    }
+    xy = nx*ny;
+}
+
+template<typename T>
+int FlatMatrix3D<T>::Index(int x, int y, int z) {
+    return z * xy + y * nx + x;
+}
+
+template<typename T>
+T FlatMatrix3D<T>::Get(int x, int y, int z) {
+    return matrix[Index(x,y,z)];
+}
+
+template<typename T>
+T FlatMatrix3D<T>::Set(int x, int y, int z, T v){ 
+    return matrix[Index(x,y,z)] = v;
+}
+
+template<typename T>
+FlatMatrix3D<T>::~FlatMatrix3D() {
+    if (matrix != NULL) {
+        delete [] matrix;
+        matrix = NULL;
+    }
+}
diff --git a/libcpp/pbdata/matrix/Matrix.hpp b/libcpp/pbdata/matrix/Matrix.hpp
new file mode 100644
index 0000000..3ef6bca
--- /dev/null
+++ b/libcpp/pbdata/matrix/Matrix.hpp
@@ -0,0 +1,50 @@
+#ifndef _BLASR_MATRIX_HPP_
+#define _BLASR_MATRIX_HPP_
+
+#include <vector>
+#include "Types.h"
+
+template<typename T>
+void CreateMatrix(int rows, int cols, std::vector<T*> matrix); 
+
+/*
+ *	Implement a matrix as an array into a large allocated buffer of size
+ *	nRows * nCols.
+ */
+
+template<typename T>
+class Matrix {
+private:
+    VectorIndex nRows;
+    VectorIndex nCols;
+    T** matrix;
+    VectorIndex matrixBufferSize;
+    VectorIndex matrixSize;
+    VectorIndex rowsBufferSize;
+public:
+    Matrix(); 
+
+    unsigned int size(); 
+
+    unsigned int GetNCols(); 
+
+    unsigned int GetNRows(); 
+
+    void Resize(VectorIndex nRowsP, VectorIndex nColsP); 
+
+    Matrix(VectorIndex nRowsP, VectorIndex nColsP); 
+
+    void Reference(Matrix<T> &rhs); 
+
+    void Initialize(T value); 
+
+    T* operator[](VectorIndex rowIndex); 
+
+    void Free(); 
+
+    void Print(std::ofstream &out); 
+};
+
+#include "MatrixImpl.hpp"
+	
+#endif // _BLASR_MATRIX_HPP_
diff --git a/libcpp/pbdata/matrix/MatrixImpl.hpp b/libcpp/pbdata/matrix/MatrixImpl.hpp
new file mode 100644
index 0000000..c66aaf4
--- /dev/null
+++ b/libcpp/pbdata/matrix/MatrixImpl.hpp
@@ -0,0 +1,117 @@
+#ifndef _BLASR_MATRIX_IMPL_HPP
+#define _BLASR_MATRIX_IMPL_HPP
+#include <cassert>
+#include <vector>
+#include <iostream>
+#include <fstream>
+#include <stdint.h>
+#include "Types.h"
+
+template<typename T>
+void CreateMatrix(int rows, int cols, std::vector<T*> matrix) {
+	matrix.resize(rows);
+    if (matrix[0]) {delete [] matrix[0]; matrix[0] = NULL;}
+	matrix[0] = new T[rows*cols];
+	VectorIndex r = 1;
+	for (r = 1; r < rows; r++) {
+		matrix[r] = &matrix[cols * r];
+	}
+}
+
+template<typename T>
+Matrix<T>::Matrix() {
+    nRows = 0;
+    rowsBufferSize = 0;
+    nCols = 0;
+    matrixBufferSize = 0;
+    matrix = NULL;
+}
+
+template<typename T>
+unsigned int Matrix<T>::size() {
+    return nRows * nCols;
+}
+
+template<typename T>
+unsigned int Matrix<T>::GetNCols() {
+    return nCols;
+}
+
+template<typename T>
+unsigned int Matrix<T>::GetNRows() {
+    return nRows;
+}
+
+template<typename T>
+void Matrix<T>::Resize(VectorIndex nRowsP, VectorIndex nColsP) {
+
+    nRows = nRowsP;
+    nCols = nColsP;
+    matrixSize = nRows * nCols;
+    if (nRows * nCols > matrixBufferSize) {
+        matrixBufferSize = nRows * nCols;
+        if (nRows > rowsBufferSize) {
+            if (matrix != NULL) { 
+                delete[] matrix; matrix = NULL; 
+            }
+        }
+        if (matrix == NULL) {
+            matrix = new T*[nRows];
+        }
+        else {
+            if (matrix[0] != NULL) {
+                delete[] matrix[0]; matrix[0] = NULL;
+            }
+        }
+        matrix[0] = new T[matrixBufferSize];
+        VectorIndex rowIndex;
+        for (rowIndex = 1; rowIndex < nRows; rowIndex++ ){
+            matrix[rowIndex] = &matrix[0][nCols * rowIndex];
+        }
+    }
+}
+
+template<typename T>
+Matrix<T>::Matrix(VectorIndex nRowsP, VectorIndex nColsP) {
+    Resize(nRowsP, nColsP);
+}
+
+template<typename T>
+void Matrix<T>::Reference(Matrix<T> &rhs) {
+    matrix = rhs.matrix;
+}
+
+template<typename T>
+void Matrix<T>::Initialize(T value) {
+    std::fill(&matrix[0][0], &matrix[0][matrixSize], value);
+}
+
+template<typename T>
+T* Matrix<T>::operator[](VectorIndex rowIndex) {
+    assert(rowIndex < nRows);
+    return matrix[rowIndex];
+}
+
+template<typename T>
+void Matrix<T>::Free() {
+    if (matrix != NULL) {
+        if (matrix[0] != NULL) {
+            delete[] matrix[0];
+        }
+        delete[] matrix;
+    }
+    matrix = NULL;
+}
+
+template<typename T>
+void Matrix<T>::Print(std::ofstream &out) {
+    VectorIndex i;
+    VectorIndex j;
+    for (i = 0; i < nRows; i++) {
+        for (j = 0; j < nCols; j++ ){ 
+            out << matrix[i][j] << " ";
+        }
+        out << std::endl;
+    }
+}
+#endif
diff --git a/libcpp/pbdata/metagenome/FindRandomSequence.hpp b/libcpp/pbdata/metagenome/FindRandomSequence.hpp
new file mode 100644
index 0000000..cb5ab3c
--- /dev/null
+++ b/libcpp/pbdata/metagenome/FindRandomSequence.hpp
@@ -0,0 +1,70 @@
+#ifndef _FIND_RANDOM_SEQUENCE_HPP_
+#define _FIND_RANDOM_SEQUENCE_HPP_
+
+#include <vector>
+#include "DNASequence.hpp"
+#include "statistics/StatUtils.hpp"
+
+
+template<typename T_Sequence>
+void FindRandomPos(vector<T_Sequence> &sequences, DNALength &seqIndex, DNALength &seqPos, DNALength seqLength=0 ) {
+    vector<UInt> cumulativeLengths;
+    cumulativeLengths.resize(sequences.size());
+    int i;
+    if (sequences.size() == 0) {
+        return;
+    }
+    DNALength cumulativeLength;
+    cumulativeLengths[0] = sequences[0].length;
+    cumulativeLength = cumulativeLengths[0];
+    for (i = 1; i < sequences.size(); i++) {
+        cumulativeLengths[i] = cumulativeLength = cumulativeLengths[i-1] + sequences[i].length;
+    }
+    bool validPosFound = false;
+    int iter = 0;
+    int max_iter = 100000;
+    while (validPosFound == false and iter < max_iter) {
+        ++iter;
+        if (seqLength > cumulativeLength) {
+            validPosFound = false;
+            iter = max_iter;
+            break;
+        }
+        DNALength pos = RandomUnsignedInt(cumulativeLength - seqLength);
+        // Make sure this sequence fits 
+        for (seqIndex = 0; seqIndex < sequences.size(); seqIndex++) {
+            if (cumulativeLengths[seqIndex] > pos) break;
+        }
+        if (cumulativeLengths[seqIndex] - pos < seqLength) {
+            continue;
+        }
+        UInt pi;
+        if (seqIndex == 0) {
+            seqPos = pos;
+        }
+        else {
+            seqPos = pos - cumulativeLengths[seqIndex-1];
+        }
+        bool seqContainsN = false;
+        for (pi = seqPos; pi < seqPos + seqLength; pi++) {
+            if (toupper(sequences[seqIndex].seq[pi]) == 'N') {
+                seqContainsN = true;
+                break;
+            }
+        }
+        if (seqContainsN) {
+            continue;
+        }
+        else {
+            validPosFound = true;
+        }
+    }
+    if (iter == max_iter) {
+        cout << "ERROR! Unable to generate a random seq/pos pair!, maybe length " << seqLength << endl
+            << " is too high, or there are too many N's in the references." << endl;
+        exit(1);
+    }
+}
+
+
+#endif
diff --git a/libcpp/pbdata/metagenome/SequenceIndexDatabase.hpp b/libcpp/pbdata/metagenome/SequenceIndexDatabase.hpp
new file mode 100644
index 0000000..7a43cba
--- /dev/null
+++ b/libcpp/pbdata/metagenome/SequenceIndexDatabase.hpp
@@ -0,0 +1,96 @@
+#ifndef _BLASR_SEQUENCE_INDEX_DATABASE_HPP_
+#define _BLASR_SEQUENCE_INDEX_DATABASE_HPP_
+
+#include <fstream>
+#include <iostream>
+#include <vector>
+#include <assert.h>
+#include <stdlib.h>
+#include <sstream>
+#include <cstring>
+#include <algorithm>
+#include "Types.h"
+#include "DNASequence.hpp"
+#include "StringUtils.hpp"
+
+
+#define SEQUENCE_INDEX_DATABASE_MAGIC 1233211233
+
+template<typename TSeq>
+class SequenceIndexDatabase {
+public:
+    std::vector<DNALength> growableSeqStartPos;
+    std::vector<std::string> growableName;
+
+	DNALength *seqStartPos;
+	bool deleteSeqStartPos;
+	char **names;
+	bool deleteNames;
+	int  *nameLengths;
+	bool deleteNameLengths;
+	int  nSeqPos;
+	bool deleteStructures;
+    //
+    // This is stored after reading in the sequence.
+    //
+    std::vector<std::string> md5;
+
+    SequenceIndexDatabase(int final=0);
+    ~SequenceIndexDatabase();
+
+    DNALength GetLengthOfSeq(int seqIndex);
+
+    // Return index of a reference sequence with name "seqName".
+    int GetIndexOfSeqName(std::string seqName);
+
+    void GetName(int seqIndex, std::string &name);
+
+    void MakeSAMSQString(std::string &sqString);
+
+    DNALength ChromosomePositionToGenome(int chrom, DNALength chromPos);
+
+    int SearchForIndex(DNALength pos);
+
+    std::string GetSpaceDelimitedName(unsigned int index);
+
+    int SearchForStartBoundary(DNALength pos);
+
+    int SearchForEndBoundary(DNALength pos);
+
+    DNALength SearchForStartAndEnd(DNALength pos, DNALength &start,
+        DNALength &end);
+
+    void WriteDatabase(ofstream &out);
+
+   	void ReadDatabase(ifstream &in);
+
+	void SequenceTitleLinesToNames();
+
+   	VectorIndex AddSequence(TSeq &sequence);
+
+   	void Finalize();
+
+	void FreeDatabase();
+};
+
+
+template< typename TSeq >
+class SeqBoundaryFtr {
+public:
+    SequenceIndexDatabase<TSeq> *seqDB;
+
+    SeqBoundaryFtr(SequenceIndexDatabase<TSeq> *_seqDB);
+
+    int GetIndex(DNALength pos);
+
+    int GetStartPos(int index);
+
+    DNALength operator()(DNALength pos);
+
+    // This is misuse of a functor, but easier interface coding for now.
+    DNALength Length(DNALength pos);
+};
+
+#include "metagenome/SequenceIndexDatabaseImpl.hpp"
+
+#endif
diff --git a/libcpp/pbdata/metagenome/SequenceIndexDatabaseImpl.hpp b/libcpp/pbdata/metagenome/SequenceIndexDatabaseImpl.hpp
new file mode 100644
index 0000000..e26f61e
--- /dev/null
+++ b/libcpp/pbdata/metagenome/SequenceIndexDatabaseImpl.hpp
@@ -0,0 +1,347 @@
+#ifndef _BLASR_SEQUENCE_INDEX_DATABASE_IMPL_HPP_
+#define _BLASR_SEQUENCE_INDEX_DATABASE_IMPL_HPP_
+
+template<typename TSeq>
+SequenceIndexDatabase<TSeq>::
+SequenceIndexDatabase(int final) {
+    nSeqPos = 0;
+    if (!final) {
+        growableSeqStartPos.push_back(0);
+    }
+    names = NULL; deleteNames = false;
+    nameLengths = NULL; deleteNameLengths = false;
+    seqStartPos = NULL; deleteSeqStartPos = false;
+    deleteStructures = false;
+}
+
+template<typename TSeq>
+SequenceIndexDatabase<TSeq>::
+~SequenceIndexDatabase() {
+    FreeDatabase();
+}
+
+template<typename TSeq>
+DNALength SequenceIndexDatabase<TSeq>::
+GetLengthOfSeq(int seqIndex) {
+    assert(seqIndex < nSeqPos-1);
+    return seqStartPos[seqIndex+1] - seqStartPos[seqIndex] - 1;
+}
+
+// Return index of a reference sequence with name "seqName".
+template<typename TSeq>
+int SequenceIndexDatabase<TSeq>::
+GetIndexOfSeqName(std::string seqName) {
+    for(int i = 0; i < nSeqPos - 1; i++) {
+        if (seqName == std::string(names[i])) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+template<typename TSeq>
+void SequenceIndexDatabase<TSeq>::
+GetName(int seqIndex, std::string &name) {
+    assert(seqIndex < nSeqPos-1);
+    name = names[seqIndex];
+}
+
+template<typename TSeq>
+void SequenceIndexDatabase<TSeq>::
+MakeSAMSQString(std::string &sqString) {
+    std::stringstream st;
+    int i;
+    for (i = 0; i < nSeqPos-1; i++) {
+        st << "@SQ\tSN:" << names[i] << "\tLN:" << GetLengthOfSeq(i);
+        if (md5.size() == nSeqPos-1) {
+            st << "\tM5:" << md5[i];
+        }
+        st << endl;
+    }
+    sqString = st.str();
+}
+
+template<typename TSeq>
+DNALength SequenceIndexDatabase<TSeq>::
+ChromosomePositionToGenome(int chrom, DNALength chromPos) {
+    assert(chrom < nSeqPos);
+    return seqStartPos[chrom] + chromPos;
+
+}
+
+template<typename TSeq>
+int SequenceIndexDatabase<TSeq>::
+SearchForIndex(DNALength pos) {
+    // The default behavior for the case
+    // that there is just one genome.
+    if (nSeqPos == 1) {
+        return 0;
+    }
+
+    DNALength* seqPosIt = upper_bound(seqStartPos+1, 
+        seqStartPos + nSeqPos, pos);
+
+    return seqPosIt - seqStartPos - 1;
+}
+
+template<typename TSeq>
+std::string SequenceIndexDatabase<TSeq>::
+GetSpaceDelimitedName(unsigned int index) {
+    int pos;
+    assert(index < nSeqPos);
+    std::string name;
+    for (pos = 0; pos < nameLengths[index]; pos++) {
+        if (names[index][pos] == ' ' or 
+            names[index][pos] == '\t' or 
+            names[index][pos] == '\0') {
+            break;
+        }
+    }
+    name.assign(names[index], pos);
+    return name;
+}
+
+template<typename TSeq>
+int SequenceIndexDatabase<TSeq>::
+SearchForStartBoundary(DNALength pos) {
+
+    int index = SearchForIndex(pos);
+    if (index != -1) {
+        return seqStartPos[index];
+    }
+    else {
+        return -1;
+    }
+}
+
+
+template<typename TSeq>
+int SequenceIndexDatabase<TSeq>::
+SearchForEndBoundary(DNALength pos) {
+
+    int index = SearchForIndex(pos);
+    if (index != -1) {
+        return seqStartPos[index + 1];
+    }
+    else {
+        return -1;
+    }
+}
+
+
+template<typename TSeq>
+DNALength SequenceIndexDatabase<TSeq>::
+SearchForStartAndEnd(DNALength pos, DNALength &start, DNALength &end) {
+    int index = SearchForIndex(pos);
+    if (index != -1) {
+        start = seqStartPos[index];
+        end   = seqStartPos[index+1];
+        return 1;
+    }
+    else {
+        start = end = -1;
+        return 0;
+    }
+}
+
+
+template<typename TSeq>
+void SequenceIndexDatabase<TSeq>::
+WriteDatabase(std::ofstream &out) {
+    int mn = SEQUENCE_INDEX_DATABASE_MAGIC;
+    out.write((char*) &mn, sizeof(int));
+    out.write((char*) &nSeqPos, sizeof(int));
+    out.write((char*) seqStartPos, sizeof(DNALength) * nSeqPos);
+    int nSeq = nSeqPos - 1;
+    out.write((char*) nameLengths, sizeof(int) * nSeq);
+    int i;
+    //
+    // The number of sequences is 1 less than the number of positions
+    // since the positions include 0 as a boundary.
+    //
+    char nullchar = '\0';
+    for (i = 0; i < nSeq; i++) { 
+        //
+        // nameLengths has space for the null char, so the length of the
+        // name = nameLengths[i]-1. Write a nullchar to disk so that it
+        // may be read in later with no work.
+        // 
+        out.write((char*) names[i], sizeof(char) * (nameLengths[i]-1));
+        out.write((char*) &nullchar, sizeof(char));
+    }
+}
+
+
+template<typename TSeq>
+void SequenceIndexDatabase<TSeq>::
+ReadDatabase(std::ifstream &in) {
+    int mn;
+    // Make sure this is a read database, since the binary input
+    // is not syntax checked.
+    in.read((char*) &mn, sizeof(int));
+    if (mn != SEQUENCE_INDEX_DATABASE_MAGIC) {
+        std::cout << "ERROR: Sequence index database is corrupt!" << std::endl;
+        exit(1);
+    }
+
+    //
+    // Read in the boundaries of each sequence.
+    //
+    deleteStructures = true;
+
+    in.read((char*) &nSeqPos, sizeof(int));
+    assert(seqStartPos == NULL);
+    seqStartPos = new DNALength[nSeqPos];
+    deleteSeqStartPos = true;
+    in.read((char*) seqStartPos, sizeof(DNALength) * nSeqPos);
+    int nSeq = nSeqPos - 1;
+
+    // Get the lengths of the strings to read.
+    assert(nameLengths == NULL);
+    nameLengths = new int[nSeq];
+    deleteNameLengths = true;
+    in.read((char*)nameLengths, sizeof(int) * nSeq);
+
+    // Get the titles of the sequences.
+    assert(names == NULL); // Otherwise need to delete names; 
+    names = new char*[nSeq];
+    deleteNames = true;
+    char *namePtr;
+    int i;
+    for (i = 0; i < nSeq; i++) { 
+        namePtr = new char[nameLengths[i]];
+        if (nameLengths[i] > 0) {
+            in.read(namePtr, nameLengths[i]);
+        }
+        namePtr[nameLengths[i]-1] = '\0';
+        names[i] = namePtr;
+    }
+}
+
+template<typename TSeq>
+void SequenceIndexDatabase<TSeq>::
+SequenceTitleLinesToNames() {
+    int seqIndex;
+    std::vector<std::string> tmpNameArray;
+    for (seqIndex = 0; seqIndex < nSeqPos-1; seqIndex++) {
+        std::string tmpName;
+        AssignUntilFirstSpace(names[seqIndex], nameLengths[seqIndex], tmpName);
+        if (names[seqIndex]) {delete[] names[seqIndex];}
+        names[seqIndex] = new char[tmpName.size()+1];
+        strcpy(names[seqIndex], tmpName.c_str());
+        names[seqIndex][tmpName.size()] = '\0';
+        nameLengths[seqIndex] = tmpName.size();
+        tmpNameArray.push_back(tmpName);
+    }
+    // Make sure that reference names are unique.
+    sort(tmpNameArray.begin(), tmpNameArray.end());
+    for(int j = 0; j < tmpNameArray.size() - 1; j++) {
+        if (tmpNameArray[j] == tmpNameArray[j+1]) {
+            std::cout << "Error, reference with name \"" 
+                      << tmpNameArray[j] 
+                      << "\" in the reference genome is not unique"
+                      << std::endl;
+            exit(1);
+        }
+    }
+}
+
+template<typename TSeq>
+VectorIndex SequenceIndexDatabase<TSeq>::
+AddSequence(TSeq &sequence) {
+    int endPos = growableSeqStartPos[growableSeqStartPos.size() - 1];
+    int growableSize = growableSeqStartPos.size();
+    growableSeqStartPos.push_back(endPos + sequence.length + 1);
+    std::string fastaTitle;
+    sequence.GetFASTATitle(fastaTitle);
+    growableName.push_back(fastaTitle);
+    return growableName.size();
+}
+
+template<typename TSeq>
+void SequenceIndexDatabase<TSeq>::
+Finalize() {
+    deleteStructures  = true;
+    seqStartPos = &growableSeqStartPos[0];
+    nSeqPos = growableSeqStartPos.size();
+    int nSeq = nSeqPos - 1;
+
+    assert(names==NULL);
+    names = new char*[nSeq];
+    deleteNames = true;
+    unsigned int i;
+    if (nameLengths) {delete [] nameLengths; nameLengths = NULL;}
+    nameLengths = new int[nSeq];
+    deleteNameLengths = true;
+    for (i = 0; i < nSeq; i++) {
+        names[i] = new char[growableName[i].size() + 1];
+
+        memcpy((char*) names[i], (char*) growableName[i].c_str(), 
+            growableName[i].size());
+
+        names[i][growableName[i].size()] = '\0';
+        nameLengths[i] = growableName[i].size() + 1;
+    }
+}
+
+
+template<typename TSeq>
+void SequenceIndexDatabase<TSeq>::
+FreeDatabase() {
+    int i;
+    if (deleteStructures == false) {
+        return;
+    }
+    if (names != NULL and deleteNames) {
+        int nSeq = nSeqPos - 1;
+        for (i = 0; i < nSeq; i++ ){
+            delete[] names[i];
+        }
+        delete[] names;
+        names = NULL;
+    }
+    if (nameLengths != NULL and deleteNameLengths) {
+        delete[] nameLengths;
+        nameLengths = NULL;
+    }
+    if (seqStartPos != NULL and deleteSeqStartPos) {
+        delete[] seqStartPos;
+        seqStartPos = NULL;
+    }
+}
+
+
+template< typename TSeq >
+SeqBoundaryFtr<TSeq>::
+SeqBoundaryFtr(SequenceIndexDatabase<TSeq> *_seqDB) {
+    seqDB = _seqDB;
+}
+
+template< typename TSeq >
+int SeqBoundaryFtr<TSeq>::
+GetIndex(DNALength pos) {
+    return seqDB->SearchForIndex(pos);
+}
+
+template< typename TSeq >
+int SeqBoundaryFtr<TSeq>::
+GetStartPos(int index) {
+    assert(index < seqDB->nSeqPos);
+    return seqDB->seqStartPos[index];
+}
+
+template< typename TSeq >
+DNALength SeqBoundaryFtr<TSeq>::
+ operator()(DNALength pos) {
+    return seqDB->SearchForStartBoundary(pos);
+}
+
+template< typename TSeq >
+DNALength SeqBoundaryFtr<TSeq>::
+Length(DNALength pos) {
+    DNALength start, end;
+    seqDB->SearchForStartAndEnd(pos, start, end);
+    return end - start;
+}
+
+#endif
diff --git a/libcpp/pbdata/metagenome/TitleTable.cpp b/libcpp/pbdata/metagenome/TitleTable.cpp
new file mode 100644
index 0000000..078da23
--- /dev/null
+++ b/libcpp/pbdata/metagenome/TitleTable.cpp
@@ -0,0 +1,109 @@
+#include "TitleTable.hpp"
+
+TitleTable::TitleTable() {
+    table = NULL;
+    tableLength = 0;
+}
+
+TitleTable::~TitleTable() {
+    Free();
+}
+
+void TitleTable::Copy(char **src, int nSrc) {
+    Free(); //Free before copy
+    table = new char*[nSrc];
+    tableLength = nSrc;
+    int i;
+    for (i = 0; i < nSrc; i++ ){
+        int lenStrI = strlen(src[i]);
+        table[i] = new char[lenStrI+1];
+        memcpy(table[i], src[i], lenStrI);
+        table[i][lenStrI] = '\0';
+    }
+}
+
+void TitleTable::Write(std::string &name) {
+    std::ofstream out;
+    CrucialOpen(name, out, std::ios::out);
+    Write(out);
+}
+
+void TitleTable::Write(std::ofstream &out) {
+    int i;
+    for (i = 0; i < tableLength;i++) {
+        out << table[i] << std::endl;
+    }
+}
+
+void TitleTable::Read(std::string &inFileName) {
+    std::ifstream in;
+    CrucialOpen(inFileName, in, std::ios::in);
+    Read(in);
+}
+
+void TitleTable::CopyFromVector(std::vector<std::string> &titles) {
+    Free(); //Free before copy.
+    tableLength = titles.size();
+    table = new char*[tableLength];
+    int i;
+    for (i = 0; i < tableLength; i++) {
+        table[i] = new char[titles[i].size() + 1];
+        memcpy(table[i], titles[i].c_str(), titles[i].size());
+        table[i][titles[i].size()] = '\0';
+    }
+}
+
+void TitleTable::Read(std::ifstream &in) {
+    std::vector<std::string> titles;
+    while(in) {
+        char title[1024];
+        in.getline(title, 1024);
+        if (not std::string(title).empty()) 
+            titles.push_back(title);
+    }
+    if (titles.size() > 0) {
+        CopyFromVector(titles);
+    }
+    else {
+        tableLength = 0;
+        table = NULL;
+    }
+}
+
+void TitleTable::Free() {
+    int i;
+    for (i = 0; i < tableLength; i++) {
+        if (table[i]) {delete[] table[i]; table[i] = NULL;}
+    }
+    if (table) {delete[] table;};
+    table = NULL;
+    tableLength = 0;
+}
+
+bool TitleTable::Lookup(std::string title, int &index) {
+    int i;
+    for (i = 0; i < tableLength; i++) {
+        if (table[i] == title) { 
+            index = i; 
+            return true;
+        }
+    }
+    return false;
+}
+    
+void TitleTable::ResetTableToIntegers(char **table, 
+    int *tableLengths, int nTable) {
+
+    int i;
+    for (i = 0; i < nTable; i++ ) {
+        delete[] table[i];
+        std::stringstream namestrm;
+        namestrm << i;
+        std::string name;
+        name = namestrm.str();
+        table[i] = new char[name.size()+1];
+        memcpy( table[i], name.c_str(), name.size());
+        table[i][name.size()] = '\0';
+        tableLengths[i] = (int) name.size() + 1;
+    }
+}
diff --git a/libcpp/pbdata/metagenome/TitleTable.hpp b/libcpp/pbdata/metagenome/TitleTable.hpp
new file mode 100644
index 0000000..14b23a7
--- /dev/null
+++ b/libcpp/pbdata/metagenome/TitleTable.hpp
@@ -0,0 +1,39 @@
+#ifndef _BLASR_TITLE_TABLE_HPP_
+#define _BLASR_TITLE_TABLE_HPP_
+
+#include <sstream>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <string.h>
+#include <vector>
+#include "utils.hpp"
+
+class TitleTable {
+public: 
+    char **table;
+    int tableLength;
+    TitleTable();
+    ~TitleTable();
+
+    void Copy(char **src, int nSrc);
+
+    void Write(std::string &name);
+
+    void Write(std::ofstream &out);
+
+    void Read(std::string &inFileName);
+
+    void CopyFromVector(std::vector<std::string> &titles);
+
+    void Read(std::ifstream &in);
+
+    void Free();
+
+    bool Lookup(std::string title, int &index) ;
+
+    static void ResetTableToIntegers(char **table, 
+        int *tableLengths, int nTable);
+};
+
+#endif
diff --git a/libcpp/pbdata/mklibconfig.sh b/libcpp/pbdata/mklibconfig.sh
new file mode 100755
index 0000000..e438893
--- /dev/null
+++ b/libcpp/pbdata/mklibconfig.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+fn=$1
+use_pbbam=$2
+# If $fn exists, then guarantee its contents are correct.
+# If not, write the proper contents.
+# This way, 'make' will not have to re-create a perfectly fine file,
+# which would cause all other targets to be remade.
+
+use0=$(cat <<'EOF'
+EOF
+)
+
+use1=$(cat <<'EOF'
+#define USE_PBBAM
+EOF
+)
+
+if [ "${use_pbbam}" == "YES" ]; then
+    wanted=$use1
+else
+    wanted=$use0
+fi
+
+if [ -r $fn ]; then
+    actual=$(<"${fn}")
+else
+    actual="EMPTY"
+fi
+
+if [ "$wanted" != "$actual" ]; then
+    echo "$wanted" > $fn
+fi
diff --git a/libcpp/pbdata/old.Makefile b/libcpp/pbdata/old.Makefile
new file mode 100644
index 0000000..a01c77e
--- /dev/null
+++ b/libcpp/pbdata/old.Makefile
@@ -0,0 +1,87 @@
+# Let common.mk know that that the third party checks should be ignored
+COMMON_NO_THIRD_PARTY_REQD := true
+
+include ../common.mk
+
+CXXOPTS := -std=c++11 -pedantic -MMD -MP
+INCLUDES := -I. -Imatrix -Ireads -Iqvs -Imetagenome -Isaf -Iutils -Ialignment
+
+# To enable building a shared library, invoke as "make SHARED_LIB=true ..."
+ifneq ($(SHARED_LIB),)
+    # Generating shared library
+    CXX_SHAREDFLAGS := -fPIC
+    LD_SHAREDFLAGS  := -shared -fPIC
+    TARGET_LIB      := libpbdata.so
+    # Developers should set these to appropriate defaults (other systems 
+    # will override these on the command line):
+    PBBAM_LIB      := ../../../staging/PostPrimary/pbbam/_output/install-build/lib/libpbbam.so
+    HTSLIB_LIB       := ../../../staging/PostPrimary/htslib/_output/install-build/lib/libhts.so
+else
+    # Generating static library
+    CXX_SHAREDFLAGS :=
+    TARGET_LIB      := libpbdata.a
+    LD_SHAREDFLAGS  :=
+    HTSLIB_LIB      :=
+    PBBAM_LIB       := 
+endif
+
+DEP_LIBS := $(HTSLIB_LIB) $(PBBAM_LIB)
+
+PBBAM_INCLUDE := $(PBBAM)/include
+HTSLIB_INCLUDE ?= $(HTSLIB)
+
+sources := $(wildcard *.cpp) \
+	       $(wildcard matrix/*.cpp) \
+	       $(wildcard reads/*.cpp) \
+	       $(wildcard metagenome/*.cpp) \
+	       $(wildcard qvs/*.cpp) \
+	       $(wildcard saf/*.cpp) \
+	       $(wildcard utils/*.cpp) \
+	       $(wildcard loadpulses/*.cpp) \
+	       $(wildcard alignment/*.cpp) \
+	       $(wildcard amos/*.cpp) \
+	       $(wildcard sam/*.cpp) 
+
+objects := $(sources:.cpp=.o)
+shared_objects := $(sources:.cpp=.shared.o)
+dependencies := $(objects:.o=.d) $(shared_objects:.o=.d)
+
+all : CXXFLAGS ?= -O3
+
+debug : CXXFLAGS ?= -g -ggdb -fno-inline
+
+profile : CXXFLAGS ?= -Os -pg
+
+g: CXXFLAGS = -g -ggdb -fno-inline -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fno-omit-frame-pointer 
+
+all debug profile g: mklibconfig $(TARGET_LIB)
+
+ifeq ($(origin nopbbam), undefined)
+    INCLUDES += -I$(PBBAM_INCLUDE) -I$(HTSLIB_INCLUDE) -I$(BOOST_INCLUDE)
+    USE_PBBAM:=YES
+else
+    USE_PBBAM:=NO
+endif
+
+mklibconfig:
+	./mklibconfig.sh libconfig.h ${USE_PBBAM}
+
+libpbdata.a: $(objects)
+	$(AR_pp) $(ARFLAGS) $@ $^
+
+libpbdata.so: $(shared_objects) $(DEP_LIBS)
+	$(CXX_pp) $(LD_SHAREDFLAGS) -o $@ $^
+
+%.o: %.cpp
+	$(CXX_pp) $(CXXOPTS) $(CXXFLAGS) $(INCLUDES) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o) $(@:%.o=%.d)" -c $< -o $@
+
+%.shared.o: %.cpp
+	$(CXX_pp) $(CXX_SHAREDFLAGS) $(CXXOPTS) $(CXXFLAGS) $(INCLUDES) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o) $(@:%.o=%.d)" -c $< -o $@
+
+# .INTERMEDIATE: $(objects)
+
+clean: 
+	@rm -f libpbdata.a  libpbdata.so
+	@rm -f $(objects) $(shared_objects) $(dependencies)
+
+-include $(dependencies)
diff --git a/libcpp/pbdata/qvs/QualityTransform.cpp b/libcpp/pbdata/qvs/QualityTransform.cpp
new file mode 100644
index 0000000..45ec117
--- /dev/null
+++ b/libcpp/pbdata/qvs/QualityTransform.cpp
@@ -0,0 +1,23 @@
+#include <cassert>
+#include "QualityTransform.hpp"
+/*
+* Base lookup table class for quality values.
+*/
+
+float QualityToProb::operator()(int index) {
+    assert(index >= 0);
+    assert(index <= MAX_QUALITY_VALUE);
+    return prob[index];
+}
+
+/* 
+* Create a lookup table for transforming from quality value
+* to p-value using Patrick Marks' low-end expand qv = -100*log10(p/(1-p))
+*/
+void LowEndExpandQualityTransform::operator()(QualityToProb &qt) {
+    int i;
+    for (i = MIN_QUALITY_VALUE; i <= MAX_QUALITY_VALUE; i++) {
+        float v = pow(10,i/-100.0);
+        qt.prob[i] = 1 - v/(1+v);
+    }
+}
diff --git a/libcpp/pbdata/qvs/QualityTransform.hpp b/libcpp/pbdata/qvs/QualityTransform.hpp
new file mode 100644
index 0000000..73c8f27
--- /dev/null
+++ b/libcpp/pbdata/qvs/QualityTransform.hpp
@@ -0,0 +1,26 @@
+#ifndef _BLASR_QVS_QUALITY_TRANSFORM_HPP_
+#define _BLASR_QVS_QUALITY_TRANSFORM_HPP_
+
+#include <math.h>
+#include "QualityValue.hpp"
+
+/*
+ * Base lookup table class for quality values.
+ */
+class QualityToProb {
+public:
+    float prob[MAX_QUALITY_VALUE - MIN_QUALITY_VALUE + 1];
+    float operator()(int index);
+};
+
+/* 
+ * Create a lookup table for transforming from quality value
+ * to p-value using Patrick Marks' low-end expand qv = -100*log10(p/(1-p))
+ */
+class LowEndExpandQualityTransform {
+public:
+    void operator()(QualityToProb &qt); 
+};
+
+
+#endif // _BLASR_QVS_QUALITY_TRANSFORM_HPP_
diff --git a/libcpp/pbdata/qvs/QualityValue.cpp b/libcpp/pbdata/qvs/QualityValue.cpp
new file mode 100644
index 0000000..e9f1775
--- /dev/null
+++ b/libcpp/pbdata/qvs/QualityValue.cpp
@@ -0,0 +1,65 @@
+#include <math.h>
+#include "defs.h"
+#include <assert.h>
+#include "QualityValue.hpp"
+
+QualityValue 
+ProbabilityToQualityValue(QualityProbability pErr, QVScale qvScale) {
+    if (qvScale == POverOneMinusP) {
+        QualityProbability pe;
+        QualityProbability maxReportedErrorProb = 0.499;
+        pe = MIN(pErr, maxReportedErrorProb);
+        return MIN(255, -100*log10(pe/(1-pe)));
+    }
+    else if (qvScale == PHRED) {
+        return -10*log10(pErr);
+    } else {
+        assert(false);
+    }
+}
+
+QualityValue 
+PacBioQVToPhred(QualityValue pbQV) {
+    // yanked from Aaron's code.
+    return (unsigned char) floor( 10.0 * log10( 1.0 + pow(10.0, pbQV / 100.0) ) + 0.5 );
+}
+
+QualityValue 
+ToPhred(QualityValue qv, QVScale qvScale) {
+    // 
+    // Nothing to do when the quality is already in phred.
+    //
+    if (qvScale == PHRED) {
+        return qv;
+    }
+    else {
+        return PacBioQVToPhred(qv);
+    }
+}
+
+
+QualityProbability 
+QualityValueToProbability(QualityValue qv, QVScale qvScale) {
+    if (qvScale == POverOneMinusP) {
+        QualityProbability pp;
+        pp = pow(10, qv/-100.0);
+        return pp/(1+pp);
+    }
+    else if (qvScale == PHRED) {
+        return pow(10, qv/-10.0);
+    } else {
+        assert(false);
+    }
+}
+
+QVScale DetermineQVScaleFromChangeListID(ChangeListID &cl) {
+    ChangeListID phredCL;
+    phredCL.intVer.resize(3);
+    phredCL.intVer[0] = 1; phredCL.intVer[1] = 2; phredCL.intVer[2] = 2;
+    if (cl.LessThan(phredCL)) {
+        return POverOneMinusP;
+    }
+    else {
+        return PHRED;
+    }
+}
diff --git a/libcpp/pbdata/qvs/QualityValue.hpp b/libcpp/pbdata/qvs/QualityValue.hpp
new file mode 100644
index 0000000..9def8e5
--- /dev/null
+++ b/libcpp/pbdata/qvs/QualityValue.hpp
@@ -0,0 +1,31 @@
+#ifndef _BLASR_QUALITY_VALUE_HPP_
+#define _BLASR_QUALITY_VALUE_HPP_
+
+#include <stdint.h>
+#include "ChangeListID.hpp"
+
+typedef unsigned char QualityValue;
+typedef float QualityProbability;
+
+#define MIN_QUALITY_VALUE 0
+#define MAX_QUALITY_VALUE 255
+
+#ifndef _QVScale_
+#define _QVScale_
+enum QVScale {POverOneMinusP, // popularized by Illumina
+              PHRED};
+#endif
+
+QualityValue ProbabilityToQualityValue(
+    QualityProbability pErr, QVScale qvScale=POverOneMinusP); 
+
+QualityValue PacBioQVToPhred(QualityValue pbQV); 
+
+QualityValue ToPhred(QualityValue qv, QVScale qvScale=POverOneMinusP); 
+
+QualityProbability QualityValueToProbability(QualityValue qv, 
+    QVScale qvScale=POverOneMinusP); 
+	
+QVScale DetermineQVScaleFromChangeListID(ChangeListID &cl); 
+
+#endif // _BLASR_QUALITY_VALUE_HPP_
diff --git a/libcpp/pbdata/qvs/QualityValueVector.hpp b/libcpp/pbdata/qvs/QualityValueVector.hpp
new file mode 100644
index 0000000..8e3ae5d
--- /dev/null
+++ b/libcpp/pbdata/qvs/QualityValueVector.hpp
@@ -0,0 +1,47 @@
+#ifndef _BLASR_QUALITY_VALUE_VECTOR_HPP_
+#define _BLASR_QUALITY_VALUE_VECTOR_HPP_
+#include <stdint.h>
+#include <cstddef>
+#include <ostream>
+#include <cstring>
+#include "Types.h"
+#include "utils.hpp"
+#include "QualityValue.hpp"
+
+template<typename T_QV>
+class QualityValueVector {
+public:
+    T_QV   *data;
+    QVScale qvScale;
+
+    T_QV &operator[](unsigned int pos) const; 
+
+    QualityValueVector(); 
+
+    QualityProbability ToProbability(unsigned int pos); 
+
+    T_QV ToPhred(unsigned int pos); 
+
+    void Copy(const QualityValueVector<T_QV> &rhs, const DNALength length); 
+
+    void Copy(const std::string & rhs);
+
+    void Free(); 
+
+    void Allocate(unsigned int length); 
+
+    bool Empty() const; 
+
+    void ShallowCopy(const QualityValueVector<T_QV> &ref, int pos, const DNALength & length); 
+
+    std::string ToString(void);
+
+    // Returns data length 
+    DNALength Length(void);
+
+private:
+    DNALength _length;
+};
+
+#include "QualityValueVectorImpl.hpp"
+#endif // _BLASR_QUALITY_VALUE_VECTOR_HPP_
diff --git a/libcpp/pbdata/qvs/QualityValueVectorImpl.hpp b/libcpp/pbdata/qvs/QualityValueVectorImpl.hpp
new file mode 100644
index 0000000..7d33266
--- /dev/null
+++ b/libcpp/pbdata/qvs/QualityValueVectorImpl.hpp
@@ -0,0 +1,99 @@
+#ifndef _BLASR_QUALITY_VALUE_VECTOR_IMPL_HPP_
+#define _BLASR_QUALITY_VALUE_VECTOR_IMPL_HPP_
+#include "NucConversion.hpp"
+
+template<typename T_QV>
+T_QV& QualityValueVector<T_QV>::operator[](unsigned int pos) const {
+    return data[pos];
+}
+
+template<typename T_QV>
+QualityValueVector<T_QV>::QualityValueVector() {
+    data = NULL;
+    // Default to phred.
+    qvScale = PHRED;
+    _length = 0;
+}
+
+template<typename T_QV>
+QualityProbability QualityValueVector<T_QV>::ToProbability(unsigned int pos) {
+    return QualityValueToProbability(data[pos], qvScale);
+}
+
+template<typename T_QV>
+T_QV QualityValueVector<T_QV>::ToPhred(unsigned int pos) {
+    if (qvScale == PHRED) {
+        return data[pos];
+    }
+    else {
+        return PacBioQVToPhred(data[pos]);
+    }
+}
+
+template<typename T_QV>
+void QualityValueVector<T_QV>::Copy(const QualityValueVector<T_QV> &rhs, const DNALength length) {
+    Free();
+    if (rhs.Empty()) { 
+        return;
+    }
+    Allocate(length);
+    std::memcpy(data, rhs.data, length * sizeof(T_QV));
+}
+
+template<typename T_QV>
+void QualityValueVector<T_QV>::Copy(const std::string & rhs) {
+// Char to QualityValue
+    Free();
+    if (rhs.size() == 0) return;
+    Allocate(static_cast<DNALength>(rhs.size()));
+    for (size_t i = 0; i < rhs.size(); i++) {
+        data[i] = static_cast<T_QV>(rhs[i] - FASTQ_CHAR_TO_QUALITY);
+    }
+}
+
+template<typename T_QV>
+void QualityValueVector<T_QV>::Free() {
+    if (data != NULL) {
+        delete[] data;
+        data = NULL;
+    }
+    _length = 0;
+}
+
+template<typename T_QV>
+void QualityValueVector<T_QV>::Allocate(unsigned int length) {
+    data = ProtectedNew<T_QV>(length);
+    _length = static_cast<DNALength>(length);
+}
+
+template<typename T_QV>
+bool QualityValueVector<T_QV>::Empty() const {
+    return data == NULL;
+}
+
+template<typename T_QV>
+void QualityValueVector<T_QV>::ShallowCopy(const QualityValueVector<T_QV> &ref, int pos, const DNALength & length) {
+    data = &ref.data[pos];
+    qvScale = ref.qvScale;
+    _length = static_cast<DNALength>(length);
+}
+
+template<typename T_QV>
+std::string QualityValueVector<T_QV>::ToString(void) {
+    if (data == NULL) { return "";}
+
+    std::string str(static_cast<size_t>(_length), '0');
+    for (DNALength i = 0; i < _length; i++) {
+        str[i] = static_cast<char>(data[i] + FASTQ_CHAR_TO_QUALITY);
+    }
+    return str;
+}
+
+template<typename T_QV>
+DNALength QualityValueVector<T_QV>::Length(void) {
+    return _length;
+}
+
+template class QualityValueVector<QualityValue>;
+
+#endif
diff --git a/libcpp/pbdata/reads/BaseFile.cpp b/libcpp/pbdata/reads/BaseFile.cpp
new file mode 100644
index 0000000..bf4c56a
--- /dev/null
+++ b/libcpp/pbdata/reads/BaseFile.cpp
@@ -0,0 +1,82 @@
+#include <algorithm>
+#include "BaseFile.hpp"
+
+bool CompareHoleXY::operator()(const HoleXY &lhs, const HoleXY &rhs) const {
+    if (lhs.xy[0] == rhs.xy[0]) {
+        return lhs.xy[1] < rhs.xy[1];
+    }
+    else {
+        return lhs.xy[0] < rhs.xy[0];
+    }
+}
+
+bool BaseFile::LookupReadIndexByXY(uint16_t x, uint16_t y, int &index) {
+    int16_t xy[2];
+    xy[0] = x; xy[1] = y;
+    std::vector<HoleXY>::iterator holeIt;
+    holeIt = lower_bound(holeXY.begin(), holeXY.end(), xy);
+    if ((*holeIt).xy[0] == xy[0] and (*holeIt).xy[1] == xy[1]) {
+        index = holeIt - holeXY.begin();
+        return true;
+    }
+    else {
+        return false;
+    }
+}
+
+
+void BaseFile::CopyReadAt(uint32_t readIndex, SMRTSequence &read) {
+    assert(holeNumbers.size() > readIndex);
+    read.zmwData.holeNumber = holeNumbers[readIndex];
+    if (holeXY.size() > 0) {
+        assert(holeXY.size() > readIndex);
+        read.zmwData.x = holeXY[readIndex].xy[0];
+        read.zmwData.y = holeXY[readIndex].xy[1];
+    }
+
+    int startPos = readStartPositions[readIndex];
+    int readLength = readLengths[readIndex];
+    read.length = readLength;
+    read.Allocate(readLength);
+    if (baseCalls.size() > 0) {
+        assert(baseCalls.size() >= readLength + startPos);
+        CopyArray(baseCalls, startPos, readLength, read.seq);
+    }
+    if (qualityValues.size() > 0) {
+        assert(qualityValues.size() >= readLength + startPos);
+        CopyArray(qualityValues, startPos, readLength, read.qual.data);
+    }
+    if (basWidthInFrames.size() > 0) {
+        assert(basWidthInFrames.size() >= readLength + startPos);
+        CopyArray(basWidthInFrames, startPos, readLength, read.widthInFrames);
+    }
+    if (deletionQV.size() > 0) {
+        assert(deletionQV.size() >= readLength + startPos);
+        CopyArray(deletionQV, startPos, readLength, read.deletionQV.data);
+    }
+    if (deletionTag.size() > 0) {
+        assert(deletionTag.size() >= readLength + startPos);
+        CopyArray(deletionTag, startPos, readLength, read.deletionTag);
+    }
+    if (insertionQV.size() > 0) {
+        assert(insertionQV.size()  >= readLength + startPos);
+        CopyArray(insertionQV, startPos, readLength, read.insertionQV.data);
+    }
+    if (substitutionQV.size() > 0) {
+        assert(substitutionQV.size() >= readLength + startPos);
+        CopyArray(substitutionQV, startPos, readLength, read.substitutionQV.data);
+    }
+    if (mergeQV.size() > 0) {
+        assert(mergeQV.size() >= readLength + startPos);
+        CopyArray(mergeQV, startPos, readLength, read.mergeQV.data);
+    }
+    if (substitutionTag.size() > 0) {
+        assert(substitutionTag.size() >= readLength + startPos);
+        CopyArray(substitutionTag, startPos, readLength, read.substitutionTag);
+    }
+    if (preBaseFrames.size() > 0) {
+        assert(preBaseFrames.size() >= readLength + startPos);
+        CopyArray(preBaseFrames, startPos, readLength, read.preBaseFrames);
+    }
+
+}
diff --git a/libcpp/pbdata/reads/BaseFile.hpp b/libcpp/pbdata/reads/BaseFile.hpp
new file mode 100644
index 0000000..d3b6afb
--- /dev/null
+++ b/libcpp/pbdata/reads/BaseFile.hpp
@@ -0,0 +1,49 @@
+#ifndef _BLASR_BASE_FILE_HPP_
+#define _BLASR_BASE_FILE_HPP_
+
+#include <stdint.h>
+#include <vector>
+#include "Enumerations.h"
+#include "SMRTSequence.hpp"
+
+#include "HoleXY.hpp"
+#include "PulseBaseCommon.hpp"
+#include "ScanData.hpp"
+
+class CompareHoleXY {
+public:
+    bool operator()(const HoleXY &lhs, const HoleXY &rhs) const; 
+};
+
+class BaseFile : public PulseBaseCommon {
+public:
+    std::vector<unsigned char> baseCalls;
+    std::vector<uint8_t> holeStatus;
+    std::vector<HoleXY>   holeXY;
+    std::vector<uint16_t> basWidthInFrames;
+    std::vector<uint16_t> preBaseFrames;
+    std::vector<int> pulseIndex;
+    std::vector<unsigned char> qualityValues;
+    std::vector<unsigned char> deletionQV;
+    std::vector<unsigned char> deletionTag;
+    std::vector<unsigned char> insertionQV;
+    std::vector<unsigned char> substitutionQV;
+    std::vector<unsigned char> substitutionTag;
+    std::vector<unsigned char> mergeQV;
+    std::vector<int>  readLengths;
+    std::vector<int>  readStartPositions;
+    int nReads;
+    int nBases;
+
+    bool LookupReadIndexByXY(uint16_t x, uint16_t y, int &index); 
+
+    void CopyReadAt(uint32_t readIndex, SMRTSequence &read); 
+
+    template<typename T>
+    void CopyArray(std::vector<T> &fullArray, int pos, int length, T*dest); 
+    
+};
+
+#include "BaseFileImpl.hpp"
+
+#endif // _BLASR_BASE_FILE_HPP_
diff --git a/libcpp/pbdata/reads/BaseFileImpl.hpp b/libcpp/pbdata/reads/BaseFileImpl.hpp
new file mode 100644
index 0000000..b09c927
--- /dev/null
+++ b/libcpp/pbdata/reads/BaseFileImpl.hpp
@@ -0,0 +1,11 @@
+#ifndef _BLASR_BASE_FILE_IMPL_HPP_
+#define _BLASR_BASE_FILE_IMPL_HPP_
+
+#include "BaseFile.hpp"
+
+template<typename T>
+void BaseFile::CopyArray(std::vector<T> &fullArray, int pos, int length, T*dest) {
+    memcpy(dest, &fullArray[pos], sizeof(T) * length);
+}
+
+#endif
diff --git a/libcpp/pbdata/reads/HoleXY.cpp b/libcpp/pbdata/reads/HoleXY.cpp
new file mode 100644
index 0000000..ff9d1f7
--- /dev/null
+++ b/libcpp/pbdata/reads/HoleXY.cpp
@@ -0,0 +1,14 @@
+#include "HoleXY.hpp"
+
+bool HoleXY::operator<(const HoleXY &rhs) const {
+    return *this < rhs.xy;
+}
+
+bool HoleXY::operator<(const int16_t xyP[2]) const {
+    if (xy[0] == xyP[0]) {
+        return xy[1] < xyP[1];
+    }
+    else {
+        return xy[0] < xyP[0];
+    }
+}       
diff --git a/libcpp/pbdata/reads/HoleXY.hpp b/libcpp/pbdata/reads/HoleXY.hpp
new file mode 100644
index 0000000..5386c72
--- /dev/null
+++ b/libcpp/pbdata/reads/HoleXY.hpp
@@ -0,0 +1,14 @@
+#ifndef _BLASR_HOLE_XY_HPP_
+#define _BLASR_HOLE_XY_HPP_
+
+#include <stdlib.h>
+
+class HoleXY {
+public:
+    int16_t xy[2];
+    bool operator<(const HoleXY &rhs) const; 
+
+    bool operator<(const int16_t xyP[2]) const; 
+};
+
+#endif // _BLASR_HOLE_XY_HPP_
diff --git a/libcpp/pbdata/reads/PulseBaseCommon.cpp b/libcpp/pbdata/reads/PulseBaseCommon.cpp
new file mode 100644
index 0000000..437a0fb
--- /dev/null
+++ b/libcpp/pbdata/reads/PulseBaseCommon.cpp
@@ -0,0 +1,37 @@
+#include <vector>
+#include <algorithm>
+#include "PulseBaseCommon.hpp"
+
+float PulseBaseCommon::GetFrameRate() {
+    return scanData.frameRate;
+}
+
+unsigned int PulseBaseCommon::GetNumFrames() {
+    return scanData.numFrames;
+}
+
+std::string PulseBaseCommon::GetMovieName() {
+    return scanData.movieName;
+}
+
+std::map<char, int> PulseBaseCommon::GetBaseMap() {
+    return scanData.baseMap;
+}
+
+bool PulseBaseCommon::LookupReadIndexByHoleNumber(uint32_t holeNumber, int &readIndex) {
+    std::vector<uint32_t>::iterator holeIt;
+    if (holeNumbers.size() == 0) {
+        return false;
+    }
+    holeIt = lower_bound(holeNumbers.begin(), holeNumbers.end(), holeNumber);
+    if (holeIt == holeNumbers.end()) {
+        return false;
+    }
+    if (*holeIt == holeNumber) {
+        readIndex = holeIt - holeNumbers.begin();
+        return true;
+    }
+    else {
+        return false;
+    }
+}
diff --git a/libcpp/pbdata/reads/PulseBaseCommon.hpp b/libcpp/pbdata/reads/PulseBaseCommon.hpp
new file mode 100644
index 0000000..e8b86fc
--- /dev/null
+++ b/libcpp/pbdata/reads/PulseBaseCommon.hpp
@@ -0,0 +1,26 @@
+#ifndef DATASTRUCTURES_READS_PULSE_BASE_COMMON_H_
+#define DATASTRUCTURES_READS_PULSE_BASE_COMMON_H_
+
+// 
+// This includes values that both pulse and base files must have.
+//
+#include <stdint.h>
+#include "ScanData.hpp"
+
+class PulseBaseCommon {
+public:
+    ScanData scanData;
+    std::vector<uint32_t> holeNumbers;
+
+    float GetFrameRate(); 
+
+    unsigned int GetNumFrames(); 
+
+    std::string GetMovieName(); 
+
+    std::map<char, int> GetBaseMap(); 
+
+    bool LookupReadIndexByHoleNumber(uint32_t holeNumber, int &readIndex); 
+};
+
+#endif
diff --git a/libcpp/pbdata/reads/PulseFile.cpp b/libcpp/pbdata/reads/PulseFile.cpp
new file mode 100644
index 0000000..7d2db0b
--- /dev/null
+++ b/libcpp/pbdata/reads/PulseFile.cpp
@@ -0,0 +1,76 @@
+#include "PulseFile.hpp"
+
+
+void PulseFile::CopySignal(HalfWord *signalData, // either a vector or matrix
+                            int signalNDims,
+                            int pulseStartPos,    // 0 if baseToPulseIndex maps to abs position
+                            int *baseToPulseIndex,
+                            Nucleotide *readSeq,
+                            int readLength,
+                            HalfWord *readData) {
+    // if baseToPulseIndex maps bases to absolute pulse postions
+    // pulseStartPos must be 0; 
+    // otherwise, pulseStartPos is pulseStartPositions[holeIndex]
+
+    std::map<char, int> baseMap = GetBaseMap();
+    int i;
+    if (signalNDims == 1) {
+        for (i = 0; i < readLength; i++) {
+            readData[i] = signalData[pulseStartPos + baseToPulseIndex[i] ];
+        }
+    }
+    else {
+        for (i = 0; i < readLength; i++) {
+            readData[i] = signalData[baseToPulseIndex[i]*4 + baseMap[readSeq[i]]];
+        }
+    }
+}
+
+void PulseFile::CopyReadAt(uint32_t plsReadIndex, int *baseToPulseIndex, SMRTSequence &read) {
+    int pulseStartPos = pulseStartPositions[plsReadIndex];
+    bool allocResult;
+    if (midSignal.size() > 0) {
+    assert(midSignal.size() > pulseStartPos);
+    allocResult = Realloc(read.midSignal, read.length);
+    CopySignal(&midSignal[0], 
+                midSignalNDims, 
+                pulseStartPos,
+                baseToPulseIndex,
+                read.seq, read.length,
+                read.midSignal);
+    }
+
+    if (maxSignal.size() > 0) {
+        assert(maxSignal.size() > pulseStartPos); 
+        Realloc(read.maxSignal, read.length);
+        CopySignal(&maxSignal[0], 
+                    maxSignalNDims, 
+                    pulseStartPos,
+                    baseToPulseIndex,
+                    read.seq, read.length,
+                    read.maxSignal);
+    }
+
+    if (meanSignal.size() > 0) {
+        assert(meanSignal.size() > pulseStartPos); 
+        Realloc(read.meanSignal, read.length);
+        CopySignal(&meanSignal[0], 
+                    meanSignalNDims, 
+                    pulseStartPos,
+                    baseToPulseIndex,
+                    read.seq, read.length,
+                    read.meanSignal);
+    }
+    if (plsWidthInFrames.size() > 0) {
+        Realloc(read.widthInFrames, read.length);
+        StoreField(plsWidthInFrames, baseToPulseIndex, read.widthInFrames, read.length);
+    }
+    if (classifierQV.size() > 0) {
+        Realloc(read.classifierQV, read.length);
+        StoreField(classifierQV, baseToPulseIndex, read.classifierQV, read.length);
+    }
+    if (startFrame.size() > 0) {
+        Realloc(read.startFrame, read.length);
+        StoreField(startFrame, baseToPulseIndex, read.startFrame, read.length);
+    }
+}
diff --git a/libcpp/pbdata/reads/PulseFile.hpp b/libcpp/pbdata/reads/PulseFile.hpp
new file mode 100644
index 0000000..d5c4d89
--- /dev/null
+++ b/libcpp/pbdata/reads/PulseFile.hpp
@@ -0,0 +1,53 @@
+#ifndef _BLASR_PULSE_FILE_HPP_
+#define _BLASR_PULSE_FILE_HPP_
+
+#include <map>
+#include <vector>
+#include "Types.h"
+#include "Enumerations.h"
+#include "DNASequence.hpp"
+#include "SMRTSequence.hpp"
+#include "PulseBaseCommon.hpp"
+#include "ScanData.hpp"
+
+class PulseFile : public PulseBaseCommon {
+ public:
+    unsigned int numFrames;
+    PlatformId platformId;
+    std::vector<unsigned int> startFrame;
+    std::vector<uint16_t> plsWidthInFrames;
+    int midSignalNDims, maxSignalNDims, meanSignalNDims;
+    std::vector<uint16_t> midSignal;
+    std::vector<uint16_t> maxSignal;
+    std::vector<uint16_t> meanSignal; 
+    std::vector<int>      numEvent;
+    std::vector<int>      pulseStartPositions;
+    std::vector<float>    classifierQV;
+
+    PulseFile(){numFrames = 0; platformId = Springfield;}
+
+    void CopySignal(HalfWord *signalData, // either a vector or matrix
+                    int signalNDims,
+                    int pulseStartPos,    // 0 if baseToPulseIndex maps to abs position
+                    int *baseToPulseIndex,
+                    Nucleotide *readSeq,
+                    int readLength,
+                    HalfWord *readData);
+    
+    // plsReadIndex: index of this hole number in /PulseCalls/ZMW/HoleNumber.
+    // baseToPulseIndex: index from pulse to base from the beginning of the read.
+    // read: a SMRTSequence.
+    void CopyReadAt(uint32_t plsReadIndex, int *baseToPulseIndex, SMRTSequence &read);
+
+    template<typename T_FieldType>
+    void StoreField(std::vector<T_FieldType> &source, int *basToPlsIndex, T_FieldType *dest, int destLength);
+    
+    template <typename T>
+    bool Realloc(T *&ptr, int length);
+
+
+};
+
+#include "PulseFileImpl.hpp"
+
+#endif
diff --git a/libcpp/pbdata/reads/PulseFileImpl.hpp b/libcpp/pbdata/reads/PulseFileImpl.hpp
new file mode 100644
index 0000000..7fc1f8d
--- /dev/null
+++ b/libcpp/pbdata/reads/PulseFileImpl.hpp
@@ -0,0 +1,21 @@
+#ifndef _BLASR_PULSE_FILE_IMPL_HPP_
+#define _BLASR_PULSE_FILE_IMPL_HPP_
+
+template<typename T_FieldType>
+    void PulseFile::StoreField(std::vector<T_FieldType> &source, int *basToPlsIndex, T_FieldType *dest, int destLength) {
+    int i;
+    for (i = 0 ; i < destLength; i++) {
+    dest[i] = source[basToPlsIndex[i]];
+    }
+}
+
+template <typename T>
+    bool PulseFile::Realloc(T *&ptr, int length) {
+    if (ptr != NULL) {
+    delete[] ptr;
+    }
+    ptr = new T[length];
+    return ptr != NULL;
+}
+
+#endif
diff --git a/libcpp/pbdata/reads/ReadInterval.hpp b/libcpp/pbdata/reads/ReadInterval.hpp
new file mode 100644
index 0000000..c21838f
--- /dev/null
+++ b/libcpp/pbdata/reads/ReadInterval.hpp
@@ -0,0 +1,18 @@
+#ifndef _BLASR_READ_INTERVAL_HPP_
+#define _BLASR_READ_INTERVAL_HPP_
+
+class ReadInterval {
+public:
+    int start;
+    int end;
+    int score;
+    ReadInterval(int s, int e, int sc=0) : start(s), end(e), score(sc) {};
+    ReadInterval& operator=(const ReadInterval &rhs) {
+        start = rhs.start;
+        end   = rhs.end;
+        score = rhs.score;
+        return *this;
+    }
+};
+
+#endif
diff --git a/libcpp/pbdata/reads/ReadType.cpp b/libcpp/pbdata/reads/ReadType.cpp
new file mode 100644
index 0000000..7e15ce0
--- /dev/null
+++ b/libcpp/pbdata/reads/ReadType.cpp
@@ -0,0 +1,43 @@
+#include "ReadType.hpp"
+
+ReadType::ReadTypeEnum ReadType::ParseReadType(std::string &readTypeString) {
+  if (readTypeString == "Standard") {
+    return ReadType::Standard;
+  }
+  else if (readTypeString == "CCS") {
+    return ReadType::CCS;
+  }
+  else if (readTypeString == "RCCS") {
+    return ReadType::RCCS;
+  }
+  else if (readTypeString == "POLYMERASE") {
+    return ReadType::POLYMERASE;
+  }
+  else if (readTypeString == "HQREGION") {
+    return ReadType::HQREGION;
+  }
+  else if (readTypeString == "SUBREAD") {
+    return ReadType::SUBREAD;
+  }
+  else if (readTypeString == "SCRAP") {
+    return ReadType::SCRAP;
+  }
+  else if (readTypeString == "UNKNOWN") {
+    return ReadType::UNKNOWN;
+  }
+  else {
+      return ReadType::NoReadType;
+  }
+}
+
+std::string ReadType::ToString(const ReadType::ReadTypeEnum & readType) {
+    if (readType == ReadType::Standard) return "Standard";
+    if (readType == ReadType::CCS) return "CCS";
+    if (readType == ReadType::RCCS) return "RCCS";
+    if (readType == ReadType::HQREGION) return "HQREGION";
+    if (readType == ReadType::POLYMERASE) return "POLYMERASE";
+    if (readType == ReadType::SUBREAD) return "SUBREAD";
+    if (readType == ReadType::SCRAP) return "SCRAP";
+    if (readType == ReadType::UNKNOWN) return "UNKNOWN";
+    return "NoReadType";
+}
diff --git a/libcpp/pbdata/reads/ReadType.hpp b/libcpp/pbdata/reads/ReadType.hpp
new file mode 100644
index 0000000..02279da
--- /dev/null
+++ b/libcpp/pbdata/reads/ReadType.hpp
@@ -0,0 +1,18 @@
+#ifndef _BLASR_READ_TYPE_HPP 
+#define _BLASR_READ_TYPE_HPP 
+
+#include <string>
+
+class ReadType {
+ public:
+  enum ReadTypeEnum {NoReadType=0, Standard=1, CCS=2, RCCS=3, POLYMERASE=4, HQREGION=5, SUBREAD=6, SCRAP=7, UNKNOWN=8};
+  static ReadTypeEnum ParseReadType(std::string &readTypeString);
+  static std::string ToString(const ReadType::ReadTypeEnum & readType);
+};
+
+
+//The READTYPE values encountered in secondary analysis will be limited to SUBREAD and CCS.
+//POLYMERASE, HQREGION, SCRAP, and UNKNOWN will only be encountered in intermediate steps before
+//secondary analysis.
+//NoReadType, Standard and RCCS were used in CMP.H5 deprecated.
+#endif
diff --git a/libcpp/pbdata/reads/RegionTable.cpp b/libcpp/pbdata/reads/RegionTable.cpp
new file mode 100644
index 0000000..54582a7
--- /dev/null
+++ b/libcpp/pbdata/reads/RegionTable.cpp
@@ -0,0 +1,159 @@
+#include <algorithm>
+#include "RegionTable.hpp"
+
+using namespace std;
+
+RegionAnnotation& RegionAnnotation::operator=(const RegionAnnotation &rhs) {
+    memcpy(row, rhs.row, sizeof(int)*NCOLS);
+    return *this;
+}
+int RegionAnnotation::GetHoleNumber() {
+    return row[HoleNumber];
+}
+
+void RegionAnnotation::SetHoleNumber(int holeNumber) {
+    row[HoleNumber] = holeNumber;
+}
+
+int RegionAnnotation::GetType() const {
+    return row[RegionType];
+}
+
+void RegionAnnotation::SetType(int regionType) {
+    row[RegionType] = regionType;
+}
+
+int RegionAnnotation::GetStart() {
+    return row[RegionStart];
+}
+
+void RegionAnnotation::SetStart(int start) {
+    row[RegionStart] = start;
+}
+int RegionAnnotation::GetEnd() {
+    return row[RegionEnd];
+}
+
+void RegionAnnotation::SetEnd(int end) {
+    row[RegionEnd] = end;
+}
+
+int RegionAnnotation::GetScore() {
+    return row[RegionScore];
+}
+
+void RegionAnnotation::SetScore(int score) {
+    row[RegionScore] = score;
+}
+
+int RegionTable::LookupRegionsByHoleNumber(int holeNumber, int &low, int &high) const {
+    std::vector<RegionAnnotation>::const_iterator lowIt, highIt;
+    lowIt  = std::lower_bound(table.begin(), table.end(), holeNumber);
+    highIt = std::lower_bound(table.begin(), table.end(), holeNumber+1);
+    low =  lowIt - table.begin();
+    high = highIt - table.begin();
+    return high-low;
+}
+
+//
+// Define a bunch of accessor functions.
+//
+
+//
+// Different region tables have different ways of encoding regions.
+// This maps from the way they are encoded in the rgn table to a
+// standard encoding.
+//
+
+RegionType RegionTable::GetType(int regionIndex) const {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    return (RegionType) regionTypeEnums[table[regionIndex].GetType()];
+}
+
+int RegionTable::GetStart(int regionIndex) {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    return table[regionIndex].GetStart();
+}
+
+void RegionTable::SetStart(int regionIndex, int start) {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    table[regionIndex].SetStart(start);
+}
+
+int RegionTable::GetEnd(int regionIndex) {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    return table[regionIndex].GetEnd();
+}
+
+void RegionTable::SetEnd(int regionIndex, int end) {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    table[regionIndex].SetEnd(end);
+}
+
+int RegionTable::GetHoleNumber(int regionIndex) {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    return table[regionIndex].GetHoleNumber();
+}
+
+void RegionTable::SetHoleNumber(int regionIndex, int holeNumber) {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    table[regionIndex].SetHoleNumber(holeNumber);
+}
+
+int RegionTable::GetScore(int regionIndex) {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    return table[regionIndex].row[RegionAnnotation::RegionScore];
+}
+
+void RegionTable::SetScore(int regionIndex, int score) {
+    assert(regionIndex < table.size());
+    assert(regionIndex >= 0);
+    table[regionIndex].row[RegionAnnotation::RegionScore] = score;
+}
+
+void RegionTable::SortTableByHoleNumber() {
+    std::stable_sort(table.begin(), table.end());
+}
+
+void RegionTable::Reset() {
+    table.clear();
+    columnNames.clear();
+    regionTypes.clear();
+    regionDescriptions.clear();
+    regionSources.clear();
+    regionTypeEnums.clear();
+}
+
+void RegionTable::CreateDefaultAttributes() {
+    columnNames.clear();
+    columnNames.push_back("HoleNumber");
+    columnNames.push_back("Region type index");
+    columnNames.push_back("Region start in bases");
+    columnNames.push_back("Region end in bases");
+    columnNames.push_back("Region score");
+
+    regionTypes.push_back("Adapter");
+    regionTypes.push_back("Insert");
+    regionTypes.push_back("HQRegion");
+
+    regionDescriptions.push_back("Adapter Hit");
+    regionDescriptions.push_back("Insert Region");
+    regionDescriptions.push_back("High Quality bases region. Score is 1000 * "
+            "predicted accuracy, where predicted accuary is 0 to 1.0"); 
+
+    regionSources.push_back("AdapterFinding");
+    regionSources.push_back("AdapterFinding");
+    regionSources.push_back("PulseToBase Region classifer");
+
+    regionTypeEnums.push_back(Adapter);
+    regionTypeEnums.push_back(Insert);
+    regionTypeEnums.push_back(HQRegion);
+}
diff --git a/libcpp/pbdata/reads/RegionTable.hpp b/libcpp/pbdata/reads/RegionTable.hpp
new file mode 100644
index 0000000..497e625
--- /dev/null
+++ b/libcpp/pbdata/reads/RegionTable.hpp
@@ -0,0 +1,95 @@
+#ifndef _BLASR_REGION_TABLE_HPP_
+#define _BLASR_REGION_TABLE_HPP_
+
+#include <cassert>
+#include <cstring>
+#include <string>
+#include <vector>
+#include "Enumerations.h"
+
+class RegionAnnotation {
+public:
+    typedef enum T_AnnotationRow {HoleNumber, RegionType, RegionStart, 
+        RegionEnd, RegionScore} AnnotationRow;
+    static const int NCOLS=5;
+    int row[NCOLS];
+
+    inline
+    bool operator<(const RegionAnnotation &rhs) const
+    { return row[HoleNumber] < rhs.row[HoleNumber]; }
+
+    inline
+    bool operator<(int holeNumber) const
+    { return row[HoleNumber] < holeNumber; }
+
+    RegionAnnotation& operator=(const RegionAnnotation &rhs); 
+
+    int GetHoleNumber(); 
+
+    void SetHoleNumber(int holeNumber); 
+
+    int GetType() const; 
+
+    void SetType(int regionType); 
+
+    int GetStart(); 
+
+    void SetStart(int start); 
+
+    int GetEnd(); 
+
+    void SetEnd(int end); 
+
+    int GetScore(); 
+
+    void SetScore(int score); 
+};
+
+class RegionTable {
+public:
+    std::vector<RegionAnnotation> table;
+    std::vector<std::string> columnNames;
+    std::vector<std::string> regionTypes;
+    std::vector<std::string> regionDescriptions;
+    std::vector<std::string> regionSources;
+    std::vector<RegionType> regionTypeEnums;
+
+    int LookupRegionsByHoleNumber(int holeNumber, int &low, int &high) const; 
+
+    //
+    // Define a bunch of accessor functions.
+    //
+
+    //
+    // Different region tables have different ways of encoding regions.
+    // This maps from the way they are encoded in the rgn table to a
+    // standard encoding.
+    //
+
+    RegionType GetType(int regionIndex) const; 
+
+    int GetStart(int regionIndex); 
+
+    void SetStart(int regionIndex, int start); 
+
+    int GetEnd(int regionIndex); 
+
+    void SetEnd(int regionIndex, int end); 
+
+    int GetHoleNumber(int regionIndex); 
+
+    void SetHoleNumber(int regionIndex, int holeNumber); 
+
+    int GetScore(int regionIndex); 
+
+    void SetScore(int regionIndex, int score); 
+
+    void SortTableByHoleNumber(); 
+
+    void Reset(); 
+
+    void CreateDefaultAttributes(); 
+};
+
+
+#endif // _BLASR_REGION_TABLE_HPP_
diff --git a/libcpp/pbdata/reads/ScanData.cpp b/libcpp/pbdata/reads/ScanData.cpp
new file mode 100644
index 0000000..3114376
--- /dev/null
+++ b/libcpp/pbdata/reads/ScanData.cpp
@@ -0,0 +1,12 @@
+#include "ScanData.hpp"
+
+ScanData::ScanData() {
+    platformId = NoPlatform;
+    frameRate = numFrames = 0;
+    movieName = runCode = whenStarted = "";
+    baseMap.clear();
+}
+
+std::string ScanData::GetMovieName() {
+    return movieName;
+}
diff --git a/libcpp/pbdata/reads/ScanData.hpp b/libcpp/pbdata/reads/ScanData.hpp
new file mode 100644
index 0000000..8cf07ea
--- /dev/null
+++ b/libcpp/pbdata/reads/ScanData.hpp
@@ -0,0 +1,20 @@
+#ifndef DATASTRUCTURES_READS_SCAN_DATA_H_
+#define DATASTRUCTURES_READS_SCAN_DATA_H_
+
+#include <string>
+#include <map>
+#include "Enumerations.h"
+
+class ScanData {
+public:
+    PlatformId platformId;
+    float frameRate;
+    unsigned int numFrames;
+    std::string movieName, runCode;
+    std::string whenStarted;
+    std::map<char, int> baseMap;
+    ScanData();
+    std::string GetMovieName(); 
+};
+
+#endif
diff --git a/libcpp/pbdata/reads/ZMWGroupEntry.cpp b/libcpp/pbdata/reads/ZMWGroupEntry.cpp
new file mode 100644
index 0000000..64381ed
--- /dev/null
+++ b/libcpp/pbdata/reads/ZMWGroupEntry.cpp
@@ -0,0 +1,8 @@
+#include <stdint.h>
+#include "Types.h"
+#include "ZMWGroupEntry.hpp"
+ZMWGroupEntry::ZMWGroupEntry() {
+    holeNumber = x = y = 0;
+    numEvents = 0;
+    holeStatus = '0';
+}
diff --git a/libcpp/pbdata/reads/ZMWGroupEntry.hpp b/libcpp/pbdata/reads/ZMWGroupEntry.hpp
new file mode 100644
index 0000000..05234df
--- /dev/null
+++ b/libcpp/pbdata/reads/ZMWGroupEntry.hpp
@@ -0,0 +1,17 @@
+#ifndef _BLASR_ZMW_GROUP_ENTRY_HPP_
+#define _BLASR_ZMW_GROUP_ENTRY_HPP_
+
+#include "Types.h"
+
+class ZMWGroupEntry {
+ public:
+	UInt holeNumber;
+	UInt x;
+	UInt y;
+	int  numEvents;
+    unsigned char holeStatus;
+    ZMWGroupEntry(); 
+};
+
+
+#endif // _BLASR_ZMW_GROUP_ENTRY_HPP_
diff --git a/libcpp/pbdata/saf/AlnGroup.cpp b/libcpp/pbdata/saf/AlnGroup.cpp
new file mode 100644
index 0000000..9f680cb
--- /dev/null
+++ b/libcpp/pbdata/saf/AlnGroup.cpp
@@ -0,0 +1,12 @@
+#include "AlnGroup.hpp"
+
+int AlnGroup::FindPath(int idKey, std::string &val) {
+    int i;
+    for (i = 0; i < id.size(); i++) {
+        if (idKey == id[i]) {
+            val = path[i];
+            return 1;
+        }
+    }
+    return 0;
+}
diff --git a/libcpp/pbdata/saf/AlnGroup.hpp b/libcpp/pbdata/saf/AlnGroup.hpp
new file mode 100644
index 0000000..e941b19
--- /dev/null
+++ b/libcpp/pbdata/saf/AlnGroup.hpp
@@ -0,0 +1,14 @@
+#ifndef _BLASR_ALN_GROUP_HPP_
+#define _BLASR_ALN_GROUP_HPP_
+
+#include <vector>
+#include <string>
+
+class AlnGroup {
+ public:
+	std::vector<unsigned int> id;
+	std::vector<std::string>  path;
+	int FindPath(int idKey, std::string &val); 
+};
+
+#endif // _BLASR_ALN_GROUP_HPP_
diff --git a/libcpp/pbdata/saf/AlnInfo.hpp b/libcpp/pbdata/saf/AlnInfo.hpp
new file mode 100644
index 0000000..6d59ad2
--- /dev/null
+++ b/libcpp/pbdata/saf/AlnInfo.hpp
@@ -0,0 +1,17 @@
+#ifndef DATASTRUCTURES_SAF_ALN_INFO_H_
+#define DATASTRUCTURES_SAF_ALN_INFO_H_
+
+#include <cstdint>
+#include <vector>
+#include "Types.h"
+#include "alignment/CmpAlignment.hpp"
+
+class AlnInfo {
+public:
+    std::vector<CmpAlignment> alignments;
+    UInt nAlignments;
+    uint64_t lastRow;
+};
+
+
+#endif
diff --git a/libcpp/pbdata/saf/MovieInfo.cpp b/libcpp/pbdata/saf/MovieInfo.cpp
new file mode 100644
index 0000000..f76a386
--- /dev/null
+++ b/libcpp/pbdata/saf/MovieInfo.cpp
@@ -0,0 +1,13 @@
+#include "MovieInfo.hpp"
+
+
+int MovieInfo::FindMovie(int idKey, string &nameVal) {
+    int i;
+    for (i = 0; i < id.size(); i++) {
+        if (id[i] == idKey) {
+            nameVal = name[i];
+            return 1;
+        }
+    }
+    return 0;
+}
diff --git a/libcpp/pbdata/saf/MovieInfo.hpp b/libcpp/pbdata/saf/MovieInfo.hpp
new file mode 100644
index 0000000..c92f819
--- /dev/null
+++ b/libcpp/pbdata/saf/MovieInfo.hpp
@@ -0,0 +1,19 @@
+#ifndef DATASTRUCTURES_SAF_HDF_MOVIE_INFO_H_
+#define DATASTRUCTURES_SAF_HDF_MOVIE_INFO_H_
+
+#include "Types.h"
+#include <string>
+#include <vector>
+
+using namespace std;
+
+class MovieInfo {
+ public:
+	vector<string> name;
+	vector<UInt>   run;
+	vector<UInt>   experiment;
+	vector<UInt>   id;
+	int FindMovie(int idKey, string &nameVal);
+};
+
+#endif
diff --git a/libcpp/pbdata/saf/RefGroup.cpp b/libcpp/pbdata/saf/RefGroup.cpp
new file mode 100644
index 0000000..fcd9bbf
--- /dev/null
+++ b/libcpp/pbdata/saf/RefGroup.cpp
@@ -0,0 +1,25 @@
+#include "RefGroup.hpp"
+
+
+bool RefGroup::IdToIndex(int idKey, int &idIndex) {
+    int i;
+    for (i = 0; i < refInfoId.size(); i++) {
+        if (refInfoId[i] == idKey) {
+        idIndex = i; return true;
+        }
+    }
+    return false;
+}
+	
+
+int RefGroup::FindPath(int idKey, string &pathVal, string &groupNameVal) {
+    int i;
+    for (i = 0; i < id.size(); i++) {
+        if (id[i] == idKey) {
+            pathVal = path[i];
+            groupNameVal = refGroupName[i];
+            return 1;
+        }
+    }
+    return 0;
+}
diff --git a/libcpp/pbdata/saf/RefGroup.hpp b/libcpp/pbdata/saf/RefGroup.hpp
new file mode 100644
index 0000000..7c3b012
--- /dev/null
+++ b/libcpp/pbdata/saf/RefGroup.hpp
@@ -0,0 +1,21 @@
+#ifndef _BLASR_REF_GROUP_HPP_
+#define _BLASR_REF_GROUP_HPP_
+
+#include <string>
+#include <vector>
+
+#include <stdint.h>
+
+using namespace std;
+class RefGroup {
+ public:
+	vector<uint32_t> id;
+	vector<string> path;
+	vector<string> refGroupName;
+	vector<uint32_t> refInfoId;
+
+    bool IdToIndex(int idKey, int &idIndex);
+	int FindPath(int idKey, string &pathVal, string &groupNameVal);
+};
+
+#endif
diff --git a/libcpp/pbdata/saf/RefInfo.cpp b/libcpp/pbdata/saf/RefInfo.cpp
new file mode 100644
index 0000000..48259a7
--- /dev/null
+++ b/libcpp/pbdata/saf/RefInfo.cpp
@@ -0,0 +1,20 @@
+#include "RefInfo.hpp"
+
+OneRefInfo::OneRefInfo() {
+    fullName = md5 = "";
+    id = length = 0;
+}
+
+bool RefInfo::RefIdToIndex(uint32_t qid, int &index) {
+/*
+ * Translate from external id to position in array.
+ */
+    int i;
+    for (i = 0; i < id.size(); i++) {
+        if (id[i] == qid) {
+        index = i;
+        return true;
+        }
+    }
+    return false;
+}
diff --git a/libcpp/pbdata/saf/RefInfo.hpp b/libcpp/pbdata/saf/RefInfo.hpp
new file mode 100644
index 0000000..39cda75
--- /dev/null
+++ b/libcpp/pbdata/saf/RefInfo.hpp
@@ -0,0 +1,26 @@
+#ifndef _BLASR_REF_INFO_HPP_
+#define _BLASR_REF_INFO_HPP_
+
+#include <string>
+#include <vector>
+#include <stdint.h>
+
+class OneRefInfo {
+ public:
+  std::string fullName;
+  unsigned int id;
+  unsigned int length;
+  std::string md5;
+  OneRefInfo();
+};
+
+
+class RefInfo {
+ public:
+    std::vector<std::string> fullName;
+    std::vector<uint32_t> id;
+    std::vector<uint32_t> length;
+    std::vector<std::string> md5;
+    bool RefIdToIndex(uint32_t qid, int &index);
+};
+#endif
diff --git a/libcpp/pbdata/sam/AlignmentSet.hpp b/libcpp/pbdata/sam/AlignmentSet.hpp
new file mode 100644
index 0000000..6e8bc49
--- /dev/null
+++ b/libcpp/pbdata/sam/AlignmentSet.hpp
@@ -0,0 +1,31 @@
+#ifndef _BLASR_SAM_ALIGNMENT_SET_HPP_
+#define _BLASR_SAM_ALIGNMENT_SET_HPP_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "FASTASequence.hpp"
+#include "sam/ReadGroup.hpp"
+#include "sam/ReferenceSequence.hpp"
+#include "sam/SAMAlignment.hpp"
+#include "sam/SAMHeader.hpp"
+
+template<typename T_ReferenceSequence=SAMReferenceSequence, typename T_ReadGroup=SAMReadGroup, typename T_Alignment=SAMAlignment>
+class AlignmentSet {
+ public:
+  SAMHeader header;
+  std::vector<T_ReferenceSequence> references;
+  std::vector<T_ReadGroup> readGroups;
+  std::vector<T_Alignment> alignments;
+
+  //
+  //  Rearrange references such that they are placed in the same order
+  //  as fastaReferences
+  //  
+  void RearrangeReferences(std::vector<FASTASequence> & fastaReferences);
+};
+
+#include "AlignmentSetImpl.hpp"
+
+#endif
diff --git a/libcpp/pbdata/sam/AlignmentSetImpl.hpp b/libcpp/pbdata/sam/AlignmentSetImpl.hpp
new file mode 100644
index 0000000..ddd0e5d
--- /dev/null
+++ b/libcpp/pbdata/sam/AlignmentSetImpl.hpp
@@ -0,0 +1,31 @@
+#include "AlignmentSet.hpp"
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_Alignment>
+void AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_Alignment>::RearrangeReferences(std::vector<FASTASequence> &fastaReferences) {
+    int i = 0;
+    std::map<std::string, int> fastaRefToIndex;
+    std::map<std::string, int>::iterator it;
+    for (i = 0; i<fastaReferences.size(); i++) {
+        it = fastaRefToIndex.find(fastaReferences[i].GetName());
+        if (it != fastaRefToIndex.end()) {
+            std::cout<<"Error, reference with name \""<<fastaReferences[i].GetName()
+                <<"\" in the reference genome is not unique"<<std::endl;
+            exit(1);
+        }
+        fastaRefToIndex[fastaReferences[i].GetName()] = i;
+    }
+    std::vector<T_ReferenceSequence> newreferences;
+    for (i = 0; i < references.size(); i++) {
+        newreferences.push_back(T_ReferenceSequence());
+    }
+    for (i = 0; i < references.size(); i++) {
+        it = fastaRefToIndex.find(references[i].sequenceName);
+        if (it == fastaRefToIndex.end()) {
+            std::cout<<"Error, can not find reference name "<<references[i].sequenceName
+                <<" in the reference genome."<<std::endl;
+            exit(1);
+        }
+        newreferences[(*it).second] = references[i];
+    }
+    references = newreferences;
+}
diff --git a/libcpp/pbdata/sam/CigarString.h b/libcpp/pbdata/sam/CigarString.h
new file mode 100644
index 0000000..979e125
--- /dev/null
+++ b/libcpp/pbdata/sam/CigarString.h
@@ -0,0 +1,23 @@
+#ifndef _BLASR_SAM_CIGAR_STRING_HPP_
+#define _BLASR_SAM_CIGAR_STRING_HPP_
+
+#include <string>
+#include <sstream>
+
+class CigarString : public std::string {
+public:
+    void Vectorize(std::vector<int> &lengths, std::vector<char> &operations) {
+        std::stringstream strm;
+        strm.str(*this);
+        while (strm) {
+            int l;
+            char o;
+            if ((strm >> l >> o)) {
+                lengths.push_back(l);
+                operations.push_back(o);
+            }
+        }
+    }
+};
+
+#endif
diff --git a/libcpp/pbdata/sam/ReadGroup.cpp b/libcpp/pbdata/sam/ReadGroup.cpp
new file mode 100644
index 0000000..161e2c3
--- /dev/null
+++ b/libcpp/pbdata/sam/ReadGroup.cpp
@@ -0,0 +1,51 @@
+#include "ReadGroup.hpp"
+
+void SAMReadGroup::StoreValues(std::vector<SAMKeywordValuePair> &kvPairs,
+                               int lineNumber) {
+  int i;
+  bool idIsStored = false;
+  for (i = 0; i < kvPairs.size(); i++ ){
+    if (kvPairs[i].key == "ID") {
+      id = kvPairs[i].value;
+      idIsStored = true;
+    }
+  }
+  if (idIsStored == false) {
+    std::cout << "ReadGroup missing id at " << lineNumber << std::endl;
+    exit(1);
+  }
+}
+
+void SAMFullReadGroup::StoreValues(vector<SAMKeywordValuePair> &kvPairs,
+                 int lineNumber) {
+  SAMReadGroup::StoreValues(kvPairs, lineNumber);
+  std::string kwPair;
+  std::string key, valueStr;
+  int i;
+  for (i = 0; i < kvPairs.size(); i++) {
+    if (kvPairs[i].key == "CN") {
+      centerName = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "DS") {
+      description = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "DT") {
+      date = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "FO") {
+      flowOrder = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "LB") {
+      library = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "PG") {
+      processingProgram = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "PI") {
+      StoreValue(kvPairs[i].value, insertSize);
+    }
+    else if (kvPairs[i].key == "SM") {
+      sample = kvPairs[i].value;
+    }  
+  }
+}
diff --git a/libcpp/pbdata/sam/ReadGroup.hpp b/libcpp/pbdata/sam/ReadGroup.hpp
new file mode 100644
index 0000000..24d6941
--- /dev/null
+++ b/libcpp/pbdata/sam/ReadGroup.hpp
@@ -0,0 +1,40 @@
+#ifndef _BLASR_SAM_READ_GROUP_HPP_
+#define _BLASR_SAM_READ_GROUP_HPP_
+
+#include <string>
+
+/*
+ * Minimal components of read group.  Define only required items. Use
+ * if memory is scarce.  
+ */
+#include "SAMKeywordValuePair.hpp"
+
+class SAMReadGroup {
+ public:
+  std::string id;
+  void StoreValues(std::vector<SAMKeywordValuePair> &kvPairs,
+                   int lineNumber = 0);
+};
+
+/*
+ * Full read group. Use when all data are required.
+ */
+class SAMFullReadGroup : public SAMReadGroup {
+ public:
+  std::string centerName;
+  std::string description;
+  std::string date;
+  std::string flowOrder;
+  std::string keySequence;
+  std::string library;
+  std::string processingProgram;
+  int    insertSize;
+  std::string platform;
+  std::string platformUnit;
+  std::string sample;
+
+  void StoreValues(std::vector<SAMKeywordValuePair> &kvPairs,
+                   int lineNumber = 0);
+};
+
+#endif
diff --git a/libcpp/pbdata/sam/ReferenceSequence.cpp b/libcpp/pbdata/sam/ReferenceSequence.cpp
new file mode 100644
index 0000000..6da44b9
--- /dev/null
+++ b/libcpp/pbdata/sam/ReferenceSequence.cpp
@@ -0,0 +1,47 @@
+#include "ReferenceSequence.hpp"
+
+const char* SAMReferenceSequence::SAMReferenceSequenceFieldNames[] = {"SN", "LN"};
+
+void SAMReferenceSequence::StoreValues(std::vector<SAMKeywordValuePair> &kvPairs, int lineNumber) {
+  int i;
+  std::vector<bool> usedFields;
+  usedFields.resize(SQ_LN);
+  std::fill(usedFields.begin(), usedFields.end(), false);
+  for (i = 0; i < kvPairs.size(); i++) {
+    if (kvPairs[i].key == "SN") {
+      sequenceName = kvPairs[i].value;
+      usedFields[SQ_SN] = true;
+    }
+    else if (kvPairs[i].key == "LN") {
+      StoreValue(kvPairs[i].value, length);
+      usedFields[SQ_SN] = true;
+    }
+  }
+  for (i = 0; i < usedFields.size(); i++) {
+    if (usedFields[i] == false) {
+      std::cout << "SQ specifier missing " << SAMReferenceSequenceFieldNames[i] << std::endl;
+   }
+  }
+}
+
+const char* SAMFullReferenceSequence::SAMFullReferenceSequenceFieldNames[] = {"AS", "M5", "SP", "UR"};
+
+void SAMFullReferenceSequence::StoreValues(std::vector<SAMKeywordValuePair> &kvPairs,
+                                           int lineNumber) {
+  SAMReferenceSequence::StoreValues(kvPairs, lineNumber);
+  int i;
+  for (i = 0; i < kvPairs.size(); i++ ){
+    if (kvPairs[i].key == "AS") {
+      genomeAssembly = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "M5") {
+      md5 = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "SP") {
+      species = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "UR") {
+      uri = kvPairs[i].value;
+    }
+  }
+}
diff --git a/libcpp/pbdata/sam/ReferenceSequence.hpp b/libcpp/pbdata/sam/ReferenceSequence.hpp
new file mode 100644
index 0000000..b5bb380
--- /dev/null
+++ b/libcpp/pbdata/sam/ReferenceSequence.hpp
@@ -0,0 +1,72 @@
+#ifndef _BLASR_SAM_REFERENCE_SEQUENCE_HPP_
+#define _BLASR_SAM_REFERENCE_SEQUENCE_HPP_
+
+#include <string>
+
+#include "sam/SAMKeywordValuePair.hpp"
+
+class SAMReferenceSequence {
+ public:
+  std::string sequenceName;
+  unsigned int length;
+  std::string GetSequenceName() {
+    return sequenceName;
+  }
+  //
+  // By definining accessor functions here but no data, we can
+  // economize on the amount of space used for each element.   This is
+  // no big deal for references, but for pairwise alignments, it is
+  // big.
+  //
+  std::string GetMD5() {
+    return "";
+  }
+  unsigned int GetLength() {
+    return length;
+  }
+  std::string GetGenomeAssembly() {
+    return "";
+  }
+  std::string GetSpecies() {
+    return "";
+  }
+  std::string GetURI() {
+    return "";
+  }
+
+  enum SAMReferenceSequenceRequiredFields { SQ_SN, SQ_LN };
+
+  static const char* SAMReferenceSequenceFieldNames[];
+
+  void StoreValues(std::vector<SAMKeywordValuePair> &kvPairs,
+                   int lineNumber=0);
+};
+
+class SAMFullReferenceSequence : public SAMReferenceSequence {
+ public:
+  std::string md5;
+  std::string species;
+  std::string uri;
+  std::string genomeAssembly;
+  std::string GetMD5() {
+    return md5;
+  }
+  std::string GetSpecies() {
+    return species;
+  }
+  std::string GetURI() {
+    return uri;
+  }
+  std::string GetGenomeAssembly() {
+    return genomeAssembly;
+  }
+
+  enum FullReferenceSequenceRequiredFields { SQ_AS, SQ_M5, SQ_SP, SQ_UR };
+
+  static const char* SAMFullReferenceSequenceFieldNames[];
+
+  void StoreValues(std::vector<SAMKeywordValuePair> &kvPairs, int lineNumber=0);
+};
+
+
+#endif
diff --git a/libcpp/pbdata/sam/SAMAlignment.cpp b/libcpp/pbdata/sam/SAMAlignment.cpp
new file mode 100644
index 0000000..e362d65
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMAlignment.cpp
@@ -0,0 +1,199 @@
+#include "SAMAlignment.hpp"
+
+SAMAlignment::SAMAlignment() {
+  score = xs = xe = as = xt = xq = nm = fi = xl = 0;
+  rg = optTagStr = "";
+}
+
+void SAMAlignment::PrintSAMAlignment(std::ostream & out) {
+    out << qName << "\t" << flag  << "\t" << rName << "\t"
+        << pos   << "\t" << mapQV << "\t" << cigar << "\t"
+        << rNext << "\t" << pNext << "\t" << tLen  << "\t"
+        << seq   << "\t" << qual  << "\t" << optTagStr 
+        << std::endl;
+}
+
+int SAMAlignment::FindPosOfNthChar(std::string str, int n, char c) {
+  if (n < 1) {
+    std::cout << "Nth should be a positive integer." << std::endl;
+    exit(0);
+  }
+  int count = 1;
+  int pos = str.find(c, 0);
+  // pos is the position of the first character c;
+  while(count < n and pos != std::string::npos) {
+      pos = str.find(c, pos+1);
+      count ++;
+  }
+  return pos;
+}
+
+std::string SAMAlignment::TrimStringEnd(std::string str) {
+  std::string newStr = str;
+  while(newStr[newStr.size()-1] == '\r' or
+        newStr[newStr.size()-1] == '\n') {
+      newStr.erase(newStr.size()-1, 1);
+  }
+  return newStr;
+}
+
+bool SAMAlignment::StoreValues(std::string &line,  int lineNumber) {
+  std::stringstream strm(line);
+  std::vector<bool> usedFields;
+  usedFields.resize(S_QUAL);
+  fill(usedFields.begin(), usedFields.end(), false);
+  std::string kvPair;
+  int i;
+  bool parseError = false;
+  SAMAlignmentRequiredFields field;
+  //
+  // Define a temporary mapqv value that gets over a GMAP bug that prints a mapqv < 0.
+  //
+  int tmpMapQV;
+  if (!(strm >> qName)) {
+    parseError = true;
+    field = S_QNAME;
+  }
+  else if (! (strm >> flag) ){ 
+    parseError = true;
+    field = S_FLAG;
+  }
+  else if (! (strm >> rName) ) {
+    parseError = true;
+    field = S_RNAME;
+  }
+  else if (! (strm >> pos) ) {
+    parseError = true;
+    field = S_POS;
+  }
+  else if (! (strm >> tmpMapQV)) {
+    parseError = true; field = S_MAPQV;
+  }
+  else if (! (strm >> cigar)) {
+    parseError = true; field = S_CIGAR;
+  }
+
+  else if (! (strm >> rNext)) {
+    parseError = true; field = S_RNEXT;
+  }
+
+  else if (! (strm >> pNext)) {
+    parseError = true; field = S_PNEXT;
+  }
+  else if (! (strm >> tLen)) {
+    parseError = true; field = S_TLEN;
+  }
+  else if (! (strm >> seq)) {
+    parseError = true; field = S_SEQ;
+  }
+  else if (! (strm >> qual)) {
+    parseError = true; field = S_QUAL;
+  }
+
+  mapQV = (unsigned char) tmpMapQV;
+
+  // Find posisition of the 11th tab.
+  int optTagsStartPos = FindPosOfNthChar(strm.str(), 11, '\t');
+  // Save all optional tags.
+  if (optTagsStartPos != std::string::npos) {
+      optTagStr = strm.str().substr(optTagsStartPos+1);
+      optTagStr = TrimStringEnd(optTagStr);
+  } 
+
+  //
+  // If not aligned, stop trying to read in elements from the sam string.
+  //
+  if (rName == "*") {
+    return true;
+  }
+
+  if (parseError) {
+      std::cout << "Error parsing alignment line " << lineNumber << ". Missing or error in field " << SAMAlignmentRequiredFieldNames[field] << std::endl;
+      exit(1);
+  }
+  
+  //
+  // Now parse optional data.
+  //
+  while (strm) {
+    std::string kvName, kvType, kvValue;
+    std::string typedKVPair;
+    if (!(strm >> typedKVPair)) {
+      break;
+    }
+    if (TypedKeywordValuePair::Separate(typedKVPair, kvName, kvType, kvValue)) {
+      std::stringstream strm(kvValue);
+      if (kvName == "RG") {
+        rg = kvValue;
+      }
+      else if (kvName == "AS") {
+        strm >> as;
+      }
+      else if (kvName == "XS") {
+        strm >> xs;
+      }
+      else if (kvName == "XE") {
+        strm >> xe;
+      }
+      else if (kvName == "XL") {
+        strm >> xl;
+      }
+      else if (kvName == "XT") {
+        strm >> xt;
+      }
+      else if (kvName == "NM") {
+        strm >> nm;
+      }
+      else if (kvName == "FI") {
+        strm >> fi;
+      }
+      else if (kvName == "XQ") {
+        strm >> xq;
+      } // Add quality values, including QualityValue?, 
+        // InsertionQV, DeletionQV, SubstitutionQV, 
+        // MergeQV and SubstitutionTag and DeletionTag
+      else if (kvName == "iq") {
+          strm >> iq;
+      }
+      else if (kvName == "dq") {
+          strm >> dq;
+      }
+      else if (kvName == "sq") {
+          strm >> sq;
+      }
+      else if (kvName == "mq") {
+          strm >> mq;
+      }
+      else if (kvName == "st") {
+          strm >> st;
+      }
+      else if (kvName == "dt") {
+          strm >> dt;
+      }
+    }
+    else {
+      std::cout << "ERROR. Could not parse typed keyword value " << typedKVPair << std::endl;
+      exit(0);
+    }
+  }
+  return true;
+}
+
+void SAMAlignment::CopyQVs(std::vector<std::string> *optionalQVs) {  
+  optionalQVs->clear();
+  optionalQVs->push_back(iq);
+  optionalQVs->push_back(dq);
+  optionalQVs->push_back(sq);
+  optionalQVs->push_back(mq);
+  optionalQVs->push_back(st);
+  optionalQVs->push_back(dt);
+}
+
+const char* SAMAlignment::SAMAlignmentRequiredFieldNames[] = { "QNAME", "FLAG", 
+                                                               "RNAME", "POS", 
+                                                               "MAPQV", "CIGAR", 
+                                                               "RNEXT", "PNEXT", 
+                                                               "TLEN", "SEQ", "QUAL"} ;
+const char* optionalQVTags[] = {"iq", "dq", "sq", "mq", "st", "dt"};
+const char* optionalQVNames[] = {"InsertionQV", "DeletionQV", "SubstitutionQV",
+                                 "MergeQV", "SubstitutionTag", "DeletionTag"};
diff --git a/libcpp/pbdata/sam/SAMAlignment.hpp b/libcpp/pbdata/sam/SAMAlignment.hpp
new file mode 100644
index 0000000..a4183fd
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMAlignment.hpp
@@ -0,0 +1,97 @@
+#ifndef _BLASR_SAM_ALIGNMENT_HPP_
+#define _BLASR_SAM_ALIGNMENT_HPP_
+
+#include <string>
+#include <sstream>
+
+#include "sam/SAMKeywordValuePair.hpp"
+#include "sam/CigarString.h"
+
+class SAMAlignment {
+ public:
+  enum SAMAlignmentRequiredFields {
+    S_QNAME,
+    S_FLAG,
+    S_RNAME,
+    S_POS,
+    S_MAPQV,
+    S_CIGAR,
+    S_RNEXT,
+    S_PNEXT,
+    S_TLEN,
+    S_SEQ,
+    S_QUAL};
+
+  static const char* SAMAlignmentRequiredFieldNames[];
+
+  std::string qName;
+  unsigned int flag;
+  std::string rName;
+  unsigned int pos;
+  short mapQV;
+  CigarString cigar;
+  std::string rNext;
+  int pNext;
+  int tLen;
+  std::string seq;
+  std::string qual;
+
+  // Optional tags defined in blasr:
+  // "RG" read group Id
+  // "AS" alignment score
+  // "XS" read alignment start position without counting previous soft clips (1 based) 
+  // "XE" read alignment end position without counting previous soft clips (1 based) 
+  // "XL" aligned read length 
+  // "XQ" query read length
+  // "XT" # of continues reads, always 1 for blasr 
+  // "NM" # of subreads 
+  // "FI" read alignment start position (1 based) 
+  //
+  float score;
+  int xs, xe;
+  int xl;
+  int xq;
+
+  std::string rg;
+  int as;
+  int xt;
+  int nm;
+  int fi;
+  std::string optTagStr; 
+  //
+  // Quality values.
+  //
+  std::string iq, dq, sq, mq, st, dt;	
+  static const char* optionalQVTags[];
+  static const char* optionalQVNames[];
+
+  //
+  // Initialize all optional fields.  Required fields will be
+  // assigned a value later.
+  //
+  SAMAlignment();
+
+  void PrintSAMAlignment(std::ostream &out = std::cout);
+
+  // Find position of the nth character in a string.
+  int FindPosOfNthChar(std::string str, int n, char c);
+
+  // Trim the end '\n\r' characters from a string.
+  std::string TrimStringEnd(std::string str);
+
+  bool StoreValues(std::string &line,  int lineNumber=0);
+  
+  // CopyQVs writes the strings from the optional QV tags to a vector. The
+  // order of QVs in the vector is given by optionalQVNames[]
+  void CopyQVs(std::vector<std::string> *optionalQVs);
+};
+
+
+class SAMPosAlignment : public SAMAlignment {
+ public:
+  unsigned int qStart, qEnd;
+  unsigned int tStart, tEnd;
+  int qStrand, tStrand;
+};
+
+#endif
diff --git a/libcpp/pbdata/sam/SAMFlag.h b/libcpp/pbdata/sam/SAMFlag.h
new file mode 100644
index 0000000..10b311d
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMFlag.h
@@ -0,0 +1,48 @@
+#ifndef SAM_FLAG_H_
+#define SAM_FLAG_H_
+
+inline bool IsMultipleSegment(unsigned int flag) {
+  return flag & 0x1;
+}
+
+inline bool AllSegmentsMapped(unsigned int flag) {
+  return flag & 0x2;
+}
+
+inline bool SegmentUnmapped(unsigned int flag) {
+  return flag & 0x4;
+}
+
+inline bool NextUnmapped(unsigned int flag) {
+  return flag & 0x8;
+}
+
+inline bool IsReverseComplement(unsigned int flag) {
+  return flag & 0x10;
+}
+
+inline bool IsNextReverseComplement(unsigned int flag) {
+  return flag & 0x20;
+}
+
+inline bool IsSegemntFirst(unsigned int flag) {
+  return flag & 0x40;
+}
+
+inline bool IsSegmentLast(unsigned int flag) { 
+  return  flag & 0x80;
+}
+
+inline bool IsSecondaryAlignment(unsigned int flag) {
+  return flag & 0x100;
+}
+
+inline bool IsNotPassedQuality(unsigned int flag) {
+  return flag & 0x200;
+}
+
+inline bool IsDuplicate(unsigned int flag) {
+  return flag & 0x400;
+}
+
+#endif
diff --git a/libcpp/pbdata/sam/SAMHeader.cpp b/libcpp/pbdata/sam/SAMHeader.cpp
new file mode 100644
index 0000000..00c3d33
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMHeader.cpp
@@ -0,0 +1,31 @@
+#include "SAMHeader.hpp"
+#include <algorithm>
+
+void SAMHeader::StoreValues(std::vector<SAMKeywordValuePair> &kvPairs,
+                            int lineNumber) {
+  int i;
+  for ( i = 0; i < kvPairs.size(); i++) {
+    if (kvPairs[i].key == "VN") {
+      formatVersion = kvPairs[i].value;
+    }
+    else if (kvPairs[i].key == "SO") {
+      string value = kvPairs[i].value;
+      std::transform(value.begin(), value.end(), value.begin(), ::tolower);
+      if (value == "unknown" || value == "unsorted") {
+        sortingOrder = unknown;
+      }
+      else if (value == "sorted") {
+        sortingOrder = sorted;
+      }
+      else if (value == "queryname") {
+        sortingOrder =queryname;
+      }
+      else if (value == "coordinate") {
+        sortingOrder = coordinate;
+      }
+      else {
+        std::cout << "Invalid sorting order " << kvPairs[i].value << " at line " << lineNumber;
+      }
+    }
+  }
+}
diff --git a/libcpp/pbdata/sam/SAMHeader.hpp b/libcpp/pbdata/sam/SAMHeader.hpp
new file mode 100644
index 0000000..0a862a3
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMHeader.hpp
@@ -0,0 +1,18 @@
+#ifndef _BLASR_SAM_HEADER_HPP_
+#define _BLASR_SAM_HEADER_HPP_
+
+#include <string>
+
+#include "sam/SAMKeywordValuePair.hpp"
+
+class SAMHeader {
+ public:
+  string formatVersion;
+  enum SortingOrder {unknown, sorted , queryname, coordinate};
+  SortingOrder sortingOrder;
+
+  void StoreValues(std::vector<SAMKeywordValuePair> &kvPairs, int lineNumber = 0);
+};
+
+
+#endif
diff --git a/libcpp/pbdata/sam/SAMKeywordValuePair.cpp b/libcpp/pbdata/sam/SAMKeywordValuePair.cpp
new file mode 100644
index 0000000..c034228
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMKeywordValuePair.cpp
@@ -0,0 +1,51 @@
+#include "SAMKeywordValuePair.hpp"
+
+
+bool SplitSAMKeyValuePair(std::string &kvPair, std::string &key, std::string &value) {
+  int sepIndex = kvPair.find_first_of(":");
+  if (sepIndex == kvPair.npos) {
+    return false;
+  }
+  else {
+    key = kvPair.substr(0, sepIndex);
+    value = kvPair.substr(sepIndex+1);
+    return true;
+  }
+}
+
+bool SplitSAMTypedKeyValuePair(std::string kvPair, std::string &key,
+                               std::string &kvType, std::string &value) {
+  std::vector<std::string> strValues;
+  ParseSeparatedList(kvPair, strValues, ':', 3);
+  if (strValues.size() != 3) {
+    return false;
+  }
+  else {
+    key = strValues[0];
+    kvType = strValues[1];
+    value  = strValues[2];
+    return true;
+  }
+}
+
+bool TypedKeywordValuePair::Separate(std::string &kvPair, std::string &kvKey,
+                                     std::string &kvType, std::string &kvValue) {
+  if (SplitSAMTypedKeyValuePair(kvPair, kvKey, kvType, kvValue) == false) {
+    return false;
+  }
+  return true;
+}
+
+void KeywordValueStringsToPairs(std::vector<std::string> &kvStrings, std::vector<SAMKeywordValuePair> &kvPairs) {
+
+  kvPairs.resize(kvStrings.size());
+
+  if (kvStrings.size() == 0) {
+    return;
+  }
+
+  int i;
+  for (i = 0; i < kvStrings.size(); i++ ) {
+    SplitSAMKeyValuePair(kvStrings[i], kvPairs[i].key, kvPairs[i].value);
+  }
+}
diff --git a/libcpp/pbdata/sam/SAMKeywordValuePair.hpp b/libcpp/pbdata/sam/SAMKeywordValuePair.hpp
new file mode 100644
index 0000000..b4610f8
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMKeywordValuePair.hpp
@@ -0,0 +1,50 @@
+#ifndef _BLASR_SAM_KVPAIR_HPP_
+#define _BLASR_SAM_KVPAIR_HPP_
+
+#include <stdlib.h>
+
+#include <string>
+#include <iostream>
+#include <vector>
+
+#include "StringUtils.hpp"
+
+
+class SAMKeywordValuePair {
+ public:
+     std::string key;
+     std::string value;
+};
+
+bool SplitSAMKeyValuePair(std::string &kvPair, std::string &key, std::string &value);
+
+bool SplitSAMTypedKeyValuePair(std::string kvPair, std::string &key,
+                               std::string &kvType, std::string &value);
+
+template<typename T>
+void StoreValue(std::string &valueStr, T &value);
+
+void KeywordValueStringsToPairs(std::vector<std::string> &kvStrings,
+                                std::vector<SAMKeywordValuePair> &kvPairs);
+
+class TypedKeywordValuePair {
+ public:
+  static bool Separate(std::string &kvPair, std::string &kvKey,
+                       std::string &kvType, std::string &kvValue);
+};
+
+
+template<typename T_Value>
+class KeywordValuePair {
+ public:
+
+  static bool Parse(std::string &kvPair,
+                    const char *key, T_Value &result);
+  
+  static bool Store(std::string &valueStr, T_Value &value);
+
+};
+
+#include "SAMKeywordValuePairImpl.hpp"
+
+#endif
diff --git a/libcpp/pbdata/sam/SAMKeywordValuePairImpl.hpp b/libcpp/pbdata/sam/SAMKeywordValuePairImpl.hpp
new file mode 100644
index 0000000..624acc5
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMKeywordValuePairImpl.hpp
@@ -0,0 +1,32 @@
+template<typename T>
+void StoreValue(std::string &valueStr, T &value) {
+  std::stringstream strm(valueStr);
+  if (!(strm >> value)) {
+    std::cout <<"Error parsing " << valueStr << std::endl;
+    exit(1);
+  }
+}
+
+template<typename T_Value>
+bool KeywordValuePair<T_Value>::Parse(std::string &kvPair,
+                                      const char *key, T_Value &result) {
+  std::string kvKey, kvValue;
+  SplitSAMKeyValuePair(kvPair, kvKey, kvValue);
+  if (kvKey != key) {
+    return false;
+  }
+  else {
+    std::stringstream strm(kvValue);
+    if ( ! (kvValue >> result) ) {
+      return false;
+    }
+    else {
+      return true;
+    }
+  }
+}
+
+template<typename T_Value>
+bool KeywordValuePair<T_Value>::Store(std::string &valueStr, T_Value &value) {
+  return (std::stringstream(valueStr) >> value);
+}
diff --git a/libcpp/pbdata/sam/SAMReader.hpp b/libcpp/pbdata/sam/SAMReader.hpp
new file mode 100644
index 0000000..16688d8
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMReader.hpp
@@ -0,0 +1,61 @@
+#ifndef _BLASR_SAM_READER_HPP_
+#define _BLASR_SAM_READER_HPP_
+
+#include "sam/SAMKeywordValuePair.hpp"
+#include "sam/ReadGroup.hpp"
+#include "sam/ReferenceSequence.hpp"
+
+#include "sam/AlignmentSet.hpp"
+#include "StringUtils.hpp"
+#include "utils.hpp"
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+class SAMReader {
+  public:
+  int lineNumber;
+  std::ifstream samFile;
+  std::istream *samFilePtr;
+  bool Initialize(std::string samFileName);
+
+  void Close();
+
+  enum LineType {Blank, HSHeader, HSSequence, HSReadGroup, HSProgram, HSComment, Alignment, Error};
+
+  void GetLine(std::istream &in, std::string &line);
+
+  bool LineTypeIsHeader(LineType lineType);
+
+  bool PeekLineIsHeader(std::istream &in);
+
+  LineType GetLineType(std::string &line);
+ 
+  void StoreKVPairs(std::string line, std::vector<SAMKeywordValuePair> &kvPairs);
+ 
+  int StoreHeader(std::vector<SAMKeywordValuePair> &kvPairs,
+                  AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments);
+
+  void StoreReferenceSequence(std::vector<SAMKeywordValuePair> &kvPairs,
+                              AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments);
+
+  void StoreReadGroup(std::vector<SAMKeywordValuePair> &kvPairs,
+                      AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments);
+
+  void StoreAlignment(std::string & line,
+                      AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments);
+    
+  // Not implemented
+  void StoreProgram(std::vector<SAMKeywordValuePair> &kvPairs,
+                    AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments ) {}
+
+  void Read(std::string samFileName, AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments);
+
+  std::vector<std::string> ReadHeader(AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments);
+ 
+  void Read(AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments);
+
+  bool GetNextAlignment(SAMAlignment &alignment);
+};
+
+#include "SAMReaderImpl.hpp"
+
+#endif
diff --git a/libcpp/pbdata/sam/SAMReaderImpl.hpp b/libcpp/pbdata/sam/SAMReaderImpl.hpp
new file mode 100644
index 0000000..b92ffc1
--- /dev/null
+++ b/libcpp/pbdata/sam/SAMReaderImpl.hpp
@@ -0,0 +1,197 @@
+#ifndef _BLASR_SAM_READER_IMPL_HPP_
+#define _BLASR_SAM_READER_IMPL_HPP_
+#include <iostream>
+#include "SAMReader.hpp"
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+bool SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::Initialize(std::string samFileName) {
+  if(samFileName != "stdin") {
+    CrucialOpen(samFileName, samFile, std::ios::in);
+    samFilePtr = &samFile;
+  } else {
+    samFilePtr = &std::cin;
+  }
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+void SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::Close() {
+  if(samFile.is_open()) {
+    samFile.close();
+  }
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+void SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::GetLine(std::istream &in, std::string &line) {
+  getline(in, line);
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+bool SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::LineTypeIsHeader(LineType lineType) {
+  return (lineType == HSHeader or
+          lineType == HSSequence or
+          lineType == HSReadGroup or 
+          lineType == HSProgram or 
+          lineType == HSComment);
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+bool SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::PeekLineIsHeader(std::istream &in) {
+  if (in and in.peek() == '@') {
+    return true;
+  }
+  else {
+    return false;
+  }
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+typename SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::LineType
+SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::GetLineType(std::string &line) {
+  if (line.length() == 0) {
+    return Blank;
+  }
+  else if (line[0] == '@') {
+    std::stringstream strm(line);
+    std::string tag;
+    strm >> tag;
+    if (tag == "@HD") { return HSHeader; }
+    else if (tag == "@SQ") { return HSSequence; }
+    else if (tag == "@RG") { return HSReadGroup; }
+    else if (tag == "@PG") { return HSProgram; }
+    else if (tag == "@CO") { return HSComment; }
+    else { return Error; }
+  }
+  else {
+    return Alignment;
+  }
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+void SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::StoreKVPairs(std::string line,
+                             std::vector<SAMKeywordValuePair> &kvPairs) {
+  //
+  // Split on tab delineated line.
+  //
+  std::vector<std::string> kvPairStrings;
+  Splice(line, "\t", kvPairStrings);
+  KeywordValueStringsToPairs(kvPairStrings, kvPairs);
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+int SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::StoreHeader(std::vector<SAMKeywordValuePair> &kvPairs,
+                           AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments) {
+  alignments.header.StoreValues(kvPairs, lineNumber);
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+void SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::StoreReferenceSequence(std::vector<SAMKeywordValuePair> &kvPairs,
+                                       AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments) {
+  alignments.references.push_back(T_ReferenceSequence());
+  int lastRefIndex = alignments.references.size() - 1;
+  alignments.references[lastRefIndex].StoreValues(kvPairs, lineNumber);
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+void SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::StoreReadGroup(std::vector<SAMKeywordValuePair> &kvPairs,
+                               AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments) {
+  alignments.readGroups.push_back(T_ReadGroup());
+  int lastReadGroupIndex = alignments.readGroups.size() - 1;
+  alignments.readGroups[lastReadGroupIndex].StoreValues(kvPairs, lineNumber);
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+void SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::StoreAlignment(std::string & line,
+                               AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments) {
+  alignments.alignments.push_back(T_SAMAlignment());   
+  int lastAlignmentIndex = alignments.alignments.size() - 1;
+  alignments.alignments[lastAlignmentIndex].StoreValues(line, lineNumber);
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+void SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::Read(std::string samFileName, AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments) {
+  Initialize(samFileName);
+  Read(alignments);
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+std::vector<std::string> SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::ReadHeader(AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments) {
+  std::vector<std::string> allHeaders;
+  std::string line;
+  LineType lineType;
+  lineNumber = 0;
+  while (*samFilePtr and PeekLineIsHeader(*samFilePtr)) {
+    getline(*samFilePtr, line);
+    lineType = GetLineType(line);
+    if (LineTypeIsHeader(lineType)) {
+      allHeaders.push_back(line);
+      std::stringstream strm(line);
+      std::string tag;
+      strm >> tag;
+      std::string remainder;
+      getline(strm, remainder);
+      std::vector<SAMKeywordValuePair> kvPairs;
+      StoreKVPairs(remainder, kvPairs);
+      if (lineType == HSHeader) {
+        StoreHeader(kvPairs, alignments);
+      }
+      else if (lineType == HSSequence) {
+        StoreReferenceSequence(kvPairs, alignments);
+      }
+      else if (lineType == HSReadGroup) {
+        StoreReadGroup(kvPairs, alignments);
+      }
+      else if (lineType == HSProgram) {
+        StoreProgram(kvPairs, alignments);
+      }
+      else if (lineType == HSComment) {
+        // do nothing with comments for now.
+      }
+    }
+    ++lineNumber;
+  }
+  return allHeaders;
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+void SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::Read(AlignmentSet<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment> &alignments) {
+  std::string line;
+  LineType lineType;
+  lineNumber = 0;
+  ReadHeader(alignments);
+  while (getline(*samFilePtr, line)) {
+    lineType = GetLineType(line);
+    if (LineTypeIsHeader(lineType)) {
+      std::cout << "ERROR! Header line found outside of the header at " << lineNumber << std::endl;
+      exit(1);
+    }
+    else if (lineType == Alignment) {
+      StoreAlignment(line, alignments);
+    }
+    else {
+      std::cout << "Error, line type unknown at " << lineNumber << std::endl;
+      std::cout << line << std::endl;
+      exit(1);
+    }
+    ++lineNumber;
+  }
+}
+
+template<typename T_ReferenceSequence, typename T_ReadGroup, typename T_SAMAlignment>
+bool SAMReader<T_ReferenceSequence, T_ReadGroup, T_SAMAlignment>::GetNextAlignment(SAMAlignment &alignment) {
+  if (*samFilePtr) {
+    std::string line;
+    if (getline(*samFilePtr, line)) {
+      alignment.StoreValues(line, lineNumber);
+      ++lineNumber;
+      return true;
+    }
+    else {
+      return false;
+    }
+  }
+  else {
+    return false;
+  }
+}
+
+#endif
diff --git a/libcpp/pbdata/utils.hpp b/libcpp/pbdata/utils.hpp
new file mode 100644
index 0000000..9686cb5
--- /dev/null
+++ b/libcpp/pbdata/utils.hpp
@@ -0,0 +1,20 @@
+#ifndef _BLASR_UTILS_HPP_
+#define _BLASR_UTILS_HPP_
+#include <cstdlib>
+#include <string>
+#include <iostream>
+#include <fstream>
+
+template<typename t_file>
+void CrucialOpen(std::string &fileName, t_file &file, 
+    std::ios_base::openmode mode=(std::ios_base::openmode)0 ); 
+
+template<typename T_Int>
+T_Int CeilOfFraction(T_Int num, T_Int denom);
+
+template<typename T>
+T* ProtectedNew(unsigned long size); 
+
+#include "utilsImpl.hpp"
+
+#endif // _BLASR_UTILS_HPP_
diff --git a/libcpp/pbdata/utils/BitUtils.cpp b/libcpp/pbdata/utils/BitUtils.cpp
new file mode 100644
index 0000000..0bc4bf3
--- /dev/null
+++ b/libcpp/pbdata/utils/BitUtils.cpp
@@ -0,0 +1,99 @@
+#include "BitUtils.hpp"
+
+int32_t CountBits(uint32_t v) {
+	/* 
+	 * Attribute Sean Anderson for this method.
+	 * The page: http://graphics.stanford.edu/~seander/bithacks.html
+	 * contains this code.
+	 */
+  return std::bitset<sizeof(uint32_t)*8>(v).count();
+/*
+	unsigned long long c;
+	c =  ((v & 0xfff) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
+	c += (((v & 0xfff000) >> 12) * 0x1001001001001ULL & 0x84210842108421ULL) % 
+		0x1f;
+	c += ((v >> 24) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
+	return c;*/
+}
+
+
+int GetSetBitPosition64(uint64_t v) {
+	unsigned int s;      // Output: Resulting position of bit with rank r [1-64]
+	uint64_t a, b, c, d; // Intermediate temporaries for bit count.
+	unsigned int t;      // Bit count temporary.
+		
+	unsigned int r=1;
+	// Do a normal parallel bit count for a 64-bit integer,                     
+	// but store all intermediate steps.                                        
+	// a = (v & 0x5555...) + ((v >> 1) & 0x5555...);
+	a =  v - ((v >> 1) & ~0UL/3);
+	// b = (a & 0x3333...) + ((a >> 2) & 0x3333...);
+	b = (a & ~0UL/5) + ((a >> 2) & ~0UL/5);
+	// c = (b & 0x0f0f...) + ((b >> 4) & 0x0f0f...);
+	c = (b + (b >> 4)) & ~0UL/0x11;
+	// d = (c & 0x00ff...) + ((c >> 8) & 0x00ff...);
+	d = (c + (c >> 8)) & ~0UL/0x101;
+	t = (d >> 32) + (d >> 48);
+	// Now do branchless select!                                                
+	s  = 64;
+	// if (r > t) {s -= 32; r -= t;}
+	s -= ((t - r) & 256) >> 3; r -= (t & ((t - r) >> 8));
+	t  = (d >> (s - 16)) & 0xff;
+	// if (r > t) {s -= 16; r -= t;}
+	s -= ((t - r) & 256) >> 4; r -= (t & ((t - r) >> 8));
+	t  = (c >> (s - 8)) & 0xf;
+	// if (r > t) {s -= 8; r -= t;}
+	s -= ((t - r) & 256) >> 5; r -= (t & ((t - r) >> 8));
+	t  = (b >> (s - 4)) & 0xf;
+	// if (r > t) {s -= 4; r -= t;}
+	s -= ((t - r) & 256) >> 6; r -= (t & ((t - r) >> 8));
+	t  = (a >> (s - 2)) & 0x3;
+	// if (r > t) {s -= 2; r -= t;}
+	s -= ((t - r) & 256) >> 7; r -= (t & ((t - r) >> 8));
+	t  = (v >> (s - 1)) & 0x1;
+	// if (r > t) s--;
+	s -= ((t - r) & 256) >> 8;
+	//	s = 64 - s;
+	s = s - 1;
+	return s;
+}
+
+unsigned int GetSetBitPosition32(UInt v) {
+	unsigned int r;      // Input: bit's desired rank [1-64].
+	unsigned int s;      // Output: Resulting position of bit with rank r [1-64]
+	uint32_t a, b, c, d; // Intermediate temporaries for bit count.
+	unsigned int t;      // Bit count temporary.
+	r = 1;
+	// Do a normal parallel bit count for a 64-bit integer,                     
+	// but store all intermediate steps.                                        
+	// a = (v & 0x5555...) + ((v >> 1) & 0x5555...);
+	a =  v - ((v >> 1) & ~0U/3);
+	// b = (a & 0x3333...) + ((a >> 2) & 0x3333...);
+	b = (a & ~0U/5) + ((a >> 2) & ~0U/5);
+	// c = (b & 0x0f0f...) + ((b >> 4) & 0x0f0f...);
+	c = (b + (b >> 4)) & ~0U/0x11;
+	// d = (c & 0x00ff...) + ((c >> 8) & 0x00ff...);
+	d = (c + (c >> 8)) & ~0U/0x101;
+	t = (d >> 16) + (d >> 24);
+
+
+	// Now do branchless select!                                                
+	s  = 32;
+	// if (r > t) {s -= 16; r -= t;}
+	s -= ((t - r) & 256) >> 4; r -= (t & ((t - r) >> 8));
+	t  = (c >> (s - 8)) & 0xf;
+	// if (r > t) {s -= 8; r -= t;}
+	s -= ((t - r) & 256) >> 5; r -= (t & ((t - r) >> 8));
+	t  = (b >> (s - 4)) & 0xf;
+	// if (r > t) {s -= 4; r -= t;}
+	s -= ((t - r) & 256) >> 6; r -= (t & ((t - r) >> 8));
+	t  = (a >> (s - 2)) & 0x3;
+	// if (r > t) {s -= 2; r -= t;}
+	s -= ((t - r) & 256) >> 7; r -= (t & ((t - r) >> 8));
+	t  = (v >> (s - 1)) & 0x1;
+	// if (r > t) s--;
+	s -= ((t - r) & 256) >> 8;
+	//	s = 32 - s;
+	s = s - 1;
+	return s;
+}
diff --git a/libcpp/pbdata/utils/BitUtils.hpp b/libcpp/pbdata/utils/BitUtils.hpp
new file mode 100644
index 0000000..3914b7c
--- /dev/null
+++ b/libcpp/pbdata/utils/BitUtils.hpp
@@ -0,0 +1,14 @@
+#ifndef _BLASR_BIT_UTILS_HPP_
+#define _BLASR_BIT_UTILS_HPP_
+
+#include <stdint.h>
+#include <bitset>
+#include "Types.h"
+
+int32_t CountBits(uint32_t v); 
+
+int GetSetBitPosition64(uint64_t v); 
+
+unsigned int GetSetBitPosition32(UInt v); 
+
+#endif // _BLASR_BIT_UTILS_HPP_
diff --git a/libcpp/pbdata/utils/SMRTReadUtils.cpp b/libcpp/pbdata/utils/SMRTReadUtils.cpp
new file mode 100644
index 0000000..b2430b0
--- /dev/null
+++ b/libcpp/pbdata/utils/SMRTReadUtils.cpp
@@ -0,0 +1,45 @@
+
+#include "SMRTReadUtils.hpp"
+
+void GetSMRTReadCoordinates(FASTQSequence &seq, int &x, int &y) {
+	std::string str(seq.title, seq.titleLength);
+	std::vector<std::string> titleTokens;
+	Splice(str, "_", titleTokens);
+	int i;
+	x = y = -1;
+	int cmp;
+	for (i = 0; i < titleTokens.size(); i++ ) {
+		if (titleTokens[i].size() > 1 && titleTokens[i][0] == 'x') {
+			x = atoi(&titleTokens[i].c_str()[1]);
+		}
+		if (titleTokens[i].size() > 1 && titleTokens[i][0] == 'y') {
+			y = atoi(&titleTokens[i].c_str()[1]);
+		}
+	}
+	assert("Could not parse a title to find an x coordinate" != 0 or x != -1);
+	assert("Could not parse a title to find a y coordiante" != 0 or y != -1);
+}
+
+void GetSpringfieldHoleNumberFromTitle(FASTQSequence &seq, unsigned int &holeNumber) {
+	std::vector<std::string> titleTokens;
+	Splice(seq.title, "/", titleTokens);
+	if (titleTokens.size() < 2) {
+		return;
+	}
+	holeNumber = atoi(titleTokens[1].c_str());
+}
+			
+bool ParsePBIReadName(std::string &readName, std::string &movieName, int &holeNumber) {
+  std::vector<std::string> tokens;
+  ParseSeparatedList(readName, tokens, '/');
+  if (tokens.size() < 2) {
+    movieName = "";
+    holeNumber = 0;
+    return false;
+  }
+  else {
+    movieName = tokens[0];
+    holeNumber = atoi(tokens[1].c_str());
+    return true;
+  }
+}
diff --git a/libcpp/pbdata/utils/SMRTReadUtils.hpp b/libcpp/pbdata/utils/SMRTReadUtils.hpp
new file mode 100644
index 0000000..bbf0d9c
--- /dev/null
+++ b/libcpp/pbdata/utils/SMRTReadUtils.hpp
@@ -0,0 +1,18 @@
+#ifndef _BLASR_SMRT_READ_UTILS_HPP_
+#define _BLASR_SMRT_READ_UTILS_HPP_
+
+#include <stdlib.h>
+
+#include "FASTQSequence.hpp"
+#include "StringUtils.hpp"
+
+void GetSMRTReadCoordinates(FASTQSequence &seq, int &x, int &y);
+
+void GetSpringfieldHoleNumberFromTitle(FASTQSequence &seq,
+                                       unsigned int &holeNumber);
+
+// Parse a PBIRead name of format movie/holeNumber/s_e, or /movie/holeNumber 
+// and get movieName, holeNumber.
+bool ParsePBIReadName(std::string &readName, std::string &movieName, int &holeNumber);
+
+#endif
diff --git a/libcpp/pbdata/utils/SMRTTitle.cpp b/libcpp/pbdata/utils/SMRTTitle.cpp
new file mode 100644
index 0000000..d1c3262
--- /dev/null
+++ b/libcpp/pbdata/utils/SMRTTitle.cpp
@@ -0,0 +1,52 @@
+#include "utils/SMRTTitle.hpp"
+
+/// Parse a Pacbio read name, it is a SMRTTitle, get movieName, 
+/// holeNumber, start and end, set isSMRTTitle to be true. 
+/// Otherwise, set isSMRTTitle to be false.
+/// Two types of smrtTitles are supported:
+///     movie/zmw/start_end --> start = start, end = end
+///     movie/zmw/start_end/start2_end2 --> start = start+start2, end = start+end2
+/// \param[in]: readName, a PacBio read name string.
+SMRTTitle::SMRTTitle(const std::string & readName) {
+    isSMRTTitle = false;
+    movieName = "";
+    holeNumber = 0; 
+    start = end = 0;
+
+    std::vector<std::string> values;
+    ParseSeparatedList(readName, values, '/');
+
+    int numValues = values.size();
+    if (numValues == 3 or numValues == 4) {
+        movieName = values[0];
+        holeNumber = static_cast<UInt>(atoi(values[1].c_str()));
+        std::vector<std::string> offsets;
+        ParseSeparatedList(values[2], offsets, '_');
+        if (offsets.size() == 2) {
+            start = static_cast<DNALength>(atoi(offsets[0].c_str()));
+            end   = static_cast<DNALength>(atoi(offsets[1].c_str()));
+            if (numValues == 3) {
+                isSMRTTitle = true;
+            } else if (numValues == 4) {
+                offsets.clear();
+                ParseSeparatedList(values[3], offsets, '_');
+                if (offsets.size() == 2) {
+                    end   = static_cast<DNALength>(start + atoi(offsets[1].c_str()));
+                    start = static_cast<DNALength>(start + atoi(offsets[0].c_str()));
+                    isSMRTTitle = true;
+                }
+            }
+        }
+    }
+}
+
+std::string SMRTTitle::ToString() {
+    if (not isSMRTTitle) {
+        return "";
+    } else {
+        std::stringstream ss;
+        ss << movieName << "/" << holeNumber << "/" << start << "_" << end;
+        return ss.str();
+    }
+}
+
diff --git a/libcpp/pbdata/utils/SMRTTitle.hpp b/libcpp/pbdata/utils/SMRTTitle.hpp
new file mode 100644
index 0000000..33b108b
--- /dev/null
+++ b/libcpp/pbdata/utils/SMRTTitle.hpp
@@ -0,0 +1,24 @@
+#ifndef _BLASR_SMRT_TITLE_HPP_
+#define _BLASR_SMRT_TITLE_HPP_
+#include <string>
+#include <vector>
+#include <sstream>
+#include "Types.h"
+#include "StringUtils.hpp"
+
+class SMRTTitle {
+public:
+    std::string movieName;
+    UInt holeNumber;
+    DNALength start;
+    DNALength end;
+    // if input name is a smrt title.
+    bool isSMRTTitle;
+
+    SMRTTitle(const std::string & name);
+
+    /// \returns smrt title movie/zmw/s_e, if input read is a smrt title;
+    /// otherwise, return an empty string.
+    std::string ToString();
+};
+#endif
diff --git a/libcpp/pbdata/utilsImpl.hpp b/libcpp/pbdata/utilsImpl.hpp
new file mode 100644
index 0000000..ee899cd
--- /dev/null
+++ b/libcpp/pbdata/utilsImpl.hpp
@@ -0,0 +1,32 @@
+#ifndef _BLASR_UTIL_IMPL_HPP_
+#define _BLASR_UTIL_IMPL_HPP_
+
+template<typename t_file>
+void CrucialOpen(std::string &fileName, t_file &file, std::ios_base::openmode mode) {
+	if (mode==0)
+		file.open(fileName.c_str());
+	else
+		file.open(fileName.c_str(), mode);
+
+	if (!file.good()) {
+		std::cout << "Could not open " << fileName << std::endl;
+		exit(1);
+	}
+}
+template<typename T_Int>
+T_Int CeilOfFraction(T_Int num, T_Int denom) {
+	return num / denom + ((num % denom) && 1);
+}
+
+template<typename T>
+T* ProtectedNew(unsigned long size) {
+    T* ptr;
+    ptr = new T[size];
+    if (ptr == NULL) {
+        std::cout << "ERROR, allocating " << size * sizeof(T) << " bytes.";
+        exit(1);
+    }
+    return ptr;
+}
+
+#endif
diff --git a/libcpp/rules.mk b/libcpp/rules.mk
new file mode 100644
index 0000000..c836d78
--- /dev/null
+++ b/libcpp/rules.mk
@@ -0,0 +1,17 @@
+ARFLAGS         := rc
+CXX_SHAREDFLAGS := -fPIC
+LD_SHAREDFLAGS  := -shared -fPIC
+CPPFLAGS        += $(patsubst %,-I%,${INCLUDES})
+
+
+%.a:
+	${AR} $(ARFLAGS) $@ $^
+
+%.so:
+	${CXX} ${LD_SHAREDFLAGS} ${LDFLAGS} -o $@ $^
+
+%.o: %.cpp
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(LEGACY) $(CPPFLAGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o) $(@:%.o=%.d)" -c $< -o $@
+
+%.shared.o: %.cpp
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(LEGACY) $(CPPFLAGS) $(CXX_SHAREDFLAGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o) $(@:%.o=%.d)" -c $< -o $@
diff --git a/libcpp/simple.mk b/libcpp/simple.mk
new file mode 100644
index 0000000..e725a6e
--- /dev/null
+++ b/libcpp/simple.mk
@@ -0,0 +1,16 @@
+SHELL          = bash
+G_BUILDOS_CMD := bash -c 'set -e; set -o pipefail; id=$$(lsb_release -si | tr "[:upper:]" "[:lower:]"); rel=$$(lsb_release -sr); case $$id in ubuntu) printf "$$id-%04d\n" $${rel/./};; centos) echo "$$id-$${rel%%.*}";; *) echo "$$id-$$rel";; esac' 2>/dev/null
+OS_STRING     ?= $(shell $(G_BUILDOS_CMD))
+
+# magic for non-verbose builds
+V ?= 0
+
+CXX_0 = @echo "  CXX	$@"; $(CXX)
+CXX_1 = $(CXX)
+CXX_pp = $(CXX_$(V))
+
+AR_0 = @echo "  AR	$@"; $(AR)
+AR_1 = $(AR)
+AR_pp = $(AR_$(V))
+
+ARFLAGS := rc
diff --git a/libcpp/unittest/.gitignore b/libcpp/unittest/.gitignore
new file mode 100644
index 0000000..26ca380
--- /dev/null
+++ b/libcpp/unittest/.gitignore
@@ -0,0 +1 @@
+/test-runner
diff --git a/libcpp/unittest/Makefile b/libcpp/unittest/Makefile
new file mode 100644
index 0000000..fe48ef7
--- /dev/null
+++ b/libcpp/unittest/Makefile
@@ -0,0 +1,151 @@
+SHELL=bash
+
+V  := 0
+V@ := @
+ifeq ($(V),$(filter $(V),1))
+    # Enable verbose mode if V=1 or V= specified on command ine
+    V@ :=
+endif
+
+MKDIR := mkdir
+
+null :=
+space := $(null) $(null)
+
+
+
+OUTDIR := _output
+
+GTEST_SRCDIR       := __UNSET__
+
+LIBBLASR_INCLUDE   := __UNSET__
+LIBPBIHDF_INCLUDE  := __UNSET__
+LIBPBDATA_INCLUDE  := __UNSET__
+PBBAM_INCLUDE      := __UNSET__
+HTSLIB_INCLUDE     := __UNSET__
+HDF5_INCLUDE       := __UNSET__
+BOOST_INCLUDE      := __UNSET__
+GTEST_INCLUDE      := __UNSET__
+
+LIBBLASR_LIB       := __UNSET__
+LIBPBIHDF_LIB      := __UNSET__
+LIBPBDATA_LIB      := __UNSET__
+PBBAM_LIB          := __UNSET__
+HTSLIB_LIB         := __UNSET__
+HDF5_LIB           := __UNSET__
+ZLIB_LIB           := __UNSET__
+
+
+
+broken_test_sources := \
+	alignment/files/ReaderAgglomerate_gtest.cpp \
+	alignment/format/SAMHeaderPrinter_gtest.cpp \
+	alignment/format/SAMPrinter_gtest.cpp \
+	alignment/utils/FileUtils_gtest.cpp \
+	$(null)
+
+
+gtest_sources  := $(GTEST_SRCDIR)/gtest/gtest-all.cc \
+                  $(GTEST_SRCDIR)/gtest/gtest_main.cc \
+		  $(null)
+
+test_sources   := $(wildcard pbdata/*.cpp) \
+                  $(wildcard pbdata/utils/*.cpp) \
+                  $(wildcard pbdata/metagenome/*.cpp) \
+                  $(wildcard pbdata/saf/*.cpp) \
+                  $(wildcard pbdata/reads/*.cpp) \
+                  $(wildcard pbdata/qvs/*.cpp)  \
+                  \
+                  $(wildcard hdf/*.cpp) \
+                  \
+                  $(wildcard alignment/*.cpp) \
+                  $(wildcard alignment/utils/*.cpp) \
+                  $(wildcard alignment/datastructures/alignment/*.cpp) \
+                  $(wildcard alignment/files/*.cpp) \
+                  $(wildcard alignment/format/*.cpp) \
+                  $(null)
+
+# Remove broken tests from the test_sources list
+test_sources   := $(filter-out $(broken_test_sources),$(test_sources))
+
+
+sources   := $(gtest_sources) $(test_sources)
+objects   := $(patsubst %.cc,$(OUTDIR)/%.o,$(filter %.cc,$(sources))) \
+             $(patsubst %.cpp,$(OUTDIR)/%.o,$(filter %.cpp,$(sources))) \
+             $(null)
+depfiles  := $(objects:%.o=%.d)
+
+
+includes := \
+    -I. \
+    -I$(GTEST_INCLUDE) \
+    -I$(LIBBLASR_INCLUDE) \
+    -I$(LIBPBIHDF_INCLUDE) \
+    -I$(LIBPBDATA_INCLUDE) \
+    -I$(PBBAM_INCLUDE) \
+    -I$(HTSLIB_INCLUDE) \
+    -I$(HDF5_INCLUDE) \
+    -I$(BOOST_INCLUDE) \
+    $(null)
+
+libs := \
+    $(LIBBLASR_LIB) \
+    $(LIBPBIHDF_LIB) \
+    $(LIBPBDATA_LIB) \
+    $(PBBAM_LIB) \
+    $(HTSLIB_LIB) \
+    $(HDF5_LIB) \
+    $(HDF5_CPP_LIB) \
+    $(ZLIB_LIB) \
+    $(null)
+
+
+sys_ldflags := -lpthread -ldl -lrt
+
+
+cxxopts := -std=c++11 -Wno-div-by-zero 
+cxxflags := -O3
+ldflags := $(libs) $(sys_ldflags)
+
+
+
+CPPFLAGS := $(includes) $(EXTRA_CPPFLAGS)
+CXXFLAGS := $(cxxflags) $(cxxopts) $(EXTRA_CXXFLAGS)
+LDLIBS   := $(ldflags) $(EXTRA_LDLIBS)
+
+OUTPUT_OPTION = -o $@
+COMPILE.cpp   = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
+COMPILE.cc    = $(COMPILE.cpp)
+LINK.o        = $(CXX) $(LDFLAGS) $(TARGET_ARCH)
+
+
+all: test-runner
+
+test-runner: $(objects)
+	$(V@)$(LINK.o) $^ $(LDLIBS) $(OUTPUT_OPTION)
+
+gtest: test-runner
+	$(V@)LD_LIBRARY_PATH=$(subst $(space),:,$(strip $(dir $(libs)))) ./$< --gtest_output=xml:$(OUTDIR)/xml/all.xml
+
+# Build objects
+$(OUTDIR)/%.o: %.cpp
+	@echo "  CXX    $@"
+	$(V@)$(COMPILE.cpp) $(OUTPUT_OPTION) $<
+
+$(OUTDIR)/%.o: %.cc
+	@echo "  CXX    $@"
+	$(V@)$(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+# Make all directories of object files 'order-only' dependencies of all objects
+# This will make all the output directories we need before building any objects
+$(objects): | $(dir $(objects))
+
+# Create any output directories
+$(OUTDIR)/%/:
+	$(V@)$(MKDIR) -p "$@"
+
+
+clean:
+	$(V@)$(RM) -r $(OUTDIR)
+
+-include ($DEPS)
diff --git a/libcpp/unittest/alignment/Makefile b/libcpp/unittest/alignment/Makefile
new file mode 100644
index 0000000..154ab5e
--- /dev/null
+++ b/libcpp/unittest/alignment/Makefile
@@ -0,0 +1,35 @@
+include ../../rules.mk
+include ../defines.mk
+
+SOURCES    = $(wildcard *.cpp) \
+		     $(wildcard utils/*.cpp) \
+		     $(wildcard datastructures/alignment/*.cpp) \
+		     $(wildcard files/*.cpp) \
+		     $(wildcard format/*.cpp) 
+
+ifneq ($(origin nopbbam), undefined)
+	SOURCES := $(filter-out format/SAMHeaderPrinter_gtest.cpp, $(SOURCES))
+endif
+
+OBJECTS    = $(SOURCES:.cpp=.o)
+
+EXE := test-runner
+
+all debug profile: $(EXE)
+
+libblasr_gtest.a: $(OBJECTS)
+	$(AR) $(ARFLAGS)c $@ $^
+
+$(EXE): $(OBJECTS)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $^ $(GTEST_SRC) -o $@ -I$(GTEST_ROOT) $(LIBDIRS) $(LDFLAGS)
+
+$(OBJECTS): %.o: %.cpp
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) -c $< -o $@ $(INCDIRS)
+
+gtest: $(EXE)
+	./$< --gtest_output=xml:../xml/alignment.xml
+
+clean:
+	@find . -type f -name \*.o -delete
+	@find . -type f -name \*.d -delete
+	@rm -f libblasr_gtest.a $(EXE) ../xml/alignment.xml
diff --git a/libcpp/unittest/alignment/datastructures/alignment/AlignmentMap_gtest.cpp b/libcpp/unittest/alignment/datastructures/alignment/AlignmentMap_gtest.cpp
new file mode 100644
index 0000000..52bdb2b
--- /dev/null
+++ b/libcpp/unittest/alignment/datastructures/alignment/AlignmentMap_gtest.cpp
@@ -0,0 +1,63 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  AlignmentMap_gtest.cpp
+ *
+ *    Description:  Test alignment/datastructures/alignment/AlignmentMap.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 01:47:50 PM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include <climits>
+#include <iostream>
+#include <fstream>
+#include "datastructures/alignment/AlignmentMap.hpp"
+#include "gtest/gtest.h"
+
+using namespace std;
+// Test 
+// void CreateSequenceToAlignmentMap(const string & alignedSequence,
+//         vector<int> & baseToAlignmentMap); 
+TEST(AlignmentMap, CreateSequenceToAlignmentMap) {
+    const string & alignedSequence1 = "ATCTGAG-AAA-";
+    const int size1 = 10;
+    int map1[size1] = {0, 1, 2, 3, 4,5, 6, 8, 9, 10};
+
+    const string & alignedSequence2 = "--ATCTGAG----AAA----";
+    const int size2 = 10;
+    int map2[size2] = {2,3,4,5,6,7,8,13,14,15};
+
+    const string & alignedSequence3 = "-------";
+    const int size3 = 0;
+
+    vector <int> resMap1;
+    CreateSequenceToAlignmentMap(alignedSequence1, resMap1); 
+    EXPECT_EQ(size1, resMap1.size());
+    for (int i = 0; i < size1; i++) {
+        // cout << resMap1[i] << ", ";
+        EXPECT_EQ(map1[i], resMap1[i]);
+    }
+    // cout << endl;
+
+    vector <int> resMap2;
+    CreateSequenceToAlignmentMap(alignedSequence2, resMap2);
+    EXPECT_EQ(size2, resMap2.size());
+    for (int i = 0; i < size2; i++) {
+    //    cout << resMap1[i] << ", ";
+        EXPECT_EQ(map2[i], resMap2[i]);
+    }
+    // cout << endl;
+    
+    vector <int> resMap3;
+    CreateSequenceToAlignmentMap(alignedSequence3, resMap3);
+    EXPECT_EQ(size3, resMap3.size());
+
+}
diff --git a/libcpp/unittest/alignment/datastructures/alignment/CmpIndexedStringTable_gtest.cpp b/libcpp/unittest/alignment/datastructures/alignment/CmpIndexedStringTable_gtest.cpp
new file mode 100644
index 0000000..7080876
--- /dev/null
+++ b/libcpp/unittest/alignment/datastructures/alignment/CmpIndexedStringTable_gtest.cpp
@@ -0,0 +1,143 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  CmpIndexedStringTable_gtest.cpp
+ *
+ *    Description:  Test alignment/datastructures/alignment/CmpIndexedStringTable.h
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 01:50:24 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+#include "gtest/gtest.h"
+#include "datastructures/alignment/CmpIndexedStringTable.h"
+
+int    ids[5]   = {1,    2,    3,    30,    5};
+string names[5] = {"n1", "n2", "n3", "n30", "n5"};
+class CmpIndexedStringTableTest : public ::testing::Test {
+public:
+    //Be careful, SetUp() not Setup()
+    virtual void SetUp() {
+        for(int i = 0; i < 5; i++) {
+            cmpIndexedStringTableTest.ids.push_back(ids[i]);
+            cmpIndexedStringTableTest.names.push_back(names[i]);
+        }
+        cmpIndexedStringTableTest.StoreArrayIndexMap();
+
+    }
+
+    virtual void TearDown() {
+    
+    }
+
+    CmpIndexedStringTable cmpIndexedStringTableTest;
+};
+
+
+//
+// Test resize(int size)
+//
+TEST_F (CmpIndexedStringTableTest, resize) {
+    cmpIndexedStringTableTest.resize(10);
+
+    EXPECT_EQ(cmpIndexedStringTableTest.names.size(), 10);
+    EXPECT_EQ(cmpIndexedStringTableTest.ids.size(), 10);
+}
+
+//
+// Test StoreArrayIndexMap()
+//
+TEST_F (CmpIndexedStringTableTest, StoreArrayIndexMap) {
+    for(int i = 0; i < cmpIndexedStringTableTest.ids.size(); i++) {
+        EXPECT_EQ(cmpIndexedStringTableTest.idToArrayIndex.find(cmpIndexedStringTableTest.ids[i])->second, i);
+    }
+    EXPECT_EQ(cmpIndexedStringTableTest.idToArrayIndex.find(1 )->second,  0);
+    EXPECT_EQ(cmpIndexedStringTableTest.idToArrayIndex.find(2 )->second,  1);
+    EXPECT_EQ(cmpIndexedStringTableTest.idToArrayIndex.find(3 )->second,  2);
+    EXPECT_EQ(cmpIndexedStringTableTest.idToArrayIndex.find(30)->second, 3);
+    EXPECT_EQ(cmpIndexedStringTableTest.idToArrayIndex.find(5 )->second,  4);
+}
+
+//
+// Test GetIndexOfId(int id, int & index)
+//
+TEST_F (CmpIndexedStringTableTest, GetIndexOfId) {
+    int index = -1;
+    int i = 0;
+    for(i = 0; i < cmpIndexedStringTableTest.ids.size(); i++) {
+        cmpIndexedStringTableTest.GetIndexOfId(ids[i], index);
+        EXPECT_EQ(index, i);
+    }
+    i = 1;
+    cmpIndexedStringTableTest.GetIndexOfId(i, index);
+    EXPECT_EQ(index, 0);
+
+    i = 2;
+    cmpIndexedStringTableTest.GetIndexOfId(i, index);
+    EXPECT_EQ(index, 1);
+
+    i = 3;
+    cmpIndexedStringTableTest.GetIndexOfId(i, index);
+    EXPECT_EQ(index, 2);
+    
+    i = 5;
+    cmpIndexedStringTableTest.GetIndexOfId(i, index);
+    EXPECT_EQ(index, 4);
+    
+    i = 30;
+    cmpIndexedStringTableTest.GetIndexOfId(i, index);
+    EXPECT_EQ(index, 3);
+}
+
+//
+// Test GetNameAtIndex(int index, string & name)
+//
+TEST_F (CmpIndexedStringTableTest, GetNameAtIndex) {
+    // "Warning: the terminology of CmpIndexedStringTable.GetNameAtIndex
+    // is confusing" 
+        
+    int index;
+    string name;
+    bool found;
+    
+    index = 1;
+    found = cmpIndexedStringTableTest.GetNameAtIndex(index, name);
+    EXPECT_EQ(name, "n1");
+    EXPECT_TRUE(found);
+
+
+    index = 2;
+    found = cmpIndexedStringTableTest.GetNameAtIndex(index, name);
+    EXPECT_EQ(name, "n2");
+    EXPECT_TRUE(found);
+
+
+    index = 3;
+    found = cmpIndexedStringTableTest.GetNameAtIndex(index, name);
+    EXPECT_EQ(name, "n3");
+    EXPECT_TRUE(found);
+
+    index = 30;
+    found = cmpIndexedStringTableTest.GetNameAtIndex(index, name);
+    EXPECT_EQ(name, "n30");
+    EXPECT_TRUE(found);
+    
+    index = 5;
+    found = cmpIndexedStringTableTest.GetNameAtIndex(index, name);
+    EXPECT_EQ(name, "n5");
+    EXPECT_TRUE(found);
+
+    //
+    //test getting name at an out-of-boundary index
+    //
+    index = 100;
+    found = cmpIndexedStringTableTest.GetNameAtIndex(index, name);
+    EXPECT_FALSE(found);
+}
+
diff --git a/libcpp/unittest/alignment/files/CCSIterator_gtest.cpp b/libcpp/unittest/alignment/files/CCSIterator_gtest.cpp
new file mode 100644
index 0000000..eba2a24
--- /dev/null
+++ b/libcpp/unittest/alignment/files/CCSIterator_gtest.cpp
@@ -0,0 +1,66 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  CCSIterator_gtest.cpp
+ *
+ *    Description:  Test alignment/files/CCSIterator.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 04:51:02 PM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+
+#include "gtest/gtest.h"
+#include "files/CCSIterator.hpp"
+#include "reads/RegionTable.hpp"
+#include "HDFRegionTableReader.hpp"
+#include "pbdata/testdata.h"
+
+using namespace std;
+
+class CCSIteratorTestFixture: public testing::Test {
+public:
+    CCSIteratorTestFixture() {
+    }
+
+    void SetUp() {
+        fileName = baxFile2; 
+        reader = new HDFRegionTableReader();
+        ccs = new CCSSequence();
+        rgn = new RegionTable();
+
+        int rev = reader->Initialize(fileName);
+        EXPECT_TRUE(rev);
+        reader->ReadTable(*rgn);
+        reader->Close();
+
+        rgn->SortTableByHoleNumber();
+    }
+
+    void TearDown() {
+        if (reader) delete reader;
+        if (ccs) delete ccs;
+        if (rgn) delete rgn;
+    }
+
+    ~CCSIteratorTestFixture() {
+    }
+
+    string fileName;
+    HDFRegionTableReader * reader;
+    CCSSequence * ccs;
+    RegionTable * rgn;
+    CCSIterator it;
+};
+
+
+TEST_F(CCSIteratorTestFixture, Initialize) {
+ 
+}
diff --git a/libcpp/unittest/alignment/files/FragmentCCSIterator_gtest.cpp b/libcpp/unittest/alignment/files/FragmentCCSIterator_gtest.cpp
new file mode 100644
index 0000000..e1b2d0c
--- /dev/null
+++ b/libcpp/unittest/alignment/files/FragmentCCSIterator_gtest.cpp
@@ -0,0 +1,104 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  FragmentCCSIterator_gtest.cpp
+ *
+ *    Description:  Test alignment/files/FragmentCCSIterator.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 04:51:29 PM
+ *       Revision:  08/20/2014
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include <algorithm>
+#include <stdio.h>
+#include <string.h>
+#include "files/FragmentCCSIterator.hpp"
+#include "reads/RegionTable.hpp"
+#include "HDFRegionTableReader.hpp"
+#include "pbdata/testdata.h"
+#include <gtest/gtest.h>
+using namespace std;
+
+class FragmentCCSIteratorTestFixture: public testing::Test {
+public:
+    FragmentCCSIteratorTestFixture() {
+    }
+
+    void SetUp() {
+        fileName = baxFile1;
+        reader = new HDFRegionTableReader();
+        ccs = new CCSSequence();
+        rgn = new RegionTable();
+
+        int rev = reader->Initialize(fileName);
+        EXPECT_TRUE(rev);
+        reader->ReadTable(*rgn);
+        reader->Close();
+
+        rgn->SortTableByHoleNumber();
+    }
+
+    void TearDown() {
+        if (reader) delete reader;
+        if (ccs) delete ccs;
+        if (rgn) delete rgn;
+    }
+
+    ~FragmentCCSIteratorTestFixture() {
+    }
+
+    string fileName;
+    HDFRegionTableReader * reader;
+    CCSSequence * ccs;
+    RegionTable * rgn;
+    FragmentCCSIterator it;
+};
+
+
+TEST_F(FragmentCCSIteratorTestFixture, Initialize) {
+    // void Initialize(CCSSequence *_seqPtr, RegionTable *_regionTablePtr) {
+    ccs->zmwData.holeNumber = 10;
+    it.Initialize(ccs, rgn);
+
+    int numPasses = it.GetNumPasses();
+    EXPECT_EQ(numPasses, 7);
+/*
+ * The region table of zmw 10 is:
+ *
+    (52,0): 10, 1, 0, 443, -1,
+    (53,0): 10, 1, 487, 1168, -1,
+    (54,0): 10, 1, 1213, 1907, -1,
+    (55,0): 10, 1, 1956, 2619, -1,
+    (56,0): 10, 1, 2668, 3423, -1,
+    (57,0): 10, 1, 3474, 4205, -1,
+    (58,0): 10, 1, 4256, 5949, -1,
+    (59,0): 10, 1, 5997, 6161, -1,
+    (60,0): 10, 0, 443, 487, 863,
+    (61,0): 10, 0, 1168, 1213, 822,
+    (62,0): 10, 0, 1907, 1956, 836,
+    (63,0): 10, 0, 2619, 2668, 693,
+    (64,0): 10, 0, 3423, 3474, 764,
+    (65,0): 10, 0, 4205, 4256, 862,
+    (66,0): 10, 0, 5949, 5997, 812,
+    (67,0): 10, 2, 0, 4920, 788,
+ *
+ */
+    int exp_directions[7] = {0, 1, 0, 1, 0, 1, 0};
+    int exp_starts[7] = {0, 487, 1213, 1956, 2668, 3474, 4256};
+    int exp_ends[7]  = {443, 1168, 1907, 2619, 3423, 4205, 4920};
+
+    int passDirection, start, numBases;
+    for(int i=0; i < numPasses; i++) {
+        it.GetNext(passDirection, start, numBases);
+        EXPECT_EQ(passDirection, exp_directions[i]);
+        EXPECT_EQ(start, exp_starts[i]);
+        EXPECT_EQ(start + numBases, exp_ends[i]);
+    }
+}
diff --git a/libcpp/unittest/alignment/files/ReaderAgglomerate_gtest.cpp b/libcpp/unittest/alignment/files/ReaderAgglomerate_gtest.cpp
new file mode 100644
index 0000000..f27eb16
--- /dev/null
+++ b/libcpp/unittest/alignment/files/ReaderAgglomerate_gtest.cpp
@@ -0,0 +1,129 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  ReaderAgglomerate_gtest.cpp
+ *
+ *    Description:  Test alignment/files/ReaderAgglomerate.hpp
+ *
+ *        Version:  1.0
+ *        Created:  02/25/2015 04:51:29 PM
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include <algorithm>
+#include <stdio.h>
+#include <string.h>
+#include "files/ReaderAgglomerate.hpp"
+#include "pbdata/testdata.h"
+#include <gtest/gtest.h>
+using namespace std;
+
+class ReaderAgglomerateTest: public testing::Test {
+public:
+    void SetUp() {
+        reader = new ReaderAgglomerate();
+    }
+
+    void TearDown() {
+        if (reader) {
+            delete reader;
+            reader = NULL;
+        }
+    }
+    ReaderAgglomerate * reader;
+};
+
+#define INIT_READER(INFILE) \
+    fn = INFILE; \
+    reader->SetReadFileName(fn); \
+    EXPECT_EQ(reader->Initialize(), 1);
+
+TEST_F(ReaderAgglomerateTest, Initialize) {
+    string fn;
+    INIT_READER(fastaFile1)
+    reader->Close();
+
+    INIT_READER(baxFile1)
+    reader->Close();
+
+    INIT_READER(baxFile3)
+    reader->Close();
+}
+
+
+#define SIMPLE(INFILE, SEQ) \
+    INIT_READER(INFILE) \
+    for(int i = 0; i < 10; i++) {\
+        reader->GetNext(SEQ);\
+    }\
+    reader->Close();
+
+TEST_F(ReaderAgglomerateTest, Simple) {
+    string fn;
+
+    // Fasta
+    FASTASequence fastaSeq;
+    SIMPLE(fastaFile1, fastaSeq)
+    
+    // Bax
+    SMRTSequence smrtSeq;
+    SIMPLE(baxFile1, smrtSeq)
+    SIMPLE(baxFile3, smrtSeq)
+}
+
+#define GET_MOVIE_NAME(INFILE) \
+    INIT_READER(INFILE) \
+    reader->GetMovieName(movieName); \
+    reader->Close();
+
+TEST_F(ReaderAgglomerateTest, GetMovieName) {
+    string fn;
+    string movieName = "";
+    // Fasta
+    GET_MOVIE_NAME(fastaFile1)
+    EXPECT_EQ(movieName, "/mnt/secondary-siv/testdata/BlasrTestData/utest/data/read.fasta");
+
+    // Bax
+    GET_MOVIE_NAME(baxFile1)
+    EXPECT_EQ(movieName, "m130220_114643_42129_c100471902550000001823071906131347_s1_p0");
+
+    GET_MOVIE_NAME(baxFile3)
+    EXPECT_EQ(movieName, "m150223_190837_42175_c100735112550000001823160806051530_s1_p0");
+}
+
+#define GET_CHEMISTRY_TRIPLE(INFILE, A, B, C) \
+    INIT_READER(INFILE) \
+    bindingKit = sequencingKit = version; \
+    reader->GetChemistryTriple(bindingKit, sequencingKit, version); \
+    reader->Close(); \
+    EXPECT_EQ(bindingKit, A); \
+    EXPECT_EQ(sequencingKit, B); \
+    EXPECT_EQ(version, C);
+
+TEST_F(ReaderAgglomerateTest, GetChemistryTriple) {
+    string fn;
+    string bindingKit, sequencingKit, version;
+
+    GET_CHEMISTRY_TRIPLE(baxFile3, "100356300", "100356200", "2.3")
+} 
+
+TEST_F(ReaderAgglomerateTest, ReadFromBam) {
+    string fn (bamFile1);
+    reader->SetReadFileName(fn);
+    EXPECT_EQ(reader->Initialize(), 1);
+
+    SMRTSequence seq;
+    int ret, count=0;
+    while (ret = reader->GetNext(seq) and ret != 0) { 
+        count++;
+    }
+
+    EXPECT_EQ(count, 116);
+
+    reader->Close();
+}
diff --git a/libcpp/unittest/alignment/format/SAMHeaderPrinter_gtest.cpp b/libcpp/unittest/alignment/format/SAMHeaderPrinter_gtest.cpp
new file mode 100644
index 0000000..7547254
--- /dev/null
+++ b/libcpp/unittest/alignment/format/SAMHeaderPrinter_gtest.cpp
@@ -0,0 +1,138 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  SAMHeaderPrinter_gtest.cpp
+ *
+ *    Description:  Test alignment/format/SAMHeaderPrinter.hpp
+ *
+ *        Version:  1.0
+ *        Created:  03/24/2015 04:51:29 PM
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#define private public
+#define protected public
+
+#include <algorithm>
+#include <stdio.h>
+#include <string.h>
+#include "FASTAReader.hpp"
+#include "format/SAMHeaderPrinter.hpp"
+#include "pbdata/testdata.h"
+#include <gtest/gtest.h>
+using namespace std;
+
+class SAMHeaderPrinterTest: public testing::Test {
+public:
+    void SetUp() {
+        samQVs.SetDefaultQV(); 
+        so = "UNKNOWN";
+        readType = ReadType::SUBREAD;
+
+        int rand;
+        string fastaFn(fastaFile1);
+        reader.computeMD5 = true;
+        EXPECT_TRUE(reader.Init(fastaFn));
+        reader.ReadAllSequencesIntoOne(sequence, &seqdb);
+    }
+
+    void TearDown() {
+        if (printer) {
+            delete printer;
+            printer = NULL;
+        }
+    }
+
+    SAMHeaderPrinter * printer;
+    SupplementalQVList samQVs;
+    string so;
+    ReadType::ReadTypeEnum readType;
+    FASTAReader reader;
+    FASTASequence sequence;
+    SequenceIndexDatabase<FASTASequence> seqdb;
+};
+
+
+const string bax1ExpectedHeader = 
+"PU:m130220_114643_42129_c100471902550000001823071906131347_s1_p0\tPL:PACBIO\tDS:READTYPE=SUBREAD;BINDINGKIT=;SEQUENCINGKIT=;BASECALLERVERSION=2.0;InsertionQV=iq;DeletionQV=dq;SubstitutionQV=sq;MergeQV=mq;DeletionTag=dt";
+
+const string bax3ExpectedHeader = 
+"PU:m150223_190837_42175_c100735112550000001823160806051530_s1_p0\tPL:PACBIO\tDS:READTYPE=SUBREAD;BINDINGKIT=100356300;SEQUENCINGKIT=100356200;BASECALLERVERSION=2.3;InsertionQV=iq;DeletionQV=dq;SubstitutionQV=sq;MergeQV=mq;DeletionTag=dt";
+
+const string pls1ExpectedHeader = 
+"PU:m121215_065521_richard_c100425710150000001823055001121371_s1_p0\tPL:PACBIO\tDS:READTYPE=SUBREAD;BINDINGKIT=;SEQUENCINGKIT=;BASECALLERVERSION=1.3;InsertionQV=iq;DeletionQV=dq;SubstitutionQV=sq;MergeQV=mq;DeletionTag=dt";
+
+TEST_F(SAMHeaderPrinterTest, BAX_ONE_MOVIE_IN) {
+    // Read from two bax files of the same movie.
+    EXPECT_EQ(readType, ReadType::ReadTypeEnum::SUBREAD);
+    vector<string> readsFiles = {baxFile1, baxFile2};
+    printer = new SAMHeaderPrinter(so, seqdb, readsFiles, readType, samQVs, "blasr", "1.3.2", "blasr a b c");
+
+    EXPECT_EQ(printer->_hd.ToString().find("@HD\tVN:1.5\tSO:UNKNOWN\tpb:3.0b"), 0);
+    EXPECT_EQ(printer->_sqs._groups.size(), 12);
+    EXPECT_EQ(printer->_sqs._groups[0].ToString().find ("@SQ\tSN:read1\tLN:100\tM5:"), 0);
+    EXPECT_EQ(printer->_sqs._groups[11].ToString().find ("@SQ\tSN:read2x\tLN:100\tM5:"), 0);
+    
+    // Expect exactly one read group 
+    EXPECT_EQ(printer->_rgs._groups.size(), 1);
+    EXPECT_NE(printer->_rgs._groups[0].ToString().find(bax1ExpectedHeader), string::npos);
+
+    EXPECT_EQ(printer->_pgs._groups.size(), 1);
+    EXPECT_EQ(printer->_cos._groups.size(), 0);
+}
+
+TEST_F(SAMHeaderPrinterTest, BAX_MULTI_MOVIE_IN) {
+    // Read subread from more than one movies
+    vector<string> readsFiles = {baxFile1, baxFile2, baxFile3, plsFile1};
+    printer = new SAMHeaderPrinter(so, seqdb, readsFiles, readType, samQVs, "blasr", "1.3.2", "blasr a b c");
+
+    EXPECT_EQ(printer->_hd.ToString().find("@HD\tVN:1.5\tSO:UNKNOWN\tpb:3.0b"), 0);
+    EXPECT_EQ(printer->_sqs._groups.size(), 12);
+    EXPECT_EQ(printer->_sqs._groups[0].ToString().find ("@SQ\tSN:read1\tLN:100\tM5:"), 0);
+    EXPECT_EQ(printer->_sqs._groups[11].ToString().find ("@SQ\tSN:read2x\tLN:100\tM5:"), 0);
+    
+    // Expect three read groups because baxFile1 and baxFile2 contains reads of the same movie.
+    EXPECT_EQ(printer->_rgs._groups.size(), 3);
+
+    EXPECT_NE(printer->_rgs._groups[0].ToString().find(bax1ExpectedHeader), string::npos);
+    EXPECT_NE(printer->_rgs._groups[1].ToString().find(bax3ExpectedHeader), string::npos);
+    EXPECT_NE(printer->_rgs._groups[2].ToString().find(pls1ExpectedHeader), string::npos);
+
+    EXPECT_EQ(printer->_pgs._groups.size(), 1);
+    EXPECT_EQ(printer->_cos._groups.size(), 0);
+}
+
+
+const string bam1ExpectedHeader = 
+"@RG\tID:b89a4406\tPL:PACBIO\tDS:READTYPE=SUBREAD;DeletionQV=dq;DeletionTag=dt;InsertionQV=iq;MergeQV=mq;SubstitutionQV=sq;Ipd=ip;BINDINGKIT=100356300;SEQUENCINGKIT=100356200;BASECALLERVERSION=2.3.0.0.140018\tPU:m140905_042212_sidney_c100564852550000001823085912221377_s1_X0";
+const string bam2ExpectedHeader = 
+"PL:PACBIO\tDS:READTYPE=SUBREAD;DeletionQV=dq;DeletionTag=dt;InsertionQV=iq;MergeQV=mq;SubstitutionQV=sq;Ipd=ip;BINDINGKIT=100236500;SEQUENCINGKIT=001558034;BASECALLERVERSION=2.3.0.1.142990\tPU:m150325_224749_42269_c100795290850000001823159309091522_s1_p0";
+
+TEST_F(SAMHeaderPrinterTest, ONE_BAM_IN) {
+    // Read the same file twice in order to test uniqueness of @RG
+    vector<string> readsFiles = {bamFile1, bamFile1}; 
+    printer = new SAMHeaderPrinter(so, seqdb, readsFiles, readType, samQVs, "blasr", "1.3.2", "blasr a b c");
+
+    EXPECT_EQ(printer->_rgs._groups.size(), 1);
+    EXPECT_EQ(printer->_rgs._groups[0].ToString(), bam1ExpectedHeader);
+
+    EXPECT_EQ(printer->_pgs._groups.size(), 3);
+}
+
+TEST_F(SAMHeaderPrinterTest, TWO_BAM_IN) {
+    // Read multiple bam files 
+    vector<string> readsFiles = {bamFile1, bamFile2}; 
+    printer = new SAMHeaderPrinter(so, seqdb, readsFiles, readType, samQVs, "blasr", "1.3.2", "blasr a b c");
+
+    EXPECT_EQ(printer->_rgs._groups.size(), 2);
+    EXPECT_NE(printer->_rgs._groups[0].ToString().find(bam1ExpectedHeader), string::npos);
+    EXPECT_NE(printer->_rgs._groups[1].ToString().find(bam2ExpectedHeader), string::npos);
+
+    EXPECT_EQ(printer->_pgs._groups.size(), 3);
+}
+
diff --git a/libcpp/unittest/alignment/format/SAMPrinter_gtest.cpp b/libcpp/unittest/alignment/format/SAMPrinter_gtest.cpp
new file mode 100644
index 0000000..63331b7
--- /dev/null
+++ b/libcpp/unittest/alignment/format/SAMPrinter_gtest.cpp
@@ -0,0 +1,45 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  SAMHeaderPrinter_gtest.cpp
+ *
+ *    Description:  Test alignment/format/SAMHeaderPrinter.hpp
+ *
+ *        Version:  1.0
+ *        Created:  03/24/2015 04:51:29 PM
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#define private public
+#define protected public
+
+#include <algorithm>
+#include <stdio.h>
+#include <string.h>
+#include "format/SAMPrinter.hpp"
+#include <gtest/gtest.h>
+using namespace std;
+
+TEST(SAMPrinterTest, AddMatchBlockCigarOps) {
+    DNASequence qSeq; qSeq.Copy("XXXXXAAAAAGGGGGCCCCC");
+    DNASequence tSeq; tSeq.Copy(     "AAAAANGGGGCCCCC");
+    blasr::Block b; 
+    b.qPos = 5;
+    b.tPos = 0;
+    b.length=15;
+    vector<int> opSize;
+    vector<char> opChar;
+
+    const vector<int>  expOpSize = {5  , 1  , 9  };
+    const vector<char> expOpChar = {'=', 'X', '='};
+
+    AddMatchBlockCigarOps(qSeq, tSeq, b, opSize, opChar);
+
+    EXPECT_EQ(opSize, expOpSize);
+    EXPECT_EQ(opChar, expOpChar);
+}
diff --git a/libcpp/unittest/alignment/utils/FileUtils_gtest.cpp b/libcpp/unittest/alignment/utils/FileUtils_gtest.cpp
new file mode 100644
index 0000000..1b2ea3b
--- /dev/null
+++ b/libcpp/unittest/alignment/utils/FileUtils_gtest.cpp
@@ -0,0 +1,54 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  FileUtils_gtest.cpp
+ *
+ *    Description:  Test alignment/utils/FileUtils.hpp
+ *
+ *        Version:  1.0
+ *        Created:  10/29/2012 05:20:43 PM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "utils/FileUtils.hpp"
+
+using namespace std;
+
+string nonexistfile = "/nonexistingdir/nonexistingfile";
+string readablefile = "/bin/ls";
+string writeablefile = "/tmp/writabletmpfile";
+string expected_errmsg = "^.+$";
+
+TEST(FILEUTILS, CriticalOpenRead) {
+    ifstream ifs;
+    EXPECT_EXIT(CriticalOpenRead(nonexistfile, ifs, std::ios::in),
+        ::testing::ExitedWithCode(1), expected_errmsg);
+    CriticalOpenRead(readablefile, ifs, std::ios::in);
+}
+
+TEST(FILEUTILS, OpenRead) {
+    ifstream ifs;
+    EXPECT_EQ( OpenRead(nonexistfile, ifs, std::ios::in), 0);
+    EXPECT_EQ( OpenRead(readablefile, ifs, std::ios::in), 1);
+}
+
+
+TEST(FILEUTILS, CriticalOpenWrite) {
+    ofstream ofs;
+    EXPECT_EXIT( CriticalOpenWrite(nonexistfile, ofs, std::ios::out),
+        ::testing::ExitedWithCode(1), expected_errmsg);
+    CriticalOpenWrite(writeablefile, ofs, std::ios::out);
+}
+
+TEST(FILEUTILS, OpenWrite) {
+    ofstream ofs;
+    EXPECT_EQ(OpenWrite(nonexistfile, ofs, std::ios::out), 0);
+    EXPECT_EQ(OpenWrite(writeablefile, ofs, std::ios::out), 1);
+}
diff --git a/libcpp/unittest/alignment/utils/RangeUtils_gtest.cpp b/libcpp/unittest/alignment/utils/RangeUtils_gtest.cpp
new file mode 100644
index 0000000..482e586
--- /dev/null
+++ b/libcpp/unittest/alignment/utils/RangeUtils_gtest.cpp
@@ -0,0 +1,63 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  RangeUtils_gtest.cpp
+ *
+ *    Description:  Test alignment/utils/RangeUtils.hpp
+ *
+ *        Version:  1.0
+ *        Created:  05/2/2013 06:01:01 PM
+ *       Revision:  08/21/2014
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "utils/RangeUtils.hpp"
+
+TEST(RangeTest, RangeConstructor) {
+    Range r(1, 2);
+    EXPECT_EQ(r.start, 1);
+    EXPECT_EQ(r.end, 2);
+
+    Range r2(1);
+    EXPECT_EQ(r2.end, 1);
+}
+
+TEST(RangeTest, Ranges) {
+    UInt queryInRange[11] = {1,2,3,4,10,11,12,13,14,15,20};
+    UInt queryNotInRange[8] = {0, 16, 17, 18, 19, 30, 5, 100000}; 
+
+    Ranges ranges1(string("1,2,3,4,10-15,20-20"));
+
+    for (int i = 0; i < 11; i++) {
+        EXPECT_TRUE(ranges1.contains(queryInRange[i]));
+    }
+
+    for (int i = 0; i < 8; i++) {
+        EXPECT_FALSE(ranges1.contains(queryNotInRange[i]));
+    }
+}
+
+TEST(RangeTest, SetRanges) {
+    Ranges rs;
+    rs.setRanges("199");
+
+    EXPECT_TRUE(rs.contains(199));
+    EXPECT_EQ(rs.size(), 1);
+}
+
+
+TEST(RangeTest, max) {
+    Ranges rs("199");
+    EXPECT_EQ(rs.max(), 199);
+    Ranges rs1("1, 10000, 10-30, 4000-5000");
+    EXPECT_EQ(rs1.max(), 10000);
+
+    Ranges rs2("1, 1000, 10-30, 4000-5000, 633-877");
+    EXPECT_EQ(rs2.max(), 5000);
+}
diff --git a/libcpp/unittest/alignment/utils/RegionUtils_gtest.cpp b/libcpp/unittest/alignment/utils/RegionUtils_gtest.cpp
new file mode 100644
index 0000000..2daaa86
--- /dev/null
+++ b/libcpp/unittest/alignment/utils/RegionUtils_gtest.cpp
@@ -0,0 +1,236 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  RegionUtils_gtest.cpp
+ *
+ *    Description:  Test alignment/utils/RegionUtils.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 05:11:56 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+
+#include "gtest/gtest.h"
+#include "utils/RegionUtils.hpp"
+#include "reads/RegionTable.hpp"
+#include "HDFRegionTableReader.hpp"
+#include "pbdata/testdata.h"
+
+class RegionUtilTestFixture: public testing::Test {
+public:
+    RegionUtilTestFixture() {
+        fileName = baxFile1; 
+        reader = new HDFRegionTableReader();
+        int rev = reader->Initialize(fileName);
+        EXPECT_TRUE(rev);
+        reader->ReadTable(regionTable);
+        reader->Close();
+    }
+
+    void SetUp() {
+        /* The region table for hole number 14798 is as follows.
+         * type start end  score
+         *   1   0    712   -1 
+         *   1   760  2040  -1 
+         *   1   2098 3452  -1
+         *   0   712  760   937
+         *   0   2040 2098  741
+         *   2   0    3424  819
+         *   where type 1 = insertion, 0 = adapter, 2 = HQRegion
+         * */
+        hqStart = 0;
+        hqEnd   = 3424;
+        hqScore = 819;
+        holeNumber = 14798;
+
+        int srs[29][2] = {{95, 353},
+              {404, 955},
+              {998, 1243},
+              {1289, 1529},
+              {1576, 1824},
+              {1869, 2132},
+              {2178, 2444},
+              {2486, 2727},
+              {2767, 3004},
+              {3047, 3286},
+              {3329, 3537},
+              {3583, 3818},
+              {3862, 4096},
+              {4139, 4404},
+              {4447, 4673},
+              {4717, 4956},
+              {5004, 5228},
+              {5275, 5508},
+              {5552, 5790},
+              {5835, 6072},
+              {6113, 6338},
+              {6389, 6604},
+              {6647, 7145},
+              {7189, 7421},
+              {7468, 7693},
+              {7733, 7951},
+              {7989, 8197},
+              {8243, 8482},
+              {8522, 9244}};
+
+        int rgn[59][5] = {{9, 1, 95, 353, -1},
+            {9, 1, 404, 955, -1},
+            {9, 1, 998, 1243, -1},
+            {9, 1, 1289, 1529, -1},
+            {9, 1, 1576, 1824, -1},
+            {9, 1, 1869, 2132, -1},
+            {9, 1, 2178, 2444, -1},
+            {9, 1, 2486, 2727, -1},
+            {9, 1, 2767, 3004, -1},
+            {9, 1, 3047, 3286, -1},
+            {9, 1, 3329, 3537, -1},
+            {9, 1, 3583, 3818, -1},
+            {9, 1, 3862, 4096, -1},
+            {9, 1, 4139, 4404, -1},
+            {9, 1, 4447, 4673, -1},
+            {9, 1, 4717, 4956, -1},
+            {9, 1, 5004, 5228, -1},
+            {9, 1, 5275, 5508, -1},
+            {9, 1, 5552, 5790, -1},
+            {9, 1, 5835, 6072, -1},
+            {9, 1, 6113, 6338, -1},
+            {9, 1, 6389, 6604, -1},
+            {9, 1, 6647, 7145, -1},
+            {9, 1, 7189, 7421, -1},
+            {9, 1, 7468, 7693, -1},
+            {9, 1, 7733, 7951, -1},
+            {9, 1, 7989, 8197, -1},
+            {9, 1, 8243, 8482, -1},
+            {9, 1, 8522, 9244, -1},
+            {9, 0, 41, 95, 722},
+            {9, 0, 353, 404, 784},
+            {9, 0, 955, 998, 697},
+            {9, 0, 1243, 1289, 804},
+            {9, 0, 1529, 1576, 744},
+            {9, 0, 1824, 1869, 844},
+            {9, 0, 2132, 2178, 847},
+            {9, 0, 2444, 2486, 666},
+            {9, 0, 2727, 2767, 824},
+            {9, 0, 3004, 3047, 883},
+            {9, 0, 3286, 3329, 860},
+            {9, 0, 3537, 3583, 891},
+            {9, 0, 3818, 3862, 795},
+            {9, 0, 4096, 4139, 906},
+            {9, 0, 4404, 4447, 906},
+            {9, 0, 4673, 4717, 886},
+            {9, 0, 4956, 5004, 708},
+            {9, 0, 5228, 5275, 957},
+            {9, 0, 5508, 5552, 886},
+            {9, 0, 5790, 5835, 733},
+            {9, 0, 6072, 6113, 804},
+            {9, 0, 6338, 6389, 666},
+            {9, 0, 6604, 6647, 813},
+            {9, 0, 7145, 7189, 795},
+            {9, 0, 7421, 7468, 829},
+            {9, 0, 7693, 7733, 774},
+            {9, 0, 7951, 7989, 657},
+            {9, 0, 8197, 8243, 760},
+            {9, 0, 8482, 8522, 675},
+            {9, 2, 0, 9244, 834}};
+
+        for (int i = 0; i < 29; i++) {
+            subreadIntervals.push_back(ReadInterval(srs[i][0], srs[i][1]));
+        }
+
+        for (int i = 0; i < 59; i++) {
+            adapterIntervals.push_back(ReadInterval(rgn[i][2], rgn[i][3], rgn[i][4]));
+        }
+    }
+
+    void TearDown() {
+    }
+
+    ~RegionUtilTestFixture() {
+        delete reader;
+    }
+
+    HDFRegionTableReader * reader;
+    RegionTable regionTable;
+    string fileName;
+    int hqStart, hqEnd, hqScore, holeNumber;
+
+    // Data for testing Get*FullSubreadIndex.
+    vector<ReadInterval> subreadIntervals;
+    vector<ReadInterval> adapterIntervals;
+};
+
+TEST_F(RegionUtilTestFixture, LookupHQRegion) {
+    int start, end, score;
+    bool rev = LookupHQRegion(holeNumber, regionTable, start, end, score);
+    EXPECT_EQ(rev, true);
+    EXPECT_EQ(start, hqStart);
+    EXPECT_EQ(end, hqEnd);
+    EXPECT_EQ(score, hqScore);
+}
+
+TEST_F(RegionUtilTestFixture, GetHighQulitySubreadsIntervals) {
+    vector<ReadInterval> intervals;
+    intervals.push_back(ReadInterval(0, 712));
+    intervals.push_back(ReadInterval(760, 2040));
+    intervals.push_back(ReadInterval(2098, 3452));
+
+    vector<int> directions;
+    directions.push_back(0);
+    directions.push_back(1);
+    directions.push_back(0);
+
+    int indx = GetHighQualitySubreadsIntervals(intervals, directions, hqStart, hqEnd);
+    EXPECT_EQ(intervals.size(), 3);
+    EXPECT_EQ(indx, 2);
+    int starts [3] = {0, 760, 2098};
+    int ends   [3] = {712, 2040, 3424};
+    int ds     [3] = {0, 1, 0};
+    for(int i=0; i < 3; i++) {
+        EXPECT_EQ(intervals[i].start, starts[i]);
+        EXPECT_EQ(intervals[i].end  , ends[i]  );
+        EXPECT_EQ(directions[i]     , ds[i]    );
+    }
+
+    indx = GetHighQualitySubreadsIntervals(intervals, directions, hqStart, hqEnd, 800);
+    EXPECT_EQ(intervals.size(), 2);
+    // The first interval and its direction has been removed as the length is less
+    // than 800.
+    for(int i=0; i < 2; i++) {
+        EXPECT_EQ(intervals[i].start, starts[i+1]);
+        EXPECT_EQ(intervals[i].end  , ends[i+1]  );
+    }
+}
+
+TEST_F(RegionUtilTestFixture, GetFullPassSubreadIndices ) {
+    vector<int> vi = GetFullPassSubreadIndices(subreadIntervals, adapterIntervals);
+    // vi = 0, ..., 27
+    EXPECT_EQ(vi.size(), 28);
+    for(int i=0; i < 28; i++) {
+        EXPECT_EQ(vi[i], i);
+    }
+}
+
+TEST_F(RegionUtilTestFixture, GetMedianLengthFullSubreadIndex) {
+    int idx = GetMedianLengthFullSubreadIndex(subreadIntervals, adapterIntervals);
+    EXPECT_EQ(idx, 18); // Median length subread (5552, 5790) 
+}
+
+TEST_F(RegionUtilTestFixture, GetLongestFullSubreadIndex) {
+    int idx = GetLongestFullSubreadIndex(subreadIntervals, adapterIntervals);
+    EXPECT_EQ(idx, 1); 
+    // The longest full pass subread (404, 955) 
+}
+
+TEST_F(RegionUtilTestFixture, GetTypicalFullSubreadIndex) {
+    int idx = GetTypicalFullSubreadIndex(subreadIntervals, adapterIntervals);
+    EXPECT_EQ(idx, 22); 
+    // Typical = the second longest full pass subread (6647, 7145)
+}
+
diff --git a/libcpp/unittest/build.mk b/libcpp/unittest/build.mk
new file mode 100644
index 0000000..a8dde8f
--- /dev/null
+++ b/libcpp/unittest/build.mk
@@ -0,0 +1,27 @@
+all:
+
+include ../rules.mk
+include defines.mk
+
+EXE := test-runner
+
+all: $(EXE)
+	
+gtest: $(EXE)
+	./$< --gtest_output=xml:./xml/all.xml
+
+LIBS := alignment/libblasr_gtest.a \
+		hdf/libpbihdf_gtest.a \
+		pbdata/libpbdata_gtest.a
+
+$(EXE): $(LIBS)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(GTEST_SRC) -Wl,$(LD_WHOLE_ARCHIVE) $^ -Wl,$(LD_NO_WHOLE_ARCHIVE) -o $@ -I$(GTEST_ROOT) $(LIBDIRS) $(LDFLAGS)
+
+$(LIBS):
+	${MAKE} -C $(dir $@) PBINCROOT=${PBINCROOT}/.. $(notdir $@)
+
+clean:
+	@${MAKE} -C alignment clean
+	@${MAKE} -C hdf clean
+	@${MAKE} -C pbdata clean
+	@${RM} -fr $(EXE) xml
diff --git a/libcpp/unittest/common.mk b/libcpp/unittest/common.mk
new file mode 100644
index 0000000..5337ea9
--- /dev/null
+++ b/libcpp/unittest/common.mk
@@ -0,0 +1,64 @@
+SHELL=bash
+
+.PHONY: all debug profile clean
+
+#
+# Definitions common to all make files for unit tests.
+# All paths are relative from inside the subdirectories, not this file
+#
+
+PBINCROOT 	   ?= $(realpath ../..)
+PREBUILT    	   ?= $(realpath ../../../../../prebuilt.out)
+THIRD_PARTY_PREFIX ?= ../../..
+
+include $(PBINCROOT)/common.mk
+
+# All Google Test headers.  Usually you shouldn't change this.
+GTEST_ROOT := $(THIRD_PARTY)/gtest/fused-src
+GTEST_SRC  := $(GTEST_ROOT)/gtest/gtest-all.cc \
+              $(GTEST_ROOT)/gtest/gtest_main.cc
+
+# INCLUDE DIRS
+INCDIRS    = -I$(PBINCROOT)/alignment \
+             -I$(PBINCROOT)/hdf \
+             -I$(PBINCROOT)/pbdata \
+			 -I$(PBINCROOT)/unittest \
+             -I$(GTEST_ROOT) \
+             -I$(HDF5_INC)
+
+# LIB DIRS
+LIBDIRS    = -L$(PBINCROOT)/alignment \
+             -L$(PBINCROOT)/hdf \
+             -L$(PBINCROOT)/pbdata \
+             -L$(HDF5_LIB) 
+
+LDFLAGS1 := -lblasr -lpbihdf -lpbdata 
+# The order of -l{lib} matters
+
+ifeq ($(origin nopbbam), undefined)
+	INCDIRS += -I$(PBBAM)/include -I$(PBBAM)/third-party/htslib
+	LIBDIRS += -L$(PBBAM)/lib -L$(PBBAM)/third-party/htslib
+	LDFLAGS1 += -lpbbam
+# Use libhts.a built with pbbam
+ifneq ($(wildcard "$(PBBAM)/third-party/htslib/libhts.a"), "")
+	LDFLAGS1 += $(PBBAM)/third-party/htslib/libhts.a 
+else
+    LDFLAGS1 += lhts
+endif
+endif
+
+ifneq ($(ZLIB_ROOT), notfound)
+	INCDIRS += -I$(ZLIB_ROOT)/include
+	LIBDIRS += -L$(ZLIB_ROOT)/lib
+endif
+
+ifneq ($(wildcard "$(HDF5_LIB)/libhdf5_cpp.a"),"")
+    LDFLAGS   := $(LDFLAGS1) $(HDF5_LIB)/libhdf5_cpp.a $(HDF5_LIB)/libhdf5.a -lpthread -lz -ldl
+else
+    LDFLAGS   := $(LDFLAGS1) -lhdf5_cpp -lhdf5 -lpthread -lz -ldl
+endif
+
+
+CXX := g++
+CXXOPTS := -std=c++11 -Wno-div-by-zero 
+CXXFLAGS := -O3
diff --git a/libcpp/unittest/hdf/HDF2DArray_gtest.cpp b/libcpp/unittest/hdf/HDF2DArray_gtest.cpp
new file mode 100644
index 0000000..96b27b6
--- /dev/null
+++ b/libcpp/unittest/hdf/HDF2DArray_gtest.cpp
@@ -0,0 +1,96 @@
+/*
+ * ==========================================================================
+ *
+ *       Filename:  HDF2DArray_gtest.cpp
+ *
+ *    Description:  Test hdf/HDF2DArray.hpp 
+ *
+ *        Version:  1.0
+ *        Created:  08/21/2013 07:00:49 PM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ==========================================================================
+ */
+#include <string>
+#include "H5Cpp.h"
+#include "HDFArray.hpp"
+#include "HDFGroup.hpp"
+#include "HDF2DArray.hpp"
+#include "reads/HoleXY.hpp"
+#include "pbdata/testdata.h"
+#include "gtest/gtest.h"
+
+using namespace std;
+using namespace H5;
+/*
+//Note ::testing::Test not ::testing::TEST
+//SetUp() and TearDown(), not Setup() and Teardown()
+class HDF2DArrayTest: public :: testing::Test {
+public:
+    virtual void SetUp() { 
+    }
+    virtual void TearDown() {
+    }
+    string x;
+};
+
+TEST_F(HDF2DArrayTest, x) {
+    EXPECT_TRUE(true);
+}
+*/
+
+class HDF2DArrayTest : public ::testing::Test {
+public:
+    virtual void SetUp() {
+        fileName = baxFile2;  // Defined in testdata.h
+        try {
+            FileAccPropList propList;
+            pbihdfFile.openFile(fileName.c_str(), H5F_ACC_RDONLY, propList);
+        } catch (Exception &e) {
+            cout << "ERROR, could not open hdf file" << fileName
+                << ", exiting." << endl;
+            exit(1);
+        }
+
+        ASSERT_NE(rootGroup.Initialize(pbihdfFile, "/"), 0);
+        ASSERT_NE(pulseDataGroup.Initialize(rootGroup, "PulseData"), 0);
+        ASSERT_NE(baseCallsGroup.Initialize(pulseDataGroup, "BaseCalls"), 0);
+        ASSERT_NE(zmwGroup.Initialize(baseCallsGroup, "ZMW"), 0);
+    }
+
+    virtual void TearDown() {
+        rootGroup.Close();
+        pulseDataGroup.Close();
+        baseCallsGroup.Close();
+        zmwGroup.Close();
+        pbihdfFile.close();
+    }
+
+    string fileName;
+    H5File pbihdfFile;
+    HDFGroup rootGroup, pulseDataGroup, baseCallsGroup, zmwGroup;
+};
+
+//Test HDF2DArray, int16 
+TEST_F(HDF2DArrayTest, int16) {
+    HDF2DArray<int16_t> xyArray;
+    xyArray.Initialize(zmwGroup, "HoleXY");
+    vector<HoleXY> xys;
+    xys.resize(10);
+    for(int i = 0; i < 10; i++){
+        xyArray.Read(i, i+1, xys[i].xy);
+        ASSERT_EQ(xys[i].xy[0], 43);
+        ASSERT_EQ(xys[i].xy[1], 44 + i);
+    }
+
+    int last = 54493;
+
+    xyArray.Read(last, last+1, xys[0].xy);
+    ASSERT_EQ(xys[0].xy[0], -43);
+    ASSERT_EQ(xys[0].xy[1], -44);
+    xyArray.Close();
+}
diff --git a/libcpp/unittest/hdf/HDFBasReader_gtest.cpp b/libcpp/unittest/hdf/HDFBasReader_gtest.cpp
new file mode 100644
index 0000000..a196395
--- /dev/null
+++ b/libcpp/unittest/hdf/HDFBasReader_gtest.cpp
@@ -0,0 +1,56 @@
+/*
+ * ============================================================================
+ *
+ *       Filename:  HDFBasReader_gtest.cpp
+ *
+ *    Description:  Test hdf/HDFBasReader.hpp
+ *
+ *        Version:  1.0
+ *        Created:  08/23/2013 10:17:14 AM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "HDFBasReader.hpp"
+#include "pbdata/testdata.h"
+
+using namespace std;
+using namespace H5;
+
+class HDFBasReaderTEST : public ::testing::Test {
+public:
+    virtual void SetUp() {
+        fileName = baxFile3;
+        reader.InitializeDefaultIncludedFields();
+        ASSERT_EQ(reader.Initialize(fileName), 1);
+    }
+    virtual void TearDown() {
+        reader.Close();
+    }
+    string fileName;
+    T_HDFBasReader<SMRTSequence> reader; 
+};
+
+TEST_F(HDFBasReaderTEST, ReadBaseFromBaseCalls) {
+    ASSERT_EQ(reader.GetMovieName(), 
+            "m150223_190837_42175_c100735112550000001823160806051530_s1_p0");
+    SMRTSequence seq;
+
+    for(int i=0; i < 1000; i++) {
+        reader.GetNext(seq);
+    }
+}
+
+TEST_F(HDFBasReaderTEST, GetChemistryTriple) {
+    string bindingKit, sequencingKit, version;
+    reader.GetChemistryTriple(bindingKit, sequencingKit, version);
+    EXPECT_EQ(bindingKit, "100356300");
+    EXPECT_EQ(sequencingKit, "100356200");
+    EXPECT_EQ(version, "2.3");
+}
diff --git a/libcpp/unittest/hdf/HDFCCSReader_gtest.cpp b/libcpp/unittest/hdf/HDFCCSReader_gtest.cpp
new file mode 100644
index 0000000..1ff04c1
--- /dev/null
+++ b/libcpp/unittest/hdf/HDFCCSReader_gtest.cpp
@@ -0,0 +1,68 @@
+/*
+ * ============================================================================
+ *
+ *       Filename:  HDFCCSReader_gtest.cpp
+ *
+ *    Description:  Test hdf/HDFCCSReader.hpp
+ *
+ *        Version:  1.0
+ *        Created:  08/23/2013 10:17:14 AM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+
+#include "HDFCCSReader.hpp"
+#include "CCSSequence.hpp"
+#include "gtest/gtest.h"
+#include "pbdata/testdata.h"
+
+using namespace std;
+using namespace H5;
+
+class HDFCCSReaderTEST : public ::testing::Test {
+public:
+    virtual void SetUp() {
+    }
+    virtual void TearDown() {
+    }
+};
+
+TEST_F(HDFCCSReaderTEST, ReadCCSFromBasH5) {
+    string fileName = baxFile2;
+    HDFCCSReader<CCSSequence> reader;
+    reader.InitializeDefaultIncludedFields();
+    ASSERT_EQ(reader.Initialize(fileName), 1);
+    ASSERT_EQ(reader.GetMovieName(),
+            "m130220_114643_42129_c100471902550000001823071906131347_s1_p0");
+
+    CCSSequence seq;
+    for(int i=0; i < 1000; i++) {
+        reader.GetNext(seq);
+    }
+    reader.Close();
+}
+
+TEST_F(HDFCCSReaderTEST, ReadCCSFromCCSH5) {
+    string fileName = ccsFile1;
+    HDFCCSReader<CCSSequence> reader;
+    reader.SetReadBasesFromCCS();
+    reader.InitializeDefaultIncludedFields();
+    ASSERT_EQ(reader.Initialize(fileName), 1);
+    ASSERT_EQ(reader.GetMovieName(),
+            "m130328_211423_ethan_c100499512550000001823070408081371_s1_p0");
+
+    CCSSequence seq;
+    for(int i=0; i < 1000; i++) {
+        reader.GetNext(seq);
+    }
+
+    reader.Close();
+}
+
+
+
diff --git a/libcpp/unittest/hdf/HDFPlsReader_gtest.cpp b/libcpp/unittest/hdf/HDFPlsReader_gtest.cpp
new file mode 100644
index 0000000..a4f63a2
--- /dev/null
+++ b/libcpp/unittest/hdf/HDFPlsReader_gtest.cpp
@@ -0,0 +1,49 @@
+/*
+ * ============================================================================
+ *
+ *       Filename:  HDFPlsReader_gtest.cpp
+ *
+ *    Description:  Test hdf/HDFPlsReader.hpp
+ *
+ *        Version:  1.0
+ *        Created:  08/23/2013 11:13:34 AM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+
+#include "HDFPlsReader.hpp"
+#include "gtest/gtest.h"
+#include "pbdata/testdata.h"
+
+using namespace std;
+using namespace H5;
+
+class HDFPlsReaderTEST : public ::testing::Test {
+public:
+    virtual void SetUp() {
+        fileName = plsFile1;
+        ASSERT_EQ(reader.Initialize(fileName), 1);
+    }
+    virtual void TearDown() {
+        reader.Close();
+    }
+    string fileName;
+    HDFPlsReader reader; 
+};
+
+TEST_F(HDFPlsReaderTEST, ReadToPulseFile) {
+    PulseFile  pulseFile;
+    reader.IncludeField("NumEvent");
+    reader.IncludeField("StartFrame");
+    reader.ReadPulseFileInit(pulseFile);
+    reader.ReadPulseFile(pulseFile);
+    ASSERT_EQ(pulseFile.platformId, 0);
+    ASSERT_EQ(pulseFile.startFrame.size(), 197626964);
+}
+
+
diff --git a/libcpp/unittest/hdf/HDFScanDataReader_gtest.cpp b/libcpp/unittest/hdf/HDFScanDataReader_gtest.cpp
new file mode 100644
index 0000000..9beb6b1
--- /dev/null
+++ b/libcpp/unittest/hdf/HDFScanDataReader_gtest.cpp
@@ -0,0 +1,52 @@
+#include "gtest/gtest.h"
+#include "HDFScanDataReader.hpp"
+#include "pbdata/testdata.h"
+
+using namespace std;
+using namespace H5;
+
+class HDFScanDataReaderTEST : public ::testing::Test {
+public:
+    virtual void SetUp() {
+        fileName = scanDataFile1;
+        try{
+            hdfFile.openFile(fileName.c_str(), H5F_ACC_RDONLY);
+            ASSERT_EQ(rootGroup.Initialize(hdfFile, "/"), 1);
+            ASSERT_EQ(reader.Initialize(dynamic_cast<HDFGroup*>(&rootGroup)), 1);
+        } catch(H5::Exception & e) {
+            cerr << "Failed to open " << fileName << endl;
+            ASSERT_FALSE(true);
+        }
+    }
+
+    virtual void TearDown() {
+        reader.Close();
+        hdfFile.close();
+    }
+
+    string fileName;
+    H5::H5File hdfFile;
+    HDFGroup rootGroup;
+    HDFScanDataReader reader;
+};
+
+TEST_F(HDFScanDataReaderTEST, ReadBindingKit) {
+    string bindingKit;
+    EXPECT_EQ(reader.ReadBindingKit(bindingKit), 1);
+    EXPECT_EQ(bindingKit, "100356300");
+
+    // Test if bindkingKit can be read multiple times.
+    EXPECT_EQ(reader.ReadBindingKit(bindingKit), 1);
+    EXPECT_EQ(bindingKit, "100356300");
+}
+
+TEST_F(HDFScanDataReaderTEST, ReadSequencingKit) {
+    string sequencingKit;
+    EXPECT_EQ(reader.ReadSequencingKit(sequencingKit), 1);
+    EXPECT_EQ(sequencingKit, "100356200");
+
+    // Test if sequencingKit can be read multiple times.
+    EXPECT_EQ(reader.ReadSequencingKit(sequencingKit), 1);
+    EXPECT_EQ(sequencingKit, "100356200");
+}
+
diff --git a/libcpp/unittest/hdf/HDFScanDataWriter_gtest.cpp b/libcpp/unittest/hdf/HDFScanDataWriter_gtest.cpp
new file mode 100644
index 0000000..15831ca
--- /dev/null
+++ b/libcpp/unittest/hdf/HDFScanDataWriter_gtest.cpp
@@ -0,0 +1,36 @@
+/*
+ * ============================================================================
+ *
+ *       Filename:  HDFScanDataWriter_gtest.cpp
+ *
+ *    Description:  Test data/HDFScanDataWriter.hpp
+ *
+ *        Version:  1.0
+ *        Created:  10/14/2013 03:04:00 PM
+ *       Revision:  08/20/2014
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "HDFScanDataWriter.hpp"
+#include "HDFFile.hpp"
+#include "reads/ScanData.hpp"
+
+TEST(HDFScanDataWriter, Write) {
+    ScanData sd;
+    sd.frameRate = 100;
+
+    HDFFile outFile;
+    outFile.Open("scandata.h5", H5F_ACC_TRUNC);
+    HDFScanDataWriter writer(outFile);
+    writer.Write(sd);
+    writer.WriteMovieName("xyz");
+    writer.WriteFrameRate(70);
+    writer.Close();
+    outFile.Close();
+}
diff --git a/libcpp/unittest/hdf/HDFUtils_gtest.cpp b/libcpp/unittest/hdf/HDFUtils_gtest.cpp
new file mode 100644
index 0000000..7fab6d7
--- /dev/null
+++ b/libcpp/unittest/hdf/HDFUtils_gtest.cpp
@@ -0,0 +1,38 @@
+/*
+ * ============================================================================
+ *
+ *       Filename:  HDFUtils_gtest.cpp
+ *
+ *    Description:  Test hdf/HDFUtils.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/04/2013 10:55:10 AM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+
+#include "HDFUtils.hpp"
+#include "gtest/gtest.h"
+#include "pbdata/testdata.h"
+
+TEST(HDFUtils, Create) {
+    EXPECT_EQ(GetH5MovieName(baxFile1), 
+        "m130220_114643_42129_c100471902550000001823071906131347_s1_p0");
+
+    EXPECT_EQ(GetH5MovieName(baxFile2),
+        "m130220_114643_42129_c100471902550000001823071906131347_s1_p0");
+
+    EXPECT_EQ(GetH5MovieName(plsFile1),
+        "m121215_065521_richard_c100425710150000001823055001121371_s1_p0");
+
+    EXPECT_EQ(GetH5MovieName(ccsFile1),
+        "m130328_211423_ethan_c100499512550000001823070408081371_s1_p0");
+
+    EXPECT_EQ(GetH5MovieName(rgnFile1),
+        "m130427_152935_42178_c100518602550000001823079209281316_s1_p0");
+}
diff --git a/libcpp/unittest/hdf/HDFZMWReader_gtest.cpp b/libcpp/unittest/hdf/HDFZMWReader_gtest.cpp
new file mode 100644
index 0000000..63b8f6d
--- /dev/null
+++ b/libcpp/unittest/hdf/HDFZMWReader_gtest.cpp
@@ -0,0 +1,125 @@
+/*
+ * ==========================================================================
+ *
+ *       Filename:  HDFZMWReader_gtest.cpp
+ *
+ *    Description:  Test hdf/HDFZMWReader.hpp
+ *
+ *        Version:  1.0
+ *        Created:  08/21/2013 07:00:49 PM
+ *       Revision:  08/20/2014  
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ==========================================================================
+ */
+#include "HDFZMWReader.hpp"
+#include "gtest/gtest.h"
+#include "pbdata/testdata.h"
+
+using namespace std;
+using namespace H5;
+
+class HDFZMWReaderTEST : public ::testing::Test {
+public:
+    virtual void SetUp() {
+    }
+    virtual void TearDown() {
+    }
+
+    void Initialize(H5File & pbihdfFile, string fileName,
+        string groupName, HDFGroup & callsGroup) {
+        try {
+            FileAccPropList propList;
+            pbihdfFile.openFile(fileName.c_str(), H5F_ACC_RDONLY, propList);
+        } catch (Exception &e) {
+            cout << "ERROR, could not open hdf file" << fileName
+                << ", exiting." << endl;
+            exit(1);
+        }
+
+        ASSERT_NE(callsGroup.Initialize(pbihdfFile, groupName), 0);
+
+        /*
+        HDFGroup rootGroup, pulseDataGroup;
+        if (rootGroup.Initialize(pbihdfFile, "/") == 0) {
+            cout << "ERROR, could not open /" << endl;
+            exit(1);
+        }
+
+        if (pulseDataGroup.Initialize(rootGroup, "PulseData") == 0){
+            cout << "ERROR, could not open /PulseData" << endl;
+            exit(1);
+        }
+
+        ASSERT_NE(callsGroup.Initialize(pulseDataGroup, "BaseCalls"), 0);
+        */
+    }
+
+    void Close(H5File & pbihdfFile, HDFGroup & callsGroup) {
+        pbihdfFile.close();
+        callsGroup.Close();
+    }
+
+    void TestGetNext(HDFZMWReader & zmwReader) {
+        int count = 0;
+        ZMWGroupEntry entry;
+        while(zmwReader.GetNext(entry)) {
+            count ++;
+            ASSERT_EQ(zmwReader.curZMW, count);
+        }
+        ASSERT_EQ(count, zmwReader.nZMWEntries);
+    }
+};
+
+TEST_F(HDFZMWReaderTEST, ReadZMWFromBaseCalls) {
+    HDFZMWReader zmwReader;
+    string fileName = baxFile2;
+    string groupName = "/PulseData/BaseCalls";
+    H5File pbihdfFile;
+    HDFGroup baseCallsGroup;
+
+    Initialize(pbihdfFile, fileName, groupName, baseCallsGroup);
+    ASSERT_NE(zmwReader.Initialize(&baseCallsGroup), 0);
+
+    TestGetNext(zmwReader);
+    zmwReader.Close();
+    Close(pbihdfFile, baseCallsGroup);
+}
+
+TEST_F(HDFZMWReaderTEST, ReadZMWFromPulseCalls) {
+    string fileName = plsFile1;
+    H5File pbihdfFile;
+    try {
+        FileAccPropList propList;
+        pbihdfFile.openFile(fileName.c_str(), H5F_ACC_RDONLY, propList);
+    } catch (Exception &e) {
+        cout << "ERROR, could not open hdf file" << fileName
+            << ", exiting." << endl;
+        exit(1);
+    }
+
+    HDFGroup pulseCallsGroup;
+    ASSERT_NE(pulseCallsGroup.Initialize(pbihdfFile,"/PulseData/PulseCalls"), 0);
+
+    HDFZMWReader zmwReader;
+    ASSERT_NE(zmwReader.Initialize(&pulseCallsGroup), 0);
+    TestGetNext(zmwReader);
+    zmwReader.Close();
+
+    // Switch to read from CCS ZMW.
+    HDFGroup ccsGroup;
+    ASSERT_NE(ccsGroup.Initialize(pbihdfFile, "/PulseData/ConsensusBaseCalls"), 0);
+    ASSERT_NE(zmwReader.Initialize(&ccsGroup), 0);
+    TestGetNext(zmwReader);
+    zmwReader.Close();
+
+    // Close
+    ccsGroup.Close();
+    pulseCallsGroup.Close();
+    pbihdfFile.close();
+}
+
+
diff --git a/libcpp/unittest/hdf/Makefile b/libcpp/unittest/hdf/Makefile
new file mode 100644
index 0000000..d942d8f
--- /dev/null
+++ b/libcpp/unittest/hdf/Makefile
@@ -0,0 +1,26 @@
+include ../../rules.mk
+include ../defines.mk
+
+SOURCES    = $(wildcard *.cpp) 
+OBJECTS    = $(SOURCES:.cpp=.o)
+
+EXE := test-runner
+
+all debug profile: $(EXE)
+
+libpbihdf_gtest.a: $(OBJECTS)
+	$(AR) $(ARFLAGS)c $@ $^
+
+$(EXE): $(OBJECTS)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $^ $(GTEST_SRC) -o $@ -I$(GTEST_ROOT) $(LIBDIRS) $(LDFLAGS)
+
+$(OBJECTS): %.o: %.cpp
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) -c $< -o $@ $(INCDIRS)
+
+gtest: $(EXE)
+	./$< --gtest_output=xml:../xml/hdf.xml
+
+clean:
+	@find . -type f -name \*.o -delete
+	@find . -type f -name \*.d -delete
+	@rm -f libpbihdf_gtest.a $(EXE) ../xml/hdf.xml
diff --git a/libcpp/unittest/normal.Makefile b/libcpp/unittest/normal.Makefile
new file mode 100644
index 0000000..798365f
--- /dev/null
+++ b/libcpp/unittest/normal.Makefile
@@ -0,0 +1,9 @@
+export
+# Same as .EXPORT_ALL_VARIABLES
+
+all clean gtest: mkdefines
+	${MAKE} -f build.mk $@
+
+mkdefines:
+	#./conf-nightly.py defines.mk
+	cp normal.defines.mk defines.mk
diff --git a/libcpp/unittest/normal.defines.mk b/libcpp/unittest/normal.defines.mk
new file mode 100644
index 0000000..a8264c4
--- /dev/null
+++ b/libcpp/unittest/normal.defines.mk
@@ -0,0 +1,54 @@
+PBINCROOT?=..
+#THIRD_PARTY_PREFIX ?= ../../..
+
+#include $(PBINCROOT)/common.mk
+
+
+HDF_HEADERS:=hdf5-1.8.12-headers
+HDF5:=/home/UNIXHOME/cdunn/repo/pb/smrtanalysis-client/smrtanalysis/prebuilt.out/hdf5/hdf5-1.8.12/ubuntu-1404
+HDF5_INC?=../hdf/${HDF_HEADERS}/src
+HDF5_LIB?=${HDF5}/lib
+INCLUDES+=-I${PBINCROOT}/hdf/${HDF_HEADERS}/src -I${PBINCROOT}/hdf/${HDF_HEADERS}/c++/src
+#INCLUDES+=-I../pbdata -I../hdf -I.
+
+#OS := $(shell uname)
+
+#ifeq ($(OS), Darwin)
+#	LD_WHOLE_ARCHIVE := -all_load
+#	LD_NO_WHOLE_ARCHIVE := -noall_load
+#else
+#	LD_WHOLE_ARCHIVE := --whole-archive
+#	LD_NO_WHOLE_ARCHIVE := --no-whole-archive
+#endif
+
+LD_WHOLE_ARCHIVE := --whole-archive
+LD_NO_WHOLE_ARCHIVE := --no-whole-archive
+
+# All Google Test headers.  Usually you shouldn't change this.
+#GTEST_ROOT := $(THIRD_PARTY)/gtest/fused-src
+GTEST_ROOT:=/home/UNIXHOME/cdunn/repo/gh/blasr_libcpp/../pbdagcon/test/cpp/gtest-1.7.0/fused-src
+GTEST_SRC  := $(GTEST_ROOT)/gtest/gtest-all.cc \
+              $(GTEST_ROOT)/gtest/gtest_main.cc
+
+# INCLUDE DIRS
+INCDIRS    = -I$(PBINCROOT)/alignment \
+             -I$(PBINCROOT)/hdf \
+             -I$(PBINCROOT)/pbdata \
+			 -I$(PBINCROOT)/unittest \
+             -I$(GTEST_ROOT)
+INCDIRS+=${INCLUDES}
+
+# LIB DIRS
+LIBDIRS    = -L$(PBINCROOT)/alignment \
+             -L$(PBINCROOT)/hdf \
+             -L$(PBINCROOT)/pbdata \
+             -L$(HDF5_LIB) 
+
+LDFLAGS1 := -lblasr -lpbihdf -lpbdata 
+# The order of -l{lib} matters
+
+#LDFLAGS   := $(LDFLAGS1) -lhdf5_cpp -lhdf5 -lpthread -lz -ldl
+LDFLAGS   := $(LDFLAGS1) $(HDF5_LIB)/libhdf5_cpp.a $(HDF5_LIB)/libhdf5.a -lpthread -lz -ldl
+
+CXXOPTS := -std=c++11 -Wno-div-by-zero
+CXXFLAGS := -O3
diff --git a/libcpp/unittest/pbdata/CCSSequence_gtest.cpp b/libcpp/unittest/pbdata/CCSSequence_gtest.cpp
new file mode 100644
index 0000000..02e72cd
--- /dev/null
+++ b/libcpp/unittest/pbdata/CCSSequence_gtest.cpp
@@ -0,0 +1,117 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  CCSSequence_gtest.cpp
+ *
+ *    Description:  Test pbdata/CCSSequence.hpp
+ *
+ *        Version:  1.0
+ *        Created:  10/29/2012 05:17:04 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "CCSSequence.hpp"
+
+using namespace std;
+
+Nucleotide sr0[] = "ATATGGGGATTAGGGGATA"; 
+Nucleotide sr1[] = "TAATCCCGTAATCCCGGTAT"; //rc = TAATCCCGTAATCCCGGTAT
+Nucleotide sr2[] = "ATAGGGGGATTAGGGGATTCA"; 
+Nucleotide adapter[] = "CCC";
+Nucleotide unrolled_seq[] = "ATATGGGGATTAGGGGATACCCTAATCCCGTAATCCCGGTATCCCATAGGGGGATTAGGGGATTCA"; 
+int sz0 = 19;
+int sz1 = 20;
+int sz2 = 21;
+int adaptersz = 3;
+int unrolledsz = sz0 + sz1 + sz2 + adaptersz * 2;
+const int numSubreads = 3;
+
+
+class CCSSequenceTest: public:: testing:: Test{
+public:
+    void CreateSMRTSequence(SMRTSequence & smrt, Nucleotide* seq,
+            int holeNumber, int start, int end) {
+        int size = end - start;
+        smrt.seq = new Nucleotide[size];
+        memcpy(smrt.seq, seq, size*sizeof(Nucleotide));
+        smrt.length = size;
+        smrt.deleteOnExit = false;
+
+        smrt.zmwData.holeNumber = holeNumber;
+        smrt.subreadStart = start;
+        smrt.subreadEnd = end;
+
+        stringstream ss;
+    }
+
+    void SetUp() {
+        //Create a vector of subreads.
+        subreads.resize(numSubreads);
+        int s = 0; 
+        CreateSMRTSequence(subreads[0], &sr0[0], 1, s, s + sz0); 
+        s += sz0 + adaptersz; 
+        CreateSMRTSequence(subreads[1], &sr1[0], 1, s, s + sz1); 
+        s += sz1 + adaptersz; 
+        CreateSMRTSequence(subreads[2], &sr2[0], 1, s, s + sz2); 
+
+        //Create ccs
+        stringstream ss;
+        subreads[0].Print(ss);
+
+        CreateSMRTSequence(ccs.unrolledRead, &unrolled_seq[0], 1, 0, unrolledsz);
+        ccs.numPasses = numSubreads;
+        CreateSMRTSequence((SMRTSequence&)ccs, &sr0[0], 1, 0, sz0); 
+        ccs.numConsensusBases = sz0;
+        ccs.passStartBase.resize(numSubreads);
+        ccs.passNumBases.resize(numSubreads);
+        ccs.passDirection.resize(numSubreads);
+        s = 0;
+        for(int i=0; i < ccs.numPasses; i++) {
+            ccs.passStartBase[i] = subreads[i].subreadStart;
+            ccs.passDirection[i] = (i%2==0)?(0):(1);
+            ccs.passNumBases[i] = subreads[i].length;
+        }
+    }
+
+    void TearDown() {
+        ccs.Free();
+        for(int i=0; i<numSubreads; i++) {
+            subreads[i].Free();
+        }
+    }
+
+    CCSSequence ccs;
+    vector<SMRTSequence> subreads;
+};
+
+
+TEST_F(CCSSequenceTest, Print) {
+    stringstream ss, ss1;
+    ccs.Print(ss);
+    ccs.unrolledRead.Print(ss1);
+    ASSERT_EQ(ss.str(), (string(
+        "SMRTSequence for zmw 1, [0, 19)\nATATGGGGATTAGGGGATA\n")));
+    ASSERT_EQ(ss1.str(), (string(
+        "SMRTSequence for zmw 1, [0, 66)\nATATGGGGATTAGGGGATACCCTAATCCCGTAATCCCGGTATCCCATAGG\nGGGATTAGGGGATTCA\n")));
+}
+
+TEST_F(CCSSequenceTest, Explode) {
+    vector<SMRTSequence> exploded_subreads;
+
+    ccs.Explode(exploded_subreads);
+    for(int i = 0; i < numSubreads; i++){
+        stringstream ss, ss1;
+        subreads[i].PrintSeq(ss);
+        exploded_subreads[i].PrintSeq(ss1);
+        ASSERT_EQ(ss.str(), ss1.str());
+    }
+}
+
+
diff --git a/libcpp/unittest/pbdata/ChangeListID_gtest.cpp b/libcpp/unittest/pbdata/ChangeListID_gtest.cpp
new file mode 100644
index 0000000..18cc8b6
--- /dev/null
+++ b/libcpp/unittest/pbdata/ChangeListID_gtest.cpp
@@ -0,0 +1,34 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  ChangeListID_gtest.cpp
+ *
+ *    Description:  Test pbdata/ChangeListID.hpp
+ *
+ *        Version:  1.0
+ *        Created:  02/26/2015 06:01:01 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "ChangeListID.hpp"
+
+using namespace std;
+
+// Test ChangeListID.GetVersion().
+TEST(ChangeListID, GetVersion) {
+    string str = "2.3.0.143354";
+    ChangeListID change = ChangeListID(str);
+    EXPECT_EQ(change.GetVersion(), "2.3");
+
+    str = "";
+    change = ChangeListID(str);
+    EXPECT_EQ(change.GetVersion(), "");
+} 
+
diff --git a/libcpp/unittest/pbdata/DNASequence_gtest.cpp b/libcpp/unittest/pbdata/DNASequence_gtest.cpp
new file mode 100644
index 0000000..6d16f01
--- /dev/null
+++ b/libcpp/unittest/pbdata/DNASequence_gtest.cpp
@@ -0,0 +1,279 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  DNASequence_gtest.cpp
+ *
+ *    Description:  Test DNASequence.hpp
+ *
+ *        Version:  1.0
+ *        Created:  10/27/2012 09:42:13 AM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "DNASequence.hpp"
+#include <climits>
+#include <iostream>
+#include <fstream>
+using namespace std;
+
+//Note ::testing::Test not ::testing::TEST
+//SetUp() and TearDown(), not Setup() and Teardown()
+class DNASequenceTest : public ::testing::Test {
+public:
+    DNASequence dnaOne;
+};
+
+//Test DNASequence constructor
+TEST_F(DNASequenceTest, Constructor) {
+    DNASequence dnaSeq;
+    EXPECT_TRUE(dnaSeq.seq == NULL);
+    EXPECT_TRUE(dnaSeq.length == 0);
+    EXPECT_TRUE(dnaSeq.size() == dnaSeq.length);
+    EXPECT_TRUE(dnaSeq.bitsPerNuc == 8);
+    EXPECT_FALSE(dnaSeq.deleteOnExit);
+
+    Nucleotide HKITTY[] = "HELLO,KITTY!";
+    dnaSeq.seq = HKITTY;
+    dnaSeq.length = sizeof(HKITTY)/sizeof(Nucleotide) - 1;
+//    dnaSeq.Print(cout);
+    EXPECT_EQ(dnaSeq.size(), 12);
+
+    
+    DNALength thisLen = 12;
+    Nucleotide * thisNuc = new Nucleotide [thisLen];
+    memcpy(thisNuc, HKITTY, thisLen);
+    DNASequence newDnaSeq; 
+    newDnaSeq.seq = thisNuc;
+    newDnaSeq.length = thisLen;
+//    newDnaSeq.Print(cout);
+    EXPECT_EQ(memcmp(newDnaSeq.seq, dnaSeq.seq, thisLen), 0);
+    EXPECT_EQ(newDnaSeq.length, thisLen);
+    if (!thisNuc) delete thisNuc;
+
+    DNASequence nnewDnaSeq;
+    thisLen = 12;
+    string atgc ("atgcatgcatgc");
+    thisNuc = new Nucleotide [thisLen];
+    for (int i = 0 ; i < thisLen; i++) {
+        thisNuc[i] = atgc[i];
+    }
+    string ret;
+    nnewDnaSeq.seq = thisNuc;
+    nnewDnaSeq.length = thisLen;
+    for (int i = 0 ; i < thisLen; i++) {
+        ret += nnewDnaSeq.seq[i];
+    }
+    EXPECT_STREQ(ret.c_str(), atgc.c_str());
+}
+
+//Test DNASequence Append()
+TEST_F(DNASequenceTest, Append) {
+    DNALength oneLen = 10;
+    Nucleotide * one = new Nucleotide [oneLen];
+
+    string As("AAAAAAAAAA"); 
+    for (int i = 0; i < oneLen; i++) {
+        one[i] = As[i];
+    }
+    //Can not memcpy a string to a DNASequence directly 
+    //such as memcpy(one, As.c_str(), oneLen), because 
+    //DNASequence.seq is of type unsigned char, not char
+
+    DNALength twoLen = 20;
+    Nucleotide * two = new Nucleotide [twoLen];
+    
+    string Gs("GGGGGGGGGGGGGGGGGGGG");
+    for (int i = 0; i < twoLen; i++) {
+        two[i] = Gs[i];
+    }
+    //memcpy(two, Gs.c_str(), twoLen);
+
+    Nucleotide * three = new Nucleotide [oneLen + twoLen];
+    memcpy(three, one, oneLen);
+    memcpy(three+oneLen, two, twoLen);
+
+    DNASequence dnaTwo;
+    dnaOne.seq = one; 
+    dnaOne.length = oneLen;
+    dnaOne.deleteOnExit = true;
+    dnaTwo.seq = two;
+    dnaTwo.length = twoLen;
+
+    dnaOne.Append(dnaTwo, 0);
+    EXPECT_EQ(dnaOne.length, oneLen + twoLen);
+    EXPECT_EQ(memcmp(dnaOne.seq, three, dnaOne.length), 0);
+
+    string AGs("AAAAAAAAAAGGGGGGGGGGGGGGGGGGGG");
+    for (int i = 0; i < dnaOne.length; i++) {
+        EXPECT_EQ(AGs[i], (char)dnaOne.seq[i]);
+    }
+  
+    //if appendPos is positive, overwrite this sequence
+    //from appendPos to the end
+    AGs = "AAGGGGGGGGGGGGGGGGGGGG";
+    DNALength appendPos = 2;
+    dnaOne.Append(dnaTwo, appendPos);
+    EXPECT_EQ(dnaOne.length, appendPos + twoLen);
+    for (int i = 0; i < dnaOne.length; i++) {
+        EXPECT_EQ(AGs[i], (char)dnaOne.seq[i]);
+    }
+    
+    if(!one) delete one;
+    if(!two) delete two;
+    if(!three) delete three;
+}
+
+//Test DNASequence TakeOwnership
+TEST_F(DNASequenceTest, TakeOwnership) {
+    DNALength oneLen = 10;
+    Nucleotide * one = new Nucleotide [oneLen];
+    
+    dnaOne.seq = one; 
+    dnaOne.length = oneLen;
+
+    DNASequence dnaTwo;
+    
+    //a bug may occur if deleteOneExit is true and 
+    //TakeOwnership() is called twice. In that case, both
+    //dnaOne and dnaTwo will become wild pointers 
+    dnaTwo.deleteOnExit = true;
+    dnaTwo.TakeOwnership(dnaOne);
+    
+    EXPECT_EQ(dnaTwo.length, dnaOne.length);
+    EXPECT_EQ(dnaTwo.deleteOnExit, dnaOne.deleteOnExit);
+    EXPECT_EQ(dnaTwo.seq, dnaOne.seq);
+
+    if(!one) delete one;
+}
+
+//Test DNASequence ShallowCopy
+TEST_F(DNASequenceTest, ShallowCopy) {
+    DNALength oneLen = 10;
+    Nucleotide * one = new Nucleotide [oneLen];
+
+    string As("AAAAAAAAAA");
+    for (int i = 0; i < oneLen; i++) {
+        one[i] = As[i];
+    }
+    dnaOne.seq = one;
+    dnaOne.length = oneLen;
+
+    DNASequence dnaTwo;
+    dnaTwo.ShallowCopy(dnaOne);
+
+    EXPECT_EQ(dnaTwo.length, dnaOne.length);
+    EXPECT_EQ(dnaTwo.seq   , dnaOne.seq);
+    EXPECT_EQ(dnaTwo.deleteOnExit, dnaOne.deleteOnExit);
+}
+
+
+//Test DNASequence.Copy(const DNASequence rhs, 
+//                      DNALength rhsPos,
+//                      DNALength rhsLength)
+TEST_F(DNASequenceTest, Copy) {
+    DNALength oneLen = 10;
+    Nucleotide * one = new Nucleotide [oneLen];
+
+    string As("AGAAAAACAA");
+    for (int i = 0; i < oneLen; i++) {
+        one[i] = As[i];
+    }
+
+    dnaOne.seq = one;
+    dnaOne.length = oneLen;
+
+    DNASequence dnaTwo;
+    dnaTwo.Copy(dnaOne);
+
+    EXPECT_EQ(dnaTwo.length, dnaOne.length);
+    EXPECT_NE(dnaTwo.seq   , dnaOne.seq);
+    EXPECT_TRUE(dnaTwo.deleteOnExit); 
+    EXPECT_EQ(memcmp(dnaTwo.seq, dnaOne.seq, dnaOne.length), 0);
+
+    //if rhs.length is 0, return this * 
+    DNASequence dnaThree;
+    dnaTwo.Copy(dnaThree);
+    //dnaTwo remains unchanged
+    EXPECT_EQ(dnaTwo.length, 0);
+    EXPECT_NE(dnaTwo.seq, dnaOne.seq);
+    EXPECT_TRUE(dnaTwo.deleteOnExit); 
+    EXPECT_TRUE(dnaTwo.seq == NULL);
+
+    //if rhsPos is not 0 and rhsLength is 0
+    dnaTwo.Copy(dnaOne, 2);
+    EXPECT_EQ(dnaTwo.length, dnaOne.length - 2);
+    EXPECT_TRUE(dnaTwo.deleteOnExit); 
+    EXPECT_EQ(memcmp(dnaTwo.seq, dnaOne.seq + 2, dnaTwo.length), 0);
+
+
+    //if the subsequence to copy is out of bounds
+    EXPECT_GT(200, dnaOne.length);
+    //EXPECT_EXIT(dnaTwo.Copy(dnaOne, 200), ::testing::ExitedWithCode(1), ""); 
+
+
+    //if both rhsPos and rhsLength are less than MAXINT,
+    //but rhsPos+ rhsLength > MAXINT
+    DNALength rhsPos = 3;
+    DNALength rhsLength = UINT_MAX -1;
+    EXPECT_TRUE(rhsPos < UINT_MAX && rhsLength < UINT_MAX);
+    EXPECT_TRUE(rhsLength > dnaOne.length + 1);
+    //EXPECT_EXIT(dnaTwo.Copy(dnaOne, rhsPos, rhsLength), ::testing::ExitedWithCode(1), "");
+
+
+    //if rhsPos > rhs.length
+    //EXPECT_EXIT(dnaTwo.Copy(dnaOne, dnaOne.length + 1), ::testing::ExitedWithCode(1), "")
+    //    << "Copy a subsequence which is out of bounds. This needs to be taken care of. See bug 21867.";
+
+}
+
+//Test DNASequence Allocate(DNALength)
+TEST_F(DNASequenceTest, Allocate) {
+    dnaOne.Allocate(0);
+    EXPECT_EQ(dnaOne.length, 0);
+
+    DNASequence dnaTwo;
+    dnaTwo.Allocate(100);
+    EXPECT_EQ(dnaTwo.length, 100);
+}
+
+//Test DNASequence ReferenceSubstring(rhs, pos, substrLength)
+TEST_F(DNASequenceTest, ReferenceSubstring) {
+    DNALength oneLen = 10;
+    dnaOne.seq = new Nucleotide[oneLen];
+    dnaOne.length = oneLen;
+
+    DNASequence dnaTwo;
+    dnaTwo.ReferenceSubstring(dnaOne);
+
+    EXPECT_EQ(dnaOne.seq, dnaTwo.seq);
+    EXPECT_EQ(dnaOne.length, dnaTwo.length);
+    EXPECT_FALSE(dnaTwo.deleteOnExit);
+
+//    EXPECT_DEATH_IF_SUPPORTED(dnaTwo.ReferenceSubstring(dnaOne, 100), "");
+    delete dnaOne.seq;
+}
+/*
+TEST_F(DNASequenceTest, CopyFromString) {
+    // Test Copy(const std::string &)
+    string str = "ATGCGGGCCTCGCCG";
+    dnaOne.Copy(str);
+
+    for (int i = 0; i < str.size(); i++) {
+       EXPECT_EQ(dnaOne.seq[i], str[i]);
+    }
+
+    // Test operator = (const std::string)
+    DNASequence dnaTwo;
+    dnaTwo = str;
+    for (int i = 0; i < str.size(); i++) {
+       EXPECT_EQ(dnaOne.seq[i], str[i]);
+    }
+}
+*/
diff --git a/libcpp/unittest/pbdata/FASTAReader_gtest.cpp b/libcpp/unittest/pbdata/FASTAReader_gtest.cpp
new file mode 100644
index 0000000..f8aa7de
--- /dev/null
+++ b/libcpp/unittest/pbdata/FASTAReader_gtest.cpp
@@ -0,0 +1,65 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  FASTAReader_gtest.cpp
+ *
+ *    Description:  Test common/FASTAReader.h
+ *
+ *        Version:  1.0
+ *        Created:  10/29/2012 05:18:52 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "FASTAReader.hpp"
+#include "pbdata/testdata.h"
+
+class FASTAReaderTest:public::testing::Test{
+public:
+    void SetUp() {
+        string filename(fastaFile1);
+        reader.Initialize(filename);
+    }
+
+    void TearDown() {
+        reader.Close();
+        seq.Free();
+    }
+
+    FASTAReader reader;
+    FASTASequence seq;
+};
+
+TEST_F(FASTAReaderTest, GetNext) {
+    reader.GetNext(seq);
+    EXPECT_EQ(strcmp(seq.title, "read1"), 0);
+    EXPECT_EQ(seq.length, 100);
+    string expected_seq = string(
+        "AAAAAGGGGGCCCCCACGGCAGCCAGATTTAAATTGAGGGCCCCCCCTTT"
+        "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG");
+    EXPECT_EQ(strcmp((char*)seq.seq, expected_seq.c_str()), 0); 
+
+    reader.GetNext(seq);
+    EXPECT_EQ(strcmp(seq.title, "read2"), 0);
+    EXPECT_EQ(seq.length, 99);
+}
+
+TEST_F(FASTAReaderTest, ReadAllSequences) {
+    vector<FASTASequence> seqs;
+    reader.ReadAllSequences(seqs);
+
+    EXPECT_EQ(seqs.size(), 12);
+    EXPECT_EQ(strcmp(seqs[11].title, "read2x"), 0);
+
+    string expected_seq = string(
+        "AAAAAGGGGGCCCACGGCAGCCAGATTTAAATTGAGGGCAACCCCCCTTT"
+        "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG");
+    EXPECT_EQ(strcmp((char*)seqs[11].seq, expected_seq.c_str()), 0);
+}
+
diff --git a/libcpp/unittest/pbdata/FASTASequence_gtest.cpp b/libcpp/unittest/pbdata/FASTASequence_gtest.cpp
new file mode 100644
index 0000000..4161e76
--- /dev/null
+++ b/libcpp/unittest/pbdata/FASTASequence_gtest.cpp
@@ -0,0 +1,143 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  FASTASequence_gtest.cpp
+ *
+ *    Description:  Test pbdata/FASTASequence.hpp
+ *
+ *        Version:  1.0
+ *        Created:  10/29/2012 05:19:13 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "FASTASequence.hpp"
+#include "gtest/gtest.h"
+#include <climits>
+#include <iostream>
+#include <fstream>
+
+
+using namespace std;
+
+class FASTASequenceTest : public ::testing::Test {
+public:
+    virtual void SetUp() {
+    }
+
+    virtual void TearDown() {
+        fastaOne.Free();
+        fastaTwo.Free();
+        fastaThree.Free();
+    }
+
+    FASTASequence fastaOne;
+    FASTASequence fastaTwo;
+    FASTASequence fastaThree;
+
+    std::streambuf * sbuf;
+    ofstream ofs;
+};
+
+
+//Test FASTASequence 
+TEST_F(FASTASequenceTest, ALLFUNC) {
+    // Test constructor 
+    EXPECT_TRUE(fastaOne.title == NULL);
+    EXPECT_TRUE(fastaOne.titleLength == 0);
+    EXPECT_TRUE(fastaOne.seq == NULL);
+    EXPECT_TRUE(fastaOne.length == 0);
+    EXPECT_FALSE(fastaOne.deleteOnExit);
+    EXPECT_EQ(fastaOne.GetStorageSize(), 0);
+
+    DNASequence dna;
+    Nucleotide thisNuc[] = "ATGCATGCTC";
+    dna.seq = thisNuc;
+    dna.length = 10;
+
+    int titleLength = 22;
+    string title("fasta_seq_one comments");
+    fastaOne.title = new char [titleLength];
+    memcpy(fastaOne.title, title.c_str(), titleLength);
+
+    fastaOne.titleLength = titleLength;
+
+    EXPECT_EQ(fastaOne.GetName(), string("fasta_seq_one"));
+    fastaOne.seq = thisNuc;
+    fastaOne.length = 10;
+
+    // use ShallowCopy carefully, since title may double free
+    // fastaTwo.ShallowCopy(fastaOne);
+    // EXPECT_EQ(fastaTwo.seq, fastaOne.seq);
+    // EXPECT_EQ(fastaTwo.title, fastaOne.title);
+
+
+    // Test AppendToTitle
+    fastaOne.AppendToTitle(string("XXX"));
+    EXPECT_EQ(fastaOne.titleLength, 26);
+
+    string newTitle = "fasta_seq_one commentsXXX";
+    EXPECT_STREQ(fastaOne.title, newTitle.c_str());
+
+
+    // Test ReverseComplementSelf()
+    fastaOne.ReverseComplementSelf();
+    string rcSeq = "GAGCATGCAT";
+    for (int i = 0; i < rcSeq.size(); i++) {
+        EXPECT_EQ(fastaOne.seq[i], rcSeq[i]);
+    }
+
+    // Test operator =
+    fastaTwo=fastaOne;
+    EXPECT_NE(fastaOne.title, fastaTwo.title);
+    EXPECT_EQ(fastaOne.titleLength, fastaTwo.titleLength);
+    EXPECT_STREQ(fastaOne.title, fastaTwo.title);
+    EXPECT_NE(fastaOne.seq, fastaTwo.seq);
+    for (int i = 0; i < fastaOne.length; i++) {
+        EXPECT_EQ(fastaOne.seq[i], fastaTwo.seq[i]);
+    }
+
+    // Test MakeRC(rhs&)
+    fastaOne.MakeRC(fastaThree);
+
+    // Test PrintSeq
+    stringstream ss;
+    fastaThree.PrintSeq(ss);
+    string thisTitle, thisComment, thisSeq;
+    ss >> thisTitle;
+    ss >> thisComment;
+    ss >> thisSeq;
+
+    EXPECT_EQ(thisTitle, ">fasta_seq_one");
+    EXPECT_EQ(thisComment, "commentsXXX");
+    EXPECT_EQ(thisSeq, "ATGCATGCTC");
+}
+
+
+TEST_F(FASTASequenceTest, CopyFromString) {
+    string name = "read_name";
+    string seq = "ATGGGCGC";
+    fastaOne.Copy(name, seq);
+    EXPECT_EQ(fastaOne.title, name);
+    EXPECT_EQ(fastaOne.length, seq.size());
+    EXPECT_EQ(fastaOne.deleteOnExit, true);
+    for(int i = 0; i < fastaOne.length; i++) {
+        EXPECT_EQ(fastaOne.seq[i], seq[i]);
+    }
+
+    // Copy sequence from another string. 
+    string seq2 = "GGTTGTG";
+    fastaOne.Copy(seq2);
+    // Name not changed.
+    EXPECT_EQ(fastaOne.title, name);
+    EXPECT_EQ(fastaOne.length, seq2.size());
+    EXPECT_EQ(fastaOne.deleteOnExit, true);
+    for(int i = 0; i < fastaOne.length; i++) {
+        EXPECT_EQ(fastaOne.seq[i], seq2[i]);
+    }
+}
diff --git a/libcpp/unittest/pbdata/FASTQReader_gtest.cpp b/libcpp/unittest/pbdata/FASTQReader_gtest.cpp
new file mode 100644
index 0000000..2fbbaca
--- /dev/null
+++ b/libcpp/unittest/pbdata/FASTQReader_gtest.cpp
@@ -0,0 +1,90 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  FASTQReader_gtest.cpp
+ *
+ *    Description:  Test pbdata/FASTQReader.hpp
+ *
+ *        Version:  1.0
+ *        Created:  10/29/2012 05:19:32 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+
+
+#include "gtest/gtest.h"
+#include "FASTQReader.hpp"
+#include "pbdata/testdata.h"
+
+const string movie = 
+    "m130328_211423_ethan_c100499512550000001823070408081371_s1_p0";
+const int numSeqs = 208;
+
+class FASTQReaderTest:public::testing::Test{
+public:
+    void SetUp() {
+        string filename(fastqFile1);
+        reader.Initialize(filename);
+    }
+
+    void TearDown() {
+        reader.Close();
+        seq.Free();
+    }
+
+    FASTQReader reader;
+    FASTQSequence seq;
+};
+
+TEST_F(FASTQReaderTest, GetNext) {
+    reader.GetNext(seq);
+    EXPECT_EQ(strcmp(seq.title, string(movie + "/8").c_str()), 0);
+    EXPECT_EQ(seq.length, 752);
+    string expected_seq = string(
+        "AATAAAAAAAAAAGAAAGCTTCGAAGTGAGCGAATTACTCTCAGGCAACT"
+        "GCGGGTGAAGCCAGAGCAGGCATGATGACACTGGGGAATTTACGCAAATT"
+        "TTACCATTGAATTTACACATGCGATGTGCTGGAATGCGGAAGACGGAAAC"
+        "GAAACCAGCAATACATCAAACGCCGCACCAGAGAAGAGATATTTGCGCCC"
+        "TAAACTAGGTAAGGCGGTTGACTTGAACAGCAAATCAAACGTCAACGAGC"
+        "AGCGTGAGTATATACAAGTTATCTCGGATGGAGAACGTATTCTAAATGTA"
+        "AGCACGAATCCCGGAAGAGGAAACCAGTTTCTTGGTTTTTCGCCATCCTC"
+        "GAAGACCTGTTACAAACCGCACTGGACCTGGAAAGTTTCTGCGCGTAATC"
+        "GACAAGACTAGTAACTATCGACATCAACCATCGATTACGGGTTGGGTCAA"
+        "TGGGTTCAGATGCAGGTGAGTATCCTTCATATGATAGTCTGACGCTGGCA"
+        "TTCGCTCAAAGGAAGTAGACGGTTTTGTAAATAGAAACGCTTGTGAAAAG"
+        "CTGAATTTCGCGTCGTCTTCCAGCGATGCAGAGCTGTAGTAGTTCAGATG"
+        "ATGACCGTTACTCAAAGTGCCTGCAACGGCTCGGGGCGTGCGCGTCCTGT"
+        "GGTGGCTGCTTTTGTTGCGCTGTTTGCAGTGTATGGTTGTCGGGTGATGT"
+        "TGCCTGCAAACCCACAAAACCCCACACACACAACAGTTGGGTTGTTGATT"
+        "GG");
+    string expected_qual = string(
+        "(,)'(')''++),.$\"+*$'--.-/+&.$-./$',-.&#'/,.,)-,--,");
+
+    for(int i=0; i < seq.length; i++){
+        EXPECT_EQ(seq.seq[i], expected_seq[i]);
+    }
+
+    for(int i=0; i < expected_qual.size(); i++){
+        EXPECT_EQ(seq.qual[i] + FASTQSequence::charToQuality,
+                  expected_qual[i]);
+    }
+
+    reader.GetNext(seq);
+    EXPECT_EQ(strcmp(seq.title, string(movie+"/9").c_str()), 0);
+
+    // Continue to read
+    for(int i=2; i < numSeqs; i++) {
+        EXPECT_TRUE(reader.GetNext(seq));
+    }
+    EXPECT_EQ(strcmp(seq.title, string(movie+"/249").c_str()), 0);
+
+    // Can not proceed.
+    EXPECT_FALSE(reader.GetNext(seq));
+}
+
diff --git a/libcpp/unittest/pbdata/Makefile b/libcpp/unittest/pbdata/Makefile
new file mode 100644
index 0000000..a6474af
--- /dev/null
+++ b/libcpp/unittest/pbdata/Makefile
@@ -0,0 +1,31 @@
+include ../../rules.mk
+include ../defines.mk
+
+SOURCES    = $(wildcard *.cpp) \
+		     $(wildcard utils/*.cpp) \
+		     $(wildcard metagenome/*.cpp) \
+		     $(wildcard saf/*.cpp) \
+		     $(wildcard reads/*.cpp) \
+		     $(wildcard qvs/*.cpp) 
+OBJECTS    = $(SOURCES:.cpp=.o)
+
+EXE := test-runner
+
+all debug profile: $(EXE)
+
+libpbdata_gtest.a: $(OBJECTS)
+	$(AR) $(ARFLAGS)c $@ $^
+
+$(EXE): $(OBJECTS)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $^ $(GTEST_SRC) -o $@ -I$(GTEST_ROOT) $(LIBDIRS) $(LDFLAGS)
+
+$(OBJECTS): %.o: %.cpp
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) -c $< -o $@ $(INCDIRS)
+
+gtest: $(EXE)
+	./$< --gtest_output=xml:../xml/pbdata.xml
+
+clean:
+	@find . -type f -name \*.o -delete
+	@find . -type f -name \*.d -delete
+	@rm -f libpbdata_gtest.a $(EXE) ../xml/pbdata.xml
diff --git a/libcpp/unittest/pbdata/NucConversion_gtest.cpp b/libcpp/unittest/pbdata/NucConversion_gtest.cpp
new file mode 100644
index 0000000..b1df999
--- /dev/null
+++ b/libcpp/unittest/pbdata/NucConversion_gtest.cpp
@@ -0,0 +1,105 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  NucConversion_gtest.cpp
+ *
+ *    Description:  Test pbdata/NucConversion.hpp
+ *
+ *        Version:  1.0
+ *        Created:  08/19/2014 05:21:12 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+#include "gtest/gtest.h"
+#include "NucConversion.hpp"
+
+
+// ACGT = 0123
+TEST(NucConversion, ASCIITo2BIT) {
+    EXPECT_EQ(TwoBit['A'], 0);
+    EXPECT_EQ(TwoBit['a'], 0);
+    EXPECT_EQ(TwoBit['C'], 1);
+    EXPECT_EQ(TwoBit['c'], 1);
+    EXPECT_EQ(TwoBit['G'], 2);
+    EXPECT_EQ(TwoBit['g'], 2);
+    EXPECT_EQ(TwoBit['T'], 3);
+    EXPECT_EQ(TwoBit['t'], 3);
+    EXPECT_EQ(TwoBit['N'], 255);
+    EXPECT_EQ(TwoBit['x'], 255);
+}
+
+TEST(NucConversion, ASCIITo3BIT) {
+    EXPECT_EQ(ThreeBit['A'], 0);
+    EXPECT_EQ(ThreeBit['a'], 0);
+    EXPECT_EQ(ThreeBit['C'], 1);
+    EXPECT_EQ(ThreeBit['c'], 1);
+    EXPECT_EQ(ThreeBit['G'], 2);
+    EXPECT_EQ(ThreeBit['g'], 2);
+    EXPECT_EQ(ThreeBit['T'], 3);
+    EXPECT_EQ(ThreeBit['t'], 3);
+    
+    EXPECT_EQ(ThreeBit['U'], 4);
+    EXPECT_EQ(ThreeBit['M'], 4);
+    EXPECT_EQ(ThreeBit['R'], 4);
+    EXPECT_EQ(ThreeBit['W'], 4);
+    EXPECT_EQ(ThreeBit['S'], 4);
+    EXPECT_EQ(ThreeBit['Y'], 4);
+    EXPECT_EQ(ThreeBit['K'], 4);
+    EXPECT_EQ(ThreeBit['V'], 4);
+    EXPECT_EQ(ThreeBit['H'], 4);
+    EXPECT_EQ(ThreeBit['D'], 4);
+    EXPECT_EQ(ThreeBit['N'], 4);
+
+    EXPECT_EQ(ThreeBit['$'], 5);
+
+    EXPECT_EQ(ThreeBit['p'], 255);
+    EXPECT_EQ(ThreeBit['q'], 255);
+}
+
+TEST(NucConversion, ISACTG) {
+    EXPECT_TRUE(IsACTG['A']);
+    EXPECT_TRUE(IsACTG['a']);
+    EXPECT_TRUE(IsACTG['C']);
+    EXPECT_TRUE(IsACTG['c']);
+    EXPECT_TRUE(IsACTG['G']);
+    EXPECT_TRUE(IsACTG['g']);
+    EXPECT_TRUE(IsACTG['T']);
+    EXPECT_TRUE(IsACTG['t']);
+
+    EXPECT_FALSE(IsACTG['w']);
+    EXPECT_FALSE(IsACTG['N']);
+}
+
+
+TEST(NucConversion, ThreeBitToASCII) {
+    char alphabeta[] = {'A', 'C', 'G', 'T'};
+    for(int i = 0; i < 4; i++) {
+        EXPECT_EQ(alphabeta[i], ThreeBitToAscii[ThreeBit[alphabeta[i]]]);
+    }
+}
+
+TEST(NucConversion, AllToUpper) {
+    char alphabeta[] = {'A', 'C', 'G', 'T', 'a', 'c', 'g', 't'};
+    for(int i = 0; i < 8; i++) {
+        EXPECT_EQ(toupper(alphabeta[i]), AllToUpper[alphabeta[i]]);
+    }
+}
+
+TEST(NucConversion, AllToLower) {
+    char alphabeta[] = {'A', 'C', 'G', 'T', 'a', 'c', 'g', 't'};
+    for(int i = 0; i < 8; i++) {
+        EXPECT_EQ(tolower(alphabeta[i]), AllToLower[alphabeta[i]]);
+    }
+}
+
+TEST(NucConversion, ReverseComplementNuc) {
+    EXPECT_EQ(ReverseComplementNuc['A'], 'T');
+    EXPECT_EQ(ReverseComplementNuc['T'], 'A');
+    EXPECT_EQ(ReverseComplementNuc['G'], 'C');
+    EXPECT_EQ(ReverseComplementNuc['C'], 'G');
+}
diff --git a/libcpp/unittest/pbdata/SMRTSequence_gtest.cpp b/libcpp/unittest/pbdata/SMRTSequence_gtest.cpp
new file mode 100644
index 0000000..43f40d9
--- /dev/null
+++ b/libcpp/unittest/pbdata/SMRTSequence_gtest.cpp
@@ -0,0 +1,62 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  SMRTSequenceSequence_gtest.cpp
+ *
+ *    Description:  Test pbdata/SMRTSequenceSequence.h
+ *
+ *        Version:  1.0
+ *        Created:  10/29/2012 05:17:04 PM
+ *       Revision:  08/19/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "SMRTSequence.hpp"
+
+using namespace std;
+
+Nucleotide seqnt[] = "ATATGGGGATTAGGGGATA"; 
+const string seqst("ATATGGGGATTAGGGGATA"); 
+
+class SMRTSequenceTest: public:: testing:: Test{
+public:
+    void SetUp() {
+        smrt.seq = seqnt;
+        int len = sizeof(seqnt) / sizeof(Nucleotide) - 1;
+        smrt.length = len; 
+        smrt.zmwData.holeNumber = 1;
+        smrt.subreadStart = 0;
+        smrt.subreadEnd = 19;
+        smrt.AllocateDeletionQVSpace(len);
+        for(int i=0; i < 19; i ++) {
+            smrt.deletionQV[i] = i;
+        }
+    }
+    void TearDown() {
+        smrt.Free();
+    }
+    SMRTSequence smrt;
+};
+
+
+TEST_F(SMRTSequenceTest, Print) {
+   stringstream ss;
+   smrt.Print(ss);
+   ASSERT_EQ(ss.str(), (string("SMRTSequence for zmw 1, [0, 19)\n")
+                        + seqst + "\n"));
+}
+
+
+TEST_F(SMRTSequenceTest, GetDeletionQV) {
+    for(int i = 0; i < smrt.length; i ++){
+        ASSERT_EQ(smrt.GetDeletionQV(i), i);
+    }
+}
+
+
diff --git a/libcpp/unittest/pbdata/ScanData_gtest.cpp b/libcpp/unittest/pbdata/ScanData_gtest.cpp
new file mode 100644
index 0000000..1a3bdbb
--- /dev/null
+++ b/libcpp/unittest/pbdata/ScanData_gtest.cpp
@@ -0,0 +1,31 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  ScanData_gtest.cpp
+ *
+ *    Description:  Test pbdata/reads/ScanData.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 03:55:46 PM
+ *       Revision:  08/20/2014
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "reads/ScanData.hpp"
+
+TEST(ScanDataTest, GetMovieName) {
+    ScanData sd;
+    EXPECT_EQ(sd.platformId, NoPlatform);
+    EXPECT_EQ(sd.frameRate, 0);
+    EXPECT_EQ(sd.numFrames, 0);
+    EXPECT_EQ(sd.movieName.size(), 0);
+    EXPECT_EQ(sd.runCode.size(), 0);
+    EXPECT_EQ(sd.whenStarted.size(), 0);
+    EXPECT_EQ(sd.baseMap.size(), 0);
+}
diff --git a/libcpp/unittest/pbdata/SeqUtils_gtest.cpp b/libcpp/unittest/pbdata/SeqUtils_gtest.cpp
new file mode 100644
index 0000000..e83c955
--- /dev/null
+++ b/libcpp/unittest/pbdata/SeqUtils_gtest.cpp
@@ -0,0 +1,50 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  SeqUtils_gtest.cpp
+ *
+ *    Description:  Test pbdata/SeqUtils.hpp, SeqUtils_Impl.hpp
+ *
+ *        Version:  1.0
+ *        Created:  10/29/2012 05:21:58 PM
+ *        Updated:  08/18/2014 05:49:51 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+#include "gtest/gtest.h"
+#include "SeqUtils.hpp"
+
+TEST(SeqUtils, OnlyACTG){
+    DNASequence seq;
+    Nucleotide seqnt[] = "ATGC";
+    seq.seq = seqnt;
+    seq.length = 4;
+    EXPECT_EQ(OnlyACTG(seq), 1);
+
+    Nucleotide seqnt1[] = "ATXYZ";
+    seq.seq = seqnt1;
+    seq.length = 5;
+    EXPECT_EQ(OnlyACTG(seq), 0);
+}
+
+TEST(SeqUtils, CountMasked){
+    DNASequence seq;
+    Nucleotide seqnt[] = "ATGCNNNNNNATGC";
+    seq.seq = seqnt;
+    seq.length = 14;
+    EXPECT_EQ(CountMasked(seq), 6);
+}
+
+TEST(SeqUtils, CountNotMasked){
+    DNASequence seq;
+    Nucleotide seqnt[] = "ATGCNNNNNNATGC";
+    seq.seq = seqnt;
+    seq.length = 14;
+    EXPECT_EQ(CountNotMasked(seq), 8);
+
+}
diff --git a/libcpp/unittest/pbdata/StringUtils_gtest.cpp b/libcpp/unittest/pbdata/StringUtils_gtest.cpp
new file mode 100644
index 0000000..abd6622
--- /dev/null
+++ b/libcpp/unittest/pbdata/StringUtils_gtest.cpp
@@ -0,0 +1,80 @@
+/*
+ * ==================================================================
+ *
+ *       Filename:  StringUtils_gtest.cpp
+ *
+ *    Description:  Test pbdata/StringUtils.hpp
+ *
+ *        Version:  1.0
+ *        Created:  03/28/2015 03:54:55 PM
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ==================================================================
+ */
+#include "gtest/gtest.h"
+#include "reads/ReadType.hpp"
+#include "StringUtils.hpp"
+
+using namespace std;
+
+
+TEST(StringUtilTest, MakeReadGroupId) {
+
+    string movieName = "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0";
+    ReadType::ReadTypeEnum readType = ReadType::SUBREAD;
+    string expectedReadGroupId = "b89a4406";
+    EXPECT_EQ(MakeReadGroupId(movieName, readType), expectedReadGroupId);
+
+    movieName = "movie32";
+    readType = ReadType::CCS;
+    expectedReadGroupId = "f5b4ffb6";
+    EXPECT_EQ(MakeReadGroupId(movieName, readType), expectedReadGroupId);
+}
+
+TEST(StringUtilTest, Splice) {
+    vector<string> tokens;
+
+    Splice("movie/zmw/0_1", "/", tokens);
+    vector<string> exp = {"movie", "zmw", "0_1"};
+    EXPECT_EQ(tokens, exp); 
+
+    string test = "abc,ef,12,4";
+    Splice(test, ",", tokens);
+    exp = vector<string>{"abc", "ef", "12", "4"};
+    EXPECT_EQ(tokens, exp); 
+    
+    Splice(test, "ef,", tokens);
+    exp = vector<string>{"abc,", "12,4"};
+    EXPECT_EQ(tokens, exp);
+
+    Splice("", ",", tokens);
+    exp = vector<string>{""};
+    EXPECT_EQ(tokens, exp); 
+
+    Splice(",", ",", tokens);
+    exp = vector<string>{"", ""};
+    EXPECT_EQ(tokens, exp); 
+    
+    Splice(",abc,", ",", tokens);
+    exp = vector<string>{"", "abc", ""};
+    EXPECT_EQ(tokens, exp); 
+
+    Splice("abc,", ",", tokens);
+    exp = vector<string>{"abc", ""};
+    EXPECT_EQ(tokens, exp); 
+
+    Splice(",abc", ",",  tokens);
+    exp = vector<string>{"", "abc"};
+    EXPECT_EQ(tokens, exp); 
+
+    Splice("abc", "abc",  tokens);
+    exp = vector<string>{"", ""};
+    EXPECT_EQ(tokens, exp); 
+
+    Splice("a\tb\tc", "\t",  tokens);
+    exp = vector<string>{"a", "b", "c"};
+    EXPECT_EQ(tokens, exp); 
+}
diff --git a/libcpp/unittest/pbdata/VectorUtils_gtest.cpp b/libcpp/unittest/pbdata/VectorUtils_gtest.cpp
new file mode 100644
index 0000000..70d9463
--- /dev/null
+++ b/libcpp/unittest/pbdata/VectorUtils_gtest.cpp
@@ -0,0 +1,38 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  VectorUtils_gtest.cpp
+ *
+ *    Description:  Test pbdata/VectorUtils.hpp
+ *
+ *        Version:  1.0
+ *        Created:  01/17/2013 06:01:01 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "VectorUtils.hpp"
+
+using namespace std;
+
+// Test ClearMemory(vector<T> vt)
+TEST(VectorUtils, ClearMemory) {
+    vector<int> vi;
+    vi.push_back(1);
+
+    int size = 1000000;
+    vi.reserve(size);
+    EXPECT_EQ(vi.size(), 1);
+    EXPECT_EQ(vi.capacity(), size);
+
+    ClearMemory(vi);
+    EXPECT_EQ(vi.size(), 0);
+    EXPECT_EQ(vi.capacity(), 0);
+} 
+
diff --git a/libcpp/unittest/pbdata/defs_gtest.cpp b/libcpp/unittest/pbdata/defs_gtest.cpp
new file mode 100644
index 0000000..f81686b
--- /dev/null
+++ b/libcpp/unittest/pbdata/defs_gtest.cpp
@@ -0,0 +1,44 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  defs_gtest.cpp
+ *
+ *    Description:  Test pbdata/defs.h
+ *
+ *        Version:  1.0
+ *        Created:  10/29/2012 05:17:49 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "defs.h"
+
+TEST(DefsTest, MIN) {
+    EXPECT_EQ(MIN(1,10000), 1);
+    EXPECT_EQ(MIN(-1,10000), -1);
+    EXPECT_EQ(MIN(-1,-2), -2);
+}
+
+TEST(DefsTest, MAX) {
+    EXPECT_EQ(MAX(1,10000), 10000);
+    EXPECT_EQ(MAX(-1,10000), 10000);
+    EXPECT_EQ(MAX(-1,-2), -1);
+}
+
+TEST(DefsTest, SWAP) {
+    int x = 10;
+    int y = 100;
+    SWAP(x, y);
+
+    EXPECT_EQ(x, 100);
+    EXPECT_EQ(y, 10);
+}
+
+
+
diff --git a/libcpp/unittest/pbdata/metagenome/TitleTable_gtest.cpp b/libcpp/unittest/pbdata/metagenome/TitleTable_gtest.cpp
new file mode 100644
index 0000000..e4132a7
--- /dev/null
+++ b/libcpp/unittest/pbdata/metagenome/TitleTable_gtest.cpp
@@ -0,0 +1,32 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  TitleTable_gtest.cpp
+ *
+ *    Description:  Test pbdata/metagenome/TitleTable.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 03:34:56 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "metagenome/TitleTable.hpp"
+#include "pbdata/testdata.h"
+
+TEST(TitleTable, Read) {
+    TitleTable tt;
+    string fn = titleTable1;
+    tt.Read(fn);
+    EXPECT_STREQ(tt.table[0], "ref1 description1");
+    EXPECT_STREQ(tt.table[1], "ref2 description2");
+    EXPECT_EQ(tt.tableLength, 2);
+    tt.Free();
+}
+
diff --git a/libcpp/unittest/pbdata/qvs/QualityValueVector_gtest.cpp b/libcpp/unittest/pbdata/qvs/QualityValueVector_gtest.cpp
new file mode 100644
index 0000000..4119c93
--- /dev/null
+++ b/libcpp/unittest/pbdata/qvs/QualityValueVector_gtest.cpp
@@ -0,0 +1,50 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  QualityValueVector_gtest.cpp
+ *
+ *    Description:  Test pbdata/qvs/QualityValueVector.hpp
+ *
+ *        Version:  1.0
+ *        Created:  03/28/2015 05:21:58 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+#include "gtest/gtest.h"
+#include "qvs/QualityValue.hpp"
+#include "qvs/QualityValueVector.hpp"
+
+using namespace std;
+
+const string qvstr = "!#$%0123:;ABab{|}~";
+vector<uint8_t> data = {0,2,3,4,15,16,17,18,25,26,32,33,64,65,90,91,92,93};
+
+TEST(QualityValueVectorTest, Copy){
+    EXPECT_EQ(qvstr.size(), data.size());
+
+    QualityValueVector<QualityValue> qual;
+    EXPECT_TRUE(qual.Empty());
+
+    // Copy qvs from a string
+    qual.Copy(qvstr);
+    EXPECT_FALSE(qual.Empty());
+    for(size_t i = 0; i < qvstr.size(); i++) {
+        EXPECT_EQ(static_cast<uint8_t>(qual.data[i]), data[i]);
+    }
+}
+
+TEST(QualityValueVectorTest, ToString){
+    QualityValueVector<QualityValue> qual;
+    qual.Copy(qvstr);
+
+    // Test ToString()
+    EXPECT_EQ(qual.ToString(), qvstr);
+
+    EXPECT_EQ(static_cast<size_t>(qual.Length()), qvstr.size());
+}
+
diff --git a/libcpp/unittest/pbdata/reads/ReadType_gtest.cpp b/libcpp/unittest/pbdata/reads/ReadType_gtest.cpp
new file mode 100644
index 0000000..50f6a54
--- /dev/null
+++ b/libcpp/unittest/pbdata/reads/ReadType_gtest.cpp
@@ -0,0 +1,57 @@
+/*
+ * ==================================================================
+ *
+ *       Filename:  ReadType_gtest.cpp
+ *
+ *    Description:  Test pbdata/reads/ReadType.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 03:54:55 PM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ==================================================================
+ */
+#include "gtest/gtest.h"
+#include "reads/ReadType.hpp"
+
+using namespace std;
+
+string standard   = "Standard";
+string ccs        = "CCS";
+string rccs       = "RCCS";
+string noreadtype = "standard";
+
+string subread    = "SUBREAD";
+string polymerase = "POLYMERASE";
+string hqregion   = "HQREGION";
+string scarp      = "SCARP";
+string unknown    = "UNKNOWN";
+
+TEST(ReadTypeTest, ParseReadType) {
+    EXPECT_EQ(ReadType::ParseReadType(standard), ReadType::Standard);
+    EXPECT_EQ(ReadType::ParseReadType(ccs),      ReadType::CCS);
+    EXPECT_EQ(ReadType::ParseReadType(rccs),     ReadType::RCCS);
+    EXPECT_EQ(ReadType::ParseReadType(noreadtype), ReadType::NoReadType);
+
+    EXPECT_EQ(ReadType::ParseReadType(subread), ReadType::SUBREAD);
+    EXPECT_EQ(ReadType::ParseReadType(hqregion), ReadType::HQREGION);
+    EXPECT_EQ(ReadType::ParseReadType(polymerase), ReadType::POLYMERASE);
+    EXPECT_EQ(ReadType::ParseReadType(unknown), ReadType::UNKNOWN);
+}
+
+
+TEST(ReadTypeTest, ToString) {
+    EXPECT_EQ(ReadType::ToString(ReadType::Standard), standard);
+    EXPECT_EQ(ReadType::ToString(ReadType::CCS), ccs);
+    EXPECT_EQ(ReadType::ToString(ReadType::RCCS), rccs);
+    EXPECT_EQ(ReadType::ToString(ReadType::NoReadType), "NoReadType");
+
+    EXPECT_EQ(ReadType::ToString(ReadType::SUBREAD), subread);
+    EXPECT_EQ(ReadType::ToString(ReadType::HQREGION), hqregion);
+    EXPECT_EQ(ReadType::ToString(ReadType::POLYMERASE), polymerase);
+    EXPECT_EQ(ReadType::ToString(ReadType::UNKNOWN), unknown);
+}
diff --git a/libcpp/unittest/pbdata/saf/AlnGroup_gtest.cpp b/libcpp/unittest/pbdata/saf/AlnGroup_gtest.cpp
new file mode 100644
index 0000000..d0daed4
--- /dev/null
+++ b/libcpp/unittest/pbdata/saf/AlnGroup_gtest.cpp
@@ -0,0 +1,44 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  AlnGroup_gtest.cpp
+ *
+ *    Description:  Test pbdata/saf/AlnGroup.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 04:00:29 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+#include "gtest/gtest.h"
+#include "saf/AlnGroup.hpp"
+
+using namespace std;
+
+//Test AlnGroup.FindPath();
+TEST(AlnGroupTest, FindPath) {
+    AlnGroup alnGroup;
+    unsigned int ids[10] = {3, 4, 6, 1, 2, 8, 9, 12, 11, 7};
+    string paths[10] = {"path1", "path2", "path3", "path4", "path5",
+                        "path6", "path7", "path8", "path9", "path10"};
+    for(int i = 0; i < 10; i++) {
+        alnGroup.id.push_back(ids[i]);
+        alnGroup.path.push_back(paths[i]);
+    }
+
+    string val, val1;
+    int ret = alnGroup.FindPath(3, val);
+    EXPECT_EQ(val, paths[0]);
+    EXPECT_EQ(ret, 1);
+
+    
+    ret = alnGroup.FindPath(100, val1);
+    EXPECT_EQ(ret, 0);
+    EXPECT_EQ(val1, "");
+
+}
diff --git a/libcpp/unittest/pbdata/saf/MovieInfo_gtest.cpp b/libcpp/unittest/pbdata/saf/MovieInfo_gtest.cpp
new file mode 100644
index 0000000..02a2642
--- /dev/null
+++ b/libcpp/unittest/pbdata/saf/MovieInfo_gtest.cpp
@@ -0,0 +1,43 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  MovieInfo_gtest.cpp
+ *
+ *    Description:  Test pbdata/saf/MovieInfo.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 04:01:21 PM
+ *       Revision:  08/20/2014
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "Types.h"
+#include "saf/MovieInfo.hpp"
+
+// Test MovieInfo.FindMovie
+TEST(MovieInfoTest, FindMovie) {
+    MovieInfo movieInfo;
+    int ids[5] = {3, 5, 7, 4, 0} ;
+    string names[5] = {"movieX", "movieY", "abc", "m000000000032102389170_s0", "m000000000032102389170_s"};
+
+    for (int i = 0; i < 5; i++) {
+        movieInfo.name.push_back(names[i]);
+        movieInfo.id.push_back(ids[i]);
+    }
+
+    string nameVal, nameVal2;
+    int ret = movieInfo.FindMovie(4, nameVal);
+    EXPECT_EQ(nameVal, names[3]);
+    EXPECT_EQ(ret, 1);
+
+    ret = movieInfo.FindMovie(-1, nameVal);
+    EXPECT_EQ(nameVal2, "");
+    EXPECT_EQ(ret, 0);
+
+}
diff --git a/libcpp/unittest/pbdata/saf/RefInfo_gtest.cpp b/libcpp/unittest/pbdata/saf/RefInfo_gtest.cpp
new file mode 100644
index 0000000..0e25e99
--- /dev/null
+++ b/libcpp/unittest/pbdata/saf/RefInfo_gtest.cpp
@@ -0,0 +1,45 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  RefInfo_gtest.cpp
+ *
+ *    Description:  Test pbdata/saf/RefInfo.hpp
+ *
+ *        Version:  1.0
+ *        Created:  11/29/2012 04:02:00 PM
+ *       Revision:  08/20/2014 
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "saf/RefInfo.hpp"
+
+using namespace std;
+
+TEST(RefInfoTEST, RefIdToIndex) {
+    RefInfo ri;
+
+    string names[] = {"ref1", "ref3 description", "ref4 chr1 1:100"};
+    ri.fullName.insert(ri.fullName.begin(), names, names+3);
+
+    int id[] = {10, 7, 5};
+    //int lens [] = {400, 300, 100};
+    ri.id.insert(ri.id.begin(), id, id+3);
+
+    int index;
+    EXPECT_TRUE(ri.RefIdToIndex(10, index));
+    EXPECT_EQ(index, 0);
+
+    EXPECT_TRUE(ri.RefIdToIndex(7, index));
+    EXPECT_EQ(index, 1);
+
+    EXPECT_TRUE(ri.RefIdToIndex(5, index));
+    EXPECT_EQ(index, 2);
+}
+
+
diff --git a/libcpp/unittest/pbdata/testdata.h b/libcpp/unittest/pbdata/testdata.h
new file mode 100644
index 0000000..ec208f4
--- /dev/null
+++ b/libcpp/unittest/pbdata/testdata.h
@@ -0,0 +1,71 @@
+/* * ============================================================================
+ *
+ *       Filename:  testdata.h
+ *
+ *    Description:  List files used in unit tests.
+ *
+ *        Version:  1.0
+ *        Created:  08/22/2013 11:10:54 AM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * ============================================================================
+ */
+#include <string>
+
+using namespace std;
+
+const string baxFile1 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/ctest/data/"
+     "testLoadPulses/Analysis_Results/"
+     "m130302_011223_pd1_c000000092559900001500000112311511_s1_p0.1.bax.h5");
+
+const string baxFile2 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/ctest/data/"
+     "testLoadPulses/Analysis_Results/"
+     "m130302_011223_pd1_c000000092559900001500000112311511_s1_p0.2.bax.h5");
+
+const string baxFile3 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/utest/data/"
+     "test_read_chemistry_triple/"
+     "m150223_190837_42175_c100735112550000001823160806051530_s1_p0.1.bax.h5");
+
+const string plsFile1 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/ctest/data/"
+     "testLoadPulses/Analysis_Results/"
+     "m121215_065521_richard_c100425710150000001823055001121371_s1_p0.pls.h5");
+
+const string ccsFile1 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/utest/data/ccs_P4-C2/"
+     "m130328_211423_ethan_c100499512550000001823070408081371_s1_p0.ccs.h5");
+
+const string fastaFile1 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/utest/"
+     "data/read.fasta");
+
+const string fastqFile1 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/utest/data/ccs_P4-C2/"
+     "m130328_211423_ethan_c100499512550000001823070408081371_s1_p0.fastq");
+
+const string titleTable1 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/utest/"
+     "data/titleTable1");
+ 
+const string rgnFile1 =
+    ("/mnt/secondary-siv/testdata/BlasrTestData/utest/"
+     "data/test_regionTable.rgn.h5");
+
+const string scanDataFile1 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/utest/"
+     "data/scandata.h5");
+
+const string bamFile1 = 
+    ("/mnt/secondary-siv/testdata/BlasrTestData/ctest/data/test_bam/"
+     "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0.subreads.bam");
+
+const string bamFile2 =   
+    ("/mnt/secondary-siv/testdata/BlasrTestData/ctest/data/test_bam/"
+     "m150325_224749_42269_c100795290850000001823159309091522_s1_p0.subreads.bam");
diff --git a/libcpp/unittest/pbdata/utils/SMRTTitle_gtest.cpp b/libcpp/unittest/pbdata/utils/SMRTTitle_gtest.cpp
new file mode 100644
index 0000000..5618258
--- /dev/null
+++ b/libcpp/unittest/pbdata/utils/SMRTTitle_gtest.cpp
@@ -0,0 +1,28 @@
+#include "gtest/gtest.h"
+#include "utils/SMRTTitle.hpp"
+
+
+TEST(SMRTTitleTest, test1) {
+    SMRTTitle title("1");
+    EXPECT_EQ(title.isSMRTTitle, false);
+    EXPECT_EQ(title.ToString(), "");
+}
+
+TEST(SMRTTitleTest, test2) {
+    SMRTTitle title("1/2");
+    EXPECT_EQ(title.isSMRTTitle, false);
+    EXPECT_EQ(title.ToString(), "");
+}
+
+TEST(SMRTTitleTest, test3) {
+    SMRTTitle title("m/1/3_4");
+    EXPECT_EQ(title.isSMRTTitle, true);
+    EXPECT_EQ(title.ToString(), "m/1/3_4");
+}
+
+TEST(SMRTTitleTest, test4) {
+    SMRTTitle title("m/1/10_20/3_7");
+    EXPECT_EQ(title.isSMRTTitle, true);
+    EXPECT_EQ(title.ToString(), "m/1/13_17");
+}
+
diff --git a/libcpp/unittest/pbdata/utils_gtest.cpp b/libcpp/unittest/pbdata/utils_gtest.cpp
new file mode 100644
index 0000000..a2f6b77
--- /dev/null
+++ b/libcpp/unittest/pbdata/utils_gtest.cpp
@@ -0,0 +1,37 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  utils_gtest.cpp
+ *
+ *    Description:  Test pbdata/utils.hpp
+ *
+ *        Version:  1.0
+ *        Created:  08/19/2014 05:22:58 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+
+#include "gtest/gtest.h"
+#include "utils.hpp"
+
+using namespace std;
+
+TEST(UTILS, CrucialOpen) {
+    ifstream ifs;
+    string filename = "/nonexistingdir/nonexistingfile";
+    //Expected behavour: exit with a message.
+    EXPECT_EXIT( CrucialOpen(filename, ifs, std::ios::in),
+        ::testing::ExitedWithCode(1), "");
+}
+
+TEST(UTILS, CeilOfFraction) {
+    EXPECT_EQ(CeilOfFraction<int>(7, 100), 1);
+    EXPECT_EQ(CeilOfFraction<int>(100, 7), 15);
+    EXPECT_EQ(CeilOfFraction<int>(100, 99), 2);
+    EXPECT_EQ(CeilOfFraction<int>(100, 5), 20);
+}
diff --git a/p4.common.mk b/p4.common.mk
new file mode 100644
index 0000000..c913f27
--- /dev/null
+++ b/p4.common.mk
@@ -0,0 +1,147 @@
+OS := $(shell uname)
+
+# Determine where is PBINCROOT, either from github or PacBio SMRTAnalysis package.
+PBINCROOT ?= $(realpath ../../lib/cpp/)
+PREBUILT ?= $(realpath ../../../prebuilt.out)
+THIRD_PARTY_PREFIX ?= $(realpath ..)
+
+SUBMK = $(PBINCROOT)/sub.mk
+FETCHTMP = p4.fetch.tmpmk
+FETCHMK = p4.fetch.mk
+
+include $(PBINCROOT)/common.mk
+
+LIBBLASR_INCLUDE  := $(PBINCROOT)/alignment
+LIBPBIHDF_INCLUDE := $(PBINCROOT)/hdf
+LIBPBDATA_INCLUDE := $(PBINCROOT)/pbdata
+PBBAM_INCLUDE     := $(PBBAM)/include
+HTSLIB_INCLUDE    := $(PBBAM)/../htslib/htslib
+HDF5_INCLUDE      := $(HDF5_INC)
+ZLIB_INCLUDE      := $(ZLIB_ROOT)/include
+
+LIBBLASR_LIB  := $(PBINCROOT)/alignment
+LIBPBIHDF_LIB := $(PBINCROOT)/hdf
+LIBPBDATA_LIB := $(PBINCROOT)/pbdata
+PBBAM_LIB     := $(PBBAM)/lib
+HTSLIB_LIB    := $(PBBAM)/../htslib
+HDF5_LIB      := $(HDF5_LIB)
+ZLIB_LIB      := $(ZLIB_ROOT)/lib
+
+HTSLIB_SO     := $(HTSLIB_LIB)/libhts.so
+PBBAM_SO      := $(PBBAM_LIB)/libpbbam.so
+
+HTSLIB_A      := $(HTSLIB_LIB)/libhts.a
+PBBAM_A       := $(PBBAM_LIB)/libpbbam.a
+
+LIBPBIHDF_CPP_LIBFLAG := -lhdf5_cpp
+LIBPBIHDF_LIBFLAG     := -lhdf5
+
+LIBBLASR_LIBFLAGS  := -lblasr
+LIBPBIHDF_LIBFLAGS := -lpbihdf
+LIBPBDATA_LIBFLAGS := -lpbdata
+PBBAM_LIBFLAGS     := -lpbbam
+HTSLIB_LIBFLAGS    := -lhts
+HDF5_LIBFLAGS      := $(LIBHDF5_CPP_LIBFLAG) $(LIBHDF5_LIBFLAG)
+ZLIB_LIBFLAGS      := -lz
+
+
+INCDIRS = -I$(LIBBLASR_INCLUDE) \
+          -I$(LIBPBIHDF_INCLUDE) \
+          -I$(LIBPBDATA_INCLUDE) \
+          -I$(HDF5_INCLUDE)
+
+LIBDIRS = -L$(LIBBLASR_LIB) \
+          -L$(LIBPBIHDF_LIB) \
+          -L$(LIBPBDATA_LIB) \
+          -L$(HDF5_LIB) 
+
+ifneq ($(ZLIB_ROOT), notfound)
+        # NOTE: The zlib include directory is not needed since we do not
+        #       refer to any zlib include files directly in the blasr source
+        #       code.   But we do need to link to the zlib library (static
+        #       or shared), since htslib depends on it.
+        #          INCDIRS += -I$(ZLIB_INCLUDE)
+	LIBDIRS += -L$(ZLIB_LIB)
+endif
+
+CXXOPTS := -std=c++0x -pedantic \
+           -Wall -Wuninitialized -Wno-div-by-zero \
+           -MMD -MP -w -fpermissive
+
+DEFAULTCXXFLAG := -O3
+DEBUGCXXFLAG := -g -ggdb -fno-inline
+PROFILECXXFLAG := -Os -pg 
+GCXXFLAG := -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fno-omit-frame-pointer 
+
+LIBS := $(LIBBLASR_LIBFLAGS) $(LIBPBIHDF_LIBFLAGS) $(LIBPBDATA_LIBFLAGS)
+PBBAMLIBS :=  $(PBBAM_LIBFLAGS)
+ifneq ($(SHARED_LIB),)
+    PBBAMLIBS += $(HTSLIB_LIBFLAGS)
+else
+    ifneq ($(wildcard "$(HTSLIB_LIB)/libhts.a"),"")
+        PBBAMLIBS += $(HTSLIB_LIB)/libhts.a
+    else
+         PBBAMLIBS += $(HTSLIB_LIBFLAGS)
+    endif
+endif
+
+ifneq ($(SHARED_LIB),)
+    LIBS += $(HDF5_LIBFLAGS)
+else
+    ifneq ($(wildcard "$(HDF5_LIB)/libhdf5_cpp.a"),"")
+        LIBS += $(HDF5_LIB)/libhdf5_cpp.a $(HDF5_LIB)/libhdf5.a
+    else
+        LIBS += $(HDF5_LIBFLAGS)
+    endif
+endif
+
+ifeq ($(origin nopbbam), undefined)
+	INCDIRS += -I$(PBBAM_INCLUDE) \
+			   -I$(HTSLIB_INCLUDE) \
+			   -I$(BOOST_INCLUDE)
+
+
+	LIBDIRS += -L$(PBBAM_LIB) \
+			   -L$(HTSLIB_LIB)
+
+	LIBS += $(PBBAMLIBS) 
+endif
+
+LIBS += $(ZLIB_LIBFLAGS)
+LIBS += -lpthread
+
+# NOTE: libdl is not needed when we are linking with shared libraries, but
+#       is is needed for static linking, since the hdf5 library depends on it
+ifeq ($(SHARED_LIB),)
+    LIBS += -ldl
+endif
+
+ifneq ($(SHARED_LIB),)
+    STATIC :=
+else
+    ifneq ($(OS), Darwin)
+	STATIC := -static
+    else
+	STATIC :=
+    endif
+endif
+
+ifneq ($(OS), Darwin)
+	LIBS += -lrt
+else
+	LIBS += -lsz
+endif
+
+# -lhdf5, -lhdf5_cpp, -lz required for HDF5
+# -lpbbam -lhts for BAM
+# -lpthread for multi-threading
+# -lrt for clock_gettime
+# -ldl for dlopen dlclose 
+
+GLIBS = -Wl --eh-frame-hdr -fno-builtin-malloc -L$(HOME)/lib -ltcmalloc -lunwind -lprofiler $(LIBS)
+
+PBLIB :=
+ifeq ($(NO_SUBMAKES),)
+    PBLIB := pblib
+endif
+
diff --git a/p4.fetch.tmpmk b/p4.fetch.tmpmk
new file mode 100644
index 0000000..c171051
--- /dev/null
+++ b/p4.fetch.tmpmk
@@ -0,0 +1,10 @@
+REMOTE:=git://github.com/${NAME}.git
+REPO_DIR=blasr_libcpp
+
+# in case curl/tar/rsync/head are not available in our jenkins build
+PATH:=${PATH}:/bin:/usr/bin
+export PATH
+
+all:
+	@ls $(REPO_DIR) 1>/dev/null 2>/dev/null || git clone ${REMOTE} ${REPO_DIR}
+
diff --git a/p4.mk b/p4.mk
new file mode 100644
index 0000000..60941d6
--- /dev/null
+++ b/p4.mk
@@ -0,0 +1,76 @@
+SHELL=bash -e -E -vx
+
+.PHONY: all pblib makeutils gtest cramtests cramfast check clean wipe
+
+include p4.common.mk
+
+BLASR_LIBCPP := blasr_libcpp
+SRCS := $(wildcard *.cpp)
+OBJS := $(SRCS:.cpp=.o)
+DEPS := $(SRCS:.cpp=.d)
+EXE = blasr
+UTILS = utils
+
+all : CXXFLAGS ?= $(DEFAULTCXXFLAG)
+debug : CXXFLAGS ?= $(DEBUGCXXFLAG)
+profile : CXXFLAGS ?= $(PROFILECXXFLAG)
+g: CXXFLAGS += $(GCXXFLAG)
+g: LIBS = $(GLIBS)
+MAKE := make
+
+all debug profile g: $(EXE) makeutils 
+
+$(EXE): $(SRCS) mkliba
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $(SRCS) $(LIBDIRS) $(LIBS)
+
+makeutils: mkliba
+	export CXXFLAGS="$(CXXFLAGS)" && make -C $(UTILS) $(MODE) -f p4.mk
+
+fetch: $(PBINCROOT)
+	@echo Fetching $(BLASR_LIBCPP)
+	@echo "SHELL=bash -evx" > $(FETCHMK) && grep "^REF:=" $(SUBMK) >> $(FETCHMK) && grep "^NAME:=" $(SUBMK) >> $(FETCHMK) && echo "REPO_DIR:=$(BLASR_LIBCPP)" >> $(FETCHMK) && cat  $(FETCHTMP) >> $(FETCHMK)
+	make -f $(FETCHMK)
+
+mkliba: fetch mkpbbama
+	$(BLASR_LIBCPP)/configure.py BOOST_INCLUDE=$(BOOST_INCLUDE) HTSLIB_INCLUDE=$(HTSLIB_INCLUDE) PBBAM_INCLUDE=$(PBBAM_INCLUDE) HTSLIB_LIB=$(HTSLIB_LIB) PBBAM_LIB=$(PBBAM_LIB)
+	export CXXFLAGS="$(CXXFLAGS)" && make -C $(BLASR_LIBCPP)/pbdata/ libpbdata.a
+	export CXXFLAGS="$(CXXFLAGS)" && make -C $(BLASR_LIBCPP)/hdf/ libpbihdf.a
+	export CXXFLAGS="$(CXXFLAGS)" && make -C $(BLASR_LIBCPP)/alignment/ libblasr.a
+
+mklibso: fetch mkpbbamso
+	$(BLASR_LIBCPP)/configure.py SHARED_LIB=true BOOST_INCLUDE=$(BOOST_INCLUDE) HTSLIB_INCLUDE=$(HTSLIB_INCLUDE) PBBAM_INCLUDE=$(PBBAM_INCLUDE) HTSLIB_LIB=$(HTSLIB_SO) PBBAM_LIB=$(PBBAM_SO)
+	export CXXFLAGS="$(CXXFLAGS)" && make -C $(BLASR_LIBCPP) all
+
+mkpbbama: 
+	ls $(PBBAM_A) 2>/dev/null 1>/dev/null || (cd $(PBBAM) && rm -f builda && mkdir builda && cd builda && cmake ../ && make)
+
+mkpbbamso:
+	ls $(PBBAM_SO) 2>/dev/null 1>/dev/null || cd $(PBBAM) && rm -f buildso && mkdir -p buildso && cd buildso && cmake -DPacBioBAM_build_shared=ON ../ && make 
+
+CTESTS := $(wildcard ctest/*.t)
+SLOW_CTESTS := ctest/bug25328.t ctest/useccsallLargeGenome.t
+
+cramtests: $(EXE) $(UTILS) 
+	cram -v --shell=/bin/bash $(CTESTS)
+	export CXXFLAGS="$(CXXFLAGS)" && make -C $(UTILS) cramtests
+
+cramfast: $(EXE) $(UTILS)
+	cram -v --shell=/bin/bash $(filter-out $(SLOW_CTESTS),$(CTESTS))
+	export CXXFLAGS="$(CXXFLAGS)" && make -C $(UTILS) cramfast
+
+gtest: $(EXE)
+	export CXXFLAGS="$(CXXFLAGS)" && make -C $(PBINCROOT) gtest
+
+check: gtest cramtests
+
+wipe: clean
+	@echo WIPING OUT $(BLASR_LIBCPP)...
+	@rm -rf $(BLASR_LIBCPP)
+
+clean: 
+	@rm -f $(EXE) $(OBJS) $(DEPS) blasr.d 
+	@make -C $(UTILS) -f p4.mk clean
+	@make -C $(BLASR_LIBCPP) cleanall
+	@rm -f $(FETCHMK)
+
+-include $(DEPS)
diff --git a/rules.mk b/rules.mk
new file mode 100644
index 0000000..39c8309
--- /dev/null
+++ b/rules.mk
@@ -0,0 +1,31 @@
+INCDIRS := \
+	${LIBBLASR_INCLUDE} \
+	${LIBPBDATA_INCLUDE} \
+	${LIBPBIHDF_INCLUDE} \
+	${PBBAM_INCLUDE} \
+	${HDF5_INCLUDE} \
+	${HTSLIB_INCLUDE} \
+	${BOOST_INCLUDE}
+LIBDIRS := \
+	${LIBBLASR_LIB} \
+	${LIBPBDATA_LIB} \
+	${LIBPBIHDF_LIB} \
+	${PBBAM_LIB} \
+	${HDF5_LIB} \
+	${HTSLIB_LIB} \
+	${ZLIB_LIB}
+LDLIBS+= \
+	${LIBPBIHDF_LIBFLAGS} \
+	${LIBBLASR_LIBFLAGS} \
+	${LIBPBDATA_LIBFLAGS} \
+	${LIBPBIHDF_LIBFLAGS} \
+	${PBBAM_LIBFLAGS} \
+	${HDF5_LIBFLAGS} \
+	${HTSLIB_LIBFLAGS} \
+	${ZLIB_LIBFLAGS} \
+	${PTHREAD_LIBFLAGS} \
+	${DL_LIBFLAGS}
+# We repeat LIBPBIHDF_LIBFLAGS because of a circular dependency. See #77.
+
+CPPFLAGS+=$(patsubst %,-I%,${INCDIRS})
+LDFLAGS+=$(patsubst %,-L%,${LIBDIRS})
diff --git a/travis.sh b/travis.sh
new file mode 100755
index 0000000..4e27de9
--- /dev/null
+++ b/travis.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+# This will not work within Travis until have have pre-compiled HDF5
+# (or least headers?). But it shows the steps.
+set -ex
+
+# There is a bug without --shared. Working on it. See #77.
+./configure.py --shared --sub --no-pbbam HDF5_INCLUDE=${HDF5_INCLUDE} HDF5_LIB=${HDF5_LIB}
+make -j4 init-submodule
+make --debug=b -j4 all
diff --git a/utils/GNUmakefile b/utils/GNUmakefile
new file mode 100644
index 0000000..3413244
--- /dev/null
+++ b/utils/GNUmakefile
@@ -0,0 +1,43 @@
+.PHONY=all cramtests
+
+ROOT:=..
+include ${ROOT}/defines.mk
+include ${ROOT}/rules.mk
+
+CXXOPTS := -std=c++0x -pedantic \
+           -Wall -Wuninitialized -Wno-div-by-zero \
+           -MMD -MP -w -fpermissive
+CXXFLAGS += ${CXXOPTS} ${GCXXFLAGS}
+
+EXE = loadPulses pls2fasta samtoh5 samtom4 samFilter toAfg sawriter sdpMatcher
+
+LD_LIBRARY_PATH=${HDF5_LIB}:${LIBBLASR_LIB}:${LIBPBIHDF_LIB}:${LIBPBDATA_LIB}
+export LD_LIBRARY_PATH
+
+
+all: ${EXE}
+
+${EXE}:
+	${CXX} -o $@ $< ${CXXFLAGS} ${CPPFLAGS} -MF"${@:%=%.d}" ${STATIC} ${LDFLAGS} ${LDLIBS}
+
+loadPulses: LoadPulses.cpp
+pls2fasta: PulseToFasta.cpp
+samtoh5: SamToCmpH5.cpp
+samtom4: SamToM4.cpp
+samFilter: SamFilter.cpp
+toAfg: ToAfg.cpp
+sawriter: SAWriter.cpp
+sdpMatcher: SDPMatcher.cpp
+
+CTESTS := $(wildcard ctest/*.t)
+SLOW_CTESTS := ctest/loadPulses.t ctest/pls2fasta.t
+
+cramtests: ${EXE}
+	cram -v --shell=/bin/bash ${CTESTS}
+
+cramfast: ${EXE}
+	cram -v --shell=/bin/bash ${filter-out ${SLOW_CTESTS}, ${CTESTS}}
+
+clean: 
+	@rm -f ${EXE}
+	@rm -f *.d *.o
diff --git a/utils/LoadPulses.cpp b/utils/LoadPulses.cpp
new file mode 100644
index 0000000..34fc0ab
--- /dev/null
+++ b/utils/LoadPulses.cpp
@@ -0,0 +1,2643 @@
+#define __FAST_MATH__
+
+#include "HDFCmpFile.hpp"
+#include "HDFBasReader.hpp"
+#include "HDFPlsReader.hpp"
+#include "HDFCCSReader.hpp"
+#include "datastructures/alignment/CmpFile.hpp"
+#include "alignment/CmpAlignment.hpp"
+#include "datastructures/alignment/ByteAlignment.h"
+#include "datastructures/alignment/AlignmentMap.hpp"
+#include "reads/BaseFile.hpp"
+#include "reads/PulseFile.hpp"
+#include "reads/ReadType.hpp"
+#include "loadpulses/MetricField.hpp"
+#include "loadpulses/MovieAlnIndexLookupTable.hpp"
+#include "utils/FileOfFileNames.hpp"
+#include "utils/TimeUtils.hpp"
+#include "files/BaseSequenceIO.hpp"
+#include "CommandLineParser.hpp"
+#include <map>
+#include <set>
+#include <string>
+#include <algorithm>
+#include <assert.h>
+#include <numeric>
+#include <stdio.h>
+
+using namespace std;
+
+typedef map<string, int> MovieNameToArrayIndex;
+typedef map<string, bool> MetricOptionsMap;
+typedef map<string, vector<string> > RequirementMap;
+
+
+char VERSION[] = "v1.1.0";
+char PERFORCE_VERSION_STRING[] = "$Change: 126407 $";
+
+// define default values for metrics
+const float NaN = 0.0/0.0;
+const UChar missingQualityValue      = 255;
+const unsigned char maxQualityValue  = 100;
+const HalfWord missingFrameRateValue = USHRT_MAX;
+const unsigned int missingPulseIndex = UINT_MAX;
+
+
+void CapQualityValue(QualityValueVector<QualityValue> &vect, DNALength length, unsigned char maxQualityValue=100) {
+    unsigned int i;
+    if (vect.data == NULL) {
+        return;
+    }
+    for (i = 0; i < length; i++) {
+        vect.data[i] = min(vect.data[i], maxQualityValue);
+    }
+}
+
+
+void CapQualityValues(SMRTSequence &seq, unsigned char maxQualityValue = 100) {
+    CapQualityValue(seq.qual, seq.length, maxQualityValue);
+    CapQualityValue(seq.deletionQV, seq.length, maxQualityValue);
+    CapQualityValue(seq.preBaseDeletionQV, seq.length, maxQualityValue);
+    CapQualityValue(seq.insertionQV, seq.length, maxQualityValue);
+    CapQualityValue(seq.substitutionQV, seq.length, maxQualityValue);
+    CapQualityValue(seq.mergeQV, seq.length, maxQualityValue);
+}
+
+
+int CheckCmpFileFormat(CmpFile &cmpFile) {
+    if (cmpFile.readType != ReadType::Standard) {
+        cout << "ERROR! Reading pulse information into a cmp.h5 file generated from circular " << endl
+            << "consensus called sequences is not supported." << endl;
+        exit(1);
+    }
+    return 1;
+}
+
+void BuildRequirementMap(RequirementMap &fieldRequirements) {
+    fieldRequirements["StartTimeOffset"].push_back("StartFrame");
+    fieldRequirements["StartTimeOffset"].push_back("NumEvent");
+    fieldRequirements["StartFrame"].push_back("PreBaseFrames");
+    fieldRequirements["StartFrame"].push_back("WidthInFrames");
+    fieldRequirements["PulseWidth"].push_back("WidthInFrames");
+    fieldRequirements["pkmid"].push_back("MidSignal");
+    fieldRequirements["pkmid"].push_back("NumEvent");
+    fieldRequirements["IPD"].push_back("StartFrame");
+    fieldRequirements["IPD"].push_back("NumEvent");
+    fieldRequirements["IPD"].push_back("PreBaseFrames");
+    fieldRequirements["IPD"].push_back("WidthInFrames");
+    fieldRequirements["Light"].push_back("MeanSignal");
+    fieldRequirements["Light"].push_back("NumEvent");
+    fieldRequirements["Light"].push_back("WidthInFrames");
+
+    // Build requirementMap for sneaky metrics
+    fieldRequirements["StartFrameBase"].push_back("PreBaseFrames");
+    fieldRequirements["StartFrameBase"].push_back("WidthInFrames");
+    fieldRequirements["StartFramePulse"].push_back("PreBaseFrames");
+    fieldRequirements["StartFramePulse"].push_back("WidthInFrames");
+}
+
+void ExclusivelyAdd(const char *value, vector<string> &vect) {
+    if (find(vect.begin(), vect.end(), value) == vect.end()) {
+        vect.push_back(value);
+    }
+}
+
+bool AnyFieldRequiresFrameRate(vector<string> &fields) {
+    int i;
+    for (i = 0; i < fields.size(); i++ ) {
+        if (fields[i] == "PulseWidth" or
+                fields[i] == "IPD" or
+                fields[i] == "Light" or
+                fields[i] == "StartTimeOffset" or
+                fields[i] == "StartFrame" or
+                fields[i] == "PulseWidth" or 
+                fields[i] == "PreBaseFrames" or 
+                fields[i] == "WidthInFrames") {
+            return true;
+        }
+    }
+    return false;
+}
+
+template<typename T>
+void Free(T* &buf) {
+    if (buf != NULL){ 
+        delete[] buf;
+    }
+    buf = NULL;
+}
+
+// Return all eighteen metrics that can be loaded.
+// StartTimeOffset  QualityValue    InsertionQV   MergeQV    
+// DeletionQV       DeletionTag     PulseIndex    SubstitutionTag
+// SubstitutionQV   ClassifierQV    StartFrame    PulseWidth
+// PreBaseFrames    WidthInFrames   pkmid         IPD
+// Light            WhenStarted
+vector<string> GetAllSupportedMetrics(bool isSneakyMetricsIncluded = true) {
+    // The order of metrics matters. With -bymetric option, all fields 
+    // which are required for computing a metric are cached before WriteMetric()
+    // and cleared afterwards. If two neighboring metrics share a subset of 
+    // required fields, then the cached fields can be re-used. Arrange metrics
+    // in an order that maximizes reuse of cached fields.
+    vector<string> supportedMetrics;
+    supportedMetrics.push_back("WhenStarted");
+
+    supportedMetrics.push_back("QualityValue");
+    supportedMetrics.push_back("InsertionQV");
+    supportedMetrics.push_back("MergeQV");
+    supportedMetrics.push_back("DeletionQV");
+    supportedMetrics.push_back("DeletionTag");
+    supportedMetrics.push_back("SubstitutionTag");
+    supportedMetrics.push_back("SubstitutionQV");
+    supportedMetrics.push_back("PreBaseFrames");
+    // Sneaky metrics for internal use Only
+    if (isSneakyMetricsIncluded) {
+        supportedMetrics.push_back("StartFrameBase");
+    }
+    supportedMetrics.push_back("IPD");
+    supportedMetrics.push_back("StartFrame");
+    if (isSneakyMetricsIncluded) {
+        supportedMetrics.push_back("StartFramePulse");
+    }
+    // Disable metric StartTimeOffset for now.
+    // StartTimeOffset is placed at the same level as AlnArray, However, the 
+    // size of StartTimeOffset is far less than AlnArray, while cmp.h5 spec
+    // requires all datasets at that level to have the same size.  
+    
+    // supportedMetrics.push_back("StartTimeOffset");
+
+    supportedMetrics.push_back("PulseWidth");
+    supportedMetrics.push_back("WidthInFrames");
+    supportedMetrics.push_back("Light");
+    supportedMetrics.push_back("pkmid");
+    supportedMetrics.push_back("ClassifierQV");
+    supportedMetrics.push_back("PulseIndex");
+
+    return supportedMetrics;
+}
+
+// Return metrics to load by default.
+vector<string> GetDefaultMetrics() {
+    vector<string> defaultMetrics;
+    defaultMetrics.push_back("QualityValue");
+    defaultMetrics.push_back("ClassifierQV");
+    defaultMetrics.push_back("StartFrame");
+    defaultMetrics.push_back("PulseWidth");
+    defaultMetrics.push_back("WidthInFrames");
+    defaultMetrics.push_back("pkmid");
+    defaultMetrics.push_back("IPD");
+    return defaultMetrics;
+}
+
+// Return metrics that can be computed from PulseCalls.
+vector<string> GetPulseMetrics() {
+    vector<string> pulseMetrics;
+    pulseMetrics.push_back("StartFrame");
+    pulseMetrics.push_back("StartTimeOffset");
+    pulseMetrics.push_back("ClassifierQV");
+    pulseMetrics.push_back("PulseWidth");
+    pulseMetrics.push_back("WidthInFrames");
+    pulseMetrics.push_back("IPD");
+    pulseMetrics.push_back("pkmid");
+    pulseMetrics.push_back("Light");
+    pulseMetrics.push_back("StartFramePulse");
+    return pulseMetrics;
+}
+
+// Return true if this metric can be computed from PulseCalls.
+bool IsPulseMetric(const string & metric) {
+    vector<string> pulseMetrics = GetPulseMetrics();
+    for (int i = 0; i < pulseMetrics.size(); i++) {
+        if (pulseMetrics[i] == metric) 
+            return true;
+    }
+    return false;
+}
+
+// Return all metrics that are 
+// (1) supported, 
+// (2) requested to load, and 
+// (3) computable with all required fields available 
+//     in either bas.h5 or pls.h5.
+vector<string> GetMetricsToLoad(map<string, bool> & metricOptions) {
+    vector<string> metricsToLoad; 
+    // Get all supported metrics. 
+    vector<string> supportedMetrics = GetAllSupportedMetrics();
+    map<string, bool>::iterator metricIt;
+    for (int i = 0; i < supportedMetrics.size(); i++) {
+        string metric = supportedMetrics[i];
+        metricIt = metricOptions.find(metric);
+        if (metricIt!=metricOptions.end() and metricIt->second) {
+            // Get metrics that are required and computable
+            metricsToLoad.push_back(metricIt->first);
+        }
+    }
+    return metricsToLoad; 
+}
+
+void StoreDatasetFieldsFromPulseFields(MetricOptionsMap &fieldSet,
+        RequirementMap &fieldRequirements, 
+        vector<string> &datasetFields) {
+    int f;
+    int d;
+    MetricOptionsMap::iterator optionsIt;
+    for (optionsIt = fieldSet.begin(); optionsIt != fieldSet.end(); ++optionsIt) {
+        if (optionsIt->second == true) {
+            if (fieldRequirements.find(optionsIt->first) == fieldRequirements.end()) {
+                ExclusivelyAdd(optionsIt->first.c_str(), datasetFields);
+            }
+            else {
+                for (d = 0; d < fieldRequirements[optionsIt->first].size(); d++) {
+                    ExclusivelyAdd(fieldRequirements[optionsIt->first][d].c_str(), datasetFields );
+                }
+            }
+        }
+    }
+}
+
+void ParseMetricsList(string metricListString, MetricOptionsMap &metricOptions) {
+    vector<string> metrics;
+    Splice(metricListString, ",", metrics);
+    int m;
+    for  (m = 0; m < metrics.size(); m++) {
+        if (metricOptions.find(metrics[m]) != metricOptions.end()) {
+            metricOptions[metrics[m]] = true;
+        }
+        else {
+            cout << "ERROR! Metric " << metrics[m] << " is not supported." << endl;
+            exit(1);
+        }
+    }
+}
+
+// Set default metric options to true
+void SetDefaultMetricOptions(map<string, bool> & metricOptions) {
+    vector<string> defaultMetrics = GetDefaultMetrics(); 
+    for (int i = 0; i < defaultMetrics.size(); i++) {
+        metricOptions[defaultMetrics[i]] = true;
+    }
+}
+
+
+// Initialize all supported metric options and set all to false
+void CreateMetricOptions(map<string, bool> &metricOptions) {
+    vector<string> supportedMetrics = GetAllSupportedMetrics();
+    for (int i = 0; i < supportedMetrics.size(); i++) {
+        metricOptions[supportedMetrics[i]] = false;
+    }
+}
+
+// Check whether all fields are available or not.
+bool AreAllFieldsAvailable(
+        vector <Field>   & requiredFields,
+        HDFBasReader     & hdfBasReader,
+        HDFPlsReader     & hdfPlsReader, 
+        const bool       & useBaseFile,
+        const bool       & usePulseFile) {
+    bool allAvailable = true;
+
+    for (int i = 0; i < requiredFields.size(); i++) {
+        Field field = requiredFields[i];
+        if (field.type == BasField) {
+            if (!useBaseFile or !hdfBasReader.FieldIsIncluded(field.name)
+                or !hdfBasReader.includedFields[field.name]) {
+                allAvailable = false;
+                break;
+            }
+        } else if (field.type == PlsField) {
+            if (!usePulseFile or !hdfPlsReader.FieldIsIncluded(field.name)
+                or !hdfPlsReader.includedFields[field.name]) {
+                allAvailable = false;
+                break;
+            }
+        }
+    }
+    return allAvailable;
+}
+
+//
+// Check whether a metric is computable or not.
+// fieldsToBeUsed = all fields that will be used for computing a metric. 
+// If a metric can be computed from both bas and pls files (e.g. 
+// StartFrame, IPD, PulseWidth, WidthInFrame), only compute it from pls.
+//
+bool CanThisMetricBeComputed ( 
+        const string     & metricName,
+        HDFBasReader     & hdfBasReader,
+        HDFPlsReader     & hdfPlsReader, 
+        const bool       & useBaseFile,
+        const bool       & usePulseFile,
+        vector<Field>    & fieldsToBeUsed) {
+    fieldsToBeUsed.clear();
+
+    FieldsRequirement fieldsRequirement = FieldsRequirement(metricName);
+
+    bool metricMayBeComputedFromPls = true;
+    if (fieldsRequirement.fieldsUsePlsFile.size() != 0 && usePulseFile) {
+        metricMayBeComputedFromPls = AreAllFieldsAvailable(
+                fieldsRequirement.fieldsUsePlsFile, 
+                hdfBasReader, hdfPlsReader,
+                useBaseFile, usePulseFile);
+    } else {
+        metricMayBeComputedFromPls = false;
+    }
+
+    bool metricMayBeComputedFromBas = true;
+    if (fieldsRequirement.fieldsUseBasFile.size() != 0 && useBaseFile) {
+        metricMayBeComputedFromBas = AreAllFieldsAvailable(
+                fieldsRequirement.fieldsUseBasFile, 
+                hdfBasReader, hdfPlsReader,
+                useBaseFile, usePulseFile);
+    } else {
+        metricMayBeComputedFromBas = false;
+    }
+
+    bool metricMayBeComputed = true;
+    if (!metricMayBeComputedFromBas and !metricMayBeComputedFromPls) {
+        metricMayBeComputed = false;
+    }
+    
+    // Compute from pls if possible
+    if (metricMayBeComputedFromPls) {
+        fieldsToBeUsed = fieldsRequirement.fieldsUsePlsFile;
+    } else if (metricMayBeComputedFromBas) {
+        fieldsToBeUsed = fieldsRequirement.fieldsUseBasFile;
+    }
+
+    if (metricName == "StartTimeOffset") {
+        metricMayBeComputed = false;
+        // Disable StartTimeOffset for now.
+    }
+    if (metricName == "WhenStarted") {
+        // WhenStarted requires no fields from neither bas nor pls.
+        metricMayBeComputed = true;
+    }
+
+    return metricMayBeComputed; 
+}
+
+//
+// Check whether metrics are computable or not. If a metric is not
+// computable, disable it with a warning or exit with an error.
+//
+void CanMetricsBeComputed(
+        MetricOptionsMap & metricOptions,
+        HDFBasReader     & hdfBasReader,
+        HDFPlsReader     & hdfPlsReader, 
+        const bool       & useBaseFile,
+        const bool       & usePulseFile,
+        const bool       & failOnMissingData, 
+        const string     & movieName) {
+
+    map<string,bool>::iterator metricIt;
+    for (metricIt = metricOptions.begin(); metricIt != metricOptions.end(); ++metricIt) {
+        string metricName = metricIt->first;
+        if (metricName == "") {
+            metricIt->second == false;
+        }
+
+        if (metricIt->second == false) {
+            continue;
+        }
+        vector<Field> fieldsToBeUsed;
+        bool metricMayBeComputed = CanThisMetricBeComputed(metricName, 
+                hdfBasReader, hdfPlsReader, useBaseFile, usePulseFile, 
+                fieldsToBeUsed);
+
+        if (metricMayBeComputed == false) {
+            if (failOnMissingData) {
+                cout << "ERROR";
+            }
+            else {
+                cout << "WARNING";
+            }
+            cout << ": There is insufficient data to compute metric: " 
+                 << metricName << " in the file " << movieName << " ";
+            cout << " It will be ignored." << endl;
+            if (failOnMissingData) {
+                exit(1);
+            }
+            metricOptions[metricName] = false;
+        }
+    }
+}
+
+// Return size of a single field in KB.
+UInt ComputeRequiredMemoryForThisField(
+        Field          & thisField,
+        HDFBasReader   & hdfBasReader,
+        HDFPlsReader   & hdfPlsReader,
+        const bool     & useBaseFile,
+        const bool     & usePulseFile) {
+    UInt memory = 0;
+    if (thisField.type == BasField) {
+        assert(useBaseFile);
+        return hdfBasReader.GetFieldSize(thisField.name);
+    }
+    if (thisField.type == PlsField) {
+        assert(usePulseFile);
+        return hdfPlsReader.GetFieldSize(thisField.name);
+    }
+    assert(false);
+}
+
+//
+// Return estimated memory peak (in KB) for buffering all data using -bymetric.
+//
+UInt ComputeRequiredMemory(
+        vector<string> & metricsToLoad, 
+        HDFBasReader   & hdfBasReader,
+        HDFPlsReader   & hdfPlsReader,
+        const bool     & useBaseFile,
+        const bool     & usePulseFile,
+        HDFCmpFile<CmpAlignment> & cmpReader,
+        UInt           & totalAlnLength) {
+    UInt maxMemory = 0;
+    for (int i = 0; i < metricsToLoad.size(); i++) {
+        UInt memoryForThisMetric = 0;
+        vector<Field> fieldsToBeUsed;
+        bool canBeComputed = CanThisMetricBeComputed(
+                metricsToLoad[i], hdfBasReader, hdfPlsReader,
+                useBaseFile, usePulseFile, fieldsToBeUsed);
+
+        for (int j = 0; j < fieldsToBeUsed.size(); j++) {
+            UInt memoryForThisField = ComputeRequiredMemoryForThisField(
+                    fieldsToBeUsed[j], hdfBasReader, hdfPlsReader,
+                    useBaseFile, usePulseFile);
+            memoryForThisMetric += memoryForThisField;
+        }
+        maxMemory = max(maxMemory, memoryForThisMetric);
+    }
+    //
+    // AlnIndex will be buffered. Some other datastructures also need  
+    // to be buffered for quick look up. Approximately double the size.
+    //
+    UInt totalAlnIndexMem = 2 * cmpReader.alnInfoGroup.GetAlnIndexSize();
+
+    //
+    // AlnArray and metrics to load needs to be buffered in KB.  
+    //
+    UInt totalAlnArrayMem = totalAlnLength / 1024 *
+                            (sizeof(unsigned int) + sizeof(unsigned char));
+
+    //
+    // It's diffcult to estimate how much memory will be used by hdf5.
+    // Assume memory consumed by hdf5 scales with AlnIndex and AlnArray datasets. 
+    //
+    UInt hdf5Mem = totalAlnIndexMem / 2 + totalAlnLength / 1024 * sizeof(unsigned int); 
+
+    maxMemory += totalAlnIndexMem + totalAlnArrayMem + hdf5Mem;
+
+    //cout << "The estimated peak memory for buffering fields is " 
+    //     << maxMemory << " KB." << endl;
+    //cout << "The estimated memory for buffering AlnIndex related data is " 
+    //     << totalAlnIndexMem << " KB."<< endl;
+    //cout << "The estimated memory for buffering AlnArray related data is " 
+    //     << totalAlnArrayMem << " KB." << endl;
+    //cout << "The estimated memory for hdf5 is "
+    //     << hdf5Mem << " KB." << endl; 
+    //cout << "The estimated total memory is " 
+    //     << maxMemory << " KB." << endl;
+    return maxMemory;
+}
+
+//
+// Get aligned sequence for this alignment from cmpFile
+//
+string GetAlignedSequenceFromCmpFile(
+        const HDFCmpFile<CmpAlignment> & cmpReader,
+        MovieAlnIndexLookupTable       & lookupTable) {
+    string alignedSequence;
+    vector <unsigned char> byteAlignment;
+    int alignedSequenceLength = lookupTable.offsetEnd - lookupTable.offsetBegin;
+    if (alignedSequenceLength >= 0 ) {
+        alignedSequence.resize(alignedSequenceLength);
+        byteAlignment.resize(alignedSequenceLength);
+    }
+    //
+    // Read the alignment string.  All alignments 
+    //
+    cmpReader.refAlignGroups[lookupTable.refGroupIndex]->readGroups[lookupTable.readGroupIndex]->alignmentArray.Read(
+        lookupTable.offsetBegin, 
+        lookupTable.offsetEnd, 
+        &byteAlignment[0]);
+    
+    //
+    // Convert to something we can compare easily.
+    //
+    ByteAlignmentToQueryString(&byteAlignment[0], byteAlignment.size(), &alignedSequence[0]);
+    return alignedSequence;
+}
+
+//
+// Store info necessary for loading pulses to lookupTable.
+//
+void BuildLookupTable(
+    const int                        & movieAlignmentIndex,
+    CmpFile                          & cmpFile,
+    BaseFile                         & baseFile,
+    const bool                       & usePulseFile,
+    PulseFile                        & pulseFile,
+    HDFCmpFile<CmpAlignment>         & cmpReader,
+    const vector<int>                & movieAlnIndex, 
+    const vector< pair<int,int> >    & toFrom,
+    const set<uint32_t>              & moviePartHoleNumbers,
+    MovieAlnIndexLookupTable         & lookupTable) {
+    //
+    // Query the cmp file for a way to look up a read based on
+    // coordinate information.  For Astro reads, the coords are
+    // based on x and y.  For Springfield, it is read index.  The
+    // base files should be able to look up reads by x,y or by
+    // index. 
+    //
+    if (cmpFile.platformId == Astro) {
+        cout << "ASTRO pulse loading is deprecated." << endl;
+        exit(1);
+    }
+
+    int alignmentIndex = movieAlnIndex[toFrom[movieAlignmentIndex].second];
+
+    //
+    // Alignments are grouped by ref group id then movie id.
+    //
+    int refGroupId  = cmpFile.alnInfo.alignments[alignmentIndex].GetRefGroupId();
+    int movieId     = cmpFile.alnInfo.alignments[alignmentIndex].GetMovieId();
+    UInt holeNumber = cmpFile.alnInfo.alignments[alignmentIndex].GetHoleNumber();
+    int alnGroupId  = cmpFile.alnInfo.alignments[alignmentIndex].GetAlnGroupId();
+
+    if (cmpReader.refGroupIdToArrayIndex.find(refGroupId) == 
+        cmpReader.refGroupIdToArrayIndex.end()) {
+        cout << "ERROR! An alignment " << alignmentIndex 
+             << " is specified with reference group " << endl
+             << refGroupId << " that is not found as an alignment group." << endl;
+        exit(1);
+    }
+    int refGroupIndex = cmpReader.refGroupIdToArrayIndex[refGroupId];
+
+    //
+    // Now find the group containing the alignment.
+    //
+    if (cmpReader.alnGroupIdToReadGroupName.find(alnGroupId) == 
+        cmpReader.alnGroupIdToReadGroupName.end()) {
+        cout << "ERROR! An alignment " << alignmentIndex 
+             << " is specified with alignment group " << endl
+             << alnGroupId << " that is not found." << endl;
+        exit(1);
+    }
+
+    string readGroupName = cmpReader.alnGroupIdToReadGroupName[alnGroupId];
+    if (cmpReader.refAlignGroups[refGroupIndex]->experimentNameToIndex.find(readGroupName) == 
+        cmpReader.refAlignGroups[refGroupIndex]->experimentNameToIndex.end()) {
+        cout << "ERROR! An alignment " << alignmentIndex 
+             << " is specified with read group name " << endl
+             << readGroupName << " that is not found." << endl;
+        exit(1);
+    }
+
+    int readGroupIndex = cmpReader.refAlignGroups[refGroupIndex]->experimentNameToIndex[readGroupName];
+   
+    UInt offsetBegin = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin();
+    UInt offsetEnd   = cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetEnd();
+
+    //
+    // First pull out the bases corresponding to this read.
+    //
+    int queryStart = cmpFile.alnInfo.alignments[alignmentIndex].GetQueryStart();
+    int queryEnd   = cmpFile.alnInfo.alignments[alignmentIndex].GetQueryEnd();
+
+    bool skip = false;
+    int readIndex, readStart, readLength, plsReadIndex; 
+    readIndex = readStart = readLength = plsReadIndex = -1;
+    //
+    // Since the movie may be split into multiple parts, look to see
+    // if this hole number is one of the ones covered by this
+    // set. If it is not, just continue. It will be loaded on
+    // another pass through a different movie part.
+    //
+    if (moviePartHoleNumbers.find(holeNumber) == moviePartHoleNumbers.end()) {
+        skip = true;
+    } else {
+        if (!baseFile.LookupReadIndexByHoleNumber(holeNumber, readIndex)) {
+            cout << "ERROR! Alignment has hole number " << holeNumber 
+                 << " that is not in the movie. " << endl;
+            exit(1); 
+        }
+        readStart  = baseFile.readStartPositions[readIndex];
+        readLength = baseFile.readStartPositions[readIndex+1] - 
+                     baseFile.readStartPositions[readIndex];
+        if (usePulseFile) {
+            if (!pulseFile.LookupReadIndexByHoleNumber(holeNumber, plsReadIndex)) {
+                cout << "ERROR! Alignment has  hole number " << holeNumber 
+                     << " that is not in the movie. " << endl;
+                exit(1);
+            }
+            assert(pulseFile.holeNumbers[plsReadIndex] ==
+                   baseFile.holeNumbers[readIndex]);
+        }
+    }
+    // Save info to lookupTable
+    lookupTable.SetValue(skip, // Skip processing this or not
+        movieAlignmentIndex, 
+        alignmentIndex,  
+        refGroupIndex,       
+        readGroupIndex,
+        holeNumber,    // cmp.h5 /AlnInfo/AlnIndex column 7 
+        offsetBegin,   // cmp.h5 /AlnInfo/AlnIndex column 18
+        offsetEnd,     // cmp.h5 /AlnInfo/AlnIndex column 19
+        queryStart,    // cmp.h5 /AlnInfo/AlnIndex column 11 
+        queryEnd,      // cmp.h5 /AlnInfo/AlnIndex column 12 
+        readIndex,     // hole Index in BaseCalls/ZMW/HoleNumber
+        readStart,     // readStart in BaseCalls/* (e.g. *=Basecall)
+        readLength,    // readLength in BaseCalls/*
+        plsReadIndex); // readIndex in PulseCalls/ZMW/HoleNumber
+}
+
+//
+// Map bases of a read to pulse indices.
+//
+void MapBaseToPulseIndex(
+        BaseFile                 & baseFile, 
+        PulseFile                & pulseFile,
+        MovieAlnIndexLookupTable & table,
+        vector<int>              & baseToPulseIndexMap) {
+    baseToPulseIndexMap.resize(table.readLength);
+
+    int pulseStart = pulseFile.pulseStartPositions[table.plsReadIndex];
+    //
+    // Copy the subset of pulses that correspond to the ones called as bases.
+    //
+    int i;
+    for (i = 0; i < table.readLength; i++) {
+        baseToPulseIndexMap[i] = pulseStart + baseFile.pulseIndex[table.readStart + i];
+    }
+}
+
+//
+// Get source read from the bas/pls file.
+//
+void GetSourceRead(CmpFile      & cmpFile,      
+                   BaseFile     & baseFile, 
+                   PulseFile    & pulseFile,  
+                   HDFBasReader & hdfBasReader, 
+                   HDFPlsReader & hdfPlsReader,
+                   HDFCCSReader<SMRTSequence> & hdfCcsReader,
+                   const bool   & useBaseFile,  
+                   const bool   & usePulseFile,
+                   const bool   & useCcsOnly,
+                   //const bool   & byRead, 
+                   MovieAlnIndexLookupTable & table, 
+                   const string & alignedSequence,
+                   SMRTSequence & sourceRead,   
+                   unsigned int & numPasses) {
+
+    assert(!table.skip);
+    //
+    // These are not allocated in the regular allocate function
+    // since they are only used in loadPulses. (maybe I should
+    // subclass SMRTSequence here).
+    //
+    //if (byRead) {
+    // Read in the data from the bas file if it exsts.
+    if (useBaseFile) {
+        hdfBasReader.GetReadAt(table.readIndex, sourceRead);
+        if (cmpFile.readType == ReadType::CCS or useCcsOnly) {
+            numPasses = hdfCcsReader.GetNumPasses(table.readIndex);
+        }
+    }
+    // Read in the data from the pls file if it exists.
+    if (usePulseFile) {
+        hdfPlsReader.GetReadAt(table.plsReadIndex, sourceRead.pulseIndex, sourceRead);
+    }
+    // }
+    // else {
+    // This is deprecated
+    //    //
+    //    // The entire base/pulse file was read in, so copy data from that into a read
+    //    // For the data used in the read, it is possible to simply
+    //    // reference the data,  but for the pls file it is necessary
+    //    // to copy since there is a packing of data.
+    //    //
+    //    if (useBaseFile) {
+    //        baseFile.CopyReadAt(table.readIndex, sourceRead);
+    //        if (cmpFile.readType == ReadType::CCS or useCcsOnly) {
+    //            numPasses = hdfCcsReader.GetNumPasses(table.readIndex);
+    //        }
+    //    }
+    //    if (usePulseFile) {
+    //        vector<int> baseToPulseIndexMap; 
+    //        MapBaseToPulseIndex(baseFile, pulseFile, table, baseToPulseIndexMap);
+    //        pulseFile.CopyReadAt(table.readIndex, &baseToPulseIndexMap[0], sourceRead);
+    //    }
+    //}
+    CapQualityValues(sourceRead);
+}
+
+//
+// Build lookup tables for all alignments whose indices in 
+// AlnArray are saved in movieAlnIndex.
+// Also check whether the bas file and the cmp file match.
+//
+void BuildLookupTablesAndMakeSane(
+        CmpFile                          & cmpFile,
+        BaseFile                         & baseFile,
+        PulseFile                        & pulseFile,
+        HDFCmpFile<CmpAlignment>         & cmpReader,
+        HDFBasReader                     & hdfBasReader,
+        HDFPlsReader                     & hdfPlsReader,
+        HDFCCSReader<SMRTSequence>       & hdfCcsReader,
+        const bool                       & useBaseFile,
+        const bool                       & usePulseFile,
+        const bool                       & useCcsOnly,
+        const vector<int>                & movieAlnIndex, 
+        const vector< pair<int,int> >    & toFrom,
+        const set<uint32_t>              & moviePartHoleNumbers,
+        vector<MovieAlnIndexLookupTable> & lookupTables) {
+
+    lookupTables.resize(movieAlnIndex.size());
+    int movieAlignmentIndex = 0;
+    for (movieAlignmentIndex = 0; movieAlignmentIndex < movieAlnIndex.size(); movieAlignmentIndex++) {
+        BuildLookupTable(movieAlignmentIndex,
+            cmpFile, 
+            baseFile,
+            usePulseFile,
+            pulseFile,
+            cmpReader, 
+            movieAlnIndex,
+            toFrom,
+            moviePartHoleNumbers, 
+            lookupTables[movieAlignmentIndex]);
+    }
+
+    //
+    // Load entire Basecall from pls/bas to memory, and
+    // check whether aligned sequences in cmp.h5 matches 
+    // sequences in pls/bas or not
+    //
+    hdfBasReader.ReadField(baseFile, "Basecall");
+
+    // 
+    // For each alignment, do sanity check and 
+    // cache aligned sequence in MovieAlnIndexLookupTable
+    //
+    for (movieAlignmentIndex = 0; movieAlignmentIndex < movieAlnIndex.size(); movieAlignmentIndex++) {
+        MovieAlnIndexLookupTable & table = lookupTables[movieAlignmentIndex];
+        if (table.skip) continue;
+        //
+        // Get aligned sequence for this alignment from cmpFile 
+        //
+        string alignedSequence = GetAlignedSequenceFromCmpFile(cmpReader, table);
+        
+        // Save the aligned sequence in the table
+        table.alignedSequence = alignedSequence;
+
+        RemoveGaps(alignedSequence, alignedSequence);
+
+        //
+        // Get sequence for this alignment from baseFile
+        //
+        Nucleotide * seq = new Nucleotide[table.readLength]; 
+        baseFile.CopyArray(baseFile.baseCalls, table.readStart, table.readLength, seq);
+        
+        string readSequence;
+        readSequence.resize(table.queryEnd - table.queryStart);
+        copy((char*) (seq + table.queryStart), 
+             (char*) (seq + table.queryEnd), 
+             readSequence.begin());
+        delete seq;
+        
+        //
+        // Do a sanity check to make sure the pulses and the alignment
+        // make sense.  The main check is to see if the query sequence
+        // in the alignment is the same as the query sequence in the
+        // read.
+        //
+        if (alignedSequence.size() != readSequence.size() or alignedSequence != readSequence) {
+            cout << "ERROR, the query sequence does not match the aligned query sequence." << endl
+                 << "HoleNumber: "       << cmpFile.alnInfo.alignments[table.alignmentIndex].GetHoleNumber()
+                 << ", MovieName: "      << baseFile.GetMovieName()
+                 << ", ReadIndex: "      << table.readIndex
+                 << ", qStart: "         << table.queryStart 
+                 << ", qEnd: "           << table.queryEnd << endl
+                 << "Aligned sequence: " << endl
+                 << alignedSequence      << endl
+                 << "Original sequence: "<< endl
+                 << readSequence         << endl;
+            exit(1);
+        }
+    }
+
+    hdfBasReader.ClearField(baseFile, "Basecall");
+}
+
+// Given a vector of lookupTables in which items with the same 
+// refGroupIndex and readGroupIndex are grouped, find index boundaries
+// of each group and save these boundaries to groupedLookupTablesIndexPairs
+// The index boundary of each group consists of:
+//   1, index (0 based, inclusive) of the very first item of a group
+//   2, index (0 based, exclusive) of the very last item of a group 
+//
+// Assume that lookupTables satisfy the following criteria.
+//   1, items are already grouped by refGroupIndex and readGroupIndex 
+//   2, items which have the same alnGroupIndex, should have 
+//      the same refGroupIndex and readGroupIndex 
+// Note that: 
+//   1, alnGroupIndex represents index of AlnGroupID, (i.e. dataset
+//      /AlnInfo/AlnIndex column 1);
+//      refGroupIndex represents index of RefGroupID, (i.e. dataset
+//      /AlnInfo/AlnIndex column 3);
+//      readGroupIndex represents index of an experiment group within
+//      a refGroup (e.g. if a refGroup /ref0001 contains two experiment
+//      groups /ref0001/movie1 and /ref0001/movie2, then readGroupIndex
+//      for these two groups are 0 and 1.).
+//   2, within each grouped item, offsetBegin may not begin from 0, 
+//      and offsets may not be continugous. 
+//
+void GroupLookupTables(
+        vector<MovieAlnIndexLookupTable>  & lookupTables,
+        vector<pair<UInt, UInt> > & groupedLookupTablesIndexPairs) {
+
+    vector<pair<UInt, UInt> > refGroupIndexReadGroupIndexPairs;
+    UInt movieAlignmentIndex = 0;
+    UInt preRefGroupIndex    = 0;
+    UInt preReadGroupIndex   = 0;
+    UInt pairFirst           = 0;
+    bool isVeryFirstGroup    = true;
+
+    for (movieAlignmentIndex = 0; movieAlignmentIndex < lookupTables.size(); movieAlignmentIndex++) {
+        MovieAlnIndexLookupTable & lookupTable = lookupTables[movieAlignmentIndex];
+        
+        if (isVeryFirstGroup or
+            (lookupTable.refGroupIndex  != preRefGroupIndex or
+             lookupTable.readGroupIndex != preReadGroupIndex)) {
+            // Find a new group 
+            if (isVeryFirstGroup) {
+                // This is the very first group
+                isVeryFirstGroup = false;
+            } else 
+            if (lookupTable.refGroupIndex  == preRefGroupIndex && 
+                lookupTable.readGroupIndex != preReadGroupIndex) {
+                // Assumption (1) has been violated 
+                cout << "ERROR! lookupTables should have been sorted by reference"
+                     << "group index and read group index." << endl;
+                exit(1);
+            } else {
+                // Find the first lookupTable of a new group, save indices of [first and last)
+                // lookupTables of the last group.
+                groupedLookupTablesIndexPairs.push_back(pair<UInt,UInt> (pairFirst, movieAlignmentIndex));
+                // Save refGroupIndex and readGroupIndex of the last group
+                pair<UInt,UInt> refGroupIndexReadGroupIndexPair(preRefGroupIndex, preReadGroupIndex);
+                refGroupIndexReadGroupIndexPairs.push_back(refGroupIndexReadGroupIndexPair);
+            }
+
+            // Store index of the first lookupTable of the new group in lookupTables
+            pairFirst = movieAlignmentIndex; 
+            // Store refGroupIndex and readGroupIndex of the new group
+            preRefGroupIndex  = lookupTable.refGroupIndex;
+            preReadGroupIndex = lookupTable.readGroupIndex;
+        } 
+    }
+    if (not isVeryFirstGroup) {
+        // Save indices of [first and last) lookupTables of the very last group
+        groupedLookupTablesIndexPairs.push_back(pair<UInt,UInt> (pairFirst, movieAlignmentIndex));
+        // Save refGroupIndex and readGroupIndex of the very last group
+        pair<UInt,UInt> refGroupIndexReadGroupIndexPair(preRefGroupIndex, preReadGroupIndex);
+        refGroupIndexReadGroupIndexPairs.push_back(refGroupIndexReadGroupIndexPair);
+    } // Do nothing, if no lookupTable exists
+
+
+    // Double check all assumptions are met
+    for (int i = 0; i < refGroupIndexReadGroupIndexPairs.size(); i++) {
+        for (int j = i+1; j < refGroupIndexReadGroupIndexPairs.size(); j++) {
+            // Assure that assumption (1) is met. If this assertion fails, 
+            // then alignments in the input cmp.h5 are not grouped by
+            // reference. Check /AlnInfo/AlnIndex dataset column 3.
+            assert(refGroupIndexReadGroupIndexPairs[i] != refGroupIndexReadGroupIndexPairs[j]);
+        }
+    }
+    assert(groupedLookupTablesIndexPairs.size() == refGroupIndexReadGroupIndexPairs.size());
+    int i ;
+    for (i = 0; i < groupedLookupTablesIndexPairs.size(); i++) {
+        UInt firstIndex     = groupedLookupTablesIndexPairs[i].first;
+        UInt lastIndex      = groupedLookupTablesIndexPairs[i].second;
+        UInt refGroupIndex  = refGroupIndexReadGroupIndexPairs[i].first;
+        UInt readGroupIndex = refGroupIndexReadGroupIndexPairs[i].second;
+        for(UInt index = firstIndex; index < lastIndex; index++) {
+            assert(lookupTables[index].refGroupIndex  == refGroupIndex);
+            assert(lookupTables[index].readGroupIndex == readGroupIndex);
+        }
+    }
+}
+
+
+//
+// Read all required fields for computing the specified metric into memory, 
+// unless the fields have been cached.
+//
+void CacheRequiredFieldsForMetric(
+        BaseFile                    & baseFile,
+        PulseFile                   & pulseFile,
+        HDFBasReader                & hdfBasReader,
+        HDFPlsReader                & hdfPlsReader,
+        HDFCCSReader<SMRTSequence>  & hdfCcsReader,
+        const bool                  & useBaseFile,
+        const bool                  & usePulseFile,
+        const bool                  & useCcsOnly,
+        vector<Field>               & cachedFields,
+        const string                & curMetric) {
+
+    vector<Field> fieldsToBeUsed;
+    bool canBeComputed = CanThisMetricBeComputed( 
+        curMetric, hdfBasReader, hdfPlsReader,
+        useBaseFile, usePulseFile, fieldsToBeUsed); 
+    assert(canBeComputed);
+
+    // Cache all required fields 
+    for (int i = 0; i < fieldsToBeUsed.size(); i++) {
+        bool isFieldCached = false;
+        for (int j = 0; j < cachedFields.size(); j++) {
+            if (fieldsToBeUsed[i] == cachedFields[j]) {
+                isFieldCached = true;
+                break;
+            }
+        }
+        if (isFieldCached) {
+            continue;
+        }
+        string    & curField = fieldsToBeUsed[i].name;
+        FieldType & fieldType= fieldsToBeUsed[i].type;
+
+        if (fieldType == BasField and useBaseFile
+            and hdfBasReader.FieldIsIncluded(curField)
+            and hdfBasReader.includedFields[curField]) {
+            hdfBasReader.ReadField(baseFile, curField);
+            cachedFields.push_back(fieldsToBeUsed[i]);
+        } else 
+        if (fieldType == PlsField and usePulseFile 
+            and hdfPlsReader.FieldIsIncluded(curField)
+            and hdfPlsReader.includedFields[curField]) {
+            hdfPlsReader.ReadField(pulseFile, curField);
+            cachedFields.push_back(fieldsToBeUsed[i]);
+        }
+    }
+}
+
+// 
+// Clear cached fields unless they are also required for computing 
+// the next metric.
+//
+void ClearCachedFields(
+        BaseFile                   & baseFile,
+        PulseFile                  & pulseFile,
+        HDFBasReader               & hdfBasReader,
+        HDFPlsReader               & hdfPlsReader,
+        HDFCCSReader<SMRTSequence> & hdfCcsReader,
+        const bool                 & useBaseFile,
+        const bool                 & usePulseFile,
+        const bool                 & useCcsOnly,
+        vector<Field>              & cachedFields,
+        const string               & curMetric,
+        const string               & nextMetric) {
+
+ 
+    vector<Field> nextRequiredFields;
+    if (nextMetric != "") {
+        bool canBeComputed = CanThisMetricBeComputed( 
+            nextMetric, hdfBasReader, hdfPlsReader,
+            useBaseFile, usePulseFile, nextRequiredFields); 
+        assert(canBeComputed);
+    }
+    for (int i = 0; i < cachedFields.size(); i++) {
+        bool isRequiredForNextMetric = false;
+        for (int j = 0; j < nextRequiredFields.size(); j++) {
+            if (cachedFields[i] == nextRequiredFields[j]) {
+                isRequiredForNextMetric = true;
+                break;
+            }
+        }
+        if (isRequiredForNextMetric) {
+            continue;
+        }
+        string    & curField = cachedFields[i].name;
+        FieldType & fieldType= cachedFields[i].type;
+
+        if (fieldType == BasField and useBaseFile  and 
+            hdfBasReader.FieldIsIncluded(curField) and
+            hdfBasReader.includedFields[curField]) {
+            hdfBasReader.ClearField(baseFile, curField);
+            // Remove it from cachedFields
+            cachedFields.erase(cachedFields.begin()+i);
+            i--;
+        } else 
+        if (fieldType == PlsField and usePulseFile and 
+            hdfPlsReader.FieldIsIncluded(curField) and
+            hdfPlsReader.includedFields[curField]) {
+            if (curField == "NumEvent") {
+                // Always keep NumEvent 
+                continue;
+            }
+            hdfPlsReader.ClearField(pulseFile, curField);
+            // Remove it from cachedFields
+            cachedFields.erase(cachedFields.begin()+i);
+            i--;
+        }
+    }        
+}
+
+// Compute StartFrame from BaseCalls only. 
+// Return true if succeed, false otherwise.
+bool ComputeStartFrameFromBase(
+        BaseFile           & baseFile,
+        HDFBasReader       & hdfBasReader,
+        const bool         & useBaseFile,
+        MovieAlnIndexLookupTable & lookupTable,
+        vector<UInt>       & newStartFrame) {
+    newStartFrame.resize(lookupTable.readLength);
+    if (useBaseFile and hdfBasReader.FieldIsIncluded("PreBaseFrames") 
+        and hdfBasReader.includedFields["PreBaseFrames"]
+        and baseFile.preBaseFrames.size() > 0) {
+        // baseFile.preBaseFrame data type = uint16
+        // startFrame data type = uint32
+        for (int i = 0; i < lookupTable.readLength; i++) {
+            newStartFrame[i] = baseFile.preBaseFrames[lookupTable.readStart+i];
+        }
+        for (int i = 0; i < lookupTable.readLength-1; i++) {
+            newStartFrame[i+1] += baseFile.basWidthInFrames[lookupTable.readStart+i];
+        }
+        partial_sum(&newStartFrame[0], &newStartFrame[lookupTable.readLength], &newStartFrame[0]);
+        return true;
+    } 
+    return false;
+}
+
+// Compute StartFrame from PulseCalls only.
+// Return true if succeed, false otherwise.
+bool ComputeStartFrameFromPulse(
+        PulseFile          & pulseFile,
+        HDFPlsReader       & hdfPlsReader,
+        const bool         & usePulseFile,
+        MovieAlnIndexLookupTable & lookupTable,
+        vector<int>        & baseToPulseIndexMap,
+        vector<UInt>       & newStartFrame) {
+    newStartFrame.resize(lookupTable.readLength);
+    if (usePulseFile) {
+        assert(pulseFile.startFrame.size() > 0);
+        hdfPlsReader.CopyFieldAt(pulseFile, "StartFrame", lookupTable.plsReadIndex,
+                &baseToPulseIndexMap[0], &newStartFrame[0],
+                lookupTable.readLength);
+        return true;
+    }
+    return false;
+}
+
+
+// Compute StartFrame from either (1) BaseCalls or (2) PulseCalls.
+//    (1) Uses baseFile.preBaseFrames and baseFile.basWidthInFrames
+//    (2) Uses pulseFile.startFrame
+// In theory, the generated results using both methods should 
+// be exactly the same. However, they can be different in practice
+// because PreBaseFrames is of data type uint_16, while its
+// value can exceed maximum uint_16 (65535). 
+// When possible, always use PulseCalls. 
+void ComputeStartFrame(
+        BaseFile           & baseFile,
+        PulseFile          & pulseFile,
+        HDFBasReader       & hdfBasReader,
+        HDFPlsReader       & hdfPlsReader,
+        bool                 useBaseFile,
+        bool                 usePulseFile,
+        MovieAlnIndexLookupTable & lookupTable,
+        vector<int>        & baseToPulseIndexMap,
+        vector<UInt>       & newStartFrame) {
+
+    if (!ComputeStartFrameFromPulse(pulseFile, hdfPlsReader, usePulseFile,
+                lookupTable, baseToPulseIndexMap, newStartFrame)) {
+        if (!ComputeStartFrameFromBase(baseFile, hdfBasReader, useBaseFile,
+                lookupTable, newStartFrame)) {
+            cout << "ERROR! There is insufficient data to compute metric: StartFrame." << endl;
+            exit(1);
+        }
+    }
+}
+
+//
+// Compute and write an entire metric to cmp.h5.
+// Assume that all required fields have been loaded.
+//
+void WriteMetric(
+        CmpFile                          & cmpFile,
+        BaseFile                         & baseFile,
+        PulseFile                        & pulseFile,
+        HDFCmpFile<CmpAlignment>         & cmpReader,
+        HDFBasReader                     & hdfBasReader,
+        HDFPlsReader                     & hdfPlsReader,
+        HDFCCSReader<SMRTSequence>       & hdfCcsReader,
+        const bool                       & useBaseFile,
+        const bool                       & usePulseFile,
+        const bool                       & useCcsOnly,
+        vector<MovieAlnIndexLookupTable> & lookupTables,
+        vector<pair<UInt, UInt> >        & groupedLookupTablesIndexPairs,
+        const string                     & curMetric ) {
+
+    int movieAlignmentIndex = 0;
+    for (int index = 0; index < groupedLookupTablesIndexPairs.size(); index++) {
+        // Group[index] contains all items in lookupTables[firstIndex...lastIndex)
+        UInt firstIndex = groupedLookupTablesIndexPairs[index].first;
+        UInt lastIndex  = groupedLookupTablesIndexPairs[index].second;
+
+        assert(lookupTables.size() > firstIndex);
+        UInt refGroupIndex  = lookupTables[firstIndex].refGroupIndex;
+        UInt readGroupIndex = lookupTables[firstIndex].readGroupIndex;
+        // Obtain alignment array length from *.cmp.h5/refGroup/readGroup/AlnArray.
+        HDFCmpExperimentGroup* expGroup = cmpReader.refAlignGroups[refGroupIndex]->readGroups[readGroupIndex];
+        UInt alnArrayLength = expGroup->alignmentArray.size();
+
+        //
+        // Compute any necessary data fields.  These usually involve
+        // using differences of pulse indices, pulse widths, etc..
+        // Missing fields are stored as 0's. 
+        //
+        vector<UInt>     startTimeOffsetMetric;
+        // pulseIndex's data type is uint16 in ICD, 
+        // but I have seen it defined as uint32 in a bas file.
+        vector<UInt>     pulseMetric; 
+        vector<UChar>    qvMetric;
+        vector<HalfWord> frameRateMetric;
+        vector<UInt>     timeMetric;
+        vector<char>     tagMetric; 
+        vector<float>    floatMetric;
+       
+        /*
+        if (curMetric == "StartTimeOffset") {
+            startTimeOffsetMetric.resize(alnNum);
+            HDFArray<UInt> * data = (HDFArray<UInt>*) expGroup->fields[curMetric];
+            if (data->IsInitialized()) {
+                assert(data->size() == alnNum);
+                data->UpdateH5Dataspace();
+                data->Read(0, alnNum-1, &StartTimeOffsetMetric[0]);
+            } else {
+                data->Initialize(expGroup->experimentGroup, curMetric);
+                fill(startTimeOffsetMetric.begin(), startTimeOffsetMetric.end(), );
+            }
+
+        } else */
+        if (curMetric == "QualityValue" || curMetric == "InsertionQV" ||
+            curMetric == "DeletionQV"   || curMetric == "MergeQV"     ||
+            curMetric == "SubstitutionQV") {
+            qvMetric.resize(alnArrayLength);
+            HDFArray<UChar> * data = (HDFArray<UChar>*) expGroup->fields[curMetric];
+            if (data->IsInitialized()) {
+                assert(data->size() == alnArrayLength);
+                data->UpdateH5Dataspace();
+                data->Read(0, alnArrayLength-1, &qvMetric[0]);
+            } else {
+                data->Initialize(expGroup->experimentGroup, curMetric);
+                //fill(qvMetric.begin(), qvMetric.end(), missingQualityValue);
+            }
+
+        } else if (curMetric == "ClassifierQV" || curMetric == "pkmid" ) {
+            // Note that data type of pkmid=midSignal, which is uint_8 in bas/pls files,
+            // has been changed to float in cmp.h5. Why?
+            floatMetric.resize(alnArrayLength);
+            HDFArray<float> * data = (HDFArray<float>*) expGroup->fields[curMetric];
+            if (data->IsInitialized()) {
+                assert(data->size() == alnArrayLength);
+                data->UpdateH5Dataspace();
+                data->Read(0, alnArrayLength-1, &floatMetric[0]);
+            } else {
+                data->Initialize(expGroup->experimentGroup, curMetric);
+                //fill(floatMetric.begin(), floatMetric.end(), NaN);
+            }
+
+        } else if (curMetric == "PulseIndex"     ) {
+            pulseMetric.resize(alnArrayLength);
+            HDFArray<UInt> * data = (HDFArray<UInt>*) expGroup->fields[curMetric];
+            if (data->IsInitialized()) {
+                assert(data->size() == alnArrayLength);
+                data->UpdateH5Dataspace();
+                data->Read(0, alnArrayLength-1, &pulseMetric[0]);
+            } else {
+                data->Initialize(expGroup->experimentGroup, curMetric);
+                //fill(pulseMetric.begin(), pulseMetric.end(), 0);
+            }
+
+        } else if (curMetric == "DeletionTag"  || curMetric == "SubstitutionTag") {
+            tagMetric.resize(alnArrayLength);
+            HDFArray<char> * data = (HDFArray<char>*) expGroup->fields[curMetric];
+            if (data->IsInitialized()) {
+                assert(data->size() == alnArrayLength);
+                data->UpdateH5Dataspace();
+                data->Read(0, alnArrayLength-1, &tagMetric[0]);
+            } else {
+                data->Initialize(expGroup->experimentGroup, curMetric);
+                //fill(tagMetric.begin(), tagMetric.end(), '-'); 
+            }
+
+        } else if (curMetric == "StartFrame"   || curMetric == "StartFrameBase" ||
+                   curMetric == "StartFramePulse") {
+            timeMetric.resize(alnArrayLength);
+            HDFArray<UInt> * data = (HDFArray<UInt>*) expGroup->fields[curMetric];
+            if (data->IsInitialized()) {
+                assert(data->size() == alnArrayLength);
+                data->UpdateH5Dataspace();
+                data->Read(0, alnArrayLength-1, &timeMetric[0]);
+            } else {
+                data->Initialize(expGroup->experimentGroup, curMetric);
+                //fill(timeMetric.begin(), timeMetric.end(), missingPulseIndex);
+            }
+
+        } else if (curMetric == "PulseWidth"   || curMetric == "PreBaseFrames" ||
+                   curMetric == "WidthInFrames"|| curMetric == "IPD"           ||
+                   curMetric == "Light") {
+            frameRateMetric.resize(alnArrayLength);
+            HDFArray<HalfWord> * data = (HDFArray<HalfWord>*) expGroup->fields[curMetric];
+            if (data->IsInitialized()) {
+                assert(data->size() == alnArrayLength);
+                data->UpdateH5Dataspace();
+                data->Read(0, alnArrayLength-1, &frameRateMetric[0]);
+            } else {
+                data->Initialize(expGroup->experimentGroup, curMetric);
+                //fill(frameRateMetric.begin(), frameRateMetric.end(), missingFrameRateValue);
+            }
+        } else {
+            cout << "ERROR, metric " << curMetric << " is not supported." << endl;
+            exit(1);
+        }
+
+        for (movieAlignmentIndex = firstIndex; movieAlignmentIndex < lastIndex; movieAlignmentIndex++) {
+            MovieAlnIndexLookupTable & lookupTable   = lookupTables[movieAlignmentIndex];
+            if (lookupTable.skip) continue;
+
+            const UInt alignedSequenceLength         = lookupTable.offsetEnd - lookupTable.offsetBegin; 
+            const UInt ungappedAlignedSequenceLength = lookupTable.queryEnd  - lookupTable.queryStart;
+            const UInt   & readIndex                 = lookupTable.readIndex;
+            const UInt   & plsReadIndex              = lookupTable.plsReadIndex;
+            const UInt   & readStart                 = lookupTable.readStart;
+            const UInt   & readLength                = lookupTable.readLength;
+            const UInt   & queryStart                = lookupTable.queryStart;
+            const UInt   & offsetBegin               = lookupTable.offsetBegin;
+            const UInt   & offsetEnd                 = lookupTable.offsetEnd;
+            assert (offsetEnd <= alnArrayLength); 
+            assert (offsetBegin+alignedSequenceLength <= alnArrayLength);
+
+            // Condense gaps and get ungapped aligned sequence.
+            string ungappedAlignedSequence = lookupTable.alignedSequence;
+            RemoveGaps(ungappedAlignedSequence, ungappedAlignedSequence);
+
+            vector<int> baseToAlignmentMap;
+            // Map bases in the aligned sequence to their positions in the alignment.
+            CreateSequenceToAlignmentMap(lookupTable.alignedSequence, baseToAlignmentMap);
+
+            vector<int> baseToPulseIndexMap;
+            if (usePulseFile && IsPulseMetric(curMetric)) {
+                // Map bases in the read to pulse indices. 
+                MapBaseToPulseIndex(baseFile, pulseFile, lookupTable, baseToPulseIndexMap);
+            }
+
+            UInt i;
+            if (curMetric == "QualityValue") {
+                assert(baseFile.qualityValues.size() > 0 && 
+                       baseFile.qualityValues.size() >= readStart + readLength);
+                fill(&qvMetric[offsetBegin], &qvMetric[offsetEnd], missingPulseIndex);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    // cap quality value
+                    qvMetric[offsetBegin+baseToAlignmentMap[i]] = min(maxQualityValue, baseFile.qualityValues[readStart+queryStart+i]);
+                }
+                qvMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "InsertionQV") {
+                assert(baseFile.insertionQV.size() > 0 && 
+                       baseFile.insertionQV.size() >= readStart + readLength);
+                fill(&qvMetric[offsetBegin], &qvMetric[offsetEnd], missingPulseIndex);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++) {
+                    // cap quality value
+                    qvMetric[offsetBegin+baseToAlignmentMap[i]] = min(maxQualityValue, baseFile.insertionQV[readStart+queryStart+i]);
+                }
+                qvMetric[offsetBegin+alignedSequenceLength] = 0;
+            
+            } else if (curMetric == "MergeQV") {
+                assert(baseFile.mergeQV.size() > 0 && 
+                       baseFile.mergeQV.size() >= readStart + readLength);
+                fill(&qvMetric[offsetBegin], &qvMetric[offsetEnd], missingPulseIndex);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    // cap quality value
+                    qvMetric[offsetBegin+baseToAlignmentMap[i]] = min(maxQualityValue, baseFile.mergeQV[readStart+queryStart+i]);
+                }
+                qvMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "DeletionQV") {
+                assert(baseFile.deletionQV.size() > 0 && 
+                       baseFile.deletionQV.size() >= readStart + readLength);
+                fill(&qvMetric[offsetBegin], &qvMetric[offsetEnd], missingPulseIndex);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++) {
+                    // cap quality value
+                    qvMetric[offsetBegin+baseToAlignmentMap[i]] = min(maxQualityValue, baseFile.deletionQV[readStart+queryStart+i]);
+                }
+                qvMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "DeletionTag") {
+                assert(baseFile.deletionTag.size() > 0 && 
+                       baseFile.deletionTag.size() >= readStart + readLength);
+                fill(&tagMetric[offsetBegin], &tagMetric[offsetEnd], '-'); 
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    assert(offsetBegin+baseToAlignmentMap[i] < tagMetric.size());
+                    tagMetric[offsetBegin+baseToAlignmentMap[i]] = baseFile.deletionTag[readStart+queryStart+i];
+                }
+                tagMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "PulseIndex") {
+                assert(baseFile.pulseIndex.size() > 0 &&
+                       baseFile.pulseIndex.size() >= readStart + readLength);
+                fill(&pulseMetric[offsetBegin], &pulseMetric[offsetEnd], 0);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    pulseMetric[offsetBegin+baseToAlignmentMap[i]] = baseFile.pulseIndex[readStart+queryStart+i];
+                }
+                pulseMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "SubstitutionTag") {
+                assert(baseFile.substitutionTag.size() > 0 &&
+                       baseFile.substitutionTag.size() >= readStart + readLength);
+                fill(&tagMetric[offsetBegin], &tagMetric[offsetEnd], '-'); 
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    tagMetric[offsetBegin+baseToAlignmentMap[i]] = baseFile.substitutionTag[readStart+queryStart+i];
+                }
+                tagMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "SubstitutionQV") {
+                assert(baseFile.substitutionQV.size() > 0 &&
+                       baseFile.substitutionQV.size() >= readStart + readLength);
+                fill(&qvMetric[offsetBegin], &qvMetric[offsetEnd], missingPulseIndex);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    qvMetric[offsetBegin+baseToAlignmentMap[i]] = min(maxQualityValue, baseFile.substitutionQV[readStart+queryStart+i]);
+                }
+                qvMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "ClassifierQV") {
+                assert(pulseFile.classifierQV.size() > 0 && 
+                       pulseFile.classifierQV.size() >= readStart + readLength);
+                vector<float> newClassifierQV; 
+                newClassifierQV.resize(ungappedAlignedSequenceLength);
+                // For the data used for this table, it is possible to simply
+                // reference the data for the bas file,  but for the pls file,
+                // it is necessary to copy since there is a packing of data.
+                hdfPlsReader.CopyFieldAt(pulseFile, "ClassifierQV", plsReadIndex, 
+                        &baseToPulseIndexMap[queryStart], &newClassifierQV[0], 
+                        ungappedAlignedSequenceLength);
+                
+                fill(&floatMetric[offsetBegin], &floatMetric[offsetEnd], NaN);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    floatMetric[offsetBegin+baseToAlignmentMap[i]] = newClassifierQV[i];
+                }
+                floatMetric[offsetBegin+alignedSequenceLength] = 0;
+            
+/*            } else if (curMetric == "StartTimeOffset") {
+                // StartTimeOffset is a subset of StartFrame.
+                vector<UInt> newStartFrame;
+                ComputeStartFrame(baseFile, pulseFile, hdfBasReader, hdfPlsReader,
+                                  useBaseFile, usePulseFile, lookupTable, 
+                                  baseToPulseIndexMap, newStartFrame);
+        
+                startTimeOffsetMetric[offsetBegin] = newStartFrame[queryStart];
+*/
+           } else if (curMetric == "StartFrame") {
+                vector<UInt> newStartFrame;
+                ComputeStartFrame(baseFile, pulseFile, hdfBasReader, hdfPlsReader,
+                                  useBaseFile, usePulseFile, lookupTable, 
+                                  baseToPulseIndexMap, newStartFrame);
+                fill(&timeMetric[offsetBegin], &timeMetric[offsetEnd], missingPulseIndex);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    timeMetric[offsetBegin+baseToAlignmentMap[i]] = newStartFrame[queryStart+i];
+                }
+                timeMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "StartFrameBase") {
+                // Sneaky metric, compute StartFrame from BaseCalls only. 
+                vector<UInt> newStartFrame;
+                ComputeStartFrameFromBase(baseFile, hdfBasReader, useBaseFile, 
+                                  lookupTable, newStartFrame);
+                fill(&timeMetric[offsetBegin], &timeMetric[offsetEnd], missingPulseIndex);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    timeMetric[offsetBegin+baseToAlignmentMap[i]] = newStartFrame[queryStart+i];
+                }
+                timeMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "StartFramePulse") {
+                // Sneaky metric, compute StartFrame from PulseCalls only. 
+                vector<UInt> newStartFrame;
+                ComputeStartFrameFromPulse(pulseFile, hdfPlsReader, usePulseFile, 
+                                  lookupTable, baseToPulseIndexMap, newStartFrame);
+                fill(&timeMetric[offsetBegin], &timeMetric[offsetEnd], missingPulseIndex);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    timeMetric[offsetBegin+baseToAlignmentMap[i]] = newStartFrame[queryStart+i];
+                }
+                timeMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "PreBaseFrames") {
+                // Directly load baseFile.PreBaseFrames.
+                // DON'T compute it from PulseCalls even if you can.
+                assert(baseFile.preBaseFrames.size() > 0 &&
+                       baseFile.preBaseFrames.size() >= readStart + readLength); 
+                fill(&frameRateMetric[offsetBegin], &frameRateMetric[offsetEnd], missingFrameRateValue);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    frameRateMetric[offsetBegin+baseToAlignmentMap[i]] = baseFile.preBaseFrames[readStart+queryStart+i];
+                }
+                frameRateMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "WidthInFrames" || curMetric == "PulseWidth") {
+                // For legacy reasons, it's possible the width in frames is
+                // stored in the bas file. If this is the case, use the width
+                // in frames there.  Otherwise, use the width in frames stored
+                // in the pls file.
+                vector<uint16_t> newWidthInFrames;
+                newWidthInFrames.resize(ungappedAlignedSequenceLength);
+                if (usePulseFile) {
+                    hdfPlsReader.CopyFieldAt(pulseFile, "WidthInFrames", plsReadIndex,
+                            &baseToPulseIndexMap[queryStart], &newWidthInFrames[0], 
+                            ungappedAlignedSequenceLength);
+                } else
+                if (useBaseFile) {
+                    // basWidthInFrames data type uint16
+                    copy(&baseFile.basWidthInFrames[readStart+queryStart], 
+                         &baseFile.basWidthInFrames[readStart+queryStart+ungappedAlignedSequenceLength],
+                         &newWidthInFrames[0]);
+                } 
+                
+                fill(&frameRateMetric[offsetBegin], &frameRateMetric[offsetEnd], missingFrameRateValue);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    frameRateMetric[offsetBegin+baseToAlignmentMap[i]] = newWidthInFrames[i];
+                }
+                frameRateMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "pkmid") {
+                // pkmid in cmp.h5 is MidSignal in pls.h5, but
+                // data type of MidSignal is uint16 in pls files, 
+                // data type of pkmid is float in cmp files.
+                assert(usePulseFile);
+                vector<HalfWord> newMidSignal; 
+                newMidSignal.resize(ungappedAlignedSequenceLength);
+                hdfPlsReader.CopyFieldAt(pulseFile, "MidSignal", plsReadIndex,
+                        &baseToPulseIndexMap[queryStart], &newMidSignal[0],
+                        ungappedAlignedSequenceLength, ungappedAlignedSequence);
+
+                fill(&floatMetric[offsetBegin], &floatMetric[offsetEnd], NaN);
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    floatMetric[offsetBegin+baseToAlignmentMap[i]] = newMidSignal[i];
+                }
+                floatMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "IPD") {
+                fill(&frameRateMetric[offsetBegin], &frameRateMetric[offsetEnd], missingFrameRateValue);
+
+                // IPD can be either (1) copied from baseFile.preBaseFrames 
+                // or (2) computed from pulseFile.StartFrame and pulseFile.WidthInFrames
+                // Always use method (2) when possible as it is more accurate.
+                if (usePulseFile) {
+                    // Need to read StartFrame & WidthInFrames for the entire read,
+                    // not only for a subset of bases in the alignment
+                    assert(pulseFile.startFrame.size() > 0);
+                    assert(pulseFile.plsWidthInFrames.size() > 0);
+                    vector<UInt> newStartFrame;
+                    newStartFrame.resize(readLength);
+                    hdfPlsReader.CopyFieldAt(pulseFile, "StartFrame", plsReadIndex,
+                         &baseToPulseIndexMap[0], &newStartFrame[0], readLength);
+
+                    vector<uint16_t> newWidthInFrames;
+                    newWidthInFrames.resize(readLength);
+                    hdfPlsReader.CopyFieldAt(pulseFile, "WidthInFrames", plsReadIndex,
+                         &baseToPulseIndexMap[0], &newWidthInFrames[0], readLength);
+
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++) {
+                        // The IPD is undefined for the first base in a read.
+                        if (queryStart == 0 and i == 0) {
+                            frameRateMetric[offsetBegin+baseToAlignmentMap[i]] = 0;
+                        } else {
+                            frameRateMetric[offsetBegin+baseToAlignmentMap[i]] = newStartFrame[queryStart+i]  
+                                - newStartFrame[i+queryStart-1] - newWidthInFrames[i+queryStart-1];
+                        }
+                    }
+                } else 
+                if (useBaseFile) {
+                    assert(baseFile.preBaseFrames.size() > 0);
+                    assert(baseFile.preBaseFrames.size() >= readStart + readLength); 
+
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++) {
+                        frameRateMetric[offsetBegin+baseToAlignmentMap[i]] = 
+                            baseFile.preBaseFrames[readStart+queryStart+i];
+                    }
+                }
+                frameRateMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else if (curMetric == "Light") {
+                // Light can be computed from pulseFile.meanSignal and 
+                // pulseFile.plsWidthInFrames. Might have been deprecated.
+                assert(usePulseFile);
+                fill(&frameRateMetric[offsetBegin], &frameRateMetric[offsetEnd], missingFrameRateValue);
+
+                vector<uint16_t> newMeanSignal; 
+                newMeanSignal.resize(ungappedAlignedSequenceLength);
+                hdfPlsReader.CopyFieldAt(pulseFile, "MeanSignal", plsReadIndex,
+                        &baseToPulseIndexMap[queryStart], &newMeanSignal[0], 
+                        ungappedAlignedSequenceLength, ungappedAlignedSequence);
+
+                vector<uint16_t> newWidthInFrames;
+                newWidthInFrames.resize(ungappedAlignedSequenceLength);
+                hdfPlsReader.CopyFieldAt(pulseFile, "WidthInFrames", plsReadIndex,
+                        &baseToPulseIndexMap[queryStart], &newWidthInFrames[0], 
+                        ungappedAlignedSequenceLength);
+
+                for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                    frameRateMetric[offsetBegin+baseToAlignmentMap[i]] =  newMeanSignal[i] * newWidthInFrames[i];
+                }
+                frameRateMetric[offsetBegin+alignedSequenceLength] = 0;
+
+            } else { 
+                cout << "ERROR, unknown metric " << curMetric << endl;
+                exit(1);
+            } 
+        }
+
+        // Write the computed metric to cmp.h5.
+        /*if (curMetric == "StartTimeOffset") {
+            expGroup->startTimeOffset.WriteToPos(&startTimeOffsetMetric[0], startTimeOffsetMetric.size(), 0);
+        } else */
+        if (curMetric == "QualityValue" || curMetric == "InsertionQV" ||
+                   curMetric == "DeletionQV"   || curMetric == "MergeQV"     ||
+                   curMetric == "SubstitutionQV") {
+            HDFArray<UChar> * data = (HDFArray<UChar> *) expGroup->fields[curMetric];
+            data->WriteToPos(&qvMetric[0], qvMetric.size(), 0);
+ 
+        } else if (curMetric == "ClassifierQV" || curMetric == "pkmid" ) {
+            HDFArray<float> * data = (HDFArray<float> *) expGroup->fields[curMetric];
+            data->WriteToPos(&floatMetric[0], floatMetric.size(), 0);
+
+        } else if (curMetric == "PulseIndex") {
+            HDFArray<UInt> * data = (HDFArray<UInt> *) expGroup->fields[curMetric];
+            data->WriteToPos(&pulseMetric[0], pulseMetric.size(), 0);
+        
+        } else if (curMetric == "DeletionTag"  || curMetric == "SubstitutionTag") {
+            HDFArray<char> * data = (HDFArray<char> *) expGroup->fields[curMetric];
+            data->WriteToPos(&tagMetric[0], tagMetric.size(), 0);
+      
+        } else if (curMetric == "StartFrame"   || curMetric == "StartFrameBase"||
+                   curMetric == "StartFramePulse") {
+            HDFArray<UInt> * data = (HDFArray<UInt>*) expGroup->fields[curMetric];
+            data->WriteToPos(&timeMetric[0], timeMetric.size(), 0);
+
+        } else if (curMetric == "PulseWidth"   || curMetric == "PreBaseFrames" ||
+                   curMetric == "WidthInFrames"|| curMetric == "IPD"           ||
+                   curMetric == "Light") {
+            HDFArray<HalfWord> * data = (HDFArray<HalfWord>*) expGroup->fields[curMetric];
+            data->WriteToPos(&frameRateMetric[0], frameRateMetric.size(), 0);
+
+        } else {
+            cout << "ERROR, unknown metric " << curMetric << endl;
+            exit(1);
+        }
+    }
+} 
+
+//
+// Write "WhenStarted" from pls.h5 and write to cmp.h5
+//
+void WriteMetricWhenStarted(
+        HDFCmpFile<CmpAlignment>         & cmpReader,
+        HDFPlsReader                     & hdfPlsReader,
+        const string                     & movieName) {
+    string metric = "WhenStarted";
+    string whenStarted;
+    if (hdfPlsReader.scanDataReader.useWhenStarted == false) {
+        cout << "ERROR! Attempting to read WhenStarted from " 
+             << movieName 
+             << " but the attriubte does not exist." << endl;
+        exit(1);
+    }
+    hdfPlsReader.scanDataReader.ReadWhenStarted(whenStarted);
+
+    if (!cmpReader.movieInfoGroup.whenStartedArray.IsInitialized()) {
+        cmpReader.movieInfoGroup.whenStartedArray.Initialize(cmpReader.movieInfoGroup.movieInfoGroup, metric);
+    }
+    cmpReader.movieInfoGroup.whenStartedArray.Write(&whenStarted, 1);
+}
+
+//
+// Print metrics.
+//
+string MetricsToString(const vector<string> & metrics) {
+    string ret = ""; 
+    int j = 0; 
+    for (int i = 0; i < metrics.size(); i++) {
+        ret += metrics[i]; 
+        if (i != metrics.size()-1) ret += ","; 
+        if (i % 4 == 3) ret += "\n";
+    }
+    return ret; 
+}
+
+// 
+// Print usage.
+//
+void PrintUsage() {
+    cout << "  loadPulses - Load pulse information and quality values into a Compare file" << endl;
+    cout << "usage: loadPulses movieFile cmpFile [-metrics m1,m2,...] [-byread]" << endl;
+    cout << "  movieFile may be a movie file or a fofn of movie file names." << endl;
+    cout << "  metrics m1,m2,... is a comma-separated list (without spaces) of metrics " << endl
+         << "  to print to the pulse file." << endl;
+    cout << "  Valid metrics are: " << endl;
+    cout << MetricsToString(GetAllSupportedMetrics(false)) << endl;
+    //     << "    QualityValue, ClassifierQV, MergeQV," << endl
+    //     << "    StartFrame, PulseWidth, pkmid, IPD, Light" << endl
+    //     << "    WhenStarted, StartTimeOffset, PreBaseFrames," << endl
+    //     << "    InsertionQV, DeletionQV, DeletionTag, SubstitutionQV" << endl
+    //     << "    SubstitutionTag, PulseIndex, WidthInFrames" << endl;
+    cout << "  By default, " << MetricsToString(GetDefaultMetrics()) << " are added" << endl;
+    // Deprecate -useccs, an option for old data. 
+    // cout << "  -useccs  This option is for older cmp.h5 files that do not have the read type " << endl
+    //      << "    stored.  Newer cmp.h5 files have a read type that indicates the cmp.h5 file " << endl
+    //      << "    has alignments generated from de novo ccs sequences.  Using this flag assuems"<<endl
+    //      << "    ALL alignments in the cmp.h5 file are from ccs sequences, and loads the "<< endl
+    //      << "    quality values from ccs instead of the raw sequence. "<<endl 
+    //      << "  The only metrics that are allowed for de novo ccs sequences are QualityValue, " << endl
+    //      << "  InsertionQV, DeletionQV, and SubstitutionQV" << endl;
+    cout << "  -byread  Reads pulse/base fields by read, rather than reading an entire " << endl
+         << "    movie first.  This uses considerably less memory than the defualt mode" << endl
+         << "    but is slow." << endl;
+    cout << "  -byMetric  Loads every pls/base field for each movie entirely before loading " << endl
+         << "    another field. This uses more memory than -byread, but can be faster." << endl
+         << "    This opiton is experimental. " << endl;
+    cout << "  Using hdf version " << H5_VERS_MAJOR << "." << H5_VERS_MINOR << "." << H5_VERS_RELEASE << endl;
+}
+
+
+//
+// The main function.
+//
+int main(int argc, char* argv[]) {
+    string program = "loadPulses";
+    string versionStr(VERSION);
+    AppendPerforceChangelist(PERFORCE_VERSION_STRING, versionStr);
+
+    string cmpFileName, movieFileName;
+    int argi = 3;
+    int numMetrics = 8;
+    map<string,bool> metricOptions;
+    int maxElements = 0;
+    //Maximum Memory allowed for bymetric is 6 GB
+    int maxMemory = 4; 
+    //
+    // Default is all options are false
+    //
+    CreateMetricOptions(metricOptions);
+    string metricList = "";
+    bool useCcsOnly = false;
+    bool byRead = false;
+    bool byMetric = false;
+    bool failOnMissingData = false;
+
+    CommandLineParser clp;
+    clp.SetProgramName(program);
+    clp.SetVersion(versionStr);
+
+    clp.RegisterStringOption("basFileName", &movieFileName, 
+            "The input {bas,pls}.h5 or input.fofn.", true);
+    clp.RegisterStringOption("cmpFileName", &cmpFileName, 
+            "The cmp.h5 file to load pulse information into.", true);
+    clp.RegisterPreviousFlagsAsHidden();
+
+    string metricsDescription = "A comma separated list of metrics (with no spaces).\nValid options are:\n";
+    metricsDescription += MetricsToString(GetAllSupportedMetrics(false));
+    metricsDescription += "\nDefault options are:\n";
+    metricsDescription += MetricsToString(GetDefaultMetrics());
+
+    clp.RegisterStringOption("metrics", &metricList, metricsDescription);
+    clp.RegisterFlagOption("failOnMissingData", &failOnMissingData, 
+            "Exit if any data fields are missing from the bas.h5 or pls.h5 "
+            "input that are required to load a metric. Defualt is a warning.");
+    clp.RegisterFlagOption("byread", &byRead, 
+            "Load pulse information by read rather than buffering metrics.");
+    clp.RegisterFlagOption("bymetric", & byMetric, 
+            "Load pulse information by metric rather than by read. "
+            "This uses more memory than -byread, but can be faster.");
+    clp.RegisterIntOption("maxElements", &maxElements, 
+            "Set a limit on the size of pls/bas file to buffer in with -bymetric "
+            "(default value: maximum int). Use -byread if the limit is exceeded.", 
+            CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("maxMemory", & maxMemory, 
+            "Set a limit (in GB) on the memory to buffer data with -bymetric "
+            "(default value: 4 GB). Use -byread if the limit is exceeded.",
+            CommandLineParser::PositiveInteger);
+    int metaNElements, rawChunkSize, rawNElements;
+    metaNElements = rawChunkSize = metaNElements = 0;
+    clp.RegisterIntOption("metaNElements", & metaNElements,
+            "Set number of elements in meta data cache for reading bas/bax/pls.h5 file.",
+            CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("rawNElements", & rawNElements,
+            "Set number of elements in raw data cache for reading bas/bax/pls.h5 file.",
+            CommandLineParser::PositiveInteger);
+    clp.RegisterIntOption("rawChunkSize", & rawChunkSize,
+            "Set chunk size of raw data cache for reading bas/bax/pls.h5 file.",
+            CommandLineParser::PositiveInteger);
+
+    string progSummary = ("Loads pulse information such as inter pulse "
+            "distance, or quality information into the cmp.h5 file. This allows " 
+            "one to analyze kinetic and quality information by alignment column.");
+    clp.SetProgramSummary(progSummary);
+    clp.ParseCommandLine(argc, argv);
+
+    cerr << "[INFO] " << GetTimestamp() << " [" << program << "] started." << endl;
+    //use byMetric by default unless byRead is specified.
+    byMetric = true;
+    if (byRead) {
+        byMetric = false;
+    } 
+
+    if (metricList == "") {
+        SetDefaultMetricOptions(metricOptions);
+    }
+    else {
+        ParseMetricsList(metricList, metricOptions);
+    }
+
+    // 
+    // Always read in basecalls since they are used to check the sanity
+    // of the alignment indices.
+    //
+    metricOptions["Basecall"] = true;
+
+    //
+    // Translate from the metrics to be loaded to the ones that are
+    // required to compute them.
+    // Need to be refactored.
+    //
+    vector<string> datasetFields;
+    RequirementMap fieldRequirements;
+    BuildRequirementMap(fieldRequirements);
+    StoreDatasetFieldsFromPulseFields(metricOptions, fieldRequirements, datasetFields);
+    
+
+    //e.g. /PATH_TO_FILE/m120321_032600_42142_c100310572550000001523013208061210_s1_p0.bas.h5
+    //     /PATH_TO_FILE/m120321_032600_42142_c100310572550000001523013208061210_s2_p0.bas.h5
+    vector<string> movieFileNames;
+
+    //e.g. m120321_032600_42142_c100310572550000001523013208061210_s1_p0
+    //     m120321_032600_42142_c100310572550000001523013208061210_s2_p0
+    vector<string> fofnMovieNames;
+
+    FileOfFileNames::StoreFileOrFileList(movieFileName, movieFileNames);
+
+    HDFBasReader hdfBasReader;
+    HDFPlsReader hdfPlsReader;
+    HDFCCSReader<SMRTSequence> hdfCcsReader;
+
+    vector<string> baseFileFields, pulseFileFields;
+    int fieldIndex;
+    bool useBaseFile = false, usePulseFile = false;
+    for (fieldIndex = 0; fieldIndex < datasetFields.size(); fieldIndex++) {
+        if (hdfBasReader.ContainsField(datasetFields[fieldIndex])) {
+            useBaseFile = true;
+            baseFileFields.push_back(datasetFields[fieldIndex]);
+        }
+    }
+
+    if (maxElements != 0) {
+        hdfBasReader.maxAllocNElements = maxElements;
+        hdfPlsReader.maxAllocNElements = maxElements;
+    }
+
+    //
+    // For now, all runs will attempt to use information from a .bas
+    // file, since it's assumed that if one has alignments, one has a
+    // .bas file.
+    //
+    useBaseFile = true;
+    //
+    // Add some default fields.
+    //
+    hdfBasReader.IncludeField("Basecall");
+    hdfBasReader.IncludeField("PulseIndex");
+    hdfBasReader.InitializeFields(baseFileFields);
+
+    for (fieldIndex = 0; fieldIndex < datasetFields.size(); fieldIndex++) {
+        if (hdfPlsReader.ContainsField(datasetFields[fieldIndex])) {
+            usePulseFile = true;
+            pulseFileFields.push_back(datasetFields[fieldIndex]);
+        }
+    }
+    if (usePulseFile) {
+        // set hdfPlsReader.includedFields[fieldX] to true if fieldX is
+        // in pulseFileFields 
+        hdfPlsReader.InitializeFields(pulseFileFields);
+    }
+    hdfPlsReader.IncludeField("NumEvent");
+
+    int nMovies = movieFileNames.size();
+    int movieIndex;
+    MovieNameToArrayIndex movieNameMap;
+    //
+    // Initialize movies. This accomplishes two tasks.  First, all movie
+    // files are opened and initialized, so that if there are data
+    // fields missing the program will exit now rather than in the
+    // middle of loading pulses.  
+    // Next, a list of movie names is created in fofnMovieNames.  The
+    // cmp file does not necessarily index movies in the order of the
+    // fofn, and so when loading pulses from a movie indexed by a cmp
+    // file, one needs to look up the file name of the movie.  This is
+    // done by scanning the fofnMovieNames list in order until the movie
+    // is found. 
+
+    //
+    // h5 file access property list can be customized here.
+    // 
+    H5::FileAccPropList fileAccPropList = H5::FileAccPropList::DEFAULT;
+    // h5: number of items in meta data cache
+    int    mdc_nelmts  = (metaNElements==0)?(4096):(metaNElements); 
+    // h5: number of items in raw data chunk cache
+    size_t rdcc_nelmts = (rawNElements==0)?(4096):(rawNElements); 
+    // h5: raw data chunk cache size (in bytes) per dataset
+    size_t rdcc_nbytes = (rawChunkSize==0)?(9192):(rawChunkSize); 
+    double rdcc_w0     = 0.75;    // h5: preemption policy
+    // fileAccPropList.getCache(mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0);
+    fileAccPropList.setCache(mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0);
+    // fileAccPropList.setCache(4096, 4096, 8388608, rdcc_w0);
+
+
+    // If one of the h5 in the fofn is a ccs.h5 file, then only load pulse
+    // information from group /PulseData/ConsensusBaseCalls.
+    for (movieIndex = 0; movieIndex < nMovies; movieIndex++) {
+        FileType fileType;
+        BaseSequenceIO::DetermineFileTypeByExtension(movieFileNames[movieIndex], fileType, true);
+        if (fileType == HDFCCSONLY) {
+            useCcsOnly = true;
+        }
+    }
+
+    for (movieIndex = 0; movieIndex < nMovies; movieIndex++) {
+        if (useCcsOnly) {
+            hdfCcsReader.SetReadBasesFromCCS();
+            hdfBasReader.SetReadBasesFromCCS();
+        }
+        if (!hdfBasReader.Initialize(movieFileNames[movieIndex], fileAccPropList)) {
+            cout << "ERROR, could not initialize HDF file "
+                << movieFileNames[movieIndex] << " for reading bases." << endl;
+            exit(1);
+        }
+        else {
+            fofnMovieNames.push_back(hdfBasReader.GetMovieName());
+            movieNameMap[hdfBasReader.GetMovieName()] = movieIndex;
+            hdfBasReader.Close();
+        }
+
+        // 
+        // The pulse file is optional.  
+        //
+        if (usePulseFile) {
+            if (hdfPlsReader.Initialize(movieFileNames[movieIndex], fileAccPropList) == 0) {
+                usePulseFile = false;
+            }
+        }
+   }
+
+    CmpFile cmpFile;
+
+    //
+    // These readers pull information from the same pls file.
+    //
+    HDFCmpFile<CmpAlignment> cmpReader;
+
+    if (cmpReader.Initialize(cmpFileName, H5F_ACC_RDWR) == 0) {
+        cout << "ERROR, could not open the cmp file." << endl;
+        exit(1);
+    }
+
+    if (cmpReader.HasNoAlignments()) {
+        cout << "WARNING, there is no alignment in the cmp file." << endl;
+        if (useBaseFile) {
+            hdfBasReader.Close();
+        }
+        if (usePulseFile) {
+            hdfPlsReader.Close();
+        }
+        cmpReader.Close();
+        cerr << "[INFO] " << GetTimestamp() << " [" << program << "] ended." << endl;
+        exit(0);
+    }
+
+    cmpReader.Read(cmpFile, false);
+
+    // Sanity check: if there is a ccs.h5 file in the fofn and 
+    // cmp.h5 file's readType is not CCS, something is wrong. 
+    if (cmpFile.readType != ReadType::CCS and useCcsOnly) {
+        cout << "ERROR, there is a ccs.h5 file in the fofn, while read type of" 
+             << " the cmp.h5 file is not CCS." << endl;
+        exit(1);
+    }
+
+    string commandLine;
+    clp.CommandLineToString(argc, argv, commandLine);
+    cmpReader.fileLogGroup.AddEntry(commandLine, "Loading pulse metrics", program, GetTimestamp(), versionStr);
+
+    //
+    // Group alignment indices by movie so that they may be processed one movie at a time
+    // later on.  The movie indices set keeps track of all indices
+    // listed in alignment files.  This keeps a reference to all
+    // alignments in memory at once.   At the time of writing this, most
+    // projects will have at most a few million alignments, and so the
+    // size of this structure is modest.
+    // Each movieIndexSets[$movieId] contains indices of all the alignments, which
+    // are associated with a movie whose id in dataset /MovieInfo/ID equals $movieId
+    //
+    UInt alignmentIndex;
+    map<int, vector<int> > movieIndexSets;
+
+    for (alignmentIndex = 0; alignmentIndex < cmpFile.alnInfo.alignments.size(); alignmentIndex++) {
+        movieIndexSets[cmpFile.alnInfo.alignments[alignmentIndex].GetMovieId()].push_back(alignmentIndex);
+    }
+
+    //
+    // Load pulses from movies in order they appear in the input fofn.
+    //
+    int m;
+    int fofnMovieIndex;
+    for (fofnMovieIndex = 0; fofnMovieIndex < fofnMovieNames.size(); fofnMovieIndex++) {
+        bool byMetricForThisMovie = byMetric;
+
+        if (cmpFile.readType == ReadType::CCS or useCcsOnly) {
+            hdfBasReader.SetReadBasesFromCCS();
+            hdfCcsReader.Initialize(movieFileNames[fofnMovieIndex], fileAccPropList);
+        }
+        hdfBasReader.Initialize(movieFileNames[fofnMovieIndex], fileAccPropList);
+        
+        BaseFile  baseFile;
+        PulseFile pulseFile;
+
+        //
+        // Deprecate reading the entire bas.h5 file. Reads are scanned
+        // one by one or by metric, instead of caching all. 
+        // It is still necessary to read in some of the datasets entirely,
+        // in particular the start positions and hole numbers.
+        //
+        hdfBasReader.ReadBaseFileInit(baseFile);
+
+        set<uint32_t> moviePartHoleNumbers;
+        copy(baseFile.holeNumbers.begin(), baseFile.holeNumbers.end(), inserter(moviePartHoleNumbers, moviePartHoleNumbers.begin()));
+
+        if (usePulseFile) {
+            hdfPlsReader.Initialize(movieFileNames[fofnMovieIndex], fileAccPropList);
+            hdfPlsReader.IncludeField("NumEvent");
+            hdfPlsReader.IncludeField("StartFrame");
+            //
+            // Deprecate reading the entire pls.h5 file.
+            // Reads are scanned by read or by metric instead of caching all.  
+            // It is still necessary to read in some of the datasets entirely,
+            // in particular the start positions and hole numbers.
+            //
+            hdfPlsReader.ReadPulseFileInit(pulseFile); 
+        }
+
+        string cmpFileMovieName;
+
+        for (m = 0; m < cmpFile.movieInfo.name.size(); m++) {
+            //
+            // First find the file name for the movie 'm'
+            //
+            cmpFileMovieName = cmpFile.movieInfo.name[m];
+
+            if (baseFile.GetMovieName() == cmpFileMovieName) {
+                break;
+            }
+        }
+
+        //
+        // If the movie specified in the input.fofn is not found in the
+        // cmp file, that indicates something bad is happeing.  Either the
+        // input.fofn was not used to generate the cmp.h5 file, or no
+        // alignments were found between the input bas.h5 and the
+        // reference.  That shouldn't happen.
+        // 
+        if (m == cmpFile.movieInfo.name.size()) {
+            cout << "WARNING: Could not find any alignments for file " << movieFileNames[fofnMovieIndex] << endl;
+            continue;
+        }
+
+        //
+        // Open the movie and load its pulses into memory.
+        //
+        movieIndex = cmpFile.movieInfo.id[m];
+        UInt movieAlignmentIndex;
+        
+        //
+        // Since usePulseFile is set when the input file is a pulseFile,
+        // and ReadType::CCS becomes the read type when the alignments are
+        // ccs, when pulse files are specified for de novo ccs alignments,
+        // they will be opened as pulse files.  Since the de novo ccs
+        // sequences do not have pulse file information, the auto-reading
+        // of pulse files needs to be disabled.  Do that here.
+        //
+        if (cmpFile.readType == ReadType::CCS or useCcsOnly) {
+            usePulseFile = false;
+        }
+
+        // Check whether all metrics are computable or not. 
+        CanMetricsBeComputed(metricOptions, hdfBasReader, hdfPlsReader, useBaseFile,
+            usePulseFile, failOnMissingData, movieFileNames[fofnMovieIndex]);
+
+        // Get all metrics that are (1) supported, (2) required and (3) can be loaded.
+        vector<string> metricsToLoad = GetMetricsToLoad(metricOptions);
+
+        //
+        // An index set is a set of indices into the alignment array that
+        // are of reads generated by this movie.  Load pulses for all
+        // alignments generated for this movie.
+        //
+        // Movie index sets should be sorted by alignment index. Build a lookup table for this.
+        //
+        
+        std::vector<std::pair<int,int> > toFrom;
+        UInt totalAlnLength = 0;
+        for (movieAlignmentIndex = 0; movieAlignmentIndex < movieIndexSets[movieIndex].size(); movieAlignmentIndex++) {
+            alignmentIndex = movieIndexSets[movieIndex][movieAlignmentIndex];
+            totalAlnLength += cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetEnd() - \
+                              cmpFile.alnInfo.alignments[alignmentIndex].GetOffsetBegin();
+            toFrom.push_back(std::pair<int,int>(cmpFile.alnInfo.alignments[alignmentIndex].GetAlignmentId(), movieAlignmentIndex));
+        }
+
+        // orders by first by default.
+        std::sort(toFrom.begin(), toFrom.end());
+
+        // 
+        // Check metric dataset size in this movie and the required memory 
+        // consumption, if either limit is exceeded, switch to byread.
+        //
+        if (byMetricForThisMovie)
+        {
+            UInt requiredMem = ComputeRequiredMemory(metricsToLoad, hdfBasReader, 
+                    hdfPlsReader, useBaseFile, usePulseFile, cmpReader, totalAlnLength);
+            if (hdfBasReader.baseArray.arrayLength > hdfBasReader.maxAllocNElements or 
+                (usePulseFile and 
+                 hdfPlsReader.GetStartFrameSize() > hdfPlsReader.maxAllocNElements) or
+                ((float)requiredMem / 1024 / 1024) > maxMemory) {
+                cout << "Either the number of elements exceeds maxElement (" 
+                     << hdfPlsReader.maxAllocNElements << "). Or the estimated memory " << endl
+                     << "consumption exceeds maxMemory ("  << maxMemory << " GB)." << endl
+                     << "Loading pulses from " << movieFileNames[fofnMovieIndex] 
+                     << " by read." << endl;
+                byMetricForThisMovie = false;
+            }
+        }
+
+        if (((metricOptions.find("StartFrameBase") != metricOptions.end() and 
+              metricOptions["StartFrameBase"]) or 
+             (metricOptions.find("StartFramePulse")!= metricOptions.end() and 
+              metricOptions["StartFramePulse"])) and !byMetricForThisMovie) {
+            // Sneaky metrics StartFrameBase and StartFramePulse can used 
+            // with -bymetric only
+            cout << "ERROR: Internal metrics StartFrameBase and StartFramePulse "
+                 << "can only be loaded with -bymetric." << endl;
+            exit(1);
+        }
+
+        // Load "WhenStarted" before processing the others.
+        if (metricOptions["WhenStarted"]) {
+            WriteMetricWhenStarted(cmpReader, hdfPlsReader, movieFileNames[fofnMovieIndex]);
+        }
+
+        // Now load frame rate.
+        // if (AnyFieldRequiresFrameRate(datasetFields)) {
+        // Load frame rate anyway to ensure that cmp.h5 files are consistent.
+        if (useBaseFile) {
+            cmpReader.movieInfoGroup.StoreFrameRate(m, baseFile.GetFrameRate());
+        } else
+        if (usePulseFile) {
+            cmpReader.movieInfoGroup.StoreFrameRate(m, pulseFile.GetFrameRate());
+        }
+
+        //
+        // Load metrics for alignments from movie 'movieIndex'.
+        //
+        cout << "loading " <<  movieIndexSets[movieIndex].size() << " alignments for movie " << movieIndex << endl;
+
+        UInt i;
+        if (byMetricForThisMovie) {
+            //
+            // Build lookup tables for all alignments which 
+            // are generated by the movie and check whether 
+            // pls/bas.h5 and cmp.h5 match.
+            //
+            vector<MovieAlnIndexLookupTable> lookupTables;
+           
+            BuildLookupTablesAndMakeSane(cmpFile,     
+                baseFile,     
+                pulseFile,
+                cmpReader,   
+                hdfBasReader, 
+                hdfPlsReader, 
+                hdfCcsReader,
+                useBaseFile, 
+                usePulseFile,   
+                useCcsOnly,
+                movieIndexSets[movieIndex],
+                toFrom,
+                moviePartHoleNumbers,
+                lookupTables);
+            
+            //
+            // Group lookup tables by refGroupIndex and readGroupIndex.
+            //
+            vector<pair<UInt, UInt> >  groupedLookupTablesIndexPairs;
+            GroupLookupTables(lookupTables, groupedLookupTablesIndexPairs);
+            
+            if (cmpFile.readType == ReadType::CCS or useCcsOnly) {
+                vector<unsigned int> numPassesMetric;
+                numPassesMetric.resize(lookupTables.size());
+                UInt index = 0;  
+                for (index = 0; index < lookupTables.size(); index++) {
+                    if (lookupTables[index].skip) {
+                        continue;
+                    }
+                    numPassesMetric[index] = hdfCcsReader.GetNumPasses(lookupTables[index].readIndex);
+                }
+                if (!cmpReader.alnInfoGroup.numPasses.IsInitialized()) {
+                    cmpReader.alnInfoGroup.InitializeNumPasses();
+                    // Clear /AlnInfo/NumPasses dataset.
+                    cmpReader.alnInfoGroup.numPasses.Resize(0);
+                }
+                // Append numPasses of this movie to the end of /AlnInfo/NumPasses.
+                UInt numPassesSize = cmpReader.alnInfoGroup.numPasses.size();
+                cmpReader.alnInfoGroup.numPasses.WriteToPos(
+                        &numPassesMetric[0], 
+                        numPassesMetric.size(),
+                        numPassesSize);
+            }
+
+            // Keep a list of currently cached fields. 
+            vector<Field> cachedFields;
+            if (usePulseFile) {
+                // PulseCalls/ZMW/NumEvent is always cached in plsFile.
+                cachedFields.push_back(Field("NumEvent", PlsField));
+            } 
+
+            for (int metricsToLoadIndex = 0; metricsToLoadIndex < metricsToLoad.size(); metricsToLoadIndex++) {
+                string curMetric = metricsToLoad[metricsToLoadIndex];
+                // Metric "WhenStarted" should have been loaded before getting here.
+                if (curMetric == "WhenStarted") {
+                    continue;
+                }
+                // Get the next metric to load.
+                string nextMetric = "";
+                if (metricsToLoadIndex+1 < metricsToLoad.size()) {
+                    nextMetric = metricsToLoad[metricsToLoadIndex+1];
+                }
+
+                // Cache all required data for computing this metric.
+                CacheRequiredFieldsForMetric(baseFile,
+                    pulseFile,
+                    hdfBasReader,
+                    hdfPlsReader,
+                    hdfCcsReader,
+                    useBaseFile,
+                    usePulseFile,
+                    useCcsOnly,
+                    cachedFields,
+                    curMetric);
+
+                // Compute the metric and write it to cmp.h5.
+                WriteMetric(cmpFile, 
+                    baseFile, 
+                    pulseFile,
+                    cmpReader, 
+                    hdfBasReader,
+                    hdfPlsReader,
+                    hdfCcsReader,
+                    useBaseFile,
+                    usePulseFile, 
+                    useCcsOnly,
+                    lookupTables, 
+                    groupedLookupTablesIndexPairs,
+                    curMetric);
+
+                // Clear cached fields unless they are required by the next metric.
+                ClearCachedFields(baseFile,
+                    pulseFile,
+                    hdfBasReader,
+                    hdfPlsReader,
+                    hdfCcsReader,
+                    useBaseFile,
+                    usePulseFile,
+                    useCcsOnly,
+                    cachedFields,
+                    curMetric,
+                    nextMetric);
+            }
+
+            // Clear the default field "NumEvent"
+            if (usePulseFile) {
+                hdfPlsReader.ClearField(pulseFile, "NumEvent");
+            }
+
+        } else { // byRead for this movie
+            for (movieAlignmentIndex = 0; movieAlignmentIndex < movieIndexSets[movieIndex].size(); movieAlignmentIndex++) {
+                MovieAlnIndexLookupTable lookupTable; 
+                BuildLookupTable(movieAlignmentIndex,
+                    cmpFile,
+                    baseFile,
+                    usePulseFile,
+                    pulseFile,
+                    cmpReader,
+                    movieIndexSets[movieIndex], 
+                    toFrom,
+                    moviePartHoleNumbers,
+                    lookupTable);
+
+                // Skip this alignment if it is not generated by this movie
+                if (lookupTable.skip) {
+                    continue;
+                }
+
+                UInt & alignmentIndex = lookupTable.alignmentIndex;
+                int  & refGroupIndex  = lookupTable.refGroupIndex;
+                int  & readGroupIndex = lookupTable.readGroupIndex;
+                UInt & holeNumber     = lookupTable.holeNumber;
+                int  & readIndex      = lookupTable.readIndex;
+                int  & queryStart     = lookupTable.queryStart;
+                int  & queryEnd       = lookupTable.queryEnd;
+                int  & readStart      = lookupTable.readStart;
+                int  & readLength     = lookupTable.readLength;
+                UInt & offsetBegin    = lookupTable.offsetBegin;
+                UInt & offsetEnd      = lookupTable.offsetEnd;
+
+                string alignedSequence = GetAlignedSequenceFromCmpFile(cmpReader, lookupTable);
+
+                // Create a map of where.
+                vector<int> baseToAlignmentMap; 
+                CreateSequenceToAlignmentMap(alignedSequence, baseToAlignmentMap);
+
+			    // Condense gaps in the alignment for easy comparison.
+                RemoveGaps(alignedSequence, alignedSequence);
+                
+                // Get source read.
+                unsigned int numPasses;
+                SMRTSequence sourceRead;
+                GetSourceRead(cmpFile, 
+                    baseFile    ,
+                    pulseFile   ,
+                    hdfBasReader, 
+                    hdfPlsReader,
+                    hdfCcsReader,
+                    useBaseFile , 
+                    usePulseFile,
+                    useCcsOnly  , 
+                    //byRead      ,
+                    lookupTable , 
+                    alignedSequence,
+                    sourceRead  , 
+                    numPasses);
+                
+                string readSequence;
+                readSequence.resize(queryEnd - queryStart);
+                copy((char*) (sourceRead.seq + queryStart),
+                     (char*) (sourceRead.seq + queryEnd),
+                     readSequence.begin());
+
+                if (alignedSequence.size() != readSequence.size() or alignedSequence != readSequence) {
+                    cout << "ERROR, the query sequence does not match the aligned query sequence." << endl;
+                    cout << "HoleNumber: "<< holeNumber << ", MovieName: " << cmpFileMovieName;
+                    cout << ", ReadIndex: " << (int) readIndex;
+                    cout << ", qStart: "<< queryStart << ", qEnd: " << queryEnd << endl;
+                    cout << "Aligned sequence: "<< endl;
+                    cout << alignedSequence << endl;
+                    cout << "Original sequence: " << endl;
+                    cout << readSequence << endl;
+                    assert(0);
+                }
+
+                //
+                // Compute any necessary data fields.  These usually involve
+                // using differences of pulse indices, pulse widths, etc..
+                // Missing fields are stored as 0's. 
+                //
+
+                vector<float> readPulseMetric;
+                vector<float> floatMetric;
+                vector<UChar> qvMetric;
+                vector<HalfWord> frameRateMetric;
+                vector<uint32_t> timeMetric;
+                int ungappedAlignedSequenceLength = alignedSequence.size();
+                assert(ungappedAlignedSequenceLength == queryEnd - queryStart);
+
+                int alignedSequenceLength = offsetEnd - offsetBegin;
+                readPulseMetric.resize(alignedSequenceLength+1);
+                qvMetric.resize(alignedSequenceLength+1);
+                frameRateMetric.resize(alignedSequenceLength+1);
+                timeMetric.resize(alignedSequenceLength+1);
+
+                UInt i;
+                UInt pi;
+
+                HDFCmpExperimentGroup* expGroup = cmpReader.refAlignGroups[refGroupIndex]->readGroups[readGroupIndex];
+                UInt alnArrayLength = expGroup->alignmentArray.size();
+
+                if (cmpFile.readType == ReadType::CCS or useCcsOnly) {
+                    if (!cmpReader.alnInfoGroup.numPasses.IsInitialized()) {
+                        cmpReader.alnInfoGroup.InitializeNumPasses();
+                    }
+                    cmpReader.alnInfoGroup.numPasses.WriteToPos(&numPasses, 1, alignmentIndex);
+                }
+
+                if (metricOptions["StartTimeOffset"] == true) {
+                    if (!expGroup->startTimeOffset.IsInitialized()) {
+                        expGroup->startTimeOffset.Initialize(expGroup->experimentGroup, "StartTimeOffset");
+                    }
+                    unsigned int readStartTimeOffset = sourceRead.startFrame[queryStart];
+                    expGroup->startTimeOffset.WriteToPos(&readStartTimeOffset, 1, alignmentIndex);
+                }
+
+                if (metricOptions["QualityValue"] == true) {
+                    if (!expGroup->qualityValue.IsInitialized()) {
+                        expGroup->qualityValue.Initialize(expGroup->experimentGroup, "QualityValue", true, alnArrayLength);
+                    }
+                    // Store QualityValue. 
+                    fill(qvMetric.begin(), qvMetric.end(), missingQualityValue);
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        qvMetric[baseToAlignmentMap[i]] = sourceRead.qual[queryStart + i];
+                    }
+                    qvMetric[qvMetric.size()-1] = 0;
+                    expGroup->qualityValue.WriteToPos(&qvMetric[0], qvMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["InsertionQV"] == true) {
+                    if (!expGroup->insertionQV.IsInitialized()) {
+                        expGroup->insertionQV.Initialize(expGroup->experimentGroup, "InsertionQV", true, alnArrayLength);
+                    }
+                    // Store InsertionQV.
+                    fill(qvMetric.begin(), qvMetric.end(), missingQualityValue);
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        qvMetric[baseToAlignmentMap[i]] = sourceRead.insertionQV[queryStart+ i];
+                    }
+                    qvMetric[qvMetric.size()-1] = 0;
+                    expGroup->insertionQV.WriteToPos(&qvMetric[0], qvMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["MergeQV"] == true) {
+                    if (!expGroup->mergeQV.IsInitialized()) {
+                        expGroup->mergeQV.Initialize(expGroup->experimentGroup, "MergeQV", true, alnArrayLength);
+                    }
+                    // Store MergeQV. 
+                    fill(qvMetric.begin(), qvMetric.end(), missingQualityValue);
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        qvMetric[baseToAlignmentMap[i]] = sourceRead.mergeQV[queryStart+ i];
+                    }
+                    qvMetric[qvMetric.size()-1] = 0;
+                    expGroup->mergeQV.WriteToPos(&qvMetric[0], qvMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["DeletionQV"] == true) {
+                    if (!expGroup->deletionQV.IsInitialized()) {
+                        expGroup->deletionQV.Initialize(expGroup->experimentGroup, "DeletionQV", true, alnArrayLength);
+                    }
+                    // Store DeletionQV. 
+                    fill(qvMetric.begin(), qvMetric.end(), missingQualityValue);
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        qvMetric[baseToAlignmentMap[i]] = sourceRead.deletionQV[queryStart+i];
+                    }
+                    qvMetric[qvMetric.size()-1] = 0;
+                    expGroup->deletionQV.WriteToPos(&qvMetric[0], qvMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["DeletionTag"] == true) {
+                    if (!expGroup->deletionTag.IsInitialized()) {
+                        expGroup->deletionTag.Initialize(expGroup->experimentGroup, "DeletionTag", true, alnArrayLength);
+                    }
+                    vector<char> readDeletionTagMetric;
+                    readDeletionTagMetric.resize(readPulseMetric.size());
+                    // Store DeletionTag.
+                    for (i = 0; i < readDeletionTagMetric.size()-1; i++ ) {
+                        readDeletionTagMetric[i] = '-';
+                    }
+                    readDeletionTagMetric[i] = '\0';
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        assert(baseToAlignmentMap[i] < readDeletionTagMetric.size());
+                        readDeletionTagMetric[baseToAlignmentMap[i]] = sourceRead.deletionTag[queryStart+i];
+                    }
+                    readDeletionTagMetric[readDeletionTagMetric.size()-1] = 0;
+                    expGroup->deletionTag.WriteToPos(&readDeletionTagMetric[0], readDeletionTagMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["PulseIndex"] == true) {
+                    if (!expGroup->pulseIndex.IsInitialized()) {
+                        expGroup->pulseIndex.Initialize(expGroup->experimentGroup, "PulseIndex", true, alnArrayLength);
+                    }
+                    vector<uint32_t> readPulseIndexMetric;
+                    fill(readPulseIndexMetric.begin(), readPulseIndexMetric.end(), missingPulseIndex);
+                    readPulseIndexMetric.resize(readPulseMetric.size());
+                    // Store Pulse Index.
+                    assert(readPulseIndexMetric.size() > 0);
+                    for (i = 0; i < readPulseIndexMetric.size(); i++ ) {
+                        readPulseIndexMetric[i] = 0;
+                    }
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        readPulseIndexMetric[baseToAlignmentMap[i]] = sourceRead.pulseIndex[queryStart+i];
+                    }
+                    readPulseIndexMetric[readPulseIndexMetric.size()-1] = 0;
+                    expGroup->pulseIndex.WriteToPos(&readPulseIndexMetric[0], readPulseIndexMetric.size(), offsetBegin);
+                } 
+
+                if (metricOptions["SubstitutionTag"] == true) {
+                    if (!expGroup->substitutionTag.IsInitialized()) {
+                        expGroup->substitutionTag.Initialize(expGroup->experimentGroup, "SubstitutionTag", true, alnArrayLength);
+                    }
+                    vector<char> readSubstitutionTagMetric;
+                    readSubstitutionTagMetric.resize(readPulseMetric.size());
+                    // Store substitutionTag
+                    for (i = 0; i < readSubstitutionTagMetric.size()-1; i++ ) {
+                        readSubstitutionTagMetric[i] = '-';
+                    }
+                    readSubstitutionTagMetric[i] = '\0';
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        readSubstitutionTagMetric[baseToAlignmentMap[i]] = sourceRead.substitutionTag[queryStart+i];
+                    }
+                    readSubstitutionTagMetric[readSubstitutionTagMetric.size()-1] = 0;
+                    expGroup->substitutionTag.WriteToPos(&readSubstitutionTagMetric[0], readSubstitutionTagMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["SubstitutionQV"] == true) {
+                    if (!expGroup->substitutionQV.IsInitialized()) {
+                        expGroup->substitutionQV.Initialize(expGroup->experimentGroup, "SubstitutionQV", true, alnArrayLength);
+                    }
+
+                    // Store start time normalized to frame rate.
+                    fill(qvMetric.begin(), qvMetric.end(), missingQualityValue);
+
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        qvMetric[baseToAlignmentMap[i]] = sourceRead.substitutionQV[queryStart+i];
+                    }
+                    qvMetric[qvMetric.size()-1] = 0;
+                    expGroup->substitutionQV.WriteToPos(&qvMetric[0], qvMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["ClassifierQV"] == true) {
+                    if (!expGroup->classifierQV.IsInitialized()) {
+                        expGroup->classifierQV.Initialize(expGroup->experimentGroup, "ClassifierQV", true, alnArrayLength);
+                    }
+                    fill(floatMetric.begin(), floatMetric.end(), NaN);
+
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        floatMetric[baseToAlignmentMap[i]] = sourceRead.classifierQV[i+queryStart];
+                    }
+                    qvMetric[qvMetric.size()-1] = 0;
+                    expGroup->classifierQV.WriteToPos(&floatMetric[0], floatMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["StartFrame"] == true) {
+                    if (!expGroup->startTime.IsInitialized()) {
+                        expGroup->startTime.Initialize(expGroup->experimentGroup, "StartFrame", true, alnArrayLength);	
+                    }
+
+                    // StartFrame used to be computed from baseFile.preBaseFrame and 
+                    // baseFile.basWidthInFrames, whenever possible. But a more accurate
+                    // way is to obtain StartFrame directly from pulseFile.StartFrame 
+                    // when a pulseFile is provided.
+                    if (usePulseFile) {
+                        assert(sourceRead.startFrame);
+                    } else if (useBaseFile) {
+                        if (sourceRead.startFrame) {
+                            Free(sourceRead.startFrame);
+                        }
+                        sourceRead.startFrame = new unsigned int[sourceRead.length];
+                        copy(sourceRead.preBaseFrames, &sourceRead.preBaseFrames[sourceRead.length], sourceRead.startFrame);
+                        for (i = 0; i < sourceRead.length-1; i++) {
+                            sourceRead.startFrame[i+1] += sourceRead.widthInFrames[i];
+                        }
+                        partial_sum(sourceRead.startFrame, &sourceRead.startFrame[sourceRead.length],  sourceRead.startFrame);
+                    }
+                    
+                    fill(timeMetric.begin(), timeMetric.end(), missingPulseIndex);
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        timeMetric[baseToAlignmentMap[i]] = sourceRead.startFrame[i+queryStart];
+                    }
+                    timeMetric[timeMetric.size()-1] = 0;
+                    expGroup->startTime.WriteToPos(&timeMetric[0], timeMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["PulseWidth"] == true) {
+                    if (!expGroup->pulseWidth.IsInitialized()) {
+                        expGroup->pulseWidth.Initialize(expGroup->experimentGroup, "PulseWidth", true, alnArrayLength);
+                    }
+                    fill(frameRateMetric.begin(), frameRateMetric.end(), missingFrameRateValue);
+                    
+                    // For legacy reasons, it's possible the width in frames is
+                    // stored in the bas file. If this is the case, use the width
+                    // in frames there.  Otherwise, use the width in frames stored
+                    // in the pls file.
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        frameRateMetric[baseToAlignmentMap[i]] = sourceRead.widthInFrames[queryStart + i];
+                    }
+                    frameRateMetric[frameRateMetric.size()-1] = 0;
+                    expGroup->pulseWidth.WriteToPos(&frameRateMetric[0], frameRateMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["PreBaseFrames"] == true) {
+                    if (!expGroup->preBaseFrames.IsInitialized()) {
+                        expGroup->preBaseFrames.Initialize(expGroup->experimentGroup, "PreBaseFrames", true, alnArrayLength);
+                    }
+                    fill(frameRateMetric.begin(), frameRateMetric.end(), missingFrameRateValue);
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        frameRateMetric[baseToAlignmentMap[i]] = sourceRead.preBaseFrames[i+queryStart];
+                    }
+                    frameRateMetric[frameRateMetric.size()-1] = 0;
+                    expGroup->preBaseFrames.WriteToPos(&frameRateMetric[0], frameRateMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["WidthInFrames"] == true) {
+                    if (!expGroup->widthInFrames.IsInitialized()) {
+                        expGroup->widthInFrames.Initialize(expGroup->experimentGroup, "WidthInFrames", true, alnArrayLength);
+                    }
+                    // Compute width in frames. 
+                    fill(frameRateMetric.begin(), frameRateMetric.end(), missingFrameRateValue);
+
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        frameRateMetric[baseToAlignmentMap[i]] = sourceRead.widthInFrames[i+queryStart];
+                    }
+                    frameRateMetric[frameRateMetric.size()-1] = 0;
+                    expGroup->widthInFrames.WriteToPos(&frameRateMetric[0], frameRateMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["pkmid"] == true) {
+                    if (!expGroup->pkmid.IsInitialized()) {
+                        expGroup->pkmid.Initialize(expGroup->experimentGroup, "pkmid", true, alnArrayLength);
+                    }
+
+                    for (i = 0; i < readPulseMetric.size(); i++ ) {
+                        readPulseMetric[i] = NaN;
+                    }
+
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        readPulseMetric[baseToAlignmentMap[i]] = sourceRead.midSignal[i+queryStart];
+                    }
+                    readPulseMetric[readPulseMetric.size()-1] = 0;
+                    expGroup->pkmid.WriteToPos(&readPulseMetric[0], readPulseMetric.size(), offsetBegin);
+                }
+
+                if (metricOptions["IPD"] == true) {
+                    if (!expGroup->ipd.IsInitialized()) {
+                        expGroup->ipd.Initialize(expGroup->experimentGroup, "IPD", true, alnArrayLength);
+                    }
+                    fill(frameRateMetric.begin(), frameRateMetric.end(), missingFrameRateValue);				
+
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        //
+                        // The IPD is undefined for the first base in a read.
+                        //
+                        if (usePulseFile ) {
+                            if (queryStart == 0 and i == 0) {
+                                frameRateMetric[baseToAlignmentMap[i]] = 0;
+                            }
+                            else {
+                                frameRateMetric[baseToAlignmentMap[i]] = (sourceRead.startFrame[i+queryStart]  
+                                        - sourceRead.startFrame[i+queryStart-1]
+                                        - sourceRead.widthInFrames[i+queryStart-1]);
+                            }
+                        }
+                        else if (useBaseFile) {
+                            frameRateMetric[baseToAlignmentMap[i]] = sourceRead.preBaseFrames[i + queryStart];
+                        }
+                    }
+                    frameRateMetric[frameRateMetric.size()-1] = 0;
+                    expGroup->ipd.WriteToPos(&frameRateMetric[0], frameRateMetric.size(), offsetBegin);			
+                }
+
+                if (metricOptions["Light"] == true) {
+                    if (!expGroup->light.IsInitialized()) {
+                        expGroup->light.Initialize(expGroup->experimentGroup, "Light", true, alnArrayLength);
+                    }
+                    fill(frameRateMetric.begin(), frameRateMetric.end(), missingFrameRateValue);
+                    for (i = 0; i < ungappedAlignedSequenceLength; i++ ) {
+                        frameRateMetric[baseToAlignmentMap[i]] = sourceRead.meanSignal[i+queryStart];
+                        frameRateMetric[baseToAlignmentMap[i]] = (frameRateMetric[baseToAlignmentMap[i]] * 
+                                sourceRead.widthInFrames[i+queryStart]);
+                    }
+                    frameRateMetric[frameRateMetric.size()-1] = 0;
+                    expGroup->light.WriteToPos(&frameRateMetric[0], frameRateMetric.size(), offsetBegin);			
+                }
+
+                sourceRead.Free();
+                Free(sourceRead.meanSignal);
+                Free(sourceRead.maxSignal);
+                Free(sourceRead.midSignal);
+                Free(sourceRead.startFrame);
+                Free(sourceRead.classifierQV);
+                Free(sourceRead.widthInFrames);
+            }
+        }
+
+        if (useBaseFile) {
+            hdfBasReader.Close();
+        }
+        if (cmpFile.readType == ReadType::CCS or useCcsOnly) {
+            hdfCcsReader.Close();
+        }
+        if (usePulseFile) {
+            hdfPlsReader.Close();
+        }
+    } // Done loading movies.
+    
+    cmpReader.Close();
+    cerr << "[INFO] " << GetTimestamp() << " [" << program << "] ended." << endl;
+}
diff --git a/utils/Makefile b/utils/Makefile
new file mode 100644
index 0000000..53f40fa
--- /dev/null
+++ b/utils/Makefile
@@ -0,0 +1,64 @@
+SHELL=/bin/bash -e -E
+
+.PHONY=all cramtests
+
+PBINCROOT ?= $(realpath ../../../lib/cpp/)
+PREBUILT ?= $(realpath ../../../../prebuilt.out)
+THIRD_PARTY_PREFIX := $(realpath ../..)
+
+include ../common.mk
+
+all : CXXFLAGS ?= $(DEFAULTCXXFLAG)
+
+debug : CXXFLAGS ?= $(DEBUGCXXFLAG)
+
+profile : CXXFLAGS ?= $(PROFILECXXFLAG)
+
+g: CXXFLAGS += $(GCXXFLAG)
+g: LIBS = $(GLIBS)
+
+EXE = loadPulses pls2fasta samtoh5 samtom4 samFilter toAfg sawriter sdpMatcher
+
+all debug profile g: $(EXE)
+
+loadPulses: LoadPulses.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+pls2fasta: PulseToFasta.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+samtoh5: SamToCmpH5.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+samtom4: SamToM4.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+samFilter: SamFilter.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+toAfg: ToAfg.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+sawriter: SAWriter.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+sdpMatcher: SDPMatcher.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+pblib: $(PBINCROOT)/Makefile
+	make -C $(PBINCROOT)
+
+CTESTS := $(wildcard ctest/*.t)
+SLOW_CTESTS := ctest/loadPulses.t ctest/pls2fasta.t
+
+cramtests: $(EXE)
+	cram -v --shell=/bin/bash $(CTESTS)
+
+cramfast: $(EXE)
+	cram -v --shell=/bin/bash $(filter-out $(SLOW_CTESTS), $(CTESTS))
+
+clean: 
+	@rm -f $(EXE)
+	@rm -f *.d *.o
+
+-include $(DEPS)
diff --git a/utils/PulseToFasta.cpp b/utils/PulseToFasta.cpp
new file mode 100644
index 0000000..336bfc5
--- /dev/null
+++ b/utils/PulseToFasta.cpp
@@ -0,0 +1,334 @@
+#include <string>
+#include <iostream>
+#include <vector>
+
+#include "HDFPlsReader.hpp"
+#include "HDFUtils.hpp"
+#include "HDFRegionTableReader.hpp"
+#include "reads/RegionTable.hpp"
+#include "reads/ReadInterval.hpp"
+#include "files/ReaderAgglomerate.hpp"
+#include "utils/FileOfFileNames.hpp"
+#include "utils/RegionUtils.hpp"
+#include "utils/TimeUtils.hpp"
+#include "SMRTSequence.hpp"
+#include "utils.hpp"
+#include "CommandLineParser.hpp"
+
+
+using namespace std;
+char VERSION[] = "v1.0.0";
+char PERFORCE_VERSION_STRING[] = "$Change: 126414 $";
+
+int main(int argc, char* argv[]) {
+    string program = "pls2fasta";
+    string versionString = VERSION;
+    AppendPerforceChangelist(PERFORCE_VERSION_STRING, versionString);
+
+	string plsFileName, fastaOutName;
+	vector<string> plsFileNames;
+	bool trimByRegion, maskByRegion;
+	trimByRegion = false;
+	maskByRegion = false;
+	int argi = 3;
+	RegionTable regionTable;
+	string regionsFOFNName = "";
+	vector<string> regionFileNames;
+	bool splitSubreads = true;
+	int minSubreadLength = 0;
+	bool addSimulatedData = false;
+	bool printSimulatedCoordinate = false;
+	bool printSimulatedSequenceIndex = false;
+  bool printFastq = false;
+  bool printCcs   = false;
+  int  lineLength = 50;
+  int minReadScore = 0;
+  vector<int> holeNumbers;
+  CommandLineParser clp;
+  bool printOnlyBest = false;
+
+  clp.SetProgramName(program);
+  clp.SetVersion(versionString);
+  clp.RegisterStringOption("in.bax.h5", &plsFileName, "Input plx.h5/bax.h5/fofn file.", true);
+  clp.RegisterStringOption("out.fasta", &fastaOutName, "Output fasta/fastq file.", true);
+  clp.RegisterPreviousFlagsAsHidden();
+  clp.RegisterFlagOption("trimByRegion", &trimByRegion, "Trim away low quality regions.");
+  clp.RegisterFlagOption("maskByRegion", &maskByRegion, "Mask low quality regions with 'N'.");
+  clp.RegisterStringOption("regionTable", &regionsFOFNName, "Optional HDF file with a /PulseData/Regions dataset.");
+  clp.RegisterIntOption("minSubreadLength", &minSubreadLength, "Do not write subreads less than the specified length.", CommandLineParser::PositiveInteger);
+  clp.RegisterFlagOption("noSplitSubreads", &splitSubreads, "Do not split reads on adapter sequences.");
+  clp.RegisterIntListOption("holeNumber", &holeNumbers, "Only print this hole number (or list of numbers).");
+  clp.RegisterFlagOption("fastq", &printFastq, "Print in FASTQ format with quality.");
+  clp.RegisterFlagOption("ccs", &printCcs, "Print de novo CCS sequences");
+  clp.RegisterIntOption("lineLength", &lineLength, "Specify fasta/fastq line length", CommandLineParser::PositiveInteger);
+  clp.RegisterIntOption("minReadScore", &minReadScore, "Minimum read score to print a read.  The score is "
+                        "a number between 0 and 1000 and represents the expected accuracy percentage * 10. "
+                        "A typical value would be between 750 and 800.  This does not apply to ccs reads.", CommandLineParser::NonNegativeInteger);
+  clp.RegisterFlagOption("best", &printOnlyBest, "If a CCS sequence exists, print this.  Otherwise, print the longest"
+                         "subread.  This does not support fastq.");
+  string description = ("Converts plx.h5/bax.h5/fofn files to fasta or fastq files. Although fasta files are provided"
+  " with every run, they are not trimmed nor split into subreads. This program takes "
+  "additional annotation information, such as the subread coordinates and high quality regions "
+  "and uses them to create fasta sequences that are substrings of all bases called. Most of the time "
+  "you will want to trim low quality reads, so you should specify -trimByRegion.");
+  clp.SetProgramSummary(description);
+                        
+  clp.ParseCommandLine(argc, argv);
+
+    cerr << "[INFO] " << GetTimestamp() << " [" << program << "] started."  << endl;
+	if (trimByRegion and maskByRegion) {
+		cout << "ERROR! You cannot both trim and mask regions. Use one or the other." << endl;
+		exit(1);
+	}
+		 
+  if (printFastq) {
+    // Setting lineLength to 0 flags to print on one line.
+    lineLength = 0;
+  }
+
+
+    FileOfFileNames::StoreFileOrFileList(plsFileName, plsFileNames);
+	if (regionsFOFNName == "") {
+		regionFileNames = plsFileNames;
+	}
+	else {
+        FileOfFileNames::StoreFileOrFileList(regionsFOFNName, regionFileNames);
+	}
+    
+	ofstream fastaOut;
+	CrucialOpen(fastaOutName, fastaOut);
+	int plsFileIndex;
+	HDFRegionTableReader hdfRegionReader;
+    sort(holeNumbers.begin(), holeNumbers.end());
+
+    vector<int> pls2rgn = MapPls2Rgn(plsFileNames, regionFileNames);
+   
+    for (plsFileIndex = 0; plsFileIndex < plsFileNames.size(); plsFileIndex++) {
+        if (trimByRegion or maskByRegion or splitSubreads) {
+            hdfRegionReader.Initialize(regionFileNames[pls2rgn[plsFileIndex]]);
+            hdfRegionReader.ReadTable(regionTable);
+            regionTable.SortTableByHoleNumber();
+        }
+
+        ReaderAgglomerate reader;
+        HDFBasReader ccsReader;
+
+        if (printOnlyBest) {
+            ccsReader.SetReadBasesFromCCS();
+            ccsReader.Initialize(plsFileNames[plsFileIndex]);
+        }
+        if (printCcs == false) {
+            reader.IgnoreCCS();
+        }
+        else {
+            reader.hdfBasReader.SetReadBasesFromCCS();
+        }
+        if (addSimulatedData) {
+            reader.hdfBasReader.IncludeField("SimulatedCoordinate");
+            reader.hdfBasReader.IncludeField("SimulatedSequenceIndex");
+        }
+
+        if (reader.SetReadFileName(plsFileNames[plsFileIndex]) == 0) {
+            cout << "ERROR, could not determine file type."
+                << plsFileNames[plsFileIndex] << endl;
+            exit(1);
+        }
+        if (reader.Initialize() == 0) {
+            cout << "ERROR, could not initialize file "
+                << plsFileNames[plsFileIndex] << endl;
+            exit(1);
+        }
+
+        DNALength simulatedCoordinate;
+        DNALength simulatedSequenceIndex;
+        reader.SkipReadQuality();
+        SMRTSequence seq;
+        vector<ReadInterval> subreadIntervals;;
+        SMRTSequence ccsSeq;
+        while (reader.GetNextBases(seq, printFastq)) {
+            if (printOnlyBest) {
+                ccsReader.GetNext(ccsSeq);
+            }
+
+            if (holeNumbers.size() != 0 and 
+                    binary_search(holeNumbers.begin(), holeNumbers.end(), seq.zmwData.holeNumber) == false) {
+                continue;
+            }
+
+            if (seq.length == 0) {
+                continue;
+            }
+
+            if (addSimulatedData) {
+                reader.hdfBasReader.simulatedCoordinateArray.Read(reader.hdfBasReader.curRead-1, reader.hdfBasReader.curRead, &simulatedCoordinate);
+                reader.hdfBasReader.simulatedSequenceIndexArray.Read(reader.hdfBasReader.curRead-1, reader.hdfBasReader.curRead, &simulatedSequenceIndex);
+            }
+
+            if (printCcs == true) {
+                if (printFastq == false) {
+                    seq.PrintSeq(fastaOut);
+                }
+                else {
+                    seq.PrintFastq(fastaOut, lineLength);
+                }
+                continue;
+            }	
+
+      //
+      // Determine the high quality boundaries of the read.  This is
+      // the full read is no hq regions exist, or it is stated to
+      // ignore regions.
+      //
+      DNALength hqReadStart, hqReadEnd;
+      int hqRegionScore;
+      if (GetReadTrimCoordinates(seq, seq.zmwData, regionTable, hqReadStart, hqReadEnd, hqRegionScore) == false or 
+          (trimByRegion == false and maskByRegion == false)) {
+        hqReadStart = 0;
+        hqReadEnd   = seq.length;
+      }
+      
+      //
+      // Mask off the low quality portions of the reads.
+      //
+			if (maskByRegion) {
+        if (hqReadStart > 0) {
+          fill(&seq.seq[0], &seq.seq[hqReadStart], 'N');
+        }
+        if (hqReadEnd != seq.length) {
+          fill(&seq.seq[hqReadEnd], &seq.seq[seq.length], 'N');
+        }
+			}
+      
+
+
+      //
+      // Now possibly print the full read with masking.  This could be handled by making a 
+      // 
+			if (splitSubreads == false) {
+        ReadInterval wholeRead(0, seq.length);
+        // The set of subread intervals is just the entire read.
+        subreadIntervals.clear();
+        subreadIntervals.push_back(wholeRead);
+			}
+			else {
+				//
+				// Print subread coordinates no matter whether or not reads have subreads.
+				//
+				subreadIntervals.clear(); // clear old, new intervals are appended.
+				CollectSubreadIntervals(seq, &regionTable, subreadIntervals);
+      }
+      //
+      // Output all subreads as separate sequences.
+      //
+      int intvIndex;
+      SMRTSequence bestSubreadSequence;
+      int bestSubreadScore = -1;
+      int bestSubreadIndex = 0;
+      int bestSubreadStart = 0, bestSubreadEnd = 0;
+      SMRTSequence bestSubread;
+      for (intvIndex = 0; intvIndex < subreadIntervals.size(); intvIndex++) {
+        SMRTSequence subreadSequence, subreadSequenceRC;
+					
+        subreadSequence.subreadStart = subreadIntervals[intvIndex].start;
+        subreadSequence.subreadEnd   = subreadIntervals[intvIndex].end;
+          
+        // 
+        // When trimming by region, only output the parts of the
+        // subread that overlap the hq region.
+        //
+        if (trimByRegion == true) {
+          subreadSequence.subreadStart = max((DNALength) subreadIntervals[intvIndex].start, hqReadStart);
+          subreadSequence.subreadEnd   = min((DNALength) subreadIntervals[intvIndex].end, hqReadEnd);
+        }
+
+        if (subreadSequence.subreadStart >= subreadSequence.subreadEnd or 
+            subreadSequence.subreadEnd - subreadSequence.subreadStart <= minSubreadLength) {
+          //
+          // There is no high qualty portion of this subread. Skip it.
+          //
+          continue;
+        }
+
+        if (hqRegionScore < minReadScore) {
+          continue;
+        }
+
+        //
+        // Print the subread, adding the coordinates as part of the title.
+        //
+        subreadSequence.ReferenceSubstring(seq, subreadSequence.subreadStart, 
+                                           subreadSequence.subreadEnd - subreadSequence.subreadStart);
+        stringstream titleStream;
+        titleStream << seq.title;
+        if (splitSubreads) {
+          //
+          // Add the subread coordinates if splitting on subread.
+          //
+          titleStream << "/" 
+                      << subreadSequence.subreadStart
+                      << "_" << subreadSequence.subreadEnd;
+        }
+          
+        // 
+        // If running on simulated data, add where the values were simulated from.
+        //
+        if (addSimulatedData) {
+          titleStream << ((FASTASequence*)&seq)->title << "/chrIndex_" 
+                      << simulatedSequenceIndex << "/position_"<< simulatedCoordinate;
+          ((FASTASequence*)&seq)->CopyTitle(titleStream.str());
+        }
+
+        subreadSequence.CopyTitle(titleStream.str());
+
+        //
+        // Eventually replace with WriterAgglomerate.
+        //
+        if (printOnlyBest == false) {
+          if (subreadSequence.length > 0) {
+            if (printFastq == false) {
+              ((FASTASequence*)&subreadSequence)->PrintSeq(fastaOut);
+            }
+            else {
+              subreadSequence.PrintFastq(fastaOut, lineLength);
+            }
+          }
+        }
+        else {
+          int subreadWeightedScore = subreadSequence.length * hqRegionScore;
+          if (subreadWeightedScore > bestSubreadScore) {
+            bestSubreadIndex = intvIndex;
+            bestSubread = subreadSequence;
+            bestSubreadScore = subreadWeightedScore;
+          }
+        }
+      }
+
+      if (printOnlyBest) {
+        if (ccsSeq.length > 0) {
+          if (printFastq == false) {
+            ccsSeq.PrintSeq(fastaOut);
+          }
+          else {
+            ccsSeq.PrintFastq(fastaOut, ccsSeq.length);
+          }
+        }
+        else {
+          if (bestSubreadScore >= 0) {
+            if (printFastq == false) {
+              bestSubread.PrintSeq(fastaOut);
+            }
+            else {
+              bestSubread.PrintFastq(fastaOut, bestSubread.length);
+            }
+            bestSubread.Free();
+          }
+        }
+        ccsSeq.Free();
+      }
+      seq.Free();
+    }
+    reader.Close();
+    hdfRegionReader.Close();
+  }
+  cerr << "[INFO] " << GetTimestamp() << " [" << program << "] ended."  << endl;
+}
diff --git a/utils/SAWriter.cpp b/utils/SAWriter.cpp
new file mode 100644
index 0000000..883723c
--- /dev/null
+++ b/utils/SAWriter.cpp
@@ -0,0 +1,231 @@
+#include <vector>
+#include <string>
+#include "suffixarray/SuffixArray.hpp"
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+#include "NucConversion.hpp"
+#include "Types.h"
+#include "suffixarray/ssort.hpp"
+#include "algorithms/sorting/qsufsort.hpp"
+#include "algorithms/sorting/Karkkainen.hpp"
+#include "CompressedSequence.hpp"
+
+
+void PrintUsage() {
+	cout << "usage: sawriter saOut fastaIn [fastaIn2 fastaIn3 ...] [-blt p] [-larsson] [-4bit] [-manmy] [-kar]" << endl;
+  cout << "   or  sawriter fastaIn  (writes to fastIn.sa)." << endl;
+	cout << "       -blt p      Build a lookup table on prefixes of length 'p'. This speeds " << endl
+			 << "                   up lookups considerably (more than the LCP table), but misses matches " << endl
+			 << "                   less than p when searching." << endl;
+	cout << "       -4bit       Read in (one) fasta file as a compressed sequence file." << endl;
+	cout << "       -larsson  (default)  Uses the method of Larsson and Sadakane to build the array." << endl;
+	cout << "       -mamy      Uses the method of MAnber and MYers to build the array (slower than larsson, " << endl
+			 << "                   and produces the same result. This is mainly for double checking"<<endl
+			 << "                   the correctness of larsson)." << endl
+			 << "       -kark       Use Karkkainen DS3 method for building the suffix array.  This will probably be more "<<endl
+			 << "                   slow than larsson, but takes only an extra N/(sqrt 3) extra space." << endl
+			 << "       -mafe       (disabled for now!) Use the lightweight construction algorithm from Manzini and Ferragina" << endl
+			 << "       -welter     Use lightweight (sort of light) suffix array construction.  This is a bit more slow than" << endl
+			 << "                   normal larsson." << endl
+			 << "       -welterweight N use a difference cover of size N for building the suffix array.  Valid values are 7,32,64,111, and 2281." << endl;
+
+
+}
+
+int main(int argc, char* argv[]) {
+
+	if (argc < 2) {
+		PrintUsage();
+		exit(1);
+	}
+	int argi = 1;
+	string saFile = argv[argi++];
+	vector<string> inFiles;
+	
+	int doBLT = 1;
+	int bltPrefixLength = 8;
+	int parsingOptions = 0;
+	SAType saBuildType = larsson;
+	int read4BitCompressed  = 0;
+	int diffCoverSize = 0;
+	while (argi < argc) {
+		if (strlen(argv[argi]) > 0 and
+				argv[argi][0] == '-'){ 
+			parsingOptions = 1;
+		}
+		if (!parsingOptions) {
+			inFiles.push_back(argv[argi]);
+		}
+		else {
+			if (strcmp(argv[argi], "-blt") == 0) {
+				doBLT = 1;
+        if (argi < argc - 1) {
+          bltPrefixLength = atoi(argv[++argi]);
+          if (bltPrefixLength == 0) {
+            cout << argv[argi] << " is not a valid lookup table length." << endl;
+            exit(1);
+          }
+        }
+        else {
+          cout << "Please specify a lookup table length." << endl;
+          exit(1);
+        }
+			}
+			else if (strcmp(argv[argi], "-mamy") == 0) {
+				saBuildType = manmy;
+			}
+			else if (strcmp(argv[argi], "-larsson") == 0) {
+				saBuildType = larsson;
+			}
+			else if (strcmp(argv[argi], "-mcilroy") == 0) {
+				saBuildType = mcilroy;
+			}
+			else if (strcmp(argv[argi], "-slow") == 0) {
+				saBuildType = slow;
+			}
+			else if (strcmp(argv[argi], "-kark") == 0) {
+				saBuildType = kark;
+			}
+			else if (strcmp(argv[argi], "-mafe") == 0) {
+				saBuildType = mafe;
+			}
+			else if (strcmp(argv[argi], "-welter") == 0) {
+				saBuildType = welter;
+			}
+			else if (strcmp(argv[argi], "-welterweight") == 0) {
+        if (argi < argc-1) {
+          diffCoverSize = atoi(argv[++argi]);
+        }
+        else {
+          cout << "Please specify a difference cover size.  Valid values are 7,32,64,111, and 2281.  Larger values use less memory but may be slower." << endl;
+          exit(1);
+        }
+        if ( ! (diffCoverSize == 7 or 
+                diffCoverSize == 32 or
+                diffCoverSize == 64 or 
+                diffCoverSize == 111 or
+                diffCoverSize == 2281) ) {
+          cout << "The difference cover size must be one of 7,32,64,111, or 2281." << endl;
+          cout << "Larger numbers use less space but are more slow." << endl;
+          exit(1);
+        }
+			}
+			else if (strcmp(argv[argi], "-4bit") == 0) {
+				read4BitCompressed = 1;
+			}
+			else {
+				PrintUsage();
+				cout << "ERROR, bad option: " << argv[argi] << endl;
+				exit(1);
+			}
+		}
+		++argi;
+	}
+  
+  if (inFiles.size() == 0) {
+    //
+    // Special use case: the input file is a fasta file.  Write to that file + .sa
+    //
+    inFiles.push_back(saFile);
+    saFile = saFile + ".sa";
+  }
+  
+	VectorIndex inFileIndex;
+	FASTASequence seq;
+	CompressedSequence<FASTASequence> compSeq;
+
+	if (read4BitCompressed == 0) {
+		for (inFileIndex = 0; inFileIndex < inFiles.size(); ++inFileIndex) {
+			FASTAReader reader;
+			reader.Init(inFiles[inFileIndex]);
+			reader.SetSpacePadding(111);
+			if (saBuildType == kark) {
+				//
+				// The Karkkainen sa building method requires a little extra
+				// space at the end of the dna sequence so that counting may
+				// be done mod 3 without adding extra logic for boundaries.
+				//
+			}
+  
+			if (inFileIndex == 0) {
+				reader.ReadAllSequencesIntoOne(seq);
+				reader.Close();
+			}
+			else {
+				while(reader.ConcatenateNext(seq)) {
+					cout << "added " << seq.title << endl;
+				}
+			}
+		}
+		seq.ToThreeBit();
+		//seq.ToUpper();
+	}
+	else {
+		assert(inFiles.size() == 1);
+		cout << "reading compressed sequence." << endl;
+		compSeq.Read(inFiles[0]);
+		seq.seq = compSeq.seq;
+		seq.length = compSeq.length;
+		compSeq.RemoveCompressionCounts();
+		cout << "done." << endl;
+	}
+
+  //
+  // For now, do not allow creation of suffix arrays on sequences > 4G.
+  //
+  if (seq.length >= UINT_MAX) {
+    cout << "ERROR, references greater than " << UINT_MAX << " bases are not supported." << endl;
+    cout << "Consider breaking the reference into multiple files, running alignment. " << endl;
+    cout << "against each file, and merging the result." << endl;
+    exit(1);
+  }
+	vector<int> alphabet;
+	
+	SuffixArray<Nucleotide, vector<int> >  sa;
+	//	sa.InitTwoBitDNAAlphabet(alphabet);
+	//	sa.InitAsciiCharDNAAlphabet(alphabet);
+  sa.InitThreeBitDNAAlphabet(alphabet);
+
+	if (saBuildType == manmy) {
+		sa.MMBuildSuffixArray(seq.seq, seq.length, alphabet);
+	}
+	else if (saBuildType == mcilroy) {
+		sa.index = new SAIndex[seq.length+1];
+		DNALength i;
+		for (i = 0; i < seq.length; i++) { sa.index[i] = seq.seq[i] + 1;}
+		sa.index[seq.length] = 0;
+		ssort(sa.index, NULL);
+		for (i = 1; i < seq.length+1; i++ ){ sa.index[i-1] = sa.index[i];};
+		sa.length = seq.length;
+	}
+	else if (saBuildType == larsson) {
+		sa.LarssonBuildSuffixArray(seq.seq, seq.length, alphabet);
+	}
+	else if (saBuildType == kark) {
+		sa.index = new SAIndex[seq.length];
+		seq.ToThreeBit();
+		DNALength p;
+		for (p = 0; p < seq.length; p++ ){ seq.seq[p]++; }
+		KarkkainenBuildSuffixArray<Nucleotide>(seq.seq, sa.index, seq.length, 5);
+		sa.length = seq.length;
+	}
+	else if (saBuildType == mafe) {
+		//		sa.MaFeBuildSuffixArray(seq.seq, seq.length);
+		
+	}
+	else if (saBuildType == welter) {
+		if (diffCoverSize == 0) {
+			sa.LightweightBuildSuffixArray(seq.seq, seq.length);
+		}
+		else {
+			sa.LightweightBuildSuffixArray(seq.seq, seq.length, diffCoverSize);
+		}
+	}
+	if (doBLT) {
+		sa.BuildLookupTable(seq.seq, seq.length, bltPrefixLength);
+	}
+	sa.Write(saFile);
+
+	return 0;
+
+}
diff --git a/utils/SDPMatcher.cpp b/utils/SDPMatcher.cpp
new file mode 100644
index 0000000..d35a7d6
--- /dev/null
+++ b/utils/SDPMatcher.cpp
@@ -0,0 +1,166 @@
+#include <string>
+#include <iostream>
+#include <assert.h>
+#include <math.h>
+
+#include "defs.h"
+#include "FASTAReader.hpp"
+#include "FASTASequence.hpp"
+#include "tuples/DNATuple.hpp"
+#include "tuples/TupleMetrics.hpp"
+#include "datastructures/alignment/Path.h"
+#include "datastructures/alignment/Alignment.hpp"
+#include "algorithms/alignment/AlignmentUtils.hpp"
+#include "format/StickAlignmentPrinter.hpp"
+#include "algorithms/alignment/SWAlign.hpp"
+#include "algorithms/alignment/SDPAlign.hpp"
+
+/* 
+ * Performs sparse dynamic programming (SDP) between pairs of sequences as they 
+ * are given in two FASTA files, one called for convenience query, the other 
+ * target. k is the size of the k-mer used for the SDP algorithm.
+ */
+
+void PrintUsage() {
+        cout << "usage: sdpMatcher query target k [-indelRate delta] "
+                "[-showalign] [-printsw] [-noRefine] [-indel i] [ -local ] "
+                "[-match m] [-sdpIndel i]" << endl;
+}
+
+int main(int argc, char* argv[]) {
+    if (argc < 4) {
+        PrintUsage();
+        exit(1);
+    }
+
+    string queryName, targetName;
+    queryName = argv[1];
+    targetName = argv[2];
+    TupleMetrics tm;
+    tm.Initialize(atoi(argv[3]));
+    int argi = 4;
+    float indelRate = 0.25;
+    int indel = 3;
+    int match = 0;
+    int printSW = 0;
+    int refineAlignments = 1;
+    int showalign = 0;
+    int fixedTarget = 0;
+    int sdpIndel = indel;
+    int sdpIns = 5;
+    int sdpDel = 5;
+    AlignmentType alignType = Global;
+    while (argi < argc) {
+        if (strcmp(argv[argi], "-indelRate") == 0) {
+            ++argi;
+            indelRate = atof(argv[argi]);
+        }
+        else if (strcmp(argv[argi], "-printsw") == 0) {
+            printSW = 1;
+        }
+        else if (strcmp(argv[argi], "-noRefine") == 0) {
+            refineAlignments = 0;
+        }
+        else if (strcmp(argv[argi], "-indel") == 0) {
+            indel = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-sdpIndel") == 0) {
+            sdpIndel = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-sdpIns") == 0) {
+            sdpIns  = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-sdpDel") == 0) {
+            sdpDel  = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-showalign") == 0) {
+            showalign = 1;
+        }
+        else if (strcmp(argv[argi], "-local") == 0) {
+            alignType = Local;
+        }
+        else if (strcmp(argv[argi], "-match") == 0) {
+            match = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-fixedtarget") == 0) {
+            fixedTarget = 1;
+        }
+        else {
+            PrintUsage();
+            cout << "Bad option: " << argv[argi] << endl;
+            exit(1);
+        }
+        ++argi;
+    }
+
+    FASTASequence query, target;
+    FASTAReader queryReader, targetReader;
+    queryReader.Init(queryName);
+    
+    targetReader.Init(targetName);
+
+    if (match != 0) {
+        int i;
+        for (i = 0; i < 4; i++ ){
+            LocalAlignLowMutationMatrix[i][i] = match;
+        }
+    }
+
+    int seqIndex = 0;
+    Alignment alignment;
+    vector<int> scoreMat;
+    vector<Arrow> pathMat;
+    DistanceMatrixScoreFunction<DNASequence, DNASequence> distScoreFn;
+    distScoreFn.del = indel;
+    distScoreFn.ins = indel;
+    distScoreFn.InitializeScoreMatrix(SMRTDistanceMatrix);
+
+    if (fixedTarget) {
+        targetReader.GetNext(target);
+    }
+
+    cout << "qid,tid,qstart,qend,qlen,tstart,tend,tlen,score" << endl;
+    while (queryReader.GetNext(query) and 
+           (fixedTarget or targetReader.GetNext(target))) {
+        
+        if (query.length == 0 or target.length == 0)
+            continue; 
+        alignment.blocks.clear();
+
+        int alignScore;
+        alignScore = SDPAlign(query, target,
+                              distScoreFn, tm.tupleSize, 
+                              sdpIndel, sdpIndel, indelRate, 
+                              alignment, 
+                              alignType,
+                              refineAlignments,
+                              false,
+                              0);
+
+        if (alignScore > 0){ // in rare cases the SDP returns positive. 
+            alignScore = 0;  // this makes it more like a true local alignment
+        }                   
+
+        if (showalign) {
+            StickPrintAlignment(alignment, query, target, cout);
+        }
+
+        if (printSW) {
+            MatchedAlignment swAlignment;
+            vector<int> scoreMat;
+            vector<Arrow> pathMat;
+            SWAlign(query, target, scoreMat, pathMat, swAlignment, distScoreFn);        
+            StickPrintAlignment(swAlignment, query, target, cout);
+        }
+
+        cout << query.GetName()  << "," << target.GetName() << "," 
+             << alignment.qPos << "," << alignment.QEnd()   << "," 
+             << query.length  << "," << alignment.tPos << "," 
+             << alignment.TEnd()   << "," << target.length << "," 
+             << alignScore << endl;
+
+        ++seqIndex;
+    }
+
+    return 0;
+}
diff --git a/utils/SamFilter.cpp b/utils/SamFilter.cpp
new file mode 100644
index 0000000..dccf586
--- /dev/null
+++ b/utils/SamFilter.cpp
@@ -0,0 +1,544 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  SAMFilter.cpp
+ *
+ *    Description:  Filter SAM Hits according to 
+ *                  filteration criteria
+ *                     minPctSimilarity, minAccuracy, 
+ *                     minLength, holeNumbers
+ *                  and multiple-hit policy
+ *                     random    : a random hit
+ *                     all       : all hits
+ *                     allbest   : all hits with the best score
+ *                     randombest: a random hit selected from all the hits 
+ *                                 that have the best score
+ *
+ *        Version:  1.0
+ *        Created:  03/19/2013 01:19:43 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+#include <climits>
+
+#include <iostream>
+
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+#include "CommandLineParser.hpp"
+#include "ChangeListID.hpp"
+#include "utils/TimeUtils.hpp"
+#include "utils/RangeUtils.hpp"
+#include "utils/SMRTReadUtils.hpp"
+#include "algorithms/alignment/DistanceMatrixScoreFunction.hpp"
+#include "algorithms/alignment/AlignmentUtils.hpp"
+#include "algorithms/alignment/StringToScoreMatrix.hpp"
+#include "sam/SAMReader.hpp"
+#include "format/SAMPrinter.hpp"
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "datastructures/alignment/FilterCriteria.hpp"
+#include "metagenome/TitleTable.hpp"
+#include "datastructures/alignment/SAMToAlignmentCandidateAdapter.hpp"
+#include "GFFFile.hpp"
+#include "defs.h"
+#include "../RegisterFilterOptions.h"
+
+//#define USE_GOOGLE_PROFILER
+#ifdef USE_GOOGLE_PROFILER
+#include "gperftools/profiler.h"
+#endif
+
+char VERSION[] = "v0.1.0";
+char PERFORCE_VERSION_STRING[] = "$Change: 134995 $";
+// By default negative score is better.
+ScoreSign scoreSign = ScoreSign::NEGATIVE;
+
+// Compare SAMAlignment objects by qName, score and 
+// target positions.
+bool byQNameScoreTStart(const SAMAlignment & a, 
+                        const SAMAlignment & b) {
+    if (a.qName == b.qName) {
+        if (a.score == b.score) 
+            return a.pos < b.pos;
+        return Score(a.score, scoreSign).WorseThan(Score(b.score, scoreSign));
+    }
+    return (a.qName < b.qName);
+}
+
+// Compare SAMAlignment objects by rName and qName 
+bool byRNameQName(const SAMAlignment & a, 
+                  const SAMAlignment & b) {
+    if (a.rName == b.rName) {
+        return a.qName < b.qName;
+    }
+    return (a.rName < b.rName);
+}
+
+// Get the next group of SAM alignments that have the same qName from
+// allSAMAlignments[groupBegin ... groupEnd)
+// Note that allSAMAlignments is already sorted by qName, score and tPos.
+void GetNextSAMAlignmentGroup(vector<SAMAlignment> & allSAMAlignments, 
+                              unsigned int groupBegin, 
+                              unsigned int & groupEnd) {
+    assert(groupBegin < allSAMAlignments.size());
+    groupEnd = groupBegin + 1;
+    string queryName = allSAMAlignments[groupBegin].qName;
+    while(groupEnd < allSAMAlignments.size()) {
+        if (allSAMAlignments[groupEnd].qName == queryName) 
+            groupEnd ++;
+        else break;
+    }
+}
+
+// Get the best SAM alignments whose alignment score are the best. 
+// Assume that alignments in allSAMAlignments[groupBegin, groupEnd)
+// all have the same queryName and are sorted by score and tPos 
+// asscendingly: worst, ...., best
+void GetBestSAMAlignmentsInGroup(vector<SAMAlignment> & allSAMAlignments, 
+                                 const unsigned int & groupBegin, 
+                                 const unsigned int & groupEnd, 
+                                 unsigned int & bestBegin,
+                                 unsigned int & bestEnd) {
+    assert(groupEnd  <= allSAMAlignments.size() and
+           groupBegin < groupEnd);
+
+    bestEnd = groupEnd;
+    bestBegin = groupEnd - 1;
+    int groupBestScore = allSAMAlignments[bestBegin].score;
+    string queryName = allSAMAlignments[bestBegin].qName;
+    while (bestBegin >= groupBegin and bestBegin < groupEnd) {
+        assert(allSAMAlignments[bestBegin].qName == queryName);
+        if (allSAMAlignments[bestBegin].score == groupBestScore)
+            bestBegin -= 1;
+        else break;
+    }
+    bestBegin += 1;
+}
+
+
+// Apply hit policy to a group of SAM alignments and return indices
+// of the selected alignments.
+vector<unsigned int> ApplyHitPolicy(HitPolicy & hitPolicy, 
+                                    vector<SAMAlignment> & allSAMAlignments, 
+                                    const unsigned int & groupBegin, 
+                                    const unsigned int & groupEnd) {
+    vector<unsigned int> hitIndices;
+    if (hitPolicy.IsAll()) {
+        for(unsigned int i = groupBegin; i < groupEnd; i++){
+            hitIndices.push_back(i);
+        }
+    } else if (hitPolicy.IsRandom()) {
+        hitIndices.push_back(rand()%(groupEnd - groupBegin) + groupBegin);
+    } else {
+        unsigned int bestBegin, bestEnd;
+        GetBestSAMAlignmentsInGroup(allSAMAlignments, groupBegin, groupEnd,
+                                    bestBegin, bestEnd);
+        if (hitPolicy.IsAllbest()) {
+            for(unsigned int i = bestBegin; i < bestEnd; i++){
+                hitIndices.push_back(i);
+            }
+        } else if (hitPolicy.IsRandombest()) {
+            hitIndices.push_back(rand()%(bestEnd-bestBegin) + bestBegin);
+        } else if (hitPolicy.IsLeftmost()) {
+            hitIndices.push_back(bestBegin);
+        } else {
+            assert(false);
+        }
+    }
+    return hitIndices;
+}
+
+// Convert references[...].title in reference.fasta to their corresponding
+// indices in the title table.
+void ConvertTitlesToTitleTableIndices(vector<FASTASequence> & references,
+        string & titleTableName) {
+    TitleTable tt;
+    tt.Read(titleTableName);
+    for(int i = 0; i < references.size(); i++) {
+        string title = references[i].GetTitle();
+        int idx = -1;
+        if (tt.Lookup(title, idx)) {
+            stringstream ss;
+            ss << idx; 
+            references[i].CopyTitle(ss.str());
+        } else {
+            cout << "ERROR, reference " << title << " does not exist "
+                 << " in the title table " << titleTableName << ". The "
+                 << "reference fasta and the title table do not match."
+                 << endl;
+            exit(1);
+        }
+    }
+    tt.Free();
+}
+
+// Return true if the alignment can only map to an adapter specified 
+// in the adapter GFF file. 
+// A sample record in adapter GFF file:
+// ref000001   .   adapter 10955   10999   0.00    +   .   xxxx
+// ref000001   .   adapter 32886   32930   0.00    +   .   xxxx 
+// Note that the first field (e.g., 'ref000001') is id of sequence  
+// in a reference repository, not sequence name, so we need to 
+// reconstruct the mapping between sequence id and sequence name.
+bool CheckAdapterOnly(GFFFile & adapterGffFile, //Adapter gff file
+    AlignmentCandidate<> & alignment, // An alignment
+    map<string, int> & refNameToIndex) { 
+    // Map target sequence name to its index in reference repository.
+    if (refNameToIndex.find(alignment.tName) == refNameToIndex.end()) {
+        // This should not happen ...
+        cout << "ERROR, could not find alignment target name "
+             << alignment.tName << " in the reference file." << endl;
+        exit(1);
+    }
+    int refNameIndex = refNameToIndex[alignment.tName];
+    char buf [16];
+    sprintf(buf, "ref%06d", refNameIndex + 1);
+    // Reconstruct ref id in the format "ref00000?".
+    string refNameId(buf);
+    int FUZZY_OVERLAP = 20;
+    for(int eindex = 0; eindex < adapterGffFile.entries.size();
+            eindex++) { 
+        GFFEntry & entry = adapterGffFile.entries[eindex];
+        // Convert each GFF record from 1-based inclusive to 
+        // 0-based exclusive.
+        if (entry.type == "adapter" and 
+            (entry.name == alignment.tName or
+             entry.name == refNameId)) {
+            UInt estart = entry.start - 1;
+            UInt eend = entry.end;
+            if (entry.strand == '-') {
+                UInt tmp = estart;
+                estart = alignment.tLength - 1 - eend;
+                eend = alignment.tLength - 1 - tmp;
+            }
+            if (not (eend < alignment.GenomicTBegin() or
+                 estart > alignment.GenomicTEnd())) {
+                int lengthUnion = max(eend, alignment.GenomicTEnd()) -
+                                  min(estart, alignment.GenomicTBegin());
+                if (lengthUnion < eend - estart + FUZZY_OVERLAP) {
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+int main(int argc, char* argv[]) {
+#ifdef USE_GOOGLE_PROFILER
+    char *profileFileName = getenv("CPUPROFILE");
+    if (profileFileName != NULL) {
+      ProfilerStart(profileFileName);
+    }
+    else {
+      ProfilerStart("google_profile.txt");
+    }
+#endif
+
+    // Register inputs and outputs.
+    string samFileName, refFileName, outFileName;
+
+    CommandLineParser clp;
+    clp.RegisterStringOption("file.sam", &samFileName,
+                             "Input SAM file.");
+    clp.RegisterStringOption("reference.fasta", &refFileName,
+                             "Reference used to generate reads.");
+    clp.RegisterStringOption("out.sam", &outFileName,
+                             "Output SAM file.");
+    clp.RegisterPreviousFlagsAsHidden();
+
+    // Register filter criteria options.
+    int minAlnLength = 50;
+    float minPctSimilarity = 70, minPctAccuracy = 70;
+    string hitPolicyStr = "randombest";
+    bool useScoreCutoff = false;
+    int  scoreCutoff = INF_INT;
+    int  scoreSignInt = -1;
+    RegisterFilterOptions(clp, minAlnLength, minPctSimilarity, 
+                          minPctAccuracy, hitPolicyStr, useScoreCutoff,
+                          scoreSignInt, scoreCutoff);
+
+    int seed = 1; 
+    clp.RegisterIntOption("seed", &seed,
+            "(1)  Seed for random number generator.\n"
+            "If seed is 0, then use current time as seed.",
+            CommandLineParser::Integer);
+
+    string holeNumberStr;
+    Ranges holeNumberRanges;
+    clp.RegisterStringOption("holeNumbers", &holeNumberStr,
+            "A string of comma-delimited hole number ranges to output hits, "
+            "such as '1,2,10-12'. "
+            "This requires hit titles to be in SMRT read title format.");
+
+    bool parseSmrtTitle = false;
+    clp.RegisterFlagOption("smrtTitle", &parseSmrtTitle,
+            "Use this option when filtering alignments generated by "
+            "programs other than blasr, e.g. bwa-sw or gmap. "
+            "  Parse read coordinates from the SMRT read title. " 
+            "The title is in the format /name/hole/coordinates, where"
+            " coordinates are in the format \\d+_\\d+, and represent "
+            "the interval of the read that was aligned.");
+    /* This experimental option can be useful for metagenomics, in which case
+     * there are hundreds of sequences in the target, of which many titles are
+     * long and may contain white spaces (e.g., ' ', '\t'). 
+     * In order to save disc space and avoid the (possibly) none unique mapping
+     * between full and short reference names, one may call blasr with 
+     * -titleTable option to represent all target sequences in the output
+     * by their indices in the title table.*/
+
+    string titleTableName = "";
+    clp.RegisterStringOption("titleTable", &titleTableName,
+            "Use this experimental option when filtering alignments generated by "
+            "blasr with -titleTable titleTableName, in which case "
+            "reference titles in SAM are represented by their "
+            "indices (e.g., 0, 1, 2, ...) in the title table.");
+
+    string adapterGffFileName = "";
+    clp.RegisterStringOption("filterAdapterOnly", &adapterGffFileName,
+            "Use this option to remove reads which can only map to adapters " 
+            "specified in the GFF file.");
+
+    bool verbose = false;
+    clp.RegisterFlagOption("v", &verbose, "Be verbose.");
+
+    clp.SetExamples(
+            "Because SAM has optional tags that have different meanings"
+            " in different programs, careful usage is required in order "
+            "to have proper output.  The \"xs\" tag in bwa-sw is used to "
+            "show the suboptimal score, but in PacBio SAM (blasr) it is "
+            "defined as the start in the query sequence of the alignment.\n"
+            "When \"-smrtTitle\" is specified, the xs tag is ignored, but "
+            "when it is not specified, the coordinates given by the xs and "
+            "xe tags are used to define the interval of a read that is "
+            "aligned.  The CIGAR string is relative to this interval.");
+
+    clp.ParseCommandLine(argc, argv);
+
+    // Set random number seed. 
+    if (seed == 0) {
+        srand(time(NULL));
+    } else {
+        srand(seed);
+    }
+    
+    scoreSign = (scoreSignInt == -1)?ScoreSign::NEGATIVE:ScoreSign::POSITIVE;
+    Score s(static_cast<float>(scoreCutoff), scoreSign);
+    FilterCriteria filterCriteria(minAlnLength, minPctSimilarity, 
+                                  minPctAccuracy, true, s);
+    filterCriteria.Verbose(verbose);
+    HitPolicy hitPolicy(hitPolicyStr, scoreSign);
+                                  
+    string errMsg;
+    if (not filterCriteria.MakeSane(errMsg)) {
+        cout << errMsg << endl;
+        exit(1);
+    }
+
+    // Parse hole number ranges. 
+    if (holeNumberStr.size() != 0) {
+        if (not holeNumberRanges.setRanges(holeNumberStr)) {
+            cout << "Could not parse hole number ranges: "
+                 << holeNumberStr << "." << endl;
+            exit(1);
+        } 
+    }
+
+    // Open output file.
+    ostream * outFilePtr = &cout;
+	ofstream outFileStrm;
+	if (outFileName != "") {
+		CrucialOpen(outFileName, outFileStrm, std::ios::out);
+		outFilePtr = &outFileStrm;
+	}
+    
+    GFFFile adapterGffFile;
+    if (adapterGffFileName != "")
+        adapterGffFile.ReadAll(adapterGffFileName);
+    
+    SAMReader<SAMFullReferenceSequence, SAMReadGroup, SAMAlignment> samReader;
+    FASTAReader fastaReader;
+
+    //
+    // Initialize samReader and fastaReader.
+    //
+    samReader.Initialize(samFileName);
+    fastaReader.Initialize(refFileName);
+
+    //
+    // Configure the file log.
+    //
+    string command;
+    CommandLineParser::CommandLineToString(argc, argv, command);
+    string log = "Filter sam hits.";
+    string program = "samFilter";
+    string versionString = VERSION;
+    AppendPerforceChangelist(PERFORCE_VERSION_STRING, versionString);
+
+    //
+    // Read necessary input.
+    //
+    vector<FASTASequence> references;
+    fastaReader.ReadAllSequences(references);
+
+    // If the SAM file is generated by blasr with -titleTable,
+    // then references in the SAM are represented by 
+    // their corresponding indices in the title table.
+    // In that case, we need to convert reference titles in fasta file
+    // to their corresponding indices in the title table, such that
+    // references in both SAM and fasta files are represented
+    // by title table indices and therefore can match.
+    if (titleTableName != "") {
+        ConvertTitlesToTitleTableIndices(references, titleTableName);
+    }
+ 
+    AlignmentSet<SAMFullReferenceSequence, SAMReadGroup, SAMAlignment> alignmentSet;
+    vector<string> allHeaders = samReader.ReadHeader(alignmentSet); 
+
+    // Process SAM Header.
+    string commandLineString;
+    clp.CommandLineToString(argc, argv, commandLineString);
+    allHeaders.push_back("@PG\tID:SAMFILTER\tVN:" + versionString + \
+                         "\tCL:" + program + " " + commandLineString);
+    for (int i = 0; i < allHeaders.size(); i++) {
+        outFileStrm << allHeaders[i] << endl;
+    }
+
+    //
+    // The order of references in vector<FASTASequence> references and
+    // AlignmentSet<, , >alignmentSet.references can be different.
+    // Rearrange alignmentSet.references such that they are ordered in
+    // exactly the same way as vector<FASTASequence> references.
+    //
+    alignmentSet.RearrangeReferences(references);
+
+    // Map reference name obtained from SAM file to indices
+    map<string, int> refNameToIndex;
+    for (int i = 0; i < references.size(); i++) {
+        string refName = alignmentSet.references[i].GetSequenceName();
+        refNameToIndex[refName] = i;
+    }
+
+    //
+    // Store the alignments.
+    //
+    SAMAlignment samAlignment;
+    int alignIndex = 0; 
+
+    //
+    // For 150K, each chip produces about 300M sequences 
+    // (not including quality values and etc.).
+    // Let's assume that the sam file and reference data can 
+    // fit in the memory. 
+    // Need to scale for larger sequal data in the future.
+    //
+    vector<SAMAlignment> allSAMAlignments;
+    while (samReader.GetNextAlignment(samAlignment)) {
+        if (samAlignment.rName == "*") {
+            continue;
+        }
+
+        if (parseSmrtTitle and holeNumberStr.size() != 0) {
+            string movieName;
+            int thisHoleNumber;
+            if (not ParsePBIReadName(samAlignment.qName, 
+                                     movieName, 
+                                     thisHoleNumber)) {
+                cout << "ERROR, could not parse SMRT title: "
+                     << samAlignment.qName << "." << endl;
+                exit(1);
+            }
+            if (not holeNumberRanges.contains(UInt(thisHoleNumber))) {
+                if (verbose) 
+                    cout << thisHoleNumber << " is not in range." << endl; 
+                continue;
+            }
+        }
+
+        if (samAlignment.cigar.find('P') != string::npos) {
+            cout << "WARNING. Could not process SAM record with 'P' in "
+                 << "its cigar string." << endl;
+            continue;
+        }
+
+        vector<AlignmentCandidate<> > convertedAlignments;
+        SAMAlignmentsToCandidates(samAlignment, 
+                references, refNameToIndex,
+                convertedAlignments, parseSmrtTitle, false);
+        
+        if (convertedAlignments.size() > 1) {
+            cout << "WARNING. Ignore multiple segments." << endl;
+            continue;
+        }
+
+        for (int i = 0; i < 1; i++) {
+            AlignmentCandidate<> & alignment = convertedAlignments[i];
+
+            //score func does not matter
+            DistanceMatrixScoreFunction<DNASequence, DNASequence> distFunc; 
+            ComputeAlignmentStats(alignment, alignment.qAlignedSeq.seq, 
+                                  alignment.tAlignedSeq.seq, distFunc);
+                                  
+            // Check whether this alignment can only map to adapters in 
+            // the adapter GFF file.
+            if (adapterGffFileName != "" and 
+                CheckAdapterOnly(adapterGffFile, alignment, refNameToIndex)) {
+                if (verbose)
+                    cout << alignment.qName << " filter adapter only."
+                         << endl;
+                continue;
+            }
+
+            // Assign score to samAlignment.
+            samAlignment.score = samAlignment.as;
+
+            if (not filterCriteria.Satisfy(static_cast<AlignmentCandidate<> *>(&alignment))) {
+                continue;
+            }
+            allSAMAlignments.push_back( samAlignment ); 
+
+            alignment.FreeSubsequences();
+        }
+        ++alignIndex;
+    }
+
+    // Sort all SAM alignments by qName, score and target position.
+    sort(allSAMAlignments.begin(), allSAMAlignments.end(), 
+         byQNameScoreTStart);
+
+    unsigned int groupBegin = 0;
+    unsigned int groupEnd = -1;
+    vector<SAMAlignment> filteredSAMAlignments;
+    while(groupBegin < allSAMAlignments.size()) {
+        // Get the next group of SAM alignments which have the same qName
+        // from allSAMAlignments[groupBegin ... groupEnd)
+        GetNextSAMAlignmentGroup(allSAMAlignments, groupBegin, groupEnd);
+        vector<unsigned int> hitIndices = ApplyHitPolicy(
+                hitPolicy, allSAMAlignments, groupBegin, groupEnd);
+        for(unsigned int i = 0; i < hitIndices.size(); i++) {
+            filteredSAMAlignments.push_back(allSAMAlignments[hitIndices[i]]);
+        }
+        groupBegin = groupEnd;
+    }
+
+    // Sort all SAM alignments by reference name and query name
+    sort(filteredSAMAlignments.begin(), filteredSAMAlignments.end(), 
+         byRNameQName);
+
+    for(unsigned int i = 0; i < filteredSAMAlignments.size(); i++) {
+        filteredSAMAlignments[i].PrintSAMAlignment(outFileStrm);
+    }
+
+	if (outFileName != "") {
+		outFileStrm.close();
+	}
+#ifdef USE_GOOGLE_PROFILER
+  ProfilerStop();
+#endif
+    return 0;
+}
diff --git a/utils/SamToCmpH5.cpp b/utils/SamToCmpH5.cpp
new file mode 100644
index 0000000..e6219e0
--- /dev/null
+++ b/utils/SamToCmpH5.cpp
@@ -0,0 +1,209 @@
+#include <iostream>
+
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "sam/SAMReader.hpp"
+#include "format/StickAlignmentPrinter.hpp"
+#include "HDFCmpFile.hpp"
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+#include "CommandLineParser.hpp"
+#include "datastructures/alignmentset/AlignmentSetToCmpH5Adapter.hpp"
+#include "datastructures/alignment/SAMToAlignmentCandidateAdapter.hpp"
+#include "ChangeListID.hpp"
+#include "utils/TimeUtils.hpp"
+
+char VERSION[] = "v1.0.0";
+char PERFORCE_VERSION_STRING[] = "$Change: 141782 $";
+
+int main(int argc, char* argv[]) {
+  string program = "samtoh5";
+  string versionString = VERSION;
+  AppendPerforceChangelist(PERFORCE_VERSION_STRING, versionString);
+  string samFileName, cmpFileName, refFileName;
+  bool parseSmrtTitle = false;
+  bool useShortRefName = false;
+  bool copyQVs = false;
+  CommandLineParser clp;
+  string readType = "standard";
+  int verbosity = 0;
+
+  clp.SetProgramName(program);
+  clp.SetProgramSummary("Converts in.sam file to out.cmp.h5 file.");
+  clp.SetVersion(versionString);
+
+  clp.RegisterStringOption("in.sam", &samFileName, 
+                           "Input SAM file.", true);
+  clp.RegisterStringOption("reference.fasta", &refFileName, 
+                           "Reference used to generate reads.", true);
+  clp.RegisterStringOption("out.cmp.h5", &cmpFileName, 
+                           "Output cmp.h5 file.", true);
+  clp.RegisterPreviousFlagsAsHidden();
+  clp.RegisterFlagOption("smrtTitle", &parseSmrtTitle, 
+                         "Use this option when converting alignments "
+                         "generated from reads produced by the "
+                         "pls2fasta from bas.h5 files by parsing read "
+                         "coordinates from the SMRT read title.  The title " 
+                         "is in the format /name/hole/coordinates, where "
+                         "coordinates are in the format \\d+_\\d+, and "
+                         "represent the interval of the read that was "
+                         "aligned.");
+  clp.RegisterStringOption("readType", &readType, 
+                         "Set the read type: 'standard', 'strobe', 'CCS', "
+                         "or 'cDNA'");
+  clp.RegisterIntOption("verbosity", &verbosity, 
+                         "Set desired verbosity.", 
+                         CommandLineParser::PositiveInteger);
+  clp.RegisterFlagOption("useShortRefName", &useShortRefName, 
+                         "Use abbreviated reference names obtained "
+                         "from file.sam instead of using full names "
+                         "from reference.fasta.");
+  clp.RegisterFlagOption("copyQVs", &copyQVs,
+                         "Copy all QVs available in the SAM file into the "
+                         "cmp.h5 file. This includes things like InsertionQV "
+                         "and DeletionTag.");
+  string description = ("Because SAM has optional tags that have different "
+    "meanings in different programs, careful usage is required in order to "
+    "have proper output. The \"xs\" tag in bwa-sw is used to show the "
+    "suboptimal score, but in PacBio SAM (blasr) it is defined as the start "
+    "in the query sequence of the alignment.\nWhen \"-smrtTitle\" is "
+    "specified, the xs tag is ignored, but when it is not specified, the "
+    "coordinates given by the xs and xe tags are used to define the interval "
+    "of a read that is aligned. The CIGAR string is relative to this interval.");
+  clp.SetExamples(description);
+
+  clp.ParseCommandLine(argc, argv);
+
+  if (readType != "standard" and readType != "strobe" and 
+      readType != "cDNA" and readType != "CCS") {
+    cout << "ERROR. Read type '" << readType 
+         << "' must be one of either 'standard', 'strobe', 'cDNA' or 'CCS'." 
+         << endl;
+    exit(1);
+  }
+    
+  cerr << "[INFO] " << GetTimestamp() << " [" << program << "] started." << endl;
+
+  SAMReader<SAMFullReferenceSequence, SAMReadGroup, SAMPosAlignment> samReader;
+  FASTAReader fastaReader;
+  HDFCmpFile<AlignmentCandidate<FASTASequence, FASTASequence> > cmpFile;
+
+  //
+  // Initialize input/output files.
+  //
+  samReader.Initialize(samFileName);
+  fastaReader.Initialize(refFileName);
+  cmpFile.Create(cmpFileName);
+
+  //
+  // Configure the file log.
+  //
+  string command;
+  CommandLineParser::CommandLineToString(argc, argv, command);
+  string log = "Convert sam to cmp.h5";
+  cmpFile.fileLogGroup.AddEntry(command, log, program, GetTimestamp(), versionString);
+
+  //
+  // Set the readType
+  //
+  cmpFile.SetReadType(readType);
+
+  //
+  // Read necessary input.
+  //
+
+  vector<FASTASequence> references;
+  fastaReader.ReadAllSequences(references);
+  
+  //
+  // This should probably be handled by the alignmentSetAdapter, but
+  // time constraints...
+  //
+  AlignmentSet<SAMFullReferenceSequence, SAMReadGroup, SAMPosAlignment> alignmentSet;
+  samReader.ReadHeader(alignmentSet);
+ 
+  //
+  // The order of references in vector<FASTASequence> references and
+  // AlignmentSet<, , >alignmentSet.references can be different.
+  // Rearrange alignmentSet.references such that it is ordered in
+  // exactly the same way as vector<FASTASequence> references.
+  //
+  alignmentSet.RearrangeReferences(references);
+
+  //
+  // Always recompute the MD5 values even if they exist in the input
+  // sam file. Because MD5 is defined differently in sam and cmp.h5 files.
+  // The SAM convention uppercases and normalizes before computing the MD5. 
+  // For cmp.h5, we compute the MD5 on the sequence 'as is'.
+  // 
+  for(int i = 0; i < alignmentSet.references.size(); i++) {
+      MakeMD5((const char*)&references[i].seq[0], 
+              (unsigned int)references[i].length, alignmentSet.references[i].md5);
+  }
+ 
+  //
+  // Map short names for references obtained from file.sam to full names obtained from reference.fasta
+  //
+  map<string, string> shortRefNameToFull;
+  map<string, string>::iterator it;
+  assert(references.size() == alignmentSet.references.size());
+  if (!useShortRefName) {
+      for (int i = 0; i < references.size(); i++) {
+          string shortRefName = alignmentSet.references[i].GetSequenceName();
+          string fullRefName(references[i].title); 
+          if (shortRefNameToFull.find(shortRefName) != shortRefNameToFull.end()) {
+              cout << "ERROR, Found more than one reference " << shortRefName << "in sam header" << endl;
+              exit(1);
+          } 
+          shortRefNameToFull[shortRefName] = fullRefName;
+          alignmentSet.references[i].sequenceName = fullRefName;
+      }
+  }
+
+  //
+  // Start setting up the cmp.h5 file.
+  //
+  AlignmentSetToCmpH5Adapter<HDFCmpFile<AlignmentCandidate<FASTASequence, FASTASequence> > > alignmentSetAdapter;
+  alignmentSetAdapter.Initialize();
+  alignmentSetAdapter.StoreReferenceInfo(alignmentSet.references, cmpFile);
+  
+  //
+  // Store the alignments.
+  //
+  SAMAlignment samAlignment;
+  while (samReader.GetNextAlignment(samAlignment)) {
+    if (samAlignment.rName == "*") {
+      continue;
+    }
+    if (!useShortRefName) {
+        //convert shortRefName to fullRefName
+        it = shortRefNameToFull.find(samAlignment.rName);
+        if (it == shortRefNameToFull.end()) {
+            cout << "ERROR, Could not find " << samAlignment.rName << " in the reference repository." << endl;
+            exit(1);
+        }
+        samAlignment.rName = (*it).second;
+    }
+    vector<AlignmentCandidate<> > convertedAlignments;
+    if (verbosity > 0) {
+      cout << "Storing alignment for " << samAlignment.qName << endl;
+    }
+    SAMAlignmentsToCandidates(samAlignment, 
+        // Order of references and alignmentSetAdapter.RefInfoGroup
+        // should be exactly the same.
+        references, alignmentSetAdapter.refNameToRefInfoIndex,
+        convertedAlignments, parseSmrtTitle, false,
+        copyQVs);
+    
+    // -1: moleculeID will be computed dynamically.
+    // o.w., the value will be assigned as moleculeID.
+    alignmentSetAdapter.StoreAlignmentCandidateList(convertedAlignments, cmpFile, -1, copyQVs);
+
+    int a;
+    for (a = 0; a < convertedAlignments.size(); a++) {
+      convertedAlignments[a].FreeSubsequences();
+    }
+  }
+
+  cerr << "[INFO] " << GetTimestamp() << " [" << program << "] ended." << endl;
+  return 0;
+}
diff --git a/utils/SamToM4.cpp b/utils/SamToM4.cpp
new file mode 100644
index 0000000..6933688
--- /dev/null
+++ b/utils/SamToM4.cpp
@@ -0,0 +1,222 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  SamToM4.cpp
+ *
+ *    Description:  Convert a sam file to a blasr m4 file.
+ *
+ *        Version:  1.0
+ *        Created:  04/03/2013 01:19:43 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  Yuan Li (yli), yli at pacificbiosciences.com
+ *        Company:  Pacific Biosciences
+ *
+ * =====================================================================================
+ */
+#include <iostream>
+#include "FASTASequence.hpp"
+#include "FASTAReader.hpp"
+#include "CommandLineParser.hpp"
+#include "ChangeListID.hpp"
+#include "algorithms/alignment/DistanceMatrixScoreFunction.hpp"
+#include "algorithms/alignment/AlignmentUtils.hpp"
+#include "sam/SAMReader.hpp"
+#include "format/IntervalPrinter.hpp"
+#include "datastructures/alignment/AlignmentCandidate.hpp"
+#include "datastructures/alignment/SAMToAlignmentCandidateAdapter.hpp"
+
+char VERSION[] = "v0.1.0";
+char PERFORCE_VERSION_STRING[] = "$Change: 126414 $";
+ 
+int main(int argc, char* argv[]) {
+    string program = "samtom4";
+    string versionString = VERSION;
+    AppendPerforceChangelist(PERFORCE_VERSION_STRING, versionString);
+
+    string samFileName, refFileName, outFileName;
+    bool printHeader = false;
+    bool parseSmrtTitle = false;
+    bool useShortRefName = false;
+
+    CommandLineParser clp;
+    clp.SetProgramName(program);
+    clp.SetVersion(versionString);
+    clp.SetProgramSummary("Converts a SAM file generated by blasr to M4 format.");
+    clp.RegisterStringOption("in.sam",        &samFileName,
+                             "Input SAM file, which is produced by blasr.");
+    clp.RegisterStringOption("reference.fasta", &refFileName,
+                             "Reference used to generate file.sam.");
+    clp.RegisterStringOption("out.m4",          &outFileName,
+                             "Output in blasr M4 format.");
+    clp.RegisterPreviousFlagsAsHidden();
+    clp.RegisterFlagOption("header",            &printHeader,
+                           "Print M4 header.");
+    clp.RegisterFlagOption("useShortRefName",   &useShortRefName, 
+                           "Use abbreviated reference names obtained "
+                           "from file.sam instead of using full names "
+                           "from reference.fasta.");
+    //clp.SetExamples(program + " file.sam reference.fasta out.m4");
+
+    clp.ParseCommandLine(argc, argv);
+
+    ostream * outFilePtr = &cout;
+	ofstream outFileStrm;
+	if (outFileName != "") {
+		CrucialOpen(outFileName, outFileStrm, std::ios::out);
+		outFilePtr = &outFileStrm;
+	}
+
+    SAMReader<SAMFullReferenceSequence, SAMReadGroup, SAMAlignment> samReader;
+    FASTAReader fastaReader;
+
+    //
+    // Initialize samReader and fastaReader.
+    //
+    samReader.Initialize(samFileName);
+    fastaReader.Initialize(refFileName);
+
+    //
+    // Configure the file log.
+    //
+    string command;
+    CommandLineParser::CommandLineToString(argc, argv, command);
+
+    //
+    // Read necessary input.
+    //
+    vector<FASTASequence> references;
+    fastaReader.ReadAllSequences(references);
+
+    AlignmentSet<SAMFullReferenceSequence, SAMReadGroup, SAMAlignment> alignmentSet;
+    samReader.ReadHeader(alignmentSet); 
+
+    //
+    // The order of references in vector<FASTASequence> references and
+    // AlignmentSet<, , >alignmentSet.references can be different.
+    // Rearrange alignmentSet.references such that it is ordered in
+    // exactly the same way as vector<FASTASequence> references.
+    //
+    alignmentSet.RearrangeReferences(references);
+
+    //
+    // Map short names for references obtained from file.sam to 
+    // full names obtained from reference.fasta
+    //
+    map<string, string> shortRefNameToFull;
+    map<string, string>::iterator it;
+    assert(references.size() == alignmentSet.references.size());
+    if (!useShortRefName) {
+        for (int i = 0; i < references.size(); i++) {
+            string shortRefName = alignmentSet.references[i].GetSequenceName();
+            string fullRefName(references[i].title); 
+            if (shortRefNameToFull.find(shortRefName) != shortRefNameToFull.end()) {
+                cout << "ERROR, Found more than one reference " << shortRefName << "in sam header" << endl;
+                exit(1);
+            } 
+            shortRefNameToFull[shortRefName] = fullRefName;
+            alignmentSet.references[i].sequenceName = fullRefName;
+        }
+    }
+
+    // Map reference name obtained from SAM file to indices
+    map<string, int> refNameToIndex;
+    for (int i = 0; i < references.size(); i++) {
+        string refName = alignmentSet.references[i].GetSequenceName();
+        refNameToIndex[refName] = i;
+    }
+
+    //
+    // Store the alignments.
+    //
+    SAMAlignment samAlignment;
+    int alignIndex = 0; 
+
+    //
+    // For 150K, each chip produces about 300M sequences 
+    // (not including quality values and etc.).
+    // Let's assume that the sam file and reference data can 
+    // fit in the memory. 
+    // Need to scale for larger sequal data in the future.
+    //
+    if (printHeader)
+        IntervalOutput::PrintHeader(*outFilePtr);
+
+    // The socre matrix does not matter because we will use the 
+    // aligner's score from SAM file anyway.
+    DistanceMatrixScoreFunction<DNASequence, DNASequence> distScoreFn;
+
+    while (samReader.GetNextAlignment(samAlignment)) {
+        if (samAlignment.rName == "*") {
+            continue;
+        }
+
+        if (!useShortRefName) {
+            //convert shortRefName to fullRefName
+            it = shortRefNameToFull.find(samAlignment.rName);
+            if (it == shortRefNameToFull.end()) {
+                cout << "ERROR, Could not find " << samAlignment.rName << " in the reference repository." << endl;
+                exit(1);
+            }
+            samAlignment.rName = (*it).second;
+        }
+
+        // The padding character 'P' is not supported
+        if (samAlignment.cigar.find('P') != string::npos) {
+            cout << "WARNING. Could not process sam record with 'P' in its cigar string."
+                 << endl;
+            continue;
+        }
+
+        vector<AlignmentCandidate<> > convertedAlignments;
+
+        //
+        // Keep reference as forward.
+        // So if IsReverseComplement(sam.flag)==true, then qStrand is reverse
+        // and tStrand is forward.
+        //
+        bool keepRefAsForward = false;
+
+        SAMAlignmentsToCandidates(samAlignment, references, refNameToIndex,
+                                  convertedAlignments, parseSmrtTitle, 
+                                  keepRefAsForward);
+
+        if (convertedAlignments.size() > 1) {
+            cout << "WARNING. Ignore an alignment which has multiple segments." << endl;
+            continue;
+        }
+
+        //all alignments are unique single-ended alignments.
+        for (int i = 0; i < 1; i++) {
+            AlignmentCandidate<> & alignment = convertedAlignments[i];
+
+            ComputeAlignmentStats(alignment, alignment.qAlignedSeq.seq, 
+                                  alignment.tAlignedSeq.seq, distScoreFn);
+
+            // Use aligner's score from SAM file anyway.
+            alignment.score = samAlignment.as;
+            alignment.mapQV = samAlignment.mapQV;
+
+            // Since SAM only has the aligned sequence, many info of the 
+            // original query (e.g. the full length) is missing. 
+            // Overwrite alignment.qLength (which is length of the query
+            // in the SAM alignment) with xq (which is the length of the 
+            // original query sequence saved by blasr) right before printing 
+            // the output so that one can reconstruct a blasr m4 record from 
+            // a blasr sam alignment.
+            if (samAlignment.xq!=0)
+                alignment.qLength = samAlignment.xq;
+
+            IntervalOutput::PrintFromSAM(alignment, *outFilePtr);
+
+            alignment.FreeSubsequences();
+        }
+        ++alignIndex;
+    }
+
+	if (outFileName != "") {
+		outFileStrm.close();
+	}
+    return 0;
+}
diff --git a/utils/ToAfg.cpp b/utils/ToAfg.cpp
new file mode 100644
index 0000000..2d0a82f
--- /dev/null
+++ b/utils/ToAfg.cpp
@@ -0,0 +1,178 @@
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "HDFPlsReader.hpp"
+#include "amos/AfgBasWriter.hpp"
+#include "HDFRegionTableReader.hpp"
+#include "reads/RegionTable.hpp"
+#include "reads/ReadInterval.hpp"
+#include "files/ReaderAgglomerate.hpp"
+#include "utils/FileOfFileNames.hpp"
+#include "utils/RegionUtils.hpp"
+#include "SMRTSequence.hpp"
+#include "utils.hpp"
+
+using namespace std;
+void PrintUsage() {
+        cout << "usage: toAfg input.filetype output.filetype" << endl
+                 << "                                         [-minSubreadLength l] " << endl
+                 << "                                         [-regionTable regions_file] " << endl
+                 << "                                         [-noSplitSubreads]" << endl
+                 << "                                         [-useccsdenovo]" << endl
+                 << "                                         [-uniformQV QV]" << endl 
+        << "Print reads stored in a file (pls|fasta|fastq) as an afg." << endl;
+}
+int main(int argc, char* argv[]) {
+
+    string inputFileName, outputFileName;
+
+    if (argc < 2) {
+        PrintUsage();
+        exit(1);
+    }
+    vector<string> inputFileNames;
+    inputFileName = argv[1];
+    outputFileName = argv[2];
+    int argi = 3;
+    RegionTable regionTable;
+    string regionsFOFNName = "";
+    vector<string> regionFileNames;
+    bool splitSubreads = true;
+    bool useCCS = false;
+    bool useUniformQV = false;
+    int uniformQV = 7;
+    int minSubreadLength = 1;
+    while (argi < argc) {
+        if (strcmp(argv[argi], "-regionTable") == 0) {
+            regionsFOFNName = argv[++argi];
+        }
+        else if (strcmp(argv[argi], "-noSplitSubreads") == 0) {
+            splitSubreads = false;
+        }
+        else if (strcmp(argv[argi], "-minSubreadLength") == 0) {
+            minSubreadLength = atoi(argv[++argi]);
+        }
+        else if (strcmp(argv[argi], "-useccsdenovo") == 0) {
+            useCCS = true;
+        }
+        else if (strcmp(argv[argi], "-uniformQV") == 0) {
+            useUniformQV = true;
+            uniformQV = atoi(argv[++argi]);
+        }
+        else {
+            PrintUsage();
+            cout << "ERROR! Option " << argv[argi] << " is not supported." << endl;
+        }
+        argi++;
+    }
+         
+    if (FileOfFileNames::IsFOFN(inputFileName)) {
+        FileOfFileNames::FOFNToList(inputFileName, inputFileNames);
+    }
+    else {
+        inputFileNames.push_back(inputFileName);
+    }
+    if (regionsFOFNName == "") {
+        regionFileNames = inputFileNames;
+    }
+    else {
+        if (FileOfFileNames::IsFOFN(regionsFOFNName)) {
+            FileOfFileNames::FOFNToList(regionsFOFNName, regionFileNames);
+        }
+        else {
+            regionFileNames.push_back(regionsFOFNName);
+        }
+    }
+
+    ofstream fastaOut;
+    CrucialOpen(outputFileName, fastaOut);
+    int plsFileIndex;
+    HDFRegionTableReader hdfRegionReader;
+    AfgBasWriter afgWriter;
+    if (useUniformQV){
+        afgWriter.SetDefaultQuality(uniformQV);
+    }
+
+    afgWriter.Initialize(outputFileName);
+
+    for (plsFileIndex = 0; plsFileIndex < inputFileNames.size(); plsFileIndex++) {
+        if (splitSubreads) {
+            hdfRegionReader.Initialize(regionFileNames[plsFileIndex]);
+            hdfRegionReader.ReadTable(regionTable);
+            regionTable.SortTableByHoleNumber();
+        }
+        
+        ReaderAgglomerate reader;
+        // reader.SkipReadQuality(); // should have been taken care of by *Filter modules
+        if (useCCS){
+            reader.UseCCS();
+        } else {
+            reader.IgnoreCCS();
+        }
+        reader.Initialize(inputFileNames[plsFileIndex]);
+        CCSSequence seq; 
+        int seqIndex = 0;
+        int numRecords = 0;
+        vector<ReadInterval> subreadIntervals;
+        while (reader.GetNext(seq)){ 
+            ++seqIndex;
+
+            if (useUniformQV && seq.qual.data != NULL){
+                for (int qvIndex = 0; qvIndex < seq.length; qvIndex++){
+                    seq.qual[qvIndex] = uniformQV;
+                }
+            }
+
+            if (splitSubreads == false) {
+                if (seq.length >= minSubreadLength) {
+                    afgWriter.Write(seq);
+                }
+                seq.Free();
+                continue;
+            }
+
+
+            DNALength hqReadStart, hqReadEnd;
+            int score;
+            GetReadTrimCoordinates(seq, seq.zmwData, regionTable, hqReadStart, hqReadEnd, score);
+            subreadIntervals.clear(); // clear old, new intervals are appended.
+            CollectSubreadIntervals(seq,&regionTable, subreadIntervals);
+
+            if (seq.length == 0 and subreadIntervals.size() > 0) {
+                cout << "WARNING! A high quality interval region exists for a read of length 0." <<endl;
+                cout << "  The offending ZMW number is " << seq.zmwData.holeNumber << endl;
+                seq.Free();
+                continue;
+            }
+
+
+            for (int intvIndex = 0; intvIndex < subreadIntervals.size(); intvIndex++) {
+                SMRTSequence subreadSequence;
+                
+                int subreadStart = subreadIntervals[intvIndex].start > hqReadStart ? 
+                                   subreadIntervals[intvIndex].start : hqReadStart;
+                int subreadEnd   = subreadIntervals[intvIndex].end < hqReadEnd ?
+                                   subreadIntervals[intvIndex].end : hqReadEnd;
+                int subreadLength = subreadEnd - subreadStart;
+
+                if (subreadLength < minSubreadLength) continue;
+
+                subreadSequence.subreadStart = subreadStart;
+                subreadSequence.subreadEnd   = subreadEnd;
+                subreadSequence.ReferenceSubstring(seq, subreadStart, subreadLength);      
+
+            
+                stringstream titleStream;
+                titleStream << seq.title << "/" << subreadIntervals[intvIndex].start 
+                                         << "_" << subreadIntervals[intvIndex].end;
+                subreadSequence.CopyTitle(titleStream.str());
+                afgWriter.Write(subreadSequence);
+            }
+            seq.Free();
+        }
+        reader.Close();
+        hdfRegionReader.Close();
+    }
+}
diff --git a/utils/ctest/loadPulses.t b/utils/ctest/loadPulses.t
new file mode 100644
index 0000000..8b07e2f
--- /dev/null
+++ b/utils/ctest/loadPulses.t
@@ -0,0 +1,193 @@
+Set up directories
+  $ . $TESTDIR/setup.sh 
+
+Set up the executable: loadPulses.
+  $ EXEC=$TESTDIR/../loadPulses
+
+#Test loadPulses: input is a pls.h5 file
+#Test -byread and -bymetric
+  $ PLS_IN=$DATDIR/ecoli_lp.fofn
+  $ CMP_IN_2=$DATDIR/ecoli_lp_tiny.cmp.h5
+  $ CMP_STDOUT_2=$STDDIR/ecoli_lp_tiny.cmp.h5
+  $ CMP_OUT_byread_2=$OUTDIR/ecoli_lp_tiny.byread.cmp.h5
+  $ CMP_OUT_bymetric_2=$OUTDIR/ecoli_lp_tiny.bymetric.cmp.h5
+  $ METRICS=StartFrame,PulseWidth,WidthInFrames,pkmid,IPD,Light
+
+  $ rm -f  $CMP_OUT_byread_2
+  $ cp $CMP_IN_2 $CMP_OUT_byread_2
+  $ $EXEC $PLS_IN $CMP_OUT_byread_2 -metrics $METRICS -byread
+  [INFO] * [loadPulses] started. (glob)
+  loading 2 alignments for movie 1
+  loading 2 alignments for movie 2
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ h5diff -c $CMP_OUT_byread_2 $CMP_STDOUT_2
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+
+  $ rm -f $CMP_OUT_bymetric_2
+  $ cp $CMP_IN_2 $CMP_OUT_bymetric_2
+  $ $EXEC $PLS_IN $CMP_OUT_bymetric_2 -metrics $METRICS -bymetric 
+  [INFO] * [loadPulses] started. (glob)
+  loading 2 alignments for movie 1
+  loading 2 alignments for movie 2
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ h5diff -c $CMP_OUT_bymetric_2 $CMP_STDOUT_2 
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+
+#Test loadPulses for deep sorted cmp.h5
+  $ FOFN_IN=$DATDIR/ecoli_lp.fofn
+  $ CMP_IN_SORTED=$DATDIR/ecoli_lp_tiny_sorted.cmp.h5
+  $ CMP_STDOUT_SORTED=$STDDIR/ecoli_lp_tiny_sorted.cmp.h5
+  $ CMP_OUT_SORTED_bymetric=$OUTDIR/ecoli_lp_tiny_sorted_bymetric.cmp.h5
+  $ CMP_OUT_SORTED_byread=$OUTDIR/ecoli_lp_tiny_sorted_byread.cmp.h5
+  $ METRICS=StartFrame,PulseWidth,WidthInFrames,pkmid,IPD,Light,DeletionQV,InsertionQV,SubstitutionQV,MergeQV,QualityValue,DeletionTag,SubstitutionTag,ClassifierQV,PreBaseFrames,PulseIndex
+
+  $ rm -f $CMP_OUT_SORTED_bymetric
+  $ cp $CMP_IN_SORTED $CMP_OUT_SORTED_bymetric
+  $ $EXEC $FOFN_IN $CMP_OUT_SORTED_bymetric -bymetric -metrics $METRICS > $OUTDIR/tmp.log
+  [INFO] * [loadPulses] started. (glob)
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ h5diff -c $CMP_OUT_SORTED_bymetric $CMP_STDOUT_SORTED 
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+
+
+  $ rm -f  $CMP_OUT_SORTED_byread
+  $ cp $CMP_IN_SORTED $CMP_OUT_SORTED_byread
+  $ $EXEC $FOFN_IN $CMP_OUT_SORTED_byread -byread -metrics $METRICS > $OUTDIR/tmp.log
+  [INFO] * [loadPulses] started. (glob)
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ h5diff -c $CMP_OUT_SORTED_bymetric $CMP_STDOUT_SORTED 
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+
+#Test loadPulses for a zero-alignment cmp.h5 file.
+  $ FOFN_IN=$DATDIR/ecoli_lp.fofn
+  $ CMP_IN_NOALN=$DATDIR/noaln_lp.cmp.h5
+  $ $EXEC $FOFN_IN $CMP_IN_NOALN -byread -metrics $METRICS
+  [INFO] * [loadPulses] started. (glob)
+  WARNING, there is no alignment in the cmp file.
+  [INFO] * [loadPulses] ended. (glob)
+
+#Test loadPulses -byMetric with a 'large' bas.h5 file of which the dataset size is greater than maxElements. 
+  $ FOFN_IN=$DATDIR/ecoli_lp.fofn
+  $ CMP_IN=$DATDIR/ecoli_lp_tiny_sorted.cmp.h5
+  $ CMP_OUT=$OUTDIR/ecoli_lp_maxEle.cmp.h5
+  $ CMP_STDOUT=$STDDIR/ecoli_lp_maxEle.cmp.h5
+  $ METRICS=QualityValue,MergeQV,InsertionQV,DeletionQV,DeletionTag,PulseWidth,SubstitutionQV,SubstitutionTag
+  $ MAX_ELEMENTS=140000000
+
+  $ rm -f $CMP_OUT
+  $ cp $CMP_IN $CMP_OUT
+  $ $EXEC $FOFN_IN $CMP_OUT -bymetric -metrics $METRICS -maxElements $MAX_ELEMENTS
+  [INFO] * [loadPulses] started. (glob)
+  Either the number of elements exceeds maxElement (140000000). Or the estimated memory 
+  consumption exceeds maxMemory (4 GB).
+  Loading pulses from .+ by read. (re)
+  loading 2 alignments for movie 1
+  loading 2 alignments for movie 2
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ h5diff -c $CMP_OUT $CMP_STDOUT
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  dataset: </FileLog/Version> and </FileLog/Version>
+  \d+ differences found (re)
+  [1]
+
+#Test loadPulses -byMetric on a multi-streaming job.
+  $ FOFN_IN=$DATDIR/lambda_bax.fofn
+  $ CMP_IN=$DATDIR/lambda_bax.cmp.h5
+  $ CMP_OUT=$OUTDIR/lambda_bax.cmp.h5
+  $ CMP_STDOUT=$STDDIR/lambda_bax.cmp.h5
+  $ METRICS=QualityValue,MergeQV,InsertionQV,DeletionQV,DeletionTag,PulseWidth,SubstitutionQV,SubstitutionTag
+
+  $ rm -f $CMP_OUT
+  $ cp $CMP_IN $CMP_OUT
+  $ $EXEC $FOFN_IN $CMP_OUT -bymetric -metrics $METRICS 
+  [INFO] * [loadPulses] started. (glob)
+  WARNING: There is insufficient data to compute metric: MergeQV in the file .+ It will be ignored. (re)
+  loading 2 alignments for movie 1
+  loading 2 alignments for movie 1
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ h5diff -c $CMP_OUT $CMP_STDOUT
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  dataset: </FileLog/Version> and </FileLog/Version>
+  \d+ differences found (re)
+  [1]
+
+
+#Test loadPulses -bymetric for a ccs cmp.h5 file generated from multiple movies.
+  $ FOFN_IN=$DATDIR/ccs_lp.fofn
+  $ CMP_IN=$DATDIR/ccs_lp.cmp.h5
+  $ CMP_OUT=$OUTDIR/ccs_lp.cmp.h5
+
+# The original pls.h5 files disappeared, to use another dataset instead.
+  $ rm -f CMP_OUT
+  $ cp $CMP_IN $CMP_OUT
+  $ $EXEC $FOFN_IN $CMP_OUT -bymetric -metrics QualityValue
+  [INFO] * [loadPulses] started. (glob)
+  loading 100 alignments for movie 1
+  loading 45 alignments for movie 2
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ h5ls -r $CMP_OUT | grep "AlnInfo"
+  /AlnInfo                 Group
+  /AlnInfo/AlnIndex        Dataset {145/Inf, 22}
+  /AlnInfo/NumPasses       Dataset {145/Inf}
+
+
+#Test loadPulses *.fofn cmp.h5 where *.fofn can either contain ccs.h5 or bas.h5
+# and the cmp.h5 s readType is CCS
+  $ CCS_FOFN=$DATDIR/test_ccs.fofn
+  $ BAS_FOFN=$DATDIR/test_bas.fofn
+
+  $ CMP_IN=$DATDIR/test_ccs_bas.cmp.h5
+  $ CCS_OUT=$OUTDIR/test_ccs_bas_ccs.cmp.h5
+  $ BAS_OUT=$OUTDIR/test_ccs_bas_bas.cmp.h5
+
+  $ cp $CMP_IN $CCS_OUT 
+  $ cp $CMP_IN $BAS_OUT
+
+  $ $EXEC $CCS_FOFN $CCS_OUT -metrics QualityValue,DeletionQV,DeletionTag,InsertionQV,SubstitutionQV
+  [INFO] * [loadPulses] started. (glob)
+  loading 11 alignments for movie 1
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ sleep 1
+
+  $ $EXEC $BAS_FOFN $BAS_OUT -metrics QualityValue,DeletionQV,DeletionTag,InsertionQV,SubstitutionQV
+  [INFO] * [loadPulses] started. (glob)
+  loading 11 alignments for movie 1
+  [INFO] * [loadPulses] ended. (glob)
+ 
+  $ h5diff $CCS_OUT $BAS_OUT
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine> (glob)
+  * differences found (glob)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  * differences found (glob)
+  [1]
+
diff --git a/utils/ctest/loadPulses_fast.t b/utils/ctest/loadPulses_fast.t
new file mode 100644
index 0000000..d7999a1
--- /dev/null
+++ b/utils/ctest/loadPulses_fast.t
@@ -0,0 +1,41 @@
+Set up directories
+  $ . $TESTDIR/setup.sh 
+
+Set up the executable: loadPulses.
+  $ EXEC=$TESTDIR/../loadPulses
+
+#Test loadPulses: input is a bas.h5 file
+#Test -byread and -bymetric
+  $ BAS_IN_1=$DATDIR/lambda_lp.fofn
+  $ CMP_IN_1=$DATDIR/lambda_lp.cmp.h5
+  $ CMP_STDOUT_1=$STDDIR/lambda_lp.cmp.h5
+  $ CMP_OUT_byread_1=$OUTDIR/lambda.byread.cmp.h5
+  $ CMP_OUT_bymetric_1=$OUTDIR/lambda.bymetric.cmp.h5
+  $ METRICS=QualityValue,MergeQV,InsertionQV,DeletionQV,DeletionTag,PulseWidth,SubstitutionQV,SubstitutionTag
+
+  $ rm -f $CMP_OUT_byread_1
+  $ cp $CMP_IN_1 $CMP_OUT_byread_1
+  $ $EXEC $BAS_IN_1 $CMP_OUT_byread_1 -metrics $METRICS -byread > $OUTDIR/tmp.log
+  [INFO] * [loadPulses] started. (glob)
+  [INFO] * [loadPulses] ended. (glob)
+
+  $ h5diff -c $CMP_OUT_byread_1 $CMP_STDOUT_1
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+
+  $ rm -f $CMP_OUT_bymetric_1
+  $ cp $CMP_IN_1 $CMP_OUT_bymetric_1
+  $ $EXEC $BAS_IN_1 $CMP_OUT_bymetric_1 -metrics $METRICS -bymetric > $OUTDIR/tmp.log 
+  [INFO] * [loadPulses] started. (glob)
+  [INFO] * [loadPulses] ended. (glob)
+  $ h5diff -c $CMP_OUT_bymetric_1 $CMP_STDOUT_1 
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+
+
diff --git a/utils/ctest/pls2fasta.t b/utils/ctest/pls2fasta.t
new file mode 100644
index 0000000..124ae35
--- /dev/null
+++ b/utils/ctest/pls2fasta.t
@@ -0,0 +1,20 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: pls2fasta.
+  $ EXEC=$TESTDIR/../pls2fasta
+
+Test pls2fasta
+Condition: the order of region tables do not match the order bax.h5 files. 
+  $ $EXEC $DATDIR/test_pls2fasta.fofn $OUTDIR/test_pls2fasta.fa -regionTable $DATDIR/test_pls2fasta_rgn.fofn -trimByRegion
+  [INFO] * [pls2fasta] started. (glob)
+  [INFO] * [pls2fasta] ended. (glob)
+
+
+Test pls2fasta output fastq
+  $ $EXEC $DATDIR/ecoli_lp.fofn $OUTDIR/test_pls2fasta_ecoli.fq -trimByRegion -fastq
+  [INFO] * [pls2fasta] started. (glob)
+  [INFO] * [pls2fasta] ended. (glob)
+  $ echo $?
+  0
+  $ diff $OUTDIR/test_pls2fasta_ecoli.fq $STDDIR/test_pls2fasta_ecoli.fq
diff --git a/utils/ctest/pls2fasta_fast.t b/utils/ctest/pls2fasta_fast.t
new file mode 100644
index 0000000..d2cd862
--- /dev/null
+++ b/utils/ctest/pls2fasta_fast.t
@@ -0,0 +1,15 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: pls2fasta.
+  $ EXEC=$TESTDIR/../pls2fasta
+
+Test pls2fasta output fasta
+  $ $EXEC $DATDIR/ecoli_lp.fofn $OUTDIR/test_pls2fasta_ecoli.fa -trimByRegion
+  [INFO] * [pls2fasta] started. (glob)
+  [INFO] * [pls2fasta] ended. (glob)
+  $ echo $?
+  0
+  $ diff $OUTDIR/test_pls2fasta_ecoli.fa $STDDIR/test_pls2fasta_ecoli.fa
+
+
diff --git a/utils/ctest/samFilter.t b/utils/ctest/samFilter.t
new file mode 100644
index 0000000..9dfed3b
--- /dev/null
+++ b/utils/ctest/samFilter.t
@@ -0,0 +1,95 @@
+Set up 
+  $ . $TESTDIR/setup.sh
+
+Set up the executable: samFilter.
+  $ EXEC=$TESTDIR/../samFilter
+
+#Test samFilter with a *.sam file generated by blasr
+  $ OUTFILE=$OUTDIR/lambda_bax_filter_1.sam
+  $ STDFILE=$STDDIR/lambda_bax_filter_1.sam
+  $ TMP1=$OUTDIR/$$.tmp.out 
+  $ TMP2=$OUTDIR/$$.tmp.stdout 
+
+  $ rm -f $OUTFILE
+  $ $EXEC $DATDIR/lambda_bax.sam $DATDIR/lambda_ref.fasta $OUTFILE -minAccuracy 70 -minPctSimilarity 30 -hitPolicy all
+  $ tail -n+7 $OUTFILE |sort > $TMP1 
+  $ tail -n+7 $STDFILE |sort > $TMP2 
+  $ diff $TMP1 $TMP2 
+  $ rm $TMP1 $TMP2 
+
+#Test whether minAccuracy and minPctSimilarity can be float.
+#  $ rm -f $OUTFILE
+#  $ $EXEC $DATDIR/lambda_bax.sam $DATDIR/lambda_ref.fasta $OUTFILE -minAccuracy 70.0 -minPctSimilarity 30.0 -hitPolicy all
+#  $ tail -n+7 $OUTFILE | sort > $TMP1 
+#  $ tail -n+7 $STDFILE | sort > $TMP2 
+#  $ diff $TMP1 $TMP2 
+#  $ rm $TMP1 $TMP2 
+
+#Test samFilter with -hitPolicy allbest
+  $ OUTFILE=$OUTDIR/lambda_bax_filter_2.sam
+  $ STDFILE=$STDDIR/lambda_bax_filter_2.sam
+
+  $ rm -f $OUTFILE
+  $ $EXEC $DATDIR/lambda_bax.sam $DATDIR/lambda_ref.fasta $OUTFILE -hitPolicy allbest
+  $ tail -n+7 $OUTFILE > $TMP1 
+  $ tail -n+7 $STDFILE > $TMP2 
+  $ diff $TMP1 $TMP2 
+  $ rm $TMP1 $TMP2 
+
+#Test samFilter with -hitPolicy random   
+  $ OUTFILE=$OUTDIR/lambda_bax_filter_3.sam
+  $ STDFILE=$STDDIR/lambda_bax_filter_3.sam
+
+  $ rm -f $OUTFILE
+  $ $EXEC $DATDIR/lambda_bax.sam $DATDIR/lambda_ref.fasta $OUTFILE -hitPolicy random
+  $ tail -n+7 $OUTFILE > $TMP1 
+  $ tail -n+7 $STDFILE > $TMP2 
+  $ diff $TMP1 $TMP2 
+  $ rm $TMP1 $TMP2 
+
+#Test samFilter with -hitPolicy randombest   
+  $ OUTFILE=$OUTDIR/lambda_bax_filter_4.sam
+  $ STDFILE=$STDDIR/lambda_bax_filter_4.sam
+
+  $ rm -f $OUTFILE
+  $ $EXEC $DATDIR/lambda_bax.sam $DATDIR/lambda_ref.fasta $OUTFILE -hitPolicy randombest 
+  $ tail -n+7 $OUTFILE > $TMP1 
+  $ tail -n+7 $STDFILE > $TMP2 
+  $ diff $TMP1 $TMP2 
+  $ rm $TMP1 $TMP2 
+
+
+# Test samFilter with -hitPolicy leftmost
+  $ OUTFILE=$OUTDIR/test_leftmost_out.sam
+
+  $ rm -f $OUTFILE
+  $ $EXEC $DATDIR/test_leftmost.sam $DATDIR/test_leftmost_target.fasta $OUTFILE -hitPolicy leftmost 
+  $ tail -n+6 $OUTFILE |cut -f 4 
+  1
+
+  $ OUTFILE=$OUTDIR/lambda_bax_filter_5.sam
+  $ STDFILE=$STDDIR/lambda_bax_filter_5.sam
+
+  $ rm -f $OUTFILE
+  $ $EXEC $DATDIR/lambda_bax.sam $DATDIR/lambda_ref.fasta $OUTFILE 
+  $ tail -n+7 $OUTFILE > $TMP1 
+  $ tail -n+7 $STDFILE > $TMP2 
+  $ diff $TMP1 $TMP2 
+  $ rm $TMP1 $TMP2 
+
+#Test samFilter with -holeNumbers
+  $ OUTFILE=$OUTDIR/lambda_bax_filter_6.sam
+  $ STDFILE=$STDDIR/lambda_bax_filter_6.sam
+
+  $ rm -f $OUTFILE
+  $ $EXEC $DATDIR/lambda_bax.sam $DATDIR/lambda_ref.fasta $OUTFILE -holeNumbers 101350-105000,21494 
+  $ tail -n+7 $OUTFILE > $TMP1 
+  $ tail -n+7 $STDFILE > $TMP2 
+  $ diff $TMP1 $TMP2 
+  $ rm $TMP1 $TMP2 
+
+#Test samFilter with -filterAdapterOnly
+  $ $EXEC $DATDIR/filterAdapterOnly.sam $DATDIR/references/H1_6_Scal_6x/sequence/H1_6_Scal_6x.fasta $OUTDIR/filterAdapterOnly.sam -filterAdapterOnly $DATDIR/references/H1_6_Scal_6x/annotations/H1_6_Scal_6x_adapters.gff
+  $ tail -n+6 $OUTDIR/filterAdapterOnly.sam |cut -f 1,2,3,4
+  m130302_124313_42130_c100502672550000001523078308081365_s1_p0/10817\t16\t11k_plasmidbell_H1_6_Scal_6x\t29466 (esc)
+
diff --git a/utils/ctest/samtoh5.t b/utils/ctest/samtoh5.t
new file mode 100644
index 0000000..acfd689
--- /dev/null
+++ b/utils/ctest/samtoh5.t
@@ -0,0 +1,141 @@
+Set up directories
+  $ . $TESTDIR/setup.sh 
+
+Set up the executable: samtoh5.
+  $ EXEC=$TESTDIR/../samtoh5
+
+
+#2014_06_05, changed cmp.h5 /version and /primaryversion from 1.3.1* to 2.0.0
+#2014_10_30, changelist 141782, make cmp.h5 column 10 (0 based) moleculeID unique for zmws. 
+
+#Test samtoh5 with *.sam files generated by blasr.
+  $ rm -f $OUTDIR/ecoli.cmp.h5
+  $ $EXEC -useShortRefName $DATDIR/ecoli.sam $DATDIR/ecoli_reference.fasta $OUTDIR/ecoli.cmp.h5
+  [INFO] * [samtoh5] started. (glob)
+  [INFO] * [samtoh5] ended. (glob)
+  $ h5diff $OUTDIR/ecoli.cmp.h5 $STDDIR/ecoli_2014_10_30.cmp.h5
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+#  dataset: </FileLog/Version> and </FileLog/Version>
+#  \d+ differences found (re)
+
+#Verify bug 21794 has been fixed. 
+#samtoh5 should print the following error message.
+  $ rm -f $OUTDIR/bug21794.cmp.h5
+  $ $EXEC $DATDIR/bug21794.sam $DATDIR/bug21794_reference.fasta $OUTDIR/bug21794.cmp.h5
+  [INFO] * [samtoh5] started. (glob)
+  WARNING. The mapping of read m120504_033026_sherri_c100311672550000001523012508061292_s1_p0/71092/3721_4845 to reference chr4_ctg9_hap1 is out of bounds.
+           StartPos (4294967288) + AlnLength (614) > RefLength (590426) + 2 
+  [INFO] * [samtoh5] ended. (glob)
+
+
+#Test boundary case where a read exactly maps to the end of reference. 
+  $ rm -f $OUTDIR/bad.cmp.h5
+  $ $EXEC -useShortRefName $DATDIR/bad.sam $DATDIR/ecoli_mutated.fasta $OUTDIR/bad.cmp.h5
+  [INFO] * [samtoh5] started. (glob)
+  [INFO] * [samtoh5] ended. (glob)
+
+  $ h5diff $OUTDIR/bad.cmp.h5 $STDDIR/bad_2014_10_30.cmp.h5
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+#  dataset: </FileLog/Version> and </FileLog/Version>
+#  \d+ differences found (re)
+
+#Test more out-of-boundary cases. samtoh5 prints warnings.
+  $ rm -f $OUTDIR/bad2.cmp.h5
+  $ $EXEC $DATDIR/bad2.sam $DATDIR/ecoli_mutated.fasta $OUTDIR/bad2.cmp.h5
+  [INFO] * [samtoh5] started. (glob)
+  WARNING. The mapping of read m120724_232507_ethan_c100384812550000001523033110171290_s1_p0/21020/11218_12655 to reference ecoliK12_mutated is out of bounds.
+           StartPos (4638237) + AlnLength (1327) > RefLength (4639560) + 2 
+  WARNING. The mapping of read m120724_232507_ethan_c100384812550000001523033110171290_s1_p0/60189/0_4202 to reference ecoliK12_mutated is out of bounds.
+           StartPos (4639141) + AlnLength (431) > RefLength (4639560) + 2 
+  [INFO] * [samtoh5] ended. (glob)
+
+#Test samtoh5 uses full reference names instead of short reference names, if -useShortRefName is not specified 
+  $ rm -f $OUTDIR/ecoli_fullRefName.cmp.h5
+  $ $EXEC $DATDIR/ecoli.sam $DATDIR/ecoli_reference.fasta $OUTDIR/ecoli_fullRefName.cmp.h5
+  [INFO] * [samtoh5] started. (glob)
+  [INFO] * [samtoh5] ended. (glob)
+  $ h5diff $OUTDIR/ecoli_fullRefName.cmp.h5 $STDDIR/ecoli_fullRefName_2014_10_30.cmp.h5
+  dataset: </FileLog/CommandLine> and </FileLog/CommandLine>
+  \d+ differences found (re)
+  dataset: </FileLog/Timestamp> and </FileLog/Timestamp>
+  \d+ differences found (re)
+  [1]
+#  dataset: </FileLog/Version> and </FileLog/Version>
+#  \d+ differences found (re)
+
+  $ h5dump --dataset /RefInfo/FullName $OUTDIR/ecoli_fullRefName.cmp.h5 | sed -n '11p'
+     (0): "ref000001|gi|49175990|ref|NC_000913.2| Escherichia coli str. K-12 substr. MG1655 chromosome, complete genome"
+
+#Compare the generated reference names with option -useShortRefName is set
+  $ h5dump --dataset /RefInfo/FullName $OUTDIR/ecoli.cmp.h5 |sed -n '11p'
+     (0): "ref000001|gi|49175990|ref|NC_000913.2|"
+
+#Test whether samtoh5 generates correct MD5 for the output cmp.h5 files
+#even if there are invalid MD5 values in the input sam file.  bug 22578.
+  $ rm -f $OUTDIR/test_MD5.cmp.h5
+  $ $EXEC $DATDIR/test_MD5.sam $DATDIR/test_MD5MultiContigsRef.fasta $OUTDIR/test_MD5.cmp.h5
+  [INFO] * [samtoh5] started. (glob)
+  [INFO] * [samtoh5] ended. (glob)
+  $ h5dump -d /RefInfo/MD5 $OUTDIR/test_MD5.cmp.h5 |tail -7 |head -4 
+     (0): "3cba630ed67592e8e11fb94ef99a122a",
+     (1): "a687c808a666ea90e0a273c4ac2591c3",
+     (2): "81cf96e23ab1392d898a697c9c4c3acd",
+     (3): "4f4bff70a6ac5ae926e5ed6165684dd3"
+
+
+#Test whether samtoh5 accepts smrtTitle movie/zmw/start_end/start2_end2
+  $ rm -f $OUTDIR/test_smrtTitle.cmp.h5
+  $ $EXEC $DATDIR/fns.sam $DATDIR/ecoli_reference.fasta $OUTDIR/test_smrtTitle.cmp.h5
+  [INFO] * [samtoh5] started. (glob)
+  [INFO] * [samtoh5] ended. (glob)
+  $ h5dump -d /AlnInfo/AlnIndex $OUTDIR/test_smrtTitle.cmp.h5 | sed -n '6,25p'
+     (0,0): 1, 1, 1, 1, 4407727, 4407871, 0, 6, 0, 0, 6, 18, 165, 254, 137, 3,
+     (0,16): 7, 4, 0, 151, 0, 0,
+     (1,0): 2, 1, 1, 1, 4407311, 4407788, 1, 6, 0, 0, 6, 109, 657, 254, 460, 4,
+     (1,16): 84, 13, 152, 713, 0, 0,
+     (2,0): 3, 1, 1, 1, 4407314, 4407871, 0, 6, 0, 0, 6, 5, 641, 254, 547, 2,
+     (2,16): 87, 8, 714, 1358, 0, 0,
+     (3,0): 4, 1, 1, 1, 4407372, 4407876, 1, 6, 0, 0, 6, 0, 586, 254, 494, 2,
+     (3,16): 90, 8, 1359, 1953, 0, 0,
+     (4,0): 5, 1, 1, 1, 4407316, 4407877, 0, 6, 0, 0, 6, 7, 640, 254, 545, 4,
+     (4,16): 84, 12, 1954, 2599, 0, 0,
+     (5,0): 6, 1, 1, 1, 4407334, 4407870, 1, 6, 0, 0, 6, 6, 632, 254, 521, 6,
+     (5,16): 99, 9, 2600, 3235, 0, 0,
+     (6,0): 7, 1, 1, 1, 4407310, 4407868, 0, 6, 0, 0, 6, 3, 639, 254, 542, 8,
+     (6,16): 86, 8, 3236, 3880, 0, 0,
+     (7,0): 8, 1, 1, 1, 4407311, 4407815, 0, 6, 0, 0, 6, 0, 601, 254, 484, 5,
+     (7,16): 112, 15, 3881, 4497, 0, 0,
+     (8,0): 9, 1, 1, 1, 4407319, 4407806, 1, 6, 0, 0, 6, 87, 681, 254, 473, 6,
+     (8,16): 115, 8, 4498, 5100, 0, 0,
+     (9,0): 10, 1, 1, 1, 4407381, 4407592, 0, 6, 0, 0, 6, 93, 345, 254, 205, 3,
+     (9,16): 44, 3, 5101, 5356, 0, 0
+
+
+
+#Test whether samtoh5 mimic the behaviour of compareSequences.py and remove
+#reference groups which have no alignments to any movie.
+#  $ NAME=test_rm_empty_refGroup
+#  $ rm -f $OUTDIR/$NAME.cmp.h5
+#  $ $EXEC $DATDIR/$NAME.sam $DATDIR/$NAME.fasta $OUTDIR/$NAME.cmp.h5
+#  [INFO] * [samtoh5] started. (glob)
+#  [INFO] * [samtoh5] ended. (glob)
+#  $ h5dump -d /RefGroup/ID $OUTDIR/$NAME.cmp.h5 | sed -n '6,6p'
+#     (0): 1, 2
+#
+#  $ h5dump -d /RefGroup/Path $OUTDIR/$NAME.cmp.h5 | sed -n '11,11p'
+#     (0): "/ref000003", "/ref000005"
+
+#Test whether samtoh5 accepts PBI reads in format "movie/holeNumber"
+  $ NAME=test_pbiname
+  $ rm -f $OUTDIR/$NAME.cmp.h5
+  $ $EXEC $DATDIR/$NAME.sam $DATDIR/ecoli_reference.fasta $OUTDIR/$NAME.cmp.h5
+  [INFO] * [samtoh5] started. (glob)
+  [INFO] * [samtoh5] ended. (glob)
diff --git a/utils/ctest/samtom4.t b/utils/ctest/samtom4.t
new file mode 100644
index 0000000..2f589ff
--- /dev/null
+++ b/utils/ctest/samtom4.t
@@ -0,0 +1,44 @@
+Set up directories
+  $ . $TESTDIR/setup.sh 
+
+Set up the executable: samtom4.
+  $ EXEC=$TESTDIR/../samtom4
+
+#Test samtom4 with a *.sam file generated by blasr from a fofn
+  $ OUTFILE=$OUTDIR/lambda_bax.m4
+#STDFILE has been generated by blasr -m 4 && sort
+  $ STDFILE=$STDDIR/lambda_bax.m4
+  $ TMPFILE=test_samtom4_2.tmp
+
+  $ rm -rf $OUTFILE $TMPFILE
+  $ $EXEC $DATDIR/lambda_bax.sam $DATDIR/lambda_ref.fasta $TMPFILE 
+  $ sort $TMPFILE > $OUTFILE
+  $ diff $OUTFILE $STDFILE 
+
+  $ rm $TMPFILE 
+
+
+#Test samtom4 with a *.sam file generated by blasr with -noSplitSubreads from a fofn
+  $ OUTFILE=$OUTDIR/lambda_bax_noSplitSubreads.m4
+#STDFILE has been generated by blasr -m 4 && sort 
+  $ STDFILE=$STDDIR/lambda_bax_noSplitSubreads.m4
+  $ TMPFILE=test_samtom4_3.tmp
+
+  $ rm -rf $OUTFILE $TMPFILE
+  $ $EXEC $DATDIR/lambda_bax_noSplitSubreads.sam $DATDIR/lambda_ref.fasta $TMPFILE 
+  $ sort $TMPFILE > $OUTFILE
+  $ diff $OUTFILE $STDFILE 
+
+  $ rm $TMPFILE 
+
+#Test samtom4 with a *.sam file generated by blasr.
+  $ OUTFILE=$OUTDIR/ecoli_samtom4.m4
+#STDFILE has been generated by blasr -m 4 && sort
+  $ STDFILE=$STDDIR/ecoli_sorted.m4
+  $ TMPFILE=$OUTDIR/test_samtom4_4.tmp
+
+  $ rm -rf $OUTFILE $TMPFILE
+  $ $EXEC $DATDIR/ecoli.sam $DATDIR/ecoli_reference.fasta $OUTFILE -useShortRefName
+  $ sort -n $OUTFILE > $TMPFILE
+  $ diff $TMPFILE $STDFILE
+
diff --git a/utils/ctest/sawriter.t b/utils/ctest/sawriter.t
new file mode 100644
index 0000000..791d581
--- /dev/null
+++ b/utils/ctest/sawriter.t
@@ -0,0 +1,30 @@
+Set up directories
+  $ CURDIR=$TESTDIR
+  $ REMOTEDIR=/mnt/secondary-siv/testdata/BlasrTestData/ctest
+  $ DATDIR=$REMOTEDIR/data
+  $ OUTDIR=$CURDIR/out
+  $ STDDIR=$REMOTEDIR/stdout
+
+Set up the executable: sawriter.
+  $ EXEC=$TESTDIR/../sawriter
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ $EXEC $OUTDIR/ecoli_larsson.sa $DATDIR/ecoli_reference.fasta -blt 11 -larsson
+  $ echo $?
+  0
+
+  $ $EXEC $OUTDIR/ecoli_welter.sa $DATDIR/ecoli_reference.fasta -blt 11 -welter 2>$OUTDIR/sawriter.log
+  $ echo $?
+  0
+
+  $ md5sum $OUTDIR/ecoli_larsson.sa |cut -f 1 -d ' ' 
+  e23b6afe6ddd74b2656e36bf93f6840c
+
+  $ md5sum $OUTDIR/ecoli_welter.sa |cut -f 1 -d ' '
+  e23b6afe6ddd74b2656e36bf93f6840c
diff --git a/utils/ctest/sdpMatcher.t b/utils/ctest/sdpMatcher.t
new file mode 100644
index 0000000..efe69f7
--- /dev/null
+++ b/utils/ctest/sdpMatcher.t
@@ -0,0 +1,24 @@
+Set up directories
+  $ CURDIR=$TESTDIR
+  $ REMOTEDIR=/mnt/secondary-siv/testdata/BlasrTestData/ctest
+  $ DATDIR=$REMOTEDIR/data
+  $ OUTDIR=$CURDIR/out
+  $ STDDIR=$REMOTEDIR/stdout
+
+Set up the executable: sdpMatcher.
+  $ EXEC=$TESTDIR/../sdpMatcher
+
+Define tmporary files
+  $ TMP1=$OUTDIR/$$.tmp.out
+  $ TMP2=$OUTDIR/$$.tmp.stdout
+
+Make OUTDIR
+  $ mkdir -p $OUTDIR
+
+  $ FA=$DATDIR/ecoli_subset.fasta
+  $ $EXEC $FA $FA 10 -local  > $OUTDIR/sdpMatcher.out
+  $ echo $?
+  0
+  $ diff $OUTDIR/sdpMatcher.out $STDDIR/sdpMatcher.stdout
+
+
diff --git a/utils/ctest/setup.sh b/utils/ctest/setup.sh
new file mode 100755
index 0000000..0365beb
--- /dev/null
+++ b/utils/ctest/setup.sh
@@ -0,0 +1,14 @@
+# Set up directories
+CURDIR=$TESTDIR
+REMOTEDIR=/mnt/secondary-siv/testdata/BlasrTestData/ctest
+DATDIR=$REMOTEDIR/data
+OUTDIR=$CURDIR/out
+STDDIR=$REMOTEDIR/stdout
+
+# Define tmporary files
+TMP1=$OUTDIR/$$.tmp.out
+TMP2=$OUTDIR/$$.tmp.stdout
+
+# Make OUTDIR
+mkdir -p $OUTDIR
+
diff --git a/utils/ctest/toAfg.t b/utils/ctest/toAfg.t
new file mode 100644
index 0000000..491304c
--- /dev/null
+++ b/utils/ctest/toAfg.t
@@ -0,0 +1,70 @@
+Set up directories
+  $ . $TESTDIR/setup.sh 
+
+Set up the executable: toAfg.
+  $ EXEC=$TESTDIR/../toAfg
+
+test basic FASTA use case
+  $ $EXEC $DATDIR/read.fasta output.afg -noSplitSubreads
+  $ head output.afg
+  {UNV
+  iid:1
+  com:
+  generated by AfgBasWriter
+  Mon Jun 28 14:43:52 2010
+  .
+  }
+  {LIB
+  iid:1
+  {DST
+  $ tail output.afg
+  qlt:
+  55555555555555555555555555555555555555555555555555555555555555555555555555555555
+  55555555555555555555
+  .
+  }
+  {FRG
+  iid:24
+  lib:1
+  typ:I
+  }
+
+test uniform QV use case
+  $ $EXEC $DATDIR/test_toafg.fastq output.afg -noSplitSubreads -uniformQV 3
+  $ head output.afg
+  {UNV
+  iid:1
+  com:
+  generated by AfgBasWriter
+  Mon Jun 28 14:43:52 2010
+  .
+  }
+  {LIB
+  iid:1
+  {DST
+
+test uniform QV FASTA use case
+  $ $EXEC $DATDIR/read.fasta output.afg -noSplitSubreads -uniformQV 7
+  $ head output.afg
+  {UNV
+  iid:1
+  com:
+  generated by AfgBasWriter
+  Mon Jun 28 14:43:52 2010
+  .
+  }
+  {LIB
+  iid:1
+  {DST
+  $ tail output.afg
+  qlt:
+  77777777777777777777777777777777777777777777777777777777777777777777777777777777
+  77777777777777777777
+  .
+  }
+  {FRG
+  iid:24
+  lib:1
+  typ:I
+  }
+
diff --git a/utils/p4.mk b/utils/p4.mk
new file mode 100644
index 0000000..34a5e6f
--- /dev/null
+++ b/utils/p4.mk
@@ -0,0 +1,65 @@
+# This p4.mk is only used to make 
+#   //depot/software/smrtanalysis/bioinformatics/tools/blasr
+# on PacBio internal p4 build.
+
+SHELL=/bin/bash -e -E
+
+.PHONY=all cramtests
+
+PBINCROOT ?= $(realpath ../../../lib/cpp/)
+PREBUILT ?= $(realpath ../../../../prebuilt.out)
+THIRD_PARTY_PREFIX := $(realpath ../..)
+
+include ../p4.common.mk
+
+all : CXXFLAGS ?= $(DEFAULTCXXFLAG)
+debug : CXXFLAGS ?= $(DEBUGCXXFLAG)
+profile : CXXFLAGS ?= $(PROFILECXXFLAG)
+g: CXXFLAGS += $(GCXXFLAG)
+g: LIBS = $(GLIBS)
+
+EXE = loadPulses pls2fasta samtoh5 samtom4 samFilter toAfg sawriter sdpMatcher
+
+all debug profile g: $(EXE)
+
+loadPulses: LoadPulses.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+pls2fasta: PulseToFasta.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+samtoh5: SamToCmpH5.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+samtom4: SamToM4.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+samFilter: SamFilter.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+toAfg: ToAfg.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+sawriter: SAWriter.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+sdpMatcher: SDPMatcher.cpp $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $< $(LIBDIRS) $(LIBS)
+
+pblib: 
+	make -C ../ -f p4.mk mkliba
+
+CTESTS := $(wildcard ctest/*.t)
+SLOW_CTESTS := ctest/loadPulses.t ctest/pls2fasta.t
+
+cramtests: $(EXE)
+	cram -v --shell=/bin/bash $(CTESTS)
+
+cramfast: $(EXE)
+	cram -v --shell=/bin/bash $(filter-out $(SLOW_CTESTS), $(CTESTS))
+
+clean: 
+	@rm -f $(EXE)
+	@rm -f *.d *.o
+
+-include $(DEPS)
diff --git a/yli.common.mk b/yli.common.mk
new file mode 100644
index 0000000..f33276b
--- /dev/null
+++ b/yli.common.mk
@@ -0,0 +1,94 @@
+OS := $(shell uname)
+
+# Determine where is PBINCROOT, either from github or PacBio SMRTAnalysis package.
+PBINCROOT ?= $(realpath ../../lib/cpp/)
+PREBUILT ?= $(realpath ../../../prebuilt.out)
+THIRD_PARTY_PREFIX ?= $(realpath ..)
+
+include $(PBINCROOT)/common.mk
+
+LIBBLASR_INCLUDE  := $(PBINCROOT)/alignment
+LIBPBIHDF_INCLUDE := $(PBINCROOT)/hdf
+LIBPBDATA_INCLUDE := $(PBINCROOT)/pbdata
+PBBAM_INCLUDE     := $(PBBAM)/include
+HTSLIB_INCLUDE    := $(PBBAM)/../htslib/htslib
+
+LIBBLASR_LIB  := $(PBINCROOT)/alignment
+LIBPBIHDF_LIB := $(PBINCROOT)/hdf
+LIBPBDATA_LIB := $(PBINCROOT)/pbdata
+PBBAM_LIB     := $(PBBAM)/lib
+HTSLIB_LIB    := $(PBBAM)/../htslib
+
+INCDIRS = -I$(LIBBLASR_INCLUDE) \
+          -I$(LIBPBIHDF_INCLUDE) \
+          -I$(LIBPBDATA_INCLUDE) \
+          -I$(HDF5_INC)
+
+LIBDIRS = -L$(LIBBLASR_LIB) \
+          -L$(LIBPBIHDF_LIB) \
+          -L$(LIBPBDATA_LIB) \
+          -L$(HDF5_LIB) 
+
+
+ifneq ($(ZLIB_ROOT), notfound)
+	INCDIRS += -I$(ZLIB_ROOT)/include
+	LIBDIRS += -L$(ZLIB_ROOT)/lib
+endif
+
+CXXOPTS := -std=c++0x -pedantic \
+           -Wall -Wuninitialized -Wno-div-by-zero \
+           -MMD -MP -w -fpermissive
+
+DEFAULTCXXFLAG := -O3
+DEBUGCXXFLAG := -g -ggdb -fno-inline
+PROFILECXXFLAG := -Os -pg 
+GCXXFLAG := -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fno-omit-frame-pointer 
+
+LIBS := -lblasr -lpbihdf -lpbdata
+PBBAMLIBS := -lpbbam
+ifneq ($(wildcard "$(HTSLIB_LIB)/libhts.a"),"")
+	PBBAMLIBS += $(HTSLIB_LIB)/libhts.a
+else
+	PBBAMLIBS += -lhts
+endif
+
+ifneq ($(wildcard "$(HDF5_LIB)/libhdf5_cpp.a"),"")
+    LIBS += $(HDF5_LIB)/libhdf5_cpp.a $(HDF5_LIB)/libhdf5.a
+else
+    LIBS += -lhdf5_cpp -lhdf5 
+endif
+
+ifeq ($(origin nopbbam), undefined)
+	INCDIRS += -I$(PBBAM_INCLUDE) \
+			   -I$(HTSLIB_INCLUDE) \
+			   -I$(BOOST_INCLUDE)
+
+	LIBDIRS += -L$(PBBAM_LIB) \
+			   -L$(HTSLIB_LIB)
+
+	LIBS += $(PBBAMLIBS) 
+endif
+
+LIBS += -lz -lpthread -ldl
+
+ifneq ($(OS), Darwin)
+	LIBS += -lrt
+	STATIC := -static
+else
+	LIBS += -lsz
+	STATIC :=
+endif
+
+# -lhdf5, -lhdf5_cpp, -lz required for HDF5
+# -lpbbam -lhts for BAM
+# -lpthread for multi-threading
+# -lrt for clock_gettime
+# -ldl for dlopen dlclose 
+
+GLIBS = -Wl --eh-frame-hdr -fno-builtin-malloc -L$(HOME)/lib -ltcmalloc -lunwind -lprofiler $(LIBS)
+
+PBLIB :=
+ifeq ($(NO_SUBMAKES),)
+    PBLIB := pblib
+endif
+
diff --git a/yli.makefile b/yli.makefile
new file mode 100644
index 0000000..bc8af98
--- /dev/null
+++ b/yli.makefile
@@ -0,0 +1,80 @@
+SHELL=/bin/bash -e -E
+
+.PHONY: all pblib makeutils gtest cramtests cramfast check clean cleanall cleanlib
+
+nopbbam=true
+
+GIT_BLASR_LIBPATH = libcpp
+PB_BLASR_LIBPATH = ../../lib/cpp
+# Determine where is PBINCROOT, either from github or PacBio SMRTAnalysis package.
+PBINCROOT ?= $(shell cd $(GIT_BLASR_LIBPATH) 2>/dev/null && pwd || echo -n notfound)
+ifeq ($(PBINCROOT), notfound)
+	PBINCROOT := $(shell cd $(PB_BLASR_LIBPATH) 2>/dev/null && pwd || echo -n notfound)
+	ifeq ($(PBINCROOT), notfound)
+		$(error please check your blasr lib exists.)
+	endif
+endif
+
+# common.mk contains the configuration for this build setup
+GIT_COMMON_MK = blasr_git_common.mk
+ifneq ($(shell ls $(GIT_COMMON_MK) 2>/dev/null || echo -n notfound), notfound)
+include $(GIT_COMMON_MK)
+endif
+
+include yli.common.mk
+
+SRCS := $(wildcard *.cpp)
+OBJS := $(SRCS:.cpp=.o)
+DEPS := $(SRCS:.cpp=.d)
+EXE = blasr
+UTILS = utils
+
+all : CXXFLAGS ?= $(DEFAULTCXXFLAG)
+debug : CXXFLAGS ?= $(DEBUGCXXFLAG)
+profile : CXXFLAGS ?= $(PROFILECXXFLAG)
+g: CXXFLAGS += $(GCXXFLAG)
+g: LIBS = $(GLIBS)
+
+all: MODE = 
+debug: MODE=debug
+profile: MODE = profile 
+g: MODE = g
+
+all debug profile g: $(EXE) makeutils
+
+$(EXE): $(SRCS) $(PBLIB)
+	$(CXX) $(CXXOPTS) $(CXXFLAGS) $(INCDIRS) -MF"$(@:%=%.d)" $(STATIC) -o $@ $(SRCS) $(LIBDIRS) $(LIBS)
+
+# DON'T use pbbam which is not on github.
+pblib: $(PBINCROOT)/configure.py $(PBINCROOT)/makefile
+	cd $(PBINCROOT) && NOPBBAM=true ./configure.py && export PBINCROOT=$(PBINCROOT) && export nopbbam=true  && make -f makefile
+
+makeutils:
+	export PBINCROOT=$(PBINCROOT) && export nopbbam=true && export COMMON_NO_THIRD_PARTY_REQD=true && export HDF5_LIB=$(HDF5_LIB) && export HDF5_INC=$(HDF5_INC) && make -C $(UTILS) $(MODE) 
+
+CTESTS := $(wildcard ctest/*.t)
+SLOW_CTESTS := ctest/bug25328.t ctest/useccsallLargeGenome.t
+
+cramtests: $(EXE) $(UTILS)
+	cram -v --shell=/bin/bash $(CTESTS)
+	make -C $(UTILS) cramtests
+
+cramfast: $(EXE) $(UTILS)
+	cram -v --shell=/bin/bash $(filter-out $(SLOW_CTESTS),$(CTESTS))
+	make -C $(UTILS) cramfast
+
+gtest: $(EXE)
+	make -C $(PBINCROOT) gtest
+
+check: gtest cramtests
+
+cleanall: cleanlib clean
+
+cleanlib: $(PBINCROOT)/makefile
+	@COMMON_NO_THIRD_PARTY_REQD=true make -C $(PBINCROOT) cleanall
+
+clean: 
+	@rm -f $(EXE) $(OBJS) $(DEPS) blasr.d
+	@COMMON_NO_THIRD_PARTY_REQD=true PBINCROOT=$(PBINCROOT) make -C $(UTILS) clean
+
+-include $(DEPS) 

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



More information about the debian-med-commit mailing list